《How To Make a Tile-Based Game with Cocos2D》
2013-02-14 14:20
218 查看
Tiled Map Editor
File->New
Orientation(Orthogonal)->Map size(50*50)->Tile size(32*32)
Map->New Tileset...
Tileset->Image(.png)->Tiles->32*32->Margin(1)->Spacing(1)
Object layers允许你在地图上可能发生事件的区域绘制矩形。举个例子来说,你可能需要一个怪物出生点,或者一个进入就会挂掉的区域。这里我们给player创建一个区域,作为其出生点。
Layer->Add Object Layer...
右键添加的这个灰色的矩形->properties->Name(SpawnPoint)
为移动地图而视点中心
使用ccTouchBegan/ccTouchEnded的特点是:
1. “你不再需要处理NSSets对象了,每次被调用时,dispatcher(分发器)会帮你选择你需要的那个UITouch对象。”
2. “你可以在ccTouchBegan中返回YES来认领一个UITouch,只有这样,属于该代理的触摸事件才能继续下去,你可以明确的知道这个触摸事件是属于你的。这种机制可以让你从繁琐的多点触摸逻辑中解放出来,也可以理解为一种为单点触摸设计的便捷方式。”
使用meta层和layer属性实现阻挡和拾取。
Layer->Add Tile Layer...->Map->New Tileset...
人为地给红色tile定义为具有“阻挡”属性,在要有阻挡的位置绘制这些tile。
右键红色tile->Tile Properties...->Name(Collidable)->Value(True)
Layer->Add Tile Layer...,添加可以拾取的物品。
修改meta层,在每个想设置为可拾取的区域绘制绿色tile。
右键绿色tile->Tile Properties...->Name(Collectable)->Value(True)
计算玩家相对于敌人的方向,旋转敌人以对准玩家。
File->New
Orientation(Orthogonal)->Map size(50*50)->Tile size(32*32)
Map->New Tileset...
Tileset->Image(.png)->Tiles->32*32->Margin(1)->Spacing(1)
CCTMXTiledMap *tileMap; CCTMXLayer *background; tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"TileMap.tmx"]; //加载地图 background = [tileMap layerNamed:@"Background"]; //背景层 [self addChild:tileMap z:-1];
Object layers允许你在地图上可能发生事件的区域绘制矩形。举个例子来说,你可能需要一个怪物出生点,或者一个进入就会挂掉的区域。这里我们给player创建一个区域,作为其出生点。
Layer->Add Object Layer...
右键添加的这个灰色的矩形->properties->Name(SpawnPoint)
CCSprite *player; CCTMXObjectGroup *objects = [tileMap objectGroupNamed:@"Objects"]; //对象层 NSAssert(objects != nil, @"'Objects' object group not found"); NSMutableDictionary *spawnPoint = [objects objectNamed:@"SpawnPoint"]; //出生点 NSAssert(spawnPoint != nil, @"SpawnPoint object not found"); int x = [[spawnPoint valueForKey:@"x"] intValue]; int y = [[spawnPoint valueForKey:@"y"] intValue]; player = [CCSprite spriteWithFile:@"Player.png"]; player.position = ccp(x, y); [self addChild:player];
为移动地图而视点中心
-(void)setViewpointCenter:(CGPoint) position { CGSize winSize = [[CCDirector sharedDirector] winSize]; int x = MAX(position.x, winSize.width / 2); int y = MAX(position.y, winSize.height / 2); x = MIN(x, (_tileMap.mapSize.width * _tileMap.tileSize.width) - winSize.width / 2); y = MIN(y, (_tileMap.mapSize.height * _tileMap.tileSize.height) - winSize.height/2); CGPoint actualPosition = ccp(x, y); CGPoint centerOfView = ccp(winSize.width/2, winSize.height/2); CGPoint viewPoint = ccpSub(centerOfView, actualPosition); self.position = viewPoint; }
使用ccTouchBegan/ccTouchEnded的特点是:
1. “你不再需要处理NSSets对象了,每次被调用时,dispatcher(分发器)会帮你选择你需要的那个UITouch对象。”
2. “你可以在ccTouchBegan中返回YES来认领一个UITouch,只有这样,属于该代理的触摸事件才能继续下去,你可以明确的知道这个触摸事件是属于你的。这种机制可以让你从繁琐的多点触摸逻辑中解放出来,也可以理解为一种为单点触摸设计的便捷方式。”
self.isTouchEnabled = YES; -(void) registerWithTouchDispatcher //重写registerWithTouchDispatcher方法来注册触摸事件。原来的ccTouchesBegan/ccTouchesEnded(多点触摸)被替换,取而代之的是ccTouchBegan/ccTouchEnded(单点触摸) { [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; } -(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { return YES; } -(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchLocation = [touch locationInView: [touch view]]; touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation]; touchLocation = [self convertToNodeSpace:touchLocation]; ... }
使用meta层和layer属性实现阻挡和拾取。
Layer->Add Tile Layer...->Map->New Tileset...
人为地给红色tile定义为具有“阻挡”属性,在要有阻挡的位置绘制这些tile。
右键红色tile->Tile Properties...->Name(Collidable)->Value(True)
CCTMXLayer *meta; meta = [tileMap layerNamed:@"Meta"]; meta.visible = NO; //只起阻挡作用,不可见 CGPoint tileCoord = [self tileCoordForPosition:position]; int tileGid = [meta tileGIDAt:tileCoord]; //GID,相当于每块tile的标识 CGPoint tileCoord = [self tileCoordForPosition:position]; int tileGid = [meta tileGIDAt:tileCoord]; if (tileGid) { NSDictionary *properties = [tileMap propertiesForGID:tileGid]; if (properties) { NSString *collision = [properties valueForKey:@"Collidable"]; if (collision && [collision compare:@"True"] == NSOrderedSame) { return; //精灵不能到达该位置 } } }
Layer->Add Tile Layer...,添加可以拾取的物品。
修改meta层,在每个想设置为可拾取的区域绘制绿色tile。
右键绿色tile->Tile Properties...->Name(Collectable)->Value(True)
CCTMXLayer *foreground; foreground = [tileMap layerNamed:@"Foreground"]; NSString *collectable = [properties valueForKey:@"Collectable"]; if (collectable && [collectable compare:@"True"] == NSOrderedSame) { [meta removeTileAt:tileCoord]; //物品被拾取 [foreground removeTileAt:tileCoord]; }
计算玩家相对于敌人的方向,旋转敌人以对准玩家。
CGPoint diff = ccpSub(player.position,enemy.position); float angleRadians = atanf((float)diff.y / (float)diff.x); float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians); float cocosAngle = -1 * angleDegrees; if (diff.x < 0) { cocosAngle += 180; } enemy.rotation = cocosAngle;
相关文章推荐
- iphone游戏开发-Collisions and Collectables: How To Make a Tile Based Game with Cocos2D Part 2
- How To Make a Tile Based Game with Cocos2D
- Collisions and Collectables: How To Make a Tile Based Game with Cocos2D Part 2
- Data for the People: How to Make Our Post-Privacy Economy Work for You
- [未完待续]对安装CCMake的一点理解(how to install the latest version of ccmake)
- How to make a good presentation
- An example to show how to make Tree structure data table in SQL server
- How to make more objects as same size in Visio 2010
- 设置navigation完全透明效果(How to make navigation bar transparent in iOS 7)
- How to make ROS and Opencv work together
- IE inline edit how to make hidden element actually hide
- [技术娱乐]How to make love
- How to make a callback to C# from C/C++ code
- raywenderlich-Rotating Turrets: How To Make A Simple iPhone Game with Cocos2D Part 2
- How to make the page expire?
- how to make a driver pagable
- How to make a java class immutable
- How to make a level and XP system with unity 5
- [GUIDE] How to make a nandroid backup directly to your computer without using sdcard
- how to make [up arrow] recall command history