我正在使用Action Script 3 / Starling制作一个平铺游戏。
假设我有这样的场景:
+----+----+----+----+----+
| | | | | | 0th row - highest
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
| | | | | | 3rd row - lowest
+----+----+----+----+----+
在这个例子中,我有一个5x4平铺场景。 在真实的游戏中,我将拥有100x100平铺场景。
此平方地图用于RPG游戏,其中每个方格可被对象或角色占据。物体可以像树一样高,可以隐藏物体。
这里的关键概念是“将对象隐藏在后面”,行号越大,它将与屏幕“最近”,如果行号为N,则从0到N-1的行将是隐藏(实际上是“重叠”)N层中的对象(例如:如果一个角色站在高度为2的位置(x = 1,y = 2),并且树站在位置(x = 1, y = 3),树将与“上方”字符完全重叠。
我想到了一个可能的选择:
如果我有当前的Starling精灵(由Starling自己创建,将其类传递给Starling构造函数),并为每一行创建一个Sprite(子精灵),将其附加到父精灵:
private var rows:Vector.<Sprite> = null;
public function createMapRows(nRows:int) {
this.rows = new Vector.<Sprite>();
for(var r:int = 0; r < nRows; r++) {
this.addChild(new Sprite());
}
}
如果角色向左或向右移动,它将保留在同一层上。如果角色向上移动,我可以将玩家从第N个创建的精灵移动到第(N-1)个创建的精灵,保持其(X,Y)坐标并执行“向上移动”动画。如果角色向下移动,我可以将玩家从第N个创建的精灵移动到第(N-1)个创建的精灵,保持其(X,Y)坐标并执行“向下移动”动画。
我相信这会奏效,但我关注一个方面:表现。
我的问题是:这是关于内存性能的最佳方法吗?或者可能是一个更好的解决方案,不涉及N + 1 *问题? (实际上,如果第一个问题有“否”的答案,我想要一个替代方案)。
(*不,这不是关于数据库记录的N + 1问题:p,但精灵数量)。
答案 0 :(得分:1)
有一件事是让你拥有每一行的精灵实例,或只为该行的对象。
我会这样做:
基础Sprite对象包含所有地面图块,因为总是在其他所有地方。 最重要的是,我会使一个Sprite填充该行的所有对象。
Clouds
Row 0 objects
Row 1 objects
Row 2 objects <-- player is here at the moment
Row 3 objects
BaseLayer - ground tiles
而且,就像你之前提到的那样,如果玩家向北或向南移动,只需添加玩家Sprite,那么就是右边的Sprite。