Comunidad de diseño web y desarrollo en internet online

Juego en AS3 problemas

Citar            
MensajeEscrito el 26 Jul 2011 11:33 pm
Hola que tal, les cuento que tenemos un problema con un juego que estamos realizando, somos principiantes en as3 y no podemos lograr que el startdrag y el stopdrag funcionen.

El juego trata de arrastrar unas fichas a 3 lugares distintos , las fichas se tiran random con tres array distintos que contienen 3 fichas cada uno, el problema es que al realizar la funcion de arrastrar y la de parar nos tira el siguiente error

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at juego2_fla::MainTimeline/arrastrar()
TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at juego2_fla::MainTimeline/soltar()

El codigo que utilizamos es el siguiente para uno de los array, se repite pero cambia el nombre:

Código ActionScript :

var sesenta: Array;
sesenta=new Array("cir1", "cir2", "cir3");
var i:int;
var puntaje=Number;
puntaje=0;


for (i=1;i<=1;i++)
{
sesenta[i]= new cir1();
sesenta[i].x=Math.random()*(stage.stageWidth-sesenta[i].width);
sesenta[i].y=Math.random()*(stage.stageHeight-sesenta[i].height);
addChild(sesenta[i]);
sesenta[i].gotoAndStop(i);
sesenta[i].addEventListener(MouseEvent.MOUSE_DOWN,arrastrar);
sesenta[i].addEventListener(MouseEvent.MOUSE_UP,soltar);

sesenta[i]= new cir2();
sesenta[i].x=Math.random()*(stage.stageWidth-sesenta[i].width);
sesenta[i].y=Math.random()*(stage.stageHeight-sesenta[i].height);
addChild(sesenta[i]);
sesenta[i].gotoAndStop(i);
sesenta[i].addEventListener(MouseEvent.MOUSE_DOWN,arrastrar);
sesenta[i].addEventListener(MouseEvent.MOUSE_UP,soltar);


sesenta[i]= new cir3();
sesenta[i].x=Math.random()*(stage.stageWidth-sesenta[i].width);
sesenta[i].y=Math.random()*(stage.stageHeight-sesenta[i].height);
addChild(sesenta[i]);
sesenta[i].gotoAndStop(i);
sesenta[i].addEventListener(MouseEvent.MOUSE_DOWN,arrastrar);
sesenta[i].addEventListener(MouseEvent.MOUSE_UP,soltar);

sesenta[i].buttonMode=true;

}


Y la funcion arrastrar es la siguiente

Código ActionScript :

function arrastrar(Event:MouseEvent):void{
var fichaSelec:cir1;
fichaSelec=Event.currentTarget as cir1;
fichaSelec.startDrag();

var fichaSelecdos:cir2;
fichaSelecdos=Event.currentTarget as cir2;
fichaSelecdos.startDrag();

var fichaSelectres:cir3;
fichaSelectres=Event.currentTarget as cir3;
fichaSelectres.startDrag();

var fichaSeleccuatro:cir4;
fichaSeleccuatro=Event.currentTarget as cir4;
fichaSeleccuatro.startDrag();

var fichaSeleccinco:cir5;
fichaSeleccinco=Event.currentTarget as cir5;
fichaSeleccinco.startDrag();

var fichaSelecseis:cir6;
fichaSelecseis=Event.currentTarget as cir6;
fichaSelecseis.startDrag();

var fichaSelecsiete:cir7;
fichaSelecsiete=Event.currentTarget as cir7;
fichaSelecsiete.startDrag();

var fichaSelecocho:cir8;
fichaSelecocho=Event.currentTarget as cir8;
fichaSelecocho.startDrag();

var fichaSelecnueve:cir9;
fichaSelecnueve=Event.currentTarget as cir9;
fichaSelecnueve.stopDrag()

}


y la funcion para soltar es la siguiente

Código ActionScript :

function soltar(Event:MouseEvent):void{
var fichaSelec:cir1;
fichaSelec=Event.currentTarget as cir1;
fichaSelec.stopDrag()

var fichaSelecdos:cir2;
fichaSelecdos=Event.currentTarget as cir2;
fichaSelecdos.stopDrag()


var fichaSelectres:cir3;
fichaSelectres=Event.currentTarget as cir3;
fichaSelectres.stopDrag()


var fichaSeleccuatro:cir4;
fichaSeleccuatro=Event.currentTarget as cir4;
fichaSeleccuatro.stopDrag()

var fichaSeleccinco:cir5;
fichaSeleccinco=Event.currentTarget as cir5;
fichaSeleccinco.stopDrag()


var fichaSelecseis:cir6;
fichaSelecseis=Event.currentTarget as cir6;
fichaSelecseis.stopDrag()

var fichaSelecsiete:cir7;
fichaSelecsiete=Event.currentTarget as cir7;
fichaSelecsiete.stopDrag()

var fichaSelecocho:cir8;
fichaSelecocho=Event.currentTarget as cir8;
fichaSelecocho.stopDrag()

var fichaSelecnueve:cir9;
fichaSelecnueve=Event.currentTarget as cir9;
fichaSelecnueve.stopDrag()
}


Realmente no sabemos que hacer, si alguno tiene idea seria de gran ayuda ya que tenemos que entregar este trabajo en el termino de 1 semana. Saludos

Por Kombul

35 de clabLevel



 

chrome
Citar            
MensajeEscrito el 27 Jul 2011 06:47 am
Hola,
teneis alguna cosilla mal (sobre todo revisa ese bucle for). Podría hacerse así:

Código ActionScript :

var sesenta:Array = [];
var puntaje=Number;
puntaje=0;

for (var i:uint = 0; i < 3; i++)
{
   var className:String = "cir" + (i + 1).toString();
   var ClassRef:Class = getDefinitionByName(className) as Class;
   sesenta.push(new ClassRef());
   sesenta[i].x=Math.random()*(stage.stageWidth-sesenta[i].width);
   sesenta[i].y=Math.random()*(stage.stageHeight-sesenta[i].height);
   addChild(sesenta[i]);
   sesenta[i].gotoAndStop(i);
   sesenta[i].addEventListener(MouseEvent.MOUSE_DOWN,arrastrar);
   sesenta[i].addEventListener(MouseEvent.MOUSE_UP,soltar);
   sesenta[i].buttonMode=true;
}


function arrastrar(event:MouseEvent):void
{
   var fichaSelec:MovieClip=event.currentTarget as MovieClip;
   fichaSelec.startDrag();
}


function soltar(event:MouseEvent):void
{
   var fichaSelec:MovieClip=event.currentTarget as MovieClip;
   fichaSelec.stopDrag();
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 27 Jul 2011 09:26 pm
solo es necesario hacer una funcion de arrastrar y soltar? porque tenemos en total 9 fichas que deben ser arrastradas hasta el objetivo . Con respecto a las clases en el codigo que nos pasaste

var className:String = "cir" + (i + 1).toString();
var ClassRef:Class = getDefinitionByName(className) as Class;
sesenta.push(new ClassRef());

no entendemos bien el uso de esas sentencias y si lo que debemos poner ahi es el nombre de nuestras clases...debemos hacer 1 funcion para cada objeto o 1 en general?

Por Kombul

35 de clabLevel



 

chrome
Citar            
MensajeEscrito el 27 Jul 2011 10:07 pm
Hola,
si el comportamiento de las 9 fichas es el mismo al arrastrar y soltar, se pueden usar las mismas funciones de callback para las 9 instancias de las 9 clases diferentes, ya que con event.target, ó con event.currentTarget puedes hacer referencia a la instancia sobre la que estás actuando en ese momento.

En cuanto a las líneas que comentas, las 2 primeras lo único que hacen es aprovechar que las 9 clases se llaman cir1, cir2, cir3, ... para crear las 9 instancias con un bucle for, evitando duplicar código: con la variable className voy obteniendo los nombres de las clases (cir1, cir2, ...), y la línea getDefinitionByName es como ir creando las instancias (new cir1, new cir2, ...)

La línea sesenta.push, la uso porque en principio he creado el array sesenta vacío, así que hay que ir metiendo en él cada instancia creada en el bucle for.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Jul 2011 08:44 pm
Maestro todo perfecto, anduvo con el código que nos pasaste y te agradezco.
Ahora el problema que tenemos es que para las otros arrays(setenta,ochenta) no nos sale el código, cambiamos el código pero nos tira error...

Nosotros pusimos este código para otro array:

var setenta:Array = [];

for (var b:uint = 3; b < 6; i++)
{
var nombreclase2:String = "cir" + (b + 1).toString();
var referencia2:Class = getDefinitionByName(nombreclase2) as Class;
setenta.push(new referencia2());
setenta[b].x=Math.random()*(stage.stageWidth-setenta[b].width);
setenta[b].y=Math.random()*(stage.stageHeight-setenta[b].height);
addChild(setenta[b]);
setenta[b].gotoAndStop(b);
setenta[b].addEventListener(MouseEvent.MOUSE_DOWN,arrastrar);
setenta[b].addEventListener(MouseEvent.MOUSE_UP,soltar);
setenta[b].buttonMode=true;
}


Que tendriamos que hacer?
Saludos y gracias.

Por Kombul

35 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Jul 2011 09:13 pm
¿Qué error te tira? Si has puesto lo mismo debería funcionar. Así a bote pronto se me ocurre que quizá quieras hacer el gotoAndStop a los fotogramas 1, 2 y 3, y tal y como está está llamando a 6, 7 y 8.
Una pregunta: ¿todas los cir1, cir2, ... tienen el mismo comportamiento, y sólo se diferencian en el MovieClip? Si es así podrías usar 1 única clase para todos.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Jul 2011 10:43 pm
Hola como andas el juego es de tematica retro muy simple tenes 9 ficha que se embocan en 3 epocas 60 70 80 son 3 fichas por epoca estamos haciendo 3 array distintos uno para cada epoca,

como cada ficha es distinta ya que tiene un dibujo distinto adentro no podemos tirar random, tiene que tirar 1 ficha de cada una de las 9 que hay en total si hacemos la misma clase para todos no podriamos diferenciar de que epoca son cada uno,

al menos creemos que es asi, cuando hacemos los 3 array distintos para las fichas nos tira error 1010. Estamos un poco perdidos ya jeje.Gracias por contestar!!

Por Kombul

35 de clabLevel



 

chrome
Citar            
MensajeEscrito el 29 Jul 2011 11:57 am
Si el comportamiento de los 9 tipos de ficha es el mismo, se podría hacer con 1 sola clase, que tuviese una propiedad que devolviese un valor para cada época diferente, y que el objeto que represente la época compruebe si esa variable corresponde a la época correcta, pero eso es otra historia.
En cuanto al error, indica que estas intentando hacer una referencia a un objeto que no existe, o que este todavía no se ha creado, pero sin más datos no puedo decirte más.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox

 

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