ActionScript - colisiones perfectas!!

 
Vista:

colisiones perfectas!!

Publicado por salvitax (1 intervención) el 05/07/2006 18:00:18
Hola buenas,estoy realizando una especie de juego en flash. He llegado a un momento en que tengo un objeto en movimiento que ha de colisionar contra un objeto parado. En ocasiones la colision es perfecta, pero en otros casos, al estar el objeto 1 en movimiento, en el instante (t) no coliasiona con el objeto 2, pero en el instante (t+1) ya ha avanzado suficiente y el ojeto 1 se ha comido un trozo del segundo. como puedo evitar eso y que la colision sea perfecta.
Lo hago con enterframe...

gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Colisiones precisas entre objetos en movimiento

Publicado por Alejandro (369 intervenciones) el 22/06/2023 17:29:57
Para lograr colisiones precisas entre objetos en movimiento en Flash, es recomendable utilizar la detección de colisiones basada en el método de proyección temporal. En lugar de simplemente verificar la superposición de los objetos en un solo fotograma, este enfoque considera el movimiento de los objetos durante un período de tiempo y calcula la posición futura para predecir las colisiones.

Aquí hay una solución básica utilizando el método de proyección temporal:

1. En cada fotograma, calcula la posición futura de ambos objetos sumando sus velocidades a sus posiciones actuales.

2. Comprueba si los objetos colisionarán en el próximo fotograma. Esto se puede hacer verificando la superposición de los límites de los objetos, como rectángulos de colisión.

3. Si se detecta una colisión, ajusta las posiciones y velocidades de los objetos para evitar la superposición. Puedes revertir los movimientos previos o aplicar un cálculo de respuesta a la colisión para simular una reacción realista.

Aquí tienes un ejemplo básico para implementar este enfoque:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Supongamos que tienes dos objetos llamados "objeto1" y "objeto2" con velocidades y posiciones x e y
 
// En cada fotograma (enterFrame)
addEventListener(Event.ENTER_FRAME, onEnterFrame);
 
function onEnterFrame(event:Event):void {
   // Calcula las posiciones futuras de los objetos sumando sus velocidades
   var nextX1:Number = objeto1.x + objeto1.velocidadX;
   var nextY1:Number = objeto1.y + objeto1.velocidadY;
   var nextX2:Number = objeto2.x + objeto2.velocidadX;
   var nextY2:Number = objeto2.y + objeto2.velocidadY;
 
   // Verifica si los objetos colisionarán en el próximo fotograma
   if (checkCollision(nextX1, nextY1, objeto1.width, objeto1.height, nextX2, nextY2, objeto2.width, objeto2.height)) {
       // Si hay colisión, ajusta las posiciones y velocidades de los objetos
       // Puedes revertir los movimientos previos o aplicar una respuesta a la colisión según tus necesidades
       // Por ejemplo, puedes establecer las posiciones actuales en lugar de las futuras
       objeto1.x = objeto1.x;
       objeto1.y = objeto1.y;
       objeto2.x = objeto2.x;
       objeto2.y = objeto2.y;
 
       // También puedes invertir las velocidades o aplicar una respuesta más compleja
       objeto1.velocidadX = -objeto1.velocidadX;
       objeto1.velocidadY = -objeto1.velocidadY;
       objeto2.velocidadX = -objeto2.velocidadX;
       objeto2.velocidadY = -objeto2.velocidadY;
   } else {
       // Si no hay colisión, actualiza las posiciones de los objetos a las posiciones futuras
       objeto1.x = nextX1;
       objeto1.y = nextY1;
       objeto2.x = nextX2;
       objeto2.y = nextY2;
   }
}
 
function checkCollision(x1:Number, y1:Number, width1:Number, height1:Number, x2:Number, y2:Number, width2:Number, height2:Number):Boolean {
   // Verifica la superposición de los límites de los objetos (rectángulos de colisión)
   return x1 < x2 + width2 &&
          x1 + width1 > x2 &&
          y1 < y2 + height2 &&
          y1 + height1 > y2;
}

En este ejemplo, la función `checkCollision` verifica si dos rectángulos de colisión (representados por las posiciones y tamaños de los objetos) se superponen. Luego, en la función `onEnterFrame`, se aplica la lógica de proyección temporal y se realiza la comprobación de colisión. Si se detecta una colisión, se ajustan las posiciones y velocidades de los objetos según sea necesario.

Recuerda adaptar este código a tu implementación específica, considerando las propiedades y comportamientos de tus objetos en movimiento.

Espero que esta solución te ayude a lograr colisiones más precisas en tu juego en Flash.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar