嗨,我是新来的,需要一些帮助……我花了一周时间想解决这个问题,因为我是个新手,正在尝试做一款生存游戏(我知道这个想法很糟糕),但不管怎样,问题是我想要做一个建筑系统,我试着以《Tinkerlands》为参考,结果在瓦片方面遇到了问题……

我做了一个由15个和47个瓦片组成的瓦片地图,它确实起作用了……不过墙的高度是12,并且向上偏移了16个像素(我觉得是这么叫的)。

在这种情况下,那16个其实是指排列好的瓦片。我测试了自动瓦片工具,效果很好,特别是因为我用了一个帮助网站来制作瓦片。但问题是……我不想画固定的东西……墙是由玩家和怪物建造并摧毁的,所以它们需要相互检测。然而,我做了一次测试,地图上大约有100面墙时,帧率从14k掉到了2k……更不用说它还没能完美对齐,因为它只有15个帧。于是我做了件疯狂的事……我以GameMaker要求制作完美瓦片地图的47个瓦片为参考,直接做了47个精灵,然后把它们放进一个对象里……

我最初只检测相邻方向时用了以下代码,但无法检测对角线方向。


depth = -y

EncDir = position_meeting(x + 16, y, Parede2_Obj);
EncEsq = position_meeting(x - 16, y, Parede2_Obj);
EncCim = position_meeting(x, y - 16, Parede2_Obj);
EncBai = position_meeting(x, y + 16, Parede2_Obj);

var frames = [0, 2, 8, 5, 17, 3, 10, 7, 11, 12, 13, 6, 14, 15, 16, 1];

image_index = frames[EncDir + (EncEsq * 2) + (EncCim * 4) + (EncBai * 8)];

然后我改成检测瓦片附近的8个方向来让它更新,结果就完全做不到了……


depth = -y

EncDir = position_meeting(x + 16, y, Parede2_Obj);
EncEsq = position_meeting(x - 16, y, Parede2_Obj);
EncCim = position_meeting(x, y - 16, Parede2_Obj);
EncBai = position_meeting(x, y + 16, Parede2_Obj);

EncDirCim = position_meeting(x + 16, y - 16, Parede2_Obj);
EncDirBai = position_meeting(x + 16, y + 16, Parede2_Obj);
EncEsqCim = position_meeting(x - 16, y - 16, Parede2_Obj);
EncEsqBai = position_meeting(x - 16, y + 16, Parede2_Obj);

var frames = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46];

image_index = frames[EncDirCim * 1 ];

可能有一个非常简单的办法,我知道……抱歉问了这么蠢的问题,但我已经折腾了一周,快疯了。我试了……我还想做两种不同的瓦片,一种用于墙基,另一种用于墙顶,然后创建一个对象来调用两者。然而,我试着问了一些AI开发者,他们说我想做的事情是不可能的,比如制作像用镐子敲击并激活lerp()来让项目生动起来之类的效果……我只想知道游戏做这个的标准方法……还有没有推荐的视频。我想把整个过程都分享出来,这样你就能看到我犯的错误了,哈哈。

https://wareya.github.io/webtyler/ (我用来制作瓦片的网站)

(对不起用谷歌翻译写的英语(可怜的巴西人))

以瓦片地图方式排列的47个精灵

GameMaker建议的47个瓦片地图

参考

没有47个精灵的精灵图