【问题标题】:Sprite not moving in the same direction it is facing精灵没有朝着它所面对的方向移动
【发布时间】:2017-11-24 14:40:33
【问题描述】:

我有一个问题,我的精灵没有朝着它所面对的方向移动。它是甲虫的俯视图,10 幅图像为其腿部运动设置动画。精灵动画效果很好,通过旋转图像并重新居中到前一个中心来选择新的“随机”方向也可以。

我无法开始工作的是要“向前”移动的精灵,即每秒左右移动到它选择/面对的新方向。新方向只是从先前位置向左或向右旋转 10-15 度。相反,每次精灵选择一个新方向时,它都会以看似随机的移动方式移动。例如,它会向东移动向西南,或者向南移动向北等。

我怀疑问题出在 move() 方法中,其中移动没有通过触发值正确转换。我正在添加 rect.x 值,因为它与笛卡尔坐标系统相同,同时从 rect.y 值中减去,因为与笛卡尔相比,它在 pygame 中是倒置的。向下是正增加,向上 - 减少 y 值,负增加。

甲虫精灵的类如下:

class Foe():
    def __init__(self, location):
        self.sprites = []
        for i in range(1, 11):
            file = pg.image.load("beetleprac1/000"+str(i)+"a.png").convert()  # 10 sprite files named "0001a-10a.png" last 1 is idle stance
            #file.set_colorkey((0, 255, 255))
            self.sprites.append(file)
        self.move_anim_index = 9
        self.image = self.sprites[self.move_anim_index]
        self.rotated_image = self.image.copy()
        self.rect = self.image.get_rect(center=location)
        self.move_rect_coords = [self.rect.x, self.rect.y]
        self.angle = 90
        self.speed = 3
        self.time = 0
        self.frames_counter = 0


    def move_anim(self, rate=2): # rate is in frames
        if self.frames_counter % rate == 0:
            self.move_anim_index += 1
            if self.move_anim_index >= 9:
                self.move_anim_index = 0
            self.image = self.sprites[self.move_anim_index]
            #self.rect = self.image.get_rect(center=self.rect.center)
            self.rotated_image = self.image.copy()
            self.rotated_image = pg.transform.rotate(self.image, self.angle - 90)
            self.rect = self.rotated_image.get_rect(center=self.rect.center)


    def move(self, last_tick):
        self.move_anim()   
        self.rect.x += int(self.speed * math.cos(self.angle)) 
        self.rect.y -= int(self.speed * math.sin(self.angle))
        self.move_rect_coords = [self.rect.x, self.rect.y]


    def change_direction(self, change_time): # change_time in frames
        if self.frames_counter % change_time == 0: 
            a = random.choice([-1, 1])
            self.angle += 15
            if self.angle < 0: self.angle += 360
            if self.angle > 360: self.angle -=360

        #if self.rect.x <  



    def track_time(self, last_tick, amount):
        self.time += last_tick
        self.frames_counter += 1
        if self.time >= last_tick * amount:
            self.time = 0
            self.counter = 0


    def think(self, last_tick):
        self.track_time(last_tick, FPS*2)
        self.change_direction(FPS)


    def update(self, last_tick, screen_rect):
        self.think(last_tick)
        self.move(last_tick)


    def draw(self, screen):
        screen.blit(self.rotated_image, self.move_rect_coords)

这里是 github 上的完整代码和存储库:https://github.com/fn88/buganimprac2

【问题讨论】:

  • 使用print() 检查变量中的内容以及执行了哪部分代码。它有助于发现问题。
  • sin()cos() 需要弧度 - cos(math.radians(angle))
  • 非常感谢!这样就解决了。
  • 旁注:您可以删除行self.rotated_image = self.image.copy(),因为pg.transform.rotate 返回一个新表面并且不修改原始表面。另外,我建议看看pygame sprites,我认为vectors 也可以帮助你。

标签: python python-3.x pygame


【解决方案1】:

sin()cos()等三角函数使用radians -> cos(math.radians(angle))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多