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
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
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535
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
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535
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
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535
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
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
Mi blog: http://creandomisvideojuegos.blogspot.com
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
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535
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!
Mi blog: http://creandomisvideojuegos.blogspot.com
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?
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535
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
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535
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!
Mi blog: http://creandomisvideojuegos.blogspot.com
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
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535
¿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
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
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
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535