Ball()类不会从“for pygame.event.get()中的事件”中的KEYDOWN / KEYUP获取信息,因此球不会在屏幕上移动。它显示在正确的坐标但无法移动,这让我感到困惑。这是代码:
import pygame, sys
from pygame.locals import *
pygame.init()
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
darkBlue = (0,0,128)
white = (255,255,255)
black = (0,0,0)
pink = (255,200,200)
background = pygame.image.load('background.jpg')
screen = pygame.display.set_mode((640,521),0,32)
pygame.display.set_caption('V1.1')
s = 0 #s and s2 for displaying score later on
s2 = 0
class Ball():
def __init__(self):
ball = pygame.sprite.Sprite()
ball.image = pygame.image.load('red_ball.png').convert()
ball.rect = ball.image.get_rect()
ball.image.set_colorkey((white))
screen.blit(ball.image,(x,y))
pygame.display.update()
def update(self):
if x > 640:
x = 0
if x < 0:
x = 640
def main():
while 1:
screen.blit(background, (0,0))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
Ball()
pygame.display.update()
x,y = 285, 430
m_x, m_y = 0,0
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_a:
m_x = -4
s+=1
elif event.key == K_d:
m_x = +4
s2+=1
elif event.type == KEYUP:
if event.key == K_a:
m_x = 0
elif event.key == K_d:
m_x = 0
x+= m_x
y+= m_y
main()
答案 0 :(得分:4)
你的主循环没有多大意义。位置和事件检查的更新代码在主循环开始之前完成一次(并且只进行一次)。这需要在球类内部,并定期从主循环调用:
def main():
ball = Ball() #You only want one instance of the ball.
while True: #More Pythonic to use 'True' rather than 1. You are not testing a number, you are testing a truth.
screen.blit(background, (0, 0))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
else:
ball.handle_event(event) #Pass the event onto the ball to deal with.
ball.update() #Update the ball.
pygame.display.update()
这更接近您想要的结构。现在将事件处理和位置更新代码移动到球类中。
你想要处理球在该类中管理的事件 - 这是面向对象的目标。尝试将其视为通过系统的数据流。首先,你的主循环接受输入并处理它,如果它没有(或者数据也可能在其他地方使用),它会根据需要将该输入传递给其他对象,并告诉其他对象自己更新。
你也只想创建一个球的实例,否则它不会保留它的值。在您的示例中,您每次都在重新创建它。
答案 1 :(得分:0)
请尝试添加“pygame.KEYDOWN”&amp; “pygame.KEYUP”正如你所说的pygame keypress&amp;发布功能
以下是示例:
if event.type == pygame.KEYDOWN:
if event.key == K_a:
m_x = -4
s+=1
elif event.key == K_d:
m_x = +4
s2+=1.......
elif event.type == pygame.KEYUP:
if event.key == K_a:
m_x = 0
elif event.key == K_d:
m_x = 0
答案 2 :(得分:0)
您的Event.Key事件甚至不在主循环中。如果你把你的代码放在这样:
while 1:
screen.blit(background, (0,0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == K_a:
m_x = -4
s+=1
elif event.key == K_d:
m_x = +4
s2+=1
elif event.type == pygame.KEYUP:
if event.key == K_a:
m_x = 0
elif event.key == K_d:
m_x = 0
这应该让你的程序运行。你应该记得把pygame。 KEYDOWN和KEYUP前面的短语。这应该允许代码执行event.type == KEYDOWN和event.type == KEYUP(包括我认为您应该放置代码的方式)。希望这能帮到你!