Python Pygame sprite赢了';“不要用”移动;event.type KEYDOWN“;

Python Pygame sprite赢了';“不要用”移动;event.type KEYDOWN“;,python,sprite,pygame,Python,Sprite,Pygame,Ball()类不会从pygame.event.get()中的“for event”中的KEYDOWN/keydup获取信息,因此球不会在屏幕上移动。它显示在正确的坐标,但无法移动,这让我很困惑。代码如下: 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,

Ball()类不会从pygame.event.get()中的“for event”中的KEYDOWN/keydup获取信息,因此球不会在屏幕上移动。它显示在正确的坐标,但无法移动,这让我很困惑。代码如下:

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()
import pygame,sys
从pygame.locals导入*
pygame.init()
红色=(255,0,0)
绿色=(0255,0)
蓝色=(0,0255)
暗蓝色=(0,0128)
白色=(255255)
黑色=(0,0,0)
粉红色=(255200200)
background=pygame.image.load('background.jpg')
screen=pygame.display.set_模式((640521),0,32)
pygame.display.set_标题('V1.1')
s=0#s和s2,用于稍后显示分数
s2=0
类Ball():
定义初始化(自):
ball=pygame.sprite.sprite()
ball.image=pygame.image.load('red_ball.png').convert()
ball.rect=ball.image.get_rect()
ball.image.set_颜色键((白色))
屏幕光点(球图像,(x,y))
pygame.display.update()
def更新(自我):
如果x>640:
x=0
如果x<0:
x=640
def main():
而1:
屏幕光点(背景,(0,0))
对于pygame.event.get()中的事件:
如果event.type==退出:
pygame.quit()
sys.exit()
Ball()
pygame.display.update()
x、 y=285430
m_x,m_y=0,0
对于pygame.event.get()中的事件:
如果event.type==KEYDOWN:
如果event.key==K_a:
m_x=-4
s+=1
elif event.key==K\u d:
m_x=+4
s2+=1
elif event.type==KEYUP:
如果event.key==K_a:
m_x=0
elif event.key==K\u d:
m_x=0
x+=m_x
y+=m_y
main()

您的主循环没有多大意义。位置和事件检查的更新代码在主循环开始之前执行一次(并且仅执行一次)。这需要在ball类中,并定期从主循环调用:

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()
这更接近您想要的结构。现在将事件处理和位置更新代码移动到ball类中

您希望处理球在该类中管理的事件-这是面向对象的目标。试着将其视为通过系统的数据流。首先,主循环接受输入并处理它,如果它没有(或者数据也可能在其他地方使用),它会根据需要将该输入传递给其他对象,并告诉其他对象更新自己


您还只希望创建球的一个实例,否则它将不会保留其值。在您的示例中,您每次都在重新创建它。

您的主循环没有多大意义。位置和事件检查的更新代码在主循环开始之前执行一次(并且仅执行一次)。这需要在ball类中,并定期从主循环调用:

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()
这更接近您想要的结构。现在将事件处理和位置更新代码移动到ball类中

您希望处理球在该类中管理的事件-这是面向对象的目标。试着将其视为通过系统的数据流。首先,主循环接受输入并处理它,如果它没有(或者数据也可能在其他地方使用),它会根据需要将该输入传递给其他对象,并告诉其他对象更新自己

您还只希望创建球的一个实例,否则它将不会保留其值。在您的示例中,您每次都在重新创建它。

请尝试在调用pygame按键释放功能时添加“pygame.KEYDOWN”和“pygame.keydup”

下面是一个例子:

如果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”和“pygame.keydup”,因为您正在调用pygame按键和释放功能

下面是一个例子:

如果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

您的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和keydup前面的短语。这应该允许代码执行event.type==KEYDOWN和event.type==keydup(包括我认为应该如何放置代码)。希望这对你有帮助

您的事件。关键事件甚至不在主循环中。如果您将代码放在如下位置:

    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和keydup前面的短语。这应该允许代码执行event.type==KEYDOWN和event.type==keydup(包括我认为应该如何放置代码)。希望这对你有帮助