「RPGのようなマップを作りたい時」の編集履歴(バックアップ)一覧はこちら

RPGのようなマップを作りたい時」(2011/09/19 (月) 13:40:53) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*タイル用の画像を描く ここではフリーで使えるGimp(http://www.gimp.org/downloads/)を用いるが何でも良い。    *タイルを一枚のシートにまとめる。 ここではTexturePacker(http://www.texturepacker.com/ )を用いるが何でも良い。   *マップを作成する。 マップエディタとしてTiled Map Editorをインストールする http://www.mapeditor.org/   注 作ったデータはbase64,gzip等で保存する事。   **作ったファイルはXCodeに放り込む データを作る際に用いた画像データ(さきほど作った一枚にまとめたシート)も放り込む。   *マップを読み込む CCTMXTiledMap *tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"map.tmx"]; で読み込める。   注 読み込まれないときは、tmxファイルの中の画像の場所の指定(<image source="simpleSheet.png" width="32" height="64"/> )が間違っている可能性がある。   *画面に表示させる [self addChild:tileMap z:-1 tag:1]; すれば良い。   **マップの左下が表示されている? それは、Mapの位置が原点(0,0)になっているからである。Mapの位置を知りたい場合、今はtagを1で登録しているので CCTMXTiledMap *tileMap = (CCTMXTiledMap*)[self getChildByTag:1]; で取り出して tileMap.position を見てやれば良い。これでMapの位置を設定してやることもできる。 注意点 Mapの位置を指定することで、例えば(30,0)とすると、Mapが右へ30ずれることがわかる。 ***なぜ、左上でなく左下なのか? cocos2dの座標原点は左下を(0,0)とするからである。     *タップしてスクロール **まず画面のタッチを検知する 今のレイヤーに - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"poi");//処理 } と書く。注意 レイヤーのisTouchEnabledをYESにしておかないと反応しない。 **タッチした座標を取得する。 touchbeganの中身に以下を書く。 UITouch *touch = [touches anyObject]; CGPoint point = [touch locationInView:[touch view]]; NSLog(@"touch %f,%f",point.x,point.y);    実際、タッチした座標を調べてみると、タッチで得られる座標は原点が左上を(0,0)としていることがわかる。 よって、このタッチ位置を左下を原点にするように変更するには CGSize screensize = [[CCDirector sharedDirector] winSize]; CGPoint touchPoint = CGPointMake(point.x, screensize.height - point.y); とすれば良い。 **タッチした点はマップ上の座標とするとどこになるのか マップ自身の位置(例(-10,0) 表示されたマップは右に10ずれている)とタッチした位置(例(0,0)画面の左下をタッチしたとする)から タッチした画面の位置におけるマップ上の位置は CGPoint abPoint; abPoint.x = -tileMap.position.x + touchPoint.x; abPoint.y = -tileMap.position.y + touchPoint.y; で求まる。 よってタイルで換算すると int x = (int)(abPoint.x/tileMap.tileSize.width); int y = (int)(abPoint.y/tileMap.tileSize.height); がタッチしたタイルの(タイルの数を単位とした)位置となる。 **タッチしたタイルを画面中央に持って行きたいとき CGSize screenSize = [[CCDirector sharedDirector] winSize]; CGPoint newTilemapPoint; newTilemapPoint.x = -1*(abPoint.x - screenSize.width/2 ); newTilemapPoint.y = -1*(abPoint.y - screenSize.height/2 ); [tileMap setPosition:newTilemapPoint]; とすれば良い。 *付録 **マップの画像はどこで読み込まれている? -(id) initWithTilesetInfo:(CCTMXTilesetInfo*)tilesetInfo layerInfo:(CCTMXLayerInfo*)layerInfo mapInfo:(CCTMXMapInfo*)mapInfo ---- #amazon2(600x520)
*タイル用の画像を描く ここではフリーで使えるGimp(http://www.gimp.org/downloads/)を用いるが何でも良い。    *タイルを一枚のシートにまとめる。 ここではTexturePacker(http://www.texturepacker.com/ )を用いるが何でも良い。   *マップを作成する。 マップエディタとしてTiled Map Editorをインストールする http://www.mapeditor.org/   注 作ったデータはbase64,gzip等で保存する事。   **作ったファイルはXCodeに放り込む データを作る際に用いた画像データ(さきほど作った一枚にまとめたシート)も放り込む。   *マップを読み込む CCTMXTiledMap *tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"map.tmx"]; で読み込める。   注 読み込まれないときは、tmxファイルの中の画像の場所の指定(<image source="simpleSheet.png" width="32" height="64"/> )が間違っている可能性がある。   *画面に表示させる [self addChild:tileMap z:-1 tag:1]; すれば良い。   **マップの左下が表示されている? それは、Mapの位置が原点(0,0)になっているからである。Mapの位置を知りたい場合、今はtagを1で登録しているので CCTMXTiledMap *tileMap = (CCTMXTiledMap*)[self getChildByTag:1]; で取り出して tileMap.position を見てやれば良い。これでMapの位置を設定してやることもできる。 注意点 Mapの位置を指定することで、例えば(30,0)とすると、Mapが右へ30ずれることがわかる。 ***なぜ、左上でなく左下なのか? cocos2dの座標原点は左下を(0,0)とするからである。     *タップしてスクロール **まず画面のタッチを検知する 今のレイヤーに - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"poi");//処理 } と書く。注意 レイヤーのisTouchEnabledをYESにしておかないと反応しない。 **タッチした座標を取得する。 touchbeganの中身に以下を書く。 UITouch *touch = [touches anyObject]; CGPoint point = [touch locationInView:[touch view]]; NSLog(@"touch %f,%f",point.x,point.y);    実際、タッチした座標を調べてみると、タッチで得られる座標は原点が左上を(0,0)としていることがわかる。 よって、このタッチ位置を左下を原点にするように変更するには CGSize screensize = [[CCDirector sharedDirector] winSize]; CGPoint touchPoint = CGPointMake(point.x, screensize.height - point.y); とすれば良い。 **タッチした点はマップ上の座標とするとどこになるのか マップ自身の位置(例(-10,0) 表示されたマップは右に10ずれている)とタッチした位置(例(0,0)画面の左下をタッチしたとする)から タッチした画面の位置におけるマップ上の位置は CGPoint abPoint; abPoint.x = -tileMap.position.x + touchPoint.x; abPoint.y = -tileMap.position.y + touchPoint.y;   で求まる。   よってタイルで換算すると int x = (int)(abPoint.x/tileMap.tileSize.width); int y = (int)(abPoint.y/tileMap.tileSize.height); がタッチしたタイルの(タイルの数を単位とした)位置となる。   **タッチしたタイルを画面中央に持って行きたいとき CGSize screenSize = [[CCDirector sharedDirector] winSize]; CGPoint newTilemapPoint; newTilemapPoint.x = -1*(abPoint.x - screenSize.width/2 ); newTilemapPoint.y = -1*(abPoint.y - screenSize.height/2 ); [tileMap setPosition:newTilemapPoint]; とすれば良い。   **スクロールさせたい場合 setPositionをActionにかえる。 CCAction* move = [CCMoveTo actionWithDuration:0.2f position:newTilemapPoint]; [tileMap stopAllActions]; [tileMap runAction:move]; *付録 **マップの画像はどこで読み込まれている? -(id) initWithTilesetInfo:(CCTMXTilesetInfo*)tilesetInfo layerInfo:(CCTMXLayerInfo*)layerInfo mapInfo:(CCTMXMapInfo*)mapInfo ---- #amazon2(600x520)

表示オプション

横に並べて表示:
変化行の前後のみ表示: