As we know adding physics to games makes them more realistic and enjoyable. To add physics in your game, various third party SDKs are available like Box2d, Cocos2D, AndEngine, libgdx etc. Some of the most popular games today extensively use physics engines. However learning how to use a new physics engine just for adding some very basic physics might be an overkill. Also on some platforms (J2ME) there are limited open source physics engines available.
Como ya sabemos, agregar física en los juegos los hace más realistas y placenteros. Para agregar la física a su juego, varios SDKs de terceros están disponibles, tales como Box2d, Cocos2D, AndEngine, libgdx, etc. Algunos de los juegos más populares hoy en día utilizan motores de física. Sin embargo, aprender cómo utilizar un nuevo motor de física únicamente para agregar física muy básica puede ser una exageración. También en algunas plataformas (J2ME) existen pocos motores de física de fuente abierta disponibles.
En este blog describiré como podemos agregar física simple sin tener que depender de un SDK de un tercero como por ejemplo J2ME. Es una plataforma popular pero no posee un motor de física de un tercero de fuente abierta. Los APIs disponibles en su paquete de juegos contienen lógica únicamente para sprite y mosaicos y no existe ninguna API predeterminada para agregarle física.
La física detrás de los hechos.
Detección de Colisión:
Generalmente, cuando queremos revisar la colisión entre dos sprites en un motor de juegos, existe un método específico como lo es:
sprite1.collideWith(sprite2)
Si la colisión está ocurriendo, entonces este método dará como resultado lo verdadero, de otra forma dará como resultado lo falso. Pero,¿qué pasa si no tenemos dicho API para revisar la colisión entre dos objetos? Esta tarea será un poco desafiante pero puede realizarse fácilmente utilizando un poco de geometría coordinada. Suponga que queremos revisar la colisión entre dos puntos en un sistema Cartesiano 2D en donde cada punto posee su Coordinada x y su Coordinada y.
Ahora supongamos que hay dos objetos. El Objeto 1 se encuentra en P1(x1,y1) y el Objeto 2 en el punto P2(x2,y2), así que lógicamente ellos únicamente pueden colisionar si la distancia entre estos dos puntos es menor a la anchura del Objeto (se asume que ambos objetos son del mismo tamaño).
Fórmula para calcular la distancia entre estos dos puntos:
Ejemplo de código:
double yDiff = (y2-y1)
double xDiff = (x2-x1)
double distance = Math.sqrt((yDiff*yDiff)+(xDiff*xDiff))
Movimiento de Proyectil:
La mayoría de los juegos basados en tiroteos incluyen lógica de movimiento de proyectil, es decir, cuando lanzamos cualquier objeto con algún ángulo y fuerza y luego debido a la gravedad de la tierra se desvía de su camino natural y viaja en un camino parabólico el cual tiene su máxima altura y luego vuelve de nuevo a la tierra.
Entonces, si conocemos su velocidad inicial y su ángulo podemos calcular cada punto de desplazamiento en relación al tiempo.
Velocidad inicial:
Suponga que la velocidad inicial es Vi
Su componente x será Vix = Vi* cos (ángulo)
Su componente y será Viy = Vi* sin (ángulo)
double Viy = Math.toDegrees(Viyrad);
double Vix = Math.toDegrees(Vixrad);
Desplazamiento
Código Java
Dy = Viy * t + (.5 * ((-9.8) *Math.pow(t,2)));
Dx = Vix * t;
Esperamos que este artículo le haya sido de ayuda, por favor comparta sus comentarios. Si tiene alguna pregunta o necesita asistencia, por favor escribanos a support@shephertz.com
In this blog I will describe how we can add some simple physics without relying on a 3rd party SDK by taking an example of J2ME. It’s a popular platform but doesn’t have an open source third party physics engine. The APIs available in its game package contain logic only for sprite and tiled layer and there is no predefined API to add physics.
Physics behind event.
Collision Detection:
Generally, when we want to check collision between two sprites in a game engine, there is a dedicated method like:
sprite1.collideWith(sprite2)
If the collision is occurring then this method will return true otherwise it will return false. But what if we don’t have such API to check collision between two objects. This will be a little challenging task but can be easily done using some coordinate geometry. Suppose we want to check collision between two points in 2D-Cartesian system where every point has its xCordinate and yCordinate.
Now, let’s suppose there are two objects. Object1 is at P1(x1,y1) and Object2 at point P2(x2,y2). so logically they can only collide if the distance between these two points is less then Object width(it is assumed that both object are of same size).
Formula to calculate distance between these two points:
Code example:
double yDiff = (y2-y1)
double xDiff = (x2-x1)
double distance = Math.sqrt((yDiff*yDiff)+(xDiff*xDiff))
Projectile Motion:
Most of the shooting based games include logic of projectile motion i.e. when we throw any object with some angle and power then due to the earth gravity it diverts from its natural path and travels in a parabolic path which has its maximum height and after which it comes back on earth.
So, if we have its initial velocity and angle then we can calculate every traveling point with respect to the time.
initial velocity:
suppose initial velocity is Vi
so its x component will be Vix = Vi * cos (angle)
so its y component will be Viy = Vi * sin (angle)
// Java Code
double Viyrad = Math.sin(launchAngle) * launchVelocity;
double Vixrad = Math.cos(launchAngle) * launchVelocity;
double Viy = Math.toDegrees(Viyrad);
double Vix = Math.toDegrees(Vixrad);
Displacement
Java Code:
Dy = Viy * t + (.5 * ((-9.8) *Math.pow(t,2)));
Dx = Vix * t;
We hope this article helped you, please do share your feedback. If you have any questions or need any further assistance, please feel free to write us at support@shephertz.com
Leave A Reply