你不應該使用sin和cos,因爲這些函數很慢,因此你不能在計算數據中使用角度(你只需要它來旋轉精靈或類似的東西)。
首先,您應該使用x,y,xspeed,yspeed,速度(每秒像素數)和方向屬性來創建對象。
讓我們假設你的角色在速度= 5的位置(10,10)。現在你用鼠標點擊(或者只是懸停)位置(50,40)。 首先你必須得到dx和dy(delta)。
dx = mouse.x - character.x // 50 - 10 = 40
dy = mouse.y - character.y // 40 - 10 = 30
下一步獲得從字符位置到鼠標位置的距離。
distance = sqrt(dx*dx + dy*dy) // sqrt(40*40 + 30*30) = sqrt(1600 + 900) =
// = sqrt(2500) = 50 (Pythagorean theorem)
現在我們可以計算字符的xspeed和yspeed。
factor = distance/character.speed // 50/5 = 10
character.xspeed = dx/factor // 40/10 = 4
character.yspeed = dy/factor // 30/10 = 3
現在讓我們假設你有每秒你的物理環路的60個蜱(可能是你的物理循環不會從你的主循環分離,它只是你的FPS數)。 每一個勾號你的角色x增加xspeed,y yspeed(如果你正在按鍵)。所以一秒鐘後(這需要60個滴答聲)你的角色將在位置(10 + 60*4, 10 + 60*3) = (250, 190)
。它速度很快,所以你可以降低你的角色速度或降低你的fps(我不推薦它)。
如果你想讓你的角色在鼠標位置停下來(如在cRPG中),然後使用計時器或計數器。 您的角色到達鼠標位置所需的滴答計數是之前計算的factor
,這等於10
。你的循環10次後,字符位置將是(50,40)。 所以你可以在字符對象中創建var ticks,每個循環tick將它減1,當它變爲0時,將xspeed和yspeed的字符重置爲0,這樣它就不會再移動了。 另一種方法是使用超時,但情況更糟。在10/60s = 1/6s〜= 0.18s之後,超時回調函數會將xspeed和yspeed的字符重置爲0.
如果需要角度,可以使用dx/dy和tan來計算。
這種做運動的方式比使用sin和cos快得多。
當然,您通過在(character.x,character.y)位置繪製字符來渲染運動。
謝謝,我試過了,我的角色只是繼續向右移動。這可能是我的角度待辦事項? 被稱爲characterRotation的我的角度是這樣的: var targetX = mouseX - (this.drawX + this.charWidth/2); var targetY = mouseY - (this.drawY + this.charHeight/2); this.characterRotation = Math.atan2(targetY,targetX);然後我有你的位: this.drawX = this.drawX + this.walkingSpeed * Math.cos(d2r(this.characterRotation)); this.drawY = this.drawY + this.walkingSpeed * Math.sin(d2r(this.characterRotation)); 任何想法? –
拿出我的代碼中的'd2r'部分,我假設你的角度是度,但它已經在弧度 –
啊耶!輝煌,像魅力一樣工作!謝謝機器人! –