Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 精灵的移动方向与它所面对的方向不同_Python_Python 3.x_Pygame - Fatal编程技术网

Python 精灵的移动方向与它所面对的方向不同

Python 精灵的移动方向与它所面对的方向不同,python,python-3.x,pygame,Python,Python 3.x,Pygame,我有一个问题,我的精灵没有在同一个方向,因为它面临的移动。这是一只甲虫的俯视图,有10幅图像为它的腿运动设置了动画。精灵动画效果很好,通过旋转图像并重新定心到上一个中心来选择新的“随机”方向也很有效 我无法工作的是精灵向前移动,也就是说每隔一秒左右就朝着它选择/面对的新方向移动。新的方向只是从先前位置向左或向右旋转10-15度。取而代之的是,每当精灵选择一个新的方向时,它就会以看起来像是随机运动的方式移动。例如,它将朝东向西南移动,或朝南向北移动等 我怀疑问题出在move()方法中,该方法没有通

我有一个问题,我的精灵没有在同一个方向,因为它面临的移动。这是一只甲虫的俯视图,有10幅图像为它的腿运动设置了动画。精灵动画效果很好,通过旋转图像并重新定心到上一个中心来选择新的“随机”方向也很有效

我无法工作的是精灵向前移动,也就是说每隔一秒左右就朝着它选择/面对的新方向移动。新的方向只是从先前位置向左或向右旋转10-15度。取而代之的是,每当精灵选择一个新的方向时,它就会以看起来像是随机运动的方式移动。例如,它将朝东向西南移动,或朝南向北移动等

我怀疑问题出在move()方法中,该方法没有通过trig值正确地转换运动。我添加到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)
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
返回一个新曲面,并且不修改原始曲面。另外,我建议看一看,我想也可以帮你。