2

トリガーは私の強いスーツではないので、誘導ミサイルを適切に回転させようとして問題を抱えています. 動きにはまだ100%満足していませんが、方向は問題ないように見えるので、回転を修正することでそれも修正されることを望んでいます. 問題は、私のミサイルがターゲット (プレイヤー) を指していないことです。また、ターゲットを通過した特定のポイントでミサイルが反転します。コードは次のとおりです...回転が正しく機能しません。

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

def calcVect(self):
    self.vectX = self.targetX - self.x
    self.vectY = self.targetY - self.y
    self.length = math.sqrt((self.vectX*self.vectX)+(self.vectY*self.vectY)) 
    self.normX = self.vectX/self.length
    self.normY = self.vectY/self.length
    self.dx += self.normX*self.power
    self.dy += self.normY*self.power

def calcPos(self):
    self.x += self.dx*0.2
    self.y += self.dy*0.2

def rotate(self):
    radians = math.atan2(-self.vectY,self.vectX)
    radians %= 2*math.pi
    self.dir = math.degrees(radians)
    print self.dir
    oldCenter = self.rect.center
    self.image = pygame.transform.rotate(self.imageMissile, self.dir)
    self.rect = self.image.get_rect()
    self.rect.center = oldCenter

作業コード 以下は、クラス全体の新しい作業コードです。この行の最後の式により、画像が最初は水平であったにもかかわらず、「radians = math.atan2(self.vectX, self.vectY)- math.pi/2」という正しい回転が可能になりました。

class GuidedMissile(pygame.sprite.Sprite):
def __init__(self, source):
    pygame.sprite.Sprite.__init__(self)
    self.screen = source.screen

    self.imageMissile = pygame.image.load("Images/missile.tga").convert()
    self.imageMissile.set_colorkey((0,0,255))
    self.image = self.imageMissile
    self.rect = self.image.get_rect()
    self.rect.center = source.rect.midbottom

    self.rect.inflate_ip(-15, -5)        

    self.x, self.y = self.rect.center
    self.X, self.Y = self.rect.center
    self.dx = 0
    self.dy = 0
    self.power = 3
    self.dir = 0

def update(self):
    self.player = goodSpritesOneGRP.sprite
    self.targetX, self.targetY = self.player.rect.center
    NX, NY = self.calcVect()
    self.calcVel(NX, NY)
    self.calcPos()
    self.rotate()
    self.checkBounds()
    self.rect.center = (self.x, self.y)

def calcVect(self):
    self.vectX = self.targetX - self.x
    self.vectY = self.targetY - self.y
    self.length = math.sqrt((self.vectX*self.vectX)+(self.vectY*self.vectY)) 
    if self.length == 0:
        self.normX = 0
        self.normY = 1
    else:
        self.normX = self.vectX/self.length
        self.normY = self.vectY/self.length
    return (self.normX, self.normY)

def calcVel(self,NX,NY ):
    self.dx += NX*self.power
    self.dy += NY*self.power            

def calcPos(self):
    self.x += self.dx*0.05
    self.y += self.dy*0.05

def rotate(self):
    radians = math.atan2(self.vectX, self.vectY)- math.pi/2
    radians %= 2*math.pi
    self.dir = math.degrees(radians)
    oldCenter = self.rect.center
    self.image = pygame.transform.rotate(self.imageMissile, self.dir)
    self.rect = self.image.get_rect()
    self.rect.center = oldCenter

def checkBounds(self):
    global guidedMissile
    screen = self.screen
    if self.x > screen.get_width():
        self.kill()
        guidedMissile -= 1
    if self.x < -100:
        self.kill()            
        guidedMissile -= 1
    if self.y > screen.get_height() + 100:
        self.kill()
        guidedMissile -= 1
    if self.y < -100:
        self.kill()            
        guidedMissile -= 1
4

1 に答える 1