插件编写:节点绘制类型
阅读
2020-10-18更新
最新编辑:pevernow
阅读:
更新日期:2020-10-18
最新编辑:pevernow
绘制节点的方法称为绘图类型(drawtype)。这里有许多可用的绘图类型。绘图类型的行为可以通过在节点类型定义中提供属性来控制。对于此节点的所有实例,这些属性都是固定的。可以使用param2
来控制每个节点的一些属性。<br/>
在前面的章节中,我们已经介绍了[[./5.节点、物品和制作.md|物品和节点]]的概念,但没有给出节点的完整定义。Minetest世界是一个三维的网格坐标。每个位置我们成为一个节点,由节点类型(名称)和两个参数(param1和param2)组成。minetest.register_node
函数有点误导人,因为它实际上并没有注册节点—它注册了一种新类型的节点。<br/>
节点参数用于控制单独渲染节点的方式。param1
用于存储节点的照明,param2
的含义取决于节点类型定义的paramtype2
属性。
正方形节点:普通且全面
最普通的绘图类型就是用于渲染正方形节点的绘图类型。如果一个普通的节点的面与实体边相对,那么这一面将不会被渲染,将会导致性能大幅度提升。<br/>
fig:<br/>
一般绘图类型<br/>
相反,allfaces drawtype在向上面对实体节点时仍将渲染内侧。这适用于具有部分透明边的节点,例如叶节点。您可以使用allfaces_可选的drawtype来允许用户选择退出较慢的绘图,在这种情况下,它将像普通节点一样工作。<br/>
minetest.register_node("mymod:diamond", {
description = "Alien Diamond",
tiles = {"mymod_diamond.png"},
groups = {cracky = 3},
})
minetest.register_node("default:leaves", {
description = "Leaves",
drawtype = "allfaces_optional",
tiles = {"default_leaves.png"}
})
注意:普通绘图类型是默认的绘图类型,因此不需要显式指定它。
透明节点
透明节点不同于普通节点,将该类型的节点放置在普通节点节点旁边不会导致普通节点的边被隐藏。这很有用,因为透明节点往往是透明的,因此使用普通的节点将会拥有观察外界的能力。<br/>
fig:<br/>
透明的边缘<br/>
minetest.register_node("default:obsidian_glass", {
description = "Obsidian Glass",
drawtype = "glasslike",
tiles = {"default_obsidian_glass.png"},
paramtype = "light",
is_ground_content = false,
sunlight_propagates = true,
sounds = default.node_sound_glass_defaults(),
groups = {cracky=3,oddly_breakable_by_hand=3},
})
Glasslike_Framed
这将使节点的边以三维效果环绕整个对象,而不是单个节点,如下所示:<br/>
fig:<br/>
Glasslike_Framed的边缘<br/>
你可以使用glasslikeframedoptional绘图类型来允许用户选择使用框架外观。
minetest.register_node("default:glass", {
description = "Glass",
drawtype = "glasslike_framed",
tiles = {"default_glass.png", "default_glass_detail.png"},
inventory_image = minetest.inventorycube("default_glass.png"),
paramtype = "light",
sunlight_propagates = true, -- Sunlight can shine through block
groups = {cracky = 3, oddly_breakable_by_hand = 3},
sounds = default.node_sound_glass_defaults()
})
气态节点
这些节点不会渲染,因此没有纹理。
minetest.register_node("myair:air", {
description = "MyAir (you hacker you!)",
drawtype = "airlike",
paramtype = "light",
sunlight_propagates = true,
walkable = false, -- Would make the player collide with the air node
pointable = false, -- You can't select the node
diggable = false, -- You can't dig the node
buildable_to = true, -- Nodes can be replace this node.
-- (you can place a node and remove the air node
-- that used to be there)
air_equivalent = true,
drop = "",
groups = {not_in_creative_inventory=1}
})
光节点
节点的照明存储在param1中。为了确定如何对节点的边进行着色,将使用相邻节点的灯光值。因此,实体节点没有灯光值,因为它们会遮挡灯光。<br/>
默认情况下,节点类型不允许光存储在任何节点实例中。通常需要一些节点(如玻璃和空气)能够让光线通过。为此,需要定义两个属性:
paramtype = "light",
sunlight_propagates = true,
第一行表示param1实际上存储了灯光级别。第二条线意味着太阳光应该穿过这个节点而不会降低值。
液体节点
每种类型的液体都需要两个节点定义-一个用于液体源,另一个用于流动液体。
-- Some properties have been removed as they are beyond
-- the scope of this chapter.
minetest.register_node("default:water_source", {
drawtype = "liquid",
paramtype = "light",
inventory_image = minetest.inventorycube("default_water.png"),
-- ^ this is required to stop the inventory image from being animated
tiles = {
{
name = "default_water_source_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 2.0
}
}
},
special_tiles = {
-- New-style water source material (mostly unused)
{
name = "default_water_source_animated.png",
animation = {type = "vertical_frames", aspect_w = 16,
aspect_h = 16, length = 2.0},
backface_culling = false,
}
},
--
-- Behavior
--
walkable = false, -- The player falls through
pointable = false, -- The player can't highlight it
diggable = false, -- The player can't dig it
buildable_to = true, -- Nodes can be replace this node
alpha = 160,
--
-- Liquid Properties
--
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "default:water_flowing",
-- ^ when the liquid is flowing
liquid_alternative_source = "default:water_source",
-- ^ when the liquid is a source
liquid_viscosity = WATER_VISC,
-- ^ how fast
liquid_range = 8,
-- ^ how far
post_effect_color = {a=64, r=100, g=100, b=200},
-- ^ colour of screen when the player is submerged
})
液体节点具有类似的定义,但具有不同的名称和动画。有关完整示例,请参见minetest游戏中的默认mod中的默认值:water_flowing。
非正方体节点
非正方体节点允许您创建一个不是正方体的节点,而是由任意多个长方体组成的节点。<br/>
fig:<br/>
非正方体节点
minetest.register_node("stairs:stair_stone", {
drawtype = "nodebox",
paramtype = "light",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
{-0.5, 0, 0, 0.5, 0.5, 0.5},
},
}
})
最重要的部分是节点框表:
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
{-0.5, 0, 0, 0.5, 0.5, 0.5}
每一行是一个长方体,连接起来形成一个节点。前三个数字是最左前下角的坐标,从-0.5到0.5(含0.5),后三个数字是相反的角。它们是X,Y,Z的形式,Y在上面。<br/>
当然,如果你不想手动写xyz坐标,你可以用NodeBoxEditor,直接设计节点。
壁挂式节点
有时你需要不同的节点板,就像火把一样被放置在地板、墙壁或天花板上。<br/>
minetest.register_node("default:sign_wall", {
drawtype = "nodebox",
node_box = {
type = "wallmounted",
-- Ceiling
wall_top = {
{-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}
},
-- Floor
wall_bottom = {
{-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}
},
-- Wall
wall_side = {
{-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}
}
},
})
网格节点
虽然节点盒通常更容易制作,但它们的局限性在于只能由长方体组成。节点框也未被选中;即使内部面完全隐藏,它们仍将被渲染。<br/>
面是网格上的平面。当两个不同节点盒的面重叠时,会出现一个内面,从而导致节点盒模型的部分不可见,但仍在渲染。<br/>
可以注册网格节点,如下所示:
minetest.register_node("mymod:meshy", {
drawtype = "mesh",
-- Holds the texture for each "material"
tiles = {
"mymod_meshy.png"
},
-- Path to the mesh
mesh = "mymod_meshy.b3d",
})
确保网格在模型目录中可用。大多数情况下,网格应该在模组的文件夹中,但是,可以共享另一个依赖的模组提供的网格。例如,添加更多家具类型的模组可能希望共享基本家具模组提供的模型。
标牌节点
Signlike节点是平面节点,可以安装在其他节点的侧面。<br/>
尽管这个绘图类型的名字是这样的,但标志实际上并不倾向于使用标牌,而是使用nodebox
绘图类型来提供3D效果。然而,像标志一样的拉丝类型通常被当作梯子使用。
minetest.register_node("default:ladder_wood", {
drawtype = "signlike",
tiles = {"default_ladder_wood.png"},
-- Required: store the rotation in param2
paramtype2 = "wallmounted",
selection_box = {
type = "wallmounted",
},
})
植物节点
植物节点以类似X的模式绘制其平铺。
minetest.register_node("default:papyrus", {
drawtype = "plantlike",
-- Only one texture used
tiles = {"default_papyrus.png"},
selection_box = {
type = "fixed",
fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16},
},
})
火节点
火节点类似于植物节点,只是它的设计目的是“附着”在墙壁和天花板上。
fig:<br/>
火节点<br/>
minetest.register_node("mymod:clingere", {
drawtype = "firelike",
-- Only one texture used
tiles = { "mymod:clinger" },
})
更多类型
这不是一个全面的列表,有更多类型包括:
- 篱笆节点
- 根状植物节点——用于水下植物
- 铁轨节点——用于矿车轨道
- 火炬节点——用于2D墙壁/地板/顶部的节点,Minetest游戏中的火炬实际上使用了网格节点的两个不同的节点定义(default:torch和default:torchwall)。<br/>
感兴趣的读者可以阅读一下[Lua API文档](https://rubenwardy.com/minetestmoddingbook/luaapi.html#node-drawtypes)以获得完整的列表。(API文档还没翻译,可以先阅读英文原版)