【问题标题】:Cocos2d: AttributeError: 'Director' object has no attribute '_window_virtual_width'Cocos2d: AttributeError: 'Director' 对象没有属性 '_window_virtual_width'
【发布时间】:2012-11-06 07:55:14
【问题描述】:

我们正在使用 cocos2d 框架来创建游戏。我们对这个框架完全陌生,所以我们无法让 director 对象按预期工作。这是我们的代码框架:

from cocos.director import director
from cocos.layer import base_layers


import sys
import math
import os

import pyglet
import cocos


world_width = 1000
world_height = 1000
class NetworkMap(cocos.layer.ScrollableLayer):
    def __init__(self, world_width, world_height):
        self.world_width = world_width
        self.world_height = world_height
        super(NetworkMap, self).__init__()
        bg = ColorLayer(170,170,0,255,width=500,height=500)
        self.px_width = world_width
        self.px_height = world_height
        self.add(bg,z=0)

class TestScene(cocos.scene.Scene):
    def __init__(self):
        super(TestScene,self).__init__()

    def on_enter():
        director.push_handlers(self.on_cocos_resize)
        super(TestScene, self).on_enter()

    def on_cocos_resize(self, usable_width, usable_height):
        self.f_refresh_marks()

def main():
    scene = TestScene()
    director.init(world_width, world_height, do_not_scale=True)
    world_map = NetworkMap(world_width, world_height)
    scroller = cocos.layer.ScrollingManager()
    scroller.add(world_map)
    scene.add(scroller)
    director.run(scene)

所以由于某种原因,导演没有我们想要的所有属性。 我们的堆栈跟踪是:

Traceback (most recent call last):
File "map.py", line 49, in <module>
main()
File "map.py", line 39, in main
scene = TestScene()
File "map.py", line 29, in __init__
super(TestScene,self).__init__()
File "/usr/local/lib/python2.7/dist-packages/cocos2d-0.5.5-py2.7.egg/cocos/scene.py",     line 95, in __init__
super(Scene,self).__init__()
File "/usr/local/lib/python2.7/dist-packages/cocos2d-0.5.5-py2.7.egg/cocos/cocosnode.py", line 114, in __init__
self.camera = Camera()
File "/usr/local/lib/python2.7/dist-packages/cocos2d-0.5.5-py2.7.egg/cocos/camera.py", line 56, in __init__
 self.restore()
 File "/usr/local/lib/python2.7/dist-packages/cocos2d-0.5.5-py2.7.egg/cocos/camera.py", line 76, in restore
 width, height = director.get_window_size()
 File "/usr/local/lib/python2.7/dist-packages/cocos2d-0.5.5-py2.7.egg/cocos/director.py", line 522, in get_window_size
 return ( self._window_virtual_width, self._window_virtual_height)
AttributeError: 'Director' object has no attribute '_window_virtual_width'

【问题讨论】:

    标签: python cocos2d-iphone


    【解决方案1】:

    您需要在实例化第一个场景之前初始化导演。 director 是初始化屏幕、设置 Cocos2D 框架等的全局对象。

    我发现了一些其他错误:

    • 您需要将ColorLayer 更改为完全合格,例如cocos.layer.ColorLayer
    • on_enter 需要将 self 作为第一个参数。
    • 您需要在您的 TestScene 类中定义 f_refresh_marks

    这是代码的工作副本。 (工作,从某种意义上说它不会抛出错误,而不是它进行任何类型的滚动。)

    from cocos.director import director
    from cocos.layer import base_layers
    
    
    import sys
    import math
    import os
    
    import pyglet
    import cocos
    
    
    world_width = 1000
    world_height = 1000
    class NetworkMap(cocos.layer.ScrollableLayer):
        def __init__(self, world_width, world_height):
            self.world_width = world_width
            self.world_height = world_height
            super(NetworkMap, self).__init__()
            bg = cocos.layer.ColorLayer(170,170,0,255,width=500,height=500)
            self.px_width = world_width
            self.px_height = world_height
            self.add(bg,z=0)
    
    class TestScene(cocos.scene.Scene):
        def __init__(self):
            super(TestScene,self).__init__()
    
        def on_enter(self):
            director.push_handlers(self.on_cocos_resize)
            super(TestScene, self).on_enter()
    
        def on_cocos_resize(self, usable_width, usable_height):
            self.f_refresh_marks()
    
        def f_refresh_marks(self):
            pass
    
    def main():
        director.init(world_width, world_height, do_not_scale=True)
        scene = TestScene()
        world_map = NetworkMap(world_width, world_height)
        scroller = cocos.layer.ScrollingManager()
        scroller.add(world_map)
        scene.add(scroller)
        director.run(scene)
    
    if __name__ == '__main__': main()
    

    【讨论】:

    【解决方案2】:

    我遇到了同样的问题(堆栈跟踪非常相似),这是因为我试图在调用 director.init() 之前创建一个层。将 director.init() 移到代码的前面为我修复了它。

    【讨论】:

      猜你喜欢
      • 2017-09-27
      • 2012-12-01
      • 2021-04-19
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多