Comunidad de diseño web y desarrollo en internet online

duda con hitTestObject

Citar            
MensajeEscrito el 23 Jun 2008 10:19 pm
Hola, soy nuevo con actionscript 3 (aunque no con actionscript ni con flash) y tengo un pequeño problema: estoy tratando de detectar colisiones entre dos MovieClips de un juego que estoy haciendo. Un MovieClip es el protagonista, lo he llamado "heroe" y el otro es un bloque por el cual no se puede pasar "bloque"

Tengo hecha un funcion "mover()" que gestiona el movimiento del heroe y necesito que detecte los MovieClips "bloque" para que no pueda andar por ellos.
He puesto este codigo al principio de la funcion:

Código :

if (juego.heroe.hitTestObject(bloque)){
      trace("HITTTTTT");
}


"juego" es el MovieClip el cual contiene a "heroe" y a varios MC "bloque" (los dos tienen marcado "Exportar para AS")
El problema es que no me detecta cuando el heroe pasa por encima de un bloque.

¿Alguna idea?

GRACIAS!

Por rau1sfx

26 de clabLevel



 

aqui

firefox
Citar            
MensajeEscrito el 24 Jun 2008 09:21 am
Este es un ejemplo muy sencillo pero funciona:

Código :

//---Crear el héroe
var heroe:Sprite = new Sprite();
heroe.mouseEnabled = false;

with(heroe.graphics){
   
   beginFill(0xFF0000, 1);
   drawRect(0, 0, 50, 50);
   
}

//---Crear el bloque
var bloque:Sprite = new Sprite();
bloque.mouseEnabled = false;

with(bloque.graphics){
   
   beginFill(0x00FF00, 1);
   drawRect(0, 0, 50, 400);
   
}

bloque.x = 400;

//---Acciones del heroe
stage.addEventListener(KeyboardEvent.KEY_DOWN, moveHeroe);

function moveHeroe(evt:KeyboardEvent):void{
   //trace(evt.keyCode);
   switch(evt.keyCode){
      
      case 37:
      
      heroe.x -= 5;
      
      break;
      
      case 38:
      
      heroe.y -= 5;
      
      break;
      
      case 39:
      
      heroe.x += 5;
      
      break;
      
      case 40:
      
      heroe.y += 5;
      
      break;
      
   }
   
}

heroe.addEventListener(Event.ENTER_FRAME, checkColumn);

function checkColumn(evt:Event):void{
   
   if(heroe.hitTestObject(bloque)){
      
      trace("HITTTTTT");
      
   }
   
}

//---Añadir a la escena
addChild(bloque).name = "bloque";
addChild(heroe).name = "heroe";


Lo más probable es que veo que tienes una condición chequeando si hay una colisión entre el héroe y un objeto asignado a una variable de nombre bloque, pero dices que tienes varios bloques dentro del movie juego, te recomiendo que dentro de juego crees un movie llamado pared y dentro de este vayas creando dinamicamente bloques depende de la forma que quieras darle a las paredes, por ejemplo:

Código :

//---Crear el héroe
var heroe:Sprite = new Sprite();
heroe.mouseEnabled = false;

with(heroe.graphics){
   
   beginFill(0xFF0000, 1);
   drawRect(0, 0, 50, 50);
   
}

//---Crear la pared
var pared:Sprite = new Sprite();
pared.mouseEnabled = false;
var block:Sprite
var i:uint;

for(i = 0; i < 10; i++){
   
   block = new bloque;
   block.x = Math.round(Math.random()*stage.stageWidth);
   block.y = Math.round(Math.random()*stage.stageHeight);
   
   pared.addChild(block).name = "block"+i;
   
}

//---Acciones del heroe
stage.addEventListener(KeyboardEvent.KEY_DOWN, moveHeroe);

function moveHeroe(evt:KeyboardEvent):void{
   //trace(evt.keyCode);
   switch(evt.keyCode){
      
      case 37:
      
      heroe.x -= 5;
      
      break;
      
      case 38:
      
      heroe.y -= 5;
      
      break;
      
      case 39:
      
      heroe.x += 5;
      
      break;
      
      case 40:
      
      heroe.y += 5;
      
      break;
      
   }
   
}

heroe.addEventListener(Event.ENTER_FRAME, checkColumn);

function checkColumn(evt:Event):void{
   
   if(pared.hitTestPoint(heroe.x, heroe.y, true) || pared.hitTestPoint(heroe.x+heroe.width, heroe.y, true) || pared.hitTestPoint(heroe.x+heroe.width, heroe.y+heroe.height, true) || pared.hitTestPoint(heroe.x, heroe.y+heroe.height, true)){
      
      trace("colisión");
      heroe.removeEventListener(Event.ENTER_FRAME, checkColumn);
      
   }
   
}

//---Añadir a la escena
addChild(pared).name = "bloque";
addChild(heroe).name = "heroe";


En el ejemplo los bloques de la pared se crean aleatorios, y se chequea un hitTestPoint con las cuatro esquinas del heroe. Po supuesto hay un MovieClip en la bilbioteca exportado para action script con nombre de clase bloque y perteneciente a la clase flash.display.Sprite, de lo contrario el siguiente código no funcionaría:

Código :

block = new bloque;


Ojalá te haya servido de algo

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 24 Jun 2008 09:57 am
Luego ten en cuenta que para cosas simplitas puedes basarte en hitTest, pero en la medida que realmente quieras hacer un juego que funcione mas allá del experimento, deberías usar una técnica de Tile (busca los tutos en gotoAndPlay.it )

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 24 Jun 2008 11:17 am
solisarg tiene razón, mientras estés haciando ejemplos con cuadrados y figuras geométricas el hitTest te funcinará de lo más bien, ahora cuando haces un personaje y le pones movimientos y la escena no van a ser cubos sino árboles, enemigos, obstáculos sería bueno profundizar en los Tiles ya que te permite chequear en todo momento (simpre que diseñes tu juego basado en cuadrículas, que a mi opinión es como mejor se debe hacer) si entre dos puntos hay algún obstáculo.

Si lo deseas tengo buenos tutoriales de utilizar Tiles lo que están en inglés pero podrías empezar por ahi.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox

 

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