Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





función Collision no siempre me funciona

Iniciado por glglut, 02 de Enero de 2008, 01:36:33 AM

« anterior - próximo »

glglut

hola!

estoy intentando detectar la colisión entre un objeto que se mueve y otro estático, estoy usando esta función:



miSprite->Collision(sprObstaculo);



estando sprObstaculo en el medio de la pantalla, el problema es que cuando desplazo miSprite desde la izquierda de la pantalla hacia la derecha donde está el sprObstaculo o desde abajo de la pantalla hacia arriba se detecta la colisión, pero cuando lo hago desde la derecha o desde arriba no se detecta la colisión.

he mirado de usar los demás parámetros que permite esta función pq deduzco que son para modificar el valor x e y de los sprites para que la función cree la caja mínima contenedora de ambos sprites y así detectar la colisión no??

muchas gracias por la ayuda

TheAzazel

buenas!

buen momento para usar el flag de debug en las colisiones:


Check collision with a given surface.
int  Collision (SDL_Surface *surf, SDL_Rect *rect, short this_x=-1, short this_y=-1, unsigned char debug=0)

Check collision with another sprite.  
int  Collision (CRM32Pro_CSprite *spr, short spr_x=-1, short spr_y=-1, short this_x=-1, short this_y=-1, unsigned char debug=0)


asi veras como interactua el sistema y lo que yo me temo que te esta pasando es que compruebas la colision en un bucle logico que va mas lento que el grafico(el que dibuja) y por eso hay veces que cuando comprueba si hay colision, los sprites ya no estan colisionando. Esto te pasara si la dif entre la velocidad logica y de dibujado es muy grande y los sprites se mueven muy rapido.

Saludos

[EX3]

Cita de: "TheAzazel"asi veras como interactua el sistema y lo que yo me temo que te esta pasando es que compruebas la colision en un bucle logico que va mas lento que el grafico(el que dibuja) y por eso hay veces que cuando comprueba si hay colision, los sprites ya no estan colisionando. Esto te pasara si la dif entre la velocidad logica y de dibujado es muy grande y los sprites se mueven muy rapido.
Como implementabas los tiempos de logica y los tiempos de dibujo en tu libreria? Este tema lo trataron en el seminario de XNA que hicieron hace una semana en Madrid que me recordo a cierta discursion que tuvimos sobre el tema en una de las kdd's. La logica la trabajaban con intervalos no fijos de tiempo (tiempo real, sin esperas) y segun el tiempo que tardaba el ciclo del bucle anterior se ejecutaba o no toda la carga grafica del juego o algo por el estilo (si se pasa SiPoX por aqui que me refresque la memoria). Se supone que de esta forma no deberia desincronizarse los graficos con la logica.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

glglut

gracias por responder :D

he activado lo del debug para que se vean las cajas que envuelven a los sprites y es curioso ver que cuando me muevo hacia la izquierda o hacia abajo, la caja que envuelve el objeto con el que quiero detectar la colisión desaparece por eso no detecta la colisión cuando el personaje pasa por encima, cuando voy hacia la derecha o hacia arriba la caja vuelve a aparecer... la función la uso en el RenderGraphics y tengo esto puesto en el rate:

ITimeSystem->SetRate(0,60);


he puesto SetRate a 0,20 y tp me dibuja la caja cuando ando hacia la izquierda y cuando he puesto la función de detección de la colisión en la detección de teclas pulsadas no se me veían las cajas nunca.

alguna idea??

gracias por adelantado

TheAzazel

EX3, como seguramente te vea este sabado...ya hablaremos :)

glglut, llegados a este punto... necesitaria el codigo compilable en el que sucede eso, ya sabes, como la otra vez, recorta todo lo demas y dejame solo lo necesario para reproducir ese efecto. De ese modo y si es un bug, podre depurar y reparar :)

Saludos!

(recuerdas mi mail no?)

[EX3]

Cita de: "TheAzazel"EX3, como seguramente te vea este sabado...ya hablaremos :)
ferPecto, este tema me tocara abordarlo en breve y me viene bien experiencias para ver donde pegar los tiros :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Loover

Para los que no podemos pasarnos... ¿podeis explicar algo más de ese tema?  Parece interesante. Lo único que sé que hay que evitar es limitar los FPS de dibujado, ¿no es así?

Yo demomento, la forma que más me gusta, es limitar los FPS de la lógica del juego a cierto número. Y dejar los FPS de dibujado sin limitar (a no ser que esté el vsync activado, claro). De esta forma el juego corre a la misma velocidad en todos los ordenadores y dibujando lo más fluídamente posible. Esto es lo que usamos en el California Office.

Otra forma que conocía es la de multiplicar la velocidad por el tiempo que ha tardado el último frame. Ejemplo:

PosX += Speed * LastFrameTime();

Suponiendo que PosX es la posición horizontal de un sprite, este se movería en todos los sistemas a la misma velocidad (speed), solo que en unos más suavemente que en otros (dependiendo de los FPS de dibujado que pueda obtener el ordenador en cuestión).

Yo de momento a la looverlib no le he metido nada de esto, lo dejo a elección del usuario. Excepto en las animaciones por sprite, en las que el usuario puede crear unos scripts en los que define los frames y secuencias con los mismos, y puede elegir cuanto tiempo se mostrará cada frame.

Pero vamos, me interesa saber cómo lo haceis vosotros.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

[EX3]

Cita de: "Loover"Otra forma que conocía es la de multiplicar la velocidad por el tiempo que ha tardado el último frame. Ejemplo:

PosX += Speed * LastFrameTime();

Suponiendo que PosX es la posición horizontal de un sprite, este se movería en todos los sistemas a la misma velocidad (speed), solo que en unos más suavemente que en otros (dependiendo de los FPS de dibujado que pueda obtener el ordenador en cuestión).
Si mal no recuerdo este se asemeja al metodo que nos explicaron en el seminario.

Cita de: "Loover"Pero vamos, me interesa saber cómo lo haceis vosotros.
Yo ahora mismo tengo implementado en mi libreria el control de fps con opcion a desactivarlo para no limitarlo. La otra forma conocida y que permite tambien mi libreria es activar el vSync, aunque el resultado puede ser similar al de controlar los fps solo que no tienes libertad de definir la frecuencia ya que dependera del monitor y su configuracion.

Salu2...

P.D.: Para no secuestrar mas el tema, que tal si abrimos un tema en el foro de programacion grafica para consultar con el resto del foro? :)
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

TheAzazel

Hace ya dos años que hice el sistema de animacion suave para los sprites de CRM32Pro pero si mal no recuerdo basicamente hacia esto:

- dos velocidades, una de render grafico(puedes poner los fps que quieras o no poner freno alguno) y otra de velocidad logica(asi ira igual de rapido en todos los pcs)

- si un objeto se mueve 10pixels cada "frame" logico(digamos 20 por segundo), se moveria 200pixels cada segundo pero de una forma ruda, cada 1/20 seg, se moveria 20pixels...

- usando una interpolacion lineal y una media de los ultimos segundos de la velocidad media de ejecucion de los frames graficos, lo que hago es dibujar pixel a pixel(en el mejor de los casos) ese objeto que se mueve de 20pixels en 20pixels.

- naturalmente, en algunos casos puede existir un pequeño "lag" pero es inapreciable respecto a lo que se gana, una suavidad tremenda y la posibilidad de poder trabajar con velocidades logicas muy bajas(incluso 10) siendo independiente de la velocidad grafica.

Cuando hice todo esto, estuve buscando y mirando intesivamente por inet y me parecio la mejor forma de hacerlo (me inspiro David Olofson y su ejemplo pig que podeis encontrar aqui: http://olofson.net/mixed.html, este tio y un par mas de maquis que he conocido gracias a SDL realmente son tremendos!).

Por cierto, estaria bien si abris un thread en otro sitio mas adecuado, como querais :)
Saludos






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.