Spacebar to pull back pin
A,D to use paddles
I love 3d interfaces, coolest things ever! Here’s the beginning example of a 3d content management system I’m working on!
This is my first try at havok so don’t beat me up to bad. havok rocks i was trying to pin a lego dude to a wall when he gets shot but i ran out of time. Havok in director was so powerfull. Notice in the middle you can jump up and pin to the box to unpin just hit space. W,A,S,D are for diretion space for jet pack and jump. Wow I love Director. Cant wait till flash can do this
I decided to take all the flash examples at gotoandplay and write them into a FMS2 compliant mmorpg. I originally wrote this is FashCom 1 and that is what this example is. The flash client is flash 8. Open this page in up to five tabs for different clients.
I would like to see if this works in BlazeDs I read on someone blog it could handle 15000 connections! WOW
Things I tried to accomplish
All of the code blow is converted from multi tutorials on gotoandplay.com
Line of sight
a* Path Finding
Tile Approach with scrolling 2d first then 3d
Amfphp backend
Shockwave3D Front end
Papervision Client
application.onAppStart = function() {
//////////trace(”————————————-starting up———————————————-”);
userID = 0;
initengine(); //initialize game
this.interval = setInterval(work,50);
application.currentStreamID = undefined;
map_so = SharedObject.get(”map”,false);
map_so.setProperty(”currentMap”, 1);
projectile_so = SharedObject.get(”projectile”,false);
broadcaster_so = SharedObject.get(”broadcaster”,false);
//en_so = SharedObject.get(”broadcaster”,false);
tc_so = SharedObject.get(”request”,false);
tc_so.setProperty(”currentStream”, ({broadcaster: “No Broadcaster”}));
tc_so.onSync = function(list) {
var res = this.getProperty(”p”);
so_List = new Array();
so_List.cords = String(res).split(”|”);
if(so_List.cords[0]==”m”){getTarget(so_List.cords[1],”char”+so_List.cords[2]);}
if(so_List.cords[0]==”a”){shotshit3(so_List.cords[1],”char”+so_List.cords[2]);}
};
}
application.onConnect = function(clientObj,userType) {
userID++
clientObj = initBroadcaster(clientObj,userType);
application.acceptConnection(clientObj);
}
application.onDisconnect = function(clientObj) {
broadcaster_so.setProperty(clientObj.userID, undefined);
broadcaster_so.flush();
objr2 = level_n["char"+clientObj.userID]
for (var i = 0; i
if(level_n.currentchars[i]==objr2){
level_n.currentchars.splice(i, 1);
break;
};
}
if(application.currentStreamID == clientObj.userID) {
application.currentStreamID = undefined;
public_so.setProperty(”currentStream”, ({broadcasterName: “Please Stand By…”}));
}
}
function GameModelClass(userID){
this.c_so = SharedObject.get(”char”+ userID,false); //creates the shared object for the enamy
this.c_so.onSync = function(list) {
var res = this.getProperty(”p”);
getTarget(res,”char”+userID)
}
};
initBroadcaster = function(clientObj,userType) {
clientObj.streamName = userType;
clientObj.broadcasterName = “Broadcaster #” + userID;
clientObj.userID = userID;
clientObj.status = “READY”
broadcaster_so.setProperty(userID, clientObj);
var name = “char”+userID; // name of new enemy
level_n[name] = new level_n["charp"](); //create new enemy object
level_n[name].id = userID;
level_n.currentchars.push(level_n[name]);
level_n[name].xtile = 2;
level_n[name].ytile = 1;
level_n[name].x = (level_n[name].xtile*level_n.tileW)+level_n.tileW/2;
level_n[name].y = (level_n[name].ytile*level_n.tileH)+level_n.tileH/2;
level_n[name].width = 15;
level_n[name].height = 15;
level_n[name].shotcount = 0;
level_n[name].moving = false;
level_n[name].path = new Array();
level_n[name].alive = true;
level_n[name].health = 100;
level_n[name].deathcount = 0;
GameModelClass(userID);
return clientObj;
}
function initengine(){
// our map is 2-dimensional array
myMap1 = [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 1, 0, 0, 2, 1], [1, 1, 1, 1, 1, 1, 1, 1]];
myMap2 = [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1], [3, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1]];
// declare level_n object that holds info
level_n = {tileW:30, tileH:30, currentMap:1, bulletcounter:0};
level_n.bullets = new Array();
level_n.currentchars = new Array();
level_n.Tile0 = function () { };
level_n.Tile0.prototype.walkable = true;
level_n.Tile0.prototype.frame = 1;
level_n.Tile1 = function () { };
level_n.Tile1.prototype.walkable = false;
level_n.Tile1.prototype.frame = 2;
// door object prototype
level_n.Doors = function (newmap, newcharx, newchary) {this.newmap=newmap;this.newcharx=newcharx;this.newchary=newchary;};
level_n.Doors.prototype.walkable = true;
level_n.Doors.prototype.frame = 3;
level_n.Doors.prototype.door = true;
// door tiles
// make those tiles from the door object passing newmap, newcharx and newchary
level_n.Tile2 = function () { };
level_n.Tile2.prototype = new level_n.Doors(2, 1, 4);
level_n.Tile3 = function () { };
level_n.Tile3.prototype = new level_n.Doors(1, 6, 4);
// declare bullet
level_n.Bullet = function () { };
level_n.Bullet.prototype.speed = 5;
level_n.Bullet.prototype.dirx = 0;
level_n.Bullet.prototype.diry = -1;
level_n.Bullet.prototype.width = 2;
level_n.Bullet.prototype.height = 2;
myEnemies = [
[0],[0],[0]
// [[1, 8, 8],[1, 8, 8],[1, 8, 8],[2, 8, 8],[2, 8, 8],[2, 8, 8],[1, 8, 8]],
// [[2, 1, 3]]
];
// declare enemy types
level_n.charp = function () { };
level_n.charp.prototype.xMove = 1;
level_n.charp.prototype.yMove = 0;
level_n.charp.prototype.speed = 5;
level_n.Enemyp1 = function () { };
level_n.Enemyp1.prototype.xMove = 0;
level_n.Enemyp1.prototype.yMove = 1;
level_n.Enemyp1.prototype.speed = 5;
level_n.Enemyp1.prototype.turning = 5;
level_n.Enemyp1.prototype.alive = true;
level_n.Enemyp1.prototype.health = 100;
level_n.Enemyp1.prototype.rangeweapon = false;
level_n.Enemyp2 = function () { };
level_n.Enemyp2.prototype.xMove = 1;
level_n.Enemyp2.prototype.yMove = 0;
level_n.Enemyp2.prototype.speed = 5;
level_n.Enemyp2.prototype.turning = 5;
level_n.Enemyp2.prototype.alive = true;
level_n.Enemyp2.prototype.health = 100;
level_n.Enemyp2.prototype.rangeweapon = true;
// declare bullet
level_n.Bullet = function () { };
level_n.Bullet.prototype.speed = 5;
level_n.Bullet.prototype.dirx = 0;
level_n.Bullet.prototype.diry = -1;
level_n.Bullet.prototype.width = 2;
level_n.Bullet.prototype.height = 2;
// declare char object, xtile and ytile are tile where chars center is
//char_n = {xtile:2, ytile:1, speed:10, moving:false, shootspeed:1000}; // building the world
buildMap(eval(”myMap”+level_n.currentMap));
}
function buildMap(map) {
trace(”Creates virtual map”)
level_n.mapWidth = map[0].length;
level_n.mapHeight = map.length;
for (var i = 0; i
for (var j = 0; j
var name = “t_”+i+”_”+j;
level_n[name] = new level_n["Tile"+map[i][j]]();
level_n[name].x = j;
level_n[name].y = i;
level_n[name].width = 30;
level_n[name].length = 30;
trace(name+” ———Tile”+map[i][j]+level_n[name].door)
}
}
var enemies = myEnemies[level_n.currentMap];
// save the number of enemies on stage
level_n.currentEnemies = [];
for (var i = 0; i
var name = “enemy”+i; // name of new enemy
var public_so = SharedObject.get(”enemy”+ i,false); //creates the shared object for the enamy
level_n[name] = new level_n["Enemyp"+enemies[i][0]](); //create new enemy object
level_n[name].id = i;
level_n.currentEnemies.push(level_n[name]);
level_n[name].xtile = enemies[i][1];
level_n[name].ytile = enemies[i][2];
level_n[name].x = (level_n[name].xtile*level_n.tileW)+level_n.tileW/2;
level_n[name].y = (level_n[name].ytile*level_n.tileH)+level_n.tileH/2;
level_n[name].width = 30;
level_n[name].height = 30;
level_n[name].shotcount =0;
}
// define a ne hero not sure how this works for multi player but it needs changed
//char_n.x = (char_n.xtile*level_n.tileW)+level_n.tileW/2;
//char_n.y = (char_n.ytile*level_n.tileW)+level_n.tileW/2;
//char_n.width =10;
//char_n.height = 10;
}
function moveChar(ob) {
//trace(ob.id+” ob.x……….. dddddddddddddd”)
// is char in the center of tile
if ((ob.x-level_n.tileW/2)%level_n.tileW == 0 )
{
if((ob.y-level_n.tileH/2)%level_n.tileH == 0) {
// calculate the tile where chars center is
ob.xtile = Math.floor(ob.x/level_n.tileW);
ob.ytile = Math.floor(ob.y/level_n.tileH);
if (level_n.clicked) {
level_n.clicked = false;
findPath(ob.xtile, ob.ytile, level_n.targetx, level_n.targety,ob);
return;
}
if (ob.path.length>0) {
level_n.targety = ob.path.pop();
level_n.targetx = ob.path.pop();
if (level_n.targetx>ob.xtile) {// right
ob.dirx = 1;
ob.diry = 0;
} else if (level_n.targetx
ob.dirx = -1;
ob.diry = 0;
} else if (level_n.targety>ob.ytile) {// up
ob.dirx = 0;
ob.diry = 1;
} else {// down
ob.dirx = 0;
ob.diry = -1;
}
}else {
ob.moving = false;
//trace(”imhome” + ob.xtile+” “+ob.ytile)
if (level_n["t_"+ob.ytile+"_"+ob.xtile].door) {
changeMap(ob.xtile,ob.ytile,level_n["t_"+ob.ytile+"_"+ob.xtile].newmap);
}
return;
}
}
}
// move
ob.y += ob.speed*ob.diry;
ob.x += ob.speed*ob.dirx;
//trace(”path=”+ob.path)
//trace(”move —ob.x “+ob.xtile+”ob.id “+ob.ytile +” ob.door “+level_n["t_"+ob.ytile+"_"+ob.xtile].door)
testr = 90;
if ( ob.dirx+ob.diry*2+3==1) {
testr = -90;
}
if ( ob.dirx+ob.diry*2+3==2) {
testr = 180;
}
if ( ob.dirx+ob.diry*2+3==3) {
testr = -180;
}
if ( ob.dirx+ob.diry*2+3==4) {
testr = 90;
}
if ( ob.dirx+ob.diry*2+3==5) {
testr = 0;
}
var c1_so = SharedObject.get(”char”+ ob.id ,false);
testvar = testr +”|”+ ob.x +”|”+ ob.y
c1_so.setProperty(”r”, testvar);
c1_so.flush();
}
function changeMap(x,y,z) {
trace(”changeMap “+y+”_”+x);
var name = “t_”+y+”_”+x;
trace(name+” _________changeMap name___________________ “+z)
level_n.currentMap = z;
//ob.ytile = 2;
//ob.xtile = 1;
//ob.frame = ob.clip._currentframe;
trace(”mapname”+level_n.currentMap)
buildMap(eval(”myMap”+level_n.currentMap));
map_so.setProperty(”currentMap”, level_n.currentMap);
broadcaster_so.flush();
}
function getTarget(test,test2) {
trace(test+”————getTarget——————– “+test2)
// must click on walkable tile
if (level_n[test2].alive) {
if (level_n[test].walkable) {
// update target tile
level_n.targetx = level_n[test].x;
level_n.targety = level_n[test].y;
// if moving, wait until center is reached
if (!level_n[test2].moving) {
trace(level_n[test2].moving+”————findPath——————– “+level_n[test2].xtile)
findPath(level_n[test2].xtile, level_n[test2].ytile, level_n.targetx, level_n.targety,level_n[test2]);
} else {
level_n.clicked = true;
}
}
}
}
function findPath(startx, starty, targetx, targety,objc) { // clear marked tiles
//trace(”findPath”+startx+”_”+starty+”_”+ targetx+”_”+ targety +” makepath ob “+objc.id)
for (var i = 0; i
for (var j = 0; j
var name = “t_”+i+”_”+j; // name of new tile
}
}
path = {};
path.Unchecked_Neighbours = [];
path.done = false;
path.name = “node_”+starty+”_”+startx;
var cost = Math.abs(startx-targetx)+Math.abs(starty-targety);
path[path.name] = {x:startx, y:starty, visited:true, parentx:null, parenty:null, cost:cost};
path.Unchecked_Neighbours[path.Unchecked_Neighbours.length] = path[path.name];
while (path.Unchecked_Neighbours.length>0) {
var N = path.Unchecked_Neighbours.shift();
if (N.x == targetx ) {
if ( N.y == targety) {
make_path(N,objc);
path.done = true;
break;
} else {
N.visited = true;
addNode(N, N.x+1, N.y, targetx, targety);
addNode(N, N.x-1, N.y, targetx, targety);
addNode(N, N.x, N.y+1, targetx, targety);
addNode(N, N.x, N.y-1, targetx, targety);
}
} else {
N.visited = true;
addNode(N, N.x+1, N.y, targetx, targety);
addNode(N, N.x-1, N.y, targetx, targety);
addNode(N, N.x, N.y+1, targetx, targety);
addNode(N, N.x, N.y-1, targetx, targety);
}
}
// remove path object
//delete path;
// check if path was found
if (path.done) {
//////////trace(” we reached the goal”)
return true;
} else {
//////////trace(” we couldn’t get there;”)
return false;
}
}
function addNode(ob, x, y, targetx, targety) {// name of the new node
trace(level_n["t_"+y+"_"+x].walkable+” node_y “+y+”_x “+x+”node_”+targety+”_”+targetx)
path.name = “node_”+y+”_”+x; // add to the unchecked neighbours, if its walkable
if (level_n["t_"+y+"_"+x].walkable) { // find estimated cost to the target
var cost = Math.abs(x-targetx)+Math.abs(y-targety);// and if its not visited yet
//———————————————————————————————-
if (typeof(path[path.name]) == “undefined”) {
path[path.name] = {x:x, y:y, visited:false, parentx:ob.x, parenty:ob.y, cost:cost};
// add to the array
for (var i = 0; i
if (cost
path.Unchecked_Neighbours.splice(i, 0, path[path.name]);
break;
}
}
// didnt add it yet, too much cost, add to the end
if (i>=path.Unchecked_Neighbours.length) {
path.Unchecked_Neighbours[path.Unchecked_Neighbours.length] = path[path.name];
}
}
//———————————————————————————————-
else if (path[path.name].cost>cost ) {
// make new node
path[path.name] = {x:x, y:y, visited:false, parentx:ob.x, parenty:ob.y, cost:cost};
// add to the array
for (var i = 0; i
if (cost
path.Unchecked_Neighbours.splice(i, 0, path[path.name]);
break;
}
}
// didnt add it yet, too much cost, add to the end
if (i>=path.Unchecked_Neighbours.length) {
path.Unchecked_Neighbours[path.Unchecked_Neighbours.length] = path[path.name];
}
}
//———————————————————————————————-
}
}
function make_path(ob,objc) {
trace(”makepath ob “+objc.id)
objc.path = [];
while (ob.parentx != null) {
objc.path[objc.path.length] = ob.x;
objc.path[objc.path.length] = ob.y;
ob = path["node_"+ob.parenty+"_"+ob.parentx];
}
objc.moving = true;
}
function work() {
if (typeof(initshit) == “undefined”) { //function to do something once not sure what
initshit = true;
}
if(level_n.currentchars.length>0){
if(level_n.bullets.length>0){
moveBullets();
}
for (var i = 0; i
var ob = level_n.currentchars[i];
// //trace(”ob.alive “+ob.alive+” “+i)
if(!ob.alive){
////trace(”ob.deathcount”+ob.deathcount)
ob.deathcount++
if (ob.deathcount>=120){
ob.alive=true;
ob.deathcount=0;
ob.health=100;
}
}
//
//
//
//
//ob.alive=true;
//}else{
if (!ob.moving) {
// stop animation
} else {
moveChar(ob);
}
//}
//}
//////////trace(”+++++++++++ob+++++++++”+ob.id+” “+ob.x+” “+ob.y+” “+ob.r+” “)
// move char
////////trae(”ob.moving”+ob.moving)
}//end repeat
eBrain(); // make bad come alive
}//end if chars greater than 0
}
function eBrain() {
// loop through all enemies currently on stage
for (var i = 0; i
if(level_n.currentEnemies[i].alive==true){
var name = “enemy”+i; // name of enemy
// check if enemy will hit the wall
getMyCorners(level_n[name].x+level_n[name].speed*level_n[name].xMove, level_n[name].y+level_n[name].speed*level_n[name].yMove, level_n[name]);
//function for rotation OF ENEMY TOWARDS HERO
var testvar3 = Math.round(Math.random()*100);
if (level_n[name].downleft && level_n[name].upleft && level_n[name].downright && level_n[name].upright && Math.round(Math.random()*100)>level_n[name].turning) {
// move enemy
var lastdist = 100000;
//find closest hero
for (var t = 0; t
//////trace(t+” ++++++++++++++++ level_n.currentchars[t] +++++++++++++++”+level_n.currentchars[t].x)
var ob = level_n.currentchars[t];
var xdist = level_n[name].x-ob.x;
var ydist = level_n[name].y-ob.y;
if (Math.sqrt(xdist*xdist+ydist*ydist)
//problem here if nooneone is alive they need a trigger
var ob2 = level_n.currentchars[t];
}
lastdist = Math.sqrt(xdist*xdist+ydist*ydist)
}
var xn = Math.round(level_n[name].x - ob2.x);
var yn = Math.round(level_n[name].y - ob2.y );
tan = Math.atan(yn/xn)*180/Math.PI;
rn = Math.round(360 + tan);
if ((xn<0 && yn<0) || (xn<0 && yn>0) || (xn<0 && yn == 0)) {
rn = Math.round(180 + tan)
}
var testern = line_of_sight2(ob2.x, ob2.y, level_n[name].x , level_n[name].y, eval(”myMap”+level_n.currentMap) , 30)
if (testern==true){
//cant see the any good guys so move
movee(level_n[name], level_n[name].xMove, level_n[name].yMove,i,ob2);
}else{
if(ob2.alive==true){
if(level_n[name].rangeweapon==true){
//shoot arrow or ranged magicweapon
level_n[name].shotcount ++;
dist = 0;
var public_so = SharedObject.get(name,false);
testvar = rn +”|”+ level_n[name].x +”|”+ level_n[name].y +”|”+ dist;
public_so.setProperty(”r”, testvar);
if (level_n[name].shotcount>50){
level_n.bulletcounter++;
// ////////////trace(”level_n.bulletcounter++”+level_n[name].x+” “+level_n[name].y+” “+rn)
var public_so = SharedObject.get(String(”bullit”+ level_n.bulletcounter),false);
projectile_so.setProperty(”namen”, String(”bullit”+ level_n.bulletcounter));
level_n.bullets.push([String("bullit"+ level_n.bulletcounter),level_n[name].x ,level_n[name].y, rn -90 ,0,1]);//
level_n[name].shotcount = 0;
}
}else{
//ground attack
var xdist = level_n[name].x-ob2.x;
var ydist = level_n[name].y-ob2.y;
if (Math.sqrt(xdist*xdist+ydist*ydist)<15) {
level_n[name].shotcount ++;
trace(”ground attack”+level_n[name].shotcount )
if (level_n[name].shotcount>50){
if(ob.health<0){
ob2.alive=false;
}else{
ob2.health = ob2.health - 1;
}
level_n[name].shotcount = 0;
}//if chotcounter
}else{
xs = Math.sin(Number(rn)*(Math.PI/180))*5;
ys = Math.cos(Number(rn)*(Math.PI/180))*5*-1;
level_n[name].x = level_n[name].x + xs;
level_n[name].y = level_n[name].y + ys;
var e_so = SharedObject.get(”enemy”+ i,false);
testvar = rn +”|”+ level_n[name].x +”|”+ level_n[name].y +”|”+ 30
e_so.setProperty(”r”, testvar);
}//if dist < 30
}//if range
}//if alive == true
}
} else {
// change enemy direction
if (level_n[name].xMove == 0) {
level_n[name].xMove = Math.round(Math.random()*2)*2-1;
level_n[name].yMove = 0;
getMyCorners(level_n[name].x+level_n[name].speed*level_n[name].xMove, level_n[name].y+level_n[name].speed*level_n[name].yMove, level_n[name]);
if (!level_n[name].downleft || !level_n[name].upleft || !level_n[name].downright || !level_n[name].upright) {
level_n[name].xMove = -level_n[name].xMove;
}
} else {
level_n[name].xMove = 0;
level_n[name].yMove = Math.round(Math.random()*2)*2-1;
getMyCorners(level_n[name].x+level_n[name].speed*level_n[name].xMove, level_n[name].y+level_n[name].speed*level_n[name].yMove, level_n[name]);
if (!level_n[name].downleft || !level_n[name].upleft || !level_n[name].downright || !level_n[name].upright) {
level_n[name].yMove = -level_n[name].yMove;
}
}
}
// check if we have collision with hero
// var xdist = level_n[name].x-ob2.x;
// var ydist = level_n[name].y-ob2.y;
// if (Math.sqrt(xdist*xdist+ydist*ydist)
//////trace(”hit dude”);
// end the level_n
//removeMovieClip(_root.tiles);
//_root.gotoAndPlay(1);
// }
}
}
}
function getMyCorners(x, y, testvar) {
testvar.downY = Math.floor((y+testvar.height-1)/level_n.tileH);
testvar.upY = Math.floor((y-testvar.height)/level_n.tileH);
testvar.leftX = Math.floor((x-testvar.width)/level_n.tileW);
testvar.rightX = Math.floor((x+testvar.width-1)/level_n.tileW);
testvar.upleft = level_n["t_"+testvar.upY+"_"+testvar.leftX].walkable;
testvar.downleft = level_n["t_"+testvar.downY+"_"+testvar.leftX].walkable;
testvar.upright = level_n["t_"+testvar.upY+"_"+testvar.rightX].walkable;
testvar.downright = level_n["t_"+testvar.downY+"_"+testvar.rightX].walkable;
}
function movee(ob, dirx, diry, testvari,ob2) {
ob.dirx = dirx;
ob.diry = diry;
getMyCorners(ob.x, ob.y+ob.speed*diry, ob);
if (diry == -1) {
if (ob.upleft && ob.upright) {
ob.y += ob.speed*diry;
} else {
ob.y = ob.ytile*level_n.tileH+ob.height;
}
}
if (diry == 1) {
if (ob.downleft && ob.downright) {
ob.y += ob.speed*diry;
} else {
ob.y = (ob.ytile+1)*level_n.tileH-ob.height;
}
}
getMyCorners(ob.x+ob.speed*dirx, ob.y, ob);
if (dirx == -1) {
if (ob.downleft && ob.upleft) {
ob.x += ob.speed*dirx;
} else {
ob.x = ob.xtile*level_n.tileW+ob.width;
}
}
if (dirx == 1) {
if (ob.upright && ob.downright) {
ob.x += ob.speed*dirx;
} else {
ob.x = (ob.xtile+1)*level_n.tileW-ob.width;
}
}
x_cord = ob.x-ob2.x;
y_cord = ob.y-ob2.y;
var dist = Math.round(Math.sqrt(x_cord*x_cord + y_cord*y_cord));
var e_so = SharedObject.get(”enemy”+ testvari,false);
testvar = String(dirx+diry*2+3) +”|”+ ob.x +”|”+ ob.y +”|”+ dist
e_so.setProperty(”r”, testvar);
return (true);
}
function shoot(ob) {
ob.lastshot = getTimer();
level_n.bulletcounter++;
if (level_n.bulletcounter>100) {
level_n.bulletcounter = 0;
}
var name = “bullet”+level_n.bulletcounter;
level_n[name] = new level_n.Bullet();
level_n[name].id = level_n.bulletcounter;
level_n.bullets.push(level_n[name]);
if (ob.dirx || ob.diry) {
level_n[name].dirx = ob.dirx;
level_n[name].diry = ob.diry;
}
level_n[name].xtile = ob.xtile;
level_n[name].ytile = ob.ytile;
level_n[name].x = (ob.x+level_n[name].dirx*ob.width);
level_n[name].y = (ob.y+level_n[name].diry*ob.height);
}
function shotshit3(pname,enemyshoot){
//trace(level_n[pname].y+” shotshit3 x”+level_n[pname].x+” y”+level_n[enemyshoot].y+” x “+level_n[enemyshoot].x);
xds = Math.round(level_n[enemyshoot].x - level_n[pname].x );
yds = Math.round(level_n[enemyshoot].y - level_n[pname].y);
tan = Math.atan(yds/xds)*180/Math.PI;
rds = Math.round(360 + tan);
if ((xds<0 && yds<0) || (xds<0 && yds>0) || (xds<0 && yds == 0)) {
rds = Math.round(180 + tan)
}
ob = level_n[enemyshoot]
var c1_so = SharedObject.get(”char”+ ob.id ,false);
testvar = rds +”|”+ ob.x +”|”+ ob.y
c1_so.setProperty(”r”, testvar);
c1_so.flush();
level_n.bulletcounter++;
projectile_so.setProperty(”namen”, String(”bullit”+ level_n.bulletcounter));
level_n.bullets.push([String("bullit"+level_n.bulletcounter),level_n[enemyshoot].x,level_n[enemyshoot].y,rds-90,0,0]);//
}//end shootshit3
function moveBullets() {
// loop through all bullets currently on stage
for (var i = 0; i
level_n.bullets[i][4] = Number(level_n.bullets[i][4]) + 1;
xs = Math.sin(Number(level_n.bullets[i][3])*(Math.PI/180))*10;
ys = Math.cos(Number(level_n.bullets[i][3])*(Math.PI/180))*10*-1;
level_n.bullets[i][1] = Number(level_n.bullets[i][1]) + xs;
level_n.bullets[i][2] = Number(level_n.bullets[i][2]) + ys;
var d_so = SharedObject.get(level_n.bullets[i][0],false);
testvar = Math.round(Number(level_n.bullets[i][1]))+”|”+Math.round(Number(level_n.bullets[i][2]))
d_so.setProperty(”xy”, testvar);
/*var ob = level_n.bullets[i];
// check if bullet will hit the wall
getMyCorners(ob.x+ob.speed*ob.dirx, ob.y+ob.speed*ob.diry, ob);
if (ob.downleft && ob.upleft && ob.downright && ob.upright) {
// move it
moveChar(ob, ob.dirx, ob.diry);
} else {
// delete bullet mc
//——————–ob.clip.removeMovieClip();
// delete bullet object
delete level_n["bullet"+level_n.bullets[i].id];
// remove bullet from bullets Array
level_n.bullets.splice(i, 1);
}*/
// check if we have shot the enemy
if (level_n.bullets[i][4]==100){
//eval(”_root.tiles.”+ level_n.bullets[i][0]).removeMovieClip();
delete d_so
level_n.bullets.splice(i, 1);
}else{
if(level_n.bullets[i][5]==0){
for (var j = 0; j
// name of enemy
//var name = “enemy”+level_n.currentEnemies[j].id;
//var obenemy = level_n[name];
// how far is the enemy
name = “enemy”+j;
var xdist = level_n[name].x - Number(level_n.bullets[i][1]);
var ydist = level_n[name].y - Number(level_n.bullets[i][2]);
// //////////////trace(eval(”_root.tiles.enemy”+ j)+” “+j+” y=”+eval(”_root.tiles.enemy”+ j)._y +” x=”+eval(”_root.tiles.”+ level_n.bullets[i][0])._x)
//_root.testtext.text = _root.level_n.bulletcounter+”xxxxxxxxxxxxxxxxxxx—–”+eval(”_root.tiles.bullit” + _root.level_n.bulletcounter)._x;
if (Math.sqrt(xdist*xdist+ydist*ydist)<5+5) {
//eval(”_root.tiles.enemy”+ j).removeMovieClip();
// delete enemy object
//trace(”hit the enemy”+level_n.currentEnemies[j].health)
if (level_n.currentEnemies[j].health<0 && level_n.currentEnemies[j].alive==true){
level_n.currentEnemies[j].alive=false;
//trace(” kill the enemy”)
delete d_so
level_n.bullets.splice(i, 1);
//delete level_n["enemy"+level_n.currentEnemies[j].id];
//level_n.currentEnemies.splice(j, 1);
}
else{
level_n.currentEnemies[j].health = level_n.currentEnemies[j].health - 26;
}
// delete level_n["enemy"+.id];
// remove enemy from currentEnemies array
//
// delete bullet mc
////////////////trace(” kill the enemy”+eval(”_root.tiles.”+ level_n.bullets[i][0]))
//eval(”_root.tiles.”+ level_n.bullets[i][0]).removeMovieClip();
// delete bullet object
//delete level_n["bullet"+level_n.bullets[level_n.bullets[i][0]]];
// remove bullet from bullets Array
}
}
}else{
for (var t = 0; t
var xdist = level_n.currentchars[t].x - Number(level_n.bullets[i][1]);
var ydist = level_n.currentchars[t].y - Number(level_n.bullets[i][2]);
// //trace(”xdist “+Math.sqrt(xdist*xdist+ydist*ydist))
if (Math.sqrt(xdist*xdist+ydist*ydist)<5+5) {
//trace(” kill the man”+t)
// //trace(t+” health=”+ level_n.currentchars[t].health)
if (level_n.currentchars[t].health<0){
level_n.currentchars[t].alive = false;
level_n.currentchars[t].health=0;
}
if (level_n.currentchars[t].alive==true){
level_n.currentchars[t].health = level_n.currentchars[t].health - Math.random()*50;
}
//eval(”_root.tiles.enemy”+ j).removeMovieClip();
// delete enemy object
//delete level_n["enemy"+level_n.currentEnemies[j].id];
// remove enemy from currentEnemies array
//level_n.currentEnemies.splice(j, 1);
// delete bullet mc
////////////////trace(” kill the enemy”+eval(”_root.tiles.”+ level_n.bullets[i][0]))
//eval(”_root.tiles.”+ level_n.bullets[i][0]).removeMovieClip();
// delete bullet object
//delete level_n["bullet"+level_n.bullets[level_n.bullets[i][0]]];
// remove bullet from bullets Array
delete d_so
level_n.bullets.splice(i, 1);
}
}
}//
}//end else
}
}
var line_of_sight2 = function ( x0 , y0 , x1 , y1 , map , size ) { var lty , tmp; var dx = x1 - x0; var dy = y1 - y0; var dm = dy / dx; var acute = Math.abs( dm ) > 1;
if ( acute ) {
tmp = x0;
x0 = y0;
y0 = tmp;
tmp = dx;
dx = dy;
dy = tmp;
dm = dy / dx;
};
if ( dx > 0 ) {
for ( var x = size - x0 % size ; x < dx ; x += size ) {
var tx = x0 + x;
var ty = y0 + x * dm;
if ( tx % size == 0 && ty % size == 0 ) { // exact diagonal
tx = Math.round ( tx / size );
if ( dy > 0 ) { ty = Math.round ( ty / size ) }
else { ty = Math.floor ( ty / size ) - 1 };
if ( !acute ) {
if ( map[ty][tx] == 1 ){ return true};
} else {
if ( map[tx][ty] == 1 ) {return true};
}
} else {
tx = Math.round ( tx / size );
ty = Math.floor ( ty / size );
if ( !acute ) {
if ( map[ty][tx] == 1 ) {return true};
} else {
if ( map[tx][ty] == 1 ) {return true};
}
if ( ty != lty ) {
tx = Math.round ( tx ) - 1;
if ( !acute ) {
////////////////trace(”t_”+ty+”_”+tx)
if ( map[ty][tx] == 1 ) {return true};
} else {
////////////////trace(”t_”+ty+”_”+tx)
if ( map[tx][ty] == 1 ) {return true};
}
}
}
lty = ty;
}
} else {
for ( var x = x0 % size ; x < -dx ; x += size ) {
var tx = x0 - x - size;
var ty = y0 - x * dm;
if ( tx % size == 0 && ty % size == 0 ) { // exact diagonal
tx = Math.round ( tx / size );
if ( dy > 0 ) { ty = Math.round ( ty / size ) }
else { ty = Math.floor ( ty / size ) - 1 };
if ( !acute ) {
if ( map[ty][tx] == 1 ) {return true};
} else {
if ( map[tx][ty] == 1 ) {return true};
}
} else {
tx = Math.round ( tx / size );
ty = Math.floor ( ty / size );
if ( !acute ) {
if ( map[ty][tx] == 1 ) {return true; }
} else {
if ( map[tx][ty] == 1 ){ return true; }
}
if ( ty != lty ) {
tx = Math.floor ( tx ) + 1;
if ( !acute ) {
if ( map[ty][tx] == 1 ) {return true};
} else {
if ( map[tx][ty] == 1 ){ return true};
}
}
}
lty = ty;
}
}
return false;
}
Incomplete but good example
I wrote a c#(actually copied the code from a great asycronous socket example on the web. I’ll post the link when I can find it! And yes I know about the cool new url favorite services on the web.) Embed director activex control to do the physics and c# to do the socket stuff. Please note this is only an example of how to do this with flash, director and microsoft. What a awesome combonation of tools!
There are four major components to this written in 3 different laguages leveriging 10 different types of technology
SERVER SETUP
WindowsApplication4.exe
Microsft Visual Studio 2003 c# asyncronous socket server modified to talk to flash on port 80
Com Object Proggraming to Talks to a Embed Director File
Director DCR stub file to Embed into c# AtiveX Control
This file contains a Director 8.5 3d Containor That manages all the physics powered by havok. When someone logs into the SocketServer it automatically adds the model to the 3d world and havok then as havok moves the models the socket server send the data back to the connect flash 8 client
CLIENT SETUP SOFTWARE
decent.dir
This is the main client it can be web based or a mac/pc executable it has the flash 8 file embeded into to talk to the c# socket server and then renders it to the client
mmorpg.swf
Flash 8 SWF file to embed in the client that has the socket client code in it
As Noted
key notes
Based on havok
Asycronis Socket Server
Flash Client thats attaches to port 80
Flex terrain generator from gis data
Well today it starts an insight into the mind of a mad computer scientist. You know I hate to type as an computer programmer you would think i love it but i don’t so dont expect much fancy words or allot of rederick here in my blog. It just a place for me to post my code and collaborate with other and the most part finally share my work!
Ps Thanks to all the great people that have shared your code with me everything cool i’ve done by learning
