Python 精灵的移动方向与它所面对的方向不同
我有一个问题,我的精灵没有在同一个方向,因为它面临的移动。这是一只甲虫的俯视图,有10幅图像为它的腿运动设置了动画。精灵动画效果很好,通过旋转图像并重新定心到上一个中心来选择新的“随机”方向也很有效 我无法工作的是精灵向前移动,也就是说每隔一秒左右就朝着它选择/面对的新方向移动。新的方向只是从先前位置向左或向右旋转10-15度。取而代之的是,每当精灵选择一个新的方向时,它就会以看起来像是随机运动的方式移动。例如,它将朝东向西南移动,或朝南向北移动等 我怀疑问题出在move()方法中,该方法没有通过trig值正确地转换运动。我添加到rect.x值是因为它与笛卡尔坐标系相同,而从rect.y值中减去是因为它在pygame中与笛卡尔坐标系相反。向下是正增长,向上是减小y值,负增长 甲虫精灵的等级如下:Python 精灵的移动方向与它所面对的方向不同,python,python-3.x,pygame,Python,Python 3.x,Pygame,我有一个问题,我的精灵没有在同一个方向,因为它面临的移动。这是一只甲虫的俯视图,有10幅图像为它的腿运动设置了动画。精灵动画效果很好,通过旋转图像并重新定心到上一个中心来选择新的“随机”方向也很有效 我无法工作的是精灵向前移动,也就是说每隔一秒左右就朝着它选择/面对的新方向移动。新的方向只是从先前位置向左或向右旋转10-15度。取而代之的是,每当精灵选择一个新的方向时,它就会以看起来像是随机运动的方式移动。例如,它将朝东向西南移动,或朝南向北移动等 我怀疑问题出在move()方法中,该方法没有通
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)
class-Foe():
定义初始化(自身,位置):
self.sprites=[]
对于范围(1,11)内的i:
file=pg.image.load(“belletprac1/000”+str(i)+“a.png”).convert()#10个名为“0001a-10a.png”的精灵文件最后1个处于空闲状态
#set_colorkey((0,255,255))
self.sprites.append(文件)
self.move\u anim\u index=9
self.image=self.sprites[self.move\u anim\u index]
self.image=self.image.copy()
self.rect=self.image.get_rect(中心=位置)
self.move\u rect\u coords=[self.rect.x,self.rect.y]
自转角=90
自身速度=3
self.time=0
self.frames\u计数器=0
def move_动画(自身,速率=2):#速率以帧为单位
如果self.u计数器%rate==0:
self.move\u anim\u index+=1
如果self.move\u anim\u index>=9:
self.move\u anim\u index=0
self.image=self.sprites[self.move\u anim\u index]
#self.rect=self.image.get_rect(中心=self.rect.center)
self.image=self.image.copy()
self.rotated_image=pg.transform.rotate(self.image,self.angle-90)
self.rect=self.rotated\u image.get\u rect(center=self.rect.center)
def移动(自我,最后一次勾选):
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\u rect\u coords=[self.rect.x,self.rect.y]
def更改方向(自我、更改时间):#更改帧中的时间
如果self.frames\u计数器%change\u time==0:
a=随机选择([-1,1])
自转角+=15
如果self.angle<0:self.angle+=360
如果self.angle>360:self.angle-=360
#如果self.rect.x<
def跟踪时间(自身、最后一次勾选、金额):
self.time+=最后一次勾选
self.u计数器+=1
如果self.time>=最后一次勾选*金额:
self.time=0
self.counter=0
def思考(自我,最后一次勾选):
自我跟踪时间(最后一次滴答声,FPS*2)
自我改变方向(FPS)
def更新(自我、最后一次勾选、屏幕显示):
自我思考(最后一刻)
自我移动(最后一次勾选)
def提取(自身,屏幕):
screen.blit(self.rotated\u image,self.move\u rect\u coords)
这是github的完整代码和存储库:
sin()
,cos()
和其他三角函数使用radians
->cos(math.radians(angle))
使用print()
检查变量中的内容以及执行的代码部分。这有助于发现问题。sin()
和cos()
需要弧度-cos(数学弧度(角度))
非常感谢!这就解决了问题。侧注:您可以删除行self.rotated\u image=self.image.copy()
,因为pg.transform.rotate
返回一个新曲面,并且不修改原始曲面。另外,我建议看一看,我想也可以帮你。