2016-05-06 4 views
0

Я пытаюсь создать платформер, а в приведенном ниже коде я пытаюсь переместить одно изображение ('bird.png') на задний план. Однако каждый раз, когда я пытаюсь запустить pygame, он падает, даже не загружая изображения. Я проверил другие страницы и все еще не исправил проблему. Вероятно, в коде есть несколько ошибок, но я не могу проверить, работает ли он правильно, потому что, как я уже сказал, pygame продолжает сбой. Есть ли что-нибудь, что я могу сделать, чтобы исправить это?Python pygame crashing, исправления, похоже, не работают

PS. Извините, если это немного грязный, и для французских слов в коде :)

import pygame 
from pygame import * 

pygame.init() 

TE=[] 

def perso(X): 
    X = [0,448] 
    while X != [640,0]: 
     w=int(input("Déplacement: ")) 
#Right# 
     if w==0: 
       if X[1] == 608: 
        print("You can't leave the map") 
       else:  
        X[1] += 32 
        print(X)  
#Left# 
     elif w==1: 
       if X[1] == 0: 
        print("You can't leave the map") 
       else: 
        X[1] -= 32 
        print(X)  
#Down# 
     elif w==2: 
       if X[0] == 456: 
        print("You can't leave the map") 
       else: 
        X[0] += 24 
        print(X)  
#Up# 
     elif w==3: 
       if X[0] == 0: 
        print("You can't leave the map") 
       else: 
        X[0] -= 24 
        print(X) 
     else: 
       print("non valable") 
    print("Bravo!") 

screen = pygame.display.set_mode((680, 488)) background_image = pygame.image.load("C:/Python34/Scripts/Images & Sounds/background(680x480).jpg").convert() 
screen.blit(background_image,[0,0]) 

character = pygame.image.load("C:/Python34/Scripts/Images & Sounds/bird(40x40).png").convert() 
screen.blit(character, (X[0],X[1])) 

perso(TE) 


flag 

Я бегу код и когда откроется окно Pygame, он черный, и через несколько секунд я получаю сообщение «не отвечает» (для окна pygame). Тем не менее, часть w=int(input("Déplacement: ")), похоже, работает, поскольку она запрашивает ввод. Может быть, это как-то связано с изображениями?

+1

Что вы имеете в виду, врезавшись - вы должны дать конкретный код исключения вы испытываете – PyNEwbie

+0

Я бегу код и когда откроется окно Pygame, он черный, и через несколько секунд я получаю «не отвечает» сообщение (для окна pygame). Тем не менее, «w = int (элемент« Déplacement: »)), похоже, работает, поскольку он запрашивает ввод. Может быть, это как-то связано с изображениями? – WildLlamas

+0

У вас есть ** ** цикл с потенциально невыполненным условием. Я подозреваю, что. Добавить **, а не 640 штук и cntr <100 **. Затем в цикле будет ** cntr + = 1 ** и ** cntr = 0 ** перед циклом. –

ответ

1

Один из простейших игровых циклов состоит из последовательности «обновления» и последовательности «рендеринга», которые вызывается каждый раз через цикл. Обе эти последовательности должны занимать очень мало времени для завершения (чем быстрее, тем лучше). Возможно, что функция Python, встроенная в функцию input, останавливает последовательность «обновления» и приводит к сбою игры, поскольку она не может продолжить цикл.

Самый простой способ решить эту проблему - просто использовать встроенные методы ввода Pygame. Также неплохо разбить последовательности «рендеринга» и «обновления», чтобы отличить логику игры и рендеринг изображений.

import pygame 
from pygame import * 

pygame.init() 

screen = pygame.display.set_mode((680, 488)) 
background_image = pygame.image.load("C:/Python34/Scripts/Images & Sounds/background(680x480).jpg").convert() 
character = pygame.image.load("C:/Python34/Scripts/Images & Sounds/bird(40x40).png").convert() 

def move(X): 
    keys = pygame.get_pressed() 
    #Right# 
    if keys[pygame.K_RIGHT] != 0: 
     if X[1] == 608: 
      print("You can't leave the map") 
     else:  
      X[1] += 32 
      print(X)  
    #Left# 
    elif keys[pygame.K_LEFT] != 0: 
     if X[1] == 0: 
      print("You can't leave the map") 
     else: 
      X[1] -= 32 
      print(X)  
    #Down# 
    elif keys[pygame.K_DOWN] != 0: 
     if X[0] == 456: 
      print("You can't leave the map") 
     else: 
      X[0] += 24 
      print(X)  
    #Up# 
    elif keys[pygame.K_UP] != 0: 
     if X[0] == 0: 
      print("You can't leave the map") 
     else: 
      X[0] -= 24 
      print(X) 
    else: 
     print("non valable") 

    return X 


def draw(X): 
    screen.blit(background_image,[0,0]) 
    screen.blit(character, (X[0],X[1])) 

Running = True 
X = [0,448] 
while Running: 

    # Updated and draw 
    X = move(X) 
    draw(X) 

    # Allow for the user to exit the game 
    for i in pygame.event.get(): 
     if i.type==QUIT: 
      Running = False 
      exit() 

    # End the game if 
    if X == [640, 0]: 
     Running = False 
     exit() 
+0

Привет, спасибо кучу. Однако у меня есть некоторые вопросы о вашем коде (я довольно новичок в python). Кажется, что ошибка с «X = move (X)», поскольку она говорит, что X не определен. Как это исправить? Еще раз спасибо. – WildLlamas

+0

Нет проблем. Я не смог проверить код выше, поэтому я знал, что будут ошибки, если он будет использован дословно. Вы получаете ошибку там, потому что X не был инициализирован, прежде чем использовать его в функции перемещения. Добавьте 'X = [0,448]' над циклом while и эта ошибка должна исчезнуть. –

Смежные вопросы