如何使用Godot引擎循环地图

问题描述 投票:0回答:1

文本可能不正确,因为它是由 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将角色飞到指定的坐标。

2d gdscript godot4
1个回答
0
投票

我将使用单轴,目的是使其更容易理解。

让我们从代表图像的一条线开始,我将标记中心来代表原点:

并且您已经定义了一些限制。所以让我们添加这些:

这些极限恰好与原点的距离相同。我相信这是故意的。然而,没有什么可以阻止他们有所不同。

你还有玩家的位置,它可能会超出限制,例如:

当前,您正在围绕原点翻转玩家的位置,如下所示:

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
以获得您想要的结果。

© www.soinside.com 2019 - 2024. All rights reserved.