godot - set_global_position setting position to the wrong value
问题描述
Hey there I have a function which positions a KinematicBody2D's (the Player) body next to a Node2D (a portal). 2 portals are linked together and when the player enters portal X in Scene A they are placed next to the corresponding portal X in Scene B and vice versa. Here is the function:
func fix_player_position(entry_portal_link_id):
var pos = exit_positions[entry_portal_link_id]
var new_pos: Vector2
print("Current entry points for ")
print(exit_positions)
$player.set_global_position(Vector2(0,0))
print("Player's position before change: " + str($player.get_global_position()))
if portal_list[entry_portal_link_id].landing_point == Direction.Up:
new_pos = Vector2(pos.x, pos.y-64)
elif portal_list[entry_portal_link_id].landing_point == Direction.Down:
new_pos = Vector2(pos.x, pos.y+64)
elif portal_list[entry_portal_link_id].landing_point == Direction.Left:
new_pos = Vector2(pos.x-64, pos.y)
elif portal_list[entry_portal_link_id].landing_point == Direction.Right:
new_pos = Vector2(pos.x+64, pos.y)
$player.set_global_position(new_pos)
print(pos)
print(new_pos)
print($player.get_global_position())
here we get the position of the Node2D, reset the players (KinematicBody2D) position to (0,0) apply an offset depending on which side we want to place the KinematicBody2D, and then set the new position and print out all the positions. However it doesn't work correctly. Here is the last output
Current entry points for
{house_link1:(-3807.48999, 11041.799805), house_link2:(-4132.839844, 10655)} # We store the positions in a dictionary using the portal ID
Player's position before change: (-26252.199219, 11936) # This is supposed to be (0,0)
(-4132.839844, 10655) # The pos variable, i.e the stored position of the Node2D
(-4132.839844, 10719) # The new_pos, i.e. the intended position of the character
(-30385.039062, 22655) # The position of the character after setting
The # comments are added in by me to clarify what is being printed out. As you can clearly see the set_global_position call is not setting the position correctly. However it does set the players position correctly on a different scene.
Scene A -> Scene B, works correctly
Scene B -> Scene A, suddenly does not work correctly.
As you can see I'm a bit lost here, is this a bug within gdscript itself? Or am I an idiot and doing something wrong?
Here is the full output of going from Scene A -> Scene B -> Scene A
Current entry points for
{house_link1:(32, -288), house_link2:(-355.494995, -477.505005)}
Player's position before change: (0, 0)
(-355.494995, -477.505005) # pos
(-355.494995, -413.505005) # new_pos
(-355.494995, -413.505005) # players position
Current entry points for
{house_link1:(-3807.48999, 11041.799805), house_link2:(-4132.839844, 10655)}
Player's position before change: (-26252.199219, 11936)
(-4132.839844, 10655) # pos
(-4132.839844, 10719) # new_pos
(-30385.039062, 22655) # players_position
解决方案
所以我不确定实际问题是什么,但解决方案是更换
$player.set_global_position(new_pos)
和
$player.position = new_pos
并且代码成功运行。
推荐阅读
- pivotaltracker - 使用预填充内容创建故事的 Pivotal Tracker URL
- html - Gmail 不显示链接
- spring - Chunk vs Spring Batch Size JdbcBatchItemWriter (namedParameterJdbcTemplate.batchUpdate)
- amazon-web-services - 将 CDK 托管的 CloudFormation 分发从 CloudFrontWebDistribution 迁移到分发 API
- ruby-on-rails - 如何在 Rails 6 中使用本地存储?
- r - 如何使用 Geom_ma 分离 2 根蜡烛棒
- javascript - 将日期作为字符串:“2021-08-12”转换为:“2021 年 8 月 11 日”
- python - 尝试使用 Pywin32 连接到 SAPGUI 时出错
- amazon-web-services - boto3 的 awscli 同步方法
- javascript - 通过compressor.js 使用图像作为水印