2015-07-18 68 views
1

我有一个600x1000像素的屏幕,我的播放器开始左下角附近。他的x和y坐标是(50,900)。我正在将此播放器绘制到画布上,并使用 canvas.translate(-player.getX()+GAMEWIDTH/2, 0) 确保播放器相对于x轴保持在屏幕中间。这导致我的玩家被渲染为(300,900),但玩家的x和y坐标保持在(50,900)。这提出了一个问题,因为我需要玩家的坐标与他的渲染位置相同,因为我在玩家的碰撞矩形上使用触摸事件来移动他。有什么办法可以使我的屏幕坐标相对于我的画布坐标,以便我的玩家的坐标对应于他们实际渲染的位置?或者有另一种方法可以做到这一点?如何使相对于一个画布的坐标

+0

当你做触摸事件点击检测时,你不应该总是把它传递给player.getX()+ GAMEWIDTH/2。您可以使坐标相对的唯一方法是如果您自己应用该变换。我通常为这样的事情保留一个relative.x和global.x。亲戚会在你的情况下是50,而全球将是50 + GAMEWIDTH/2。 – ericjbasti

+0

感谢这让我走上正轨。我在我的“Input”类中为我的“recentTouchX”添加了“player.getX() - GAMEWIDTH/2”。我认为这个问题与我的碰撞矩形的位置有关,但实际上它与我的TouchListener一起听视图而不是画布。在进行任何翻译之前,我的视图和画布都是一样的,但是在翻译之后他们没有,这些额外的代码行可以弥补翻译的不足。把你的评论作为答案和dat upvote和检查是你的:) –

回答

1

touchEvents始终基于相对于画布元素本身的x & y。由于视图是通过翻译视图canvas.translate(-player.getX() + GAMEWIDTH/2 , 0);将角色居中,所以您还需要将该翻译应用于touchEvent。你可以在触摸处理程序中完成它,也可以为游戏世界中的物品存储相对位置和绝对位置。如果项目彼此嵌套,这将变得更加重要。这通常通过存储精灵/对象的父元素来完成。

//example of how I usually handle object hierarchy 
this._x = this.x + this.parent._x; 
this._y = this.y + this.parent._y; 

画布/阶段也将存储它的中心作为._x和._y这将是该对象的父补充说,这样一来,当您生成全局位置做你touchEvents对强似在.x或.y中,您将传入已由GAMEWIDTH/2转换的._x和._y。

相关问题