Hello Events

0.9.x以降のバージョンで有効です.
hello_events.jpg

重要:
この例ではタッチや加速度センサーのイベントを基本的な手順のみを示します.
一部の高度なオプションの初期化については削除されているためとてもシンプルな例と言えます.

インポートヘッダー

c / c++ / その他の言語のようにいくつかのヘッダーをインポートする必要があります.

 
// UIWindow, NSAutoReleasePool, その他のオブジェクトの為に必要なインポートです
#import <UIKit/UIKit.h>
 
// インタフェースをインポートします
#import "HelloEvent.h"
 
// 使用するタグを簡単に定義します
enum {
	kTagSprite = 1,
};
 

レイヤー

HelloEventsの実装部です. タッチや加速度センサをサポートするレイヤーを作成します.

  • タッチ : スプライトをタッチした座標に移動させる
  • 加速度センサー : 加速度センサーの値によってスプライトの大きさを拡大縮小する
 
// HelloEvents の実装
@implementation HelloEvents
 
// "init"メソッド上でインスタンスの初期化を行う必要があります
-(id) init
{
	// ここでは常に"super"のinitメソッドを呼び出します
	// アップルは"super"の戻り値に"self"を割り当てる事を推奨しています
	if( (self=[super init] )) {
 
		// isTouchEnabled はレイヤーの(スーパークラスの)プロパティです
		// このプロパティがYESなら、タッチが有効になります
		self.isTouchEnabled = YES;
 
		// isAccelerometerEnabled はレイヤーの(スーパークラスの)プロパティです
		// このプロパティがYESなら、加速度センサーが有効になります
		self.isAccelerometerEnabled = YES;
 
		//
		// ラベル
		//
 
		// ラベルを生成して初期化します
		CCLabel* label = [CCLabel labelWithString:@"Hello Events" fontName:@"Marker Felt" fontSize:64];
 
		// ディレクターにウインドウのサイズをたずねます
		CGSize size = [[CCDirector sharedDirector] winSize];
 
		// ラベルのポジションをスクリーンの中心にします
		// 'ccp'はポイントの生成を助けるマクロで、"CoCos Point"を意味しています
		label.position =  ccp( size.width /2 , size.height/2 );
 
		// このレイヤーに子要素としてラベルを追加します
		[self addChild: label];
 
		//
		// スプライト
		//
 
		CCSprite *sprite = [CCSprite spriteWithFile:@"grossini.png"];
		sprite.position = ccp( 50, 50);
 
		// パラメーターのzはZオーダーのことで, この値が大きいほど手前に位置することを意味しています
		// デフォルトではzの値は0になっています
		// そのためスプライトはラベルの上部にあることになります
		// スプライトにタグを追加する事で, 後からタグによってスプライトを"取得"することができます
		[self addChild:sprite z:1 tag:kTagSprite];		
	}
	return self;
}
 
// "dealloc"メソッドでは、保持している全てのオブジェクトを解放する必要があります
- (void) dealloc
{
	// 何か解放するものがある場合は、ここで解放してください
	// 今回の例では何も解放する必要はありません
	// cocos2dは"ラベル"のような全ての子要素を自動的に解放してくれます
 
	// "super dealloc"を呼び出すのを忘れないでください!
	[super dealloc];
}
@end
 

タッチのコールバック

このコールバックはisTouchEnabledプロパティがYESの場合に呼び出されるようになります。
可能なイベント:

  • ccTouchesBegan
  • ccTouchesMoved
  • ccTouchesEnded
  • cctouchesCancelled
 
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
	UITouch *touch = [touches anyObject];
 
	if( touch ) {
		CGPoint location = [touch locationInView: [touch view]];
 
		// 重要:
		// タッチは常に"ポートレイト"の座標であるため、現在の向きに座標を変換する必要があります
		CGPoint convertedPoint = [[Director sharedDirector] convertToGL:location];
 
		CCNode *sprite = [self getChildByTag:kTagSprite];
 
		// 実行している全てのアクションを停止します
		[sprite stopAllActions];
 
		// そして新しいアクションを実行します
		[sprite runAction: [CCMoveTo actionWithDuration:1 position:convertedPoint]];
	}
}
 

加速度センサーのコールバック

このコールバックはisAccelerometerEnabledプロパティがYESの場合に呼び出されるようになります.

 
- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{	
	CCNode *sprite = [self getChildByTag:kTagSprite];
 
	// これらは常に"ポートレイト"の座標系なので
	// "ランドスケープ"の座標系に変換します
	CGPoint converted = ccp( (float)-acceleration.y, (float)acceleration.x);	
 
	// Z軸を基準にした回転で回転アクションを更新します
	// スプライトは常に"立ち上がって"いることになります
	sprite.rotation = (float) CC_RADIANS_TO_DEGREES( atan2f( converted.x, converted.y) + M_PI );
 
	// 加速度の幅を基準にしてスケールアクションを更新します
	// 加速度が大きいほど倍率も大きくなります
	sprite.scale = 0.5f + sqrtf( (converted.x * converted.x) + (converted.y * converted.y) );
}
@end
 

アプリケーションデリゲート

このクラスでは初期化処理を行います. おそらく全てのゲームでこのようなアプリケーションデリゲートを持たせる事になります. 現時点ではこのコードを理解しているかどうかは重要ではありません.

 
@implementation AppController
 
// "window"はプロパティです. @synthesizeはアクセサメソッドを生成します.
@synthesize window;
 
// アプリケーションのエントリーポイント
- (void) applicationDidFinishLaunching:(UIApplication*)application
{
	// CC_DIRECTOR_INIT() マクロの仕様
	//
	// 1. EAGLViewをゼロビットデプスフォーマットとRGB565レンダーバッファで初期化
	// 2. EAGLViewマルチタッチ: 無効
	// 3. UIWindowを生成して"window" varに割り当てる("window"はあらかじめ宣言されている必要がある)
	// 4. 親となるEAGLViewを新しく生成されたウインドウとする
	// 5. ディレクターをウインドウとリンクさせる
	// 5a. 5.)が失敗したならNSTimerディレクターを使用
	// 6. 60FPSでの実行を試みる
	// 7. FPSの表示: しない
	// 8. デバイスの向き: ポートレイト
	// 9. ディレクターをEAGLViewに接続
	//
	CC_DIRECTOR_INIT();
 
	// 共有されるディレクターを取得する
	CCDirector *director = [CCDirector sharedDirector];
 
	// レイヤーを生成する前にランドスケープモード(横向き)に設定します
	[[CCDirector sharedDirector] setDeviceOrientation:CCDeviceOrientationLandscapeLeft];
 
	// FPSの表示をオンにする
	[director setDisplayFPS:YES];
 
	// マルチタッチを有効にする
	EAGLView *glView = [director openGLView];
	[glView setMultipleTouchEnabled:YES];	
 
	// 空のシーンを生成して初期化する
	CCScene *scene = [CCScene node];
 
	// HelloEventsレイヤーを生成して初期化する
	CCLayer *layer = [HelloEvents node];
	// メインシーンの子要素としてHelloWorldレイヤーを追加する
	[scene addChild:layer];
 
	// 実行!
	[director runWithScene: scene];
}
 
 
- (void) dealloc
{
	[window release];
	[super dealloc];
}
 
@end
 

メインエントリーポイント

Objective-CでもC言語やC++と同様にmainメソッドがメインエントリーポイントです.

 
int main(int argc, char *argv[]) {
	// 安全のためこれらのラインはそのまま残してください
	NSAutoreleasePool *pool = [NSAutoreleasePool new];
	UIApplicationMain(argc, argv, nil, @"AppController");
	[pool release];
	return 0;
}
 

ヘッダーファイル

そしてこちらがヘッダーファイルです.

 
// このファイルをインポートすることでcocos2dの全てのクラスをインポート出来ます
#import "cocos2d.h"
 
// アプリケーションデリゲートクラス
@interface AppController : NSObject <UIAccelerometerDelegate, UIAlertViewDelegate,  UITextFieldDelegate, UIApplicationDelegate>
{
	// メインのUIWindow
	// OpenGLビューはこのUIWindowにアタッチされます
	UIWindow *window;
}
 
// メインのUIWindowのプロパティを作成します
@property (nonatomic, retain) UIWindow *window;
@end
 
// HelloEvents レイヤー
@interface HelloEvents : Layer
{
}
@end
 

添付ファイル: filehello_events.jpg 851件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-10-24 (日) 17:14:25 (2526d)