Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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 Pyglet:如何让同一类的sprite实例共享坐标?_Python_Class_Pyglet - Fatal编程技术网

Python Pyglet:如何让同一类的sprite实例共享坐标?

Python Pyglet:如何让同一类的sprite实例共享坐标?,python,class,pyglet,Python,Class,Pyglet,如何使此代码工作:只需安装pyglet,并使用保存此代码到文件的目录中存储的图像名称更改sugger1.png、sugger2.png和sugger3.png import pyglet def sprite_type(type_ = "standing"): if type_ == "moving-forward": moving_forward_image_list = [pyglet.image.load('assassin2.png'), pyglet.imag

如何使此代码工作:只需安装pyglet,并使用保存此代码到文件的目录中存储的图像名称更改
sugger1.png
sugger2.png
sugger3.png

import pyglet

def sprite_type(type_ = "standing"):
    if type_ == "moving-forward":
        moving_forward_image_list = [pyglet.image.load('assassin2.png'), pyglet.image.load('assassin3.png')]
        moving_forward_animation = pyglet.image.Animation.from_image_sequence(moving_forward_image_list, 0.3) 
        return moving_forward_animation
    if type_ == "standing":
        standing_animation = pyglet.image.load("assassin1.png")
        return standing_animation

class Assassin(pyglet.sprite.Sprite):        
    def __init__(self, batch, img):
        pyglet.sprite.Sprite.__init__(self, img, x = 50, y = 30)

class Game(pyglet.window.Window):
    def __init__(self):
        pyglet.window.Window.__init__(self, width = 315, height = 220)
        self.batch_draw = pyglet.graphics.Batch()
        self.player_dict = {"standing": Assassin(batch = self.batch_draw, img = sprite_type()), "moving-forward": Assassin(batch = self.batch_draw, img = sprite_type(type_ = "moving-forward"))}
        self.player = self.player_dict["standing"]
        self.fps_display = pyglet.clock.ClockDisplay()
        self.keys_held = []      
        self.schedule = pyglet.clock.schedule_interval(func = self.update, interval = 1/60.) 

    def on_draw(self):
        self.clear()
        self.fps_display.draw()
        self.batch_draw.draw()
        self.player.draw()  

    def on_key_press(self, symbol, modifiers):
        self.keys_held.append(symbol)
        if symbol == pyglet.window.key.RIGHT:
            self.player = self.player_dict["moving-forward"]
            print "The 'RIGHT' key was pressed"

    def on_key_release(self, symbol, modifiers):
        self.keys_held.pop(self.keys_held.index(symbol))
        self.player = self.player_dict["standing"]

    def update(self, interval):
        if pyglet.window.key.RIGHT in self.keys_held:
            self.player.x += 50 * interval

if __name__ == "__main__":
    window = Game()
    pyglet.app.run()
此代码显示
刺客1.png
,而在位置(50 30)上未按住任何键,当按住右键时,角色向前移动,每0.3秒切换两个图像
刺客2.png
刺客3.png
,以产生行走角色的错觉。还显示了fps

当前,当您释放键时,角色将返回到原始位置(50,30)。再次按键时,角色将从行走角色最后停止的位置移动。

我理解为什么会发生这种情况,因为行走动画角色和站立角色是同一类的两个不同实例。 我首先想到使用类变量可以存储位置。但我似乎无法想出一个有效的解决方案。有人知道我能做什么吗?

编辑1(@Hugh Bothwell) 导入pyglet def sprite_类型(type=“standing”): 如果类型=“向前移动”: 向前移动图像列表=[pyglet.image.load('sugger2.png'),pyglet.image.load('sugger3.png')] 向前移动\u动画=pyglet.image.animation.from\u image\u序列(向前移动\u image\u列表,0.3) 返回向前移动的动画 如果类型=“站立”: standing_animation=pyglet.image.load(“刺客1.png”) 返回站姿动画 职业刺客(pyglet.sprite.sprite): 定义初始(自身、批次、img): pyglet.sprite.sprite.\uuuuu初始化(self,img,x=50,y=30) def支架(自身、批次、img): self.batch=batch self.img=img def移动(自身、批次、img): self.batch=batch self.img=img 班级游戏(pyglet.window.window): 定义初始化(自): pyglet.window.window.\uuuuu初始化(self,宽度=315,高度=220) self.batch_draw=pyglet.graphics.batch() self.player=刺客(batch=self.batch\u draw,img=sprite\u type()) self.fps_display=pyglet.clock.ClockDisplay() self.keys_hold=[] self.schedule=pyglet.clock.schedule_interval(func=self.update,interval=1/60) def on_牵引(自): self.clear() self.fps_display.draw() self.batch_draw.draw() self.player.draw() def on_键按(自身、符号、修改器): self.keys\u hold.append(符号) 如果symbol==pyglet.window.key.RIGHT: self.player.move(batch=self.batch\u draw,img=sprite\u类型(“向前移动”)) #如果我把下面这行改为: #self.player=self.player.move(batch=self.batch\u draw,img=sprite\u类型(“前进”)) #按下该键时出现此错误: #self.player.draw(),AttributeError:'NoneType'对象没有属性'draw' 打印“按下“右”键” 钥匙释放时的def(自身、符号、修改器): self.keys\u hold.pop(self.keys\u hold.index(符号)) self.player.stand(batch=self.batch\u draw,img=sprite\u类型(“standing”)) def更新(自我,间隔): 如果按住self.keys中的pyglet.window.key.RIGHT: self.player.x+=50*间隔 如果名称=“\uuuuu main\uuuuuuuu”: 视窗=游戏() pyglet.app.run()文件
您需要一个具有移动状态的角色,而不是站立角色和行走角色。

我添加了移动和站立方法。但是现在我的角色在移动时不再显示行走动画。你能看一下我的编辑吗?
import pyglet

def sprite_type(type_ = "standing"):
    if type_ == "moving-forward":
        moving_forward_image_list = [pyglet.image.load('assassin2.png'), pyglet.image.load('assassin3.png')]
        moving_forward_animation = pyglet.image.Animation.from_image_sequence(moving_forward_image_list, 0.3) 
        return moving_forward_animation
    if type_ == "standing":
        standing_animation = pyglet.image.load("assassin1.png")
        return standing_animation

class Assassin(pyglet.sprite.Sprite):
    def __init__(self, batch, img):
        pyglet.sprite.Sprite.__init__(self, img, x = 50, y = 30)

    def stand(self, batch, img):
        self.batch = batch
        self.img = img

    def move(self, batch, img):
        self.batch = batch
        self.img = img      

class Game(pyglet.window.Window):
    def __init__(self):
        pyglet.window.Window.__init__(self, width = 315, height = 220)
        self.batch_draw = pyglet.graphics.Batch()
        self.player = Assassin(batch = self.batch_draw, img = sprite_type())
        self.fps_display = pyglet.clock.ClockDisplay()
        self.keys_held = []      
        self.schedule = pyglet.clock.schedule_interval(func = self.update, interval = 1/60.) 

    def on_draw(self): 
        self.clear()         
        self.fps_display.draw()
        self.batch_draw.draw()
        self.player.draw()  

    def on_key_press(self, symbol, modifiers):
        self.keys_held.append(symbol)
        if symbol == pyglet.window.key.RIGHT:
            self.player.move(batch = self.batch_draw, img = sprite_type("moving-forward"))
            # if I put the following line here instead:
            #self.player = self.player.move(batch = self.batch_draw, img = sprite_type("moving-forward"))
            # I get this error when pressing the <right-direction> key:
            #self.player.draw(), AttributeError: 'NoneType' object has no attribute 'draw'
            print "The 'RIGHT' key was pressed"

    def on_key_release(self, symbol, modifiers):
        self.keys_held.pop(self.keys_held.index(symbol))
        self.player.stand(batch = self.batch_draw, img = sprite_type("standing"))

    def update(self, interval):
        if pyglet.window.key.RIGHT in self.keys_held:
            self.player.x += 50 * interval

if __name__ == "__main__":
    window = Game()
    pyglet.app.run()