codigo as2

Hola.

Me encuentro con un problema, he estado mirando en el foro pero no lo he encontrado.

Estoy haciendo un juego sencillo en flash, se trata de que al pinchar en un mc se ejecute, eso lo tengo bien.

El problema es que hay tres tipos de mc verdes, amarillos y rojos, y quisiera que al principio solo se pudiera pinchar en los verdes, cuando no queden verdes, los amarillos y cuando no queden amarillos, por ultimo los rojos.

No se cual son las acciones que debo de darles para que eso funcione así, les he puesto nombre de instancia a los amarillos "amarillos", a los verdes "verdes" y a los rojos "rojos".

También están vinculados para actionscript en la biblioteca con el mismo nombre.

Alguien podría ayudarme.

Gracias.

Un saludo.
Hola:

¿Tienen nombres de instancia? Me refiero al atributo name del MC. Si lo tienen, entonces puedes meterlos en un array diferente:

var verdes = new Array("name1", "name2", "nameN");
var amarillos = new Array("name1"...);
var rojos = new Array(...);

Luego, podrías asignarle una propiedad enabled y dejar en true a todos los verdes y deshabilitarlos según sea necesario en el evento clic:

for(var i = 0; i < verdes.length; i++)
  verdes[i].enabled = true;

for(var i = 0; i < amarillos.length; i++)
  amarillos[i].enabled = false;
Hola

Lo he intentado y no me sale.

Tienen nombre de instancia en el escenario, el problema lo veo en que los Mcs se ejecutan, pero tienen 5 fotogramas, del 1 al 4 tienen la interpolación de movimiento y en el 5 un stop y esta vacio, con lo que el mc aunque este ejecutado
continua en el escenario, paro no se ve al estar vacio el fotograma 5 que es el que tiene un Stop.

He intentado algo asi:

En el fotograma 5 de los Mcs he puesto este código

//Es actionscript 2, es que no sabia como poner el código en as

stop();

onEnterFrame = function() {
("enabled = false");	
}

En la película principal he recogido los Mcs en los tres grupos, en tres arrays y he aplicado un if, pero no me funciona.

//Es actionscript 2, es que no sabia como poner el código en as

var verdes = new Array("v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30");
var amarillos = new Array("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26");
var rojos = new Array("r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16");

if (verdes.enabled = true) 
   (amarillos.enabled = false, rojos.enabled = false);

Gracias de nuevo.
Hmmmm, lo de la primera parte no lo entendí porque nunca he usado fotogramas xD, pero no debería haber problemas con eso.

Sin embargo, en la segunda parte, debes deshabilitarlos uno a uno, array.enabled solo te dirá si el arreglo está habilitado y, mientras no crees la propiedad enabled del array, esta siempre será false (porque no existe).

Lo que debes hacer es:

function cambiarEstado(a: Array, habilitar: Boolean = false): void {
  for(var i = 0; i < a.length; i++) {
    a.enabled = habilitar;
    // Probablemente quieras añadir un evento (onclic, por ejemplo) a cada mc, aunque dependerá de la lógica de tu juego :P
  }
}

Al comenzar el programa, llamas a la función cambiarEstado 3 veces:

cambiarEstado(verdes, true);
cambiarEstado(amarillos, false);
cambiarEstado(rojos, false);

Para saber si al arreglo aún le quedan elementos habilitados, haz lo siguiente:

function quedanHabilitados(a: Array): Boolean {
  for(var i = 0; i < a.length; i++) {
    if(a[i].enabled)
      return true;
  }

  return false;
}

Si tienes un evento onClic para los mc, entonces deberías hacer algo así:

function mcHandler(e:MouseEvent): void {
  var t = e.target;

  t.enabled = false;

  var firstChar = t.name.charAt(0);

  if(firstChar == 'v') { // Pertenece al arreglo de los verdes
    if(!quedanHabilitados(verdes))
      cambiarEstado(amarillos, true);
  }
  else if(firstChar == 'a') { // Pertenece al arreglo de los amarillos
    if(!quedanHabilitados(amarillos))
      cambiarEstado(rojos, true);
  }
  else { // Pertenece a los rojos
    if(!quedanHabilitados(rojos))
      // Supongo que el juego terminó :P
  }
}

Eso es lo que se me ocurre :)
Hola.

Lo primero es que al llegar al fotograma 5 de los MC Tiene un Stop para que se detenga ahí, y un código para que deshabilite ese globo.

Del código que me as dado lo he probado y me da un par de errores:

stop();

var verdes = new Array("v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30");
var amarillos = new Array("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26");
var rojos = new Array("r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16");

function cambiarEstado(a: Array, habilitar: Boolean = false):void{ //ERROR Se espera ')' o ','
  for(var i = 0; i < a.length; i++) {
    a.enabled = habilitar;
    // Probablemente quieras añadir un evento (onclic, por ejemplo) a cada mc, aunque dependerá de la lógica de tu juego :P
  }
} //ERROR Se ha detectado un '}' inesperado

cambiarEstado(verdes, true);
cambiarEstado(amarillos, false);
cambiarEstado(rojos, false);

function deshabilita(quien):void{
   quien.enabled = false;
   for( var i:int = 0; i<verdes.length; i++){
      verdes.splice(verdes.indexOf(quien.name), 1);
      break;
   }
  trace("Ahora quedan "+verdes.length)
}

function quedanHabilitados(a: Array): Boolean {
  for(var i = 0; i < a.length; i++) {
    if(a[i].enabled)
      return true;
  }

  return false;
}

function mcHandler(e:MouseEvent): void {
  var t = e.target;

  t.enabled = false;

  var firstChar = t.name.charAt(0);

  if(firstChar == 'v') { // Pertenece al arreglo de los verdes
    if(!quedanHabilitados(verdes))
      cambiarEstado(amarillos, true);
  }
  else if(firstChar == 'a') { // Pertenece al arreglo de los amarillos
    if(!quedanHabilitados(amarillos))
      cambiarEstado(rojos, true);
  }
  else { // Pertenece a los rojos
    if(!quedanHabilitados(rojos))
      // Supongo que el juego terminó :P
  }
}

En los Mcs en el escenario no tengo evento clik, al clickar sobre ellos parsan al fotograma dos del Mc y comienza la animación.
El evento click esta dentro de los Mcs.

Gracias
Es complicado ayudarte :P... lo que pasa es que no sé en que momento quieres habilitar los amarillos (sé que cuando se acaben los verdes, pero me refiero al evento).

Independiente de eso, los errores de mi código es porque AS2 no soporta parámetros con valores por defecto (y no sé si soporta :void al final de la definición de una función):

stop();

var verdes = new Array("v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30");
var amarillos = new Array("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26");
var rojos = new Array("r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16");

function cambiarEstado(a: Array, habilitar: Boolean) { // Corregido, en teoría :
  for(var i = 0; i < a.length; i++) {
    a[i].enabled = habilitar;
    // Probablemente quieras añadir un evento (onclic, por ejemplo) a cada mc, aunque dependerá de la lógica de tu juego :P
  }
} // ERROR Se ha detectado un '}' inesperado * Al corregir el error anterior, debería haberse corregido este también.

cambiarEstado(verdes, true);
cambiarEstado(amarillos, false);
cambiarEstado(rojos, false);

function deshabilita(quien):void{
   quien.enabled = false;
   for( var i:int = 0; i<verdes.length; i++){
      verdes.splice(verdes.indexOf(quien.name), 1);
      break;
   }
  trace("Ahora quedan "+verdes.length)
}

function quedanHabilitados(a: Array): Boolean {
  for(var i = 0; i < a.length; i++) {
    if(a[i].enabled)
      return true;
  }

  return false;
}

function mcHandler(e:MouseEvent): void {
  var t = e.target;

  t.enabled = false;

  var firstChar = t.name.charAt(0);

  if(firstChar == 'v') { // Pertenece al arreglo de los verdes
    if(!quedanHabilitados(verdes))
      cambiarEstado(amarillos, true);
  }
  else if(firstChar == 'a') { // Pertenece al arreglo de los amarillos
    if(!quedanHabilitados(amarillos))
      cambiarEstado(rojos, true);
  }
  else { // Pertenece a los rojos
    if(!quedanHabilitados(rojos))
      // Supongo que el juego terminó :P
  }
}

Si necesitas más ayuda, tendrás que explicarme con un poco más de detalle el funcionamiento del juego :).

Saludos.
Ok.

Tengo tres Mcs creados con un grafico de un globo, en el primer fotograma esta en Stop, y el grafico tiene una acción

on (press) {
gotoAndPlay(2);
}

del fotograma 2 al 4 hay una interpolación de movimiento y en el fotograma 5 desaparece el grafico, en ese fotograma 5 hay un stop y la acción

onEnterFrame = function() {
("enabled = false");
}

Para que deshabilite ese globo al llegar al fotograma 5.

Los Mcs ya están, hay uno verde, uno amarillo y uno rojo.

Luego en la película principal:

Pongo 30 Mcs verdes, 26 Mcs amarillos y 16 Mcs rojos.

Lo pruebo creando el archivo swf y funciona bien, al clickar sobre cualquier globo se mueve y desaparece.

Ahora lo que quisiera es que se pudieran pinchar solo sobre los verdes, cuando no queden verdes en el escenario solo se pudiese pinchar sobre los amarillos, y cuando no queden amarillos tampoco, pues solo quedarían los rojos.

Por eso lo de deshabilitar los amarillos y los rojos, en lo que haya verdes en el escenario, cuando no haya verdes habilitar los amarillos y después los rojos.

No se si me he explicado bien.

Gracias por la atención.
Ah es as2 no es as3, por eso puede ser el error del ": void"
He corregido algunos errores pero aun me quedan

stop();

var verdes = new Array("v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30");
var amarillos = new Array("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26");
var rojos = new Array("r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16");

function cambiarEstado(a: Array, habilitar: Boolean) { // Corregido, en teoría (OK)
  for(var i = 0; i < a.length; i++) {
    a[i].enabled = habilitar;
    // Probablemente quieras añadir un evento (onclic, por ejemplo) a cada mc, aunque dependerá de la lógica de tu juego :P
  }
} // ERROR Se ha detectado un '}' inesperado * Al corregir el error anterior, debería haberse corregido este también (OK).

cambiarEstado(verdes, true);
cambiarEstado(amarillos, false);
cambiarEstado(rojos, false);

function deshabilita(quien):void{ //Quitado el void (OK)
   quien.enabled = false;
   for( var i:int = 0; i<verdes.length; i++){ //Evento int cambiado por Number (OK)
      verdes.splice(verdes.indexOf(quien.name), 1);
      break;
   }
  trace("Ahora quedan "+verdes.length)
}

function quedanHabilitados(a: Array): Boolean {
  for(var i = 0; i < a.length; i++) {
    if(a[i].enabled)
      return true;
  }

  return false;
}

function mcHandler(e:MouseEvent): void {  //ERROR No se pudo cargar la clase o interfaz 'MouseEvent'. (Este no se)
  var t = e.target;  //ERROR Se espera '{' (Y) El bloque de declaración debe finalizar con '}'

  t.enabled = false;

  var firstChar = t.name.charAt(0);

  if(firstChar == 'v') { // Pertenece al arreglo de los verdes
    if(!quedanHabilitados(verdes))
      cambiarEstado(amarillos, true);
  }
  else if(firstChar == 'a') { // Pertenece al arreglo de los amarillos
    if(!quedanHabilitados(amarillos))
      cambiarEstado(rojos, true);
  }
  else { // Pertenece a los rojos
    if(!quedanHabilitados(rojos))
      // Supongo que el juego terminó :P
  } //ERROR Se ha detectado un '}' inesperado
}  //ERROR de sintasis
  
Si necesitas más 
Hmmm... acabo de descubrir que AS2 no tiene el evento onclic, en su lugar hay que hacer otra cosa:

stop();

var verdes = new Array("v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30");
var amarillos = new Array("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26");
var rojos = new Array("r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16");
var clicListener:Object = new Object();

// Evento que escucha los clic en los mc
clicListener.onRelease = function(e:Object): void {
  var t = e.target;

  t.enabled = false;

  var firstChar = t.name.charAt(0);

  if(firstChar == 'v') { // Pertenece al arreglo de los verdes
    if(!quedanHabilitados(verdes))
      cambiarEstado(amarillos, true);
  }
  else if(firstChar == 'a') { // Pertenece al arreglo de los amarillos
    if(!quedanHabilitados(amarillos))
      cambiarEstado(rojos, true);
  }
  else { // Pertenece a los rojos
    if(!quedanHabilitados(rojos)) // Supongo que el juego terminó :P
      trace("el juego terminó");
  }
}

function cambiarEstado(a: Array, habilitar: Boolean) { // Corregido, en teoría (OK)
  for(var i = 0; i < a.length; i++) {
    a[i].enabled = habilitar;
    a[i].addListener(clicListener); // Añade el evento escuchando a los clic
  }
} // ERROR Se ha detectado un '}' inesperado * Al corregir el error anterior, debería haberse corregido este también (OK).

cambiarEstado(verdes, true);
cambiarEstado(amarillos, false);
cambiarEstado(rojos, false);

function deshabilita(quien):void{ //Quitado el void (OK)
   quien.enabled = false;
   for( var i:int = 0; i<verdes.length; i++){ //Evento int cambiado por Number (OK)
      verdes.splice(verdes.indexOf(quien.name), 1);
      break;
   }
  trace("Ahora quedan "+verdes.length)
}

function quedanHabilitados(a: Array): Boolean {
  for(var i = 0; i < a.length; i++) {
    if(a[i].enabled)
      return true;
  }

  return false;
}

Espero que ahora funcione :).

¿Por cierto, por qué usas AS2 en lugar de AS3?
Hola.

Lo ultimo lo primero.

Empecé a programar algo con HTML, después pase a java y php, y un dia me dio por probar en flash y lo hice en as2, no se por que, pero lo hice y ahora que no es mucha la idea que tengo con as2, me pierdo en as3. no hay otra razón.

El código ya no da errores, creo que lo entiendo bien, parece correcto, pero sigue sin deshabilitar, te comento, los globos son Mc, y están en el escenario, he visto por hay, no me digas donde por que me estoy volviendo loco buscando, pero lo e leído, que los Mc no se pueden deshabilitar que tienen que estar como botones, no se si es cierto, te lo comento por si fuese ese el fallo.

Ah por cierto he tenido que quitar el " : void", as2 no lo admite.

Gracias.
Puede que no se puedan deshabilitar como tal, pero puedes hacer esto:

clicListener.onRelease = function(e:Object): void {
  var t = e.target;

  if(t.enabled) {
    t.enabled = false;

    var firstChar = t.name.charAt(0);

    if(firstChar == 'v') { // Pertenece al arreglo de los verdes
      if(!quedanHabilitados(verdes))
        cambiarEstado(amarillos, true);
    }
    else if(firstChar == 'a') { // Pertenece al arreglo de los amarillos
      if(!quedanHabilitados(amarillos))
        cambiarEstado(rojos, true);
    }
    else { // Pertenece a los rojos
      if(!quedanHabilitados(rojos)) // Supongo que el juego terminó :P
        trace("el juego terminó");
    }
  }
}

De esta forma, solo se ejecutará el clic si el elemento está habilitado. Puede que tengas problemas porque AS2 tiene más de un evento para el clic: onMouseDown, onMouseUp, onMouseMove, onRelease; esto puede causar errores en la lógica y tendrás que descubrir dónde quieres que se ejecute el código para deshabilitar el mc.
No soy capaz.

He visto otra solución mucho mas vulgar, pero de momento la voy hacer y luego intentare hacerlo con as3, que por lo que he visto los códigos al principio están en as3, mas o menos.

as3 lo que tiene es que hay que dar nombre de instancia a los botones, Mcs, complementos, etc..., y luego las acciones se le da en la capa acciones, ¿algo así no?

La solución que he visto de momento es trabajar con escenas distintas, en la primera dejo los verdes como Mcs y con sus acciones, y los amarillos y rojos los trato como botones sin acción, al acabar los verdes he puesto un Checkbox y un botón que se habilita con el select, ahí paso a la siguiente escena donde ya los verdes no están y los amarillos los dejo como Mcs y los rojos igual que antes, botones sin acción, e igual con los rojos.

Gracias de todas formas y perdona por tanta guerra.

De todas formas te diré como voy con as3, a ver si soy capaz.

Un saludo.
He visto otra solución mucho mas vulgar, pero de momento la voy hacer y luego intentare hacerlo con as3, que por lo que he visto los códigos al principio están en as3, mas o menos.

Lo importante es que funcione, no importa cómo (a no ser de que cause problemas de rendimiento). Yo no he usado AS3, es casi lo mismo, solo que hay cosas que se hacen distintas :P (por ejemplo, AS2 no tiene la clase MouseEvent, que es la utilizada en AS3 para capturar los eventos del mouse, aunque no todos ellos).

as3 lo que tiene es que hay que dar nombre de instancia a los botones, Mcs, complementos, etc..., y luego las acciones se le da en la capa acciones, ¿algo así no?

No... AS3 tiene mejoras en cuanto al lenguaje (orientado a objetos) y el rendimiento, pero las instancias siempre son necesarias cuando necesitas hacer referencia a algún elemento en escena.

La solución que he visto de momento es trabajar con escenas distintas, en la primera dejo los verdes como Mcs y con sus acciones, y los amarillos y rojos los trato como botones sin acción, al acabar los verdes he puesto un Checkbox y un botón que se habilita con el select, ahí paso a la siguiente escena donde ya los verdes no están y los amarillos los dejo como Mcs y los rojos igual que antes, botones sin acción, e igual con los rojos.

Gracias de todas formas y perdona por tanta guerra.

De todas formas te diré como voy con as3, a ver si soy capaz.

No hay problema. Como te dije al comienzo, lo importante es que funcione, después ya verás si lo puedes mejorar (por eso es que los programas tienen versiones - Windows XP, Vista, 7, 8 y, próximamente, 9 (sin contar las versiones anteriores ni las de servidor)).

Saludos y continúa con tu aprendizaje :).
Hola Jeyn
AL final se te solucionó? porque yo me encuentro en un caso parecido. PM
¿Cómo solucionasteis el problema? Se me plantea un problema similar y estaría bien conocer la solución, me estoy volviendo loco.