标签: gdscript

我如何使戈多的AStar适应平台游戏?

我一直在寻找一种强大的寻路方法,我正在开发基于平台游戏的游戏,A*看起来像是最好的方法.我注意到有一个关于Godot中AStar实现的演示.然而,它是为基于网格/磁贴的游戏编写的,我无法适应平台,其中Y轴受到重力的限制.

我找到了一个非常好的答案,描述了A*如何应用于Unity中的平台游戏.我的问题是......是否可以在Godot中使用AStar来实现上述答案中描述的相同内容?如果不使用内置的AStar框架,可以做得更好吗?在GDscript中它是如何工作(有或没有AStar)的一个非常简单的例子是什么?

虽然我已经发布了100点奖金(它已经过期),但我仍然愿意发布另外100点赏金并奖励它,等待回答这个问题.

PS:如果你在这个问题的正文中看到一些你觉得不合适的东西,需要注意或澄清......不要贬低我的投票!展示一些诚信并发表评论.你所做的一切都在伤害那些投票给我的其他人,并且实际上对这个问题的答案感兴趣.

a-star path-finding game-ai gdscript godot

11
推荐指数
1
解决办法
502
查看次数

戈多3.2.1。刷新查询时无法更改此状态。使用 call_deferred() 或 set_deferred() 来更改监控状态

在我的 2D 游戏中,玩家能够摧毁箱子、具有两种碰撞形状的物体。当被摧毁时,板条箱会产生也具有碰撞形状的物品。但是当调用以下函数时,Godot控制台中会显示许多类似的错误

代码:

func _on_Crate_item_dropped(collectible, pos):
    collectible.init(pos, Vector2(rand_range(30, 100), rand_range(-10, 10)))
    $CollectibleContainer.add_child(collectible)  # error occurs here
Run Code Online (Sandbox Code Playgroud)

错误:

ERROR: Can't change this state while flushing queries. Use call_deferred() or set_deferred() to change monitoring state instead.
Run Code Online (Sandbox Code Playgroud)

gdscript godot

11
推荐指数
1
解决办法
9290
查看次数

如何获取当前获得焦点的控制节点?

我试图确定哪个控制节点刚刚改变了焦点。通过将节点上的焦点模式更改为 ,已设置另一个控制节点以使用焦点All。从该节点的脚本中,我可以通过检查来判断它是否具有焦点has_focus。但是,我想从另一个脚本中判断它是否改变了焦点。

我知道有focused_entered一些focus_exited信号可以监听,但是这些组件在组件树上彼此相距很远,我不想通过一堆不相关的组件连接或冒泡信号。

控制文档说

只有一个Control节点可以成为键盘焦点。

由于只有一个节点处于焦点,是否有一个全局函数可以确定单个节点当前具有焦点的内容?我如何知道全球焦点何时发生变化?

gdscript godot

9
推荐指数
1
解决办法
7235
查看次数

如何在 GDScript 中实现结构?

GDScript 中是否有等效的 C# 结构/类?例如

struct Player
{
     string Name;
     int Level;
}
Run Code Online (Sandbox Code Playgroud)

gdscript godot

8
推荐指数
1
解决办法
5580
查看次数

在 Godot 中使用自定义类

我在 Godot 中创建了一个简单的网络聊天程序,我用它来向高中生教授基本加密。我想添加一个自定义的加密类,以允许学生创建自己的密码。这是我创建的一个简单的实现来测试该类:

class Security:
    extends Resource

    func _init():
        print("Started.")

    func encrypt():
        print("Encrypting.")
Run Code Online (Sandbox Code Playgroud)

在我的主脚本中,我有这段代码来初始化类(我在顶部的变量空间中,在任何函数定义之前):

const Security = preload("res://scripts/security.gd")
var sec = Security.new()
Run Code Online (Sandbox Code Playgroud)

然后这是我在脚本中的函数之一:

func send_message():
    sec.encrypt()
Run Code Online (Sandbox Code Playgroud)

任何时候控制台中都不会出现任何打印消息。当我触发 send_message 函数时,出现以下错误:

无效调用。基础“Rederence (security.gd)”中不存在函数“加密”。

我在创建类时做错了什么,或者我如何将它添加到我的脚本中?或者我正在尝试的操作实际上并不可行(例如,我应该添加一个节点,向其添加脚本并在场景中使用该节点)吗?

谢谢。

gdscript godot

8
推荐指数
1
解决办法
7644
查看次数

如何更改脚本中的精灵?

我正在尝试制作一款约会模拟游戏,作为编程方面简单的第一个游戏。我不知道如何更改脚本中的角色精灵。

角色精灵.gd

extends Sprite

var char_tex = load("res://Sprites/Lu2.png") 

func _ready():
    set_texture(char_tex)

func _input(event):
    if event is InputEventMouseButton:
        char_tex = load("res://Sprites/Lu1.png")
        update()
Run Code Online (Sandbox Code Playgroud)

gdscript godot

7
推荐指数
1
解决办法
2万
查看次数

为什么有些节点使用“position”而另一些节点使用“rect_position”?

这有什么技术原因呢?我觉得奇怪的是他们不能都只使用位置。是遗留物吗?

gdscript godot

7
推荐指数
1
解决办法
4848
查看次数

关于如何使用 KinematicBody2D 防止斜坡滑落的更多想法?

我在下面有一个基本代码。我正在尝试让玩家不要在斜坡上滑下来。我现在的坡度是 45°。如果玩家在斜坡上停止移动,它会滑下(可能是因为velocity.y += delta * gravity.y)。我可以通过法线获得角度并velocity.y = 0在玩家在斜坡上时设置并且不会滑下。但我不确定这是否是最好的方法。您对我如何实现这一目标有任何想法吗?顺便说一句,有没有办法在 gdscript(即 d efault_gravity)上获取 project_settings 值?

extends KinematicBody2D

var gravity = Vector2(0,700)
var velocity = Vector2()
var hSpeed = 150
var onSlope = false

func _ready():
    set_fixed_process(true)
    pass

func _fixed_process(delta):
    var left = Input.is_action_pressed("ui_left")
    var right = Input.is_action_pressed("ui_right")

    if left:
        velocity.x = -hSpeed
    if right:
        velocity.x = hSpeed
    if !left && ! right:
        velocity.x = 0

    velocity.y += delta * gravity.y
#   if onSlope && !left && !right: …
Run Code Online (Sandbox Code Playgroud)

game-physics gdscript godot

6
推荐指数
1
解决办法
665
查看次数

Godot 和 GDScript 可以将函数存储在变量中吗?

我对GDScript 语言的 Godot Docs 的一部分感到困惑。在页面中间的“引用函数”部分,它说您不能将函数存储在变量中,然后似乎立即自相矛盾。

Godot 函数可以存储在变量中吗?

引用函数

与 Python 不同,函数不是 GDScript 中的第一类对象。这意味着它们不能存储在变量中不能作为参数传递给另一个函数或从其他函数返回。这是出于性能原因。

要在运行时按名称引用函数(例如,将其存储在变量中,或将其作为参数传递给另一个函数),必须使用 call 或 funcref 助手:

scripting function gdscript godot

6
推荐指数
1
解决办法
5586
查看次数

(Godot Engine) 使用 Geometry 的 merge_polygons_2d() 方法合并两个以上的多边形

考虑以下场景:给定 n 个像“阴影”(具有减半 alpha 值的黑色)的 Polygon2D 节点,如何使用 merge_polygons_2d() 方法将所有这些节点组合成单个 Polygon2D 节点?

3 个叠加多边形的示例。

使用以下硬编码代码,我成功地将所有三个多边形合并为一个。但我无法弄清楚如何通过迭代来自动化该过程,以避免在有超过 10.. 20.. 多边形需要合并的情况下采用我的方法。

func Merge_Map_Shadows() -> void:
# Get all "shadow" polygons and store them in an array,
# then apply xform transform in order to retain it's position and rotation.
# After that, delete the original shadow.
if Map_Shadows.get_child_count() > 0:
    var _detected_shadows: Array = []
    for _shadow in Map_Shadows.get_children():
        var _transformed_polygon: PoolVector2Array = []
        for _vector in _shadow.polygon: _transformed_polygon.append(_shadow.transform.xform(_vector))
        _detected_shadows.append(_transformed_polygon)
        _shadow.call_deferred("queue_free")
    
    # Create the …
Run Code Online (Sandbox Code Playgroud)

geometry polygon gdscript godot

5
推荐指数
1
解决办法
2232
查看次数