Спрайт Pygame не будет перемещаться с «event.type KEYDOWN» - PullRequest
0 голосов
/ 09 января 2012

Класс Ball () не будет получать информацию из KEYDOWN / KEYUP в «для события в pygame.event.get ()», поэтому шар не будет перемещаться по экрану.Он отображается в правильных координатах, но не двигается, что меня смущает.Вот код:

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 ]

4 голосов
/ 09 января 2012

Ваш основной цикл не имеет особого смысла.Код обновления для проверки положения и события выполняется один раз (и только один раз) перед началом основного цикла.Это должно быть внутри класса 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()

Это ближе к структуре, которую вы хотите.Теперь перенесите код обработки событий и обновления положения в класс шара.

Вы хотите обрабатывать события, которыми шар управляет в этом классе - это цель ориентации объекта.Попробуйте представить это как поток данных через систему.Сначала ваш главный цикл принимает входные данные и обрабатывает их, если они этого не делают (или данные могут использоваться и в других местах), он передает этот вход другим объектам по мере необходимости и сообщает другим объектам обновить себя.

Вы также хотите создать только один экземпляр шара, иначе он не сохранит свои значения.В вашем примере вы воссоздаете его каждый раз.

0 голосов
/ 11 декабря 2014

Ваше событие 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. Это должно позволить коду выполнять event.type == KEYDOWN и event.type == KEYUP (включая то, как я думаю, вы должны поместить свой код). Надеюсь, это поможет вам!

0 голосов
/ 04 декабря 2013

попробуйте добавить "pygame.KEYDOWN" и "pygame.KEYUP", как вы вызывали функцию нажатия и отпускания клавиш Pygame

Вот пример:

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