Saludos a todos!!
A ver si algun programador experto me puede ayudar, explico el problema a ver si se entiende bien.
Estoy creando un juego para wii(en C, aunque para esto el lenguaje no importa), es un juego de futbol en 2D. En él, el campo de futbol es un png que mide 1024x424(1024es el máximo permitido), y lo primero que hago es dibujarlo aumentando un 20% su tamaño, lo voy dibujando parte a parte:
PosX y PosY son las coordenadas que determinan que parte se muestra.
Despues dibujo los jugadores(3):
Como veis multiplico el tamaño del jugador x2 y las coordenadas x e y sale de un sencillo calculo hecho anteriormente:
bgx y bgy son las coordenadas de los jugadores.
Y finalmente dibujo el balón:
Como veis multiplico el tamaño por 1,5, y lo muestro solo si esta visible en la pantalla de juego(que en wii la resolucion es 640x480, al igual que los jugadores).
Como observais todo se centra en PosX y PosY que delimitan qué parte del campo se muestra. Pongo un ejemplo de lo que hago al mover el jugador a la derecha:
WPAD_BUTTON_DOWN determina que el jugador va hacia la derecha. XC2 el maximo que puede avanzar. Lo que hago aquí es mover el jugador y no la pantalla si no tiene el balon, y si lo tiene es donde ejecuto esto:
Osea situo siempre el balón en el centro de la imagen.
El problema que me estoy encontrando es que si te mueves hacia la derecha con el balon, el jugador que tiene la posesion cumple todo perfecto, pero el resto de jugadores no varian su bgx ni bgy pero siempre son visibles en la pantalla, se renderizan en la misma posicion del televisor. He probado a ajustar sus coordenadas al mover de esta manera:
Pero no se quedan totalmente quietos, ni con -6,-5,-7 ni ninguno(el -6 es el que mas quietos los dejan, aunque te siguen un poco mas lento).
Otro problema grave que da esto es al disparar, que los ejes se vuelven locos y hay que estar recolocando y eso queda fatal. por ejemplo disparo a puerta, el balon entra y tengo que colocar despues el balon otra vez(queda en la linea de meta). Ademas da problemas en relacion a la PosX y el resto. Loslimites son xmin=0 xmax=800 ymin=0 ymax=410. Esos limites obviamente siempre se cumplen pero según la posicion de disparo PosY y PosX se mueven tan mal que si antes xmin, te situabas en la banda superior, al disparar muchas veces xmin se situa mucho mas arriba de la banda superior o mucho mas abajo.
En definitiva hay desajustes por todos lados y creo que es imposible ajustarlo al 100%, y eso que aun no me he metido en tema pases, paradas del portero, rechaces...
Espero que se entienda más o menos bien.
Mi pregunta es:
¿estoy enfocandolo bien?
¿como lo hariais vosotros?
¿Se puede conseguir esto?:
Crear un campo(vector) asi
0/0///////////////////////////////////////////////////////////////////////////////////1024/0
/ /
/ ///////////////////// /
/ / Camara / /
/ / Camara / /
/ ///////////////////// /
/ /
/ /
/ /
/ /
0/424//////////////////////////////////////////////////////////////////////////////1024/424
Y que la camara que mide 640, 480 se fuera moviendo??una cosa importante seria que las coordenadas del balon no siempre estarian en el centro pero el balon siempre sería visible.
Si se puede como sería??
Muchisimas gracias a todos!
A ver si algun programador experto me puede ayudar, explico el problema a ver si se entiende bien.
Estoy creando un juego para wii(en C, aunque para esto el lenguaje no importa), es un juego de futbol en 2D. En él, el campo de futbol es un png que mide 1024x424(1024es el máximo permitido), y lo primero que hago es dibujarlo aumentando un 20% su tamaño, lo voy dibujando parte a parte:
Código [Seleccionar]
DrawPart (0, 0, PosX-250, PosY-250, 640,480, tex_estadio, 0, 1.2, 1.2, WHITE);
PosX y PosY son las coordenadas que determinan que parte se muestra.
Despues dibujo los jugadores(3):
Código [Seleccionar]
if (PtInRect(0,0,640,540,x[1],y[1])) GRRLIB_DrawTile(x[1], y[1], tex_mm, 0, 2, 2, WHITE, Jugadores.frame[1]);
if (PtInRect(0,0,640,480,x[2],y[2])) DrawTile(x[2], y[2], tex_bo, 0, 2, 2, WHITE, Jugadores.frame[2]);
if (PtInRect(0,0,640,480,x[3],y[3])) DrawTile(x[3], y[3], tex_go, 0, 2, 2, WHITE, Jugadores.frame[3]);
Como veis multiplico el tamaño del jugador x2 y las coordenadas x e y sale de un sencillo calculo hecho anteriormente:
Código [Seleccionar]
for(i=1; i <4; i++) {
x[i]=Jugadores.bgx[i]+PosX; y[i]=Jugadores.bgy[i]+PosY;
}
bgx y bgy son las coordenadas de los jugadores.
Y finalmente dibujo el balón:
Código [Seleccionar]
XBalon=bgx2+PosX; YBalon=bgy2+PosY;
if (PtInRect(0,0,640,480,XBalon,YBalon)) DrawImg(XBalon, YBalon, tex_balon, 0,1.5, 1.5, WHITE);
Como veis multiplico el tamaño por 1,5, y lo muestro solo si esta visible en la pantalla de juego(que en wii la resolucion es 640x480, al igual que los jugadores).
Como observais todo se centra en PosX y PosY que delimitan qué parte del campo se muestra. Pongo un ejemplo de lo que hago al mover el jugador a la derecha:
Código [Seleccionar]
if(wpadheld & WPAD_BUTTON_DOWN) {
if (CapiBalon >0) {
if (PosX < XC2) {
Jugadores.bgx[JugadorSeleccionado] -=3;
bgx2 = Jugadores.bgx[JugadorSeleccionado];
PosX+=3;
}
}
else {
Jugadores.bgx[JugadorSeleccionado] +=3;
}
Jugadores.direction_new[JugadorSeleccionado] = TILE_RIGHT;
}
WPAD_BUTTON_DOWN determina que el jugador va hacia la derecha. XC2 el maximo que puede avanzar. Lo que hago aquí es mover el jugador y no la pantalla si no tiene el balon, y si lo tiene es donde ejecuto esto:
Código [Seleccionar]
Jugadores.bgx[JugadorSeleccionado] -=3;
bgx2 = Jugadores.bgx[JugadorSeleccionado];
PosX+=3;
Osea situo siempre el balón en el centro de la imagen.
El problema que me estoy encontrando es que si te mueves hacia la derecha con el balon, el jugador que tiene la posesion cumple todo perfecto, pero el resto de jugadores no varian su bgx ni bgy pero siempre son visibles en la pantalla, se renderizan en la misma posicion del televisor. He probado a ajustar sus coordenadas al mover de esta manera:
Código [Seleccionar]
if (CapiBalon >0) {
if (PosX < XC2) {
Jugadores.bgx[JugadorSeleccionado] -=3;
Jugadores.bgx[2] -=6;
Jugadores.bgx[3] -=6;
bgx2 = Jugadores.bgx[JugadorSeleccionado];
PosX+=3;
}
Pero no se quedan totalmente quietos, ni con -6,-5,-7 ni ninguno(el -6 es el que mas quietos los dejan, aunque te siguen un poco mas lento).
Otro problema grave que da esto es al disparar, que los ejes se vuelven locos y hay que estar recolocando y eso queda fatal. por ejemplo disparo a puerta, el balon entra y tengo que colocar despues el balon otra vez(queda en la linea de meta). Ademas da problemas en relacion a la PosX y el resto. Loslimites son xmin=0 xmax=800 ymin=0 ymax=410. Esos limites obviamente siempre se cumplen pero según la posicion de disparo PosY y PosX se mueven tan mal que si antes xmin, te situabas en la banda superior, al disparar muchas veces xmin se situa mucho mas arriba de la banda superior o mucho mas abajo.
En definitiva hay desajustes por todos lados y creo que es imposible ajustarlo al 100%, y eso que aun no me he metido en tema pases, paradas del portero, rechaces...
Espero que se entienda más o menos bien.
Mi pregunta es:
¿estoy enfocandolo bien?
¿como lo hariais vosotros?
¿Se puede conseguir esto?:
Crear un campo(vector) asi
0/0///////////////////////////////////////////////////////////////////////////////////1024/0
/ /
/ ///////////////////// /
/ / Camara / /
/ / Camara / /
/ ///////////////////// /
/ /
/ /
/ /
/ /
0/424//////////////////////////////////////////////////////////////////////////////1024/424
Y que la camara que mide 640, 480 se fuera moviendo??una cosa importante seria que las coordenadas del balon no siempre estarian en el centro pero el balon siempre sería visible.
Si se puede como sería??
Muchisimas gracias a todos!