Cocos2d/Python:层的可视部分向相反的焦点方向移动

2024-09-28 21:38:23 发布

您现在位置:Python中文网/ 问答频道 /正文

这里是新手,正在尝试使用Cocos2d 0.6.0制作Python游戏:)

我正在使用ScrollingManager的set_focus(x, y)方法使用鼠标在2d平铺图上滚动。所涉及的层似乎滚动正确,但似乎有一个裁剪层,与窗口(512x512)大小相同,朝相反方向移动,部分阻碍了我的层。我怎么才能让它消失?在

我可以这样想象:

Screenshot 1: initial focus at startup, all layers visible

Screenshot 2: layers seem cropped after scrolling down

作为参考,我使用了用于Python的cocos2d0.6.0 ScrollingManager类。在

[编辑]我已经创建了一个可以测试的独立脚本。在

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()

谢谢你的回答!在


Tags: fromimageimportifmaincocosfocuspyglet
1条回答
网友
1楼 · 发布于 2024-09-28 21:38:23

通过更改每个单独图层上的视图来解决此问题,如下所示:

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

相关问题 更多 >