2017-01-28 34 views
1

私はパイゲームで何かを作り始めましたが、左または右に移動するときに問題が発生しました。私がすぐに右矢印キーを押すことから左のものを押すことに変わり、右のものを放すと、ブロックは動きを止めるだけです。これは私のコードpygame左右に移動する問題

bg = "sky.jpg" 
ms = "ms.png" 
import pygame, sys 
from pygame.locals import * 
x,y = 0,0 
movex,movey=0,0 
pygame.init() 
screen=pygame.display.set_mode((664,385),0,32) 
background=pygame.image.load(bg).convert() 
mouse_c=pygame.image.load(ms).convert_alpha() 
m = 0 
pygame.event.pump() 
while 1: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     if event.type==KEYDOWN: 
      if event.key==K_LEFT: 
       movex =-0.5 
       m = m + 1 
      if event.key==K_RIGHT: 
       movex=+0.5 
       m = m + 1 
     elif event.type == KEYUP: 
      if event.key==K_LEFT and not event.key==K_RIGHT: 
        movex = 0 
      if event.key==K_RIGHT and not event.key==K_LEFT: 
        movex =0 

    x+=movex 
    y=200 
    screen.blit(background, (0,0)) 
    screen.blit(mouse_c,(x,y)) 
    pygame.display.update() 

右矢印キーが押されると、左矢印キーは、それが停止するのを代わりに行くことにリリースされた場合、私はので、これを変更することができます方法はありますか? P.S 私はまだpygameを学んでおり、モジュールには非常に新しいです。これは愚かな質問のように見える場合は申し訳ありませんが、私はそれに任意の答えを見つけることができませんでした。

+0

ms.pngは==ブロック – 1234USSR4321

+0

'ないevent.keyをチェックしても意味がないので、' event.key' 1つの値のみを保つことができるですK_RIGHT: 'すでに' event.key == K_LEFT' – furas

答えて

0

event.key==K_LEFTがTrueのときにイベントのキーがK_LEFTすべての後なので、 が、それはまた、常に(not event.key==K_RIGHTあるので、あなたの問題は、あなたが

if event.key==K_LEFT and not event.key==K_RIGHT: 

でKEYDOWNイベントをテストするときは、常にtrueを得るということです)。

この種の問題へのアプローチは、 をアクションから分離することです。だから、キー イベントのために、私は単純に、このように、起こることになっているもののアクション を追跡します:

moveLeft = False 
moveRight = False 

while True: 
    for event in pygame.event.get(): 
    if event.type == QUIT: 
     pygame.quit() 
     sys.exit() 
    if event.type == KEYDOWN: 
     if event.key == K_LEFT: moveLeft = True 
     if event.key == K_RIGHT: moveRight = True 
    elif event.type == KEYUP: 
     if event.key == K_LEFT: moveLeft = False 
     if event.key == K_RIGHT: moveRight = False 

を次に、ループの「メイン」の部分には、あなたは 基づいてアクションを取ることができます

while True: 
    for event in pygame.event.get(): 
    ... 
    if moveLeft : x -= 0.5 
    if moveRight : x += 0.5 
0

最後に押されたボタンを追跡するキューを作成する方法もあります。右矢印キーを押すと、最初にベロシティをリストに入れ、左矢印キーを押すと新しいベロシティがリストに最初に置かれます。最後に押されたボタンは常にリストの最初に表示されます。それから、リストからボタンを削除するだけです。

import pygame 
pygame.init() 

screen = pygame.display.set_mode((720, 480)) 
clock = pygame.time.Clock() 
FPS = 30 

rect = pygame.Rect((350, 220), (32, 32)) # Often used to track the position of an object in pygame. 
image = pygame.Surface((32, 32)) # Images are Surfaces, so here I create an 'image' from scratch since I don't have your image. 
image.fill(pygame.Color('white')) # I fill the image with a white color. 
velocity = [0, 0] # This is the current velocity. 
speed = 200 # This is the speed the player will move in (pixels per second). 
dx = [] # This will be our queue. It'll keep track of the horizontal movement. 

while True: 
    dt = clock.tick(FPS)/1000.0 # This will give me the time in seconds between each loop. 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      raise SystemExit 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       dx.insert(0, -speed) 
      elif event.key == pygame.K_RIGHT: 
       dx.insert(0, speed) 
     elif event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT: 
       dx.remove(-speed) 
      elif event.key == pygame.K_RIGHT: 
       dx.remove(speed) 

    if dx: # If there are elements in the list. 
     rect.x += dx[0] * dt 

    screen.fill((0, 0, 0)) 
    screen.blit(image, rect) 
    pygame.display.update() 

    # print dx # Uncomment to see what's happening. 

もちろん、すべての機能をきちんと入れて、Playerクラスを作成する必要があります。

0

などの重大な機能が重複しています。最初に右を押したままにしておくと、xmoveは最初に1に設定され、-1に変更されます。しかし、あなたは鍵のひとつを解放し、まだ他の鍵を持っていてもxmoveを0にリセットします。あなたがしたいことは、各キーのブール値を作成することです。次に例を示します。

demo.py:

import pygame 

window = pygame.display.set_mode((800, 600)) 

rightPressed = False 
leftPressed = False 

white = 255, 255, 255 
black = 0, 0, 0 

x = 250 
xmove = 0 

while True: 
    window.fill(white) 
    pygame.draw.rect(window, black, (x, 300, 100, 100)) 
    for event in pygame.event.get(): 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_RIGHT: 
       rightPressed = True 
      if event.key == pygame.K_LEFT: 
       leftPressed = True 
     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_RIGHT: 
       rightPressed = False 
      if event.key == pygame.K_LEFT: 
       leftPressed = False 
    xmove = 0 
    if rightPressed: 
     xmove = 1 
    if leftPressed: 
     xmove = -1 
    x += xmove 
    pygame.display.flip() 
+0

これは私の答えの正確なコピーです。 – Meyer

+0

メイヤーちゃん、私はあなたの答えを見ませんでした。私はあなたのコードを盗んだり、あなたをコピーしたりしなかったことを約束することができます。 – XCode

+0

結局のところ、心配する必要はなく、結局はかなり明白なアプローチです。同じものを2回転記する前に、他の回答を必ず読んでください。 – Meyer

関連する問題