sparky_hd
10-13-2006, 09:39 PM
i have a projector that loads a swf tile-based game. The game is time-based so it's important that the game has consistant performance across platforms.
If i use the speed of the game played through Flash 8 Player in the authoring environment as a reference, i find that the game played through the PC projector is about 1.5 times faster, and the game through the Mac projector is almost 2 times slower.
What could be causing that and how could i address it?
i'm using a modification of the Game.as class from http://www.flashierflash.com/
class Game {
var grid:Array, columns:Number, rows:Number, grid_clip:MovieClip, spacing:Number;
var defaultFrame:Number, startingPositions:Array, myCharacter:MovieClip, speed:Number;
var downY:Number, upY:Number, leftX:Number, rightX:Number;
var mapNum:Number, setNum:Number, doorTile:Tile, doorTileCol:Number, doorTileRow:Number;
var gameXML:XML;
function Game() {
}
function setGridClip(tmp_clip:MovieClip) {
grid_clip = tmp_clip;
}
function getGridClip():MovieClip {
return grid_clip;
}
function setSpacing(num:Number) {
spacing = num;
}
function getSpacing():Number {
return spacing;
}
function fromXML(info:XML) {
//store the game XML data the first time game is run FOR DIFFICULTY LEVEL ONLY
if (gameXML == undefined){
gameXML = info;
//gameXML = info.firstChild.childNodes[getSetNumber()];
//trace(gameXML);
}
//var rootNodes:Array = info.firstChild.childNodes;
var rootNodes:Array = info.firstChild.childNodes[getSetNumber()].childNodes[getMapNumber()].childNodes;
var spNode:XMLNode;
var epNode:XMLNode;
for (var i = 0; i<rootNodes.length; ++i) {
var tmp_node:XMLNode = rootNodes[i];
if (tmp_node.nodeName == "Header") {
parseHeader(tmp_node);
} else if (tmp_node.nodeName == "Map") {
createGrid(tmp_node);
} else if (tmp_node.nodeName == "StartingPositions") {
spNode = tmp_node;
} else if (tmp_node.nodeName == "EndingPosition") {
epNode = tmp_node;
}
}
parseStartingPositions(spNode);
parseEndingPosition(epNode);
}
function parseStartingPositions(info:XMLNode) {
var children:Array = info.childNodes;
for (var i = 0; i<children.length; ++i) {
var child:XMLNode = children[i];
var atts:Object = child.attributes;
var x:Number = Number(atts.x);
var y:Number = Number(atts.y);
speed = Number (atts.speed);
var tmp_tile:Tile = getTile(x, y);
//trace("tmp_tile: "+tmp_tile); // tmp_tile: [object Object]
addStartingPosition(tmp_tile);
}
}
function parseEndingPosition(info:XMLNode) {
var atts:Object = info.attributes;
var x:Number = Number(atts.x);
var y:Number = Number(atts.y);
var tmp_tile:Tile = getTile(x, y);
doorTileCol = x;
doorTileRow = y;
addEndingPosition(tmp_tile);
/*var children:Array = info.childNodes;
for (var i = 0; i<children.length; ++i) {
var child:XMLNode = children[i];
var atts:Object = child.attributes;
var x:Number = Number(atts.x);
var y:Number = Number(atts.y);
speed = Number (atts.speed);
var tmp_tile:Tile = getTile(x, y);
addStartingPosition(tmp_tile);
}*/
}
function moveCharacter(x_move, y_move){
var door_x = Math.floor(getCharacter()._x/getSpacing());
var door_y = Math.floor(getCharacter()._y/getSpacing());
var Char_x = myCharacter._x+x_move*speed;
var Char_y = myCharacter._y+y_move*speed;
//var Char_h = (myCharacter._height+1)/2;
var Char_h = (myCharacter.hit_mc._height+1)/2;
setMyCorners(Char_x, Char_y);
if (y_move == -1) {
if (getTile(leftX, upY).getIsWalkable().toString() == "true" && getTile(rightX, upY).getIsWalkable().toString() == "true") {
myCharacter._y += y_move*speed;
} else {
myCharacter._y = ((upY+1)*spacing)+Char_h;
}
}
if (y_move == 1) {
if (getTile(leftX, downY).getIsWalkable().toString() == "true" && getTile(rightX, downY).getIsWalkable().toString() == "true") {
myCharacter._y += y_move*speed;
} else {
myCharacter._y = (downY*spacing)-Char_h;
}
}
if (x_move == -1) {
if (getTile(leftX, upY).getIsWalkable().toString() == "true" && getTile(leftX, downY).getIsWalkable().toString() == "true") {
myCharacter._x += x_move*speed;
} else {
myCharacter._x = ((leftX+1)*spacing)+Char_h;
}
}
if (x_move == 1) {
if (getTile(rightX, upY).getIsWalkable().toString() == "true" && getTile(rightX, downY).getIsWalkable().toString() == "true") {
myCharacter._x += x_move*speed;
} else {
myCharacter._x = (rightX*spacing)-Char_h;
}
}
//
//if(getTile(door_y,door_x).getFrame() == "Doors"){
if(door_y == doorTileRow && door_x == doorTileCol){
trace("door detected");
changeMap();
}
//
setCharacter(myCharacter);
myCharacter.gotoAndStop(x_move+y_move*2+3);
}
function setMyCorners(x, y) {
/*downY = Math.floor((y+(myCharacter._height/2))/spacing);
upY = Math.floor((y-(myCharacter._height/2))/spacing);
leftX = Math.floor((x-(myCharacter._width/2))/spacing);
rightX = Math.floor((x+(myCharacter._width/2))/spacing);*/
downY = Math.floor((y+(myCharacter.hit_mc._height/2))/spacing);
upY = Math.floor((y-(myCharacter.hit_mc._height/2))/spacing);
leftX = Math.floor((x-(myCharacter.hit_mc._width/2))/spacing);
rightX = Math.floor((x+(myCharacter.hit_mc._width/2))/spacing);
}
function getMyCorners():Number {
return downY, upY, leftX, rightX;
}
function changeMap(){
trace("changeMap");
if(getMapNumber() < 2){
// set new map
setMapNumber(getMapNumber()+1);
fromXML(gameXML);
getGridClip()._parent.skylarFeedback(getMapNumber( ));
//getCharacter()._x = getSpacing()*1+5;
}else{
// game is over
//trace("you won ... "+_parent); // you won ... undefined
//trace("you won ... "+getGridClip()); // you won ... _level0.grid_clip
getGridClip()._parent.gotoAndPlay("endAnim");
//setMapNumber(1);
//getCharacter()._x = getSpacing()*7-5;//200;
}
}
function setMapNumber(tmp:Number){
if (tmp == undefined) {//|| tmp == undefined){
mapNum = 0;
//trace("mapNum "+mapNum);
}else{
mapNum = tmp;
//trace("mapNum "+mapNum);
}
}
function getMapNumber():Number{
return mapNum;
}
function setSetNumber(tmp:Number){
if (tmp == undefined) {
setNum = 0;
//trace("setNum "+setNum);
}else{
setNum = tmp;
//trace("setNum "+setNum);
}
}
function getSetNumber():Number{
return setNum;
}
function addStartingPosition(tmp_tile:Tile) {
if (getGridClip().char_holder.name == undefined){
trace("create character");
var depth:Number = getGridClip().char_holder.getNextHighestDepth();
var clip:MovieClip = getGridClip().char_holder.attachMovie("character", "name", depth);
clip._x = tmp_tile.getClip()._x+getSpacing()/2;
clip._y = tmp_tile.getClip()._y+getSpacing()/2;
setCharacter(clip);
} else{
trace("reposition character instead");
getCharacter()._x = tmp_tile.getClip()._x+getSpacing()/2;
getCharacter()._y = tmp_tile.getClip()._y+getSpacing()/2;
}
}
function addEndingPosition(tmp_tile:Tile) {
//trace("addEndingPosition: "+tmp_tile); // addEndingPosition: [object Object]
//trace(getGridClip().char_holder);
//trace(getGridClip().test_holder);
if (getGridClip().char_holder.end == undefined){
trace("create doorway");
var depth:Number = getGridClip().char_holder.getNextHighestDepth();
//trace(getGridClip().char_holder);
var clip:MovieClip = getGridClip().char_holder.attachMovie("doorway", "end", depth);
clip._x = tmp_tile.getClip()._x+getSpacing()/2;
//trace("clip._x: "+clip._x); //162
clip._y = tmp_tile.getClip()._y+getSpacing()/2;
//trace("clip._y: "+clip._y); //18
//setDoor(tmp_tile);
//setCharacter(clip);
} else {
trace("reposition doorway");
getGridClip().char_holder.end._x = tmp_tile.getClip()._x+getSpacing()/2;
getGridClip().char_holder.end._y = tmp_tile.getClip()._y+getSpacing()/2;
}
}
function getDefaultFrame():Number {
return defaultFrame;
}
function setDefaultFrame(frame:Number) {
defaultFrame = frame;
for (var i = 0; i<getColumns(); ++i) {
for (var j = 0; j<getRows(); ++j) {
getTile(i, j).changeDefaultFrame(frame);
}
}
}
function parseHeader(info:XMLNode) {
var atts:Object = info.attributes;
setColumns(Number(atts.columns));
setRows(Number(atts.rows));
}
function createGrid(info:XMLNode) {
clearGrid();
setDefaultFrame(info.attributes.defaultFrame);
var column_nodes:Array = info.childNodes;
var th:MovieClip = getGridClip().tile_holder;
for (var i = 0; i<column_nodes.length; ++i) {
var tiles:Array = column_nodes[i].childNodes;
for (var j = 0; j<tiles.length; ++j) {
var depth:Number = th.getNextHighestDepth();
var tmp_tile_clip:MovieClip = th.attachMovie("tile", "tile"+depth.toString(), depth);
tmp_tile_clip._x = i*getSpacing();
tmp_tile_clip._y = j*getSpacing();
var tmp_tile:Tile = getTile(i, j);
tmp_tile.setClip(tmp_tile_clip);
tmp_tile.setDefaultFrame(getDefaultFrame());
tmp_tile.fromXML(tiles[j]);
}
}
}
function getTile(column:Number, row:Number):Tile {
return grid[column][row];
}
function clearGrid() {
grid = new Array();
for (var i = 0; i<getColumns(); ++i) {
for (var j = 0; j<getRows(); ++j) {
if (j == 0) {
grid[i] = new Array();
}
var tmp_tile:Tile = new Tile();
grid[i][j] = tmp_tile;
}
}
}
function setColumns(num:Number) {
columns = num;
}
function getColumns():Number {
return columns;
}
function setRows(num:Number) {
rows = num;
}
function getRows():Number {
return rows;
}
function setCharacter(clip:MovieClip) {
myCharacter = clip;
}
function getCharacter():MovieClip {
return myCharacter;
}
}
If i use the speed of the game played through Flash 8 Player in the authoring environment as a reference, i find that the game played through the PC projector is about 1.5 times faster, and the game through the Mac projector is almost 2 times slower.
What could be causing that and how could i address it?
i'm using a modification of the Game.as class from http://www.flashierflash.com/
class Game {
var grid:Array, columns:Number, rows:Number, grid_clip:MovieClip, spacing:Number;
var defaultFrame:Number, startingPositions:Array, myCharacter:MovieClip, speed:Number;
var downY:Number, upY:Number, leftX:Number, rightX:Number;
var mapNum:Number, setNum:Number, doorTile:Tile, doorTileCol:Number, doorTileRow:Number;
var gameXML:XML;
function Game() {
}
function setGridClip(tmp_clip:MovieClip) {
grid_clip = tmp_clip;
}
function getGridClip():MovieClip {
return grid_clip;
}
function setSpacing(num:Number) {
spacing = num;
}
function getSpacing():Number {
return spacing;
}
function fromXML(info:XML) {
//store the game XML data the first time game is run FOR DIFFICULTY LEVEL ONLY
if (gameXML == undefined){
gameXML = info;
//gameXML = info.firstChild.childNodes[getSetNumber()];
//trace(gameXML);
}
//var rootNodes:Array = info.firstChild.childNodes;
var rootNodes:Array = info.firstChild.childNodes[getSetNumber()].childNodes[getMapNumber()].childNodes;
var spNode:XMLNode;
var epNode:XMLNode;
for (var i = 0; i<rootNodes.length; ++i) {
var tmp_node:XMLNode = rootNodes[i];
if (tmp_node.nodeName == "Header") {
parseHeader(tmp_node);
} else if (tmp_node.nodeName == "Map") {
createGrid(tmp_node);
} else if (tmp_node.nodeName == "StartingPositions") {
spNode = tmp_node;
} else if (tmp_node.nodeName == "EndingPosition") {
epNode = tmp_node;
}
}
parseStartingPositions(spNode);
parseEndingPosition(epNode);
}
function parseStartingPositions(info:XMLNode) {
var children:Array = info.childNodes;
for (var i = 0; i<children.length; ++i) {
var child:XMLNode = children[i];
var atts:Object = child.attributes;
var x:Number = Number(atts.x);
var y:Number = Number(atts.y);
speed = Number (atts.speed);
var tmp_tile:Tile = getTile(x, y);
//trace("tmp_tile: "+tmp_tile); // tmp_tile: [object Object]
addStartingPosition(tmp_tile);
}
}
function parseEndingPosition(info:XMLNode) {
var atts:Object = info.attributes;
var x:Number = Number(atts.x);
var y:Number = Number(atts.y);
var tmp_tile:Tile = getTile(x, y);
doorTileCol = x;
doorTileRow = y;
addEndingPosition(tmp_tile);
/*var children:Array = info.childNodes;
for (var i = 0; i<children.length; ++i) {
var child:XMLNode = children[i];
var atts:Object = child.attributes;
var x:Number = Number(atts.x);
var y:Number = Number(atts.y);
speed = Number (atts.speed);
var tmp_tile:Tile = getTile(x, y);
addStartingPosition(tmp_tile);
}*/
}
function moveCharacter(x_move, y_move){
var door_x = Math.floor(getCharacter()._x/getSpacing());
var door_y = Math.floor(getCharacter()._y/getSpacing());
var Char_x = myCharacter._x+x_move*speed;
var Char_y = myCharacter._y+y_move*speed;
//var Char_h = (myCharacter._height+1)/2;
var Char_h = (myCharacter.hit_mc._height+1)/2;
setMyCorners(Char_x, Char_y);
if (y_move == -1) {
if (getTile(leftX, upY).getIsWalkable().toString() == "true" && getTile(rightX, upY).getIsWalkable().toString() == "true") {
myCharacter._y += y_move*speed;
} else {
myCharacter._y = ((upY+1)*spacing)+Char_h;
}
}
if (y_move == 1) {
if (getTile(leftX, downY).getIsWalkable().toString() == "true" && getTile(rightX, downY).getIsWalkable().toString() == "true") {
myCharacter._y += y_move*speed;
} else {
myCharacter._y = (downY*spacing)-Char_h;
}
}
if (x_move == -1) {
if (getTile(leftX, upY).getIsWalkable().toString() == "true" && getTile(leftX, downY).getIsWalkable().toString() == "true") {
myCharacter._x += x_move*speed;
} else {
myCharacter._x = ((leftX+1)*spacing)+Char_h;
}
}
if (x_move == 1) {
if (getTile(rightX, upY).getIsWalkable().toString() == "true" && getTile(rightX, downY).getIsWalkable().toString() == "true") {
myCharacter._x += x_move*speed;
} else {
myCharacter._x = (rightX*spacing)-Char_h;
}
}
//
//if(getTile(door_y,door_x).getFrame() == "Doors"){
if(door_y == doorTileRow && door_x == doorTileCol){
trace("door detected");
changeMap();
}
//
setCharacter(myCharacter);
myCharacter.gotoAndStop(x_move+y_move*2+3);
}
function setMyCorners(x, y) {
/*downY = Math.floor((y+(myCharacter._height/2))/spacing);
upY = Math.floor((y-(myCharacter._height/2))/spacing);
leftX = Math.floor((x-(myCharacter._width/2))/spacing);
rightX = Math.floor((x+(myCharacter._width/2))/spacing);*/
downY = Math.floor((y+(myCharacter.hit_mc._height/2))/spacing);
upY = Math.floor((y-(myCharacter.hit_mc._height/2))/spacing);
leftX = Math.floor((x-(myCharacter.hit_mc._width/2))/spacing);
rightX = Math.floor((x+(myCharacter.hit_mc._width/2))/spacing);
}
function getMyCorners():Number {
return downY, upY, leftX, rightX;
}
function changeMap(){
trace("changeMap");
if(getMapNumber() < 2){
// set new map
setMapNumber(getMapNumber()+1);
fromXML(gameXML);
getGridClip()._parent.skylarFeedback(getMapNumber( ));
//getCharacter()._x = getSpacing()*1+5;
}else{
// game is over
//trace("you won ... "+_parent); // you won ... undefined
//trace("you won ... "+getGridClip()); // you won ... _level0.grid_clip
getGridClip()._parent.gotoAndPlay("endAnim");
//setMapNumber(1);
//getCharacter()._x = getSpacing()*7-5;//200;
}
}
function setMapNumber(tmp:Number){
if (tmp == undefined) {//|| tmp == undefined){
mapNum = 0;
//trace("mapNum "+mapNum);
}else{
mapNum = tmp;
//trace("mapNum "+mapNum);
}
}
function getMapNumber():Number{
return mapNum;
}
function setSetNumber(tmp:Number){
if (tmp == undefined) {
setNum = 0;
//trace("setNum "+setNum);
}else{
setNum = tmp;
//trace("setNum "+setNum);
}
}
function getSetNumber():Number{
return setNum;
}
function addStartingPosition(tmp_tile:Tile) {
if (getGridClip().char_holder.name == undefined){
trace("create character");
var depth:Number = getGridClip().char_holder.getNextHighestDepth();
var clip:MovieClip = getGridClip().char_holder.attachMovie("character", "name", depth);
clip._x = tmp_tile.getClip()._x+getSpacing()/2;
clip._y = tmp_tile.getClip()._y+getSpacing()/2;
setCharacter(clip);
} else{
trace("reposition character instead");
getCharacter()._x = tmp_tile.getClip()._x+getSpacing()/2;
getCharacter()._y = tmp_tile.getClip()._y+getSpacing()/2;
}
}
function addEndingPosition(tmp_tile:Tile) {
//trace("addEndingPosition: "+tmp_tile); // addEndingPosition: [object Object]
//trace(getGridClip().char_holder);
//trace(getGridClip().test_holder);
if (getGridClip().char_holder.end == undefined){
trace("create doorway");
var depth:Number = getGridClip().char_holder.getNextHighestDepth();
//trace(getGridClip().char_holder);
var clip:MovieClip = getGridClip().char_holder.attachMovie("doorway", "end", depth);
clip._x = tmp_tile.getClip()._x+getSpacing()/2;
//trace("clip._x: "+clip._x); //162
clip._y = tmp_tile.getClip()._y+getSpacing()/2;
//trace("clip._y: "+clip._y); //18
//setDoor(tmp_tile);
//setCharacter(clip);
} else {
trace("reposition doorway");
getGridClip().char_holder.end._x = tmp_tile.getClip()._x+getSpacing()/2;
getGridClip().char_holder.end._y = tmp_tile.getClip()._y+getSpacing()/2;
}
}
function getDefaultFrame():Number {
return defaultFrame;
}
function setDefaultFrame(frame:Number) {
defaultFrame = frame;
for (var i = 0; i<getColumns(); ++i) {
for (var j = 0; j<getRows(); ++j) {
getTile(i, j).changeDefaultFrame(frame);
}
}
}
function parseHeader(info:XMLNode) {
var atts:Object = info.attributes;
setColumns(Number(atts.columns));
setRows(Number(atts.rows));
}
function createGrid(info:XMLNode) {
clearGrid();
setDefaultFrame(info.attributes.defaultFrame);
var column_nodes:Array = info.childNodes;
var th:MovieClip = getGridClip().tile_holder;
for (var i = 0; i<column_nodes.length; ++i) {
var tiles:Array = column_nodes[i].childNodes;
for (var j = 0; j<tiles.length; ++j) {
var depth:Number = th.getNextHighestDepth();
var tmp_tile_clip:MovieClip = th.attachMovie("tile", "tile"+depth.toString(), depth);
tmp_tile_clip._x = i*getSpacing();
tmp_tile_clip._y = j*getSpacing();
var tmp_tile:Tile = getTile(i, j);
tmp_tile.setClip(tmp_tile_clip);
tmp_tile.setDefaultFrame(getDefaultFrame());
tmp_tile.fromXML(tiles[j]);
}
}
}
function getTile(column:Number, row:Number):Tile {
return grid[column][row];
}
function clearGrid() {
grid = new Array();
for (var i = 0; i<getColumns(); ++i) {
for (var j = 0; j<getRows(); ++j) {
if (j == 0) {
grid[i] = new Array();
}
var tmp_tile:Tile = new Tile();
grid[i][j] = tmp_tile;
}
}
}
function setColumns(num:Number) {
columns = num;
}
function getColumns():Number {
return columns;
}
function setRows(num:Number) {
rows = num;
}
function getRows():Number {
return rows;
}
function setCharacter(clip:MovieClip) {
myCharacter = clip;
}
function getCharacter():MovieClip {
return myCharacter;
}
}