Pygame似乎“避免”循环

Pygame似乎“避免”循环

问题描述:

我刚刚开始使用Pygame,我正在尝试一些基本的移动功能。Pygame似乎“避免”循环

当我尝试将我的移动条件编码到我的对象类而不是游戏循环中时遇到了问题。

我这工作的第一次尝试如下:

classes.py:

import pygame, sys 
from pygame.locals import * 
class GameObject: 
    def __init__(self, image, height, speed): 
     self.speed = speed 
     self.image = image 
     self.pos = image.get_rect().move(0, height) #initial placement 

    def move_south(self): 
     self.pos = self.pos.move(0, self.speed) 
     if self.pos.right > 600: 
      self.pos.left = 0 

    def move_east(self): 
     self.pos = self.pos.move(self.speed , 0) 
     if self.pos.right > 600: 
      self.pos.left = 0 

main.py:

import pygame, sys 
from pygame.locals import * 
from classes import * 

screen = pygame.display.set_mode((640, 480)) 
#Importing Chars 
player = pygame.image.load('green_hunter_small.png').convert() 
#player.set_alpha(100) #makes whole player transparent 
player.set_colorkey((0,0,0)) #sets background colour to transparent 

ennemi = pygame.image.load('red_hunter_small.png').convert() 
ennemi.set_colorkey((0,0,0)) 

background = pygame.image.load('grass_map_640x640.png').convert() 
screen.blit(background, (0, 0)) 
objects = [] 
objects.append(GameObject(player, 80, 0)) 
for x in range(2):  #create 2 objects 
    o = GameObject(ennemi, x*40, 0) 
    objects.append(o) 
while True: 
    for event in pygame.event.get(): #setting up quit 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     if event.type == KEYDOWN: 
      if event.key == K_DOWN: 
       for o in objects: 
        screen.blit(background, o.pos, o.pos) #erases players by bliting bg 
       for o in objects: 
        o.speed = 4 
        o.move_south() #moves player 
        o.speed = 0 
        screen.blit(o.image, o.pos) #draws player 
      if event.key == K_RIGHT: 
       for o in objects: 
        screen.blit(background, o.pos, o.pos) #erases players by bliting bg 
       for o in objects: 
        o.speed = 4 
        o.move_east() #moves player 
        o.speed = 0 
        screen.blit(o.image, o.pos) #draws player      
    pygame.display.update() 
    pygame.time.delay(50) 

我没有工作第二次尝试与DP :

classes.py:

import pygame, sys 
from pygame.locals import * 

class GameObject: 
    def __init__(self, image, height, speed): 
     self.speed = speed 
     self.image = image 
     self.pos = image.get_rect().move(0, height) #initial placement 

    def move_south(self): 
     self.pos = self.pos.move(0, self.speed) 
     if self.pos.right > 600: 
      self.pos.left = 0 

    def move_east(self): 
     self.pos = self.pos.move(self.speed , 0) 
     if self.pos.right > 600: 
      self.pos.left = 0 

    def move(self): 
     for event in pygame.event.get(): 
      if event.type == KEYDOWN: 
       if event.key == K_DOWN: 
        screen.blit(background, self.pos, self.pos) #erases players by bliting bg 
        self.speed = 4 
        self.move_south() #moves player 
        self.speed = 0 
       if event.key == K_RIGHT: 
        screen.blit(background, self.pos, self.pos) #erases players by bliting bg 
        self.speed = 4 
        self.move_east() #moves player 
        self.speed = 0 
       screen.blit(self.image, self.pos) #draws player 

main.py:

import pygame, sys 
from pygame.locals import * 
from classes import * 

screen = pygame.display.set_mode((640, 480)) 
#Importing Chars 
player = pygame.image.load('green_hunter_small.png').convert() 
#player.set_alpha(100) #makes whole player transparent 
player.set_colorkey((0,0,0)) #sets background colour to transparent 

ennemi = pygame.image.load('red_hunter_small.png').convert() 
ennemi.set_colorkey((0,0,0)) 

background = pygame.image.load('grass_map_640x640.png').convert() 
screen.blit(background, (0, 0)) 
objects = [] 
objects.append(GameObject(player, 80, 0)) 
for x in range(2):  #create 2 objects 
    o = GameObject(ennemi, x*40, 0) 
    objects.append(o) 
while True: 
    for event in pygame.event.get(): #setting up quit 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
    for o in objects: 
     o.move()   
    pygame.display.update() 
    pygame.time.delay(50) 

如此看来,代码斗争去检查从实例事件循环。我想将运动编码为一种方法而不是直接编码的原因是为了节省空间,并且稍后添加字符变得更加容易。

+0

只是想让你知道,我认为这是一个很好的尝试和假设的问题。我在火车上,现在无法解决这个问题,但这对于一个“初学者”来说尤其是个好问题, – Torxed

+0

谢谢您的评论。我已经做了一些更多的工作,并且感谢其他评论意识到它更好一点。我改变了我的系统,将我的玩家的位置与鼠标位置进行比较,并使玩家向点击位置移动。目前,我被卡住了,因为尽管我的新系统能够正常工作,但我必须点击很多才能将它移动到点击位置。理想情况下,我希望它继续向自己的点击位置移动。 – Sorade

+0

@Sorade需要点击很多是一个单独的问题,应该[单独提问](http://*.com/questions/ask) – ppperry

你的代码有一个竞争条件(使用这个术语非常松散)。

您的角色没有移动的原因是第一个pygame.event.get调用(当您检查QUIT事件时)会占用队列上的所有KEYDOWN事件。然后(除非您在第一个循环运行时按下某个键),则当第一个GameObject检查事件时,队列中不会有KEYDOWN事件。 Diddo其他所有GameObjects

你需要在一个循环中处理所有的pygame事件。示例代码:

class GameObject(): 
    #rest of class 
    def move(self,event): 
     if event.key == K_DOWN: 
      screen.blit(background, self.pos, self.pos) #erases players by bliting bg 
      self.speed = 4 
      self.move_south() #moves player 
      self.speed = 0 
     #repeat for all other directions 
     screen.blit(self.image, self.pos) #draws player 
#initialize objects 
while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: #handle quit event 
     elif event.type == KEYDOWN: 
      for o in objects: 
       o.move(event) 
    #do non-eventhandling tasks. 
+0

谢谢你的回复,这非常有用。我得到它的工作。然而,我必须通过“背景”作为我的移动(自我,背景)方法的参数才能发挥作用。否则,我得到错误,全局变量未定义的错误。有没有办法绕过,或者我必须列出方法中使用的所有变量作为参数? – Sorade

+0

你不必将所有的变量列为参数 – ppperry

+0

我已经改变了一下代码(我寻找鼠标的位置,而不是移动它)但我得到错误,当我不这样做: – Sorade