(NO.00005)iOS實現炸彈人遊戲(十一):怪物之火精靈

來源:互聯網
上載者:User

(NO.00005)iOS實現炸彈人遊戲(十一):怪物之火精靈

大熊貓豬·侯佩原創或翻譯作品.歡迎轉載,轉載請註明出處.
如果覺得寫的不好請多提意見,如果覺得不錯請多多支援點贊.謝謝! hopy ;)

從本篇開始我們一次介紹一下遊戲中敵人的製作過程.看過第一篇的小夥伴都知道,在炸彈人遊戲中一共準備實現4種敵人.不同的怪物要有不同的特點,否則如果只是外形發生變化其餘行為都一樣的話,也就沒有什麼意思了.

我們本篇先介紹第一種,也是最普通的火焰精靈FireSprite.

首先需要找到火焰精靈對應的素材:<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/160203/0414003914-1.png" title="\" />

用TexturePacker製作成Cocos2D可以使用的紋理.

開啟Xcode,建立FireSprite類,將其標頭檔替換為如下內容:

#import "CCSprite.h"#import "Comm.h"@class MainScene;//敵人FireSprite類@interface FireSprite : CCSprite {@protected    MainScene *_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;          //可選方法,用來實現敵人角色的特殊移動行為@end

FireSprite類標頭檔和遊戲主角中定義的類似,因為準備讓該類成為其他所有怪物類的基類,所以我們將一些子類可能用到的執行個體變數放到介面聲明中,並用@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:nil                       afterDelay:5.0f];            return YES;        }//省略和遊戲主角移動方法相同的代碼...    return YES;}

以上代碼和遊戲主角的行動程式碼非常類似,但是做了一些小的調整,比如方法返回YES表示移動行為完成了,否則表示沒有.其中處理了當怪物被關在封閉空間中會發生尋路死結的情況.

我們知道以上代碼只是A*尋路的前半部分,在下一篇中我們就來看看後半部分的編碼. 下篇見.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.