Cocos2D-ObjC:在RPG游戏中混合Swift代码

Cocos2D-ObjC:在RPG游戏中混合Swift代码,第1张

概述我之前写过一个RPG游戏<<熊猫之魂 SoulOfPanda>> 编译器使用的是SpriteBuilder,很好很强大!全部代码都由Objc完成,现在想尝试一下在其中混入Swift代码. 我的目的很简单,用Swift写一个GCMan9类,派生自Objc中的GameCharacter类,最后在Objc中使用GCMan9这个类. GameCharacter类是游戏人物的基类,我从中派生了十几个子类分别

我之前写过一个RPG游戏<<熊猫之魂 SoulOfPanda>>

编译器使用的是SpriteBuilder,很好很强大!全部代码都由Objc完成,现在想尝试一下在其中混入Swift代码.

我的目的很简单,用Swift写一个GCMan9类,派生自Objc中的GameCharacter类,最后在Objc中使用GCMan9这个类.

GameCharacter类是游戏人物的基类,我从中派生了十几个子类分别表示游戏主角,各种NPC,各种敌人等等.

下面是GCMan1类的头文件:

#import "GameCharacter.h"@interface GCMan1 : GameCharacter@end

接着是实现文件:

#import "GCMan1.h"#import "CCAnimation+Helper.h"@implementation GCMan1-(ID)initWithGameScene:(GameScene *)gameScene{    self = [super initWithGameScene:gameScene andImagenamed:@"man1_forward_2.png"];    if (self) {                _facingForwardAnimation = [CCAnimation animation:@"man1" mIDdle:@"forward" frameCount:3];        _facingBackAnimation = [CCAnimation animation:@"man1" mIDdle:@"back" frameCount:3];        _facingleftAnimation = [CCAnimation animation:@"man1" mIDdle:@"left" frameCount:3];        _facingRightAnimation = [CCAnimation animation:@"man1" mIDdle:@"right" frameCount:3];        self.speedPerStep = 0.4;        self.isNPC = YES;        self.gcname = @"GCMan1";    }    return self;}@end

可以看到GCMan1里只是根据实际角色初始化对应的纹理和动画,值得注意的是_facingForwardAnimation之类的变量是在其父类GameCharacter中定义的,如下:

@interface GameCharacter : CCSprite{@protected    GameScene *_gameScene;    //移动的4个方向动画    CCAnimation *_facingForwardAnimation;    CCAnimation *_facingBackAnimation;    CCAnimation *_facingleftAnimation;    CCAnimation *_facingRightAnimation;}

这些变量增加了保护修饰,这里提一下,因为之后的Swift代码要在这里折腾一下.

按道理,如果在一个纯Objc项目中创建一个Swift文件,Xcode会提示你是否创建一个桥接文件,但是我这里并没有提示,所以我们得手动创建一个,格式是

项目名-BrIDging-header.h

里面导入需要在Swift文件中需要使用的类的头文件,在这里其内容是这样的:

#ifndef SoulOfPanda_BrIDging_header_h#define SoulOfPanda_BrIDging_header_h#import "GameCharacter.h"#import "GameScene.h"#endif /* SoulOfPanda_BrIDging_header_h */

然后新建一个GCMan9.swift文件,内容与Objc中的类似:

class GCMan9:GameCharacter{    overrIDe init(gameScene: GameScene!,andImagenamed imagename: String!) {        super.init(gameScene: gameScene,andImagenamed: imagename)    }    overrIDe init(gameScene:GameScene?){        super.init(gameScene: gameScene,andImagenamed: "man1_forward_2.png",andTintcolor: UIcolor.orangecolor())        //怎么设置父类中的保护变量???        speedPerStep = 0.4        isNPC = true        gcname = "GCMan9"    }   }

现在问题来了,父类中的几个@protected定义的变量在Swift中不可见!查阅了一些资料没找到解决办法,只有采用迂回方法,回到GameCharacter.m中新建一个帮助方法:

//设置GameCharacter类中的保护变量,在Swift中调用-(voID)setFacingAnimation:(Nsstring *)name frameCount:(int)count{    _facingForwardAnimation = [CCAnimation animation:name mIDdle:@"forward" frameCount:count];    _facingBackAnimation = [CCAnimation animation:name mIDdle:@"back" frameCount:count];    _facingleftAnimation = [CCAnimation animation:name mIDdle:@"left" frameCount:count];    _facingRightAnimation = [CCAnimation animation:name mIDdle:@"right" frameCount:count];}

同时别忘了在GameCharacter.h接口中导出该方法,回到GCMan9.swift文件中,将注释那一行替换为如下代码:

setFacingAnimation("man1",frameCount: 3)

因为你要在Objc中使用Swift中的类,所以你需要在对应的m文件中包含如下h文件:

#import "SoulOfPanda-Swift.h"

文件名格式很简单就是”项目名-Swift.h”

在实际测试之前,我们还要找到游戏某个场景的pList文件,将其中的NPC类名换为GCMan9:

运行一下游戏,咦怎么崩溃挂掉了…检查一下栈回溯,发现在以下方法中有问题:

//返回一个"假的"的GC对象,只能用于显示和获取数据,不能实际在场景中存在+(instancetype)gcFakeWithname:(Nsstring *)name{    Class class = NSClassFromString(name);    GameCharacter *gc = [[class alloc] initWithGameScene:nil];    return gc;}

仔细一看,发现NSClassFromString方法返回的是nil,虽然name是正确的@”GCMan9”.

测试了一下发现使用如下代码是没有问题的:

GCMan9 *man9 = [[GCMan9 alloc]initWithGameScene:gameScene]; 

难道是Swift中的类名在Objc中看到的有所不同么?查看Apple开发文档发现,果然如此!在Swift定义的类在Objc代码中实际看到的名字需要加上前缀,即GCMan9在Objc中看到的名字是SoulOfPanda.GCMan9,所以要把代码修改如下:

Class class = NSClassFromString(@"SoulOfPanda.GCMan9");

但问题还是没有解决,我不想一个一个的添加判断语句,这样非常的繁琐.相反我要利用Swift中提供了一个很好的特性,就是@objc伪指令,该指令告诉Swift不要在类名前添加前缀.回到GCMan9.swift在开头添加如下一句:

@objc(GCMan9)class GCMan9:GameCharacter{

现在运行代码,终于OK啦:

总结

以上是内存溢出为你收集整理的Cocos2D-ObjC:在RPG游戏中混合Swift代码全部内容,希望文章能够帮你解决Cocos2D-ObjC:在RPG游戏中混合Swift代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1080669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存