2012-01-09 18 views
0

ball()クラスは "for event in pygame.event.get()"のKEYDOWN/KEYUPから情報を取得しないため、ボールは移動しません画面全体でそれは右の座標に表示されますが、私を混乱させる移動に失敗します。コードは次のとおりです。Pygameスプライトは "event.type KEYDOWN"で移動しません

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() 

答えて

4

メインループはあまり意味がありません。位置とイベントのチェックのための更新コードは、メインループが始まる前に1回だけ(そして1回だけ)実行されます。これは、ボールのクラス内であることが必要であり、定期的にメインループから呼び出さ:

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のダウンロードキープレス&解放関数を呼び出したとして "pygame.KEYDOWN" & "pygame.KEYUP" を追加しようとここに例を示します

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 
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の前のフレーズ。それはコードがevent.type == KEYDOWNとevent.type == KEYUP(あなたのコードを置くべき方法を含む)を行うことができるはずです。これがあなたを助けることを願って!

関連する問題