Comunidad de diseño web y desarrollo en internet online

Ayuda con hitTest

Citar            
MensajeEscrito el 01 Sep 2007 09:36 pm
Queria hacer un pequeño juego en el que tengo 6 circulos de diferentes colores y un escenario (rectangulo). La idea era poder arrastrar los circulos dentro del escenario y que una vez soltados dentro de el reconociera que circulos de color han sido soltados dentro o fuera.
Cada circulo lleva este codigo:

Código :

onClipEvent (enterFrame) {
   this.onPress = function() {
      this.startDrag();
   };
   this.onRelease = function() {
      this.stopDrag();
      if (this.hitTest(escenario)) {
         trace("rosa ha tocado");
      }
   };
}

Pero por alguna razon no reconoce que ha tocado ¿es por estar en un onClipEvent?¿alguien puede echarme una mano? Gracias de antemano

Por celentano

Claber

123 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 02 Sep 2007 12:02 am
cambia

Código :

if (this.hitTest(escenario)) 


por esto

Código :

if (this.hitTest(this._parent.escenario)) 

Por darkloco

22 de clabLevel



Genero:Masculino  

Uruguay

msie7
Citar            
MensajeEscrito el 02 Sep 2007 12:26 am
¿Ese código lo tienes en la línea de tiempo de los círculos o seleccionaste cada círculo y le escribiste el código? En cualquier caso, el onEnterFrame es innecesario para lo que necesitas, así que puees sacar el código de allí.

Por The Fricky!

Presidente

6168 de clabLevel

3 tutoriales
8 articulos

Genero:Masculino   Bastard Operators From Hell Héroes

Piccola Venezia...

firefox
Citar            
MensajeEscrito el 02 Sep 2007 10:26 am
Le quito onEnterFrame pero me dice que le espera un identificador. ¿Podrias ser mas explicito en como es la manera correcta de escribirlo? Gracias

Por celentano

Claber

123 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 02 Sep 2007 02:26 pm
Esto va en un fotograma (tenés que tener instanciado un MC con nombre "btn"):

Código :

btn.onPress = function () {
   this.startDrag ();
};
btn.onRelease = function () {
   this.stopDrag ();
   if (this.hitTest (this._parent.escenario)) {
      trace ("rosa ha tocado");
   }
};

Por HernanRivas

Claber

3416 de clabLevel

26 tutoriales

 

Argentina

firefox
Citar            
MensajeEscrito el 02 Sep 2007 02:28 pm
A ver, el modo de escribir el código dependerá de dónde lo estás escribiendo. Me explico:
Si estás escribiéndo el código directamente en la instanacia (o sea, seleccionaste el círculo y abriste el panel Acciones para poner código) debería ser algo parecido a:

Código :

on(press){
    this.startDrag();
}

on(release){
    if(this.hitTest(escenario){
       trace("rosa ha tocado");
   }
}


Si, por el contrario, el código lo pusiste en la línea de tiempo y no en el botón:

Código :

nombreBoton.onPress = function():Void{
    this.startDrag();
}

nombreBoton.onRelease = function():Void{
    if(this.hitTest(escenario){
       trace("rosa ha tocado");
   }
}

//Donde "nombreBoton" es el nombre de instancia de tu botón.


Prueba a ver

Por The Fricky!

Presidente

6168 de clabLevel

3 tutoriales
8 articulos

Genero:Masculino   Bastard Operators From Hell Héroes

Piccola Venezia...

firefox
Citar            
MensajeEscrito el 02 Sep 2007 03:33 pm
Lo tengo puesto dentro de cada clip de pelicula que contiene el circulo. Si lo pongo como tu me dices me dice que debe estar dentro dentro de un controlador onClipEvent. No entiendo muy bien como a ti te funciona sin onClipEvent...

Por celentano

Claber

123 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 02 Sep 2007 04:17 pm
Ok Celentano, vamos a repasar el tema a ver si lo solucionamos.
1.- Asumo que cada círculo (y también el escenario) son un Clip de Película y no un botón (si alguno es un botón no funcionará jamás).
2. Asumo que tienes todo esto (los círculos y el "escenario") en el mismo nivel (yo los he puesto todos en el Stage).

Bien, ahora lo que vamos a hacer es colocarle a cada uno un nombre de instancia y vamos a quitarles el código. Todo el código lo vamos a escribir en la línea de tiempo (de hecho, es lo que recomienda Macromedia Adobe para escribir código.

Voy a colocarte el código que hice para uno de los círculos, al que llamé "negro":

Código :

negro.onPress = function(){
   startDrag(negro);
}

negro.onRelease = function(){
   stopDrag();
   if(this.hitTest(escenario)){
      trace("negro ha tocado");
   }
}


Lo de que el programa te pida que lo coloques en un controlador de evento "onClipEvent" lo entiendo si colocaste la segunda opción que te dí en el otro post, si colocaste la primera debes revisar de nuevo el código porque el error está en otra parte, puesto que el controlador de eventos "on" funciona tanto para instancias de botón como de clip de película.

De todas maneras elimina todo el código anterior y prueba con esto colocando uno por cada botón. Si esto funciona, pasamos a la parte de optimizar el código.

Por The Fricky!

Presidente

6168 de clabLevel

3 tutoriales
8 articulos

Genero:Masculino   Bastard Operators From Hell Héroes

Piccola Venezia...

firefox
Citar            
MensajeEscrito el 02 Sep 2007 07:52 pm
Si que funciona, solo que lo iba poniendo sobre cada clip, no sobre la linea principal de tiempo. Mejor así, se ve todo el codigo sin buscar por todas partes. El único problema es que se hace muy largo pero bueno, como me dices que hay una manera de optimizar el codigo, pues soy todo oidos...
Gracias otra vez.

Por celentano

Claber

123 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 02 Sep 2007 08:32 pm
Ok, ya que resolvimos el tema del código, vamos a optimizarlo:
Como ves, estás usando siempre el mismo código, simplemente cambiando el clip de película que quieres verificar. Entonces, para evitar duplicarlo innecesariamente, podemos sustituirlo por una función que haga lo que quieres, pasándole como parámetro la película que quieres procesar en cada caso. Voy a darte un ejemplo, pero luego te recomiendo que busques en la ayuda de Flash el término "funciones" para que aprendas más sobre ellas.

Código :

//Haremos una función que haga el proceso del hitTest:
function tocaEscenario(mipelicula:MovieClip):Void{
      mipelicula.stopDrag(); 
      if(mipelicula.hitTest(escenario){
             trace(mipelicula._name + " ha tocado el escenario);
       }
}

//Y para los botones sólo tendríamos que hacer algo como esto:
negro.onRelease = rosa.onRelease = otroboton.onRelease = function(){tocaEscenario(this)};


Cuando sueltas el botón, este llama a la function "tocaEscenario", diciéndole cuál es el movieclip que acabas de soltar (esto se llama pasar parámetros) y la función se encarga de lo demás. Esto reduce el código, evita que tengas que repetirlo innecesariamente y si necesitas cambiar algo, lo haces en la función y todo se actualiza automáticamente.

Espero que te sirva

Por The Fricky!

Presidente

6168 de clabLevel

3 tutoriales
8 articulos

Genero:Masculino   Bastard Operators From Hell Héroes

Piccola Venezia...

firefox
Citar            
MensajeEscrito el 03 Sep 2007 03:45 pm
Chapó!

Por celentano

Claber

123 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 03 Sep 2007 06:46 pm

celentano escribió:

Chapó!

:?
Espero que signifique que pudiste resolverlo... :lol:

Por The Fricky!

Presidente

6168 de clabLevel

3 tutoriales
8 articulos

Genero:Masculino   Bastard Operators From Hell Héroes

Piccola Venezia...

firefox

 

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