Pygame精灵无法通过“event.type KEYDOWN”移动
Ball()这个类不会从"for event in 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()
3 个回答
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
这样应该能让你的程序正常运行。你要记得在 KEYDOWN 和 KEYUP 前面加上 pygame. 这个词。这样代码才能正确识别 event.type == KEYDOWN 和 event.type == KEYUP(包括我觉得你应该写的代码方式)。希望这对你有帮助!
0
请尝试添加 "pygame.KEYDOWN" 和 "pygame.KEYUP",就像你在调用 pygame 的按键按下和释放功能一样。
这里有个例子:
如果事件类型是 pygame.KEYDOWN:
if event.key == K_a:
m_x = -4
s+=1
elif event.key == K_d:
m_x = +4
s2+=1.......
否则如果事件类型是 pygame.KEYUP:
if event.key == K_a:
m_x = 0
elif event.key == K_d:
m_x = 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()
这样就更接近你想要的结构了。现在把处理事件和更新位置的代码移到球的类里。
你需要在这个类里面处理球相关的事件,这就是面向对象编程的目的。可以把它想象成数据在系统中的流动。首先,主循环获取输入并处理它,如果没有处理(或者这些数据可能在别的地方也会用到),它就把输入传递给其他对象,并告诉它们更新自己。
另外,你只需要创建一个球的实例,否则它的值就不会被保存。在你的例子中,你每次都在重新创建一个新的球。