`
mmdev
  • 浏览: 13300683 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

cocos2d-iphone之魔塔20层第四部分

 
阅读更多

这部分教程源代码连接

接下来我们就要添加勇士的移动检测了,再添加移动检测之前我们要把我们自己制作的地图进行解析

首先我们基于cocos2d建一个类,类名为:TitledMap 这个类继承CCTMXTiledMap,建成如下:


下面我们开始添加TitledMap.h中的代码

之前我说过我们的地图由多个图层组成,所以在这个类中我们每一个图层都相应的设置一个属性

还有上一章说过的地图上还有两个勇士的问题,其实它们代表两个坐标点分别是上楼和下楼的位置

所以我们再添加两个属性,代码如下:

@property (nonatomic,retain) CCTMXLayer *wall;
@property (nonatomic,retain) CCTMXLayer *road;
@property (nonatomic,retain) CCTMXLayer *enemy;
@property (nonatomic,retain) CCTMXLayer *item;
@property (nonatomic,retain) CCTMXLayer *upfloor;
@property (nonatomic,retain) CCTMXLayer *downfloor;
@property (nonatomic,retain) CCTMXLayer *door;
@property (nonatomic,retain) CCTMXLayer *other;
@property (nonatomic,retain) CCTMXLayer *npc;
@property (nonatomic,retain) CCTMXLayer *heroPoint;
@property (nonatomic,assign) CGPoint up;
@property (nonatomic,assign) CGPoint down;

接着我们再添加一个类方法+(TitledMap*)initWithAnalytic:(int)tileMapName;

这个类方法主要是为了实现在其他文件中加载地图,同时这个类方法调用初始化方法

+(TitledMap*)initWithAnalytic:(int)tileMapName
{
    return [[[self alloc] initWithAnalytic:tileMapName] autorelease];
}
-(id)initWithAnalytic:(int)tileMapName
{
    NSString *string = [NSString stringWithFormat:@"%d.tmx",tileMapName];
    self = [super initWithTMXFile:string];
    if (self) 
    {
        self.road = [self layerNamed:@"road"];
        self.upfloor = [self layerNamed:@"upfloor"];
        self.downfloor = [self layerNamed:@"downfloor"];
        self.item = [self layerNamed:@"item"];
        self.enemy = [self layerNamed:@"enemy"];
        self.door = [self layerNamed:@"door"];
        self.npc = [self layerNamed:@"npc"];
        self.other = [self layerNamed:@"other"];
        self.heroPoint = [self layerNamed:@"heroPoint"];
    }
    return self;
}

接下来我们要把地图上的那“两个勇士”去掉

-(void)titledMapAnalytic
{
    for (int x = 0; x <= 10; x++) 
    {
        for (int y = 0; y <= 10; y++) 
        {
            CGPoint towerLoc = CGPointMake(x, y);
            int heroPoint_tileGid = [self.heroPoint tileGIDAt:towerLoc];
            if (heroPoint_tileGid) 
            {
                NSDictionary *props = [self propertiesForGID:heroPoint_tileGid];
                NSString *value = [props valueForKey:@"point"];
                int type = [value intValue];
                if (type == 1)
                {
                    self.up = towerLoc;
                }
                else
                    self.down = towerLoc;
                [self.heroPoint removeTileAt:towerLoc];
            }
        }
    }
    return;
}

到这里我们的地图解析只是进行了一部分,我们还要再添加一个简单而重要的类,它就是

游戏数据类GameModel

下面我们开始添加这个类里面的代码,代码不多我就不过多解释了,大家看不明白的可以提问

GameModel.h文件代码

//地图集合1
@property (nonatomic,retain) NSMutableArray *titleMapArray1;
//地图集合2
@property (nonatomic,retain) NSMutableArray *titleMapArray2;
//地图集合3
@property (nonatomic,retain) NSMutableArray *titleMapArray3;

+(GameModel*)getGameModel;
//加载地图
-(void)initWithMap;

GameModel.m文件代码

#import "GameModel.h"
#import "TitledMap.h"

@implementation GameModel
@synthesize titleMapArray1,titleMapArray2,titleMapArray3;
static GameModel *_gameModel = nil;
+(GameModel*)getGameModel
{
    if (!_gameModel) 
    {
        _gameModel = [[self alloc] init];
    }
    return _gameModel;
}
//加载地图
-(void)initWithMap
{
}
-(id)init
{
    if ((self = [super init])) 
    {
        self.titleMapArray1 = [[[NSMutableArray alloc] init] autorelease];
        self.titleMapArray2 = [[[NSMutableArray alloc] init] autorelease];
        self.titleMapArray3 = [[[NSMutableArray alloc] init] autorelease];
    }
    return self;
}
@end



下面我们就要在加载地图这个方法中添加如下代码

for (int i = 0; i < 22; i++) 
    {
        TitledMap *titledMap = [TitledMap initWithAnalytic:i];
        [self.titleMapArray1 addObject:titledMap];
    }

这些代码添加完我们的GameModel类就基本完成了。下面我们就要把刚才添加的两个类用在Game01中了

//加载游戏地图

curTiledMap= [CCTMXTiledMaptiledMapWithTMXFile:@"1.tmx"];

curTiledMap.scale=_scale;

curTiledMap.position=ccp(LEFTMIN,DOWNMIN);

[selfaddChild:curTiledMap];

修改成

//初始化数据
        self.model = [GameModel getGameModel];
        [model initWithMap];
        seltitleMapArray = self.model.titleMapArray1;
        //加载地图
        self.curtitleMap = [self.model.titleMapArray1 objectAtIndex:1];
        self.curtitleMap.scale = _scale;
        self.curtitleMap.position = ccp(LEFTMIN, DOWNMIN);
        [self addChild:self.curtitleMap];

修改过之后我们就要开始添加碰撞检测了

//检测是否有障碍物
-(void)canMoveTo:(CGPoint) pos
{
    towerLoc = [self tileCoordForPosition: pos];
    int road_tileGid = [self.curtitleMap.road tileGIDAt:towerLoc];
    int enemy_tileGid = [self.curtitleMap.enemy tileGIDAt:towerLoc];
    int item_tileGid = [self.curtitleMap.item tileGIDAt:towerLoc];
    int door_tileGid = [self.curtitleMap.door tileGIDAt:towerLoc];
    int npc_tileGid = [self.curtitleMap.npc tileGIDAt:towerLoc];
    int downfloor_tileGid = [self.curtitleMap.downfloor tileGIDAt:towerLoc];
    int upfloor_tileGid = [self.curtitleMap.upfloor tileGIDAt:towerLoc];
    int other_tileGid = [self.curtitleMap.other tileGIDAt:towerLoc];
    
    if (enemy_tileGid) 
    {
        canmove = NO;
    }
    if (item_tileGid) 
    {
        [self.curtitleMap.item removeTileAt:towerLoc];
    }
    if (door_tileGid) 
    {
        //canmove = NO;
        [self.curtitleMap.door removeTileAt:towerLoc];
    }
    if (other_tileGid) 
    {
        canmove = NO;
    }
    if (upfloor_tileGid) 
    {
        canmove = NO;
    }
    if (downfloor_tileGid) 
    {
        canmove = NO;
    }
    if (npc_tileGid) 
    {
        canmove = NO;
    }
    if (road_tileGid) 
    {
        if (canmove) 
        {
            [self setPlayerPosition:pos];
        }
    }
}

towerLoc = [self tileCoordForPosition:pos] 是把当前移动坐标转换成地图坐标

int road_tileGid = [self.curtitleMap.road tileGIDAt:towerLoc] 获取当前坐标

在相应的图层中是否有图块存在。

方法有了,我们就得调用它,把updateMove方法中的if循环中的内容换成

//判断是否有物品或怪物
[self canMoveTo:playerPoint];

然后运行你会发现勇士不能穿过墙和怪物了,但是还不能和怪物打斗,接下来我们就要在if循环里添加

相应的响应事件了

上一篇连接 下一篇连接


分享到:
评论

相关推荐

    cocos2d-iphone之魔塔20层第五部分

    《cocos2d-iphone之魔塔20层第五部分》是关于使用cocos2d-iphone框架开发经典游戏——魔塔的一个教程章节。在这个部分,我们将深入探讨如何利用cocos2d-iphone的特性来实现魔塔游戏的第20层的逻辑和交互。 首先,...

    cocos2d-iphone之魔塔20层第二部分

    《cocos2d-iphone之魔塔20层第二部分》是针对移动平台游戏开发的一份教程,主要基于cocos2d-iphone框架,聚焦于创建一个20层的魔塔游戏。cocos2d-iphone是Cocos2D游戏引擎的iOS版本,它为开发者提供了丰富的图形、...

    cocos2d-iphone之魔塔20层第三部分

    《cocos2d-iphone之魔塔20层第三部分》是针对移动平台,特别是iPhone设备上使用cocos2d游戏引擎开发的一款经典游戏——魔塔的教程。在这个教程中,我们将深入探讨如何利用cocos2d-iphone框架构建一个具有20层关卡的...

    cocos2d-iphone之魔塔20层第九部分

    《cocos2d-iphone之魔塔20层第九部分》是针对iOS平台的游戏开发教程,专注于使用cocos2d-iPhone框架制作的一款经典游戏——魔塔的开发过程。cocos2d-iPhone是一个强大的2D游戏开发框架,它基于C++和Objective-C,为...

    cocos2d-iphone之魔塔20层第十部分

    《cocos2d-iphone之魔塔20层第十部分》是针对移动平台游戏开发的一份教程,主要讲解如何利用cocos2d-iphone框架来实现一款经典的魔塔游戏。cocos2d-iphone是一个强大的2D游戏开发框架,它基于Objective-C语言,为iOS...

    cocos2d-iphone之魔塔20层第八部分

    总之,cocos2d-iphone之魔塔20层第八部分的教程将涵盖游戏开发的多个方面,包括但不限于对象和场景的管理、用户交互、性能优化、数据持久化以及调试技术。通过深入学习和实践,开发者可以掌握创建类似“魔塔20层”...

    cocos2d-iphone之魔塔20层第七部分

    在本教程中,我们将深入探讨如何使用Cocos2d-iPhone框架开发一款名为“魔塔20层”的游戏。Cocos2d-iPhone是一个广泛应用于iOS平台的2D游戏开发库,它提供了一系列强大的功能,如图形渲染、动画处理、物理引擎支持...

    cocos2d-iphone2.0之魔塔20层

    《cocos2d-iphone2.0之魔塔20层》是一款基于Cocos2D-iPhone 2.0框架开发的20层魔塔游戏。Cocos2D-iPhone是一个开源的游戏开发库,它是Cocos2D项目的一个分支,专为iOS平台设计,提供了丰富的2D图形渲染和游戏开发...

    cocos2d-iphone 游戏码源 魔塔20层

    《cocos2d-iphone 游戏码源 魔塔20层》是一个基于Cocos2D-iPhone的游戏开发项目,旨在实现一款名为“魔塔20层”的经典策略角色扮演游戏。Cocos2D-iPhone是Cocos2D的一个分支,是一个用于创建2D游戏、演示和其他图形...

    cocos2d-x xcode 魔塔 mota

    【cocos2d-x】是基于C++的开源游戏开发框架,它被广泛用于创建2D游戏、动画以及其他视觉互动内容。cocos2d-x支持多平台开发,包括iOS、Android、Windows等,使得开发者可以编写一次代码,到处运行。 【xcode】是...

    cocos2d-x魔塔源码Xcode版

    4. iOS应用开发:虽然cocos2d-x跨平台,但本项目是针对iOS的,所以需要了解iOS开发的一些基本概念,如目标-C、Auto Layout、Storyboard等。 5. 游戏逻辑和算法:分析游戏的战斗系统、升级机制、物品系统等,理解其...

    cocos2d-x手游开发

    Cocos2d-x是一个基于C++的2D游戏引擎,它源于cocos2d-iphone,并扩展到支持Android、iOS、Windows等多个平台。它提供了一套完整的2D图形渲染、动画、物理引擎、音频处理、资源管理等功能,使得开发者能够快速构建高...

Global site tag (gtag.js) - Google Analytics