/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Movimiento de Rayo en SDL

 
      Índice del Foro elrincondelc.com -> Gráficos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Anastacius



Registrado: 26 Oct 2013
Mensajes: 41

MensajePublicado: 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

MensajePublicado: 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 Wink
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
Dirección AIM
Anastacius



Registrado: 26 Oct 2013
Mensajes: 41

MensajePublicado: 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

MensajePublicado: 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
Dirección AIM
      Índice del Foro elrincondelc.com -> Gráficos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com