2013-01-24 3 views
1

사용자 정의 타일 맵 로더에서 작업하고 있습니다. 잘 작동하는 것처럼 보이지만 오류는 발생하지 않지만 화면에는 각 유형의 타일이 1 개만 표시됩니다.Python Cocos2d : 타일이 한 번만 표시됩니다.

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

는 그것은 반환이이 반환 무엇의 예

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 

입니다 : 여기

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

가 render2.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) 

내가 잘못 뭐하는 거지 : 여기 main.py 파일입니까? 나이 든 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 

새로운 "렌더링"을 사용할 수 있습니까?

답변

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) 
관련 문제