Comunidad de diseño web y desarrollo en internet online

Problema de Fuga de Memoria en Juego Flash (Aqui el codigo)

Citar            
MensajeEscrito el 16 Mar 2011 06:58 pm
Buenas Gente CL!
Ok vamos a ver si me explico bien...cualquier duda me escribe.

Lo que esten en "" son los nombre de instancia
En el juego controla a un personaje "Orion" ok
el tiene varios estados en el clip (COrrer, saltar, atacar, etc....)
se recogen monedas "coin"
se atacan a los enemigos "enemigo1"
el mundo donde camina es "piso"

El problema se da que si permanezco mas de 6 o 7 minutos jugando el juego se pone super lento y a raiz de ese problema lo he dejado de lado un poco.....no encuentro cual es el problema especificamente...

Si alguien me ayuda a chequear....lo que si me he dado cuenta que luego d elos 7 min el problema se nota SOLO cuando muevo el personaje...

De antemano gracias a los que se interesen en ayudarme......!!!


Aqui el codigo que utilizo:

Código ActionScript :

stop();
//Variables//
var monedas:Number = 0;
var numataque:Number = 1
var atacando:Boolean = false
var velLateral:Number = 3;
var friccion:Number = .6;
var friccionAire:Number = .6;
var gravedad:Number = -4.5;
var tiempoSalto:Number = 4;
var salto:Number = 30/tiempoSalto;
var velMaxima:Number = 20;
var puntoIzq:Number = -10;
var puntoDer:Number = 10;
var puntoBajo:Number = 17.5;
var puntoArriba:Number = -17.5;
var vermenu:Boolean=true
var muerto:Boolean=false
//Inicializar Personaje//
function inicializarPersonaje(mc:MovieClip):Void{
   if(mc.dx==undefined){
      mc.dx = 0;
      mc.dy = 0;
      mc.saltando = true;
      mc.empezoSalto=0;
   }
   mc.friccion = friccion;
   mc.vel = velLateral;
   mc.salto = salto;
}
//Manejar Personaje//
function manejarPersonaje():Void{
   if(Key.isDown(Key.SPACE)&&_root.atacando==false){
      _root.atacando=true
      orion.gotoAndPlay("atq"+numataque);
   }
   if(Key.isDown(Key.LEFT)&&_root.atacando==false){
      orion.dx -= orion.vel;
      correIzq(orion);
      orion._xscale=-100
      orion.gotoAndStop("andando");
      if(Key.isDown(Key.SHIFT)&&orion.saltando==true){
         orion._x-=3
         orion.gotoAndStop("andandoturbo");
      }
   }
   if(Key.isDown(Key.RIGHT)&&_root.atacando==false){
      orion.dx += orion.vel;
      orion._xscale=100
      orion.gotoAndStop("andando");
      if(Key.isDown(Key.SHIFT)&&orion.saltando==true){
         orion._x+=3
         orion.gotoAndStop("andandoturbo");
      }
   }
   if(Key.isDown(Key.DOWN)&&_root.atacando==false&&orion.saltando==false){
      orion.gotoAndStop("agachado");
      atacando=true
   }
   if(Key.isDown(Key.UP)&&orion.saltando==false&&_root.atacando==false){
      salta(orion);
      orion.gotoAndStop("saltando");
   }else if(Key.isDown(Key.UP)&&orion.empezoSalto>0){
      orion.dy-=orion.salto;
   }
   orion.empezoSalto--;
   var listKey:Object = new Object();
   listKey.onKeyUp = function () {
   switch (Key.getCode()) {
      case Key.LEFT:
         if(Key.isDown(Key.RIGHT)&&_root.atacando==false) {
            orion.gotoAndStop("andando");
         } else if(_root.atacando==false) {
            orion.gotoAndStop("detenido");
         }
      break;
      case Key.UP:
         if(Key.isDown(Key.RIGHT)&&_root.atacando==false) {
            orion.gotoAndStop("andando");
         } else if(Key.isDown(Key.LEFT)&&_root.atacando==false) {
            orion.gotoAndStop("andando");
         } else if(_root.atacando==false) {
            orion.gotoAndStop("detenido");
         }
      break;
      case Key.RIGHT:
         if(Key.isDown(Key.RIGHT)&&_root.atacando==false) {
            orion.gotoAndStop("andando");
         } else if(_root.atacando==false) {
            orion.gotoAndStop("detenido");
         }
      break;
      case Key.DOWN:
         atacando=false
         if(Key.isDown(Key.RIGHT)&&_root.atacando==false) {
            orion.gotoAndStop("andando");
         } else if(Key.isDown(Key.LEFT)&&_root.atacando==false) {
            orion.gotoAndStop("andando");
         } else if(_root.atacando==false) {
            orion.gotoAndStop("detenido");
         }
      break;
   }
}
Key.addListener(listKey);
}
function salta(mc:MovieClip):Void{
   inicializarPersonaje(mc);
   mc.friccion = friccionAire;
   mc.dy -= mc.salto;
   mc.saltando = true;
   mc.empezoSalto=tiempoSalto;
}
//Checar Colisiones//Puertas//Piso Negativos
function checarColisiones(mc:MovieClip):Void{
   while(piso.hitTest(mc._x,mc._y+puntoArriba,true)){
      mc._y++;
      mc.dy = Math.abs(mc.dy);
   }
   while(piso.hitTest(mc._x,mc._y+puntoBajo,true)){
      mc.saltando = false;
      mc._y--;
      mc.dy = 0;
   }
   while(pisonegativo.hitTest(mc._x,mc._y+puntoBajo,true)&&muerto==false){
      mc.saltando = false;
      mc._y--;
      mc.dy = 0;
      _root.vida=_root.vida-1
      orion.gotoAndStop("herido");
      if(muerto==true) {
         _root.atacando=true
         this.barradevida.gotoAndStop(1);
         _root.orion.gotoAndStop("muerto");
      }
   }
   while(piso.hitTest(mc._x+puntoIzq+1,mc._y,true)){
      mc._x++;
      mc.dx=0;
   }
   if (caida.hitTest(mc._x+puntoIzq+1,mc._y,true)){
      gotoAndStop("gameover",1);
   }
   while(piso.hitTest(mc._x+puntoIzq+1,mc._y+puntoBajo/2,true)){
      mc._x++;
      mc.dx=0;
   }
   if (salida.hitTest(mc._x+puntoIzq+1,mc._y,true)){
      nextFrame();
   }
   if (salida.hitTest(mc._x+puntoDer+1,mc._y,true)){
      nextFrame();
   }
   while(piso.hitTest(mc._x+puntoDer-1,mc._y,true)){
      mc._x--;
      mc.dx=0;
   }
   while(piso.hitTest(mc._x+puntoDer-1,mc._y+puntoBajo/2,true)){
      mc._x--;
      mc.dx=0;
   }
}
//Aplicar Movimiento//
function aplicarMovimiento():Void{
   this._x+=this.dx;
   this.dx*=this.friccion;
   if(this.dx>velMaxima){
      this.dx=velMaxima;
   }else if(this.dx<-velMaxima){
      this.dx=-velMaxima;
   }
   this._y+=this.dy;
   if(!piso.hitTest(this._x,this._y+puntoBajo+1,true)){
      this.saltando = true;
   }
   if(this.saltando){
      this.suelo = 0;
      this.dy-=gravedad;
      if(this.dy>salto*tiempoSalto){
         this.dy = salto*tiempoSalto;
      }
   }
   checarColisiones(this);
}
//Menu de Datos//
function menudedatos() {
   if(Key.isDown(Key.CONTROL)&&vermenu==true){
      this._visible=0
      this.play();
   }
   if(Key.isDown(Key.CONTROL)&&vermenu==false){
      this._visible=1
      this.play();
   }
   this.espada.gotoAndStop(_root.numespada);
   this.barradevida.gotoAndStop(Math.round((_root.vida*100)/_root.maxvida));
   this.esp="+"+espada
   this.frz=fuerza
   this.def=defensa
   this.nvl=nivel
   this.vidaa=vida
   this.expe=experiencia
   this.proxnvl=proxnivel
   this.mon=monedas
   if(experiencia >= proxnivel) {
      proxnivel = Math.round(proxnivel+((50*proxnivel)/100))
      nivel = nivel+1
      maxvida = Math.round(maxvida+((10*maxvida)/100))
      vida=maxvida
      fuerza = Math.round(fuerza+((12*fuerza)/100))
      defensa = Math.round(defensa+((10*defensa)/100))
      subenivel.play();
      subenivel._x=orion._x
      subenivel._y=orion._y
   }
   if(vida <= 0&&muerto==false) {
      vida = 0
      muerto=true
      _root.atacando=true
      this.barradevida.gotoAndStop(1);
      _root.orion.gotoAndStop("muerto");
   }
   if(vida > maxvida) {
      vida = maxvida
   }
   if(nivel >= 10) {
      ataque2=true
      this.atq2._visible=1
   } else if(nivel <= 10) {
      ataque2=false
      this.atq2._visible=0
   }
   if(nivel >= 20) {
      ataque3=true
      this.atq3._visible=1
   } else if(nivel <= 20) {
      ataque3=false
      this.atq3._visible=0
   }
   if(nivel >= 30) {
      ataque4=true
      this.atq4._visible=1
   } else if(nivel <= 30) {
      ataque4=false
      this.atq4._visible=0
   }
   if(nivel >= 40) {
      ataque5=true
      this.atq5._visible=1
   } else if(nivel <= 40) {
      ataque5=false
      this.atq5._visible=0
   }
   if(nivel >= 50) {
      ataque6=true
      this.atq6._visible=1
   } else if(nivel <= 50) {
      ataque6=false
      this.atq6._visible=0
   }
   if(Key.isDown(49)) {
      _root.numataque = 1;
      this.destello._x=this.atq1._x
      this.destello._y=this.atq1._y
   }
   if(Key.isDown(50)&&ataque2==true) {
      _root.numataque = 2;
      this.destello._x=this.atq2._x
      this.destello._y=this.atq2._y
   }
   if(Key.isDown(51)&&ataque3==true) {
      _root.numataque = 3;
      this.destello._x=this.atq3._x
      this.destello._y=this.atq3._y
   }
   if(Key.isDown(52)&&_root.ataque4==true) {
      _root.numataque = 4;
      this.destello._x=this.atq4._x
      this.destello._y=this.atq4._y
   }
   if(Key.isDown(53)&&_root.ataque5==true) {
      _root.numataque = 5;
      this.destello._x=this.atq5._x
      this.destello._y=this.atq5._y
   }
   if(Key.isDown(54)&&_root.ataque6==true) {
      _root.numataque = 6;
      this.destello._x=this.atq6._x
      this.destello._y=this.atq6._y
   }
}
//Enemigos//
function enemigo() {
   this.barradevida.gotoAndStop(Math.round((this.vida*100)/this.vidamax));
   if (this.vida <= 0&& this.vida ne "muerto"){
      this.vida = "muerto"
      this.gotoAndPlay("muerto");
      _root.experiencia=_root.experiencia+this.experiencia
   }
   var status:Boolean=orion.cuerpo.hitTest(this)
   var impacto:Boolean=orion.daño.hitTest(this)
   if (this.desplazamiento >= this.desplazamientomax&&this.direccion eq "derecha"&&this.vida > 0){
      this.desplazamiento=0;
      this.direccion="izquierda";
   } else if (this.desplazamiento >= this.desplazamientomax&&this.direccion eq "izquierda"&&this.vida > 0){
      this.desplazamiento=0;
      this.direccion="derecha";
   }
   if (status==false&&this.direccion eq "derecha"&&this.vida > 0&&this.ocupado==false){
      this._x=this._x+1
      this._xscale=100
      this.desplazamiento=this.desplazamiento+1
      this.gotoAndStop("andar");
   } else if (status==false&&this.direccion eq "izquierda"&&this.vida > 0&&this.ocupado==false){
      this._x=this._x-1
      this._xscale=-100
      this.desplazamiento=this.desplazamiento+1
      this.gotoAndStop("andar");
   } else if (status==true&&this.vida > 0&&_root.muerto==false&&this.ocupado==false){
      this.gotoAndPlay("atacar");
   }
   if (impacto==true&&this.vida > 0){
      this.gotoAndPlay("herido")
      if (_root.fuerza > this.defensa){
         this.vida=this.vida-((_root.fuerza+_root.espada)-this.defensa)
         _root.boom._x=this._x
         _root.boom._y=this._y
         _root.boom.daño=(_root.fuerza-this.defensa)+_root.espada
         _root.boom.play();
      } else if (_root.fuerza <= this.defensa){
         _root.boom._x=this._x
         _root.boom._y=this._y
         _root.boom.daño=1
         _root.boom.play();
      }
   }
}
//Morirse//
function die() {
   gotoAndStop("gameover",1);
}
//Monedas//
function moneda() {
   if (this.recogida==false&&orion.cuerpo.hitTest(this)){
      this.gotoAndPlay("tomada");
      _root.monedas=_root.monedas+1
   }
}
//Ejecutar en Orion//
onEnterFrame = manejarPersonaje;
inicializarPersonaje(orion);
orion.onEnterFrame = aplicarMovimiento;
menu.onEnterFrame = menudedatos;
coin1.onEnterFrame = moneda;
coin2.onEnterFrame = moneda;
coin3.onEnterFrame = moneda;
enemigo4.onEnterFrame = enemigo;
enemigo1.onEnterFrame = enemigo;
enemigo2.onEnterFrame = enemigo;
enemigo3.onEnterFrame = enemigo;

Por Anigrama

44 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 18 Mar 2011 03:37 am
Mirando muy por arriba las 360 líneas de código veo gran cantidad de if, muchos while y muchos onEnterFrame, eso a ojo de buen cubero indica deficiencia de diseño. Algunos tips:

- El loop del juego se debe concentrar en un solo onEnterFrame
- Muchas condiciones de if indican que quizás haya que repensar la estructura ... quizás haga falta una máquina de estados
- Los while son peligrosos: pueden colgar rápidamente una máquina si la condición es imposible

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Mar 2011 06:21 pm
:S ps si me temia que esa era la solucion.... reestructurar el sistema... bueno sera aplicarle el tiempo necesario

Por Anigrama

44 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 18 Mar 2011 06:24 pm
Ah una duda...!
Exactamente a que te refieres con MAQUINA DE ESTADOS???

Por Anigrama

44 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 18 Mar 2011 06:31 pm

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.