#flash #actionscript-3
#flash #actionscript-3
Вопрос:
Я почти закончил с этой флеш-игрой, но когда я ее тестирую, игра замедляется сверхурочно. Я перечитывал сценарий снова и снова. Пытался комментировать отдельные части скрипта, но он по-прежнему замедляется.
Это весь мой скрипт:
//loads keyboard events
import flash.events.KeyboardEvent
var laatstelook:int = 1;
var ironbird:Boolean = false;
var laatstejump = 1;
var movebirdie:int = 2;
var birdfatigue : Boolean = false;
var birdtellery:int = 0;
var birdtelleryvertrager = 0;
var vy:Number=0;
var movement:Boolean=false;
var springen:Boolean=false;
var gv:Number=0.1;
var keyArray:Array = new Array();
var i:Number;
var leftOrrightpressed:Number=0;
var platformraak=false;
var PlatformArray:Array = new Array();
var StudioLightArray:Array = new Array();
var MovingPlatformArray:Array = new Array();
var MovingStudioLightArray:Array = new Array();
var SpeakerArray:Array = new Array();;
var birdieRespawnY = 90.1;
var birdieRespawnX = 40.75;
var campowerupPositionX = 275.3;
var speed : int = -2;
var lightspeed : int = -2;
var setmoveto = false;
var birdieAttack : Boolean = false;
var shitlist : Array = [];
var shit:ShitMissile = new ShitMissile();
var IronManMusic:Sound = new IronManSong();
var IronManChannel:SoundChannel = new SoundChannel();
var backgroundMusic:Sound = new BackgroundMusic();
var myChannel:SoundChannel = new SoundChannel();
myChannel = backgroundMusic.play();
powerupscreen.visible = false;
powerupscreen.stop();
for(i=0;i<222;i ){
keyArray.push([i,false]);
}
//creating multiple objects from 1 object
for (var a:int = numChildren - 1; a >= 0; a--){
var child:DisplayObject = getChildAt(a);
if (child.name == "platform"){
PlatformArray.push(child);
}
}
for (var b:int = numChildren - 1; b >= 0; b--){
var child2:DisplayObject = getChildAt(b);
if (child2.name == "studiolight"){
StudioLightArray.push(child2);
}
}
for (var c:int = numChildren - 1; c >= 0; c--){
var child3:DisplayObject = getChildAt(c);
if (child3.name == "movingplatform"){
MovingPlatformArray.push(child3);
}
}
for (var d:int = numChildren - 1; d >= 0; d--){
var child4:DisplayObject = getChildAt(d);
if (child4.name == "movingstudiolight"){
MovingStudioLightArray.push(child4);
}
}
for (var speaker:int = numChildren -1; speaker >= 0; speaker--){
var child5:DisplayObject = getChildAt(speaker);
if(child5.name == "speaker"){
SpeakerArray.push(child5);
}
}
stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeysDown);
stage.addEventListener(KeyboardEvent.KEY_UP,checkKeysUp);
this.addEventListener(Event.ENTER_FRAME, UpdateScreen);
function UpdateScreen(event:Event):void{
/*trace(birdie.x, "birdie");
trace(vcam.x);*/
//moves platform
movingplatform.y = speed;
if(movingplatform.y <= 25){
speed = 2;
}
if(movingplatform.y >= 350){
speed = -2;
}
//moves stodiolight light
if(setmoveto == true){
movingstudiolight.x = lightspeed;
if(movingstudiolight.x <= 2270){
lightspeed = 2;
}
if(movingstudiolight.x >= 3115){
lightspeed = -2;
}
}
//respawn points
if(birdie.y >= 450){
birdie.x = birdieRespawnX;
birdie.y = birdieRespawnY;
vcam.x = campowerupPositionX;
powerupscreen.x = campowerupPositionX;
}
if(birdie.x >= 533 amp;amp; birdie.x <= 537){
birdieRespawnX = 535.75;
birdieRespawnY = 200.15;
campowerupPositionX = 519.75
}
if(birdie.x >= 2097 amp;amp; birdie.x <= 2190){
birdieRespawnX = 2141.5
birdieRespawnY = 62.55;
campowerupPositionX = 2155.3;
}
//No multiple jumps in air
if(springen==true){
birdie.gotoAndStop(laatstejump);
birdtelleryvertrager =0.2;
birdie.y-=15;
birdie.y =birdtelleryvertrager;
if(birdie.y <= 19){
birdie.y = 15;
}
birdtellery ;
if(isKeyDown(39)==true){
birdie.x = 5;
background.x = 1;
powerupscreen.x = 5
vcam.x = 5;
if(birdie.x <= 261.95){
vcam.x = 275.5;
powerupscreen.x = 275.5;
background.x -= 1;
}
if(ironbird != true){
birdie.gotoAndStop(5);
}else{birdie.gotoAndStop(13);
}
}
if(isKeyDown(37)==true){
birdie.x-=5;
powerupscreen.x-=5;
vcam.x -= 5;
background.x -= 1;
if(birdie.x <= 261.95){
vcam.x = 275.5;
powerupscreen.x = 275.5
background.x = 1;
}
birdie.gotoAndStop(6);
}
//bird falls down
if(birdtellery>25){
birdfatigue == true;
if(isKeyDown(39)==true){
birdie.x-=4;
vcam.x -= 4;
powerupscreen.x-=4;
}
if(isKeyDown(37)==true){
birdie.x = 4;
vcam.x = 4;
}
birdtelleryvertrager =0.8;
}
//bird can jump again (when on platform)
if(birdtellery>30){
springen=false;
}
}else{
if(birdie.y <= 19){
birdie.y = 15;
}
if(birdfatigue == true){
birdie.gotoAndStop(7);
}
//if right arrow button is pressed
if(isKeyDown(39)==true){
birdie.x = movebirdie;
if(birdie.x >= 261.95){
powerupscreen.x = movebirdie;
vcam.x = movebirdie;
background.x = 0.5;
}
if(ironbird != true){
birdie.gotoAndStop(2);
laatstelook =1;
}else{birdie.gotoAndStop(11);
laatstelook =9;
}
laatstejump =5;
leftOrrightpressed =1;
}
if(isKeyDown(39)==false){
if (leftOrrightpressed ==1){
birdie.gotoAndStop(laatstelook);
}
}
//if left arrow button is pressed
if(isKeyDown(37)==true){
birdie.x -= movebirdie;
background.x -= 0.5;
powerupscreen.x -= movebirdie;
vcam.x -= movebirdie;
if(birdie.x <= 261.95){
powerupscreen.x = 275.5
vcam.x = 275.5;
background.x = 0.5;
}
if(ironbird != true){
birdie.gotoAndStop(3);
laatstelook =4;
}else{birdie.gotoAndStop(12);
laatstelook = 10;
}
laatstejump=6;
leftOrrightpressed =2;
}
if(isKeyDown(37)==false){
if (leftOrrightpressed ==2){
birdie.gotoAndStop(laatstelook);
}
}
//if space button is pressed
if(isKeyDown(32)==true amp;amp; springen==false){
springen=true;
}
if(isKeyDown(17) == true){
stage.addChild(shit);
shitlist.push(shit);
shit.x = birdie.x;
shit.y = birdie.y;
birdie.gotoAndStop(14);
}
shit.y ;
}
if(birdie.hitTestPoint(ironbirdpickup.x,ironbirdpickup.y,true)){
ironbirdpickup.y = -60;
powerupscreen.play();
powerupscreen.visible = true;
ironbird = true;
IronManChannel = IronManMusic.play();
myChannel.stop();
}
if(ironbird==true){
laatstejump = 9;
}
addEventListener(Event.ENTER_FRAME,ctrl_birdie);
function ctrl_birdie(e:Event){
//when bird touches one of the platforms, bird stops falling
for(var a in PlatformArray){
if(PlatformArray[a].hitTestPoint(birdie.x,birdie.y,true)){
birdtelleryvertrager=0;
birdtellery = 0;
birdie.y-=1;
}
}
for(var b in StudioLightArray){
if(StudioLightArray[b].hitTestPoint(birdie.x,birdie.y,true)){
birdtelleryvertrager=0;
birdtellery = 0;
birdie.y-=1;
}
}
for(var c in MovingPlatformArray){
if(MovingPlatformArray[c].hitTestPoint(birdie.x,birdie.y,true)){
birdtelleryvertrager=0;
birdtellery = 0;
birdie.y-=1;
}
}
for(var d in MovingStudioLightArray){
if(MovingStudioLightArray[d].hitTestPoint(birdie.x,birdie.y,true)){
birdtelleryvertrager=0;
birdtellery = 0;
birdie.y-=1;
birdie.x = movingstudiolight.x;
powerupscreen.x = birdie.x
vcam.x = birdie.x;
setmoveto = true;
}
}
for(var speaker in SpeakerArray){
if(SpeakerArray[speaker].hitTestPoint(birdie.x 2,birdie.y,true)){
birdie.x -= 5;
}
}
}
//gravity
vy = 10;
birdie.y =vy;
}
//checks if certain key is pressed
function checkKeysDown(event:KeyboardEvent):void{
keyArray[event.keyCode][1]=true;
}
function checkKeysUp(event:KeyboardEvent):void{
keyArray[event.keyCode][1]=false;
}
function isKeyDown(X){
return keyArray[X][1];
}
Если у вас есть какие-то советы по оптимизации или даже вы нашли ошибку в моем коде, пожалуйста, оставьте комментарий. Заранее спасибо! 🙂
Комментарии:
1. У вас недостаточно времени, но на первый взгляд: у вас есть два цикла ввода кадров одновременно, их можно объединить. Много циклов for, они действительно необходимы? Вверху много переменных, не могли бы вы извлечь некоторые из них в класс многократного использования (например, Birdie и т.д.)? An самое очевидное: en.wikipedia.org/wiki/Don’t_repeat_yourself
Ответ №1:
Я не могу точно сказать, ваш код довольно длинный, но добавляете ли вы прослушиватель событий для ENTER_FRAME
внутри прослушивателя событий для ENTER_FRAME
функции, которая переопределяется на каждой итерации?
Если это так:
- выйдите
ctrl_birdie
из прослушивателя (поместите его на тот же уровень, что и другие ваши методы), - вызовите
addEventListener(Event.ENTER_FRAME,ctrl_birdie)
только один раз и - удалите ее, когда она вам больше не понадобится (если в какой-то момент она вам больше не понадобится).
Если это и не решит проблему утечки памяти, то, по крайней мере, сделает ваш код немного легче для чтения.