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

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

 
阅读更多

下午我将第十部分教程发布到首页,希望大家多多支持

这部分教程源代码连接

我们的游戏大部分功能已经实现了接下来我们就要来完善npc有关内容了,

昨天有个朋友说序章中遇到仙子是有一个剧情的,这个确实有而且游戏中

还有很多npc的剧情,今天我们就开始添加这部分内容吧!

首先我们要添加一个用于创建npc剧情的类:TalkTonpc,要知道游戏中有很

多与npc交谈的剧情,我们如何用这个类来添加所有的剧情呢,下面我们就来

说一下这些剧情的共性与区别在哪里:

第一、他们都是由勇士和npc组成,所以我们把这个场景分为两部分一个是

勇士部分,一个是npc部分。

第二、勇士部分和npc部分都是由一个个谈话窗体组成,所以我们需要再建

一个谈话窗体类TalkCell。

第三、谈话窗体部分,只有文本内容不一样其它的都是相同的,所以这里我

们还需要在建一个用于控制文本内容的类:TalkCell。

讲到这里我们的剧情就只差一个文本内容了,那么我们就需要建一个数据类

(NpcTalkText)来存储这些谈话文本了,由于这个类内容太多这里我就不粘贴

代码了,在我们把另外三个类讲解完之后在讲一下这个类。

下面我们就要开始添加代码部分了:

TalkTonpc.h代码:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "TalkCell.h"
#import "NpcTalkText.h"

@interface TalkTonpc : CCLayer 
{
    //谈话对象npc名称
    NSString *npcName;
    //勇士
    NSString *hero;
    TalkCell *seltalkCell;   
    //npc谈话内容
    NpcTalkText *npcTalkText;
    //跳过菜单
    CCMenuItemFont *Skip;
    //当前选中npc对话内容
    NSMutableArray *selnpcTalkText;
    //文本编号
    NSInteger textID;
    //当前npc类型
    int selnpcType;
}
@property (nonatomic,assign) bool talking; 
-(void)updateWith:(int) type;
-(void)removeTalking;
@end

TalkTonpc.m代码:

#import "TalkTonpc.h"

@implementation TalkTonpc
@synthesize talking;
-(id)init
{
    if ((self = [super init])) 
    {  
        npcTalkText = [NpcTalkText getNpcTalkText];
        //跳过对话
        Skip = [CCMenuItemFont itemFromString:@"--Skip--" target:self selector:@selector(removetext)];
        Skip.fontSize = 30;
        CCMenu *menu = [CCMenu menuWithItems:Skip, nil];
        menu.position = ccp(455, 100);
        [self addChild:menu];
    }
    return self;
}
-(void)addTalking
{
    TalkCellText *cellText = [selnpcTalkText objectAtIndex:textID];
    seltalkCell = [[TalkCell alloc] initWith:cellText];
    if (cellText.name == @"勇士") 
    {
        seltalkCell.position = ccp(200, 240);
    }
    else
        seltalkCell.position = ccp(100, 420);
    [self addChild:seltalkCell];
}
-(void)updateWith:(int) type
{
    self.talking = NO;
    textID = 0;
    selnpcType = type;
    switch (type) 
    {
        case 0:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc0;
            break;
        case 1:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc1;
            break;
        case 2:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc2;
            break;
        case 3:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc3;
            break;
        case 4: 
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc4;
            break;
        case 6:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc6;
            break;
        case 7:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc7;
            break;
        case 8:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc8;
            break;
        case 9:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc9;
            break;
        case 10:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc10;
            break;
        case 11:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc11;
            break;
        case 12:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc12;
            break;
        case 13:
            selnpcTalkText = nil;
            selnpcTalkText = npcTalkText.npc13;
            break;
        default:
            break;
    }
    [self addTalking];
}
-(void)removeTalking
{
    if (textID >= (selnpcTalkText.count - 1)) 
    {
        self.talking = YES;
    }
    if (self.talking) 
    {
        [self removeChild:seltalkCell cleanup:YES];
        [self.parent talkTonpc:selnpcType];
        [self.parent removeChild:self cleanup:YES];
    }
    else
    {
        [self removeChild:seltalkCell cleanup:YES];
        textID += 1;
        [self addTalking];
    }
}
-(void)removetext
{
    [self removeChild:seltalkCell cleanup:YES];
    [self.parent talkTonpc:selnpcType];
    [self.parent removeChild:self cleanup:YES];
}
@end

TalkCell.h代码:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "TalkCellText.h"

@interface TalkCell : CCLayer 
{
    //谈话窗体背景
    CCTMXTiledMap *background;
    CCLabelTTF *name;
    CCLabelTTF *celltext1;
    CCLabelTTF *celltext2;
    CCMenuItemFont *enter;
}
-(id)initWith:(TalkCellText*) text;
@end

TalkCell.m代码

#import "TalkCell.h"
@implementation TalkCell
-(id)initWith:(TalkCellText*) text
{
    if ((self = [super init]))
    {
        //背景
        background = [CCTMXTiledMap tiledMapWithTMXFile:@"fightbg.tmx"];
        background.position = ccp(0, 0);
        background.scaleX = 1.6;
        [self addChild:background];
        //名称
        name = [CCLabelTTF labelWithString:[NSString stringWithFormat:@"%@:",text.name] fontName:@"Verdana-Bold" fontSize:35];
        name.anchorPoint = ccp(0, 0);
        name.position = ccp(10, 110);
        [self addChild:name];
        //谈话内容
        celltext1 = [CCLabelTTF labelWithString:[NSString stringWithFormat:@"%@",text.labelText1] fontName:@"Verdana-Bold" fontSize:24];
        celltext2 = [CCLabelTTF labelWithString:[NSString stringWithFormat:@"%@",text.labelText2] fontName:@"Verdana-Bold" fontSize:24];
        celltext1.anchorPoint = ccp(0, 0);
        celltext2.anchorPoint = ccp(0, 0);
        celltext1.position = ccp(30, 70);
        celltext2.position = ccp(10, 30);
        [self addChild:celltext1];
        [self addChild:celltext2];
        //确定按钮
        enter = [CCMenuItemFont itemFromString:@"确定" target:self selector:@selector(removetext)];
        enter.fontSize = 28;
        CCMenu *menu = [CCMenu menuWithItems:enter, nil];
        menu.position = ccp(455, 10);
        [self addChild:menu];
    }
    return self;
}
-(void)removetext
{
    [self.parent removeTalking];
}
@end

TalkCellText.h代码:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface TalkCellText : NSObject 
@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) NSString *labelText1;
@property (nonatomic,retain) NSString *labelText2;
@end

TalkCellText.m代码:

#import "TalkCellText.h"
@implementation TalkCellText
@synthesize name;
@synthesize labelText1;
@synthesize labelText2;
-(id)init
{
    if ((self = [super init])) 
    {
    }
    return self;
}
@end

下面我们说一下TalkCellText这个类,这个类很简单,但是很重要,大家看到了

它有三个属性,大家一看就明白了,不过这里的两个label其实可以合成一个的

我当时写的时候没想那么多,这里我就不修改了,你们可以自己修改一下试试。

接着我们讲一下NpcTalkText这个类,首先这个类要写成单例模式,并且我们

要定义一些可变数组用于存储我们的文本内容,下面我以其中一个npc对话为例

子讲一下,代码如下:

-(void)addNPC1
{
    TalkCellText *text1 = [[[TalkCellText alloc] init] autorelease];
    text1.name = yong;
    text1.labelText1 = @"您已经得救了!";
    text1.labelText2 = @"";
    [self.npc1 addObject:text1];
    TalkCellText *text2 = [[[TalkCellText alloc] init] autorelease];
    text2.name = @"神秘老人";
    text2.labelText1 = @"哦,太感谢你了!我这里有一个宝物,就送给";
    text2.labelText2 = @"你了!孩子再见";
    [self.npc1 addObject:text2];
    TalkCellText *text3 = [[[TalkCellText alloc] init] autorelease];
    text3.name = yong;
    text3.labelText1 = @"???怎么不见了?考,你这退场方式太牛";
    text3.labelText2 = @"逼了,变魔术的吧!";
    [self.npc1 addObject:text3];
    TalkCellText *text4 = [[[TalkCellText alloc] init] autorelease];
    text4.name = @"神秘老人";
    text4.labelText1 = @"...远处传来...哈哈,导演就是这么安排的,";
    text4.labelText2 = @"没办法,其实哥也想低调一点.不要崇拜哥哦!";
    [self.npc1 addObject:text4];
    TalkCellText *text5 = [[[TalkCellText alloc] init] autorelease];
    text5.name = yong;
    text5.labelText1 = @"...........";
    text5.labelText2 = @"";
    [self.npc1 addObject:text5];
}

我们的数组里面存储的是实例化的TalkCellText,我们只需要对其三个属性赋值就行了

呵呵,很简单吧,使用的时候我们就从相应的数组中提取相应的文本就行了。

这里我对其文本内容略加修改,改的不好仅供参考。

其实有时候我们要有自己的想法,不要拘泥于形式,想到什么就可以去尝试修改一下

也许就有意想不到的效果。

好了让我们继续我们的游戏制作吧:

我们先说一下TalkTonpc类中的updateWith: 这个方法,我们接下来在Game01中添加

的内容就跟它有关,这个方法通过接收一个int值来获取相应的文本数组,然后调用方

法:addTalking来添加勇士和npc的谈话内容。在我们点击确定按钮是调用切换谈话内

容的方法:removeTalking 这里我们通过textID来获取下一个谈话内容。

下面让我们添加Game01中的代码吧,先修改if(npc_tileGid)中的switch循环的内容

case 0:
                [self addChild:talkTonpc];
                [talkTonpc updateWith:type];
                break;
            case 1:
                [self addChild:talkTonpc];
                [talkTonpc updateWith:type];
                break;
            case 2:
                [self addChild:talkTonpc];
                [talkTonpc updateWith:type];
                break;
            case 3:
                if (thiefID == 1)
                {
                    [self addChild:talkTonpc];
                    [talkTonpc updateWith:3];
                    //打开二楼的门
                    TitledMap *twofloor = [self.model.titleMapArray1 objectAtIndex:2];
                    CGPoint point = ccp(1, 6);
                    [twofloor.door removeTileAt:point];
                    thiefID = 2;
                }
                else
                {
                    if (canopen) 
                    {
                        [self addChild:talkTonpc];
                        [talkTonpc updateWith:4];
                        TitledMap *floor = [self.model.titleMapArray1 objectAtIndex:18];
                        CGPoint point = ccp(5, 8);
                        CGPoint point2 = ccp(5, 9);
                        [floor.other removeTileAt:point];
                        [floor.other removeTileAt:point2];
                    }
                }
                _hero.isFighting = NO;
                break;
            case 8:
                [self addChild:talkTonpc];
                if (herohp.Coin >= 500) 
                {
                    [talkTonpc updateWith:8];
                }
                else
                {
                    [talkTonpc updateWith:6];
                }
                break;
            case 9:
                [self addChild:talkTonpc];
                if (herohp.Experience >= 500) 
                {
                    [talkTonpc updateWith:9];
                }
                else
                {
                    [talkTonpc updateWith:7];
                }
                break;
            case 10:
                [self addChild:talkTonpc];
                [talkTonpc updateWith:10];
                break;
            case 21:
                _hero.isFighting = NO;

我们还要在Game01初始化方法里实例化talkTonpc。

修改过这部分代码我们就能在游戏中看到与npc的交谈了,不过我们还要再添加一个

交谈结束时相应事件的方法:

-(void)talkTonpc:(int) type
{
    switch (type) 
    {
        case 0:
            herohp.YellowKey ++;
            herohp.BlueKey ++;
            herohp.RedKey ++;
            [herohp updateKey1];
            [self.curtitleMap.npc removeTileAt:towerLoc];
            _hero.isFighting = NO;
            break;
        case 1:
            _hero.Defense += 30;
            [herohp updateHeroDefense];
            [self.curtitleMap.npc removeTileAt:towerLoc];
            _hero.isFighting = NO;
            break;
        case 2:
            _hero.Attack += 30;
            [herohp updateHeroAttack];
            [self.curtitleMap.npc removeTileAt:towerLoc];
            _hero.isFighting = NO;
            break;
        case 6:
            _hero.isFighting = NO;
            break;
        case 7:
            _hero.isFighting = NO;
            break;
        case 8:
            _hero.Defense += 120;
            herohp.Coin -= 500;
            [herohp updateHeroDefense];
            [herohp updateCoin];
            [self.curtitleMap.npc removeTileAt:towerLoc];
            _hero.isFighting = NO;
            break;
        case 9:
            _hero.Attack += 120;
            herohp.Experience -= 500;
            [herohp updateHeroAttack];
            [herohp updateExperience];
            [self.curtitleMap.npc removeTileAt:towerLoc];
            _hero.isFighting = NO;
            break;
        case 10:
            [self.curtitleMap.other removeTileAt:CGPointMake(10, 10)];
            //self.curtitleMap.hiddenFloor = NO;
            _hero.isFighting = NO;
            break;
        case 11:
            canAttack = YES;
            _hero.isFighting = NO;
            break;
        case 12:
            //win = [[[GameWin alloc] init] autorelease];
            //[self addChild:win];
            break;
        case 13:
            self.selenemy.enemyID = 0;
            [self removeEnemy];
            break;
        default:
            break;
    }
}

这样我们npc这块就基本结束了,这里面还有几个boss的谈话场景和一些特殊事件

到后面的文章里在讲,今天的内容也挺多的大家好好看看,消化一下。


下面我将一些题外话,就是给大家推荐一下himi的博客,其实我就是看himi的文章

自学的,感觉不错,大家有兴趣的可以去看一下。

上一篇连接 下一篇连接


分享到:
评论

相关推荐

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

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

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

    《cocos2d-iphone之魔塔20层第四部分》是针对移动平台游戏开发的一份教程,主要基于cocos2d-iphone框架。cocos2d-iphone是一款开源的游戏开发框架,它允许开发者使用Objective-C语言来创建2D游戏、演示和其他图形/...

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

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

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

    【cocos2d-x】是基于C++的开源游戏开发框架,主要用于2D游戏、交互式应用程序和实时视觉效果的开发。它支持多种平台,包括iOS、Android、Windows以及Mac等。cocos2d-x提供了丰富的API接口,使得开发者可以方便地进行...

    cocos2d-x手游开发

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

Global site tag (gtag.js) - Google Analytics