SlideShare ist ein Scribd-Unternehmen logo
1 von 78
cocos2d 2.0for iPhone
       勉強会
    cocos2dを覚えよう!	
  
         初級編③
動作環境
•  Mac OS X 10.8 Mountain Lion
•  xcode 4.5.2
•  cocos2d for iPhone 2.0
 http://www.cocos2d-iphone.org/
はじめに
•  cocos2dを覚えよう!初級編③
•  ボタンで移動してみよう!
もくじ
•    cocos2dの基本
•    Sceneの構成要素
•    忍ベーダー
•    仮想スティック
•    忍者の移動
cocos2dの基本
•  まずはcocos2dについておさらい!
cocos2dについて
•    オープンソース+無料で商用利用可能
•    2Dに特化
•    物理エンジン搭載(box2d,chipmunk)
•    効果音やBGMの再生も可能
•    OpenGL利用で高速描画
•    Objective-Cで書かれている
デメリット
•  iPhone標準のUIが使えない。
 (がんばれば使えるかも?)
cocos2dの基礎知識
•  スプライト(sprite):一般的には、キャラ
   クターを表示する技術。
•  スプライトエンジン:スプライトを簡単
   に管理、表示できる仕組み
cocos2dの座標
•  座標は左下が(0,0)
•  スプライトの基準点は中心(変更可能)
                                      (480,320)


                                 (基準点)




      (0,0)

 ※単位はpointで、通常1point=1px,retinaでは1point=2px
cocos2dの基礎知識
•  CCSprite
  –  回転、拡大、縮小、傾斜、透過
•  CCAnimation
  –  ぱらぱら漫画のような、画像切り替え
•  CCAction
  –  キャラクターに任意の動きを設定可能
  –  イベント処理
    (CCSendMessage、CCCallFunc)
cocos2dの基礎知識
•  CCTMXTiledMap
  –  タイルマップの表示
•  CCParticleSystem
  –  パーティクルの表示
•  CCSpriteBatchNode
  –  スプライトをまとめて管理
•  SimpleAudioEngine
  –  効果音、BGMを簡単に再生
こまったときは?
•  こまったときは、プログラミングガイド
   を見よう!
 –  http://www.cocos2d-iphone.org/wiki/
    doku.php/prog_guide:index
Sceneの構成要素
•  Sceneの構成要素を覚えよう!
Sceneは複数作れる
Sceneの中にはLayerをおける
Layerの中にはいろいろおける




      CCSprite、CCMenu、CCLabelBMFont、	
  
      CCSpriteBatchNode	
  
      などを置くことができる
LayerとSprite
  •  Layer	
  
      •  Sprite(手裏剣1)	
  
      •  Sprite(手裏剣2)	
  
      •  Sprite(手裏剣3)	
  
      •  Sprite(忍者)	
  

  レイヤーの中に、スプライトを置くことが
  できる	
  
LayerにSpriteBatchNodeを置ける




         SpriteBatchNodeを置いても、画
         面には表示されない。	
  
         	
  
         SpriteBatchNodeに、Spriteを置く
         と画面に表示される	
  
LayerとSpriteBatchNodeとSprite
          •  Layer	
  
              •  BatchNode	
  
                  •  Sprite(手裏剣1)	
  
                  •  Sprite(手裏剣2)	
  
                  •  Sprite(手裏剣3)	
  
              •  BatchNode	
  
                  •  Sprite(忍者)	
  

          レイヤーの中に、バッチノードをおいて、そ
          の中に、スプライトを置く	
  
          	
  
          バッチノードの中には、その中に含まれてい
          るスプライトしかおけない	
  
TagとZ
•  Layerや、スプライトなど、CCNodeには、
   TagとZが定義されています。
•  Tagを一意にすることで、getChildByTag
   で親Nodeから取得が可能です。
•  Zは重ね合わせの優先順位を表します。
•  Zが値が大きい方が上に描画されます。
忍ベーダー
•  次々と現れる侵略者(忍ベーダー)をたおしていこう!
•  忍ベーダーが、ライフラインを超えるとゲームオーバー
ルール
•  タイトル画面でボタンを押すとゲーム開始
•  READY→STARTのあと、ゲーム開始
•  忍ベーダーは、上から攻めてくる。大きさによって硬さ
   や得点が違う
•  忍者は、ボタンで左右移動
•  忍者が止まると上を向いて、手裏剣を自動で打つ
•  ライフラインに忍ベーダーが来たらゲームオーバー
•  GAMEOVERを表示して、タイトル画面に戻る
4inch対応
     •  今回は画面上部の見
        える部分を変更する
        ことで対応します	
  
     •  スコアなどの文字は、
        画面の高さをもとに
        表示して、画面内に
        収まるようにします。	
  
     •  忍ベーダーや手裏剣
        は、4inchの座標で計
        算します。3.5inchでも
        得ない画面外の部分
        でも処理を行います。	
  
がめんこうせい
タイトルscene   メインscene
タイトルscene
•  フロントlayer
  –  スコア
•  タイトルlayer
  –  タイトルロゴ
  –  スタートボタン
  –  床
•  背景layer
  –  背景画像
メインscene
•  フロントlayer
  –  スコア
•  スティックlayer
  –  左右のボタン
•  メインlayer
  –    READY? 、START!
  –    ゲームオーバー
  –    忍ベーダー、手裏剣
  –    忍者
  –    点線、床
•  背景layer
  –  背景画像
今回作るところ
  •  忍者が動くところまで
     つくります!
音楽素材について①
•  音楽素材については、PANICPUMPKIN様
   のご好意により、使用させていただいてい
   ます。
•  http://panicpumpkin.omiki.com/
•  ゲームBGMに特化したサイトなのでおす
   すめ!(曲数も多いです)
•  利用報告、 著作表記、リンクなどの明記
   不要で商用利用可能の音楽素材を多数公
   開されています。
音楽素材について②
•  有料でオリジナル曲を制作してもらえる
   「PANSOUND」というサイトもあるので、
   ぜひ利用してみてください!
•  http://pansound.com/
仮想スティック
•  仮想スティックをつくってみよう!
仮想スティックの仕様
   •  左右に移動ボタン	
  
   •  ボタンの状態を変数に
      設定	
  
ボタンの仕様
 •  おしてるあいだは色が
    変わる!	
  
 •  おしてるあいだは、変
    数(isL,	
  isR)がYESに
    なる	
  
普通のボタンとの違い
   •  普通のボタンは、おし
      て離した時にイベント
      が起きる	
  
   •  コントローラーのボタ
      ンは、押した時にON、
      離した時にOFFになる	
  
moveイベント
  •  ONになったあと、指を
     移動してボタン外に出
     たらOFFになる。	
  
  •  指を移動して、移動先
     がボタンだったらONに
     なる	
  
マルチタッチ
 •  両手を使うため、マル
    チタッチに対応する	
  
 •  複数の指で同じボタン
    が押された時も考慮す
    る	
  
 •  ボタンが押された時に
    UITouchを配列に記録し
    ておき、すべての指が
    離れたらOFFにする	
  
StickLayer.h	
  
@property	
  BOOL	
  isL;	
  
@property	
  BOOL	
  isR;	
  
GameData.h
@property	
  (nonatomic,	
  retain)	
  NSMutableArray	
  *stickArrayL;	
  
@property	
  (nonatomic,	
  retain)	
  NSMutableArray	
  *stickArrayR;
GameData.m
-­‐	
  (id)init{	
  
	
  	
  	
  	
  if((self	
  =	
  [super	
  init])){	
  
	
  	
  	
  	
  	
  	
  	
  	
  self.stickArrayL	
  =	
  [NSMutableArray	
  array];	
  
	
  	
  	
  	
  	
  	
  	
  	
  self.stickArrayR	
  =	
  [NSMutableArray	
  array];	
  
	
  	
  	
  	
  	
  	
  	
  	
  [self	
  resetScore];	
  
	
  	
  	
  	
  }	
  
                                    	
  return	
  self;	
  
}	
  
	
  
-­‐(void)resetStickArray{	
  
	
  	
  	
  	
  [self.stickArrayL	
  removeAllObjects];	
  
	
  	
  	
  	
  [self.stickArrayR	
  removeAllObjects];	
  
}
マルチタッチ対応	
  
cocos2dはデフォルトで、マルチタッチに対
応していないので対応させる!	
  
AppDelegate.m
  -­‐	
  (BOOL)application:(UIApplication	
  *)application	
  
didFinishLaunchingWithOptions:(NSDictionary	
  *)launchOptions	
  
{	
  
:	
  
        //	
  マルチタッチを有効にする	
  
        [glView	
  setMultipleTouchEnabled:YES];	
  
        return	
  YES;	
  
}	
  
	
  
ボタン画像の表示
•  ボタンのON,OFFの画像を所定の場所に表
   示する	
  
•  ON画像は、非表示にしておく	
  
•  StickLayerにバッチノードを追加し、その
   中にボタンを追加する
StickLayer.m①
-­‐(void)initLayer{	
  
	
  	
  	
  	
  [[CCSpriteFrameCache	
  sharedSpriteFrameCache]	
  
addSpriteFramesWithFile:@"NInvadersResource.plist"];	
  
	
  	
  	
  	
  CCSpriteBatchNode	
  *ninvadersBatchNode	
  =	
  [CCSpriteBatchNode	
  
batchNodeWithFile:@"NInvadersResource.pvr.ccz"	
  capacity:100];	
  
	
  	
  	
  	
  [self	
  addChild:ninvadersBatchNode	
  z:OBJECT_STICK	
  tag:OBJECT_STICK];	
  
	
  
StickLayer.m②
CCSprite	
  *sp;	
  
	
  	
  	
  	
  sp	
  =	
  [CCSprite	
  spriteWithSpriteFrameName:@"button_off.png"];	
  
	
  	
  	
  	
  sp.position	
  =	
  ccp(42,	
  92);	
  
	
  	
  	
  	
  [ninvadersBatchNode	
  addChild:sp	
  z:SPRITE_STICK_L_OFF	
  
tag:SPRITE_STICK_L_OFF];	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  sp	
  =	
  [CCSprite	
  spriteWithSpriteFrameName:@"button_on.png"];	
  
	
  	
  	
  	
  sp.position	
  =	
  ccp(42,	
  92);	
  
	
  	
  	
  	
  sp.visible	
  =	
  NO;	
  
	
  	
  	
  	
  [ninvadersBatchNode	
  addChild:sp	
  z:SPRITE_STICK_L_ON	
  
tag:SPRITE_STICK_L_ON];	
  
StickLayer.m③
sp	
  =	
  [CCSprite	
  spriteWithSpriteFrameName:@"button_off.png"];	
  
	
  	
  	
  	
  sp.position	
  =	
  ccp(320	
  -­‐	
  42,	
  92);	
  
	
  	
  	
  	
  [ninvadersBatchNode	
  addChild:sp	
  z:SPRITE_STICK_R_OFF	
  
tag:SPRITE_STICK_R_OFF];	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  sp	
  =	
  [CCSprite	
  spriteWithSpriteFrameName:@"button_on.png"];	
  
	
  	
  	
  	
  sp.position	
  =	
  ccp(320	
  -­‐	
  42,	
  92);	
  
	
  	
  	
  	
  sp.visible	
  =	
  NO;	
  
	
  	
  	
  	
  [ninvadersBatchNode	
  addChild:sp	
  z:SPRITE_STICK_R_ON	
  
tag:SPRITE_STICK_R_ON];	
  
}
タッチイベントを有効
•  StickLayerで、タッチイベントを有効にす
   る	
  
StickLayer.m
-­‐	
  (id)init{	
  
	
  	
  	
  	
  self	
  =	
  [[super	
  init]	
  autorelease];	
  
	
  	
  	
  	
  if	
  (self)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  //	
  イベントの無効/有効
                                      self.isTouchEnabled	
  =	
  YES;	
  
	
  	
  	
  	
  	
  	
  	
  	
  self.isAccelerometerEnabled	
  =	
  NO;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  //	
  変数
                                      GameData	
  *gameData	
  =	
  [GameData	
  getInstance];	
  
	
  	
  	
  	
  	
  	
  	
  	
  [gameData	
  resetStickArray];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  //レイヤーの初期化
	
  	
  	
  	
  	
  	
  	
  	
  [self	
  initLayer];	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  return	
  self;	
  
}	
  
タッチイベント
•  タッチされたら、タッチ座標を取得	
  
•  タッチ座標がボタンの位置だったら	
  
 –  UITouchを保存する	
  
 –  ボタンが押されたことにする	
  
 –  ONのボタンを表示する(今回は、OFFのボタ
    ンを非表示にしなくてもいいデザインなので、
    OFFボタンはそのまま)	
  
StickLayer.m①
-­‐(void)ccTouchesBegan:(NSSet	
  *)touches	
  withEvent:(UIEvent	
  *)event	
  {	
  
	
  	
  	
  	
  CCSpriteBatchNode	
  *ninvadersBatchNode	
  =	
  (CCSpriteBatchNode*)[self	
  getChildByTag:OBJECT_STICK];	
  
	
  	
  	
  	
  GameData	
  *gameData	
  =	
  [GameData	
  getInstance];	
  
                                                     	
  for(UITouch*	
  touch	
  in	
  touches){	
  
                                                     	
                  	
  CGPoint	
  touchPoint	
  =	
  [touch	
  locationInView:[touch	
  view]];	
  
                                                     	
                  	
  touchPoint	
  =	
  [[CCDirector	
  sharedDirector]	
  convertToGL:touchPoint];	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  CCSprite	
  *sp_off_l	
  =	
  (CCSprite*)[ninvadersBatchNode	
  getChildByTag:SPRITE_STICK_L_OFF];	
  
	
  	
  	
  	
  	
  	
  	
  	
  CCSprite	
  *sp_on_l	
  =	
  (CCSprite*)[ninvadersBatchNode	
  getChildByTag:SPRITE_STICK_L_ON];	
  
                                                     	
                  	
  if(CGRectContainsPoint(sp_off_l.boundingBox,	
  touchPoint)){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [gameData.stickArrayL	
  addObject:touch];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  sp_on_l.visible	
  =	
  YES;	
  
                                                     	
                  	
                	
  self.isL	
  =	
  TRUE;	
  
                                                     	
                  	
  }
StickLayer.m②
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  CCSprite	
  *sp_off_r	
  =	
  (CCSprite*)[ninvadersBatchNode	
  getChildByTag:SPRITE_STICK_R_OFF];	
  
	
  	
  	
  	
  	
  	
  	
  	
  CCSprite	
  *sp_on_r	
  =	
  (CCSprite*)[ninvadersBatchNode	
  getChildByTag:SPRITE_STICK_R_ON];	
  
                                                     	
                  	
  if(CGRectContainsPoint(sp_off_r.boundingBox,	
  touchPoint)){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [gameData.stickArrayR	
  addObject:touch];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  sp_on_r.visible	
  =	
  YES;	
  
                                                     	
                  	
             	
  self.isR	
  =	
  TRUE;	
  
                                                     	
                  	
  }	
  
                                                     	
  }	
  
}	
  
TIPS①
•  touchesの中に複数のタッチイベントが
   入っているので、1個ずつ処理を行う	
  
  –  for(UITouch*	
  touch	
  in	
  touches){	
  
  –  }	
  
•  touch	
  座標を、cocos2dの座標に変換する	
  
  –  CGPoint	
  touchPoint	
  =	
  [touch	
  locationInView:
     [touch	
  view]];	
  
  –  touchPoint	
  =	
  [[CCDirector	
  sharedDirector]	
  
     convertToGL:touchPoint];	
  
TIPS②
•  CGRectContainsPointで、Rectの中にPointが
   含まれているかをチェックできる	
  
•  スプライトのRectは、sp_off_l.boundingBox
   で取得できるので、そのなかにタッチ座標
   が含まれているかをチェックする	
  
  –  if(CGRectContainsPoint(sp_off_l.boundingBox,	
  
     touchPoint)){
タッチ終了イベント
•  保存してあるUITouchを削除する	
  
•  全部のTouchが離されていたら	
  
 –  ONのボタンを非表示にする	
  
 –  ボタンが押されていないことにする	
  
StickLayer.m①
-­‐(void)ccTouchesEnded:(NSSet	
  *)touches	
  withEvent:(UIEvent	
  *)event	
  {	
  
	
  	
  	
  	
  CCSpriteBatchNode	
  *ninvadersBatchNode	
  =	
  (CCSpriteBatchNode*)[self	
  
getChildByTag:OBJECT_STICK];	
  
	
  	
  	
  	
  GameData	
  *gameData	
  =	
  [GameData	
  getInstance];	
  
	
  
StickLayer.m②
                                                   	
  for(UITouch*	
  touch	
  in	
  touches){	
  
                                                   	
           	
  CGPoint	
  touchPoint	
  =	
  [touch	
  locationInView:[touch	
  view]];	
  
                                                   	
           	
  touchPoint	
  =	
  [[CCDirector	
  sharedDirector]	
  
convertToGL:touchPoint];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  CCSprite	
  *sp_on_l	
  =	
  (CCSprite*)[ninvadersBatchNode	
  
getChildByTag:SPRITE_STICK_L_ON];	
  
                                                   	
           	
  [gameData.stickArrayL	
  removeObject:touch];	
  
                                                   	
           	
  if([gameData.stickArrayL	
  count]	
  ==	
  0){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  sp_on_l.visible	
  =	
  NO;	
  
                                                   	
           	
              	
  self.isL	
  =	
  FALSE;	
  
                                                   	
           	
  }	
  
StickLayer.m③
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  CCSprite	
  *sp_on_r	
  =	
  (CCSprite*)[ninvadersBatchNode	
  
getChildByTag:SPRITE_STICK_R_ON];	
  
                                                   	
        	
  [gameData.stickArrayR	
  removeObject:touch];	
  
                                                   	
        	
  if([gameData.stickArrayR	
  count]	
  ==	
  0){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  sp_on_r.visible	
  =	
  NO;	
  
                                                   	
        	
                 	
  self.isR	
  =	
  FALSE;	
  
                                                   	
        	
  }	
  
                                                   	
  }	
  
}	
  
タッチ移動イベント
•  いったんタッチを離したことにする	
  
•  移動先が押されたことにする	
  
	
  
StickLayer.m
-­‐(void)ccTouchesMoved:(NSSet	
  *)touches	
  withEvent:(UIEvent	
  *)event	
  {	
  
	
  	
  	
  	
  [self	
  ccTouchesEnded:touches	
  withEvent:event];	
  
	
  	
  	
  	
  [self	
  ccTouchesBegan:touches	
  withEvent:event];	
  
}	
  
アプリが裏に回ったら?
•  アプリが裏に回ったら、タッチ終了イベン
   トがこないくせに、次回起動時にタッチし
   てない状態でアプリが始まる!	
  
•  アプリの再開時に、保存してあるTouchを
   クリアしよう!
AppDelegate.m
-­‐(void)	
  applicationWillEnterForeground:
(UIApplication*)application	
  
{	
  
                        	
  if(	
  [navController_	
  visibleViewController]	
  ==	
  director_	
  )	
  
                        	
             	
  [director_	
  startAnimation];	
  
	
  
	
  	
  	
  	
  //	
  Stickの初期化
                  GameData	
  *gameData	
  =	
  [GameData	
  getInstance];	
  
	
  	
  	
  	
  [gameData	
  resetStickArray];	
  
}
忍者の移動
•  忍者のキャラクターを移動させよう!
忍者の仕様
  •  ボタンがおされてい
     るあいだ移動する	
  
  •  移動中は、アニメー
     ションする	
  
  •  ボタンを離すと手裏
     剣をなげるために、
     上を向く	
  
忍者の実装
•  忍者クラスを作ってメインLayerで呼び出
   す	
  
•  忍者クラスの中に、SPRITEをもっておく	
  
•  メインLayerの中で、忍者のクラスのtickを
   呼び出す	
  
•  忍者のクラス内では、ボタンの状態を見て
   移動を行う
忍者クラスを作成
•  メインLayerで忍者クラスを作成	
  
•  スティックLayerを参照できるように、忍
   者クラスにメインSceneを設定	
  
•  忍者クラス内のスプライトを、メイン
   Layerに追加
MainLayer.m
       //	
  忍者
                 CCSpriteBatchNode	
  *gameBatchNode	
  =	
  
(CCSpriteBatchNode*)[self	
  getChildByTag:OBJECT_GAME];	
  
	
  	
  	
  	
  self.ninja	
  =	
  [[[Ninja	
  alloc]	
  init]autorelease];	
  
	
  	
  	
  	
  self.ninja.mainScene	
  =	
  (MainScene*)[self	
  parent];	
  
	
  	
  	
  	
  [gameBatchNode	
  addChild:self.ninja.sprite	
  
z:SPRITE_GAME_NINJYA	
  tag:SPRITE_GAME_NINJYA];
忍者を動かす
•  メインLayerのスケジュールの中で、忍者
   クラスの関数を呼び出し忍者の移動を行う
MainLayer.m
-­‐(void)gamePlay:(ccTime)dt{	
  
	
  	
  	
  	
  //	
  忍者移動
	
  	
  	
  	
  [self.ninja	
  tick:dt];	
  
}
忍者の移動①
•  忍者クラスの中で、スティックLayerの状
   態を調べて移動処理を行う	
  
•  ボタンが押されていた場合	
  
 –  その方向を向いていなかった場合	
  
   •  その方向を向いたアニメーション	
  
 –  忍者の座標をdt*speed動かす	
  
Ninja.m
	
  if(self.mainScene.stickLayer.isL){	
  
	
  	
  	
  	
  	
  	
  	
  	
  if(self.way	
  !=	
  NINJYA_WAY_LEFT){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [self.sprite	
  stopAllActions];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  NSMutableArray	
  *animFrames	
  =	
  [NSMutableArray	
  array];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [animFrames	
  addObject:[[CCSpriteFrameCache	
  sharedSpriteFrameCache]	
  
spriteFrameByName:@"ninjya_l.png"]];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [animFrames	
  addObject:[[CCSpriteFrameCache	
  sharedSpriteFrameCache]	
  
spriteFrameByName:@"ninjya_l2.png"]];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  CCAnimation	
  *animation	
  =	
  [CCAnimation	
  animationWithSpriteFrames:animFrames	
  delay:0.2f];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  id	
  repeatAnim	
  =	
  [CCRepeatForever	
  actionWithAction:[CCAnimate	
  
actionWithAnimation:animation]];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [self.sprite	
  runAction:repeatAnim];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  self.way	
  =	
  NINJYA_WAY_LEFT;	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  self.waitCount	
  =	
  0;	
  
	
  	
  	
  	
  	
  	
  	
  	
  x	
  =	
  x	
  -­‐	
  dt	
  *	
  NINJA_SPEED;	
  
	
  	
  	
  	
  }
TIPS
•  CCAnimation	
  を使うと、パラパラ漫画のよ
   うなコマを切り替えるアニメーションが
   できる	
  
•  向きが変わった時だけアニメーションを
   開始することで、自然に動きをつけること
   ができる
忍者の移動②
•  ボタンが押されていない場合は、停止処理
   を行う	
  
•  アニメーションを止める	
  
•  忍者の向きを見てスプライトを変更する	
  
•  self.waitCountをカウントアップして、一定
   時間経過したら、上を向くようにする	
  
Ninja.m
else{	
  
	
  	
  	
  	
  	
  	
  	
  	
  [self.sprite	
  stopAllActions];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  if(self.way	
  ==	
  NINJYA_WAY_LEFT){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  CCSpriteFrame	
  *sf	
  =	
  [[CCSpriteFrameCache	
  sharedSpriteFrameCache]	
  spriteFrameByName:@"ninjya_l.png"];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [self.sprite	
  setDisplayFrame:sf];	
  
	
  	
  	
  	
  	
  	
  	
  	
  }else	
  if(self.way	
  ==	
  NINJYA_WAY_RIGHT){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  CCSpriteFrame	
  *sf	
  =	
  [[CCSpriteFrameCache	
  sharedSpriteFrameCache]	
  spriteFrameByName:@"ninjya_r.png"];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [self.sprite	
  setDisplayFrame:sf];	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  self.waitCount	
  +=	
  dt;	
  
	
  	
  	
  	
  	
  	
  	
  	
  if(self.way	
  !=	
  NINJYA_WAY_UP	
  &&	
  self.waitCount	
  >=	
  NINJA_UP_DELAY){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  self.waitCount	
  =	
  0;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  CCSpriteFrame	
  *sf	
  =	
  [[CCSpriteFrameCache	
  sharedSpriteFrameCache]	
  spriteFrameByName:@"ninjya_u.png"];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [self.sprite	
  setDisplayFrame:sf];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  self.way	
  =	
  NINJYA_WAY_UP;	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
TIPS
•  setDisplayFrameでスプライトの画像を変更
   できる	
  
忍者の移動③
•  忍者の移動先を確認して、画面外であれば
   はみださないように修正する	
  
Ninja.m
	
  float	
  xx	
  =	
  self.sprite.position.x	
  +	
  x;	
  
	
  	
  	
  	
  if(xx	
  <	
  30){	
  
	
  	
  	
  	
  	
  	
  	
  	
  xx	
  =	
  30;	
  
	
  	
  	
  	
  }else	
  if(xx	
  >	
  (320	
  -­‐	
  30)){	
  
	
  	
  	
  	
  	
  	
  	
  	
  xx	
  =	
  (320	
  -­‐	
  30);	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  self.sprite.position	
  =	
  ccp(xx,	
  
self.sprite.position.y);
できた!
•  忍者が動いた!
まとめ
•  キャラクターをボタンで移動できるよう
   になった!
•  cocos2d 1.0.の資料だけど、参考に!
 –  http://tonosamart.com/blog/
とのさまラボ!
•  勉強会に参加した人どうしのコミニュティがほしい!
   勉強会の開催日時の告知がほしい!

 という意見をみなさまからいただいたので、
 コミニュティを作成しました!

 ぜひ「いいね!」をお願いします!




https://www.facebook.com/TonosamaLabo	
  
おわり
主催(共同開催):
株式会社 gooya
http://www.gooya.co.jp/
メドレー株式会社
http://www.medley.co.jp/

講師:西田 寛輔 (Tonosamart)
http://www.facebook.com/tonosamart

Weitere ähnliche Inhalte

Was ist angesagt?

2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
Hiroshi Oyamada
 
enchant.jsでゲーム制作をはじめてみよう
enchant.jsでゲーム制作をはじめてみようenchant.jsでゲーム制作をはじめてみよう
enchant.jsでゲーム制作をはじめてみよう
Ryota Shiroguchi
 
OrigenBoard and PandaBoard
OrigenBoard and PandaBoardOrigenBoard and PandaBoard
OrigenBoard and PandaBoard
android sola
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsola
android sola
 
Extending the Unity Editor Extended
Extending the Unity Editor ExtendedExtending the Unity Editor Extended
Extending the Unity Editor Extended
Masamitsu Ishikawa
 

Was ist angesagt? (20)

週末プログラミングで作るカジュアルゲーム~シューティング編~
週末プログラミングで作るカジュアルゲーム~シューティング編~週末プログラミングで作るカジュアルゲーム~シューティング編~
週末プログラミングで作るカジュアルゲーム~シューティング編~
 
Aiwolfseminar2020
Aiwolfseminar2020Aiwolfseminar2020
Aiwolfseminar2020
 
週末プログラミングで作るカジュアルゲーム~レーシング編~
週末プログラミングで作るカジュアルゲーム~レーシング編~週末プログラミングで作るカジュアルゲーム~レーシング編~
週末プログラミングで作るカジュアルゲーム~レーシング編~
 
Cocos2d-xハンズオン#1 in 大阪
Cocos2d-xハンズオン#1 in 大阪Cocos2d-xハンズオン#1 in 大阪
Cocos2d-xハンズオン#1 in 大阪
 
幽霊の棲む家 技術資料
幽霊の棲む家 技術資料幽霊の棲む家 技術資料
幽霊の棲む家 技術資料
 
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
 
AOZORAYOMITE and Intent
AOZORAYOMITE and IntentAOZORAYOMITE and Intent
AOZORAYOMITE and Intent
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
 
Osakijs #01 「enchant.jsハンズオン資料」
Osakijs #01 「enchant.jsハンズオン資料」Osakijs #01 「enchant.jsハンズオン資料」
Osakijs #01 「enchant.jsハンズオン資料」
 
ブロックバスター制作資料
ブロックバスター制作資料ブロックバスター制作資料
ブロックバスター制作資料
 
Unity勉強会ハンズオン
Unity勉強会ハンズオンUnity勉強会ハンズオン
Unity勉強会ハンズオン
 
人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015
 
とことんF#よぷよ! F# + XNA ゲームプログラミング入門
とことんF#よぷよ!  F# + XNA ゲームプログラミング入門とことんF#よぷよ!  F# + XNA ゲームプログラミング入門
とことんF#よぷよ! F# + XNA ゲームプログラミング入門
 
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624
 
enchant.jsでゲーム制作をはじめてみよう
enchant.jsでゲーム制作をはじめてみようenchant.jsでゲーム制作をはじめてみよう
enchant.jsでゲーム制作をはじめてみよう
 
OrigenBoard and PandaBoard
OrigenBoard and PandaBoardOrigenBoard and PandaBoard
OrigenBoard and PandaBoard
 
Flashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3DFlashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3D
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsola
 
ゲーム x リアル - Mont Blanc Pj. & LITTAI -
ゲーム x リアル - Mont Blanc Pj. & LITTAI - ゲーム x リアル - Mont Blanc Pj. & LITTAI -
ゲーム x リアル - Mont Blanc Pj. & LITTAI -
 
Extending the Unity Editor Extended
Extending the Unity Editor ExtendedExtending the Unity Editor Extended
Extending the Unity Editor Extended
 

Ähnlich wie ㉕cocos2dを覚えよう!初級編③

㊱タイルマップに挑戦
㊱タイルマップに挑戦㊱タイルマップに挑戦
㊱タイルマップに挑戦
Nishida Kansuke
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Atsushi Tadokoro
 

Ähnlich wie ㉕cocos2dを覚えよう!初級編③ (15)

㉓cocos2dでゲームを作ろう!その1
㉓cocos2dでゲームを作ろう!その1㉓cocos2dでゲームを作ろう!その1
㉓cocos2dでゲームを作ろう!その1
 
Introduction for cocos2d
Introduction for cocos2dIntroduction for cocos2d
Introduction for cocos2d
 
Cocos2d
Cocos2dCocos2d
Cocos2d
 
enchant.js meetup Tokyo vol.2 Tutorial
enchant.js meetup Tokyo vol.2 Tutorialenchant.js meetup Tokyo vol.2 Tutorial
enchant.js meetup Tokyo vol.2 Tutorial
 
Cocos2dを使ったi phoneゲーム開発手法
Cocos2dを使ったi phoneゲーム開発手法Cocos2dを使ったi phoneゲーム開発手法
Cocos2dを使ったi phoneゲーム開発手法
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
 
㊱タイルマップに挑戦
㊱タイルマップに挑戦㊱タイルマップに挑戦
㊱タイルマップに挑戦
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
 
Hands on
Hands onHands on
Hands on
 
DOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵までDOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵まで
 
enchant.js勉強会
enchant.js勉強会enchant.js勉強会
enchant.js勉強会
 
はじめようRGB-Dセンシングと画像処理
はじめようRGB-Dセンシングと画像処理はじめようRGB-Dセンシングと画像処理
はじめようRGB-Dセンシングと画像処理
 
拙iPhoneアプリ『ういろう』でのboost成分
拙iPhoneアプリ『ういろう』でのboost成分拙iPhoneアプリ『ういろう』でのboost成分
拙iPhoneアプリ『ういろう』でのboost成分
 

Mehr von Nishida Kansuke

デブサミ2017 【16-D-5】複数台のロボットと音楽をする取り組み(太田智美・西田寛輔) -
デブサミ2017 【16-D-5】複数台のロボットと音楽をする取り組み(太田智美・西田寛輔)	-デブサミ2017 【16-D-5】複数台のロボットと音楽をする取り組み(太田智美・西田寛輔)	-
デブサミ2017 【16-D-5】複数台のロボットと音楽をする取り組み(太田智美・西田寛輔) -
Nishida Kansuke
 
㉟cocos2d-x勉強会:簡単なアプリをつくってみよう
㉟cocos2d-x勉強会:簡単なアプリをつくってみよう㉟cocos2d-x勉強会:簡単なアプリをつくってみよう
㉟cocos2d-x勉強会:簡単なアプリをつくってみよう
Nishida Kansuke
 
㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう
Nishida Kansuke
 

Mehr von Nishida Kansuke (20)

【東京】ドコモのAIエージェント基盤「セバスチャン」勉強会【#3】
【東京】ドコモのAIエージェント基盤「セバスチャン」勉強会【#3】【東京】ドコモのAIエージェント基盤「セバスチャン」勉強会【#3】
【東京】ドコモのAIエージェント基盤「セバスチャン」勉強会【#3】
 
【東京】ドコモのAIエージェント基盤「セバスチャン」勉強会【#1】資料
【東京】ドコモのAIエージェント基盤「セバスチャン」勉強会【#1】資料【東京】ドコモのAIエージェント基盤「セバスチャン」勉強会【#1】資料
【東京】ドコモのAIエージェント基盤「セバスチャン」勉強会【#1】資料
 
デブサミ2017 【16-D-5】複数台のロボットと音楽をする取り組み(太田智美・西田寛輔) -
デブサミ2017 【16-D-5】複数台のロボットと音楽をする取り組み(太田智美・西田寛輔)	-デブサミ2017 【16-D-5】複数台のロボットと音楽をする取り組み(太田智美・西田寛輔)	-
デブサミ2017 【16-D-5】複数台のロボットと音楽をする取り組み(太田智美・西田寛輔) -
 
20170131 新潟セミナー
20170131 新潟セミナー20170131 新潟セミナー
20170131 新潟セミナー
 
PHP×コミニュケーションロボット
PHP×コミニュケーションロボットPHP×コミニュケーションロボット
PHP×コミニュケーションロボット
 
Mizuho.hack 未来の銀行に必要なサービス
Mizuho.hack 未来の銀行に必要なサービスMizuho.hack 未来の銀行に必要なサービス
Mizuho.hack 未来の銀行に必要なサービス
 
20160314 すしルート#3 資料
20160314 すしルート#3 資料20160314 すしルート#3 資料
20160314 すしルート#3 資料
 
ロボ年表を作ってみた
ロボ年表を作ってみたロボ年表を作ってみた
ロボ年表を作ってみた
 
Pepper用課金ボックス「ロボコイン」
Pepper用課金ボックス「ロボコイン」Pepper用課金ボックス「ロボコイン」
Pepper用課金ボックス「ロボコイン」
 
jsおじさん#5 ペッパーとjavascript
jsおじさん#5 ペッパーとjavascriptjsおじさん#5 ペッパーとjavascript
jsおじさん#5 ペッパーとjavascript
 
【3/13】【女性限定】ロボットで、何が出来る?ペッパーにふれてみよう&ミニアイデアソン【とのさまラボ】 powered by 朝日新聞メディアラボ
【3/13】【女性限定】ロボットで、何が出来る?ペッパーにふれてみよう&ミニアイデアソン【とのさまラボ】 powered by 朝日新聞メディアラボ【3/13】【女性限定】ロボットで、何が出来る?ペッパーにふれてみよう&ミニアイデアソン【とのさまラボ】 powered by 朝日新聞メディアラボ
【3/13】【女性限定】ロボットで、何が出来る?ペッパーにふれてみよう&ミニアイデアソン【とのさまラボ】 powered by 朝日新聞メディアラボ
 
忍者ゲーム【ペッパーアプリコンテスト2015決勝進出作品】
忍者ゲーム【ペッパーアプリコンテスト2015決勝進出作品】忍者ゲーム【ペッパーアプリコンテスト2015決勝進出作品】
忍者ゲーム【ペッパーアプリコンテスト2015決勝進出作品】
 
ペッパービンゴ【ペッパーアプリコンテスト2015決勝進出作品】
ペッパービンゴ【ペッパーアプリコンテスト2015決勝進出作品】ペッパービンゴ【ペッパーアプリコンテスト2015決勝進出作品】
ペッパービンゴ【ペッパーアプリコンテスト2015決勝進出作品】
 
JSを使ったアプリ開発!(JSオジサン#3)
JSを使ったアプリ開発!(JSオジサン#3)JSを使ったアプリ開発!(JSオジサン#3)
JSを使ったアプリ開発!(JSオジサン#3)
 
ハッカソン発表資料(朝日新聞 × モバイルファクトリー 異業種ハッカソン!)
ハッカソン発表資料(朝日新聞 × モバイルファクトリー 異業種ハッカソン!)ハッカソン発表資料(朝日新聞 × モバイルファクトリー 異業種ハッカソン!)
ハッカソン発表資料(朝日新聞 × モバイルファクトリー 異業種ハッカソン!)
 
iBeaconを使ったアプリ開発
iBeaconを使ったアプリ開発iBeaconを使ったアプリ開発
iBeaconを使ったアプリ開発
 
クリスマスハッカソン2013:サンタロスをUNITYで作った
クリスマスハッカソン2013:サンタロスをUNITYで作ったクリスマスハッカソン2013:サンタロスをUNITYで作った
クリスマスハッカソン2013:サンタロスをUNITYで作った
 
㉟cocos2d-x勉強会:簡単なアプリをつくってみよう
㉟cocos2d-x勉強会:簡単なアプリをつくってみよう㉟cocos2d-x勉強会:簡単なアプリをつくってみよう
㉟cocos2d-x勉強会:簡単なアプリをつくってみよう
 
㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう
 
㉝“知育アプリを作ろう! Kwikで作るデジタル絵本” 勉強会②
㉝“知育アプリを作ろう! Kwikで作るデジタル絵本” 勉強会②㉝“知育アプリを作ろう! Kwikで作るデジタル絵本” 勉強会②
㉝“知育アプリを作ろう! Kwikで作るデジタル絵本” 勉強会②
 

Kürzlich hochgeladen

Kürzlich hochgeladen (11)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

㉕cocos2dを覚えよう!初級編③