2014-01-24 59 views
-1

我一遍又一遍地查看並修改了我的代碼,即時編程類似於小行星和即時消息的遊戲,急需幫助,只要按住按鈕,我就無法讓船加速和旋轉下來,對不起,如果這是太多,但如果任何人都可以在此發表評論,讓我知道該怎麼做,我會很感激加速和旋轉

import pygame, math, time, decimal, random 
from pygame.locals import * 
from decimal import * 
clock=pygame.time.Clock() 
bif="SpaceBG.jpg" 
ship="spaceship.jpg" 
pygame.display.set_caption("Space Defender") 
pygame.init() 
screen = pygame.display.set_mode((850, 640)) 
background=pygame.image.load(bif).convert() 
ship=pygame.image.load(ship).convert_alpha() 
screen.blit(background, (0, 0))#basically copies the background 

class Ship(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.imageMaster = pygame.image.load("spaceship.jpg") 
     self.imageMaster = self.imageMaster.convert() 
     self.image = self.imageMaster 
     self.rect = self.image.get_rect() 
     self.rect.center = (425, 320) 
     self.dir = 0 
     self.rotation=0.0 
     self.x=0 
     self.y=0 
     self.shot=0 
     self.load=200.0 
     self.invincibility=0.0 
     self.alive=1 
     angle= 0 
     (self.x,self.y)=self.rect.center 


def update(self): 
    oldCenter = self.rect.center 
    self.image = pygame.transform.rotate(self.imageMaster, self.dir) 
    self.rect = self.image.get_rect() 
    self.rect.center = oldCenter 

def turnLeft(self): 
    self.rotation-=1*time 
    if self.rotation>360.0: 
     self.rotation-=360.0 

def turnRight(self): 
    self.dir -= 10 
    if self.dir < 0: 
     self.dir = 360 


def accelerate(self): 
    realangle=angle+90 
    if realangle>360: 
     realangle-=360.0 
     realangle*=math.pi/180 
     rady=-math.sin(realangle) 
     radx=math.cos(realangle) 
     if (rady<0 and not y<-0.5) or (rady>0 and not y>0.5): 
      y+=rady*0.014 
      if (radx<0 and not x<-0.5) or (radx>0 and not x>0.5): 
       x+=radx*0.014 
       return x,y 


def main(): 
pygame.display.flip() 
ship = Ship() 
allSprites = pygame.sprite.Group(ship) 

keepGoing = True 
while keepGoing: 
    clock.tick(30) 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      keepGoing = False 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       ship.turnLeft() 
      elif event.key == pygame.K_RIGHT: 
       ship.turnRight() 
      elif event.key == pygame.K_UP: 
       ship.accelerate() 

    allSprites.clear(screen, background) 
    allSprites.update() 
    allSprites.draw(screen) 

    pygame.display.flip() 

if __name__ == "__main__": 
    main() 
+0

您需要告訴我們您嘗試隔離問題的事情。 – Thom

回答

1

我懷疑這是因爲你在做轉彎和加速的KEYDOWN 事件。請注意,這是一個事件,而不是一個狀態。我認爲你需要設置一個標誌來轉動或加速KEYDOWN並在KEYUP上清除它。只要旗幟開啓,就可以適當地轉動或加速。也許是這樣的:

keepGoing = True 
accelFlag = False 
turnLeftFlag = False 
turnRightFlag = False 
while keepGoing: 
    clock.tick(30) 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      keepGoing = False 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       turnLeftFlag = True 
      elif event.key == pygame.K_RIGHT: 
       turnRightFlag = True 
      elif event.key == pygame.K_UP: 
       accelFlag = True 
     elif event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT: 
       turnLeftFlag = False 
      elif event.key == pygame.K_RIGHT: 
       turnRightFlag = False 
      elif event.key == pygame.K_UP: 
       accelFlag = False 

    if accelFlag: 
     ship.accelerate() 
    if turnLeftFlag: 
     ship.turnLeft() 
    if turnRightFlag: 
     ship.turnRight() 

    allSprites.clear(screen, background) 
    allSprites.update() 
    allSprites.draw(screen) 

    pygame.display.flip() 
1

pygame.key.get_pressed()會給你所有的鍵盤按鍵的當前狀態。在每個勾號上,您可以根據當前關閉的鍵確定是旋轉還是加速。

如果您期待您的當前代碼正常工作,而不是簡單地顯示您嘗試過的內容,這就是爲什麼它不起作用。 Pygame只會在密鑰從上到下時觸發KEYDOWN事件。它不會在每次打勾時觸發它們。因此,你的代碼只知道它應該旋轉或加速船上的相關鍵被按下。

+0

不要擔心球員我現在正在工作,無論如何謝謝你的幫助:) – Naming