【发布时间】: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