| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Anastacius
Registrado: 26 Oct 2013 Mensajes: 41
| Publicado: 17/01/2014 8:18 pm | | | Título: Movimiento de Rayo en SDL |
| Hola a todos
Les hablo por un problema que estoy teniendo en el juego que estoy diseñando...
Uno de los personajes tiene un ataque, el cual es un rayo que sale desde su mano (esa parte es simple), se extiende desde ella y golpea al objetivo (quiza aqui ya notaron el problema)
Normalmente, para movilizar ataques, yo solo elevo o disminuyo las variables de posicion, y ya... pero ahora, necesito que el rayo se extienda... podria hacerlo con unos 10 sprites para que quedase mas o menos, pero se me hace un lio. No es imposible de hacerlo asi, pero estoy seguro de que gente con mas experiencia tiene alguna idea mejor...
No tengo problema con el dibujo, consegui unos pinceles de GIMP buenisimos para eso...
Bueno, muchas gracias de antemano... _________________ Programacion en C - HTML - Batch - Aprendiendo : Java... |
| | Volver arriba | |  | daltomi
Registrado: 28 Abr 2007 Mensajes: 335 Ubicación: Argentina
| Publicado: 19/01/2014 6:53 am | | | Título: |
| Buenas.
Podrías implementarlo utilizando primitivas, por ejemplo líneas. Ejemplo:Lightning Generator De ésta manera podrías tener varios tipos de ataques dependiendo de la fuerza del personaje. Por ejemplo, un sólo rayo porque le queda poca energía o muchos en caso contrario. Además necesitas sólo 2 puntos de coordenadas. SDL tiene funciones para dibujar líneas: lineColor, lineRGBA, etc.
La otra manera es como dices, utilizando alguna imagen. Una técnica que he visto utiliza sólo 3 texturas, asi: <->, y durante el juego queda asi: <--------->, es decir la del medio es la que se extiende. Generalmente se utiliza una superficie off-screen, es decir aparte de la principal, que sirve para crear el efecto y luego volcar de una a la pantalla. Por ejemplo, si el personaje lanza un ataque se dibuja "<" y mientras no exista colisión se dibuja "-" tantas veces hasta que se reciba el estado de colisión, ahí se termina con ">".
| Código: | Ataque Colision off-screen pantalla ------ -------- ---------- --------- no no si no < < si no <- <- si no <-- <-- si no <--- <--- si si <---> <--->
|
Por si te interesa implementar el efecto rayos de Lightning Generator; en 5 min. con Love2D 
| Código: | local k_rayos = 8 -- número de rayos local k_detalle = 1 -- 1 como máx. detalle local k_desplazar = 100
function love.load() love.graphics.setLineWidth(2) love.graphics.setColor( 55 , 55, 255) end
function love.update(dt) cursor_x, cursor_y = love.mouse.getPosition() end
function love.draw() love.graphics.clear() for i=1, k_rayos do dibujar_rayos(120, 120, cursor_x, cursor_y, k_desplazar) end
end
function dibujar_rayos(x1, y1, x2, y2, desplazar) if desplazar < k_detalle then love.graphics.line(x1, y1, x2, y2) else local mid_x = ( (x2 + x1) / 2 ) + (love.math.random() - 0.5) * desplazar local mid_y = ( (y2 + y1) / 2 ) + (love.math.random() - 0.5) * desplazar dibujar_rayos(x1, y1, mid_x, mid_y, desplazar / 2) dibujar_rayos(x2, y2, mid_x, mid_y, desplazar / 2) end end
|
Resultado:
La func. dibujar_rayos se puede adaptar de manera fácil a OpenGL o SDL.
Saludos. |
| | Volver arriba | |  | Anastacius
Registrado: 26 Oct 2013 Mensajes: 41
| Publicado: 14/02/2014 6:32 pm | | | Título: |
| Muchas gracias por la explicacion daltomi, disculpame por responder tan tarde, es que queria asegurarme que funcionase antes de responder...
Diseñe el rayo...
Primero, intente con una biblioteca de primitivas, llamada SDL_Draw... no hubo forma de instalarla en el Dev C...
Luego, intente tu tecnica... pero no descubri como hacer para imprimir dos veces el mismo sprite en la misma iteracion...acaso necesito mas de un SDL Rect para eso?
Entonces, hice un rayo en Gimp, lo trocee en unos cuantos pedazos, desde un rayo en nacimiento hasta que esta completo. Entonces, hago que pase como secuencia una tras otra y funciona... pero seguro esta tecnica tuya ha de ser mejor, y me gustaria implementarla en futuros trabajos... me explicas el tema de como blitear dos veces en la misma iteracion el mismo sprite en diferente posicion?
gracias por tu ayuda, ha sido genial _________________ Programacion en C - HTML - Batch - Aprendiendo : Java... |
| | Volver arriba | |  | | daltomi
Registrado: 28 Abr 2007 Mensajes: 335 Ubicación: Argentina
| Publicado: 15/02/2014 4:23 pm | | | Título: |
| Buenas. Una muestra de lo que me refería (click para ampliar):
La imagen pequeña es la textura, ubicada en un SDL_Surface; en mi post anterior dije 3 pero era para dejar en claro que son 3 imágenes diferentes ha usar, pero realmente es un sólo archivo de imagen. La imagen que se expande tiene su propio SDL_Surface trabajando como off-screen. Se dibuja en ésta la textura creando la animación. Mientras tanto se dibuja el off-screen a la pantalla.
| Anastacius escribió: | | Luego, intente tu tecnica... pero no descubri como hacer para imprimir dos veces el mismo sprite en la misma iteracion...acaso necesito mas de un SDL Rect para eso? |
Si, necesitas 2, una como origen de la textura y otra como destino hacia el off-screen, pero además el off-screen hacia la pantalla también podría tener sus coordenadas.
Muy resumido (en SDL 2 ):
| Código: | SDL_Surface* gScreen = NULL; // pantalla SDL_Surface* gTexture = NULL; // textura constante SDL_Surface* gOffScreen = NULL; // off-screen
|
Se crea la textura:
| Código: | gTexture = IMG_Load("rayo.png");
|
Dos coordenadas para la textura + off-screen.
| Código: | SDL_Rect src{0,0,14,16}; // desde la textura SDL_Rect dst{10,23,0,0}; // hacia el off-screen
|
Y lo demás:
| Código: |
// Parte de la texture al off-screen SDL_BlitSurface(gTexture, &src, gOffScreen, &dst); src.x = 14; dst.x += src.w;
// inventé una colisión. if ( dst.x > 300 ) { // dibujar el final de la textura. src.x = 30; SDL_BlitSurface(gTexture, &src, gOffScreen, &dst); // Reset src.x = 0; dst.x = 10; }
// todo el off-screen a pantalla SDL_BlitSurface( gOffScreen, NULL, gScreen, NULL );
// Limpiar off-screen if ( src.x == 0){ SDL_FillRect(gOffScreen,NULL,0); }
|
Ni mejor, ni más optimo, es sólo un ejemplo. Saludos. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |