2013-03-31 37 views
-2

我有让我的球员的方向拍摄的一个问题球员正在射击的方向

class Player(pygame.sprite.Sprite): 
    def __init__(self, screen, (posx, posy), shell): 
     'Called the Sprite class constructor' 
     pygame.sprite.Sprite.__init__(self) 

     'Save a reference to the screen' 
     self.screen = screen 
     self.shell = shell 
     'Create the image for the sprite' 
     self.image = pygame.image.load("player0.png") 
     self.image = self.image.convert() 
     tranColor = self.image.get_at((1, 1)) 
     self.image.set_colorkey(tranColor) 
     self.rect = self.image.get_rect() 
     self.charge = 50 
     'Position the sprite' 
     self.x = posx 
     self.y = posy 
     self.rect.center = (self.x, self.y) 
     self.velocity = Vectors.Vector2D(2, 2) 

     self.imgDown = [] 
     self.imgRight = [] 
     self.imgLeft = [] 
     self.imgUp = [] 

     self.frame = 0 
     self.delay = 3 
     self.pause = self.delay 
     self.speed = 5 
def update(self): 
     keys = pygame.key.get_pressed() 

     if keys[pygame.K_a]: 
      self.rect.centerx -= self.velocity.mulscaler(self.speed).x 
      self.loadPicsLeft() 
      self.calcDelay() 
      self.image = self.imgLeft[self.frame] 

     if keys[pygame.K_d]: 
      self.rect.centerx += self.velocity.mulscaler(self.speed).x 
      self.loadPicsRight() 
      self.calcDelay() 
      self.image = self.imgRight[self.frame] 


     if keys[pygame.K_w]: 
      self.rect.centery -= self.velocity.mulscaler(self.speed).y 
      self.loadPicsUp() 
      self.calcDelay() 
      self.image = self.imgUp[self.frame] 

     if keys[pygame.K_s]: 
      self.rect.centery += self.velocity.mulscaler(self.speed).y 
      self.loadPics() 
      self.calcDelay() 
      self.image = self.imgDown[self.frame] 

     if self.velocity.x > self.speed: 
      self.velocity.x = self.speed 
     if self.velocity.x < -self.speed: 
      self.velocity.x = -self.speed 

     if self.velocity.y > self.speed: 
      self.velocity.y = self.speed 
     if self.velocity.y < -self.speed: 
      self.velocity.y = -self.speed 

     if keys[pygame.K_SPACE]: 
       self.shell.x = self.rect.centerx 
       self.shell.y = self.rect.centery 
       self.shell.speed = self.charge 

    def calcDelay(self): 
     self.pause -= 1 
     if self.pause <= 0: 
      self.pause = self.delay 

      self.frame += 1 
      if self.frame > 2: 
       self.frame = 0 

    def loadPics(self): 
     for i in range (7): 
      imgName = "player%d.png"% i 
      tmpImg = pygame.image.load(imgName) 
      tmpImg.convert() 
      tranColor = tmpImg.get_at((0,0)) 
      tmpImg.set_colorkey(tranColor) 
      self.imgDown.append(tmpImg) 

    def loadPicsRight(self): 
     for i in range (7): 
      imgName = "playerRight%d.png"% i 
      tmpImg = pygame.image.load(imgName) 
      tmpImg.convert() 
      tranColor = tmpImg.get_at((0,0)) 
      tmpImg.set_colorkey(tranColor) 
      self.imgRight.append(tmpImg) 

    def loadPicsLeft(self): 
     for i in range (7): 
      imgName = "playerLeft%d.png"% i 
      tmpImg = pygame.image.load(imgName) 
      tmpImg.convert() 
      tranColor = tmpImg.get_at((0,0)) 
      tmpImg.set_colorkey(tranColor) 
      self.imgLeft.append(tmpImg) 

    def loadPicsUp(self): 
     for i in range (7): 
      imgName = "playerUp%d.png"% i 
      tmpImg = pygame.image.load(imgName) 
      tmpImg.convert() 
      tranColor = tmpImg.get_at((0,0)) 
      tmpImg.set_colorkey(tranColor) 
      self.imgUp.append(tmpImg) 

class Shell(pygame.sprite.Sprite): 
    def __init__(self, screen): 
     pygame.sprite.Sprite.__init__(self) 
     self.screen = screen 
     self.image = pygame.Surface((50, 50)) 
     self.image.fill((0xff, 0xff, 0xff)) 
     self.image.set_colorkey((0xff, 0xff, 0xff)) 
     pygame.draw.circle(self.image, (0, 0, 0), (25, 25), 25) 
     self.image = pygame.transform.scale(self.image, (10, 10)) 
     self.rect = self.image.get_rect() 
     self.rect.center = (-100, -100) 

     self.speed = 0 
     self.dir =0 
     self.reset() 

    def update(self): 
     self.checkBounds() 
     self.rect.center = (self.x, self.y) 

    def reset(self): 
     """ move off stage and stop""" 
     self.x = -100 
     self.y = -100 
     self.speed = 0 

这是我的球员,我的壳类,在我所有的外壳程序是出现在当下我的球员的位置,即时寻找的是我的球员,当他看起来正确时向右射击子弹,向左看时留下等等。任何人都可以为我提供关于我能做些什么来达到此目的的任何提示。林才刚刚开始编码在此刻大学,所以我挣扎了一下

+0

代码你在哪里存储的方向是什么? – YXD

+0

嗯我不知道,我认为它在玩家的更新方法中,因为在每次我按下空间时,强化器都会朝那个方向开火 –

+0

您应该使用Shell.update来移动子弹的速度。不知道你在哪里移动它。 – ninMonkey

回答

1

1 - 存储播放器的方向

2 - 使外壳的,像这样的速度:

self.speedx = speed_length * cos(player.angle) 
self.speedy = speed_length * sin(player.angle) 

注:

Speed_length是一帧中外壳行进的总欧几里德距离。

角度必须是弧度,或者您可以使用度如果你这样做:

self.speedx = speed_length * cos(radians(player.angle)) 
self.speedy = speed_length * sin(radians(player.angle))