2015-11-28 4 views
0

Итак, я делаю простой «Dodge the Meteor Game» с Python 27 и Pygame. Итак, все прошло гладко, пока я не хотел создавать классы, поэтому я мог бы делать несколько метеоров без повторного ввода одного и того же кода. После этого, когда я запустил его, он перестает отвечать на сообщения без ошибок. Вот мой код:Проблемы с классами Python

import pygame 
from pygame.locals import * 
import sys 
import random 

pygame.init() 

width,height = 800,600 

gameDisplay = pygame.display.set_mode((width,height)) 
pygame.display.set_caption("Fifteen Minute Game ") 
gameStart = False 

bg = pygame.image.load("C:\Users\DEREK\Desktop\Python\\space.jpg") 
bg = pygame.transform.scale(bg,(900,600)) 

x = 300 
y = 300 
move_x = 0 
move_y = 0 

playerspeed = 3 

pellet_x = random.randint(0,800) 
pellet_y = random.randint(0,550) 

player = pygame.draw.rect(gameDisplay, (255,255,255), (x,y,30,30)) 
pellet = pygame.draw.rect(gameDisplay, (255,255,255),  (pellet_x,pellet_y,15,15)) 

count = 0 

#Functions 
def pelletxy(): 
    global pellet_x, pellet_y 
    pellet_x = random.randint(0,770) 
    pellet_y = random.randint(0,570) 

def collision(rect1,rect2): 
    global player, count, pellet 
    if rect1.colliderect(rect2): 
     if rect2 == pellet: 
      pelletxy() 
      count +=1 

class Meteor(): 
    def __init__(self): 
     self.meteor_x = random.randint(0,800) 
     self.meteor_y = 0 
     self.meteorfall = 3 
     self.meteor = pygame.draw.rect(gameDisplay, (255,255,255), (self.meteor_x,self.meteor_y,35,35)) 

    def collision(self,rect1,rect2): 
     if rect1.colliderect(rect2): 
      if rect2 == self.meteor: 
       print "Good Game" 
       print "MUA HAHAHAHA" 
       print "" 
       print "Your score:" + str(count) 
       pygame.quit() 
       sys.exit() 

    def meteorxy(self): 
     self.meteor_x = random.randint(0,800) 
     self.meteor_y = 0 

    def render(self): 
     self.meteor_y += self.meteorfall 
     self.meteor 
     if meteor_y > 600: 
      meteorxy() 

m1 = Meteor()  

#Game Loop 
while gameStart: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 
     # Keyboard Movement 
     if event.type == pygame.KEYDOWN: 
      if event.key == K_UP: 
       move_y -= playerspeed 
      if event.key == K_DOWN: 
       move_y += playerspeed 
      if event.key == K_LEFT: 
       move_x -= playerspeed 
      if event.key == K_RIGHT: 
       move_x += playerspeed 

     if event.type == pygame.KEYUP: 
      if event.key == K_UP: 
       move_y = 0 
      if event.key == K_DOWN: 
       move_y = 0 
      if event.key == K_LEFT: 
       move_x = 0 
      if event.key == K_RIGHT: 
       move_x = 0 

#Calculate new position 
x = x + move_x 
y = y + move_y 

#Stop Movement on boundaries 
if x > 830: 
    x = -30 
elif x < -30: 
    x = 830 
elif y < -30: 
    y = 630 
elif y > 630: 
    y = -30 

#Check Different Collision Scenarios 
collision(player, pellet) 
m1.collision(player, m1.meteor) 

#Draw the things onto the screen 
gameDisplay.blit(bg,(0,0)) 

player = pygame.draw.rect(gameDisplay, (255,255,255), (x,y,30,30)) 

pellet_outline = pygame.draw.rect(gameDisplay, (255,255,255), ((pellet_x - 1), (pellet_y - 1), 17,17)) 
pellet = pygame.draw.rect(gameDisplay, (0,0,255), (pellet_x,pellet_y,15,15)) 

m1.render 

pygame.display.update() 

Я не знаю, что я делаю неправильно, но я знаю, что это с классами. Заранее спасибо

Хобби программист, Дерек

+0

Как вы «знаете это с классами»? Тот факт, что он «перестает отвечать без сообщения об ошибке», подсказывает мне, что вы можете застревать в бесконечном цикле. Что произойдет, если вы разместите несколько операторов печати в разных местах ваших циклов 'while' /' for'? –

+1

Спасибо, Это было с циклом while. Я случайно установил переменную gamestart как False. Все работает, но не появляются метеоры, когда я запускаю его. –

+0

Я нашел решение своей проблемы. Это была неосторожная ошибка, поскольку я забыл поставить() после функции m1.render(). Но спасибо за поддержку! –

ответ

1
if event.key == K_RIGHT: 
    move_x = 0 

#Calculate new position 
x = x + move_x 
y = y + move_y 

Посмотрите, как изменения отступа? В Python отступы очень важны. Поскольку весь ваш код после строки «move_x = 0» не имеет отступов, он не является частью цикла while; поэтому он не выполняется в цикле. Исправьте свой отступ.

+0

Я забыл вставить его во время копирования кода, но у меня есть его на оригинале. Но он все еще не работает. –

1

Ну, это, вероятно, потому, что gameStart всегда False. Таким образом, вы никогда не попадаете в игровой цикл.

Вы должны ознакомиться с отладкой. Вы можете использовать pdb или любую IDE, такую ​​как Eclipse. Важно то, что он может помочь вам понять, какой код работает.