Anuncios Google

Duda Palib (Sucesion en una variable)

He estado mirando, pero no encuentro el codigo por ningun lado. Tengo esta condicion:

 

if (PA_EasyBgGetPixelCol(0,2,(PA_GetSpriteX(0,0)),(PA_GetSpriteY(0,0))) == PA_RGB(0,0,0)){

 

Si el sprite esta situado en un pixel negro del fondo se activa la condicion. El problema son las coordenadas, me gustaria que fueran mas extensas y no a un punto en especifico

 

Seria todos las coordenas desde:

(PA_GetSpriteX(0.0))

A

(PA_GetSpriteX(0,0))+8

 

Como se representaria?

 

Saludos


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.
Imagen de eglomer

Para comprobar un sector

Para comprobar un sector cuadrado puedes hacer:

int x = 0, y = 0;

bool activar = 0;

for (x=PA_GetSpriteX(0,0); x<=PA_GetSpriteX(0,0)+8; x++){

   for (y=PA_GetSpriteX(0,0); y<=PA_GetSpriteX(0,0)+8; y++){

      if (PA_EasyBgGetPixelCol(0,2,x,y) == PA_RGB(0,0,0) )      activar = 1;

   }

}

if (activar == 1){

   // lo que sea que quieras hacer

}

 

y si solo quieres comprobar un eje de coordenadas

for (x=PA_GetSpriteX(0,0); x<=PA_GetSpriteX(0,0)+8; x++){

   if (PA_EasyBgGetPixelCol(0,2,x,PA_GetSpriteY(0,0)) == PA_RGB(0,0,0) )      activar = 1;

}

 

espero que esto te ayude.

 

Saludos!


Proyectos en curso

El Taller de Eglomer

Como no eglomer siempre

Como no eglomer siempre acude a la llamada de socorro XD

 

Parece algo complicado. Pero creo que lo pillo, meter las coordenadas en una variable cuyo vale se encuentra entre esos valores

 

Pos lamento decepcionarte, pero me equivoque no era un cuadrado lo que queria

 

Era mas bien una figura de este estilo:

 

 

Tu que conoces el juego que estoy haciendo sabras lo que es, XD

 

Graxxxx

 

pd: no pillo de que va el juego que estas haciendo, XD

Imagen de eglomer

La verdad es que no entiendo

La verdad es que no entiendo muy bien lo que quieres hacer. No se si quieres que algo pase cuando el stylus entre en esa zona (en tal caso bastaría con pintar todo el interior de negro) o si lo que quieres es que pase algo cuando el stylus choque contra las paredes de la figura, con lo que la comprobación inicial sería válida :S

 

PD: En el juego, las bolitas te persiguen y dependiendo del modo de juego deberás hacer una cosa u otra.


Proyectos en curso

El Taller de Eglomer

Esque el sistema actual de

Esque el sistema actual de colisiones, solo me detecta las colisiones por la parte de arriba, por abajo nada

 

La cosa es que te la detecte en cualquier parte del raton, no por arriba...

 

pd: modo de juego?, bueno ya me enterare mejor cuando saques la beta XD

Imagen de eglomer

Ahh!! lo que quieres es un

Ahh!! lo que quieres es un sistema de colisiones con la forma del ratón!!

Lo que puedes hacer es comprobar todo el sprite y comprobar los colores tanto del sprite como del fondo. Algo así:

 

int x = 0, y = 0;

bool activar = 0;

for (x=PA_GetSpriteX(0,0); x<=PA_GetSpriteX(0,0)+8; x++){

   for (y=PA_GetSpriteY(0,0); y<=PA_GetSpriteY(0,0)+8; y++){

     // si el pixel del fondo                   es      negro         y  el pixel del sprite es diferente de magenta (es decir, es el ratón)   activa acción

      if (PA_EasyBgGetPixelCol(0,2,x,y) == PA_RGB(0,0,0) && PA_GetSpritePixel(0,2,x,y,) != PA_RGB(255,0,255) )      activar = 1;

   }

}

if (activar == 1){

   // lo que sea que quieras hacer

}

 

No se si la funcion PA_GetSpritePixel irá bien. Pruébala y nos dices.

Y si tienes problemas con el PA_RGB haz lo que te ha dicho master de comprobar el color en la paleta

 

PD: Master, tio, vaya chapuza le has puesto con tal de no ponerle tu código xDDD


Proyectos en curso

El Taller de Eglomer

Lo he probado (por cierto,

Lo he probado (por cierto, el codigo tiene algunos errores)

Me ha dado unos bugs tremendos con cosas, como la pausa (si quito la pausa para volver al juego, me sale la pantalla de game over ^^)...

Probare la solucion de master sonic haber que tal

 

Saludos, grax a los dos

Imagen de eglomer

Lo del game over igual es

Lo del game over igual es que has metido más cosas de las necesarias en la comprobación de lo de if (activo), y lo de que el código tenía errores es más que probable, xq lo escribí directamente aquí y con un poco de prisa. -.-U

Si quieres, y si la solución de Master no acaba de funcionar como quieres, podemos quedar x msn y así me pasas el código y le echo un ojo a ver cómo podemos mejorar el tema de las colisiones.

Saludos!


Proyectos en curso

El Taller de Eglomer

Imagen de copete23

Hola, ahora mismo no sé que

Hola, ahora mismo no sé que es lo que intentais hacer exactamente, pero si lo que quereis es detectar una colision con un punto del fondo, ¿porqué no utilizais tiles en lugar de pixels?

Me explico, el chequeo de pixels consume muchos recursos, y es mas lento, con lo que puede ser algo impreciso, pero si en lugar de eso utilizas un array de tiles de 8x8 el proceso será mas rápido y sencillo, PAgfx cuando te transforma los fondos el codigo, te crea ya ese array, lo llama fondo_Map, ese array tiene numerados los distintos tiles de tu dibujo, de tal manera que un 0 significa que no hay tile , y un 1 que si.

Pero no se si es esto lo que necesitais.

saludos

Si, eso es lo que quiero.

Si, eso es lo que quiero. Las colisiones

 

Pos no uso tiles basicamente porque no se usarlos XD. Si puedes matizar un poco...

 

Saludos

Imagen de copete23

Ok, lo intentaré XD bien ,

Ok, lo intentaré XD

bien , cuando tu pasas un fondo con pagfx, este telo transforma en un archivo fondo.c (donde fondo seria el nombre de tu dibujo :D), ok, dentro de ese archivo te ha generado unos arrays, con los datos del mapa, tamaño,tiles..., de esos arays te interesa  el que se llama fondo_Map[], en el estan todos los tiles de tu fondo ordenados, así un 0 indicará que no hay colision, y un numero mayor, que si la hay.

un ejemplo:

ante de comenzar tienes que saber que ds utiliza para componer los fondos tiles de 8x8, por lo que los cálculos tienen que hacerse teniendo en cuenta esas dimensiones a la hora de mover el objeto que colisionará, para ello hay que utilizar aritmetica de punto fijo, que no es mas que dividir o multiplicar en este caso por 8 (>>8, <<8) ¿para que? pues para que las posiciones de el sprite o lo que sea siempre coincidan con un tile :)

ok, para el ejemplo utilizaré un fondo llamado fondo XD de 512x512, y un sprite llamado sprite de 32x32

 

Lo primero que ha que hacer es crear una funcion que te de el numero de tile según la posicion del sprite

 

u8 Tile(s32 x, s32 y){
 return fondo_Map[((y>>3)*64) + (x>>3)];
}

 

por partes, y>>3 indicara la posicion del tile en el eje y dividido ente 8  porque son 8pixeles por tile, luego se multiplica por el ancho en tiles *64 ¿porqué 64? porque 512/8=64 :)

Lo mismo pasaria con x>>3.

 

Ahora hay que crear las funciones que según lo anterior no detecten si la colision es a la derecha, izquierda abajo...

antes aclarar que que la parte izquierda de un sprite corresponde al pixel 0 igual que la parte superior, y la derecha en este caso al pixel 31, igual que la inferior.

 

-colision derecha

u8 derecha(void){
    return (Tile((sprite.x>>8)+31, (sprite.y>>8)+8 ));

}

 

-colision izquierda

u8 izquierda(void){
    return (Tile((sprite.x>>8)+0, (sprite.y>>8)+8 ));

}

 

-colision inferior

u8 inferior(void){
    return (Tile((sprite.x>>8)+8, (sprite.y>>8)+31 ));

}

 

if(derecha()){..lo que sea...}

f(izquierda()){..lo que sea...}

.....

 

 

-colision superior

u8 superior(void){
    return (Tile((sprite.x>>8)+8, (sprite.y>>8)+0 ));

}

 

y esto es lo que seria un ejemplo basico de colision con tiles,
tienes uno igual en los ejemplos que trae palib, solo que aplicado a un
plataformas, en \palib\examples\Demos\PlatformGame\PlatformGame2

espero que esto te ayude :)

saludos!

Ok graxxx   Lo he adaptado

Ok graxxx

 

Lo he adaptado a mi codigo y asi ha quedado:

#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"

u8 Tile(s32 x, s32 y){
 return colisiones_Map[((y>>3)*32) + (x>>3)*24];
}

 

while (1)
    {

u8 derecha(void){
    return (Tile((ratonmb4_Sprite.x>>8)+31, (ratonmb4_Sprite.y>>8)+8 ));

}
if (derecha()){
   Stylus.X = 230;
Stylus.Y = 178;
PA_DeleteBg(0,2);
           PA_DeleteSprite(0,0);
           PA_OutputSimpleText(0,10,8,"Has perdido");
PA_OutputSimpleText(0,10,12,"Reintentar");
PA_OutputSimpleText(0,10,15,"Volver al menu");
juego = false;
derrota = true;
}
u8 izquierda(void){
    return (Tile((ratonmb4_Sprite.x>>8)+0, (ratonmb4_Sprite.y>>8)+8 ));

}
if(izquierda()){
   Stylus.X = 230;
Stylus.Y = 178;
PA_DeleteBg(0,2);
           PA_DeleteSprite(0,0);
           PA_OutputSimpleText(0,10,8,"Has perdido");
PA_OutputSimpleText(0,10,12,"Reintentar");
PA_OutputSimpleText(0,10,15,"Volver al menu");
juego = false;
derrota = true;
    }

}

 

 

Tras darle a compilar da errorr:

 

main.c: In function 'derecha':
main.c:116: error: request for member 'x' in something not a structure or union
main.c:116: error: request for member 'y' in something not a structure or union
main.c: In function 'izquierda':
main.c:131: error: request for member 'x' in something not a structure or union
main.c:131: error: request for member 'y' in something not a structure or union
main.c: In function 'main':
main.c:195: error: expected declaration or statement at end of input

 

 

¿Que puede ser?

 

Imagen de eglomer

supongo que sólo has puesto

supongo que sólo has puesto los fragmentos relacionados con la parte de las colisiones, xq si no no le veo sentido xDD

El error que te da es porque ratonmb4_Sprite no tiene ningún parámetro interno llamado x ni y, por lo que no puede acceder a ellos. No se si será una estructura o no, porque la verdad es que de tiles y eso no se nada (y tampoco me he leído muy detenidamente la explicación de copete xD), pero puedes probar a poner la X y la Y en mayúscula, ya que si te fijas, Stylus.X y Stylux.Y va en mayúscula. Y si lo que quieres es pasarle la X y la Y del sprite del ratón y aún así no te funciona, prueba con PA_GetSpriteX(pantalla,objeto); y PA_GetSpriteY(pantalla,objeto);

Saludos!


Proyectos en curso

El Taller de Eglomer

XD, seria un codigo muy raro

XD, seria un codigo muy raro entonces

 

No queria hacer eso, pero aun asi he sustiuido por PA_GetSprite para probar:

 

u8 derecha(void){
    return (Tile((ratonmb4_Sprite.(PA_GetSpriteX(0,0))>>8)+31, (ratonmb4_Sprite.(PA_GetSprite.Y(0,0))>>8)+8 )));

}

 

Ahora me da error con los parentesis. Sin embargo estan todos los parentesis puestos ^^:

 

e:/Denabled/devkitPro/source/main.c:116: error: expected identifier before '(' token
e:/Denabled/devkitPro/source/main.c:116: error: expected identifier before '(' token
e:/Denabled/devkitPro/source/main.c:116: error: expected ';' before ')' token
e:/Denabled/devkitPro/source/main.c:116: error: expected statement before ')' token

 

Saludos

Imagen de copete23

XD, menudo lio, lo que te

XD, menudo lio, lo que te está pasando, es que  ratonmb4_Sprite.x no es una estrutura

tal vez me he precipitado y te he puesto algo que aún no sabes, bueno te explico, supongo que en tu juego tienes un sprite que al colisionar con el fondo hace una determinada cosa, y ese sprite tendrá una serie de variables como x, y, velocidad,

una estructura es como un paquete con todas las variables que necesites. Para crear una estructura hay que hacer lo siguiente:

typedef struct{

u32 x;

u32 y;

} estructura;

 

luego crears el objeto que utilice la estructura

estructura ratonmb4_Sprite;

 

y ahora ya puedes utilizar ratonmb4_Sprite, con las variables que contiene

ratonmb4_Sprite.x=0;

ratonmb4_Sprite.y=....

 

programar con estructuras hace mas comodo manejar los datos

por ejemplo puedes añadir a esa estructura, una variable que se llame sprite, y utilizarla para crear un sprite

ratonmb4_Sprite.sprite=1;

PA_CreateSprite(0, ratonmb4_Sprite.sprite, (void*)sprite_Pal, OBJ_SIZE_32X32, 1, 0, ratonmb4_Sprite.x, ratonmb4_Sprite.y);

 

 

de todas formas tendrias que repasar algo de c, con algun manual de los que hay por google, :)

 

saludetes!

 

He colocado la estructura

He colocado la estructura antes del main y he definido las variables. Todo cogiendo el mismo codigo que has puesto

 

Sin embargo me sigue diciendo lo mismo, que no es una estructura valida...

 

Saludos

 

pd: es cierto, no estudie el C. Pero si lei bastantes tutoriales de como usar las palib y hize algunos ejemplos antes de hacer el juego (puedes incluso encontrar algunas de mis dudas de principiante por el foro

Esta es la 2º que me pasa, que no se hacer algo por no saber C. Creo que te hare caso y me leere algun manual de los de google

Imagen de The Dark Master

¿Has probado mi metodo?el

¿Has probado mi metodo?el que puse no da errores y funciona muy bien,deberias probar el mio antes y si no te gusta o no te convence haz uno de ellos pero pruebalo.

salu2


Imagen de The Dark Master

XD es que la colision de mi

XD es que la colision de mi juego es demasiado extensa creo yo,ademas el sprite de sr daniel (el personaje de mi juego) es de 64x64 por lo que no serian compatibles ademas de ser otras variables...

salu2


Imagen de The Dark Master

si quieres que detecte la

si quieres que detecte la izquierda,derecha,arriba y abajo del sprite de 8x8,toma este codigo ,lo he puesto rapido,podria ponerlo mejor pero este es mas claro:

//---------------------------codigo----------------------------------------------

u8 x=PA_GetSpriteX(bg,fondo,sprite);

u8 y=PA_GetSpriteY(bg,fondo,sprite);

 

if (PA_EasyBgGetPixelCol(bg,fondo,x,y) == PA_RGB(0,0,0) )      // este

if (PA_EasyBgGetPixelCol(bg,fondo,x+8,y) == PA_RGB(0,0,0) )  //      y este hacen la coli de arriba

if (PA_EasyBgGetPixelCol(bg,fondo,x,y) == PA_RGB(0,0,0) )      //este

if (PA_EasyBgGetPixelCol(bg,fondo,x,y+8) == PA_RGB(0,0,0) )  // y este hacen la coli izquierd

if (PA_EasyBgGetPixelCol(bg,fondo,x+8,y) == PA_RGB(0,0,0) )      //este

if (PA_EasyBgGetPixelCol(bg,fondo,x+8,y+8) == PA_RGB(0,0,0) )  // y este hacen la coli derecha

if (PA_EasyBgGetPixelCol(bg,fondo,x,y+8) == PA_RGB(0,0,0) )      // este

if (PA_EasyBgGetPixelCol(bg,fondo,x+8,y+8) == PA_RGB(0,0,0) )  //      y este hacen la coli de abajo

//-------------------------------------------------------------------------------

No se si te interesara pues eglomer lo esta poniendo mas desarrollado,yo es que no puedo poner el de mi medievil ya que me lo he currado,pero este funciona mas o menos bien,detecta desde las 4 esquinas del sprite,aunque debo decirte que el PA_RGB(0,0,0) en estos casos no podria tener buen rendimiento pon esto:

PA_OutputText(1, 0, 4, "Palette Color : %d   ", PA_EasyBgGetPixel(0, 1, Stylus.X, Stylus.Y));

y toca el grafico que quieres y te dira su paleta,despues cambias el PA_RGB(0,0,0) por el numero de paleta y te ira a las mil maravillas.

salu2


Lo he probado y nada, solo

Lo he probado y nada, solo me la detecta en la esquina de siempre...

 

Creo que lo que hare es modificar el spirte para que no se note. Como cambiarle la forma y eso

 

Saludos

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.