(NO.00005)iOS實現炸彈人遊戲(八):遊戲主角(一)
大熊貓豬·侯佩原創或翻譯作品.歡迎轉載,轉載請註明出處.
如果覺得寫的不好請多提意見,如果覺得不錯請多多支援點贊.謝謝! hopy ;)
最近一直在做另一個RPG遊戲,所以本系列遲遲沒有更新,上一篇博文的地址在:
(NO.00005)iOS實現炸彈人遊戲(七):遊戲資料的序列化表示
本篇接著上篇介紹炸彈人遊戲中的遊戲主角的基本構成,遊戲主角自然是我們的炸彈人了.
因為主角會在遊戲情境中各個方向行走,所以我們需要先準備其對應的圖片資源:
如各位所見除了普通的移動動作,我還選擇了主角被人道毀滅和無敵狀態的動作素材,這個在後面大家將會看到如何融入到遊戲邏輯中去.另外為了方便,我使用TexturePacker將其統統打包到一張紋理中去以最佳化效能.<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/160203/04133M500-1.png" title="\" />
開啟Xcode,建立一個新類BombManSprite.開啟BombMaSprite.h標頭檔,替換為如下內容:
#import "CCSprite.h"#import "Comm.h"@class MainScene;//遊戲主角炸彈人類@interface BombManSprite : CCSprite @property (nonatomic,assign) BOOL isDead;@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)moveTowardByAStar:(CGPoint)targetLocation; //A*演算法移動至目標位置(非瓦塊座標)-(void)fired; //燃燒自身動畫-(BOOL)isInvincible;-(void)setIsInvincible:(BOOL)isInvincible;-(void)runWinAnimation;@end
其中五個屬性分別為主角是否死亡,是否可以穿牆,是否可以穿炸彈,是否炸彈可以傷害主角,以及主角行走的速度.
幾個執行個體方法的作用再分別解釋如下:
//初始化主角-(id)initWithMainScene:(MainScene*)mainScene;//A*演算法移動至目標位置(非瓦塊座標)-(void)moveTowardByAStar:(CGPoint)targetLocation; //燃燒自身動畫-(void)fired; //是否處於無敵狀態-(BOOL)isInvincible;//設定無敵狀態-(void)setIsInvincible:(BOOL)isInvincible;//運行遊戲過關時的主角慶祝動作-(void)runWinAnimation;
接下來開啟實現檔案,我首先來實現主角初始化的方法:
-(id)initWithMainScene:(MainScene *)mainScene{ self = [super initWithImageNamed:@"bm_forward.png"]; if (self) { _mainScene = mainScene; _facingForwardAnimation = [CCAnimation animation:@"bm" middle:@"forward" frameCount:3]; _facingBackAnimation = [CCAnimation animation:@"bm" middle:@"back" frameCount:3]; _facingLeftAnimation = [CCAnimation animation:@"bm" middle:@"left" frameCount:3]; _facingRightAnimation = [CCAnimation animation:@"bm" middle:@"right" frameCount:3]; _firedAnimation = [CCAnimation animation:@"bm" middle:@"fired" frameCount:5]; _facingForwardRideAnimation = [CCAnimation animation:@"bm" middle:@"rideForward" frameCount:3]; _facingBackRideAnimation = [CCAnimation animation:@"bm" middle:@"rideBack" frameCount:3]; _facingLeftRideAnimation = [CCAnimation animation:@"bm" middle:@"rideLeft" frameCount:3]; _facingRightRideAnimation = [CCAnimation animation:@"bm" middle:@"rideRight" frameCount:3]; _happyAnimation = [CCAnimation animation:@"bm" middle:@"dead" frameCount:3]; _spOpenSteps = nil; _spClosedSteps = nil; _shortestPath = nil; _currentStepAction = nil; _pendingMove = nil; _speedPerStep = 0.8; _curDirection = RoleDirectionDown; } return self;}
大家可以看到如上代碼首先儲存主情境的執行個體,便於以後調用主情境的方法.這裡多說一句,主情境在這裡起到一個樞紐的作用,所有相關的類都可以藉助主情境的協助放來來完成指定的功能.另外還有一種方法是將所有協助方法放到一個單例類中,調用的時候取得單例類的執行個體,然後調用即可.
接下來一次預先建立主角各種行為的動畫,後面是初始化一些A*演算法需要的變數和主角自身的執行個體變數,比如行走的速度等.