首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >戈多:我怎样才能浏览我周围的地图呢?

戈多:我怎样才能浏览我周围的地图呢?
EN

Stack Overflow用户
提问于 2021-11-10 10:11:16
回答 1查看 140关注 0票数 2

所以我希望在我的玩家周围创造一个气泡的效果,当他进入隐藏区域(由磁贴图隐藏)时,气泡被激活,它本质上具有x射线效果。所以我可以看到背景,地面和区域内的所有物品,但我看不到积木本身。

所以很大程度上是这样的

到这个

随着我的深入,我发现了更多的东西

我甚至不知道该从哪里开始搜索这个。所以任何方向都会非常感谢

EN

回答 1

Stack Overflow用户

发布于 2021-11-10 16:00:25

首先,我想做点什么:让东西出现在播放器附近很容易,你可以使用一个灯光和一个着色器。用这种方法让东西在玩家附近消失是不可能的。

这是我们的计划:我们将创建一个纹理,它将作为遮罩来显示和不显示什么。然后我们将使用纹理蒙版和着色器来制作有选择地消失的材质。为了创建这个纹理,我们将使用一个Viewport,因此我们可以从中获得一个ViewportTexture

Viewport设置如下所示:

代码语言:javascript
复制
Viewport
├ ColorRect
└ Sprite

使用以下属性设置Viewport

更新模式大小:指定窗口大小(默认值为1024 x 600)更新模式Hdr: disable

  • Disable 3D: enable

  • Usage: 2D

  • :Always

对于Sprite,您需要灰度纹理,可能具有透明度。它将是你想要在玩家周围展示的形状。

对于ColorRect,您需要将背景颜色设置为黑色或白色。任何与Sprite上的颜色相反的颜色。

接下来,您将向Viewport附加一个脚本。它必须处理两个问题:

  • 移动Sprite以匹配球员的位置。它看起来像这样:

扩展视口导出var target_path:NodePath func _process(_delta:float) _delta:float ->:var := get_node_or_null(target_path) as Node2D if target == null: return $Sprite.position =var

您要将target_path设置为引用玩家头像。

在这段代码中,target.get_viewport().get_canvas_transform().origin将告诉我们目标节点(玩家头像)在屏幕上的位置。我们正在放置与之匹配的Sprite

  • Handle窗口将调整大小。它看起来像这样:

func _ready():# warning-ignore:return_value_discarded get_tree().get_root().connect("size_changed",self,"_on_size_changed") func _on_size_changed():size = get_tree().get_root().size

在此代码中,我们连接到根Viewport (与窗口关联的那个)的"size_changed",并更改此Viewport的大小以匹配。

下一件事是着色器。转到TileMap或要使其消失的任何内容,然后添加着色器材质。这是它的代码:

代码语言:javascript
复制
shader_type canvas_item;
uniform sampler2D mask;

void fragment()
{
    COLOR.rgb = texture(TEXTURE, UV).rgb;
    COLOR.a = texture(mask, SCREEN_UV).r;
}

如您所见,第一行将设置红色、绿色和蓝色通道,以匹配节点已有的纹理。但alpha通道将设置为遮罩纹理的其中一个通道(在本例中为红色通道)。

注意:上面的代码将使黑色部分完全不可见,白色部分完全可见。如果您想反转,请将COLOR.a = texture(mask, SCREEN_UV).r;更改为COLOR.a = 1.0 - texture(mask, SCREEN_UV).r;

当然,我们需要设置遮罩纹理。设置代码后,着色器材质下应该有一个名为"Mask“的着色器参数,将其设置为新的ViewportTexture,并将Viewport设置为我们之前设置的值。

我们就完事了。

我用publicdomainvectors.org的这个纹理测试了一下:

加上来自Kenneysome tiles。当然,它们都在公有领域下。

它看起来是这样的:

尝试使用不同的纹理以获得不同的结果。此外,还可以将着色器添加到Sprite以获得额外的效果。例如,通过使用如下代码向Sprite提供着色器材质,可以添加一些涟漪:

代码语言:javascript
复制
shader_type canvas_item;

void fragment()
{
    float width = SCREEN_PIXEL_SIZE.x * 16.0;
    COLOR = texture(TEXTURE, vec2(UV.x + sin(UV.y * 32.0 + TIME * 2.0) * width, UV.y));
}

所以你会得到这样的结果:

当上面的动画断断续续时,会有一个瞬间。那是因为我没有把循环切得很好。这不是游戏中的问题。此外,动画的每秒帧数也比游戏少得多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69911347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档