如何使对象相对于 image_angle 移动?
Posted
技术标签:
【中文标题】如何使对象相对于 image_angle 移动?【英文标题】:How to make an object move in relation to image_angle? 【发布时间】:2017-07-08 14:13:42 【问题描述】:注意:我使用的是 GameMaker 1.4,而不是 2。我不知道这是否会有所不同,但我指出以防万一。
好的,我在我的 GameMaker 游戏中遇到了一个问题,我让一个对象相对于 image_angle 上下移动。出于某种原因,它真的想像往常一样在 y 轴上移动,并且完全忽略了 image_angle。这真的很烦人,如果不解决可能会彻底改变游戏规则。
我的步骤事件代码是:
// Mouse controls.
image_angle = point_direction(x, y, mouse_x, mouse_y);
if(keyboard_check(ord('W')))
y -= playerSpeed;
if(keyboard_check(ord('S')))
y += playerSpeed;
我的创建事件代码是:
globalvar fuelRemaining;
fuelRemaining = 60;
playerSpeed = 3;
【问题讨论】:
【参考方案1】:image_angle = point_direction(x, y, mouse_x, mouse_y);
direction = image_angle;
if(keyboard_check(ord('W')))
speed = -playerSpeed;
if(keyboard_check_release(ord('W')))
speed = 0;
if(keyboard_check(ord('S')))
speed = playerSpeed;
if(keyboard_check_release(ord('S')))
speed = 0;
【讨论】:
注意:我只关注前两行,因为这就是我真正需要的......它仍然无法工作......【参考方案2】:@Gamio 代码几乎是正确的(应该是_released
而不是_release
,混淆了W
和S
键的符号)。以下是一些改进:
image_angle = point_direction(x, y, mouse_x, mouse_y);
direction = image_angle;
if point_distance(x, y, mouse_x, mouse_y) < spd
speed = 0;
else
var spd = 0;
if keyboard_check(ord("W"))
spd += playerSpeed; // If pressed both W and S, then will stop
if keyboard_check(ord("S"))
spd -= playerSpeed;
speed = spd;
if keyboard_check_released(ord("W")) or keyboard_check_released(ord("S"))
speed = 0;
将代码放在Step End
事件中(不是Step
)。
如果您想直接更改坐标,不使用speed
,也可以,但稍微困难一些(您需要使用lengthdir_x
和lengthdir_y
函数计算x
和y
增量,然后添加这些函数增量到当前坐标)。
【讨论】:
好吧,我不确定是否有必要在这里生成 var spd,以及为什么要检查密钥是否已被释放 2* 每一步,我在我的答案中以不同的方式解决了,这里不会正确使用 spd 是必要的。同样,当玩家同时按下两个键然后只释放一个(如果玩家经常切换键,这种情况可能经常发生,而玩家没有注意到),您还说有必要在结束步骤事件中使用此代码,这似乎不是真的,如果它应该阻止任何事情,那么你应该稍微说明一下我猜的问题。 @VojtěchŠvrček 这不是一个很好的解决方案,它只是 Gamio 代码的改进。 想了这么多,只是想想人们从游戏制作者开始,它怎么会结束:p。但是,它可以工作,如果他们只是将粘贴代码复制到项目中,那么它当然会一团糟。【参考方案3】:在您的代码中,您设置了image_angle
和direction
,但随后只更改了y
坐标,因此您当然不会看到x
坐标有任何更改。
您可以使用内置的direction
和speed
变量,游戏制作者会自动移动任何对象,或者您可以在x
和y
坐标上应用lengthdir_x
和lengthdir_y
函数。
direction
和 speed
示例:
//create event
playerSpeed = 3;
//step event
image_angle = point_direction(x, y, mouse_x, mouse_y);
direction = image_angle;
speed = 0; //reset speed at start of each step event
//now you wont have to check if key has been released to stop object
if(keyboard_check(ord('W')))
//distance between player and target
distance = point_distance(x, y, mouse_x, mouse_y)
if distance < playerSpeed
//with this, object will move only to mouse position, not further
speed = distance;
else
speed = playerSpeed;
else if(keyboard_check(ord('S')))
speed = -playerSpeed;
lengthdir_x
和 lengthdir_y
示例:
// create event
playerSpeed = 3;
// step event
image_angle = point_direction(x, y, mouse_x, mouse_y);
if keyboard_check( ord("W") )
x += lengthdir_x( playerSpeed, image_angle );
y += lengthdir_y( playerSpeed, image_angle );
else if keyboard_check( ord("S") )
x += lengthdir_x( playerSpeed, image_angle-180 );
y += lengthdir_y( playerSpeed, image_angle-180 );
请注意,所有游戏制作函数都使用角度(度数),圆的右侧角度为 0(360),逆时针方向增加。
任何函数都可以在 0 到 360 范围以下和以上的值下正常工作,例如 -90 = 270 (360-90)
和 400 = 40 (400-360)
。
注意游戏制作者如何检查true
和false
。任何小于 0 的值都将在检查时生成false
。
【讨论】:
以上是关于如何使对象相对于 image_angle 移动?的主要内容,如果未能解决你的问题,请参考以下文章