2016-08-29 11 views
1

main_screenにオブジェクト/イメージを追加しました。このオブジェクトはcancer_cellと呼ばれています。 私がここでやろうとしているのは、オブジェクトをスムーズに動かすことです。私はそれを動かすために、矢印キーを繰り返し押す必要があります。 移動するにはwhile矢印キーが押されていますか?ここPygame - Smoother Movement

はコードです: が、それはどちらか動作しませんでした:

exitgame = False 
cellpos_x = 0 
cellpos_y = cancer_cell.get_rect().height*2 
while not exitgame: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      exitgame = True 
      quitgame() 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       cellpos_x -= 10 
      if event.key == pygame.K_RIGHT: 
       cellpos_x += 10 


    gameplay_bg = pygame.image.load("/Users/wolf/Desktop/python/img/gameplay_bg.png").convert() 
    main_screen.fill(white) 
    main_screen.blit(gameplay_bg, [0,0]) 
    main_screen.blit(cancer_cell, [cellpos_x, cellpos_y]) 
    pygame.display.flip() 
    clock.tick(20) 

は、誰かがHow to use pygame.KEYDOWNで解決をしようとする私に言いました。それとも私はそれが間違っていた:

if event.type == pygame.KEYDOWN: 
    key_pressed = pygame.key.get_pressed() 
    if key_pressed[pygame.K_LEFT]: 
     cellpos_x -= 10 
    if key_pressed[pygame.K_RIGHT]: 
     cellpos_x += 10 
+0

あなたは何を求めているのかを明確にしたいかもしれません。 – Sevanteri

+0

私はこのオブジェクト/イメージを 'cancer_cell'と呼ばれる' main_screen'に持っています。私が矢印キーで動かすと、私は繰り返し押す必要があります。そうでなければ、キーを押したまま移動すれば動きません。 –

+0

コメントの代わりに質問を編集してください。 – Sevanteri

答えて

0

問題がexitgameされていないが、私はちょうどFORループ からこの部分をunindentingことによって問題を解決した

を解決しよう:

for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      exitgame = True 
      quitgame() 

    key_pressed = pygame.key.get_pressed() 
    if key_pressed[pygame.K_LEFT]: 
     cellpos_x -= 10 
    if key_pressed[pygame.K_RIGHT]: 
     cellpos_x += 10 
+0

基本的にここでは、イベントループはイベントエフェクトを1回だけ適用するということです。もし 'event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:do stuff'は、左矢印キーを押したことをPygameが検出することを意味します。キーを離してもう一度押すと、エフェクトが再び実行されます。これがキーを押し続けなければならなかった理由です。しかし、pygame.key.get_pressed()を使用すると、キーを離さずにpygameがこの値を継続的にチェックします。これは重要な違いです。 – Sorade

+0

スプライトがマウスの位置に続いている(イベントループの外側に 'pygame.mouse_getpos()'があります)、ボタンを実装したい場合は、おそらく効果が必要な場合はこれを覚えておいてくださいボタンをクリックするたびに1回だけ発生するようにします(この場合、イベントループの条件を使用する方がよいでしょう)。 – Sorade

0

私は見ますインデントの問題を解決しました。ここに別のバージョンの例があります:

import pygame 

class Player(object): 
    def __init__(self, img_path): 
     self.image = pygame.image.load(img_path) 
     self.x = 0 
     self.y = self.image.get_rect().height*2 

    def handle_keys(self): 
     key = pygame.key.get_pressed() 
     dist = 1 
     if key[pygame.K_RIGHT]: 
      self.x += dist 
     elif key[pygame.K_LEFT]: 
      self.x -= dist 

    def draw(self, surface): 
     surface.blit(self.image, (self.x, self.y)) 


pygame.init() 
clock = pygame.time.Clock() 
size = width, height = 1024, 768 
speed = [2, 2] 
white = 1, 1, 1 
main_screen = pygame.display.set_mode(size) 
gameplay_bg = pygame.image.load("background.jpg") 
cancer_cell = Player("player.jpg") 
running = False 

while not running: 
    event = pygame.event.poll() 

    if event.type == pygame.QUIT: 
     running = True 

    main_screen.fill(white) 
    main_screen.blit(gameplay_bg, [0, 0]) 

    cancer_cell.handle_keys() 
    cancer_cell.draw(main_screen) 

    pygame.display.flip() 

    clock.tick(50) 
    pygame.display.set_caption("fps: " + str(clock.get_fps())) 

画像のパス( "background.jpg"、 "player.jpg")を調整する必要があります。このバージョンでは、ゲームイベントループのスプライトに何度も読み込んでいないので、プレーヤーの動きは滑らかになる。