我正在尝试使用Android中的2D图形,并且我对创建基于sprite的“沙盒”进行游戏的想法很感兴趣。我在网上看了一下并发现了一些很好的教程,但我遇到了一个相当基本的问题:我的精灵比地形移动速度快,并且“滑动”它。此外,他慢慢地超过地形滚动并移动到视图的边缘。
我有一个动画精灵,我想在世界各地移动。我这样做是通过改变他的绝对坐标(在'update()'函数中设置X和Y位置并应用标量倍数来加速或减慢他移动的速度。
this.setXPos(currX + (speed * dx2));
this.setYPos(currY + (speed * dy2));
在精灵下面,我正在从位图中绘制“地形”。我想继续通过上面的坐标访问器移动该精灵,但也移动我的视图并滚动地形,以便精灵保持在相同的相对屏幕位置,但移动通过“世界”。我有一个不完美的实现,其中player
是我的精灵,field
是我的地形:
@Override
protected void onDraw(Canvas canvas)
{
player.updateLocation(GameValues.speedScale);
field.update(new Point(player.getXPos(), player.getYPos()));
field.draw(canvas);
player.draw(canvas);
//more stuff here...
}
field.update()
看起来像(警告:硬编码的疤痕):
public void update(Point pt)
{
sourceRect.left = pt.x - 240;
sourceRect.right = pt.x + 240;
sourceRect.top = pt.y - 400;
sourceRect.bottom = pt.y + 400;
}
我认为最终我会获得屏幕尺寸并减少“hack-y”,但快速获得一些东西。这很容易成为我的问题所在。迫切需要的是field.draw()
:
@Override
public void draw(Canvas canvas)
{
try
{
canvas.drawBitmap(fieldSheet, sourceRect, destRect, null);
}
catch(Exception e)
{
//Handle Exception...
}
}
您会注意到我正在使用drawBitmap()
的重载接受源和目标Rect,并且field.update()
方法移动该sourceRect以匹配精灵的移动。如何保持“相机(可以这么说)”以精灵为中心并适当滚动地形?我原本以为只移动sourceRect并保持一个常量destRect就会这样做,但现在我想我必须用精灵移动destRect围绕“世界”,同时保持相同的尺寸。
是否有更好的(阅读功能)方式使这项工作?我有点可耻地来到这里,因为我认为这应该比我看起来要容易一些。任何和所有的帮助或建议表示赞赏。谢谢!
* 编辑 *以与精灵相同的速度移动目标Rect
是否有意义?我想我把源和目的地Rect
混为一谈,让destRect不动了。在我有机会尝试之后我会更新结果(也许在午餐时间)。
* Edit_2: *更改目标矩形并没有让我在那里,但使用View.scrollBy(x, y)
方法让我接近完全满意。剩下的问题是如何将“视图”滚动“剪辑”为表示“字段”的矩形。我相信View.getLeft()
和View.getTop()
函数会被屏幕宽度和高度所抵消,可用于指定Rect
,可以在“世界”的约束内虚拟移动并阻止进一步的分歧与View.scrollBy()
方法争论。我之所以采用这种方法,是因为View
似乎没有位于绝对空间,而View.getLeft()
调用,即使在View.scrollBy(x, y)
之后,其中x> 0,返回0。