第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

cocos2dx游戲怎么使用腳本?

cocos2dx游戲怎么使用腳本?

ibeautiful 2018-09-03 14:10:15
cocos2dx游戲怎么使用腳本
查看完整描述

1 回答

?
桃花長(zhǎng)相依

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊

對(duì)于游戲公司而言,采用游戲腳本lua、python等進(jìn)行開(kāi)發(fā)也很常見(jiàn),但是很多童鞋對(duì)腳本并沒(méi)有很熟悉的概念,本篇?jiǎng)t向大家簡(jiǎn)單介紹腳本的用途以及在Cocos2dx基礎(chǔ)用法;
Lua和python這些詳細(xì)介紹的話,請(qǐng)不太熟悉的童鞋自行百度百科哈,那么對(duì)于lua和python則是兩個(gè)常用的腳本語(yǔ)言,lua相對(duì)于python而言,lua比較輕量級(jí)罷了,而其他區(qū)別就不多說(shuō)了,但是為什么本章要講解lua的原因則有兩點(diǎn),首先第一:cocos2dx 游戲引擎內(nèi)嵌lua,第二點(diǎn):自從“令人憤怒的小鳥(niǎo)”火起來(lái)之后,國(guó)內(nèi)很多都偏向于使用lua了=。 =
那么對(duì)于腳本的用途這里也大概說(shuō)兩點(diǎn):
1. 腳本在手游中是類(lèi)于“大腦”的功能,所有游戲相關(guān)的邏輯代碼一般都放在腳本中,而客戶端(前臺(tái))的代碼都則屬于“肢體”,也可以說(shuō)是“播放器”,作用只是用戶展示出UI界面的功能;那么腳本的作用那么不僅僅如此,比如地圖數(shù)據(jù)等都可以利用腳本使用;
2. 腳本在手機(jī)網(wǎng)游中的作用尤為重要,比如一款網(wǎng)游“Himi”沒(méi)有使用腳本,如果“Himi”1.0版本在發(fā)布后突然發(fā)現(xiàn)客戶端出現(xiàn)一些棘手的bug需要修復(fù),那么你想修改那么也要等待再次更新客戶端重新提交發(fā)布才可以解決,這樣會(huì)流失一大批用戶,而且游戲每次更新也會(huì)流失掉部分用戶,這是肯定的;但是如果“Himi”這款網(wǎng)游使用腳本的話,那么解決此類(lèi)問(wèn)題很eazy,比如我在“Himi”游戲中的邏輯代碼都放在腳本a.lua 中,那么如果a.lua邏輯中哪里出現(xiàn)了問(wèn)題,我們直接可以將修復(fù)后的a.lua腳本更新至服務(wù)器中,因?yàn)橐话隳_本都會(huì)定義version號(hào),比如a.lua有bug的version:1.0,那么我們修復(fù)后的a.lua version改成1.1,當(dāng)用戶每次啟動(dòng)游戲的時(shí)候,客戶端都會(huì)將腳本的version與服務(wù)器腳本version做對(duì)比,當(dāng)server端腳本version號(hào)比當(dāng)前腳本新,那么自動(dòng)下載并覆蓋當(dāng)前腳本,OK,問(wèn)題解決;不僅僅如此,比如游戲中做個(gè)活動(dòng)呀,換個(gè)圖片呀等等都可以即使更新,而不是每次修改前端代碼都要重新發(fā)布新的游戲版本,造成一些損失!
OK,不再多說(shuō)了,下面我們來(lái)介紹在Cocos2dx中對(duì)于lua腳本的一些簡(jiǎn)單使用,首先我們通過(guò)新建一個(gè)Cocos2dx-lua模版項(xiàng)目,默認(rèn)此模版中有個(gè)示例,童鞋們可以直接運(yùn)行項(xiàng)目看效果,但是大家可能會(huì)郁悶在class中完全找不到任何相關(guān)的代碼?!?那就對(duì)了,因?yàn)樗羞壿嫶a都放置在了lua腳本中,項(xiàng)目啟動(dòng)后直接解析的一個(gè)名稱為hello.lua的腳本!
打開(kāi)項(xiàng)目的Resources仔細(xì)找下,有沒(méi)有發(fā)現(xiàn)有 hello.lua 合hello2.lua兩個(gè)腳本文件?!OK,就是這里拉。 那么對(duì)于cocos2dx_lua demo的例子腳本我這里不多說(shuō)比較容易,但是肯定不太熟悉的童鞋比較疑惑,那么Himi這里重新整理了一份簡(jiǎn)單的示例腳本代碼,大家可以直接將如下代碼直接復(fù)制到hello.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

require "hello2" -- 包含hello2這個(gè)腳本

-- 注視語(yǔ)句

-- 基本上調(diào)用的cocos2dx函數(shù)和類(lèi)的時(shí)候就是以cocos2d.*這樣子來(lái)用
-- 注意2:function 關(guān)鍵字定義函數(shù),end結(jié)束函數(shù)

-- 打印
cocos2d.CCLuaLog("腳本hello開(kāi)始運(yùn)行... " .. myadd(3, 5))

-- 創(chuàng)建一個(gè)Scene
sceneForWorld = cocos2d.CCScene:node()

-- 創(chuàng)建一個(gè)Layer
layerForWorld = cocos2d.CCLayer:node()
sceneForWorld:addChild(layerForWorld)

-- 創(chuàng)建一個(gè)精靈
spriteForWorld = cocos2d.CCSprite:spriteWithFile("Icon.png")
layerForWorld:addChild(spriteForWorld)

-- 獲取屏幕寬高
screenSize=cocos2d.CCDirector:sharedDirector():getWinSize()

-- 設(shè)置精靈坐標(biāo)
spriteForWorld:setPosition(cocos2d.CCPoint(screenSize.width*0.5,screenSize.height*0.5))

-- 設(shè)置精靈縮放2倍
spriteForWorld:setScale(2)

-- 添加一個(gè)CCLabelTTF (?。。。。。渥ⅲ。。。。。。?br/>myLableTTF =cocos2d.CCLabelTTF:labelWithString("Himi- Lua 基礎(chǔ)","Helvetica-Bold",24)
myLableTTF:setPosition(cocos2d.CCPoint(screenSize.width*0.5,screenSize.height*0.5+100))
sceneForWorld:addChild(myLableTTF)
-- 添加一個(gè)CCLabelTTF
myLableTTF2 =cocos2d.CCLabelTTF:labelWithString("上面icon跟隨用戶觸屏位置","Helvetica-Bold",24)
myLableTTF2:setPosition(cocos2d.CCPoint(screenSize.width*0.5,screenSize.height*0.5-100))
sceneForWorld:addChild(myLableTTF2)

-- @@@@@@@@@@觸摸事件

--開(kāi)啟觸摸
layerForWorld:setIsTouchEnabled(true)

-- 注冊(cè)觸摸事件
layerForWorld.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHBEGAN, "btnTouchBegin")
layerForWorld.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHMOVED, "btnTouchMove")
layerForWorld.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHENDED, "btnTouchEnd")

-- touch handers
pointBegin = nil

function btnTouchBegin(e)
cocos2d.CCLuaLog("btnTouchBegin")
local v = e[1]
local pointMove = v:locationInView(v:view())
pointMove = cocos2d.CCDirector:sharedDirector():convertToGL(pointMove)
spriteForWorld:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y))
end

function btnTouchMove(e)
cocos2d.CCLuaLog("btnTouchMove")
local v = e[1]
local pointMove = v:locationInView(v:view())
pointMove = cocos2d.CCDirector:sharedDirector():convertToGL(pointMove)
spriteForWorld:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y))
end

function btnTouchEnd(e)
cocos2d.CCLuaLog("btnTouchEnd")
end

-- @@@@@@@@@@觸摸結(jié)束

--動(dòng)態(tài)小狗
winSize = cocos2d.CCDirector:sharedDirector():getWinSize()
FrameWidth = 105
FrameHeight = 95

textureDog = cocos2d.CCTextureCache:sharedTextureCache():addImage("dog.png")
frame0 = cocos2d.CCSpriteFrame:frameWithTexture(textureDog, cocos2d.CCRectMake(0, 0, FrameWidth, FrameHeight))
frame1 = cocos2d.CCSpriteFrame:frameWithTexture(textureDog, cocos2d.CCRectMake(FrameWidth*1, 0, FrameWidth, FrameHeight))

spriteDog = cocos2d.CCSprite:spriteWithSpriteFrame(frame0)
spriteDog:setPosition(cocos2d.CCPoint(100, winSize.height/4*3))
layerForWorld:addChild(spriteDog)

animFrames = cocos2d.CCMutableArray_CCSpriteFrame__:new(2)
animFrames:addObject(frame0)
animFrames:addObject(frame1)

animation = cocos2d.CCAnimation:animationWithFrames(animFrames, 0.5)

animate = cocos2d.CCAnimate:actionWithAnimation(animation, false);
spriteDog:runAction(cocos2d.CCRepeatForever:actionWithAction(animate))

--自定義函數(shù)
function prForHimi()
cocos2d.CCLuaLog("reFresh function")
--取消選擇器
--cocos2d.CCScheduler:sharedScheduler():unscheduleScriptFunc("prForHimi")
end

--使用選擇器進(jìn)行函數(shù)更新
--cocos2d.CCScheduler:sharedScheduler():scheduleScriptFunc("prForHimi", 1, false)

--循環(huán)語(yǔ)句
for i=0,4,1 do
for j=0,4,2 do
cocos2d.CCLuaLog("for loop",i)
end
end

-- 避免內(nèi)存泄漏
collectgarbage( "setpause", 100)
collectgarbage( "setstepmul", 5000)

-- 播放背景音樂(lè)
--CocosDenshion.SimpleAudioEngine:sharedEngine():playBackgroundMusic("background.mp3", true)
-- 播放音效
--CocosDenshion.SimpleAudioEngine:sharedEngine():preloadEffect("effect1.wav")

-- run整個(gè)scene
cocos2d.CCDirector:sharedDirector():runWithScene(sceneForWorld)

cocos2d.CCLuaLog("腳本hello正常執(zhí)行結(jié)束... " .. myadd(3, 5))

運(yùn)行效果圖如下:
對(duì)于Himi上面給出的自己修改后的代碼注視寫(xiě)的狠清楚了 =。 = 所以不多加贅述,但是Himi這里需要還要詳細(xì)說(shuō)一點(diǎn);
腳本lua等一般都示通過(guò)中間層(解析)進(jìn)行與前端代碼(Cocos2dX封裝的引擎類(lèi)庫(kù))交互,所以很多方法名稱可能發(fā)生了改變,那么對(duì)于不太熟悉的童鞋我們?nèi)绾蜗率郑?br/>OK,如剛才的代碼中有個(gè)“備注”,不知道細(xì)心童鞋們看到?jīng)]有,這里是添加了一個(gè)CCLabelTTF ,假如我們不知道它的構(gòu)造函數(shù)是否有修改,或者說(shuō)參數(shù)忘記都是什么了,那么請(qǐng)打開(kāi)你項(xiàng)目的libs文件夾,然后打開(kāi)lua文件夾,繼續(xù)打開(kāi)cocos2dx_support文件夾找到 LuaCocos2d.cpp文件打開(kāi),(注意這個(gè)文件代碼很多,打開(kāi)較慢)然后你會(huì)看到很多方法的定義與實(shí)現(xiàn)!
那么假如我們來(lái)找 CCLabelTTF的構(gòu)造方法,那么搜一下如下語(yǔ)句:

1

tolua_beginmodule(tolua_S,"CCLabelTTF");

你將發(fā)現(xiàn)此類(lèi)下方一大批類(lèi)似的代碼:

沒(méi)錯(cuò)這里就是此類(lèi)的所有是lua-cocos2dx之間的轉(zhuǎn)換函數(shù)定義,比如常用的CCLabelTTF構(gòu)造函數(shù)

1

tolua_function(tolua_S,"labelWithString",tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01);

此函數(shù)第一參數(shù)大家不用理會(huì),第二個(gè)參數(shù)表示我們使用cocos2d/x時(shí)調(diào)用的函數(shù)名稱,后面則是lua-cocos2dx之間的轉(zhuǎn)換函數(shù)實(shí)現(xiàn)代碼,大家可以繼續(xù)搜索第三個(gè)參數(shù)或者按住command然后點(diǎn)擊第三個(gè)參數(shù)找到其函數(shù)實(shí)現(xiàn)代碼:

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

/* method: labelWithString of class cocos2d::CCLabelTTF */
#ifndef TOLUA_DISABLE_tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01
static int tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01(lua_State* tolua_S)
{
tolua_Error tolua_err;
if (
!tolua_isusertable(tolua_S,1,"cocos2d::CCLabelTTF",0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isstring(tolua_S,3,0,&tolua_err) ||
!tolua_isnumber(tolua_S,4,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,5,&tolua_err)
)
goto tolua_lerror;
else
{
const char* label = ((const char*) tolua_tostring(tolua_S,2,0));
const char* fontName = ((const char*) tolua_tostring(tolua_S,3,0));
float fontSize = ((float) tolua_tonumber(tolua_S,4,0));
{
cocos2d::CCLabelTTF* tolua_ret = (cocos2d::CCLabelTTF*) cocos2d::CCLabelTTF::labelWithString(label,fontName,fontSize);
tolua_pushusertype(tolua_S,(void*)tolua_ret,"cocos2d::CCLabelTTF");
}
}
return 1;
tolua_lerror:
return tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString00(tolua_S);
}
#endif //#ifndef TOLUA_DISABLE

在這里看到此函數(shù)轉(zhuǎn)換過(guò)程,并可以很清楚看到:

1

cocos2d::CCLabelTTF* tolua_ret = (cocos2d::CCLabelTTF*) cocos2d::CCLabelTTF::labelWithString(label,fontName,fontSize);

到這里大家會(huì)很清楚需要的參數(shù)都是哪些,如果還不清楚,繼續(xù)按住Command然后點(diǎn)擊labelWithString進(jìn)入cocos2dx引擎代碼 CCLabelTTF.cpp中的此函數(shù)實(shí)現(xiàn)啦!
可能這部分有童鞋看得比較迷茫 =。 = 那么Himi來(lái)簡(jiǎn)化這些復(fù)雜來(lái)說(shuō):
解析lua腳本中的一句代碼->通過(guò)解析層代碼->將其轉(zhuǎn)換并轉(zhuǎn)到前端代碼進(jìn)行使用
那么當(dāng)然此過(guò)程也可逆:
前端代碼->通過(guò)解析層代碼->使用lua腳本中東東
這里由于Himi對(duì)cocos2dx 中的lua還沒(méi)有深入了解,所以不知是否過(guò)程可逆;
OK,基本就是這樣,對(duì)于腳本的熟悉,主要還是在公司進(jìn)行使用然后慢慢熟悉和熟練掌握的,本章主要需要童鞋們記住的是腳本的概念和作用!

查看完整回答
反對(duì) 回復(fù) 2018-09-20
  • 1 回答
  • 0 關(guān)注
  • 1268 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)