2013-01-24 95 views
1

我正在處理自定義平鋪的地圖加載器。似乎工作正常,我沒有得到任何錯誤,但屏幕上只顯示每個類型1個瓷磚。Python Cocos2d:瓷磚只出現一次

這是文件結構:

/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,它可以工作,但我重新制作了它,因爲它爲每個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 

是否有可能使新的「渲染」工作?

回答

2

問題是,我的新優化的「渲染器」創建了一堆對象,而不是像我想的那樣只加載圖像文件。我的問題中的代碼只能以這種方式重複定位同一個精靈對象。爲了解決這個問題,實現它的方法是用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)