文本可能不正确,因为它是由 Deepl Translations 翻译的。
我目前正在用Godot引擎制作一个2D游戏,地图是1280x1280px,我想用这一张图片制作一张地图。
主要问题是,当我到达地图边缘时,我希望地图出现在另一侧,但位置有点偏离或有问题。
我没有收到任何错误或任何东西。 还有其他方法或其他方式来编写代码吗?
这是当前操作的视频 → https://youtu.be/H1LKOYwO0hE
源代码
`extends Node2D
const SPEED:int = 200
const DEFAULT_ANIMATION:String ="run_down"
# 子ノードを取得
@onready var player = $anim
@onready var camera = $Camera2D
var now_anime: String
var velocity: Vector2
#カメラ制限座標
var left_limit = -1344
var right_limit = 1344
var up_limit = -958
var down_limit = 958
#フラグ管理
var limit_flag = {
"x": false,
"y": false
}
func _ready():
# 実行アニメーション名を初期化
now_anime = DEFAULT_ANIMATION
func _process(delta):
velocity = Vector2()
# キー押下状況に応じてアニメーションと移動幅を更新
if Input.is_action_pressed("ui_up"):
now_anime = "run_up"
velocity.y = -SPEED
elif Input.is_action_pressed("ui_right"):
now_anime = "run_right"
velocity.x = SPEED
elif Input.is_action_pressed("ui_down"):
now_anime = "run_down"
velocity.y = SPEED
elif Input.is_action_pressed("ui_left"):
now_anime = "run_left"
velocity.x = -SPEED
if Input.is_action_pressed("ui_up") && Input.is_action_pressed("ui_right"):
now_anime = "run_right"
velocity.x = SPEED / 2
velocity.y = -SPEED / 2
elif Input.is_action_pressed("ui_right") && Input.is_action_pressed("ui_down"):
now_anime = "run_right"
velocity.x = SPEED / 2
velocity.y = SPEED / 2
elif Input.is_action_pressed("ui_down") && Input.is_action_pressed("ui_left"):
now_anime = "run_left"
velocity.x = -SPEED / 2
velocity.y = SPEED / 2
elif Input.is_action_pressed("ui_left") && Input.is_action_pressed("ui_up"):
now_anime = "run_left"
velocity.x = -SPEED / 2
velocity.y = -SPEED / 2
# 更新したアニメーションに切り替え
player.set_animation(now_anime)
# 移動実施
player.position += velocity * delta
if right_limit < player.position.x || player.position.x < left_limit:
limit_flag["x"] = true
if down_limit < player.position.y || player.position.y < up_limit:
limit_flag["y"] = true
print(player.position)
print(limit_flag)
print(" ")
limitMethod()
func limitMethod():
if limit_flag["x"] == false && limit_flag["y"] == false:
camera.global_position = player.position
if limit_flag["x"] && limit_flag["y"]:
limit_flag["x"] = false
limit_flag["y"] = false
if limit_flag["x"]:
limit_flag["x"] = false
player.position.x = player.position.x * -1
if limit_flag["y"]:
limit_flag["y"] = false
player.position.y = player.position.y * -1`
我已经使用transform跳转到指定坐标,但是如果我在移动时使用transform跳转到指定坐标,位置会发生偏移。
我唯一尝试的就是使用transform将角色飞到指定的坐标。
我将使用单轴,目的是使其更容易理解。
让我们从代表图像的一条线开始,我将标记中心来代表原点:
并且您已经定义了一些限制。所以让我们添加这些:
这些极限恰好与原点的距离相同。我相信这是故意的。然而,没有什么可以阻止他们有所不同。
你还有玩家的位置,它可能会超出限制,例如:
当前,您正在围绕原点翻转玩家的位置,如下所示:
player.position.x = player.position.x * -1
这会导致玩家超出对方的限制:
我相信这不是你想要的。
我相信你想要的 - 我可能误解了这个问题 - 是让玩家超出限制的距离......
这将是:
var distance := player.position.x - exceeded_limit
然后将玩家的位置更改为相同的距离,但距离相反的限制:
这将是:
player.position.x = opposite_limit + distance
替换我们的距离:
player.position.x = opposite_limit + (player.position.x - exceeded_limit)
重新排列:
player.position.x = player.position.x + opposite_limit - exceeded_limit
等同于:
player.position.x += opposite_limit - exceeded_limit
换句话说,你去掉超出的限制并添加相反的限制。
在插图中,我将玩家放置在正确的限制之外。但是,如果一开始就超出了左边的限制,那就是这样的:
var distance := exceeded_limit - player.position.x
player.position.x = opposite_limit - distance
更换:
player.position.x = opposite_limit - (exceeded_limit - player.position.x)
等同于:
player.position.x = opposite_limit - exceeded_limit + player.position.x
重新排列:
player.position.x = player.position.x + opposite_limit - exceeded_limit
等同于:
player.position.x += opposite_limit - exceeded_limit
而且,正如您所看到的,它的结果是相同的公式。
最后,当然,我只说明了横轴,但同样的逻辑也适用于纵轴。
我希望这是有道理的,并且您可以使用它从头开始重写
limitMethod
以获得您想要的结果。