导航:首页 > 源码编译 > cocos2d牛牛源码

cocos2d牛牛源码

发布时间:2022-12-26 21:19:48

‘壹’ 怎么在cocos2dx的基础上学习opengl,shader

说说我的经验吧。

一、cocos2d-x 部分

1.1 技术选型

从第三个手游开始,我实在被Adobe的ANE和国内的小平台折腾得没了脾气,决定转到cocos2d-x。在选择哪种语言绑定的时候纠结了很久,最后力排众议选了 lua:Cocos2dx+lua合适还是Cocos2dx+js合适? cocos2d-x 2.x 的lua绑定做得并不好,于是我选择了 quick-cocos2d-x (后来,quick被触控收购)。

1.2 学习 C++

C++ Primer 中文版(第 5 版) (豆瓣) 是不错的入门书籍,建议看第五版,我写过一篇 C++Primer 第4版和第5版比较 。学习期间建议画一些思维导图帮助理解和整理思路。例如这个(不完整):

学习DEMO的过程中,你必须熟悉自己开发平台的IDE,例如Windows上必须熟悉 Visual Studio,而OS X上必须熟悉xcode,Linux平台上就熟悉Eclipse+CDT吧。
注意,quick-cocos2d-x 是不支持Linux开发平台的。
2014-05-17更新:quick已经使用QT重写了player部分,但依然不支持Liunx平台。
1.4 了解引擎的文件夹结构
基于 cocos2d-x 源码生成的文档并不怎么详细,许多功能必须看源码。但这个阶段,我不建议纠结源码太深,倒是可以纠结一下 cocos2d-x 的文件夹结构,看看各个类放在什么地方,找一找常见的哪些宏和常量以及枚举定义在什么地方,这花不了多少时间,但能让你对cocos2d-x有更深刻的了解,同时给你很强的成就感。这种成就感冲淡了你面对大量源码时候的无力感,让你能够继续前行。

1.5 重复上面的第3步:再次学习DEMO

这时候看DEMO可能会轻松不少,但是你会有更多的问题去纠结。例如多分辨率支持?例如坐标系统?例如绘图功能?例如层级管理系统?例如事件传递系统?等等等等……这时候可以去Google(注意不要用百毒和其他搜索引擎)找文档看了。

1.5 重复上面的第3步:再次学习DEMO


这时候看DEMO可能会轻松不少,但是你会有更多的问题去纠结。例如多分辨率支持?例如坐标系统?例如绘图功能?例如层级管理系统?例如事件传递系统?等等等等……这时候可以去Google(注意不要用百毒和其他搜索引擎)找文档看了。

‘贰’ cocos2dx 3.x版本中导入tiled地图如何导入对象层中对象的自定义信息(源码+注释)

步骤如下:
1. cocos2d-x 中使用类 TMXTiledMap 创建瓦片地图
2. 使用 TMXTiledMap 中的 getObjectGroup 接口取得对象层
3. 使用对象层的 getObject 接口获取对象信息,对象信息是一个 ValueMap 实例
4. 从 ValueMap 中取出数据

测试地图如下所示:

‘叁’ 手机游戏用Cocos2d游戏引擎的开发代码如何保障不会被逆向破解

目前针对Cocos2d游戏引擎的开发代码防逆向主要是通过隐藏lua脚本文件,根据爱加密介绍,通过隐藏lua脚本文件,可以保护代码不被黑客给逆向,从而保护游戏逻辑的安全性。希望可以采纳,谢谢!

‘肆’ Cocos Creator 引擎源码调试、修改

Cocos Creator 的引擎部分包括 JavaScript 、 Cocos2d-x-lite 和 adapter 三个部分,各部分对应源码在(Mac 版):

JavaScript:CocosCreator.app/Resource/engine(JS 引擎)
Cocos2d-x-lite:CocosCreator.app/Resource/cocos2d-x(Cococ2d-x 引擎)
adapter:CocosCreator.app/Resource/builtin/

‘伍’ 哪里有DemoLogin登录界面cocos2dx手机游戏源码

一个登陆界面由背景图层和一些文本标签、输入框、按钮等组成。一般是按照从下到上的顺序创建控件。

第一步是给根节点设置贴图,首先是选在对象结构中选中根节点,并打开属性面板,然后在资源面板中找到Register.png,并拖拽到属性面板中的文件属性框内58player.com/code-2943-1.html。

‘陆’ 如何使用cocos2d和box2d来制作一个Breakout游戏:PART

大家也可以到Ray的网站查看本教程的中文版本。Simple Breakout Game ScreenshotBbox2d是一个非常强大的物理引擎库,同时它与cocos2d结合非常适合在iphone上面做游戏开发。着名的angry birds,tiny wings都是用box2d写的。你可以用它做好多事情,当然,最好的学习方法就是使用它来创建一个简单的游戏。在这个教程中,我们将一步一步创建一个简单的breakout游戏,完成碰撞检测,篮球反弹物理效果,通过touch拖动paddle(就是上图的白色矩形),以及胜利/失败的场景。 (Jump to part two of the series.)如果你还不了解cocos2d和box2d,你可能先要读一读 《如何使用cocos2d制作一个简单的iphone游戏》 以及《在cocos2d里面如何使用box2d物理引擎:弹球》.好了,是时候制作breakout了! 一个永远反弹的球S首先,打开Xcode,选择 cocos2d-0.99.1 Box2d Application template创建一个工程,命名为“ Box2DBreakout”. 删除掉模板代码,因此你会有一个空的工程来重新开始—具体步骤可以参照 《在cocos2d里面如何使用box2d物理引擎:弹球》 这个教程。一旦你有了一个很好的干净的工程后,接下来,在HelloWorldScene.h中导入下面的头文件: #import "Box2D.h" 同时在HelloWorld类中添加以下成员变量: b2World *_world; b2Body *_groundBody; b2Fixture *_bottomFixture; b2Fixture *_ballFixture; 然后在HelloWorldScene.mm文件顶部定义比率: #define PTM_RATIO 32 这个比率我们在上一个教程中已经讨论过了,这里就不再啰嗦了。 然后,在init方法中加入下列代码: CGSize winSize = [CCDirector sharedDirector].winSize; // Create a world b2Vec2 gravity = b2Vec2(0.0f, 0.0f); bool doSleep = true; _world = new b2World(gravity, doSleep); // Create edges around the entire screen b2BodyDef groundBodyDef; groundBodyDef.position.Set(0,0); _groundBody = _world->CreateBody(&groundBodyDef); b2PolygonShape groundBox; b2FixtureDef groundBoxDef; groundBoxDef.shape = &groundBox; groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0)); _bottomFixture = _groundBody->CreateFixture(&groundBoxDef); groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO)); _groundBody->CreateFixture(&groundBoxDef); groundBox.SetAsEdge(b2Vec2(0, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO)); _groundBody->CreateFixture(&groundBoxDef); groundBox.SetAsEdge(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0)); _groundBody->CreateFixture(&groundBoxDef); 好,这个代码和我们上一个教程中,为整个屏幕创建一个盒子边界差不多。然后,这一次,我们把重力设置为0,因为,在我们的breakout游戏中,我们并不需要重力!注意,我们存储了底部的fixture的一个指针,以方便后面使用(在后面的教程中,我们将用来追踪什么时候篮球与顶部相碰撞了)。现在,下载我制作的 篮球图片 并且拖到Resources文件夹中,确保 “Copy items into destination group’s folder (if needed)” 被复选中。让我们往场景里面添加一个精灵吧。紧接着上面的代码,加入下面的代码片段: // Create sprite and add it to the layer CCSprite *ball = [CCSprite spriteWithFile:@"Ball.jpg" rect:CGRectMake(0, 0, 52, 52)]; ball.position = ccp(100, 100); ball.tag = 1; [self addChild:ball]; 这里没什么疑问,我们已经做过好多次类似的事情了。注意,我们为篮球设置了一个tag标识,后面你会看到,这个tag标记有什么用。 接下来,为shape创建一个body: // Create ball body b2BodyDef ballBodyDef; ballBodyDef.type = b2_dynamicBody; ballBodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO); ballBodyDef.userData = ball; b2Body * ballBody = _world->CreateBody(&ballBodyDef); // Create circle shape b2CircleShape circle; circle.m_radius = 26.0/PTM_RATIO; // Create shape definition and add to body b2FixtureDef ballShapeDef; ballShapeDef.shape = &circle; ballShapeDef.density = 1.0f; ballShapeDef.friction = 0.f; ballShapeDef.restitution = 1.0f; _ballFixture = ballBody->CreateFixture(&ballShapeDef); 这个看起来和上一篇教程中的也很像。再巩固一下吧,为了创建一个body对象,我们先要创建一个body定义结构,然后再创建body,接着是shape,再指定fixture结构,最后是创建fixture对象。 更新:注意,我们也把球的摩擦力设置为0.这样可以防止球在碰撞的时候,由于摩擦损失能量,导致来回碰撞的过程中会有一点点偏差。 好了,是时候做一些完全不同的事了!紧接上面的代码: b2Vec2 force = b2Vec2(10, 10); ballBody->ApplyLinearImpulse(force, ballBodyDef.position); 这里往球上面施加了一个冲力(impulse),这样可以让它初始化的时候朝一个特定的方向运动。 最后一件事情,就是在init方法中,增加一个tick调度方法: [self schele:@selector(tick:)]; 下面是tick方法的实现: - (void)tick:(ccTime) dt { _world->Step(dt, 10, 10); for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) { if (b->GetUserData() != NULL) { CCSprite *sprite = (CCSprite *)b->GetUserData(); sprite.position = ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO); sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); } } } 当然,这里也和上一个教程中的一样,没有什么特别的。 最后一件事我们永远不忘记!那就是清理: - (void)dealloc { delete _world; _groundBody = NULL; [super dealloc]; } 好了,让我们试一下吧。编译并运行工程,你将会看到一个球无限地在屏幕里面来回弹!—-很酷吧!增加Paddle如果没有一个paddle的话,那么就不可能称其为一个breakout游戏。下载我制作的paddle图片 然后把它拖到Resources文件夹中,同时确保 “Copy items into destination group’s folder (if needed)” 被复选上。然后在HelloWorldScene.h文件中往HelloWorld类中添加下列成员变量: b2Body *_paddleBody; b2Fixture *_paddleFixture; 然后,在init方法中构建paddle body: // Create paddle and add it to the layer CCSprite *paddle = [CCSprite spriteWithFile:@"Paddle.jpg"]; paddle.position = ccp(winSize.width/2, 50); [self addChild:paddle]; // Create paddle body b2BodyDef paddleBodyDef; paddleBodyDef.type = b2_dynamicBody; paddleBodyDef.position.Set(winSize.width/2/PTM_RATIO, 50/PTM_RATIO); paddleBodyDef.userData = paddle; _paddleBody = _world->CreateBody(&paddleBodyDef); // Create paddle shape b2PolygonShape paddleShape; paddleShape.SetAsBox(paddle.contentSize.width/PTM_RATIO/2, paddle.contentSize.height/PTM_RATIO/2); // Create shape definition and add to body b2FixtureDef paddleShapeDef; paddleShapeDef.shape = &paddleShape; paddleShapeDef.density = 10.0f; paddleShapeDef.friction = 0.4f; paddleShapeDef.restitution = 0.1f; _paddleFixture = _paddleBody->CreateFixture(&paddleShapeDef); 我不想花太多的时间解释上面的内容了。因为,和之前的创建篮球的body的过程差不太多。这里只给出不同的地方:当你创建CCSprite的时候,你并不需要指定精灵的大小。如果你传递一个文件名给它,它会自动计算出大小。注意,这里不是使用circle shape了。这一次,我们使用polygon shape。我们使用一个辅助方法来创建shape,当然,其形状是个盒子。我们使用了SetAsBox方法来指定shape相对于body的位置,这个方法在构建复杂的对象的时候比较有用。这里,我们只是让shape在body中间。我把paddle的密度设置得比球要大得多,同时调节了一下其它的参数。(这些参数要靠试,按照真实的高中物理知识去计算,可能得不到)同时,我们存储paddleBody和paddleFixture的引用,为了方便后面使用。如果你编译并运行的话,你将会看到屏幕中间有一个paddle,而且球碰到它将会反弹。 然后,这还不是很有趣,因为我们还不能移动paddle!移动Paddle移动paddle需要touch事件,所以先在init方法中允许touch事件: self.isTouchEnabled = YES; 然后,在HelloWorldScene.h的HelloWorld类中添加下面的成员变量: b2MouseJoint *_mouseJoint; 现在,让我们实现touch方法!首先是ccTouchesBegan: - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (_mouseJoint != NULL) return; UITouch *myTouch = [touches anyObject]; CGPoint location = [myTouch locationInView:[myTouch view]]; location = [[CCDirector sharedDirector] convertToGL:location]; b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO); if (_paddleFixture->TestPoint(locationWorld)) { b2MouseJointDef md; md.bodyA = _groundBody; md.bodyB = _paddleBody; md.target = locationWorld; md.collideConnected = true; md.maxForce = 1000.0f * _paddleBody->GetMass(); _mouseJoint = (b2MouseJoint *)_world->CreateJoint(&md); _paddleBody->SetAwake(true); } } 呃,好多新知识!让我们一点一点来讨论。 首先,我们把touch坐标转换成coocs2d坐标(convertToGL)然后,再转换成Box2d坐标(locationWorld)。 然后,我们使用paddle fixture的一个方法来测试这个touch点是否在fixture内部。 如果是的话,我们就创建一个所谓的”鼠标关节“。在Box2d里面,一个鼠标关节用来让一个body朝着一个指定的点移动—在这里个例子中,就是用户点的方向。 当你创建一个mouse joint后,你赋值给它两个body。第一个没有被使用,通常都是设置成ground body。第二个,就是你想让它移动的body,在这个例子中就是paddle。 接下来,你指定移动的终点—这个例子中就是用户点击的位置。 然后,你告诉box2d,但bodyA和bodyB碰撞的时候,把它当成是碰撞,而不是忽略它。这个很重要!因为,我之前没有设置它为ture,结果不行!因此,当我们用鼠标拖动这个paddle的时候,它并不会与屏幕的边界相碰撞,而且有时候,我的paddle直接就飞出屏幕之外了。这个非常非常奇怪,不过我现在知道是为什么了。因为没有设置bodyA和bodyB是可碰撞的。 你然后指定移动body的最大的力是多少。如果你减少这个数值的话,paddle body响应鼠标移动时就会慢一些。但是,我们想让paddle快速地响应鼠标的变化。 最后,我们把这个关节加入到world中,同时,保存这个指针,因为后面有用。同时,我们还要把body设置成苏醒的(awake)。之所以要这么做,是因为如果body在睡觉的话,那么它就不会响应鼠标的移动! 好了,接下来,让我们添加ccTouchesMoved方法: -(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if (_mouseJoint == NULL) return; UITouch *myTouch = [touches anyObject]; CGPoint location = [myTouch locationInView:[myTouch view]]; location = [[CCDirector sharedDirector] convertToGL:location]; b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO); _mouseJoint->SetTarget(locationWorld); } 这个方法的开头部分和ccTouchesBegan差不多—我们把touch坐标转换成Box2d坐标。唯一的区别就是,我们更新了鼠标关节的目标位置(也就是我们想让paddle移动的位置的)。 接下来,我们添加ccTouchesCacelled和ccTouchesEnded方法: -(void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { if (_mouseJoint) { _world->DestroyJoint(_mouseJoint); _mouseJoint = NULL; } } - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (_mouseJoint) { _world->DestroyJoint(_mouseJoint); _mouseJoint = NULL; } } 我们在这些方法中做的只有一件事,就是在我们移动完paddle或者取消移动之后销毁mouse joint。 编译并运行,你现在可以用鼠标移动paddle了,同时可以让它与篮球相互碰撞了! 很好。。。不过,等一下,这还不是一个breakout!我们不可以把paddle移动到任何位置,我们只能在屏幕底部左右来回移动它!限制Paddle的移动我们可以很容易地限制paddle的移动,只需要添加另外一个关节,叫做prismatic joint。这个关节会限制一个body的移动沿着一根指定的轴。 因此,我们可以使用这种方法来限制paddle相对于地面移动,也就是说只能沿着x轴移动。 让我们看看相关代码。往init方法中加入下列代码: // Restrict paddle along the x axis b2PrismaticJointDef jointDef; b2Vec2 worldAxis(1.0f, 0.0f); jointDef.collideConnected = true; jointDef.Initialize(_paddleBody, _groundBody, _paddleBody->GetWorldCenter(), worldAxis); _world->CreateJoint(&jointDef); 第一件事情就是指定一个沿着x轴的向量。然后,我们需要指定collideConnected为true,因此,我们的球才能够正确的反弹,而不是飞到屏幕之外去。 然后,初始化关节,指定paddle和ground两个body,再使用world对象来创建关节! 更新:我第一次尝试去修正这个bug的时候,我通过直接调整球的速度,使用SetLinearVelocity方法。然后,Steve Oldmeadow也指出,这非常不好!它会破坏物理仿真,最好的方法是通过调用SetLinearDamping方法,间接影响速度。因此,现在这个教程就是这个做的。(damping就是阻尼的意思) 接下来,在tick方法中添加下列代码,具体位置是在获得user data之后: if (sprite.tag == 1) { static int maxSpeed = 10; b2Vec2 velocity = b->GetLinearVelocity(); float32 speed = velocity.Length(); if (speed > maxSpeed) { b->SetLinearDamping(0.5); } else if (speed < maxSpeed) { b->SetLinearDamping(0.0); } } 这里,我们判断sprite的tag,看是否是球的tag。如果是的话,我们就检查它的速度,如果太大的话,就设置它的阻尼为0.5,这样可以让它慢下来。 如果你编译并运行的话,你将会看到一个球以非常适中的速度在屏幕四周来回反弹。给我源代码!这里是本教程的 完整源代码 。这只是一部分,第二部分的教程会包含一个完整的breakout的源码。接下来呢?目前为止,我们已经有一个篮球在屏幕四周来回反弹了,同时还有一个paddle可以用鼠标来控制其移动。在下个教程中,我们将创建一些方块,当球碰到它们的时候,方块就会消失。

‘柒’ 如何使用Cocos2d-x完美呈现捕鱼3

捕鱼达人3与前两部相比,技术上有哪些突破和创新?
捕鱼达人3作为前两代成功作品的续作,我们需要从玩法到技术,全面超越前代。所以在技术上,我们主要做了下面一些突破和创新:

1)鱼的3D渲染。 跟2D渲染相比,3D渲染可以让鱼看起来更加立体和真实。 3D骨骼动画可以让动作更加丰富和平滑。另外我们还为鱼增加了表情动作,让鱼儿更具个性化。

2) 纯3D路径。 前两代的2D路径在我们新的3D场景下,表现力要弱很多。为此我们设计了全新的3D路径编辑器,鱼的游动不仅仅在一个面上游动,而是一个立体空间,这样鱼的游动过程会更加平滑和真实。

3) 丰富的武器表现效果。 以前的武器效果,我们一般是结合帧动画和粒子效果实现,在捕鱼3中,我们的武器很多是通过 shader 实现的,让效果更加绚丽和富于变化。比如闪电武器,泡泡武器等。

4) 3D的后处理和灯照效果。大家可以看到我首屏模拟海洋的效果,就用到相关技术。还有鱼身上的波光效果。

2.《捕鱼达人3》使用了最新的Cocos2d-x中3D功能,它有哪些突出的亮点?请举几个游戏里的具体案例说明
1)继承Cocos2d-x的设计思路,只要具备Cocos2d-x的编程经验, 在使用和理解上完全无障碍,可以立马上手写代码。

2) 丰富的材质系统,可以自定义模型不同渲染效果。 比如:我们的鱼身上的渲染效果已经电鳗鱼的闪电效果

3) 强大的模型编辑器,可以自定义模型的材质

3. 引擎3D功能使用的时候感觉和2D部分区别在哪?
设计理念和开发流程和2D差不多

4. 游戏里面的动画效果,是UI实现的,还是Cocos引擎的3D效果?比如那个漩涡,是不是使用引擎的3D效果可以做很多不同的漂亮效果呢?
渲染时用3D的材质系统实现的, 由于材质系统的扩展能力很强,做出各种漂亮的效果完全没问题。

5. Cocos2d-x的3D技术稳定性如何?是否已经到了可以大规模市场化应用的阶段?
挺好的,我们Android版本的适配度高达92%以上。

6. 引擎粒子效果的效率一直备受争议,请问捕鱼达人3有没有专门做优化?
我们对同一种粒子做了批次处理。另外,还通过脚本, 严格控制了粒子的个数,不能超过某个上限值。

7. 在《捕鱼达人3》开发过程中,遇到哪些困难和挑战?你们是如何克服的?
游戏开发都会面临一个资源的管理问题,就是资源如何从美术制作,在到程序使用以及后续的维护。捕鱼3的资源类型比较多。2D层有图片,ui资源,动画资源,字体资源,粒子资源。 3D层又涉及3D模型,材质,纹理,shader等。另外,还有track,策划配置文件等。所以种类非常多。 还因为捕鱼3的适配性要求比较高,所以,我们有些资源按照分辨率有划分了几大类。 还附加一条,资源还分不同的语言版本。 上线之后,资源本身还需要跟随发布版本一起维护。所以中间的问题非常多。 在我们项目中会严格对资源进行规范, 包括命名,目录结构。资源如何从美术维护的目录流动到程序使用的目录等。另外还维护了一套基于ant+python的脚本来去驱动资源的流转。 实现一键生成程序所需要的资源。 无须人工的干预, 非常便捷。

另外我们还有一键打Windows,iOS,Android各种程序包的脚本,方便做版本的daily build。

8. 《捕鱼达人3》的背后一定有一支强大的团队,包括多方面能力的配合,能否分享一下团队协作和管理的经验?
就我们研发而言, 其实最重要是前期做好开发规范,然后打造融洽的团队氛围,明确每个人的开发任务,大家随着项目的发展一起往前进步。

9. 最后,对其它有志进入手游行业或者在摸索中前行的手游开发者,您能否给一些建议?
虽然很多媒体都在高喊:手游已是一片红海。 但这个市场远没有饱和,移动设备的增量仍然很大。而且区别于端游市场的客户端大作,页游市场的各种网游。手游的游戏类型更加多样化,更加丰富。休闲的,棋牌的,各类网游,都有成功的案例。所以,这个市场更加灵活,更适合小团队创造奇迹,仍然有很多的机会。另外从技术上讲,由于存在Cocos2d-x这种几乎处于垄断地位的引擎, 手游也是一个更加开放的市场。 网上有一大堆的学习资料和游戏源码, 只要你有点计算机基础,入门还是很容易的。重要的是自己能够静下心来多看多写些代码,争取独立发布一款产品。我见过不少人自己做一点东西都没坚持下来,做一半就放弃掉。其实在多坚持下,离成功就近了很多。

‘捌’ 自学cocos2d js游戏开发应该按什么步骤进行

跟你简要说一下我的自学路,以免你走弯路

背景:
有工作,而且很忙;在不影响工作基础上用业余时间鼓捣(经常会因为工作耽搁学习进度);基本没技术背景(初中qbasic、高中pascal半吊子),大学文科,工作也不是搞代码。因此我感觉我的自学路跟你还是挺契合的。

1
两年前的一天,决定要做独立游戏制作人。选定引擎cocos2d,开始学习objective-c语言;(如果你打算只在iOS平台开发可以学obj-c配合cocos2d或者sprite kit;如果打算跨平台就要用cocos2d-x和c++了;当然unity什么的也不错但是我还没尝试过,一直很向往)

2
我跳过了iOS程序开发(似懂非懂看完了斯坦福那一系列的教学视频),结合当时情况直接选择了cocos2d引擎,这时开始接触 @吴一刀 推荐的博客;我主要看的是子龙山人<子龙山人 - 博客园>、Ray Wenderlich<Ray Wenderlich>、Himi<黑米GameDev街区>这些博客里最基本的例子,知易那个以我当时的水平还看不懂。

3
尝试开始设计自己的简单游戏,我做打地鼠!当然比教学例子里的打地鼠复杂多了

4
这个过程中发现自己懂的实在是不够,所以又开啃这本书:Learn cocos2d 2 by Steffen Itterheim & Andreas Low

5
慢慢的发现需要一些趁手的工具和编辑器,并发展出一套自己构建于cocos2d之上的游戏设计架构。我目前的情况是这样:

关卡编辑我使用plist文件配合自己写的类;

sprite sheet使用TexturePacker<TexturePacker>;

动画/UI编辑最初自己手写太累,后来选择了cocosbuilder,请注意现在这个软件已经停止维护,转而引导用户使用SpriteBuilder<SpriteBuilder>(域名都做了自动跳转;SpriteBuilder我木有研究过,建议你研究一下)。

粒子编辑我自己还没实际用到,如果真正需要我感觉cocosbuilder的够我用的。//更新:后来用到了ParticleDesigner和cocosbuilder两个软件的粒子编辑混搭

我当时遇到的一个大麻烦是如何让cocosbuilder、cocos2d版本互相兼容且cocosbuilder无问题。大概情况是这样:cocosbuilder2.1和cocos2d-iphone2.0及2.1版本都不协调怎么办?;What version of Cocosbuilder and Cocos2d-iphone should I choose?

目前我使用的cocosbuilder 2.1版本(渐变层有bug、并且很可惜动画播放完没有触发消息的机制,我只好把每个动画时长都手动记录一下自己处理)

======3月12日更新======
在 @GarfieldKwong 指点下发现这个版本动画播放完是可以触发消息机制的,更高级版本3.x支持的效果应该是在动画中就加入callback的关键帧
新技能get√

具体代码可见下面学习案例的第一个例子里Explosion部分
=====================

cocosbuider的学习可以看两个例子Creating a Game with CocosBuilder;Introction to CocosBuilder;然后就是多用多尝试。

6
整个学习过程要学会查资料、学会寻求帮助,我主要用的stackoverflow(话说刚刚发现stackoverflow的reputation喜过15,终于可以投票了:)

在学习过程中得到了子龙山人(我认为本尊是这位 @屈光辉 )、LearnCocos2d作者Steffen、 @kubisoft 以及众多网上朋友的帮助,再次表示感谢。

7
硬件及开发者资格:看完c++开始看obj-c,这个过程一直是使用的vmware虚拟机安装的mac系统写程序;然后入手一个最便宜的mac pro、以及iPhone,尝试玩各种游戏;从看c++开始大约过了1年半(已经有非常简陋的游戏demo)才真正购入iOS开发者资格并开始真机测试。

8
尝试过的一些其他工具、各种弯路和坑、以及发散内容:
可以拖拽方式写代码的stencyl <Stencyl: Make iPhone, iPad, Android & Flash Games without code>;
最初学的不是ojc-c而是谭浩强老师的c++程序设计(虽然有人不喜谭老师,但那书是中文的让我对面对对象程序设计有一些初步的概念,再看英文的obj-c不至于太摸不着头脑,反正手头正好有这么一本买了6年没看的c++。。。);
尝试过<Tiled Map Editor>但自己目前的坑没有用到;
尝试过一点物理引擎和粒子,但自己目前的坑没有用到;现在粒子用到了,做了火焰等效果,也挺美的;但是一定要注意CPU占用优化,内存方面我最低支持4S没遇到大问题

学习音乐制作,这个我小时候学琴一直也喜欢音乐所以有一点点底子,如果没有基础可能上手有门槛;开始用的软件LMMS,但是音源插件在64位系统的问题我一直没解决掉时间精力也不多,所以是暂时停滞了;最近发现Garage Band可能也可以写歌;另外还试过一个很有历史的微软的音乐自动编辑器,很好玩,用来做背景音乐也不错。

入手手绘板学画画(这中间纠结了好久才决定用位图不用矢量图),如果你能找到热爱游戏的美术同学一起搞那最好不过。但是我一直对画画心痒难搔。。。所以入了这个深坑,晒一晒:
转载
z

‘玖’ 求cocos2d-x教程

cocos教程网络网盘免费资源在线学习

链接: https://pan..com/s/1lYZHKPPVuvBR4rddE1jasA

提取码: e2ht

cocos教程 极客学院Cocos2d-x源码 05_第5阶段 项目实战 04_第4阶段 功能扩展 03_第3阶段 常用功能 02_第2阶段 基础知识 01_第1阶段 环境搭建 5 使用Eclipse在Ubuntu下搭建Cocos2d-x 3集成开发环境 4 Cocos Code IDE使用 3 Windows环境下Visual Studio 2013中搭建Cocos2d-x 3.1集成开发环境 2 Cocos2d-x3.1rc0项目创建及新功能介绍 1 WinMac环境Cocos2d-x开发环境搭建 06. HelloWorld示例详解.webm 05. 在Mac平台编译成Android程序.webm 04. Mac平台开发环境搭建.webm


‘拾’ Cocos2d-x之获取图像像素值

制作游戏时,我们最常用的图片格式是png,因为png可以有透明的背景,这样在游戏显示图片是,透明的部分不会显示,只显示我们要的那部分。但是,透明的部分依然是图片的一部分,当你制作了一个非矩形的按钮,会有相当多的透明部分点击有效,那么如何做到点击透明部分无效呢?这就是本片文章要讲的:获取图像像素值。当然不仅仅在制作非矩形按钮时有用,在游戏中的很多涉及图片处理功能的地方也大有用途。

废话不多说,直接贴源码(Cocos2d-x 3.x版本):

HelloWorldScene.h文件

HelloWorldScene.cpp文件:

在GetRGBA函数中,调用了OpenGL的接口glReadPixels,它用于读取一些像素。当前可以简单理解为“把已经绘制好的像素(它可能已经被保存到显卡的显存中)读取到内存”。

glReadPixels函数总共有七个参数。前四个参数可以得到一个矩形,该矩形所包括的像素都会被读取出来。(第一、二个参数表示了矩形的左下角横、纵坐标,坐标以窗口最左下角为零,最右上角为最大值;第三、四个参数表示了矩形的宽度和高度)

第五个参数表示读取的内容,例如:GL_RGB就会依次读取像素的红、绿、蓝三种数据,GL_RGBA则会依次读取像素的红、绿、蓝、alpha四种数据,GL_RED则只读取像素的红色数据(类似的还有GL_GREEN,GL_BLUE,以及GL_ALPHA)。如果采用的不是RGBA颜色模式,而是采用颜色索引模式,则也可以使用GL_COLOR_INDEX来读取像素的颜色索引。目前仅需要知道这些,但实际上还可以读取其它内容,例如深度缓冲区的深度数据等。

第六个参数表示读取的内容保存到内存时所使用的格式,例如:GL_UNSIGNED_BYTE会把各种数据保存为GLubyte,GL_FLOAT会把各种数据保存为GLfloat等。

第七个参数表示一个指针,像素数据被读取后,将被保存到这个指针所表示的地址。注意,需要保证该地址有足够的可以使用的空间,以容纳读取的像素数据。例如一幅大小为256*256的图象,如果读取其RGB数据,且每一数据被保存为GLubyte,总大小就是:256*256*3 = 196608字节,即192千字节。如果是读取RGBA数据,则总大小就是256*256*4 = 262144字节,即256千字节。

注意:glReadPixels实际上是从缓冲区中读取数据,如果使用了双缓冲区,则默认是从正在显示的缓冲(即前缓冲)中读取,而绘制工作是默认绘制到后缓冲区的。因此,如果需要读取已经绘制好的像素,往往需要先交换前后缓冲。

阅读全文

与cocos2d牛牛源码相关的资料

热点内容
程序员编迷你世界代码 浏览:893
php取现在时间 浏览:246
单片机高吸收 浏览:427
怎么区分五代头是不是加密喷头 浏览:244
hunt测试服务器是什么意思 浏览:510
2013程序员考试 浏览:641
毕业论文是pdf 浏览:736
服务器跑网心云划算吗 浏览:471
单片机定时器计数初值的计算公式 浏览:801
win7控制台命令 浏览:567
猫咪成年app怎么升级 浏览:692
360有没有加密软件 浏览:315
清除cisco交换机配置命令 浏览:751
华为删除交换机配置命令 浏览:473
shell打包命令 浏览:827
加密狗插上输不了密码 浏览:187
大学单片机相关科目 浏览:23
自己建了服务器地址 浏览:698
命令按钮的属性设置 浏览:965
证券技术分析pdf 浏览:779