——个人版权 严禁转载 和 商业用途
我在知乎准备发布的文章 刚起头 先发在论坛 各位大拿 有建议 错误 请无情指摘 在此谢谢!
Hello大家好!我是小FC,因为官方文档对于Match3简述过于含糊,官方视频在国内并不能正常观看。网上对于一款成熟Match3游戏核心逻辑描述零零散散。自己花费一些时间,对Match3代码仔细梳理,分为三篇 从 ‘基础游戏算法分析’ 到 ‘游戏流程逻辑分析’ 最后的 ‘整个游戏系统设计’。 希望未来成为游戏设计师的小伙伴 从小做起砥砺自己,未来做出伟大的游戏作品。——千里之行,始于足下 适合读者: 有c++基础和对UE4API一定的熟悉度 闲话不多说 正文开始: 总览: 翻看官方代码结构如下:在第一章 重点解析的是Grid 和 Tile中核心游戏逻辑,Match3Controller、Match3Gamemode、Match3GameInstance这几块重要的部分会在随后的文章逐步解析。Grid和Tile组成Match3的'天和地',掌握梳理棋盘和棋子逻辑是走入大门的第一步。 (一)Tile (1)TileAbilities 官方Match3中大家看到六种不一样的Tile。它们都是从这个爸爸继承过去的儿子,龙生九子,六种Tile外貌不同,能力也不尽相同。 相同点:每个Tile下面没有兄弟支撑的时候都会下落。 不同点:比如石头Tile性情冷淡对玩家也爱理不理和其他兄弟也不互动,炸弹Tile脾气火爆一点就炸有时候带着其他炸弹兄弟搞爆破,红绿蓝黄Tile四兄弟性情温和,兄弟之间交换互动。 试联想下 这些Tile具有的基本能力是什么。如果让你做一个基础类的设计者,基础的爸爸类,都包含哪些能力那? 聪明的设计师把Tile是否能进行交换,会爆炸的能力抽象出来一个struct FTileAbilities 代码如下: USTRUCT()struct FTileAbilities{ GENERATED_USTRUCT_BODY(); bool CanExplode() { return bExplodes; } bool CanSwap() { return (!bPreventSwapping && !bExplodes); }protected: /** Tile explodes when selected (change this!) */ UPROPERTY(EditAnywhere, BlueprintReadWrite) uint32 bExplodes : 1; /** Tile can't be selected as part of a normal swapping move. */ UPROPERTY(EditAnywhere, BlueprintReadWrite) uint32 bPreventSwapping : 1;public: /** Power rating of a bomb. What this means is determined in GameMode code, and can consider what kind of bomb this is. */ UPROPERTY(EditAnywhere, BlueprintReadWrite) int32 BombPower;};尽管石头Tile不理会玩家的‘戳’,我们的爸爸Tile依然具有这样的能力。由两个函数设置了对Tile的监听——我们什么时候被玩家选中呀!代码如下: void ATile::TilePress(ETouchIndex::Type FingerIndex, AActor* TouchedActor){ // We clicked or touched the tile. if (!UGameplayStatics::IsGamePaused(this) && Grid) { Grid->OnTileWasSelected(this); }}void ATile::TileEnter(ETouchIndex::Type FingerIndex, AActor* TouchedActor){ // We have moved into the tile's space while we had a different tile selected. This is the same as pressing the tile directly. // Note that we need to make sure it's a different actual tile (i.e. not NULL) because deselecting a tile by touching it twice will then trigger the TileEnter event and re-select it. if (!UGameplayStatics::IsGamePaused(this) && Grid) { ATile* CurrentlySelectedTile = Grid->GetCurrentlySelectedTile(); if (CurrentlySelectedTile && (CurrentlySelectedTile != this)) { TilePress(FingerIndex, TouchedActor); } }}在Tile被生出来 我们就在BeginPlay中将这两个函数加入InputComponent组件中,一旦发现被戳我们就运行我们的函数.代码如下: void ATile::BeginPlay(){ Super::BeginPlay(); Grid = Cast<AGrid>(GetOwner()); // Set our class up to handle touch events. OnInputTouchBegin.AddUniqueDynamic(this, &ATile::TilePress); OnInputTouchEnter.AddUniqueDynamic(this, &ATile::TileEnter);}
(2)Tile Falling Tile第二个重要的能力Falling——Tile被玩家干掉 获取分数,其他存活的Tile没有其他兄弟支撑,就会下落到有兄弟支撑地方。 刚起头到这个位置!
|