imitar efecto de la gravedad en un juego

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

imitar efecto de la gravedad en un juego

Notapor wellingtom » Mié Ene 02, 2008 1:30 am

imitar efecto de la gravedad en un juego... se trata de una caracteristica "comun" en los juegos, desde hace varios años,
pero yo, como estoy comenzando con sdl, y practicamente con la programacion en general, no sé como hacerlo aun. (sé C y C++)

ejemplo...
el personaje principal del juego, se encuentra en las coordenadas x-0 e y-433 (parte inferior izquierda de la pantalla)... cuando puye "arriba" (SDLK_UP) el personaje salta, pero luego debe bajar, hasta el suelo, supongo (cood = y-0)...

un amigo de noruega me dió las bases...
Código: Seleccionar todo

/* code */

if(xspeed>0)
             xspeed--;
        if(xspeed<0)
             xspeed++;
        if(yspeed>0)
             yspeed--;
        if(yspeed<0)
             yspeed++;

      //luego...
       
        x+=xspeed;
        y+=yspeed;

     //y luego...

        keys = SDL_GetKeyState(NULL);

      if(keys[SDLK_UP]==1){y+=5;}        //pero no sé
      if(keys[SDLK_DOWN]==1){y-=5}    // qué hacer con
      if(keys[SDLK_LEFT]==1){x-=5;}     // xspeed y yspeed
      if(keys[SDLK_RIGHT]==1){x+=5;}




agradecería que me ayudaran, y si pueden darme ejemplos, etc....
gracias...
PLIP PLOP!!
wellingtom
 
Mensajes: 3
Registrado: Dom Dic 16, 2007 3:25 am
Ubicación: venezuela

Re: imitar efecto de la gravedad en un juego

Notapor kittie4man » Mié Ene 02, 2008 4:35 pm

wellingtom escribió:imitar efecto de la gravedad en un juego... se trata de una caracteristica "comun" en los juegos, desde hace varios años,
pero yo, como estoy comenzando con sdl, y practicamente con la programacion en general, no sé como hacerlo aun. (sé C y C++)

...

agradecería que me ayudaran, y si pueden darme ejemplos, etc....
gracias...


En la seccion ejemplos de la web esta este articulo que tal vez te ayude.

http://www.losersjuegos.com.ar/referenc ... dad.tar.gz
Descripción: Aplica un efecto de aceleración gravitatoria muy simple.

Tendras que mirar e interpretar el codigo o esperar a que hugo (que es el creador del ejemplo) te explique ya que yo no lo vi el ejemplo.

Salu2
JuanPablo
kittie4man
 
Mensajes: 10
Registrado: Vie Dic 28, 2007 7:23 pm
Ubicación: Uuuuuuuuuuuuuuuuunoooooo!!

Notapor hugoruscitti » Mié Ene 02, 2008 6:04 pm

Saludos, veo que hay varias formas de lograr ese efecto
de caída. Anteriormente en el foro se comentó como lograr este
efecto:

http://www.losersjuegos.com.ar/foro/viewtopic.php?t=175

Pero, como hay muchas formas de lograr el mismo efecto, aprovecharé
este mensajes para que veamos una alternativa (que se parecerá
un poco más al código que nos muestras).

Puedes imaginar que tu personaje se encuentra (casi en todo momento)
impulsado hacia abajo, como sí la aceleración gravitatoria lo estuviera
obligando a aumentar su coordenada 'y'. Dentro del bucle de juego
tienes algo como lo siguiente:

Código: Seleccionar todo
y += dy


donde 'dy' representaría la velocidad que lo lleva hacia abajo, e 'y'
la posición de los pies de tu personaje.

A medida que el personaje cea, su velocidad se debe acelerar. Por ese
motivo vamos a aumentar el valor de 'dy' a medida que el personaje
permanece en el aire:

Código: Seleccionar todo
dy += 0.02


Entonces, para ejemplificarlo con un gráfico, el personaje comienza a
'saltar' cuando el valor de 'dy' es negativo (digamos -20), a medida
que se repite el bucle de juego, 'dy' crece:

Imagen

Por supuesto, esta es una representación muy básica del efecto
físico; pero aún así, sirve para realizar un juego sin problemas.

Te dejo un programa de prueba de esto realizado en python; el programa
muestra un rectángulo rojo que se puede manejar con las flechas del
teclado: al pulsar hacia arriba el cuadrado 'salta':

Imagen

Código: Seleccionar todo
# -*- encoding: utf-8 -*-
import pygame
from pygame import QUIT, K_LEFT, K_RIGHT, K_UP

screen = pygame.display.set_mode((320, 240))
salir = False

color_negro = (0, 0, 0)
color_rojo = (200, 0, 0)

# variables del personaje
personaje = pygame.Rect((0, 0, 30, 30))
dy = 0
x = 40
y = 200
GRAVEDAD = 0.02

# linea horizontal que representa el suelo
pos_suelo = 200

while not salir:

    # Actualización de eventos
    for e in pygame.event.get():
        if e.type == QUIT:
            salir = True

    # Actualización del personaje
    key = pygame.key.get_pressed()

    # movimientos horizontales
    if key[K_LEFT]:
        x -= 1
    elif key[K_RIGHT]:
        x += 1

    # animación de salto
    if dy == 0:               # si está en el suelo..."
        if key[K_UP]:
            dy = -2
    else:
        y += dy                  # empuja el personaje hacia abajo
        dy += GRAVEDAD           # y acelera su caida

        if y > pos_suelo:        # detiene la caida en el suelo
            dy = 0
            y = pos_suelo

    # aplica la posición al personaje
    personaje.bottom = int(y)
    personaje.centerx = int(x)

    # Actualización gráfica
    screen.fill((200, 200, 200))
    pygame.draw.line(screen, color_negro, (0, pos_suelo), (320, pos_suelo))
    screen.fill(color_rojo, personaje)
    pygame.display.flip()

    # Espera un instante
    pygame.time.wait(1)



Copia este código en un archivo de extensión .py y luego ejecuta
"python archivo.py".

A principio puede ser un poco difícil comprender como funciona el
ejemplo, porque la esencia del funcionamiento está en el valor que
toman las variables dentro del bucle. Te recomiendo hacer un seguimiento
paso a paso de las varibles 'dy' e 'y', crear un tabla en papel suele
ser la mejor forma de seguirlo. Algo así:

Código: Seleccionar todo
  dy   |   y
----------------
-10   |  200
-9.5  |  190
-9    |  180.5
[...] |  [...]


parece mucho trabajo, pero una vez que lo comprendes podrás hacer
muchos efectos interesantes en tus juegos, como interpolaciones
y transformaciones.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron