微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

羊了个羊APP/H5网页/小程序游戏系统开发搭建教程及部署源码

将其定义为MContainerBase基类

#MContainerBaseextends Node2Dclass_name MContainerBase
func _ready():        add_to_group(name)        add_to_group("game")        var Mask = FileReader.read(mask_file,null)        Box.resize(size_x)        for i in range(size_x):                Box[i] = []                Box[i].resize(size_y)                for j in range(size_y):                        Box[i][j] = []                        Box[i][j].resize(size_z)                        for k in range(size_z):                                if Mask == null or Mask[i][j] == 1:                                        Box[i][j][k] = add_tile(i,j,k,get_parent().distribute_face())                                else:                                        Box[i][j][k] = null                for x in range(size_x):                for y in range(size_y):                        for z in range(size_z):                                check_is_on_top(x,y,z)

最基础的牌堆就是一个 x*y*z的三维数组,我们可以使用一切方法构造想要的排队形状:柱形、条形、甚至金字塔形。这都不会影响后面程序的实现。

项目中为了增加这个“大方块”的多样性,我还给它设置了如下的“遮罩”,这就是游戏中CSDN文字的由来。当然我们还可以通过“遮罩”来自由定义窗口牌,这部分就请大家自由发挥了。

# S形遮罩[        [0,0,0,0,0],        [0,0,0,0,0],        [1,1,1,0,1],        [1,0,1,0,1],        [1,0,1,1,1],]

如何检测和更新可拾取的牌

三种牌堆模式分别派生自MContainerBase,并对应着如下三种检测方式:

牌堆模式A

仅检测自己正上方是否有牌

#1 Cover 1extends MContainerBase
func check_is_on_top(x,y,z):        if has_tile(x,y,z):                if not has_tile(x,y,z + 1) :                                (Box[x][y][z] as MTile).set_is_on_top(true)

牌堆模式B

检测自己上方两方位是否有牌

#1 Cover 2extends MContainerBase
func check_is_on_top(x,y,z):        if has_tile(x,y,z):                if z%2 == 0:                        if not has_tile(x,y,z + 1) and not has_tile(x - 1 ,y,z + 1):                                (Box[x][y][z] as MTile).set_is_on_top(true)                else:                        if not has_tile(x,y,z + 1) and not has_tile(x + 1 ,y,z + 1):                                (Box[x][y][z] as MTile).set_is_on_top(true)

牌堆模式C

检测自己上方四方位是否有牌

#1 Cover 4extends MContainerBase
func check_is_on_top(x,y,z):        if has_tile(x,y,z):                if z%2 == 0:                        if not has_tile(x,y,z + 1) and not has_tile(x - 1 ,y,z + 1) and not has_tile(x,y - 1 ,z + 1) and not has_tile(x - 1,y - 1,z + 1):                                (Box[x][y][z] as MTile).set_is_on_top(true)                else:                        if not has_tile(x,y,z + 1) and not has_tile(x + 1 ,y,z + 1) and not has_tile(x,y + 1 ,z + 1) and not has_tile(x + 1,y + 1,z + 1):                                (Box[x][y][z] as MTile).set_is_on_top(true)

在Godot中,这三种牌堆模式还可以通过场景节点制作成预制体,这样关卡设计师就可以轻松地制作出美观的关卡了。

如何生成新关卡

简单了解游戏规则后,我们就不难推导出,每个关卡能被通过的一个必要条件就是每一种图案的总数,必须能被3整除。实现方法如下:

var tiles = []export var initial_tiles = {        0:10,        1:10,        2:10,        3:10,        4:10,        5:10,        6:10,        7:10,        8:10,        9:10,        10:10,        11:10,        12:10,        13:10,        14:10,        15:10}
func _init():        for key in initial_tiles:                var num = initial_tiles[key]*3                for i in range(0,num):                        tiles.append(key)        tiles.shuffle()

其中字典initial_tiles 的key对应着每一种图案,后面的value对应着这一关该图案出现的“对数”(此处1对等于3个)。按照value乘以3的数量存入数组tiles(下文称之为:待发牌池),然后把待发牌池中的元素打乱顺序,等待“发牌”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐