2014-01-24 60 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