Cocos2d/Python: видимая часть слоя смещается в противоположном направлении фокуса
Новичок здесь, пытается сделать игру на Python с Cocos2d 0.6.0:)
Я использую ScrollingManager's set_focus(x, y)
метод прокрутки вокруг 2D карты плитки с помощью мыши. Слои, кажется, прокручиваются правильно, однако, кажется, что есть слой обрезки, того же размера, что и окно (512x512), движущееся в противоположном направлении, частично мешающее моим слоям. Как я могу заставить это уйти?
Я могу лучше всего визуализировать это так:
Снимок экрана 1: начальный фокус при запуске, видны все слои
Снимок экрана 2: слои кажутся обрезанными после прокрутки вниз
Для справки, я использую класс ScrollingManager Cocos2d 0.6.0 для Python.
[РЕДАКТИРОВАТЬ] Я создал автономный скрипт, который должен быть тестируемым.
import pyglet
from pyglet.window import key, mouse
import cocos
from cocos import tiles, actions, layer
import random
def main():
global mouse, scroller
global fx, fy, winx, winy, offsetx, offsety
# map size (cells)
hsize = 128
vsize = 128
# window size (pixels)
winx = 960
winy = 640
# coordinates of screen focus
fx = 0
fy = 0
from cocos.director import director
director.init(width=winx, height=winy, do_not_scale=True, resizable=True)
offsetx = hsize * 16 - winx
offsety = vsize * 16 - winy
##################################
### creation of randomized map ###
##################################
tileset = {}
# a 16x16 pixel tile (blue, represents water)
tileset['water'] = pyglet.image.ImageGrid(pyglet.image.load('resources/water.png'), 4, 4)
# a 16x16 pixel tile (green, represents land)
tileset['land'] = pyglet.image.ImageGrid(pyglet.image.load('resources/land.png'), 4, 4)
# empty 2D array holding RectCells
cellMatrix = [ [None]*hsize for i in range(vsize) ]
# filling of array
for v in range(vsize):
for h in range(hsize):
if random.random() < 0.5:
image = tileset['water'][1]
else:
image = tileset['land'][1]
tile = cocos.tiles.Tile('test', {}, image, None)
cellMatrix[v][h] = cocos.tiles.RectCell(h*16, v*16, 1, 1, None, tile)
##################################
### end of creating random map ###
##################################
# creating rectMapLayer from cell array
rectMapLayer = cocos.tiles.RectMapLayer('test', 16, 16, cellMatrix, None, {})
scroller = cocos.layer.ScrollingManager()
scroller.add(rectMapLayer, 0, 'test')
main_scene = cocos.scene.Scene(scroller)
def on_mouse_motion(x, y, dx, dy):
global fx, fy, offsetx, offsety, winx, winy
if x > winx - 16:
fx = min(offsetx, fx + 16)
if x < 16:
fx = max(0, fx - 16)
if y > winy - 16:
fy = min(offsety, fy + 16)
if y < 16:
fy = max(0, fy - 16)
scroller.set_focus(fx + winx/2, fy + winy/2, force=True)
director.window.push_handlers(on_mouse_motion)
director.run(main_scene)
# run game
if __name__ == '__main__':
main()
Спасибо за ваши ответы!
1 ответ
Решил проблему, изменив вид на каждый отдельный слой, как таковой:
rectMapLayer = cocos.tiles.RectMapLayer('test', 16, 16, cellMatrix, None, {})
scroller = cocos.layer.ScrollingManager()
scroller.add(rectMapLayer, 0, 'test_layer')
# focus coordinates
x = 50
y = 50
scroller.get('test_layer').set_view(0, 0, 1024, 1024, -x, -y)
Это приведет к тому, что тестовый слой установит свой вид от источника (0, 0), с шириной / высотой 1024x1024 и смещением -x, -y.