Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
me hago un lio con los loops
#1
Question 
Hola buenas a todos, soy nuevo y empiezo, cómo no, con un problema :v
Recién hoy estoy aprendiendo pygame, seguí unos tutoriales pero como soy cabezón de tratar de hacerlo todo a mí manera, pues me he hecho un lío...

este es mi código completo:
Código:
#base importante
import pygame;
import time;
pygame.init();

##constantes
room_width = 800; #ancho de las rooms
room_height = 600; #altura de las rooms
rplay = pygame.display.set_mode((room_width,room_height));
pygame.display.set_caption("Snake_test1");
font = pygame.font.SysFont(None,25);

#funciones
def draw_text(msg,color):
    pantalla_texto = font.render(msg,True,color);
    rplay.blit(pantalla_texto,[room_width/2,room_height/2]);

#eventos????
def step():
    ##parametros generales
    fps = pygame.time.Clock(); #init fps
    room_speed = 30; #velocidad de la room (fps)
    game_end = False; #init para finalizar juego
    game_over = False; #init para fin del juego
        
    ##bgcolors
    blanco = (255,255,255);
    negro = (0,0,0);
    rojo = (255,0,0);

    ##snake vars
    snake_x = room_width/2; #init x
    snake_y = room_height/2; #init y
    snake_spd = 4; #velocidad
    snake_hspeed = 0; #init direccion horizontal
    snake_vspeed = 0; #init direccion vertical
    
    while not game_end:
        while not game_over == True:
            rplay.fill(blanco);
            draw_text("Para continuar pulsa ENTER | Para salir pulsa ESC",rojo);
            pygame.display.update();

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        game_end == True;
                        game_over = False;
                    if event.key == pygame.K_RETURN:
                        step();
                        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_end = True;
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                snake_hspeed = -snake_spd;
                snake_vspeed = 0;
            if event.key == pygame.K_RIGHT:
                snake_hspeed = snake_spd;
                snake_vspeed = 0;
            if event.key == pygame.K_UP:
                snake_hspeed = 0;
                snake_vspeed = -snake_spd;
            if event.key == pygame.K_DOWN:
                snake_hspeed = 0;
                snake_vspeed = snake_spd;

        if snake_x < 0 or snake_x >= room_width or snake_y < 0 or snake_y >= room_height:
            game_end = True;

        snake_x += snake_hspeed;
        snake_y += snake_vspeed;
        rplay.fill(blanco);
        pygame.draw.rect(rplay,negro,[snake_x,snake_y,10,10]);
        
        pygame.display.update();
        fps.tick(room_speed);

    pygame.quit();
    quit();
step(); #fin del evento step

el caso es que todo funciona menos los bucles para empezar a jugar o salir... según el tutorial, debería de empezar viéndose el rectangulo "snake" en sus coordenadas, y cuando te sales de la pantalla, entonces salir el mensaje de "pulsa ENTER blablabla...", pero en vez de eso, me sale directamente el cartel ese y además, no me funcionan las teclas K_RETURN y K_ESCAPE... a qué se debe?

Disculpen si me explico mal, disculpen si no soy tan especifico... tengo experiencia en el lenguaje GML del programa Game Maker Studio y trato de adaptarme a este nuevo lenguaje, intentando simular mi manera de trabajar en GM... Y acabo de hacer un fail y no encuentro el por qué... ya que no me sale ningún mensaje de error :S No estoy nada acostumbrado a los bucles que controlan todo el juego.. eso siempre me lo dieron masticado Sad

Buenos días a tod@s, yo soy Juan (Kostra o Sobako para los amigos), tengo 28 años y soy de Barcelona, un abrazo a todos y gracias de antebrazo! :B
Responder
#2
Hola Juan, bienvenido.

Nunca usé el lenguaje GML, pero mi recomendación es que, si estás interesado, aprendas Python de forma independiente para luego poder aplicarlo al desarrollo de videojuegos con PyGame. Intentar replicar lo que hacías en GML al pie de la letra en Python no es una buena idea.

Respecto al código, te hago las siguientes observaciones:
  • No es necesario que uses un nuevo bucle para mostrar la pantalla que el juego ha terminado.
  • Estás llamando a la función step() dentro de ella misma, lo que genera un bucle infinito.
  • Solo deberías recorrer el bucle de los eventos una vez.
  • No es necesario finalizar las líneas de código con un punto y coma.
Con estos cambios tu función quedaría algo así:

Código:
def step():
    ##parametros generales
    fps = pygame.time.Clock(); #init fps
    room_speed = 30; #velocidad de la room (fps)
    game_end = False; #init para finalizar juego
    game_over = False; #init para fin del juego
        
    ##bgcolors
    blanco = (255,255,255);
    negro = (0,0,0);
    rojo = (255,0,0);

    ##snake vars
    snake_x = room_width/2; #init x
    snake_y = room_height/2; #init y
    snake_spd = 4; #velocidad
    snake_hspeed = 0; #init direccion horizontal
    snake_vspeed = 0; #init direccion vertical
    
    while not game_end:
        if game_over:
            rplay.fill(blanco);
            draw_text("Para continuar pulsa ENTER | Para salir pulsa ESC",rojo);
                        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_end = True;
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                snake_hspeed = -snake_spd;
                snake_vspeed = 0;
            elif event.key == pygame.K_RIGHT:
                snake_hspeed = snake_spd;
                snake_vspeed = 0;
            elif event.key == pygame.K_UP:
                snake_hspeed = 0;
                snake_vspeed = -snake_spd;
            elif event.key == pygame.K_DOWN:
                snake_hspeed = 0;
                snake_vspeed = snake_spd;
            elif game_over and event.key == pygame.K_ESCAPE:
                break
            elif game_over and event.key == pygame.K_RETURN:
                game_over = False
                continue

        if snake_x < 0 or snake_x >= room_width or snake_y < 0 or snake_y >= room_height:
            game_end = True;

        snake_x += snake_hspeed;
        snake_y += snake_vspeed;
        rplay.fill(blanco);
        pygame.draw.rect(rplay,negro,[snake_x,snake_y,10,10]);
        
        pygame.display.update();
        fps.tick(room_speed);

    pygame.quit();
    quit();

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
gracias por responder, me ayudó un amigo que casualmente sabe python, yo no sabía, y me dijo que el error estaba en el game_over que lo puse en False en vez de en True, pero aun que yaa funcionaba, no funcionó como yo me esperaba...

El lenguaje python ya lo toquéh hace tiempo y lo abandoné porque ya estaba harto de usar una consola y quería pasar al siguiente nivel, usando displays, una ventana con draws y sprites... no la clásica ventana negra de letras blancas... eso ya lo tengo muy aborrecido, las bases de lógica para programar las tengo y el código que voy escribiendo lo voy entendiendo, el error que tuve fue no seguir al pie de la letra el tutorial y tratar de adelantarme a mí manera xDD

PD: el punto y coma lo pongo por inercia, soy un perfeccionista de buenos hábitos, por eso me interesó python, por que me obliga a ser ordenado, además, el punto y coma tampoco molesta xDD

Gracias por responder. No se me solucionó el tema del todo pero no importa no hace falta que sigan respondiendo, empezaré de nuevo con otro, y luego con otro y luego con otro... hasta que asimile las estructuras, ya entonces me pondré a escribir mi lista de finciones para adaptarlo a mi estilo de trabajo, me alegra que pygame use eventos, ya que así es como funciona GML, así que no está tan alejada la idea que tengo jaja, trataré de hacerme una especie de template :V

Gracias y nos vemos en otra, el foro ya lo tengo en favoritos ^^
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)