【问题标题】:Python Cocos2d: tiles show up only oncePython Cocos2d:瓷砖只显示一次
【发布时间】:2014-02-16 04:17:10
【问题描述】:

我正在开发一个自定义平铺地图加载器。似乎工作正常,我没有收到任何错误,但屏幕只显示每种类型的 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 文件中调用它时,它只绘制每种类型的最后一个图块。 这是 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,它确实有效,但我重新制作了它,因为它为每个图块加载了每个精灵文件。加载大地图需要很长时间。

这是我之前一直在使用的旧的 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

是否可以让新的“渲染”工作?

【问题讨论】:

    标签: python python-2.7 pyglet cocos2d-python


    【解决方案1】:

    问题是我新优化的“渲染器”创建了一堆 cocos.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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      相关资源
      最近更新 更多