微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cocos 2d-x游戏开发启示录创世纪新篇

cocos 2d-x可以在pc电脑window,mac操作系统上开发游戏,也可以在移动设备上开发游戏,比如Android,windowphone等上开发,集成开发环境是:visual studio,eclipse,游戏引擎包括:粒子场景,物理引擎,瓦片区域等等。

cocos 2d-x支持三种脚本语言:如c++,JavaScript,lua,你至少要熟悉一门脚本语言。

下面以cocos 2d-x的lua脚本语言开发一款《黑人小心》的游戏。开发工具是cocos IDE

先看看效果图:

1、项目结构

2、编写游戏的开始场景 StartGame.lua

开始场景只有一个开始按钮和结束按钮,比较简单

3、编写游戏中的小黑人精灵,小黑人精灵是一个精灵动画,并为小黑人创建一个矩形的刚体,用于碰撞检测

hero lua

4、编写游戏中的障碍物

5、编写游戏中的宝石精灵

gem lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
--控制精灵的动作
Control=class("Control")
functionControl:create(layer,positionY)
localcontrol=Control.new()
control:init(layer,positionY)
returncontrol
end
functionControl:ctor()
self.size=nil
self.layer=nil
self.positionY=nil
self.effectLabel=nil
--移动的速度
self.blockSpeed=2
--控制什么时候创建障碍物精灵
self.createBlockHero=nil
self.nextBlockHero=nil
--控制什么时候创建宝石
self.createGem=nil
self.nextGem=nil
end
---
--@paramcc.Layerlayer
functionControl:init(layer,positionY)
self.size=cc.Director:getInstance():getWinSize()
self.layer=layer
self.positionY=positionY
--创建一个英雄精灵
localhero=Hero:createHero()
print(self.positionY+hero:getContentSize().height/2)
hero:setPosition(50,self.positionY+hero:getContentSize().height/2)
self.layer:addChild(hero)
--跳跃按钮
localitemControl=cc.MenuItemImage:create(Res.control_n,Res.control_p)
itemControl:setScale(0.35)
itemControl:setPosition(self.size.width-40,30)
itemControl:registerScriptTapHandler(function()
ifhero:getPositionY()<hero:getContentSize().height+self.positionYthen
hero:getPhysicsBody():setVeLocity(cc.p(0,500))
end
end)
localmenu=cc.Menu:create(itemControl)
menu:setPosition(0,0)
self.layer:addChild(menu)
--速度变化特效
self.effectLabel=cc.Label:createWithTTF("","fonts/MarkerFelt.ttf",32)
self.effectLabel:setColor(cc.c3b(0,0))
self.effectLabel:enableGlow(cc.c4b(0,0))
self.effectLabel:setPosition(self.size.width-50,self.positionY+self.size.height/2-self.effectLabel:getContentSize().height/2)
self.layer:addChild(self.effectLabel)
--self.effectLabel:setVisible(false)
--初始化计数参数
self:reset()
end
---
--@paramtouchcc.Touch
--@parameventcc.Event
--functionControl:r(touch,event)
--
--end
functionControl:reset()
self.createBlockHero=0
self.nextBlockHero=math.random(0,99)+120
end
--创建障碍物精灵score分数
functionControl:updateBlock(score)
--createBlockHero计数增加
self.createBlockHero=self.createBlockHero+1
-- 随机时间生成障碍物
ifself.createBlockHero>=self.nextBlockHerothen
--控制障碍物移动的速度
---
--@paramcc.SpriteblockSprite
localblockSprite=Block:createBlock(self.blockSpeed)
ifscore>=20andscore<50then
print("blockSpeed:",self.blockSpeed)
ifself.blockSpeed<3then
self:test("+3")
self.blockSpeed=3
end
elseifscore>=50andscore<80then
ifself.blockSpeed<3then
self:test("+5")
self.blockSpeed=5
end
elseifscore>=80andscore<100then
ifself.blockSpeed<5then
self:test("+6")
self.blockSpeed=6
end
elseifscore>=100andscore<150then
ifself.blockSpeed<6then
self:test("+7")
self.blockSpeed=7
end
elseifscore>=150andscore<180then
ifself.blockSpeed<7then
self:test("+8")
self.blockSpeed=8
end
elseifscore>=180andscore<250then
ifself.blockSpeed<8then
self:test("+10")
self.blockSpeed=10
end
elseifscore>=250andscore<320then
ifself.blockSpeed<10then
self:test("+12")
self.blockSpeed=12
end
elseifscore>=320andscore<400then
ifself.blockSpeed<12then
self:test("+15")
self.blockSpeed=15
end
elseifscore>=400then
ifself.blockSpeed<15then
self:test("+18")
self.blockSpeed=18
end
end
--取整0、2
math.randomseed(os.time())
localindex1=math.floor(math.random(0,1))
localpositionX1=self.size.width
localpositionY1=math.random(self.positionY+120+10,self.size.height-35)
ifindex1>=1then
fori=0,index1do
localgem=Gem:cretateGem()
gem:setPosition(positionX1,positionY1)
self.layer:addChild(gem)
gem:setGemSpeed(1)
positionX1=positionX1-25
end
end
--取整0、2
math.randomseed(os.time())
localindex2=math.floor(math.random(0,2))
localpositionX2=self.size.width;
ifindex2>=1then
fori=0,index2do
localgem=Gem:cretateGem()
gem:setPosition(positionX2,self.positionY+gem:getContentSize().height/5)
self.layer:addChild(gem)
gem:setGemSpeed(self.blockSpeed)
positionX2=positionX2+25
end
end
blockSprite:setPosition(positionX2+10,self.positionY+blockSprite:getContentSize().height/2)
self.layer:addChild(blockSprite)
--重新计数
self:reset()
end
end
functionControl:test(effectType)
self.effectLabel:setString(effectType)
self.effectLabel:setVisible(true)
print("effectLabel")
self.effectLabel:runAction(cc.Sequence:create(cc.Scaleto:create(1,2),cc.CallFunc:create(function(sender)
sender:setVisible(false)

end)))


end
functionControl:setBlockSpeed(speed)
self.blockSpeed=speed
end
functionControl:getBlockSpeed()
returnself.blockSpeed

end


returnControl

7、编写游戏层 GameLayer.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
GameLayer=class("GameLayer",function()
returncc.LayerColor:create(cc.c4b(255,255,255))
end)
functionGameLayer:ctor()
--控制类
self.control=nil
self.score=0
self.gem=0
end
functionGameLayer:createLayer()
locallayer=GameLayer.new()
layer:bg()
returnlayer
end
--游戏背景图
functionGameLayer:bg()
localsize=cc.Director:getInstance():getWinSize()
--创建一个围绕屏幕四周的物理边界
localnode=cc.Node:create()
node:setPhysicsBody(cc.PhysicsBody:createEdgeBox(cc.size(size.width,size.height),cc.PHYSICSBODY_MATERIAL_DEFAULT,5))
node:setPosition(size.width/2,size.height/2+50)
self:addChild(node)
-- 地面(一条线)
localedgeSprite=cc.Sprite:create()
edgeSprite:setTextureRect(cc.rect(0,size.width,2))
edgeSprite:setColor(cc.c3b(125,125,0))
edgeSprite:setPosition(size.width/2,50)
self:addChild(edgeSprite)
--分数
locallabelscore=cc.Label:createWithTTF("",20)
labelscore:setColor(cc.c3b(0,0))
labelscore:setString(self.score)
labelscore:setPosition(size.width-80,size.height-35)
self:addChild(labelscore)
--宝石个数
locallabelGem=cc.Label:createWithTTF("",28)
labelGem:setColor(cc.c3b(0,0))
labelGem:setString(self.gem)
labelGem:setPosition(size.width-180,size.height-35)
self:addChild(labelGem)
--宝石
localcache=cc.SpriteFrameCache:getInstance()
cache:addSpriteFrames(Res.gemPlist,Res.gemPng)
self.control=Control:create(self,50)
localspGem=cc.Sprite:createWithSpriteFrameName("green.png")
spGem:setPosition(size.width-220,size.height-35)
spGem:setScale(0.5)
self:addChild(spGem)
self:scheduleUpdateWithPriorityLua(function(dt)
--分数
self.score=self.score+dt
labelscore:setString(string.format("%#.2f",self.score))
self.control:updateBlock(self.score)
end,0)
--一个body的CategoryBitmask和另一个body的ContactTestBitmask的逻辑与的结果不等于0时,接触事件将被发出,否则不发送。
--一个body的CategoryBitmask和另一个body的CollisionBitmask的逻辑与结果不等于0时,他们将碰撞,否则不碰撞
--需要两个body相互位与运算的值都是大于0时才会发生碰撞检测和发送接触事件通知
--碰撞监听
localconListener=cc.EventListenerPhysicsContact:create();
conListener:registerScriptHandler(function(contact)
print("---contact-碰撞了--")
--处理游戏中精灵碰撞逻辑
localnode1=contact:getShapeA():getBody():getNode()
localname1=node1:getName()
localtag1=node1:getTag()
print("name1:",name1)
localnode2=contact:getShapeB():getBody():getNode()
localname2=node2:getName()
localtag2=node2:getTag()
print("name2:",name2)
--英雄碰到宝石
ifname1=="gem"then
localx,y=node1:getPosition()
self.gem=self.gem+1
labelGem:setString(string.format("%s",self.gem))
labelGem:runAction(cc.Sequence:create(cc.Scaleto:create(0.2,1.5),cc.CallFunc:create(
function(sender)
sender:runAction(cc.Scaleto:create(0.1,1))
end)))
ifnil~=node1then
self:removeChild(node1,true)
end
--node1:runAction(cc.Sequence:create(cc.Spawn:create(cc.Moveto:create(0.1,cc.p(node1:getPositionX(),node1:getPositionY()+50)),cc.Scaleto:create(0.1,0.5),cc.FadeOut:create(0.1)),
--cc.CallFunc:create(function(sender)
--self:removeChild(sender,true)
--end)))
--英雄碰到障碍物死亡
elseifname1=="hero"then
localx,y=node2:getPosition()
cc.Director:getInstance():replaceScene(StartGame:createScene())
elseifname2=="hero"then
localx,y=node2:getPosition()
cc.Director:getInstance():replaceScene(StartGame:createScene())
end
returntrue
end,cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)
cc.Director:getInstance():getEventdispatcher():addEventListenerWithSceneGraPHPriority(conListener,self)
end
returnGameLayer

8、编写游戏场景 GameScene.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
--游戏场景
GameScene=class("GameScene",function()
returncc.Scene:createWithPhysics()
end)
functionGameScene:createScene()
localscene=GameScene.new()
--设置调试
--scene:getPhysicsWorld():setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL)
scene:getPhysicsWorld():setGravity(cc.p(0,-1000))
locallayer=GameLayer:createLayer()
scene:addChild(layer)
returnscene
end
returnGameScene

9、这里我用类把图片和加载的Lua文件封装了

Require.lua 游戏加载的Lua文件

1
2
3
4
5
6
7
8
9
10
11
12
13
--引入lua类
require("Cocos2d")
require("Cocos2dConstants")
require("bitExtend")
require("src/game/res/Res")
require("src/game/start/StartGame")
require("src/game/scene/GameScene")
require("src/game/scene/GameLayer")
require("src/game/sprite/Block")
require("src/game/sprite/Hero")
require("src/game/sprite/Control")
require("src/game/sprite/Gem")

Res.lua 游戏用到的图片资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--图片资源类
Res={}
--开始按钮
Res.start_n="qq_n.png"
Res.start_p="qq_p.png"
Res.heroPng="hero.png"
Res.heroPlist="hero.plist"
Res.control_n="control_n.png"
Res.control_p="control_p.png"
Res.gemPlist="gem.plist"
Res.gemPng="gem.png"

10、修改main.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
--引入lua文件
require"src/game/res/Require"
--cclog
localcclog=function(...)
print(string.format(...))
end
--forccluaEnginetraceback
function__G__TRACKBACK__(msg)
cclog("----------------------------------------")
cclog("LUAERROR:"..tostring(msg).."\n")
cclog(debug.traceback())
cclog("----------------------------------------")
returnmsg
end
localfunctionmain()
collectgarbage("collect")
--avoidmemoryleak
collectgarbage("setpause",100)
collectgarbage("setstepmul",5000)
cc.FileUtils:getInstance():addSearchPath("src")
cc.FileUtils:getInstance():addSearchPath("res")
cc.FileUtils:getInstance():addSearchPath("src/game/res")
cc.FileUtils:getInstance():addSearchPath("src/game/start")
cc.FileUtils:getInstance():addSearchPath("src/game/scene")
cc.FileUtils:getInstance():addSearchPath("src/game/sprite")
cc.FileUtils:getInstance():addSearchPath("res/game")
cc.FileUtils:getInstance():addSearchPath("res/game/hero")
cc.FileUtils:getInstance():addSearchPath("res/game/gem")
cc.Director:getInstance():getopenGLView():setDesignResolutionSize(480,320,0)
cc.Director:getInstance():setdisplayStats(false)
--进入游戏场景
localscene=require("StartGame")
localgameScene=scene:createScene()
ifcc.Director:getInstance():getRunningScene()then
cc.Director:getInstance():replaceScene(gameScene)
else
cc.Director:getInstance():runWithScene(gameScene)
end
end
localstatus,msg=xpcall(main,__G__TRACKBACK__)
ifnotstatusthen
error(msg)
end
11、这里发布到android上,Cocos Code IDE提供了一键发布,非常的好用,需要设置下环境

然后选择项目打包

等待几分钟就会看到打包成功了

游戏开发完毕。

end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建