Python Cocos2d:tiles只显示一次

时间:2013-01-24 22:51:08

标签: python python-2.7 pyglet cocos2d-python

我正在开发一个自定义平铺地图加载器。似乎工作正常,我没有得到任何错误,但屏幕只显示每种类型的1个瓷砖。

这是文件结构:

/main.py 
/other/render2.py 
/other/render.py

这是render2.py文件:

import pyglet, json
from pyglet.window import key
from pyglet.gl import *
from ConfigParser import SafeConfigParser
from cocos.layer import *
from cocos.batch import *
from cocos.sprite import Sprite

class renderer( Layer ):
    #init function
    def __init__(self):
        super( renderer, self ).__init__()

    #call function, returns the map as a list of sprites, and coordinates
    def __call__(self, mapname):

        #runs the map file parser
        parser = SafeConfigParser()

        #reads the map file
        try:
            world = parser.read('maps/'+mapname+'.txt')
            print world
        except IOError:
            return

        #These variables the config from the map file
        tileSize = int(parser.get('config', 'tilesize'))
        layers = int(parser.get('config', 'layers'))

        mapList = []

        #the super mega advanced operation to render the mapList
        for i in range(0,layers):
            layer = json.loads(parser.get('layer'+str(i), 'map'))
            tileType = parser.get('layer'+str(i), 'tiletype')
            nTiles = int(parser.get('layer'+str(i), 'tiles'))
            tileSet  = []

            #this over here loads all 16 tiles of one type into tileSet
            for n in range(0, nTiles):
                tileSet.append(Sprite("image/tiles/"+tileType+"/"+str(n)+".png", scale = 1, anchor = (0,0)))

            for x in range(0, len(layer)):
                for y in range(0, len(layer[x])):
                    X = (x*tileSize)
                    Y = (y*tileSize)
                    total = [tileSet[layer[x][y]], i, X, Y]
                    print layer[x][y], tileSet[layer[x][y]]
                    mapList.append(total)
        return mapList

这是一个回归的例子:

 [<cocos.sprite.Sprite object at 0x060910B0>, 0, 0,0 ]
 [<cocos.sprite.Sprite object at 0x060910B0> , 0, 64,64 ]

它返回一个巨大的列表,其中包含很多这样的子列表。

当我从main.py文件中调用它时,它只绘制每种类型的最后一个tile。 这是main.py文件:

import sys, os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))

import pyglet
import threading,time
from pyglet import clock
from pyglet.gl import *
from cocos.director import *
from cocos.menu import *
from cocos.scene import *
from cocos.layer import *
from cocos.actions import *
from cocos.batch import *
from cocos.sprite import Sprite
from other.render2 import renderer
import random; rr = random.randrange
class Background(ScrollableLayer):
    def __init__(self):
        super(Background, self).__init__()
        world = renderer()
        bg = world('sampleidea')


        batch = BatchNode()
        for i in range(0, len(bg)):
            l= bg[i][1]
            x= bg[i][2]
            y= bg[i][3]

            spr = bg[i][0]
            spr.position =(x,y)
            batch.add(spr, z = l)

        self.add(batch)
class Menu(Layer):
    def __init__(self):
        super(Menu, self).__init__()
        title = Sprite('image/title.png' )
        title.position = (400,520)
        self.add( title )


def start():
    director.set_depth_test()
    background = Background()
    menu = Menu()
    scene = Scene(background, menu)
    return scene

def init():
    director.init( do_not_scale=True, resizable=True, width=1280, height=720)
def run(scene):
    director.run( scene )

if __name__ == "__main__":
    init()
    s = start()
    run(s)

我做错了什么?我有一个较旧的render.py,它确实有效,但我重新创建它,因为它为每个tile加载了每个sprite文件。这需要很长时间才能在大地图上加载。

这是我以前用过的旧的render.py。 它完全不同,因为它也使用了不同的地图文件。

import pyglet, json
from pyglet.window import key
from pyglet.gl import *
from ConfigParser import SafeConfigParser
from cocos.layer import *
from cocos.batch import *
from cocos.sprite import Sprite

class renderer( Layer ):
    def __init__(self):
        super( renderer, self ).__init__()
    def __call__(self, mapname):
        parser = SafeConfigParser()
        try:
            world = parser.read('maps/'+mapname+'.txt')
            print world
        except IOError:
            print("No world file!")
            return

        tilesize = json.loads(parser.get('data', 'tilesize'))
        world = json.loads(parser.get('data', 'world'))

        maplist = []
        for l in range(len(world)):

            for x in range(len(world[l])):

                for y in range(len(world[l][x])):
                    if world[l][x][y] != None:
                        foldername = str(world[l][x][y][0])
                        imagename = str(world[l][x][y][1])


                        spr = Sprite("image/tiles/"+foldername+"/"+imagename+".png", scale = 1, anchor = (0,0))

                        X = (x*tilesize)
                        Y = (y*tilesize)

                        total = [spr, l, X, Y]

                        maplist.append(total)

        return maplist

是否可以使新的“渲染”起作用?

1 个答案:

答案 0 :(得分:2)

问题是我的新优化“渲染器”创建了一堆 cocos.sprite.Sprite 对象,而不是像我想象的那样只加载图像文件。我的问题中的代码只是一遍又一遍地重新定位了相同的sprite对象。要解决这个问题,可以通过使用 pyglet.image.load()打开图像并使用它创建精灵对象来实现。 例如:

f = pyglet.image.load('sprite.png')
batch = CocosNode()
batch.position = 50, 100
add(batch)
for i in range(0, 200):
    test = Sprite(f)        
    test.position = i*10,i*10
    batch.add( test )