2017-12-08 11 views
0

私は現在タンクを移動させようとしていますが(すでに行っていますが)、WASDまたは4つの矢印キーを押し続けるだけで移動できます。今すぐ移動するには、矢印キーを繰り返しクリックする必要があります。タンクを常に動かすためにキーを押してください

import pygame, assetloader 
from pygame.locals import * 
import random, time, math 
import pygame 

GRAD = math.pi/180 
blue = (0, 0, 255) 

wallRects = [] 



maze = [[] for i in range(25)] 





assetloader.set_asset_path("assets/") 




class Player(pygame.sprite.Sprite): 
    def __init__(self, x, y, pos): 
     pygame.sprite.Sprite.__init__(self) 

     self.image, self.rect = assetloader.load_image("Tank.png", -1) 
     self.rect.x = x 
     self.rect.y = y 
     self.rect.clamp_ip(screen.get_rect()) 
     self.dir = 0 
     self.vel_y = 0 
     self.vel_x = 0 
     self.rows = pos[0] 
     self.cols = pos[1] 
     self.x = self.cols * gsize 
     self.y = self.rows * gsize 
     self.orig_image, self.orig_rect = assetloader.load_image("Tank.png", -1) 
     self.orig_rect.x = self.x 
     self.orig_rect.y = self.y 
     self.orig_gun_pos = self.orig_rect.midtop 
     self.ammo = 5 
     self.vel = [0, 0] 
     self.dead = False 






    def draw(self, screen): 
     image = pygame.transform.rotate(self.image, self.dir) 
     screen.blit(image, self.rect) 





    def update(self): 
     oldCenter = self.rect.center 

     self.rect = self.image.get_rect() 
     self.rect.center = oldCenter 
     screen_rect = screen.get_rect() 
     keys = pygame.key.get_pressed() 


     if keys[K_UP]: 



      if (0 < self.dir and self.dir < 90) or (-360 < self.dir and self.dir < -270): 
       self.vel_x = -1 

       self.vel_y = -1 
      elif (270 < self.dir and self.dir < 360) or (-90 < self.dir and self.dir < 0): 
       self.vel_x = 1 
       self.vel_y = -1 
      if (90 < self.dir and self.dir < 180) or (-270 < self.dir and self.dir < -180): 
       self.vel_x = -1 
       self.vel_y = 1 

      elif (180 < self.dir and self.dir < 270) or (-180 < self.dir and self.dir < -90): 
       self.vel_x = 1 
       self.vel_y = 1 

      if self.dir == 0 : 
       self.vel_x = 0 
       self.vel_y = -1 
      if self.dir == 90 : 
       self.vel_x = -1 
       self.vel_y = 0 
      if self.dir == 180: 
       self.vel_x = 0 
       self.vel_y = 1 
      if self.dir == 270: 
       self.vel_x = 1 
       self.vel_y = 0 





      self.rect.move_ip(self.vel_x, self.vel_y) 

     elif keys[K_DOWN]: 

      if (0 < self.dir and self.dir < 90) or (-360 < self.dir and self.dir < -270): 
       self.vel_x = 1 

       self.vel_y = 1 
      elif (270 < self.dir and self.dir < 360) or (-90 < self.dir and self.dir < 0): 
       self.vel_x = -1 
       self.vel_y = 1 
      if (90 < self.dir and self.dir < 180) or (-270 < self.dir and self.dir < -180): 
       self.vel_x = 1 
       self.vel_y = -1 

      elif (180 < self.dir and self.dir < 270) or (-180 < self.dir and self.dir < -90): 
       self.vel_x = -1 
       self.vel_y = -1 

      if self.dir == 0 : 
       self.vel_x = 0 
       self.vel_y = 1 
      if self.dir == 90 : 
       self.vel_x = 1 
       self.vel_y = 0 
      if self.dir == 180: 
       self.vel_x = 0 
       self.vel_y = -1 
      if self.dir == 270: 
       self.vel_x = -1 
       self.vel_y = 0 

      self.rect.move_ip(self.vel_x, self.vel_y) 


     if keys[K_LEFT]: 
      self.dir += 5 
      if self.dir > 360: 
       self.dir = 0 
     elif keys[K_RIGHT]: 
      self.dir -= 5 
      if self.dir < -360: 
       self.dir = 0 






     if not screen_rect.contains(self.rect): 
      self.rect.clamp_ip(screen_rect) 



class Enemy(pygame.sprite.Sprite): 
    def __init__(self, x, y): 
     pygame.sprite.Sprite.__init__(self) 

     self.image, self.rect = assetloader.load_image("New Piskel.png", -1) 
     self.rect.x = x 
     self.rect.y = y 
     self.dir = 0 
     self.rect.clamp_ip(screen.get_rect()) 


    def draw(self, screen): 

     image = pygame.transform.rotate(self.image, self.dir) 
     screen.blit(image, self.rect) 

    def update(self): 
     screen_rect = screen.get_rect() 
     keys = pygame.key.get_pressed() 
     if keys[K_w]: 

      if (0 < self.dir and self.dir < 90) or (-360 < self.dir and self.dir < -270): 
       self.vel_x = -1 

       self.vel_y = -1 
      elif (270 < self.dir and self.dir < 360) or (-90 < self.dir and self.dir < 0): 
       self.vel_x = 1 
       self.vel_y = -1 
      if (90 < self.dir and self.dir < 180) or (-270 < self.dir and self.dir < -180): 
       self.vel_x = -1 
       self.vel_y = 1 

      elif (180 < self.dir and self.dir < 270) or (-180 < self.dir and self.dir < -90): 
       self.vel_x = 1 
       self.vel_y = 1 

      if self.dir == 0 : 
       self.vel_x = 0 
       self.vel_y = -1 
      if self.dir == 90 : 
       self.vel_x = -1 
       self.vel_y = 0 
      if self.dir == 180: 
       self.vel_x = 0 
       self.vel_y = 1 
      if self.dir == 270: 
       self.vel_x = 1 
       self.vel_y = 0 




      self.rect.move_ip(self.vel_x, self.vel_y) 

     elif keys[K_s]: 

      if (0 < self.dir and self.dir < 90) or (-360 < self.dir and self.dir < -270): 
       self.vel_x = 1 

       self.vel_y = 1 
      elif (270 < self.dir and self.dir < 360) or (-90 < self.dir and self.dir < 0): 
       self.vel_x = -1 
       self.vel_y = 1 
      if (90 < self.dir and self.dir < 180) or (-270 < self.dir and self.dir < -180): 
       self.vel_x = 1 
       self.vel_y = -1 

      elif (180 < self.dir and self.dir < 270) or (-180 < self.dir and self.dir < -90): 
       self.vel_x = -1 
       self.vel_y = -1 

      if self.dir == 0 : 
       self.vel_x = 0 
       self.vel_y = 1 
      if self.dir == 90 : 
       self.vel_x = 1 
       self.vel_y = 0 
      if self.dir == 180: 
       self.vel_x = 0 
       self.vel_y = -1 
      if self.dir == 270: 
       self.vel_x = -1 
       self.vel_y = 0 

      self.rect.move_ip(self.vel_x, self.vel_y) 


     if keys[K_a]: 
      self.dir += 5 
      if self.dir > 360: 
       self.dir = 0 
     elif keys[K_d]: 
      self.dir -= 5 
      if self.dir < -360: 
       self.dir = 0 


     if not screen_rect.contains(self.rect): 
      self.rect.clamp_ip(screen_rect) 


size = width, height = 500, 400 
gsize = 25 
start_x, start_y = 0, 0 
bgColor = 255, 255, 255 



pygame.init() 
screen = pygame.display.set_mode(size)#, pygame.FULLSCREEN) 
pygame.display.set_caption("Sample Sprite") 
clock = pygame.time.Clock() 

p = Player(width/2, height/4, (3,4)) 
e = Enemy(width/2, height/4) 


coll_font = pygame.font.Font(None, 30) 



going = True 
while going: 
    clock.tick(60) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      going = False 
     elif event.type == KEYDOWN: 
      if event.key == K_ESCAPE: 
       going = False 



     p.update() 
     e.update() 


     screen.fill(bgColor) 

     p.draw(screen) 
     e.draw(screen) 






     pygame.display.flip() 



pygame.quit() 

は、今は、エラーはありませんが、私は一定の動きの代わりに、何度もキーを再押しを持っていると思います。誰かが私にどのように説明することができますか?

私はあなたの問題はあなたがマウスを移動する場合にのみ、彼らはプレス/リリースマウスボタンまたは not-pressedからプレス/解除キー(キーチェンジ状態、実行されるよう update()for eventループの内側にある while going

関数で間違っ窪みていると思う

+0

は、おそらくあなたが間違ったくぼみを持つ 'ループをgoing'、あなたが'アップデート() 'と' event'ループの内側に他の機能を実行しながら、 - ので、いくつかのイベントがある場合にのみ、彼らが実行されている - キーの押下などが。しかし、キーイベントは、キーが「非押された」状態から「押された」状態(または「押された状態」から「非押された状態」)に変わったときにのみ作成されますが、再度新しいイベントを作成します。 – furas

答えて

0

pressedまたはpressednot-pressed)ですが、キーを押したままにしてはなりません。

going = True 
while going: 
    clock.tick(60) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      going = False 
     elif event.type == KEYDOWN: 
      if event.key == K_ESCAPE: 
       going = False 

    # correct indentions - all outside of `for event` loop 

    p.update() 
    e.update() 

    screen.fill(bgColor) 

    p.draw(screen) 
    e.draw(screen) 

    pygame.display.flip() 

pygame.quit()