2015-07-18 26 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。