1

私はカスタムタイルマップローダーに取り組んでいます。正常に動作しているようです。エラーは発生しませんが、画面には各タイプのタイルが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

新しい「レンダリング」を機能させることは可能ですか?

4

1 に答える 1

2

問題は、私の新しい最適化された「レンダラー」が、 思ったように画像ファイルをロードするのではなく、大量の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 )
于 2013-01-25T08:47:44.610 に答える