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