(NO.00005)iOS实现炸弹人游戏(十一):怪物之火精灵
大熊貓豬·侯佩原創或翻譯作品.歡迎轉載,轉載請注明出處.
如果覺得寫的不好請多提意見,如果覺得不錯請多多支持點贊.謝謝! hopy ;)
從本篇開始我們一次介紹一下游戲中敵人的制作過程.看過第一篇的小伙伴都知道,在炸彈人游戲中一共準備實現4種敵人.不同的怪物要有不同的特點,否則如果只是外形發生變化其余行為都一樣的話,也就沒有什么意思了.
我們本篇先介紹第一種,也是最普通的火焰精靈FireSprite.
首先需要找到火焰精靈對應的素材:
用TexturePacker制作成Cocos2D可以使用的紋理.
打開Xcode,新建FireSprite類,將其頭文件替換為如下內容:
#import "CCSprite.h" #import "Comm.h"@class MainScene; //敵人FireSprite類 @interface FireSprite : CCSprite <RoleAcross>{ @protectedMainScene *_mainScene;//以下2個變量防止精靈在前一個移動未完成時再次點擊屏幕后發生的詭異漂移行為.//當前的步進動作CCAction *_currentStepAction;//掛起的移動動作NSValue *_pendingMove;NSInteger _maxHScore; }@property (nonatomic,assign) NSInteger score;@property (nonatomic,assign) BOOL canAcrossBrick; @property (nonatomic,assign) BOOL canAcrossBomb; @property (nonatomic,assign) BOOL isHarmless;@property (nonatomic,assign) CGFloat speedPerStep;-(id)initWithMainScene:(MainScene*)mainScene;-(void)autoMoveScopeWithMaxHScore:(NSInteger)maxHScore;-(void)fade;-(BOOL)moveTowardByAStarSingleCall:(CGPoint)targetLocation;+(void)initClassNames; +(FireSprite*)randomFS:(MainScene*)mainScene; +(Class)randomFSClass;@end注意該類接口的定義表示該類遵守RoleAcross協議,其在Comm.h中定義:
//角色的穿越協議 @protocol RoleAcross-(BOOL)canAcrossBrick; //是否可以穿過磚塊 -(BOOL)canAcrossBomb; //是否可以穿過炸彈 -(BOOL)isHarmless; //是否是無害的(暫時只用在敵人角色上) @optional -(void)otherMovingWay; //可選方法,用來實現敵人角色的特殊移動行為 @endFireSprite類頭文件和游戲主角中定義的類似,因為準備讓該類成為其他所有怪物類的基類,所以我們將一些子類可能用到的實例變量放到接口聲明中,并用@protected偽指令修飾.其他實例變量名稱我都做了注釋標明.
游戲中敵人和主角的行為是類似的,也可以移動也可以死亡等.但它們之間最主要的不同是游戲主角的移動是我們手動控制的,而游戲中怪物是靠AI自己移動的.針對這種不同我們需要修改其移動的方法,下面我么就來看看如何完成該功能.
首先因為不用考慮目標在移動時再次發生移動操作,所以我們只需要考慮一個不可重入的移動方法:
//不可以重入的AStar移動算法 -(BOOL)moveTowardByAStarSingleCall:(CGPoint)targetLocation{if (_currentStepAction) {_pendingMove = [NSValue valueWithCGPoint:targetLocation];return NO;}if (CGPointEqualToPoint(fromTileCoord, toTileCoord)) { return NO;}if (![_mainScene isWalkableTile:toTileCoord forRole:self]) {return NO;}//省略和游戲主角移動方法相同的代碼... //如果fs被關在一個tile中就會發生周圍沒有一個鄰居可達方塊的死鎖情況,這里只是簡單讓其過5秒再試一次.if (adjSteps.count == 0) {[self performSelector:@selector(autoMoveScopeWithMaxHScoreInside) withObject:nilafterDelay:5.0f];return YES;} //省略和游戲主角移動方法相同的代碼...return YES; }以上代碼和游戲主角的移動代碼非常類似,但是做了一些小的調整,比如方法返回YES表示移動行為完成了,否則表示沒有.其中處理了當怪物被關在封閉空間中會發生尋路死鎖的情況.
我們知道以上代碼只是A*尋路的前半部分,在下一篇中我們就來看看后半部分的編碼. 下篇見.
總結
以上是生活随笔為你收集整理的(NO.00005)iOS实现炸弹人游戏(十一):怪物之火精灵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git cherry-pick简介
- 下一篇: liunx 分割合并文件