文档章节

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

crossmix
 crossmix
发布于 2015/09/21 23:20
字数 2290
阅读 95
收藏 8

   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")
 
function Control:create(layer,positionY)
 
   local control=Control.new()
 
    control:init(layer,positionY)
 
return control
     
end
 
function Control: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
 
---
--@param cc.Layer layer
function Control:init(layer,positionY)
 
    self.size=cc.Director:getInstance():getWinSize()
 
   self.layer=layer
   self.positionY=positionY
     
    --创建一个英雄精灵
    local hero=Hero:createHero()
    print(self.positionY+hero:getContentSize().height / 2)
    hero:setPosition(50,self.positionY+hero:getContentSize().height / 2)
    self.layer:addChild(hero)
     
 
--跳跃按钮
    local itemControl=cc.MenuItemImage:create(Res.control_n,Res.control_p)
    itemControl:setScale(0.35)
    itemControl:setPosition( self.size.width-40,30)
    itemControl:registerScriptTapHandler(function()
 
            if hero:getPositionY() < hero:getContentSize().height + self.positionY then
 
                hero:getPhysicsBody():setVelocity(cc.p(0, 500))
 
            end
            
 
    end)
 
    local menu=cc.Menu:create(itemControl)
    menu:setPosition(0,0)
    self.layer:addChild(menu)
     
     
    --速度变化特效
    self.effectLabel=cc.Label:createWithTTF("","fonts/Marker Felt.ttf", 32)
    self.effectLabel:setColor(cc.c3b(0,0,0))
    self.effectLabel:enableGlow(cc.c4b(0,0,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
 
 ---
    --@param touch cc.Touch
    --@param event cc.Event
--   function Control:r(touch, event)
--  
--   end
     
 
function Control:reset()
 
    self.createBlockHero=0
    self.nextBlockHero=math.random(0,99)+120
     
end
 
--创建障碍物精灵 score分数
function Control:updateBlock(score)
 
    --createBlockHero计数增加
    self.createBlockHero=self.createBlockHero+1
     
     
--  随机时间生成障碍物
    if self.createBlockHero >= self.nextBlockHero then
     
        
        --控制障碍物移动的速度
        ---
        --@param cc.Sprite blockSprite
        local blockSprite=Block:createBlock(self.blockSpeed)
        
        if score >=20 and score < 50 then
            
            print("blockSpeed:",self.blockSpeed)
            if self.blockSpeed < 3 then
                 
                self:test("+3")
               self.blockSpeed=3
                 
            end
             
            
             
        elseif score >=50 and score < 80 then
 
 
            if self.blockSpeed < 3 then
                self:test("+5")
                self.blockSpeed=5
            end
           
             
        elseif score >=80 and score < 100 then
 
            if self.blockSpeed < 5 then
                self:test("+6")
                self.blockSpeed=6
            end
             
             
        elseif score >=100 and score < 150 then
 
            if self.blockSpeed < 6 then
                self:test("+7")
                self.blockSpeed=7
            end
             
        elseif score >=150 and score < 180 then
 
            if self.blockSpeed < 7 then
                self:test("+8")
                self.blockSpeed=8
            end
             
        elseif score >=180 and score < 250 then
         
            if self.blockSpeed < 8 then
                self:test("+10")
                self.blockSpeed=10
            end
         
        elseif score >= 250 and score < 320 then
         
            if self.blockSpeed < 10 then
                self:test("+12")
                self.blockSpeed=12
            end
             
        elseif score >= 320 and score < 400 then
 
            if self.blockSpeed < 12 then
                self:test("+15")
                self.blockSpeed=15
            end
             
        elseif score >= 400 then
 
            if self.blockSpeed < 15 then
                self:test("+18")
                self.blockSpeed=18
            end
         
        end
         
        --取整0、2
        math.randomseed(os.time())
        local index1=math.floor(math.random(0,1))
        local positionX1=self.size.width
        local positionY1=math.random(self.positionY+120+10,self.size.height-35)
         
         
if index1 >= 1 then
 
            for i=0 ,index1 do
 
                local gem=Gem:cretateGem()
                gem:setPosition(positionX1,positionY1)
                self.layer:addChild(gem)
 
                gem:setGemSpeed(1)
                positionX1=positionX1-25
 
            end
     
end
         
         
         
        --取整0、2
        math.randomseed(os.time())
        local index2=math.floor(math.random(0,2))
        local positionX2=self.size.width;
         
        if index2 >= 1 then
         
            for i=0,index2 do
 
                local gem=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
 
 
function Control: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
 
 
function Control:setBlockSpeed(speed)
    self.blockSpeed=speed
end
 
function Control:getBlockSpeed()
    return self.blockSpeed

end


 
 
return Control

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 ()
 
        return cc.LayerColor:create(cc.c4b(255,255,255,255))
     
end)
 
 
function GameLayer:ctor()
 
--控制类
self.control=nil
     
self.score=0
 
self.gem=0     
     
end
 
function GameLayer:createLayer()
    local layer=GameLayer.new()
     
    layer:bg()
     
    return layer
end
 
 
--游戏背景图
function GameLayer:bg()
 
    local size=cc.Director:getInstance():getWinSize()
 
    --创建一个围绕屏幕四周的物理边界
    local node=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)
     
     
     
--  地面(一条线)
    local edgeSprite=cc.Sprite:create()
    edgeSprite:setTextureRect(cc.rect(0,0,size.width,2))
    edgeSprite:setColor(cc.c3b(125, 125, 0))
    edgeSprite:setPosition(size.width/2,50)
    self:addChild(edgeSprite)
     
    --分数
    local labelScore=cc.Label:createWithTTF("","fonts/Marker Felt.ttf", 20)
    labelScore:setColor(cc.c3b(0,0,0))
    labelScore:setString(self.score)
    labelScore:setPosition(size.width-80,size.height-35)
    self:addChild(labelScore)
     
    --宝石个数
    local labelGem=cc.Label:createWithTTF("","fonts/Marker Felt.ttf", 28)
    labelGem:setColor(cc.c3b(0,0,0))
    labelGem:setString(self.gem)
    labelGem:setPosition(size.width-180,size.height-35)
    self:addChild(labelGem)
     
    --宝石
    local cache=cc.SpriteFrameCache:getInstance()
    cache:addSpriteFrames(Res.gemPlist,Res.gemPng)
     
     
     
    self.control=Control:create(self,50)
     
    local spGem=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时才会发生碰撞检测和发送接触事件通知  
     
    --  碰撞监听
    local conListener=cc.EventListenerPhysicsContact:create();
    conListener:registerScriptHandler(function(contact)
 
            print("---contact-碰撞了--")
             
            --    处理游戏中精灵碰撞逻辑
            local node1=contact:getShapeA():getBody():getNode()
            local name1=node1:getName()
            local tag1=node1:getTag()
            print("name1:",name1)
           
 
            local node2=contact:getShapeB():getBody():getNode()
            local name2=node2:getName()
            local tag2=node2:getTag()
            print("name2:",name2)
             
            --英雄碰到宝石
            if name1 == "gem" then
             
            local x,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)))
                 
                if nil ~= node1 then
                    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)))
             
            --英雄碰到障碍物死亡
            elseif name1 == "hero" then
             
                local x,y=node2:getPosition()
                 
                cc.Director:getInstance():replaceScene(StartGame:createScene())
                 
            elseif name2 == "hero" then
 
                local x,y=node2:getPosition()
 
                cc.Director:getInstance():replaceScene(StartGame:createScene())
             
            end
             
            return true
    end,cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)
 
    cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(conListener,self)
     
end
 
return GameLayer

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 ()
    return cc.Scene:createWithPhysics()
     
end)
 
function GameScene:createScene()
 
    local scene=GameScene.new()
 
    --  设置调试
--    scene:getPhysicsWorld():setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL)
    scene:getPhysicsWorld():setGravity(cc.p(0, -1000))
 
    local layer=GameLayer:createLayer()
 
    scene:addChild(layer)
    
    return scene
 
end
 
 
return GameScene

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
local cclog = function(...)
    print(string.format(...))
end
 
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
    cclog("----------------------------------------")
    cclog("LUA ERROR: " .. tostring(msg) .. "\n")
    cclog(debug.traceback())
    cclog("----------------------------------------")
    return msg
end
 
local function main()
    collectgarbage("collect")
    -- avoid memory leak
    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)
     
    --进入游戏场景
    local scene = require("StartGame")
    local gameScene =scene:createScene()
 
     
    if cc.Director:getInstance():getRunningScene() then
        cc.Director:getInstance():replaceScene(gameScene)
    else
        cc.Director:getInstance():runWithScene(gameScene)
    end
 
end
 
 
local status, msg = xpcall(main, __G__TRACKBACK__)
if not status then
    error(msg)
end
11、这里发布到android上,Cocos Code IDE提供了一键发布,非常的好用,需要设置下环境

然后选择项目打包

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

游戏开发完毕。

end

© 著作权归作者所有

crossmix
粉丝 72
博文 305
码字总数 645711
作品 0
广州
高级程序员
私信 提问
Cocos 2d-x 游戏引擎全面支持 Facebook 平台

在 2014年10月28日的Cocos开发者大会上,触控科技宣布,在Facebook的协助和支持下,触控科技对旗下开源引擎Cocos 2d-x进行了更新,正式启动对Facebook平台的全面支持。今后,Cocos 2d-x的开发...

oschina
2014/10/29
1K
1
关东升老师双十一大回馈!购课送书啦~~~

关东升老师的大名想必各位都听说过吧~~~ 【关东升老师的简介】 精通多种IT技术,参与设计和开发北京市公交一卡通百亿级大型项目,开发国家农产品追溯系统、金融系统微博等移动客户端项目,...

51CTO学院
2017/11/08
0
0
iMeteOra/cocos2d-x-qt

cocos2d-x-3.0alpha 中看到了Qt后端支持, 把它的.pro收纳囊肿! 其它的, 看有啥可以借鉴的吧. quick-cocos2d-x 是一个可以让您觉得“爽快”的 cocos2d-x 的扩展版。基于 cocos2d-x,完全的跨平...

iMeteOra
2014/04/28
0
0
CocoStudio for MAC版本正式发布

6月17日CocoStudio for MAC V1.0.0.0 Alpha版本正式发布,此版本是游戏开发工具集CocoStudio的MAC版。它沿承CocoStudio“低成本、高效率”最大限度方便开发者的宗旨,让使用OSX系统的用户享受...

Melvinmeng
2014/06/17
1K
30
奇块科技CEO孙剑锋:传统游戏如何使用 Cocos 做区块链改造

奇块科技CEO孙剑锋:传统游戏如何使用 Cocos 做区块链改造 2018-08-28 10:57编辑: Gboy分类:区块链来源:Cocos-BCX 区块链 招聘信息: iOS开发 iOS开发 iOS开发 app开发上架H5技术 app开发...

Gboy
2018/08/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
43分钟前
3
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
4
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部