皮格莱特行走动画。错误:'NoneType'对象没有属性'draw'



此代码在黑色背景上显示图像assassin1.png。这个想法是,只要我按下<right-direction>键,角色就会移动并使用assassin2.pngassassin3.png显示动画。我已经能够移动角色并成功显示动画,只是不能同时显示两者。

只要我不按 <right direction> 键,以下代码就会运行:

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 = self.player.move(batch = self.batch_draw, img = sprite_type("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.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()

一旦我按<right-direction>键,就会发生以下错误:

Traceback (most recent call last):
  File "ircex.py", line 55, in <module>
    pyglet.app.run()
  File "/usr/local/lib/python2.7/dist-packages/pyglet/app/__init__.py", line 264, in run
    EventLoop().run()
  File "/usr/local/lib/python2.7/dist-packages/pyglet/app/xlib.py", line 93, in run
    sleep_time = self.idle()
  File "/usr/local/lib/python2.7/dist-packages/pyglet/app/__init__.py", line 193, in idle
    window.dispatch_event('on_draw')
  File "/usr/local/lib/python2.7/dist-packages/pyglet/window/__init__.py", line 1219, in dispatch_event
    EventDispatcher.dispatch_event(self, *args)
  File "/usr/local/lib/python2.7/dist-packages/pyglet/event.py", line 349, in dispatch_event
    return getattr(self, event_type)(*args)
  File "pyglet-walk.py", line 37, in on_draw
    self.player.draw()  
AttributeError: 'NoneType' object has no attribute 'draw'

在代码中,move() 方法返回None

class Assassin(pyglet.sprite.Sprite):
    (...)

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

然后在下面的行中,您将self.player设置为返回值 player.move() ,即None

self.player = self.player.move(batch = self.batch_draw, img = sprite_type("moving-forward"))

这会导致AttributeError: 'NoneType' object has no attribute 'draw',因为self.playerNone的,你试图打电话给draw()

最新更新