Comunidad de diseño web y desarrollo en internet online

Juego con colisiones

Citar            
MensajeEscrito el 08 Jul 2014 10:13 pm
Saludos a todos denuevo

esta ves me encuentro desarrollando otro juego . la logica es de lanzar una bola y alcanzar objetos chocando con las paredes en el transcurso

he estado avanzando con el Collision Detection Kit para as3, pero no entiendo como debo manejar los datos que obtengo para cambiar la direccion de la bola que lanzo

he logrado hacer que funcione al chocar en x con los objetos pero no en y, talvez alguien pueda darme una mano para poder entender como lograr hacer que la bola siga su trayectoria al chocar con las paredes (solo se lanzara una bola cada vez) lo que no me funciona esta en la funcion checkForCollision()

aca el as que he trabajado

Código ActionScript :

import flash.events.MouseEvent;
import com.coreyoneil.collision.CollisionGroup;

Mouse.hide();
var _objetivo:objetivo= new objetivo();
stage.addEventListener(MouseEvent.MOUSE_MOVE, objetivoMove);
function objetivoMove(ev:MouseEvent)
{
   _objetivo.x = ev.stageX;
   _objetivo.y = ev.stageY;
}

addChild(_objetivo);

var sapito:sapito_base= new sapito_base();
addChild(sapito);
trace(stage.width);
sapito.x = 350;
sapito.y = 400;

Mouse.hide();
//la gravedad hace que caiga la bola;
gravedad = 0.1;

//poder de dispar que influye en la velocidad de la bola
var poder_disparo:Number = 16;

//creamos un grupo de colision
var collisionGroup:CollisionGroup = new CollisionGroup(puntoA,puntoB);
const GRAVITY      :Number = 1.5;
const FRICTION      :Number = .95;

sapito.addEventListener(Event.ENTER_FRAME, tanque);
function tanque(e:Event):void
{
   //trace("tanque")
   var mousex:Number = mouseX - sapito.x;
   var mousey:Number = (mouseY - sapito.y) * -1;
   angulo = Math.atan(mousey/mousex)/(Math.PI/180);
   if (mousex<0)
   {
      angulo +=  180;
   }
   if (mousex>=0 && mousey<0)
   {
      angulo +=  360;
   }
   if (angulo>160)
   {
      angulo = 160;
   }
   if (angulo<20)
   {
      angulo = 20;
   }

   if (poder_disparo>200)
   {
      poder_disparo = 200;
   }
   sapito.cannon.rotation = angulo * -1;
}


stage.addEventListener(MouseEvent.MOUSE_DOWN, disparar);
function disparar(e:MouseEvent)
{
   sapo_grafica.gotoAndPlay(2);
   //trace("dispara");
   angulo = sapito.cannon.rotation - 1;
   incio_disparo_x = sapito.x+48*Math.cos(angulo*Math.PI/180);
   incio_disparo_y = sapito.y+48*Math.sin(angulo*Math.PI/180);
   //bola_disparada = attachMovie("cannonball", "cannonball_"+root.getNextHighestDepth(), root.getNextHighestDepth(), {x:incio_disparo_x, y:incio_disparo_y});
   var bola_disparada:bola= new bola();
   addChild(bola_disparada);
   collisionGroup.addItem(bola_disparada);
   bola_disparada.x = sapito.x;
   bola_disparada.y = sapito.y;
   bola_disparada.dirx = Math.cos(angulo*Math.PI/180)*poder_disparo;
   bola_disparada.diry = Math.sin(angulo*Math.PI/180)*poder_disparo;
   bola_disparada.addEventListener(Event.ENTER_FRAME, fuego);
   bola_disparada.addEventListener(Event.ENTER_FRAME, checkForCollision);
   limite_escenario;
   //bola_disparada.onEnterFrame = function() {;
   function fuego(e:Event):void
   {
      bola_disparada.diry +=  gravedad;
      limite_escenario();
      //bola_disparada.x +=  bola_disparada.dirx / 30;
      //bola_disparada.y +=  bola_disparada.diry / 30;
      //trace("fuego")
      if ((bola_disparada.x<0) || (bola_disparada.x>500) || (bola_disparada.y>350))
      {
         //trace("desaparecemos la bola")
         //removeChild(bola_disparada);
      }

      //if(bola_disparada.hitTestObject(player) || bola_disparada.hitTestObject(enemy))
      //     {
      // var dir:Number
      //         bola_disparada.speed *= -1;
      //         bola_disparada.dir = (Math.random() * 1) + (Math.random() * -1);
      // trace("toco")
      //     }
   }
   //detectar limite escenario
   function limite_escenario():void
   {
      if (bola_disparada.x <= 0)
      {
         bola_disparada.dirx *=  -1;
      }
      else if (bola_disparada.x >= stage.stageWidth - bola_disparada.width)
      {
         bola_disparada.dirx *=  -1;
      }
      if (bola_disparada.y <= 0)
      {
         bola_disparada.diry *=  -1;
      }
      else if (bola_disparada.y >= stage.stageHeight - bola_disparada.height)
      {
         bola_disparada.diry *=  -1;
      }
      bola_disparada.x +=  bola_disparada.dirx;
      bola_disparada.y +=  bola_disparada.diry;
   }
   function checkForCollision(e:Event):void
   {
      var collisions:Array = collisionGroup.checkCollisions();
      for (var i:uint = 0; i < collisions.length; i++)
      {
         var firstShape:Sprite = collisions[i].object1;
         var secondShape:Sprite = collisions[i].object2;
      // Se graba la colision en un array para sacar los datos
            var collision:Object = collisions[i];
            var angle:Number = collision.angle;
            var overlap:int = collision.overlapping.length;
            var sin:Number = Math.sin(angle);
            var cos:Number = Math.cos(angle);
            trace("angulo devuelto: "+angle)
            bola_disparada.dirx *=  -1;
            bola_disparada.diry *= -1;
         
    messageBox.text= (firstShape.name + " colliding with " + secondShape.name + "\n");
         
      }

   }

}

y aca les dejo el swf

[flash width=700 height=500]http://www.mediummultimedia.com/cristalab/colision/Juego_Sapito_colision.swf[/flash]

Gracias, cualquier ayuda es muy agradecida

como siempre colgare el resultado de mi trabajo para compartirlo

Por voraz2

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jul 2014 12:20 pm
Para saber que pasa en particular con tu código habría que conocer de la librería que usas, aunque a simple vista (me mareo con mas de 10 líneas) veo que tienes metida dentro de la función disparar otras 3 funciones, lo que obviamente no ayuda. Además cada ve que disparas creas listeners que nunca borras, lo cual no ayuda a la performance.
Desanida las funciones e intenta centralizar todo en un solo onEnterFrame, y no esar usándolo muchas veces para distintas cosas

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Jul 2014 04:34 pm
Muchas gracias por responder

Ya lo he optimizado el codigolo mejor que he podido (acepto sugerencias), lo de quitar el enter frame seria una vez que la bola haya destruido los objetivos en el juego, pero en este momento quiero llegar hacer que la bola siga su curso de rebotes

La Libreria que uso es CollisionDetectionKit_v15

aca el AS trabajado en un solo EnterFrame

Código ActionScript :

import flash.events.MouseEvent;
import com.coreyoneil.collision.CollisionGroup;

Mouse.hide();
var _objetivo:objetivo= new objetivo();
stage.addEventListener(MouseEvent.MOUSE_MOVE, objetivoMove);
function objetivoMove(ev:MouseEvent)
{
   _objetivo.x = ev.stageX;
   _objetivo.y = ev.stageY;
}

addChild(_objetivo);

var sapito:sapito_base= new sapito_base();
addChild(sapito);
sapito.x = 350;
sapito.y = 400;

//la gravedad hace que caiga la bola;
gravedad = 0.1;

//poder de dispaor que influye en la velocidad de la bola
var poder_disparo:Number = 16;

//creamos un grupo de colision
var collisionGroup:CollisionGroup = new CollisionGroup(puntoA,puntoB);
const GRAVITY:Number = 1.5;
const FRICTION:Number = .95;


stage.addEventListener(MouseEvent.MOUSE_DOWN, disparar);
function disparar(e:MouseEvent)
{
   //creamos las variables de la posicion del mouse
   var mousex:Number = mouseX - sapito.x;
   var mousey:Number = (mouseY - sapito.y) * -1;
//situamos la mira segun el raton para disparar
   angulo = Math.atan(mousey/mousex)/(Math.PI/180);
   if (mousex<0)
   {
      angulo +=  180;
   }
   if (mousex>=0 && mousey<0)
   {
      angulo +=  360;
   }
   if (angulo>160)
   {
      angulo = 160;
   }
   if (angulo<20)
   {
      angulo = 20;
   }
   //le damos el angulo de disparo
   sapito.cannon.rotation = angulo * -1;
   //abrimos la boca del sapito
   sapo_grafica.gotoAndPlay(2);
   //disparamos para arriba
   angulo = sapito.cannon.rotation - 1;
   //iniciamos el disparo
   incio_disparo_x = sapito.x+48*Math.cos(angulo*Math.PI/180);
   incio_disparo_y = sapito.y+48*Math.sin(angulo*Math.PI/180);
   var bola_disparada:bola= new bola();
   addChild(bola_disparada);
   collisionGroup.addItem(bola_disparada);
   bola_disparada.x = sapito.x;
   bola_disparada.y = sapito.y;
   bola_disparada.dirx = Math.cos(angulo*Math.PI/180)*poder_disparo;
   bola_disparada.diry = Math.sin(angulo*Math.PI/180)*poder_disparo;
   bola_disparada.addEventListener(Event.ENTER_FRAME, disparo_y_colision);
   function disparo_y_colision(e:Event):void
   {
      //disparamos
      bola_disparada.diry +=  gravedad;
      //verificamos limites de escenario
      limite_escenario();
      //verificamos colisiones
      var collisions:Array = collisionGroup.checkCollisions();
      for (var i:uint = 0; i < collisions.length; i++)
      {
         var firstShape:Sprite = collisions[i].object1;
         var secondShape:Sprite = collisions[i].object2;
         // Grab the next collision in the array
         var collision:Object = collisions[i];
         var angle:Number = collision.angle;
         var overlap:int = collision.overlapping.length;
         var sin:Number = Math.sin(angle);
         var cos:Number = Math.cos(angle);
         trace("angulo devuelto: "+angle);
         bola_disparada.dirx *=  -1;
         bola_disparada.diry *=  -1;

         messageBox.text= (firstShape.name + " colisiono con " + secondShape.name + "\n");
      }

   }
   //detectar limite escenario
   function limite_escenario():void
   {
      if (bola_disparada.x <= 0)
      {
         bola_disparada.dirx *=  -1;
      }
      else if (bola_disparada.x >= stage.stageWidth - bola_disparada.width)
      {
         bola_disparada.dirx *=  -1;
      }
      if (bola_disparada.y <= 0)
      {
         bola_disparada.diry *=  -1;
      }
      else if (bola_disparada.y >= stage.stageHeight - bola_disparada.height)
      {
         bola_disparada.diry *=  -1;
      }
      bola_disparada.x +=  bola_disparada.dirx;
      bola_disparada.y +=  bola_disparada.diry;
   }

}


Ardchivo FLA

segun creo el error estaria en estas lineas, en las ultimas dos que redireccionan la bola una vez colisionada

Código ActionScript :

var collision:Object = collisions[i];
var angle:Number = collision.angle;
var overlap:int = collision.overlapping.length;
var sin:Number = Math.sin(angle);
var cos:Number = Math.cos(angle);
trace("angulo devuelto: "+angle);
bola_disparada.dirx *=  -1;
bola_disparada.diry *=  -1;


MIL gracias por la ayuda

Por voraz2

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jul 2014 04:55 pm
Segundo problema: tienes las funciones anidadas, es decir, todas metidas dentro de la funcion disparo. Sepáralas en funciones independientes, sino es imposible manejar el código por bloques

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Jul 2014 05:48 pm
Gracias, crees que asi estaria bien optimizado el codigo por bloques?

Código ActionScript :

import flash.events.MouseEvent;
import com.coreyoneil.collision.CollisionGroup;

Mouse.hide();
var _objetivo:objetivo= new objetivo();
stage.addEventListener(MouseEvent.MOUSE_MOVE, objetivoMove);
function objetivoMove(ev:MouseEvent)
{
   _objetivo.x = ev.stageX;
   _objetivo.y = ev.stageY;
}

addChild(_objetivo);

var sapito:sapito_base= new sapito_base();
addChild(sapito);
trace(stage.width);
sapito.x = 350;
sapito.y = 400;

//la gravedad hace que caiga la bola;
gravedad = 0.1;

//poder de dispar que influye en la velocidad de la bola
var poder_disparo:Number = 16;

//creamos un grupo de colision
var collisionGroup:CollisionGroup = new CollisionGroup(puntoA,puntoB);
const GRAVITY      :Number = 1.5;
const FRICTION      :Number = .95;
var bola_disparada:bola;

sapito.addEventListener(Event.ENTER_FRAME, posicion_mira);
function posicion_mira(e:Event):void
{
   var mousex:Number = mouseX - sapito.x;
   var mousey:Number = (mouseY - sapito.y) * -1;
   angulo = Math.atan(mousey/mousex)/(Math.PI/180);
   if (mousex<0)
   {
      angulo +=  180;
   }
   if (mousex>=0 && mousey<0)
   {
      angulo +=  360;
   }
   if (angulo>160)
   {
      angulo = 160;
   }
   if (angulo<20)
   {
      angulo = 20;
   }

   if (poder_disparo>200)
   {
      poder_disparo = 200;
   }
   sapito.cannon.rotation = angulo * -1;
}


stage.addEventListener(MouseEvent.MOUSE_DOWN, crear_bola);
function crear_bola(e:MouseEvent)
{
   sapo_grafica.gotoAndPlay(2);
   angulo = sapito.cannon.rotation - 1;
   incio_disparo_x = sapito.x+48*Math.cos(angulo*Math.PI/180);
   incio_disparo_y = sapito.y+48*Math.sin(angulo*Math.PI/180);
   bola_disparada= new bola();
   addChild(bola_disparada);
   collisionGroup.addItem(bola_disparada);
   bola_disparada.x = sapito.x;
   bola_disparada.y = sapito.y;
   bola_disparada.dirx = Math.cos(angulo*Math.PI/180)*poder_disparo;
   bola_disparada.diry = Math.sin(angulo*Math.PI/180)*poder_disparo;
   bola_disparada.addEventListener(Event.ENTER_FRAME, disparo_y_colision);


}

   //detectar limite escenario
   function limite_escenario():void
   {
      if (bola_disparada.x <= 0)
      {
         bola_disparada.dirx *=  -1;
      }
      else if (bola_disparada.x >= stage.stageWidth - bola_disparada.width)
      {
         bola_disparada.dirx *=  -1;
      }
      if (bola_disparada.y <= 0)
      {
         bola_disparada.diry *=  -1;
      }
      else if (bola_disparada.y >= stage.stageHeight - bola_disparada.height)
      {
         bola_disparada.diry *=  -1;
      }
      bola_disparada.x +=  bola_disparada.dirx;
      bola_disparada.y +=  bola_disparada.diry;
   }
   
   //Disparamos y detectamos colisiones
 function disparo_y_colision(e:Event):void
   {
      //Disparamos la bola
      bola_disparada.diry +=  gravedad;
      //detectamos los limites del escenario
      limite_escenario();
      //detectamos las colisiones con el CollisionDetectionKit_v15
      var collisions:Array = collisionGroup.checkCollisions();
      for (var i:uint = 0; i < collisions.length; i++)
      {
         var firstShape:Sprite = collisions[i].object1;
         var secondShape:Sprite = collisions[i].object2;
            var collision:Object = collisions[i];
            var angle:Number = collision.angle;
            var overlap:int = collision.overlapping.length;
            var sin:Number = Math.sin(angle);
            var cos:Number = Math.cos(angle);
            trace("angulo devuelto: "+angle)
            bola_disparada.dirx *=  -1;
            bola_disparada.diry *= -1;
         
    messageBox.text= (firstShape.name + " colisiono con " + secondShape.name + "\n");
         
      }

   }




Archivo FLA

Por voraz2

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jul 2014 06:39 pm
Asi se ve mejor

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Jul 2014 07:44 pm
OK, gracias por los consejos, crees que me puedas dar una luz en lo de los rebotes? porque no entiendo como hacerle para que la bola siga su curso de rebotes

Gracias

Por voraz2

21 de clabLevel



 

firefox

 

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