AS3/Flashdevelop - 控制二维角色在重力作用下绕行星移动
AS3/Flashdevelop - Controlling a 2D character to move around a planet with gravity
在一些帮助下,我成功地创建了一个具有工作引力的 2D 行星,该引力不断将角色拉向其中心。现在唯一的问题是,我完全不知道如何制作它,以便用户能够让这个角色像人们期望的那样穿越地球,而不是我们在自然平台游戏中习惯的简单 up/down/left/right。
需要注意的是,被穿越的行星会有platforms/layers跳跃和坠落,所以移动和跳跃应该与行星的中心有关,行星的中心作为"down" 会出现在传统的平台游戏中(这就是为什么我认为我需要一种复杂的方式来创建这种自然运动)。
我有过重新计算新的左右方向以在每次位置更改时移动的想法,但我必须制定实现这一目标的逻辑超出了我的知识范围。
这是唯一的方法吗,还是我应该尝试以不同的方式解决问题?我希望不会,因为我不认为我能够以其他方式实现这一目标。
这是我当前的代码,展示了重力的工作原理,带有一个简单的移动占位符,只允许角色在屏幕上移动 up/down/left/right:
public function moveChar(event:Event):void
{
if (leftPressed)
{
character.x -= mainSpeed;
}
if (rightPressed)
{
character.x += mainSpeed;
}
if (upPressed)
{
character.y -= mainSpeed;
}
if (downPressed)
{
character.y += mainSpeed;
}
}
public function gravity():void
{
//tan2(planet.y - player.y, planet.x - player.x)
angle = Math.atan2((planet1.y + 2245) - (character.y+5), (planet1.x+2245) - (character.x+5));
gravityX = Math.cos(angle) * gravitationalAcceleration;
gravityY = Math.sin(angle) * gravitationalAcceleration;
//distance = Math2.Pythagoras(planet1.x + 50, planet1.y + 50, character1.x + 5, character1.y + 5);
distance = Math.sqrt((yDistance * yDistance) + (xDistance * xDistance));
//Calculate the distance between the character and the planet in terms of x and y coordinate
xDistance = (character.x + 5) - (planet1.x + 2245);//320 to 50
yDistance = (character.y + 5) - (planet1.y + 2245);//320 to 50
//Make sure this distance is a positive value
if (xDistance < 0) {
xDistance = -xDistance;
}
if (yDistance < 0) {
yDistance = -yDistance;
}
//Update the current velocity before new velocity is calculated
initialXVelocity = finalXVelocity;
initialYVelocity = finalYVelocity;
//Send the character into the correct direction
character.x += gravityX;
character.y += gravityY;
//Basic collision detection of the surface, basic stop of gravity
if (distance <= planet1Radius) {
trace("hit!");
if (planet1.x - 2180 < character.x - 5) { //320 to 50
character.x -= gravityX*1.025;
}
else {
character.x += gravityX*1.025;
}
if (planet1.y - 2180 < character.y - 5) { //320 to 50
character.y -= gravityY*1.025;
}
else {
character.y += gravityY*1.025;
}
} else {
trace(" no hit!");
}
}
一个想法是当您按下 left/right 而不是移动角色时,让世界(玩家除外)围绕行星中心旋转。
如果您不想这样做,您可以使用答案 here 中概述的光线投射。
在一些帮助下,我成功地创建了一个具有工作引力的 2D 行星,该引力不断将角色拉向其中心。现在唯一的问题是,我完全不知道如何制作它,以便用户能够让这个角色像人们期望的那样穿越地球,而不是我们在自然平台游戏中习惯的简单 up/down/left/right。
需要注意的是,被穿越的行星会有platforms/layers跳跃和坠落,所以移动和跳跃应该与行星的中心有关,行星的中心作为"down" 会出现在传统的平台游戏中(这就是为什么我认为我需要一种复杂的方式来创建这种自然运动)。
我有过重新计算新的左右方向以在每次位置更改时移动的想法,但我必须制定实现这一目标的逻辑超出了我的知识范围。
这是唯一的方法吗,还是我应该尝试以不同的方式解决问题?我希望不会,因为我不认为我能够以其他方式实现这一目标。
这是我当前的代码,展示了重力的工作原理,带有一个简单的移动占位符,只允许角色在屏幕上移动 up/down/left/right:
public function moveChar(event:Event):void
{
if (leftPressed)
{
character.x -= mainSpeed;
}
if (rightPressed)
{
character.x += mainSpeed;
}
if (upPressed)
{
character.y -= mainSpeed;
}
if (downPressed)
{
character.y += mainSpeed;
}
}
public function gravity():void
{
//tan2(planet.y - player.y, planet.x - player.x)
angle = Math.atan2((planet1.y + 2245) - (character.y+5), (planet1.x+2245) - (character.x+5));
gravityX = Math.cos(angle) * gravitationalAcceleration;
gravityY = Math.sin(angle) * gravitationalAcceleration;
//distance = Math2.Pythagoras(planet1.x + 50, planet1.y + 50, character1.x + 5, character1.y + 5);
distance = Math.sqrt((yDistance * yDistance) + (xDistance * xDistance));
//Calculate the distance between the character and the planet in terms of x and y coordinate
xDistance = (character.x + 5) - (planet1.x + 2245);//320 to 50
yDistance = (character.y + 5) - (planet1.y + 2245);//320 to 50
//Make sure this distance is a positive value
if (xDistance < 0) {
xDistance = -xDistance;
}
if (yDistance < 0) {
yDistance = -yDistance;
}
//Update the current velocity before new velocity is calculated
initialXVelocity = finalXVelocity;
initialYVelocity = finalYVelocity;
//Send the character into the correct direction
character.x += gravityX;
character.y += gravityY;
//Basic collision detection of the surface, basic stop of gravity
if (distance <= planet1Radius) {
trace("hit!");
if (planet1.x - 2180 < character.x - 5) { //320 to 50
character.x -= gravityX*1.025;
}
else {
character.x += gravityX*1.025;
}
if (planet1.y - 2180 < character.y - 5) { //320 to 50
character.y -= gravityY*1.025;
}
else {
character.y += gravityY*1.025;
}
} else {
trace(" no hit!");
}
}
一个想法是当您按下 left/right 而不是移动角色时,让世界(玩家除外)围绕行星中心旋转。
如果您不想这样做,您可以使用答案 here 中概述的光线投射。