Dudas de... MATEMATICAS

Últimamente cuando paso por el foro, nada más que veo: DUDA XXXXX Luadev, DUDA DEV, DUDA ... em, me da por mirar, y... la mayoría son: El objeto se me sale, el objeto no me rebota, el objeto no colisiona... el objeto...

No es que sean dudas de programación, ni de luadev, ni ... es simplemente, que os faltan nociones de matemáticas.

Repaso / avanze (según curso en el que estéis ) de matemáticas aplicadas (xD):

 

  • Sistema de coordenadas:

A ver, la pantalla, teneis que imaginarla como un eje de coordenadas, dónde la única variación con lo que podáis estudiar, es que el eje de las ordenadas (y) está inverso en la pantalla de la PSP. Es decir, una Y > 0, será hacia abajo, en vez de hacia arriba.

Para los que no lo hayan estudiado y sean atrevidos: http://es.wikipedia.org/wiki/Coordenadas_cartesianas

Y mi resumen ultra breve: Cada punto en la PSP lo representaremos por un grupo de dos coordenadas. X, e Y. X el horizontal, Y el vertical. X > 0 = derecha. Y > 0 = abajo.

La PSP además, se limita a 480 puntos horizontales y 272 puntos verticales ( para el 2D ).

  • Imágenes o sprites dentro de nuestra pantalla:
Una imagen, por defecto, se pintará desde el punto que marquemos, hacia la derecha, y hacia abajo. Con lo que si nuestra imagen mide 32x32 pixels, y la ponemos en x=10,y=10, nuestra imagen irá desde x=10, hasta x=42, desde y=10, hasta y=42.
Si centramos estas imágenes usando center() en luadev, tendremos que al blitear en x=10,y=10, nuestra imagen ahora estará situada desde x=-6,y=-6, hasta x=26,y=26. (esto es por que la mitad de 32x32 es 16,16. 10-16 = -6, 10+16 = 26)
  • Definir un objeto
Un objeto en pantalla, tendrá una série de puntos que formarán su silueta. Pueden tener diversas formas muy variadas, pero normalmente, y por el hecho de simplificar, se usa el método "bounding boxes". Esto es la caja más pequeña que se puede hacer, que contenga totalmente nuestro objeto. Normalmente se usa el ancho y alto de la imagen que usamos, o sprite, o la forma que tenga nuestro objeto. Así que tenemos una caja, que podemos definir por cuatro puntos, ya que es un caja.
  • Cómo detectar una colision entre dos objetos?
Antes de pasar a bloques, vayamos con lineas. Dibujad una linea, y poner cuatro puntos en ella. Imaginemos que están en colisión, con lo que el primer punto y el tercero, es una caja, y el segundo punto y el cuarto, es otra caja. Vamos a llamar a los puntos A1, B1, A2, B2 respectivamente. Los objetos serian A1-A2, B1-B2. Podemos comprobar que de esta manera como las he colocado, tenemos colision si: B1 < A2 < B2. Pero si cambiamos de nombre los puntos, veremos que ahora ya no se cumple la colision, con lo que tendremos que añadir A1 < B2 < A2. Por lo tanto, para cualquier colisión entre lineas sería:
( (B1 < A2 < B2) o (A1 < B2 < A2) ). Y esta sí que cumpliría cualquier colisión entre estas dos líneas. Pero esto no se cumple para los cuadrados, por que... en los cuadrados tenemos el doble de coordenadas... no solo en eje X, si no que también en eje Y. Así que ahora, vamos a dibujar dos cuadrados.

Pues ahora vamos a hacer lo mismo que antes, pero dos veces, uno para el eje de las X, y otro para el eje de las Y.

Si nuestro objeto esta definido asi:
X,Y,W,H (punto de inicio, ancho y alto).
Tenemos que A es (X,Y). B es (X+W,Y). C es (X,Y+H).
Para el otro objeto, les llamaremos igual pero con una apostrofe. (A', B', C'). (X',Y',W',H').

Así que ahora en este caso, repetimos, pero dividiendolo en ejes:
 Eje X: ( A' < B < B' ) o ( A < B' < B ).
 Eje Y: ( A' < C < C' ) o ( A < C' < C ).

Y ahora, pero utilizando X,Y,W,H...:

Eje X: ( X' < X+W < X'+W' ) o ( X < X'+W' < X+W )
Eje Y: ( Y' < Y+H < Y'+H' ) o ( Y < Y'+H' < Y+H )

Y combinando ambos ejes, tendremos que habrá colisión si:

(( X' < X+W < X'+W' ) o ( X < X'+W' < X+W ) ) y ( ( Y' < Y+H < Y'+H' ) o ( Y < Y'+H' < Y+H ) )

Despues del pequeño repasito de coordenadas y ejes... aquí os facilito un poco de código que hace esto mismo, pero, y digo pero, por favor, ruego encarecidamente que no lo utilizeis, a menos que entendais lo arriba explicado, por que si no, volveran a asaltaros las dudas una y otra y otra y otra y otra vez. Avanzemos otro paso en la programación, dominemos las coordenadas y así preguntaremos otro tipo de dudas ;) .

objeto1 = {
  x=10,
  y=10,
  w=20,
  h=32
};
 
objeto2 = {
  x = 20,
  y = 20,
  w = 12,
  h = 34
};
 
function hay_colision(o1,o2)
return ( ( (o2.x < o1.x+o1.w < o2.x+o2.w) or (o1.x < o2.x+o2.w < o1.x+o1.w) ) and ( (o2.y < o1.y+o1.h < o2.y+o2.h ) or ( o1.y < o2.y+o2.h < o1.y+o1.h ) ) );
end
 
 
-- Para saber si hay colisiones:
if hay_colision(objeto1,objeto2) then .... end
  • Limitar el movimiento dentro de un área:
En este caso, puede ser la pantalla o lo que sea, si el objeto se pasa de largo por la izquierda, es facil, su X será negativa. En este caso, si X < 0 then X = 0. Ya no se pasa por la izquierda. Lo mismo para arriba. Pero, por la derecha, seria: si X + W > 480 then X = 480 - W. Mirad las ecuaciones y podreis ver que si el punto mas el ancho es mas grande que la pantalla, ponemos el punto justo en la pantalla, menos el ancho, es decir, justo en el limite. Lo mismo para las Y y ya teneis vuestro limite a la pantalla. Y con esto, por hoy, espero resolver de golpe algunas de vuestras dudas. Un saludo.

 


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

¡Por un momento he pensado que...!

¡Tu eras el que tenía la duda! Y la verdad, se me ha venido el alma a los pies... jeje

Un saludo.

Imagen de NEKERAFA

Ta bien

Jejejeje.

Esque mira que no saber como trabajar con coordenadas. Otra cosa DeViaNTe, dices que el eje Y es el eje de ordenadas, pero no nombras el eje X, y eso que tiene un nombre fácil, se llaman Abscisas XD, solo os lo recuerdo jajaja.

Yo, mientras tenia la PSP, cuando hacía pruebas con objetos en Lua, siempre puse 4 puntos en los objetos, es decir, un punto para (x, y), otro para (x+w, y), otro para (x, y+h) y otro en (x+w, y+h), y así resultaba muy fácil trabajar con colisiones y todo eso. Nose si LuaDEV tiene alguna función para dibujar un punto suelto, pero si la tiene, os recomiendo que la utiliceis, sobre todo si estas haciendo algun juego y necesitas trabajar con objetos y eres nuevo en este campo.

También, siempre que hagais algo, en la pantalla tiene que venir la máxima información posible para saber que pasa en todo momento y poder corregir errores facilmente (Prueba y error), y cuando termineis solo teneis que borrar eso, o sino lo podeis incluir como código fuente.


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

Imagen de Kenta15

xD

Esto esta en lo avanzado en mi curso buen post tengo que releerlo para enterder algunas cosas mejor

Imagen de barney77

Mañana lo leo, me vendrá muy

Mañana lo leo, me vendrá muy bn.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.