0

このコードをどのように機能させるか:pygletをインストールして変更しassassin1.png、このコードをファイルに保存したディレクトリに保存されているイメージの名前を使用します。assassin2.pngassassin3.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()

このコードはassassin1.png、位置(50 30)でキーが押されていないときに表示され、右のキーが押されていると、キャラクターが前方に移動し、0.3秒ごとに2つの画像が切り替わり、歩いているキャラクターのように見えますassassin2.pngassassin3.pngまた、fpsも表示されます。

現在、キーを離すと、キャラクターは元の位置(50、30)に戻ります。もう一度キーを押すと、歩行中のキャラクターが最後に停止した位置からキャラクターが移動します。

歩くアニメーションキャラクターと立っているキャラクターが同じクラスの2つの異なるインスタンスであるため、これが発生する理由を理解しています。私は最初、クラス変数を使用して位置を保存できると思いました。しかし、私は実用的な解決策を思い付くことができないようです。誰かが私に何ができるか考えていますか?

編集1(@Hugh Bothwell)

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()
4

1 に答える 1

1

立ちキャラクターと歩行キャラクターの代わりに、移動状態のキャラクターが1人必要です。

于 2012-06-30T15:41:17.383 に答える