如何在pygame中获取精灵的当前坐标?

问题描述

我正在尝试制作一个简单的游戏,玩家必须躲避敌人或向他们射击。到目前为止,玩家和敌人的部分看起来不错,但我被困在导弹的事情上。我试图弄清楚如何在按下鼠标左键时在玩家旁边产生导弹。所以我正在寻找一种方法获取玩家的当前坐标,在这些坐标的右侧添加一个,如果玩家按下左按钮,导弹的坐标是什么。

class Player(pg.sprite.Sprite):
    def __init__(self):
        super(Player,self).__init__()
        self.surf = pg.image.load("Player.png").convert()
        self.surf = pg.transform.smoothscale(self.surf,(75,75))
        self.surf.set_colorkey((255,255,255),RLEACCEL)
        self.rect = self.surf.get_rect()
    def move(self,pressed_keys):
        if pressed_keys[K_UP]:
            self.rect.move_ip(0,-10)
        if pressed_keys[K_DOWN]:
            self.rect.move_ip(0,10)
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-10,0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(10,0)
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH
        if self.rect.top <= 0:
            self.rect.top = 0
        if self.rect.bottom >= SCREEN_HEIGHT:
            self.rect.bottom = SCREEN_HEIGHT

class Missile(pg.sprite.Sprite):
    def __init__(self):
        super(Missile,self).__init__()
        self.surf = pg.image.load("Missile.png").convert()
        self.surf = pg.transform.smoothscale(self.surf,(20,20))
        self.surf.set_colorkey((0,0),RLEACCEL)
        self.rect = self.surf.get_rect(center=)
    def launch(self):
        self.rect.move_ip(5,0)
        if self.rect.left < 0:
            self.kill()

解决方法

坐标存储在 rect 属性中。 rect 属性是一个 pygame.Rect 对象,指定 Sprite 的边界矩形。它为位置和大小提供了许多虚拟属性。例如,精灵的左上角是 self.rect.topleft 或 (self.rect.x,self.rect.y)。

我建议将初始坐标传递给 Missile 对象:

class Missile(pg.sprite.Sprite):
    def __init__(self,pos):
        super(Missile,self).__init__()
        self.surf = pg.image.load("Missile.png").convert()
        self.surf = pg.transform.smoothscale(self.surf,(20,20))
        self.surf.set_colorkey((0,0),RLEACCEL)
        self.rect = self.surf.get_rect(center = pos)

在创建新的 Missile 对象时从玩家获取当前坐标。例如:

missile_pos = player.rect.center
new_missile = Missile(missile_pos)