cococos 2 dでMVCを実現する方法(五)
Modelの更新
ユーザーがツールボックスから小さなツールを選択し、game boardの上に配置すると、これらのイベントに応答する符号化が必要になります.前の記事では、GameBoardViewDelegateのtouchedAtRowメソッドを実装しました.このプロトコルにインタフェースメソッドを追加する必要があります.次のようになります.
touchイベントプロセッサを修正する必要があります.これにより、ツールボックスに触れたのかgame boardに触れたのかを判断できます.
コントロールクラスでtouchイベントを処理するのは簡単です.モデルの参照を1つ持って、touchイベントに基づいてmodelを呼び出す方法だけでいいです.私たちのインタフェースは下とあまり差がないように見えますが、実装の詳細を省略しています.
そして,GameBoardControllerでGameBoardViewDelegateの2つの方法を完全に実現した.
これまで,ユーザはツールボックスの中の小さなツールをクリックしてgame boardの中の小さなブロックの上に置くことができ,同時にmodelクラスが真ん中に橋の役割を果たすことを実現した.
modelの変更についてviewに通知
viewにmodelの状態変更を反映するために、modelが変化したときにviewに通知メッセージを送信し、viewは異なるメッセージに基づいて異なる応答を行うことができます.我々がビューをcontrollerを介して実装するのと同様に,ここではビューモデルの変化を通知するためのGameBoardDelegateも定義した.
GameBoardViewでGameBoardDelegateを実装する場合、game boardの上に小さなツールを置く必要がある場合、CCSpriteを定義します.
まとめ
フレームワークのすべての部分が結びつき、model、view、controllerの3つが有名なMVCモードを構成しています. Viewはtouchイベントを受信し、controller, にイベントを渡す Controllerは、ユーザのtouchイベントに応答し、model を更新する modelはそれ自体の状態を更新し、ゲームロジックを処理し、viewに何が変わったかを教えます. Viewは、Modelの現在の状態に基づいて、自己の表示 を更新する.
変換元:http://www.cnblogs.com/andyque/archive/2012/03/18/2390106.html
ユーザーがツールボックスから小さなツールを選択し、game boardの上に配置すると、これらのイベントに応答する符号化が必要になります.前の記事では、GameBoardViewDelegateのtouchedAtRowメソッドを実装しました.このプロトコルにインタフェースメソッドを追加する必要があります.次のようになります.
@protocol GameBoardViewDelegate
- (void)gameBoard:(GameBoard *)gameBoard touchedAtRow:(int)row column:(int)column;
- (void)gameBoard:(GameBoard *)gameBoard toolboxItemTouchedAtIndex:(int)index;
@end
touchイベントプロセッサを修正する必要があります.これにより、ツールボックスに触れたのかgame boardに触れたのかを判断できます.
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint point = [self convertTouchToNodeSpace:touch];
// touched on a game board
if (CGRectContainsPoint(gameBoardRectangle, point)) {
int row, column;
// calculate row and column based on a touch coordinate
// ...
// call controller
[self.delegate gameBoard:self.gameBoard touchedAtRow:row column:column];
}
// touched on a toolbox
else if (CGRectContainsPoint(toolboxRectangle, point)) {
int index;
// calculate toolbox item index based on a touch coordinate
[self.delegate gameBoard:self.gameBoard toolboxItemTouchedAtIndex:index];
}
}
コントロールクラスでtouchイベントを処理するのは簡単です.モデルの参照を1つ持って、touchイベントに基づいてmodelを呼び出す方法だけでいいです.私たちのインタフェースは下とあまり差がないように見えますが、実装の詳細を省略しています.
@interface GameBoard : NSObject {
// ...
}
// ...
- (void)putGamePiece:(GamePiece *)gamePiece row:(int)row column:(int)column;
- (GamePiece *)getGamePieceFromToolboxItemAtIndex:(int)index;
@end
そして,GameBoardControllerでGameBoardViewDelegateの2つの方法を完全に実現した.
- (void)gameBoard:(GameBoard *)aGameBoard toolboxItemTouchedAtIndex:(int)index {
// keep the toolbox selection state in the Model
gameBoard.selectedToolboxItemIndex = index;
}
- (void)gameBoard:(GameBoard *)aGameBoard touchedAtRow:(int)row column:(int)column {
// if the toolbox item is selected move item from toolbox to game board
if (gameBoard.selectedToolboxItemIndex != -1) {
GamePiece *gamePiece = [gameBoard getGamePieceFromToolboxItemAtIndex:gameBoard.selectedToolboxItemIndex];
[gameBoard putGamePiece:gamePiece row:row column:column];
}
}
これまで,ユーザはツールボックスの中の小さなツールをクリックしてgame boardの中の小さなブロックの上に置くことができ,同時にmodelクラスが真ん中に橋の役割を果たすことを実現した.
modelの変更についてviewに通知
viewにmodelの状態変更を反映するために、modelが変化したときにviewに通知メッセージを送信し、viewは異なるメッセージに基づいて異なる応答を行うことができます.我々がビューをcontrollerを介して実装するのと同様に,ここではビューモデルの変化を通知するためのGameBoardDelegateも定義した.
@protocol GameBoardDelegate;
@interface GameBoard : NSObject
// ...
@property (nonatomic, assign)
id<GameBoardDelegate> delegate;
// ...
@end
@protocol GameBoardDelegate
- (void)gameBoard:(GameBoard *)gameBoard didPutGamePiece:(GamePiece *)gamePiece row:(int)row column:(int)column;
@end
@implementation GameBoard
- (void)putGamePiece:(GamePiece *)gamePiece row:(int)row column:(int)column {
// ...
// store game piece
// notify that the game piece was put on a gameboard
[delegate gameBoard:self didPutGamePiece:gamePiece row:row column:column];
}
@end
GameBoardViewでGameBoardDelegateを実装する場合、game boardの上に小さなツールを置く必要がある場合、CCSpriteを定義します.
@interface GameBoardView : CCLayer
// ...
@end
@implementation GameBoardView
- (id)initWithGameBoard:(GameBoard *)aGameBoard delegate:(id)aDelegate {
if ((self = [super init])) {
// retain gameboard
self.gameBoard = aGameBoard;
self.gameBoard.delegate = self;
// assign delegate
self.delegate = aDelegate;
}
}
- (void)gameBoard:(GameBoard *)gameBoard didPutGamePiece:(GamePiece *)gamePiece row:(int)row column:(int)column {
// create CCSprite and put it on a game board at corresponding position
CCSprite *gamePieceSprite = [CCSprite spriteWithFile:fileName];
// ...
[self addChild:gamePieceSprite];
}
@end
まとめ
フレームワークのすべての部分が結びつき、model、view、controllerの3つが有名なMVCモードを構成しています.
変換元:http://www.cnblogs.com/andyque/archive/2012/03/18/2390106.html