python - Pygame似乎 "avoid"循环

标签 python events pygame

我刚刚开始使用 Pygame,目前正在尝试一些基本的移动功能。

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

我的第一次尝试如下:

类.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,但没有成功:

类.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)

因此,代码似乎很难从实例中检查事件循环。我想将运动编码为一种方法而不是直接在 main 中编码的原因是为了节省空间并使以后添加字符更容易。

最佳答案

您的代码存在竞争条件(非常宽松地使用该术语)。

你的角色没有移动的原因是第一个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.

关于python - Pygame似乎 "avoid"循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36810544/

相关文章:

python - 使用 odo 转换 pandas hdfstore 时维护数据列

将新添加的应用程序写入内存的 Windows 事件

javascript - JavaScript/jQuery 事件排序有问题吗?

python - 函数重复十次而不是一次 - Pygame Zero

python - Pygame 水波纹效果

python - 几次函数调用后变量的值消失

python - 如何在 Windows 上的 http 代理后面使用 easy_install?

python - 如何使用 pygsheets(带或不带 Pandas)将 Excel 工作表或 CSV 插入 Google 表格?

c# - 不使用 Web 服务的 C# 中的实时股票行情

python - 如何在pygame中创建三点弧