想要学习游戏开发,去哪培训比较好呢?

想要学习游戏开发,去哪培训比较好呢?,第1张

你可以先去绘学霸网站找“游戏设计/游戏制作”板块的免费视频教程-点击进入完整入门到精通视频教程列表: >背景介绍:LiquidFun是谷歌基于原本的Box2D改造的,可以生成带有流体物理性质粒子的一个扩展库。Ricardo利用这个LiquidFun,将它整合到了Cocos2d-x30中,做成了2个Demo,使我们可以直接生成带有流体物理性质的粒子。LiquidFun整合Cocos2d-x30DemogithubLiquidFun官方文档LiquidFunTestbed+Cocos2d-x以下是全文翻译,有不够准确的地方,希望大家指出分割线下面这段话摘自LiquidFun的官网地址:通过基于Box2D的功能,LiquidFun实现了一个可以模拟流体的粒子特效。游戏开发者可以在他们的游戏中通过使用它来实现游戏中的力学,或者逼真的物理特效。游戏设计者则可以通过这些库来设计出精彩的流体互动的游戏体验。通过上面这段话可以看出,本质上LiquidFun是一个在Box2D之上追加的一个扩展,它通过使用粒子系统来实现模拟流体粒子的效果。你可以通过下载安装安卓上的LiquidFun-Testbed和LiquidFun-EyeCandy来测试它。Cocos2d-x已经整合了Box2D,为了整合LiquidFun,我们需要先把一个新的类整合进来:b2ParticleSystemLiquidFun中的b2ParticleSystem我并不打算在这里介绍如何使用LiquidFun(你可以通过阅读它的开发向导来学习。)不过,我会讲解如何将b2ParticleSysytem整合进Cocos2d-x。(这个方法在别的游戏引擎中也同样适用。)为了合并整合,我们需要一个能够懂得如何渲染b2ParticleSysytem的Cocos2d-xNode。b2ParticleSysytem提供以下4个有用的方法:classb2ParticleSystem{//获得粒子的数量int32GetParticleCount()const;//获得粒子的半径float32GetRadius()const;//获得每个粒子在Box2D坐标系统中的位置//数组长度可以通过GetParticleCount()获得b2Vec2GetPositionBuffer();//获得每个粒子RGBAUint8格式下的颜色b2ParticleColorGetColorBuffer();};理想情况下我们本应该通过重用cocos2d::ParticleSystemQuad来做上面提到的渲染,但是因为以下几个原因这样做是行不通的:cocos2d::ParticleSystemQuad不支持改变它的吸引子(这是一个设计上的缺陷,之后我们会修复它。)这种情况下应该用一个空的吸引子。ParticleSystemQuad是通过Quads来实现的,而不是Points。尽管Cocos2d-x是支持Points的(如Cocos2d-xv10,它依旧没有法正常工作因为Points和colors应该在一个交错的数组中。另一个问题便是Box2D和Cocos2d-x之前的坐标系转换问题,不过这个问题可以很容易解决PointsvsQuads使用Points的主要缺点在于,你没有法旋转一个Points,这也正是我们在Cocos2d-x上不使用它的原因。但是Points也有很多优势,它跟Quads比起来只需要更少的内存,这意味着它可以运行的更快。下面举一些使用Point的与Quads不同的情况:Point的坐标只需要一个点(Quads需要4个)Point只需要1种颜色(Quads需要4个)Point不需要使用UV坐标(Quads需要)Point如果你需要使用不同的大小的时候,你可能要传一个浮点型的数组。(Quads不需要)Point在做碰撞检测的时候会消耗比Quads更少的资源。值得注意的是LiquidFun的目的在于模拟流体。因此在流体的情况下,你是不需要去考虑粒子的旋转的,所以LiquidFun在这里选择了内存消耗更小的Points通过GL_POINTS绘图在OpenGL/OpenGLES中可以通过GL_POINTS来绘制Points,不过它有以下几个确定的限制:它没有法旋转(就像上面说的那样)如果你通过gl_PointSize放大或者缩小粒子,你没有法单独放大或缩小X轴和Y轴的大小,它们只能同时被放大或缩小。Points也可以使用纹理,但是你没有法改变他的U-V坐标,无论你用的是一整张纹理还是什么都不使用。如果你以前从没使用过GL_POINTS,你可以通过下面的代码来看看它什么样的://创建一个Box2D下的坐标的数组//这些坐标等会会转换成Cocos2d-x中的坐标系统的坐标voidpositions=_particleSystem->GetPositionBuffer();glVertexAttribPointer(position_index,2,GL_FLOAT,GL_FALSE,0,positions);glEnableVertexAttribArray(position_index);//颜色的数组它的参数格式:R,G,B,Aunsignedbytesvoidcolors=_particleSystem->GetColorBuffer();glVertexAttribPointer(color_index,4,GL_UNSIGNED_BYTE,GL_TRUE,0,colors);glEnableVertexAttribArray(color_index);//尺寸大小的数组。particlesize_index指的是一个浮点数的数组(上面提到过的),用户必须创建这个数组//这是一个额外的功能,当用户想要使用不一样大小的Points的时候可以用到它glVertexAttribPointer(particlesize_index,1,GL_FLOAT,GL_FALSE,0,particle_size);glEnableVertexAttribArray(particlesize_index);//绘制PointsglDrawArrays(GL_POINTS,0,_particleSystem->GetParticleCount());将Box2d坐标转换成Cocos2d-x坐标系Cocos2d-xv30需要将ModelView模型传递给draw()方法。我们所要做的便是将它转换成Box2D坐标系统中能用的坐标。下面的代码便是我们所需要做的:classLFParticleSystemNode:publiccocos2d::Node{//为缩放转换用的变量kmMat4_ratioTransform;}boolLFParticleSystemNode::init(b2ParticleSystemparticleSystem,floatratio){//像素转换为米的比例:相当于将Box2d转换为Cocos2dkmMat4Scaling(&_ratioTransform,ratio,ratio,1);}voidLFParticleSystemNode::onDraw(constkmMat4&modelViewTransform,booltransformUpdated){//这里需要新建一个新的modelview,它可以让我们在Cocos2d-x坐标系中渲染粒子想·想·//newMV=modelViewTransform_ratioTransformkmMat4newMV;kmMat4Multiply(&newMV,&modelViewTransform,&_ratioTransform);_shaderProgram->use();_shaderProgram->setUniformsForBuiltins(newMV);}通过gl_PointSize来转换大小我们要做的另一件事便是上面所没有讲到的,如何根据“世界”大小来放大缩小Points。下面的代码将会展示://Vertex着色器attributevec4a_position;attributevec4a_color;attributefloata_size;voidmain(){//CC_PMatrix=ProjectionMatrix//CC_MVMatrix=ModelViewMatrixgl_Position=CC_PMatrixCC_MVMatrixa_position;//下面正是如何放大所辖Points的方法://这里的ModelView模型的X轴缩放为[0][0]Y轴缩放为[1][1]//不幸的是我们只能ScaleX或者ScaleY,而不能同时使用它们gl_PointSize=CC_MVMatrix[0][0]a_size;v_fragmentColor=a_color;}通过gl_PointCoord来生成纹理坐标最后要做的事情,就是给粒子附上纹理,否则我们将没法看到任何东西。上面提到过,你不能直接把UV坐标传递给Points。因此,这里我们将使用一个叫做gl_POINTS的预定义变量。如下://Fragment着色器uniformsampler2DCC_Texture0;varyingvec4v_fragmentColor;voidmain(){//gl_PointCoord在fragment中应该是已经转换成像素了//它必须使用一张完整的纹理,而不是一张纹理中截取的部分。gl_FragColor=v_fragmentColortexture2D(CC_Texture0,gl_PointCoord);}以上!便是所有的过程!你可以在这里找到完整的LFParticleSystemNode:LFParticleSystemNode完整的示例demo可以在这里下载:cocos2d-x-samples:你可以尝试LiquidFun-EyeCandy和LiquidFun-Tested两个粒子。在第二部分,我会介绍如何将LiquidFun整合到Cocos2d-x在Win32和VisualStudio的环境中。待会我会介绍如何使用更漂亮的"metaball/blob"来渲染模拟水的特效。

一个游戏问世要经历很多环节,剧本设计,原画创作,场景建模,但核心部分还是编程语言开发。当下互联网行业发展迅速,与之相关的产业大多发展都很好,游戏设计的前景自然也是相当不错的。

主要学的内容如下:

1游戏程序设计:C++程序设计入门;基本数据类型和输入输出;流程控制语句;数组、指针和引用、函数;程序结构和书写规;范结构体和联合体、类;继承与多态;异常处理与程序调试。

2算法与数据结构:算法分析;数据结构;基本算法;STL的概念与使用;静态库与动态库;XML库的使用。

3Win32程序设计:Windows程序入门;Windows消息;GDI绘图游戏工具与MFC;网络编程基础。

4游戏数学和智能应用:游戏中的坐标系;矢量、矩阵;几何碰撞;物理模拟;人工智能与寻路算法。

52D游戏技术与应用:2D游戏技术概论;游戏地图系统;GUI系统;战斗系统设计;任务系统;优秀的声音引擎BASS;Cocos2D-X引擎;Box2D物理引擎。

想要系统学习,你可以考察对比一下开设有IT专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能,南京北大青鸟、中博软件学院、南京课工场等都是不错的选择,建议实地考察对比一下。

祝你学有所成,望采纳。

一款游戏的问世,需要经过游戏策划、游戏原画设计、游戏UI设计、游戏场景设计、游戏角色设计、游戏动画设计、游戏特效设计、游戏程序开发之后才会展现在我们眼前,最后将这些素材作品整合进游戏引擎,最终还需要经过除错的过程。以下是详细介绍:
1、现在已经有比较简单的游戏引擎开源,可以直接使用内置的模板和内置的素材库,通过相对简单的设置就可以制造一个很简单的游戏运行。比如说虚幻引擎,可以通过内建的模板和素材库搭建一个可以运行的游戏,但想要创作一款比较复杂的软件,光靠这些素材是不够的;
2、一款电脑游戏是策划,场景设计,美术,文本编辑等多个工种共同努力的结果;
3、比如说游戏策划是游戏开发的核心,游戏策划师需要掌握office系列软件、mindmanger等思维导图软件;游戏原画设计需要良好的手绘、素描功底,最常用的软件就是PS;游戏UI设计需要用PS、AI、DW、FL、axureRP、HTML、CSS等软件;游戏场景设计需要用PS、Maya、3ds Max等软件;游戏角色场景设计需要用Maya、Bodypaint等软件;游戏动画设计需要用Character studio、Maya等软件;游戏特效设计需要用3ds Max、illusion等软件;游戏程序开发需要用到C++、WIN32、DirectX、Box2D、coco520、unity等工具;
4、以上的素材制作完成之后就可以整合进游戏引擎,比如说上述的虚幻引擎;
5、而目前一些独立游戏乃至于大型的3D游戏,都是多人多个工种共同合作,而且非常麻烦而且耗时的一件事情,尤其是后者,根据规模大小,需要耗费几百甚至上千人几年的时间设计创作还有最终的测试阶段。如果是想自己娱乐的话,建议使用Flash或者虚幻引擎自带的模板素材库制作一些小游戏。
啄木鸟家庭维修——台式机维修服务
营业时间:724小时(免费预约)
维修范围:苹果台式电脑维修、windows台式电脑维修等
维修项目:电脑故障、网络故障、系统故障、数据故障、外接设备故障等
服务保障:标准价格、极速上门、技术精湛

就学下面3大软件,其他的软件可以做辅助
FLASH
3DMAX
辅助软件Photoshop等
这个去学校的话,可以教你怎么使用软件,如果一点都不懂的话,就去学学,要是会那还要自学,这个是要自己钻研的。
动画设计是包含的比较多,象数字传媒啊,广告里的动画啊,都是动画设计
动漫设计就是单纯的与动画、漫画、游戏之类相关的设计了
一FLASH
Flash是美国的MACROMEDIA公司于1999年6月推出的优秀网页动画设计软件。它是一种交互式动画设计工具,用它可以将音乐,声效,动画以及富有新意的界面融合在一起,以制作出高品质的网页动态效果。
为什么用FLASH
大家知道,HTML语言的功能十分有限,无法达到人们的预期设计,以实现令人耳目一新的动态效果,在这种情况下,各种脚本语言应运而生,使得网页设计更加多样化。然而,程序设计总是不能很好地普及,因为它要求一定的编程能力,而人们更需要一种既简单直观又功能强大的动画设计工具,而Flash的出现正好满足了这种需求。
FLASH的特点
1 使用矢量图形和流式播放技术。与位图图形不同的是,矢量图形可以任意缩放尺寸而不影响图形的质量;流式播放技术使得动画可以边播放边下载,从而缓解了网页浏览者焦急等待的情绪。
2 通过使用关键帧和图符使得所生成的动画(swf)文件非常小,几K字节的动画文件已经可以实现许多令人心动的动画效果,用在网页设计上不仅可以使网页更加生动,而且小巧玲珑下载迅速,使得动画可以在打开网页很短的时间里就得以播放。
3 把音乐,动画,声效,交互方式融合在一起,越来越多的人已经把Flash作为网页动画设计的首选工具,并且创作出了许多令人叹为观止的动画()效果。而且在Flash40的版本中已经可以支持MP3的音乐格式,这使得加入音乐的动画文件也能保持小巧的‘身材’。
4 强大的动画编辑功能使得设计者可以随心所欲地设计出高品质的动画,通过ACTION和FS COMMAND可以实现交互性,使Flash具有更大的设计自由度,另外,它与当今最流行的网页设计工具Dreamweaver配合默契,可以直接嵌入网页的任一位置,非常方便。
总之,Flash已经慢慢成为网页动画的标准,成为一种新兴的技术发展方向。面对这么不可多得的设计工具,你还等什么,赶快加入Flash的行列吧!
二3DMAX简介
数年前,AutoDesk公司推出了可在个人计算机上运行的三维动画软件 3D Studio(3DS)。它的全称是 3-Dimension Studio,译成中文应该是“三维影像制作室”。 3D Studio MAX(以下简称 MAX)是以 3DS 4x为基础的升级版本,它以全新的 Windows界面及更强大的功能展示在我们面前。用MAX来制作三维动画就像是当一个大导演——一切的角色、道具、灯光、摄像机、场景(包括如云、雾、雪、闪电等特效场面)及配音、镜头的剪辑合成等等都任你来安排处理。如果你是一位设计家,用MAX来设计产品模型的感觉就像是雕塑家和魔术师,复杂的模型几乎是在瞬间就奇迹般地建立起来了。而用MAX修改创建的模型更是轻而易举的事,完全可以把宝贵的时间和精力集中用在使设计更加完美更加理想上。无论是出于何种目的使用 MAX,一定会充分体会到用计算机工作时的那种“工作就是玩,玩就是工作”的快感。
可以毫不夸张地说,哪里需要三维设计、哪里需要三维动画,哪里就需要MAX。MAX适合于从事下列任何一种职业的专家或业余爱好者:特技、立体和影视动画广告设计、工业设计、建筑和室内装潢设计、包装与装潢设计、三维游戏开发、软件开发程序员(制作软件片头)、教学多媒体演示制作、军事科学研究和物理、化学或生物化学研究以及所有对三维动画和立体造型感兴趣的广大电脑玩家等。
三Photoshop
Photoshop是平面图像处理业界霸主Adobe公司推出的跨越PC和MAC两界首屈一指的大型图像处理软件它功能强大, *** 作界面友好,得到了广大第三方开发厂家的支持,从而也赢得了众多的用户的青睐
ADOBE PHOTOSHOP最初的程序是由Mchigan大学的研究生Thomas创建,后经Knoll兄弟以及ADOBE公司程序员的努力ADOBE PHOTOSHOP产生巨大的转变,一举成为优秀的平面设计编辑软件。它的诞生可以说掀起了图象出版业的革命,目前ADOBE PHOTOSHOP最新版本为60,它的每一个版本都增添新的功能这使它获得越来越多的支持者也使它在这诸多的图形图象处理软件中立于不败之地。
Adobe产品的升级更新速度并不快,但每一次推出新版总会有令人惊喜的重大革新Photoshop从当年名噪一时的图形处理新秀经过30,40,50,55的不断升级,直到目前最新的60版,功能越来越强大,处理领域也越来越宽广,逐渐建立了图像处理的霸主地位
Photoshop支持众多的图像格式,对图像的常见 *** 作和变换做到了非常精细的程度,使得任何一款同类软件都无法望其颈背;它拥有异常丰富的插件(在Photoshop中叫滤镜),熟练后您自然能体会到"只有想不到,没有做不到"的境界
而这一切,Photoshop都为我们提供了相当简捷和自由的 *** 作环境,从而使我们的工作游刃有余从某种程度上来讲,Photoshop本身就是一件经过精心雕琢的艺术品,更像为您度身定做的衣服,刚开始使用不久就会觉得的倍感亲切
当然,简捷并不意味着傻瓜化,自由也并非随心所欲,Photoshop仍然是一款大型处理软件,想要用好它更不会在朝夕之间,只有长时间的学习和实际 *** 作我们才能充分贴近它

大家也可以到Ray的网站查看本教程的中文版本。Simple Breakout Game ScreenshotBbox2d是一个非常强大的物理引擎库,同时它与cocos2d结合非常适合在iphone上面做游戏开发。著名的angry birds,tiny wings都是用box2d写的。你可以用它做好多事情,当然,最好的学习方法就是使用它来创建一个简单的游戏。在这个教程中,我们将一步一步创建一个简单的breakout游戏,完成碰撞检测,篮球反d物理效果,通过touch拖动paddle(就是上图的白色矩形),以及胜利/失败的场景。 (Jump to part two of the series)如果你还不了解cocos2d和box2d,你可能先要读一读 《如何使用cocos2d制作一个简单的iphone游戏》 以及《在cocos2d里面如何使用box2d物理引擎:d球》好了,是时候制作breakout了!一个永远反d的球S首先,打开Xcode,选择 cocos2d-0991 Box2d Application template创建一个工程,命名为“ Box2DBreakout” 删除掉模板代码,因此你会有一个空的工程来重新开始—具体步骤可以参照 《在cocos2d里面如何使用box2d物理引擎:d球》 这个教程。一旦你有了一个很好的干净的工程后,接下来,在HelloWorldSceneh中导入下面的头文件: #import "Box2Dh" 同时在HelloWorld类中添加以下成员变量: b2World _world; b2Body _groundBody; b2Fixture _bottomFixture; b2Fixture _ballFixture; 然后在HelloWorldScenemm文件顶部定义比率: #define PTM_RATIO 32 这个比率我们在上一个教程中已经讨论过了,这里就不再啰嗦了。然后,在init方法中加入下列代码: CGSize winSize = [CCDirector sharedDirector]winSize; // Create a world b2Vec2 gravity = b2Vec2(00f, 00f); bool doSleep = true; _world = new b2World(gravity, doSleep); // Create edges around the entire screen b2BodyDef groundBodyDef; groundBodyDefpositionSet(0,0); _groundBody = _world->CreateBody(&groundBodyDef); b2PolygonShape groundBox; b2FixtureDef groundBoxDef; groundBoxDefshape = &groundBox; groundBoxSetAsEdge(b2Vec2(0,0), b2Vec2(winSizewidth/PTM_RATIO, 0)); _bottomFixture = _groundBody->CreateFixture(&groundBoxDef); groundBoxSetAsEdge(b2Vec2(0,0), b2Vec2(0, winSizeheight/PTM_RATIO)); _groundBody->CreateFixture(&groundBoxDef); groundBoxSetAsEdge(b2Vec2(0, winSizeheight/PTM_RATIO), b2Vec2(winSizewidth/PTM_RATIO, winSizeheight/PTM_RATIO)); _groundBody->CreateFixture(&groundBoxDef); groundBoxSetAsEdge(b2Vec2(winSizewidth/PTM_RATIO, winSizeheight/PTM_RATIO), b2Vec2(winSizewidth/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:@"Balljpg" rect:CGRectMake(0, 0, 52, 52)]; ballposition = ccp(100, 100); balltag = 1; [self addChild:ball]; 这里没什么疑问,我们已经做过好多次类似的事情了。注意,我们为篮球设置了一个tag标识,后面你会看到,这个tag标记有什么用。接下来,为shape创建一个body: // Create ball body b2BodyDef ballBodyDef; ballBodyDeftype = b2_dynamicBody; ballBodyDefpositionSet(100/PTM_RATIO, 100/PTM_RATIO); ballBodyDefuserData = ball; b2Body ballBody = _world->CreateBody(&ballBodyDef); // Create circle shape b2CircleShape circle; circlem_radius = 260/PTM_RATIO; // Create shape definition and add to body b2FixtureDef ballShapeDef; ballShapeDefshape = &circle; ballShapeDefdensity = 10f; ballShapeDeffriction = 0f; ballShapeDefrestitution = 10f; _ballFixture = ballBody->CreateFixture(&ballShapeDef); 这个看起来和上一篇教程中的也很像。再巩固一下吧,为了创建一个body对象,我们先要创建一个body定义结构,然后再创建body,接着是shape,再指定fixture结构,最后是创建fixture对象。更新:注意,我们也把球的摩擦力设置为0这样可以防止球在碰撞的时候,由于摩擦损失能量,导致来回碰撞的过程中会有一点点偏差。好了,是时候做一些完全不同的事了!紧接上面的代码: b2Vec2 force = b2Vec2(10, 10); ballBody->ApplyLinearImpulse(force, ballBodyDefposition); 这里往球上面施加了一个冲力(impulse),这样可以让它初始化的时候朝一个特定的方向运动。最后一件事情,就是在init方法中,增加一个tick调度方法: [self schedule:@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(); spriteposition = ccp(b->GetPosition()x PTM_RATIO, b->GetPosition()y PTM_RATIO); spriterotation = -1 CC_RADIANS_TO_DEGREES(b->GetAngle()); } } } 当然,这里也和上一个教程中的一样,没有什么特别的。最后一件事我们永远不忘记!那就是清理: - (void)dealloc { delete _world; _groundBody = NULL; [super dealloc]; } 好了,让我们试一下吧。编译并运行工程,你将会看到一个球无限地在屏幕里面来回d!—-很酷吧!增加Paddle如果没有一个paddle的话,那么就不可能称其为一个breakout游戏。下载我制作的paddle 然后把它拖到Resources文件夹中,同时确保 “Copy items into destination group’s folder (if needed)” 被复选上。然后在HelloWorldSceneh文件中往HelloWorld类中添加下列成员变量: b2Body _paddleBody; b2Fixture _paddleFixture; 然后,在init方法中构建paddle body: // Create paddle and add it to the layer CCSprite paddle = [CCSprite spriteWithFile:@"Paddlejpg"]; paddleposition = ccp(winSizewidth/2, 50); [self addChild:paddle]; // Create paddle body b2BodyDef paddleBodyDef; paddleBodyDeftype = b2_dynamicBody; paddleBodyDefpositionSet(winSizewidth/2/PTM_RATIO, 50/PTM_RATIO); paddleBodyDefuserData = paddle; _paddleBody = _world->CreateBody(&paddleBodyDef); // Create paddle shape b2PolygonShape paddleShape; paddleShapeSetAsBox(paddlecontentSizewidth/PTM_RATIO/2, paddlecontentSizeheight/PTM_RATIO/2); // Create shape definition and add to body b2FixtureDef paddleShapeDef; paddleShapeDefshape = &paddleShape; paddleShapeDefdensity = 100f; paddleShapeDeffriction = 04f; paddleShapeDefrestitution = 01f; _paddleFixture = _paddleBody->CreateFixture(&paddleShapeDef); 我不想花太多的时间解释上面的内容了。因为,和之前的创建篮球的body的过程差不太多。这里只给出不同的地方:当你创建CCSprite的时候,你并不需要指定精灵的大小。如果你传递一个文件名给它,它会自动计算出大小。注意,这里不是使用circle shape了。这一次,我们使用polygon shape。我们使用一个辅助方法来创建shape,当然,其形状是个盒子。我们使用了SetAsBox方法来指定shape相对于body的位置,这个方法在构建复杂的对象的时候比较有用。这里,我们只是让shape在body中间。我把paddle的密度设置得比球要大得多,同时调节了一下其它的参数。(这些参数要靠试,按照真实的高中物理知识去计算,可能得不到)同时,我们存储paddleBody和paddleFixture的引用,为了方便后面使用。如果你编译并运行的话,你将会看到屏幕中间有一个paddle,而且球碰到它将会反d。 然后,这还不是很有趣,因为我们还不能移动paddle!移动Paddle移动paddle需要touch事件,所以先在init方法中允许touch事件: selfisTouchEnabled = YES; 然后,在HelloWorldSceneh的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(locationx/PTM_RATIO, locationy/PTM_RATIO); if (_paddleFixture->TestPoint(locationWorld)) { b2MouseJointDef md; mdbodyA = _groundBody; mdbodyB = _paddleBody; mdtarget = locationWorld; mdcollideConnected = true; mdmaxForce = 10000f _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(locationx/PTM_RATIO, locationy/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(10f, 00f); jointDefcollideConnected = true; jointDefInitialize(_paddleBody, _groundBody, _paddleBody->GetWorldCenter(), worldAxis); _world->CreateJoint(&jointDef); 第一件事情就是指定一个沿着x轴的向量。然后,我们需要指定collideConnected为true,因此,我们的球才能够正确的反d,而不是飞到屏幕之外去。然后,初始化关节,指定paddle和ground两个body,再使用world对象来创建关节!更新:我第一次尝试去修正这个bug的时候,我通过直接调整球的速度,使用SetLinearVelocity方法。然后,Steve Oldmeadow也指出,这非常不好!它会破坏物理仿真,最好的方法是通过调用SetLinearDamping方法,间接影响速度。因此,现在这个教程就是这个做的。(damping就是阻尼的意思)接下来,在tick方法中添加下列代码,具体位置是在获得user data之后: if (spritetag == 1) { static int maxSpeed = 10; b2Vec2 velocity = b->GetLinearVelocity(); float32 speed = velocityLength(); if (speed > maxSpeed) { b->SetLinearDamping(05); } else if (speed < maxSpeed) { b->SetLinearDamping(00); } } 这里,我们判断sprite的tag,看是否是球的tag。如果是的话,我们就检查它的速度,如果太大的话,就设置它的阻尼为05,这样可以让它慢下来。如果你编译并运行的话,你将会看到一个球以非常适中的速度在屏幕四周来回反d。给我源代码!这里是本教程的 完整源代码 。这只是一部分,第二部分的教程会包含一个完整的breakout的源码。接下来呢?目前为止,我们已经有一个篮球在屏幕四周来回反d了,同时还有一个paddle可以用鼠标来控制其移动。在下个教程中,我们将创建一些方块,当球碰到它们的时候,方块就会消失。

现在用的应该是Box2Dv22或者更新的版本,其中,b2Worldconstructor
只有一个有关重力的参数,不再像之前那样会设置两个参数。所以,必须要分开设定doSleep的相关变量。
当然,这也不是唯一的办法,在Kobold2D中,有一个Box2D221的样例项,这样,即使不用Kobold2D,也可以获得有关Box2D基础数据的更新。尤其当需要设定GLESDebugDrawclass,或者是需要用不同形状的body设定屏幕的边界框时,都可以采用这种方法。

主要是C#。

游戏编程也是编程,都是需要敲代码的。所以基本的语言基本功是不能少的,比如C语言或者C++或者C#至少要精通其中一门。精通到什么地步呢,基本数据结构和基础的算法还有设计模式你得非常熟悉。这样算是入门了。

接下来你就可以选择一个游戏引擎了,市面上主流的游戏引擎有两种一个Unity3D一个虚幻四。但是这两款引擎的脚本语言并不一样,Unity是C#虚幻四是C++所以在学习之前要想好使用引擎开发什么类型的游戏。

主要学的内容如下:

1游戏程序设计:C++程序设计入门;基本数据类型和输入输出;流程控制语句;数组、指针和引用、函数;程序结构和书写规;范结构体和联合体、类;继承与多态;异常处理与程序调试。

2算法与数据结构:算法分析;数据结构;基本算法;STL的概念与使用;静态库与动态库;XML库的使用。

3Win32程序设计:Windows程序入门;Windows消息;GDI绘图游戏工具与MFC;网络编程基础。

4游戏数学和智能应用:游戏中的坐标系;矢量、矩阵;几何碰撞;物理模拟;人工智能与寻路算法。

52D游戏技术与应用:2D游戏技术概论;游戏地图系统;GUI系统;战斗系统设计;任务系统;优秀的声音引擎BASS;Cocos2D-X引擎;Box2D物理引擎。

互联网行业目前还是最热门的行业之一,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。

想要系统学习,你可以考察对比一下开设有相关专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,能够在校期间取得大专或本科学历,中博软件学院、南京课工场、南京北大青鸟等开设相关专业的学校都是不错的,建议实地考察对比一下。

祝你学有所成,望采纳。


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

原文地址: http://outofmemory.cn/yw/12819973.html

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

发表评论

登录后才能评论

评论列表(0条)

保存