Hacer un Salto?????

Solicite, consulte o publique recursos de referencia para desarrolladores.

Hacer un Salto?????

Notapor PLC » Mar Abr 15, 2008 9:48 pm

Necesito que alguien me facilite un ejemplo sencillo de como hacer un salto con el personaje, estuve viendo el ejemplo platforms pero esta muy alto el nivel para mi que empiezo ahora, trate de entenderlo pero que va.
PLC
 
Mensajes: 21
Registrado: Lun Feb 11, 2008 12:02 am

Notapor hugoruscitti » Mié Abr 16, 2008 10:39 pm

Es cierto, el ejemplo de plataformas es un tanto complejo. En parte porque
hace muchas cosas y en parte por estar escrito en C.

Estuve pensando la forma de hacer un ejemplo sencillo sobre como realizar
un salto y llegué a crear un programa en lenguaje python que te puede
servir. No es tan simple como quería, porque gran parte del código está
destinado a capturar eventos y manejarlos.

Desistí de la idea de crearlo en C porque sería aún mas código... si
utilizas C puedes intentar traducir este código a C, o usar directamente
python al menos por esta vez.

El programa muestra un rectángulo de color verde que se puede manejar con
los direccionales del teclado, pulsando la tecla "arriba" el cuadrado
hace un movimiento de "salto". Ojo, hay que mirarlo con un poco de
imaginación...

Imagen

Espero te resulte de utilidad, recuerda que es solo un ejemplo básico (se
pueden hacer cosas mas interesantes con python y pygame...):


Código: Seleccionar todo
# -*- encoding: utf-8 -*-
import pygame
from pygame.sprite import Sprite

NIVEL_SUELO = 200
COLOR_GRIS = (50, 50, 50)


class Personaje(Sprite):
    "Personaje rectangular que puede caminar y saltar."

    def __init__(self):
        Sprite.__init__(self)
        self.velocidad_inicial = 0
        self.crear_imagen_representacion()

    def crear_imagen_representacion(self):
        self.image = pygame.surface.Surface((30, 30))
        self.image.fill((100, 255, 100))
        self.rect = self.image.get_rect()
        self.rect.center = 160, 200

    def update(self):
        "Actualiza la posición del personaje en base al estado del teclado."

        teclas = pygame.key.get_pressed()

        if teclas[pygame.K_LEFT]:
            self.rect.move_ip(-4, 0)
       
        if teclas[pygame.K_RIGHT]:
            self.rect.move_ip(4, 0)

        # Salto
        if self.rect.bottom >= NIVEL_SUELO:
            self.rect.bottom = NIVEL_SUELO
           
            # solo evalúa un salto si está en el suelo.
            if teclas[pygame.K_UP]:
                self.velocidad_inicial = -10
                self.actualizar_salto()
        else:
            self.actualizar_salto()

    def actualizar_salto(self):
        # si está saltando actualiza su posición
        self.rect.y += self.velocidad_inicial
        self.velocidad_inicial += 0.5

    def draw(self, screen):
        "Muestra al personaje en pantalla."
        screen.blit(self.image, self.rect.center)



# Inicio del programa principal

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

while not salir:

    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            salir = True

    personaje.update()

    screen.fill(COLOR_GRIS)
    personaje.draw(screen)
    pygame.display.flip()

    pygame.time.delay(10)


Consultanos ante cualquier duda.

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

ok

Notapor PLC » Jue Abr 17, 2008 4:24 am

Era lo que me hacia falta ademas el ejemplo platforms que esta en la seccion de ejemplos del sitio no esta en c sino en python que es con lo que estoy trabajando de todas maneras y tambien esta un poquito complicado hacen hasta una clase salto y todo.

class Jumping (State):
"Representa el estado 'saltando'"

def __init__ (self, player, vy):
"Inicia un salto con velocidad inicial indicada por el parametro vy"

State.__init__ (self, player)
self.player.animation.set_frames ([5])
self.vy = vy

def update (self):
self.vy = self.vy + 0.1
dy = int (self.vy)
keys = pygame.key.get_pressed ()

if dy > 0:
dy = self.player.stage.get_floor_dist (self.player.x, self.player.y, int (self.vy))

"Ha tocado el suelo"
if dy == 0 and int (self.vy) != 0:
self.player.change_state (Normal (self.player))

if keys [K_LEFT]:
self.player.move_ip (-2, 0)
self.player.set_flip (True)
elif keys [K_RIGHT]:
self.player.move_ip (2, 0)
self.player.set_flip (False)

self.player.move_ip (0, dy)
PLC
 
Mensajes: 21
Registrado: Lun Feb 11, 2008 12:02 am

Notapor hugoruscitti » Jue Abr 17, 2008 3:42 pm

Ah, es cierto, está hecho en python... ya lo había olvidado.

Con respecto a la clase Salto, se ha creado como objeto para
que representar la acción y no "cargar" de variables auxiliares
al objeto del personaje.

Te comento un poco en que consiste representar las acciones
de un personaje mediante objetos: el objeto Player, que representa
al personaje, puede estar realizando distintos tipos de acciones:
"Saltar", "Correr" etc. Resulta muy conveniente "desacoplar" al
personaje en sí de la Acción que está realizando, porque de
esa manera es sencillo cambiar de acciones, crear estados
nuevos e incluso modificar uno existente.

En el último mensaje del siguiente "post" hablo algo acerca de
esta forma de agrupar estados. Se denomina "patrón estrategia":

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

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

Notapor lacabra25 » Jue Ago 07, 2008 12:41 am

Hola, he estado mirando el codigo en python, aunque no programo en ese lenguaje y he leido poco sobre el, pero quisiera ofrecer una solucion que es aplicable tanto a c como a python como a cualquier lenguaje, el movimiento del personaje podria realizarse mediante dos vectores, o incluso tres si quieren añadirle mas realismo y complicacion, uno para la posicion, otro para la velocidad y si quieren un tercero para la aceleracion (aunque la aceleracion es algo que podemos omitir para mover un personaje), teniendo las estructuras y variables preparadas para guardar los vectores seria tan simple como aplicar la fisica, si el parsonaje va a saltar, la volocidad tendra un modulo igual a la fuerza del salto, lo que va a avanzar en cada interaccion del bucle por ejemplo, y el angulo hacia donde va a saltar de forma que para actualizar la posicion simplemente tenemos que sumar la posicion y la velocidad ( P = P + V ), ovbiamente el vector de la velocidad lo dbemos tener controlado para que pasado un tiempo el personaje baje (no va a subir siempre, eso es volar XD) o incluso podemos en cada interaccion del bucle reducir el modulo del vertor de forma que se ralentize el salto hasta llegar a cero, cambiamos el angulo para que baje y lo empezamos a incrementar (con lo que ademas obtendriamos un pequeño efecto de gravedad).

Si quisieramos usar ademas el vector de aceleracion seria igual, ocparnos de cambiar el vector de aceleracion segun sea necesario y despues el vector velocidad lo actualizariamos en funcion del vector de la aceleracion y el de la posicion en funcion del de la velocidad.

No se que os parecera la solucion de los vectores, pero a mi me parece una buena solucion, aunque tambien depende del caso, yo estoy usando los vectores pero para un juego de tanques, para los propios tanques como para los misiles.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

colisiones

Notapor yasser_001200 » Lun Feb 01, 2010 7:32 pm

Hola, me gustarías que me explicaran cómo son las colisiones entre sprites mediante un ejemplo como el Tank ese de atari o un Space Invaders
Vienbeni2 a mi mundo....WAJAJAJAJAJA
yasser_001200
 
Mensajes: 46
Registrado: Lun May 19, 2008 3:28 pm

Notapor hugoruscitti » Mar Feb 02, 2010 1:31 am

hay un ejemplo llamado "invaders" creado por Juan
Guerrero que te puede servir:

http://www.losersjuegos.com.ar/referencia/ejemplos
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina


Volver a Artículos, traducciones y documentación

¿Quién está conectado?

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