- 在線文檔 http://layaair.ldc.layabox.com/api/
- 在線案例 http://layaair.ldc.layabox.com/demo/?category=2d&group=Sprite&name=DisplayImage
- 官方案例 https://github.com/layabox/layaair-demo
開發(fā)環(huán)境
- 操作系統(tǒng):Windows10
- 游戲引擎:LayaAir2.2.0beta4
- Web服務(wù)器:Node.js的http-server
- 編程語言:ES6
檢查是否安裝Node.js環(huán)境赠尾,若沒有則進(jìn)入 https://nodejs.org/en/ 下載安裝靶剑。
$ npm -h
使用npm
全局安裝HTTP服務(wù)器
$ npm i -g http-server
進(jìn)入項(xiàng)目目錄運(yùn)行HTTP服務(wù)器
$ cd laya_project_name
$ http-server ./
瀏覽器輸入網(wǎng)址http://127.0.0.1:8080/bin/index.html
運(yùn)行
使用npm
命令安裝TypeScript環(huán)境
$ npm i -g typescript
緩存清理
$ npm cache clean --force
查看TypeScript編譯環(huán)境版本(tsc, TypeScript Compiler)
$ tsc -v
快速入門
需求:創(chuàng)建項(xiàng)目新建舞臺(tái)并向舞臺(tái)中添加帶樣式的文本
- 進(jìn)入項(xiàng)目
src
目錄下新建App.js
$ cd demo
$ http-server ./
$ vim ./src/App.js
- 進(jìn)入項(xiàng)目根目錄下的
.laya
文件夾赋续,修改compile.js
編譯文件,重新設(shè)置項(xiàng)目默認(rèn)的啟動(dòng)文件居扒,設(shè)置前默認(rèn)為src/Main.js
歧蕉。
$ vim ./.laya/compile.js
input: workSpaceDir + '/src/App.js',//默認(rèn)第33行
3.編輯默認(rèn)啟動(dòng)文件實(shí)現(xiàn)功能
$ vim ./src/App.js
//創(chuàng)建舞臺(tái)肘习,尺寸以iPhone5寬高1136x640為基準(zhǔn)近零,16:9標(biāo)準(zhǔn)。
const width = 1136;
const height = 640;
Laya.init(width, height);
//設(shè)置舞臺(tái)背景色溜歪,默認(rèn)不設(shè)置時(shí)背景為黑色若专。
Laya.stage.bgColor = "#23238e";
//創(chuàng)建文本
const txt = new Laya.Text();
txt.text = "Hello World";//文本內(nèi)容
txt.color = "#ff0000";//文本顏色
txt.fontSize = 66;//文本字體大小,單位像素蝴猪。
txt.stroke = 5;//文本描邊寬度调衰,單位像素。
txt.strokeColor = "#ffffff";//文本描邊顏色
txt.bold = true;//文本是否粗體顯示
txt.pos(width/2 - txt.fontSize/2 * txt.text.length/2, height/2 - txt.Size);//文本位置自阱,在舞臺(tái)的二維坐標(biāo)嚎莉。
//將文本添加到舞臺(tái)
Laya.stage.addChild(txt);
- 選擇Chrome調(diào)試,F(xiàn)8編譯文件后使用瀏覽器訪問
http://127.0.0.1:8080/bin/index.html
动壤,并使用Shift+F5
強(qiáng)制刷新萝喘,查看效果。
文件結(jié)構(gòu)
項(xiàng)目目錄結(jié)構(gòu)
-
.laya
項(xiàng)目運(yùn)行配置文件夾琼懊,存放項(xiàng)目在開發(fā)運(yùn)行中的配置信息阁簸。 -
bin
項(xiàng)目的輸出目錄,存放當(dāng)前項(xiàng)目的輸出文件哼丈。 -
laya
項(xiàng)目的UI項(xiàng)目目錄启妹,存放LayaAirIDE當(dāng)前的UI項(xiàng)目。 -
libs
.d.ts
代碼提供文件目錄醉旦,是LayaAir引擎LayaAir.d.ts文件饶米。用來代碼提示,第三方類庫相關(guān)的.d.ts
文件存放位置车胡。 -
src
項(xiàng)目代碼目錄
項(xiàng)目配置文件 項(xiàng)目名稱.laya
項(xiàng)目名稱.laya
項(xiàng)目配置文件檬输,記錄當(dāng)前項(xiàng)目的項(xiàng)目名稱、使用類庫版本匈棘、項(xiàng)目類型丧慈。
{
"proName":"myLaya",
"engineType":0,
"proType":2,
"layaProType":0,
"version":"2.1.0"
}
語言類型config.json
對(duì)應(yīng)語言的工程配置文件,比如tsconfig.json
項(xiàng)目配置目錄.laya
-
publish.js
文件時(shí)GULP針對(duì)項(xiàng)目發(fā)布的腳本文件 -
compile.js
文件是GULP自定義編譯流程的腳本文件主卫,若開發(fā)者對(duì)GULP熟悉可修改逃默。 -
launch.json
文件保存項(xiàng)目調(diào)試的配置信息,分別是LayaAirIDE調(diào)試配置和Chrome瀏覽器調(diào)試配置簇搅。
# 表示使用LayaAirIDE內(nèi)置的調(diào)試方式
"name": "layaAir",
# 表示使用Chrome瀏覽器調(diào)試
"name": "chrome調(diào)試",
# 表示項(xiàng)目以運(yùn)行啟動(dòng)的入口文件路徑
"file": "${workspaceRoot}/bin/index.html",
# 表示Chrome瀏覽器的路徑
"runtimeExecutable": "${execPath}",
# 表示Chrome調(diào)試緩存的臨時(shí)目錄完域,默認(rèn)為用戶的臨時(shí)目錄,開發(fā)者可以更改設(shè)置瘩将。
"userDataDir": "${workspaceRoot}/.laya/chrome",
-
tasks.json
文件保存TS編譯器相關(guān)配置信息
項(xiàng)目輸出目錄bin
bin
目錄是項(xiàng)目輸出文件夾吟税,存放當(dāng)前項(xiàng)目輸出的JS、HTML姿现、游戲資源等項(xiàng)目運(yùn)行文件肠仪,以及小游戲項(xiàng)目文件。默認(rèn)LayaAir調(diào)試或Chrome調(diào)試建钥,就是運(yùn)行該目錄下的文件藤韵。
-
index.html
項(xiàng)目入口文件,所有LayaAir引擎庫或第三方類庫的JS都需從這里引入熊经。 -
bin\libs
文件夾存放的是LayaAir引擎各模塊的JS文件
bin\libs
引擎庫文件夾存放是LayaAir引擎各模塊的JS文件泽艘,在項(xiàng)目中需要使用哪個(gè)模塊就需要在index.html
文件中引入對(duì)應(yīng)的模塊包JS文件。
-
laya.core
核心包镐依,封裝了顯示顯示對(duì)象渲染匹涮、事件、時(shí)間管理槐壳、時(shí)間軸動(dòng)畫然低、緩動(dòng)、消息互動(dòng)、Socket雳攘、本地存儲(chǔ)带兜、鼠標(biāo)觸摸、聲音吨灭、加載刚照、顏色濾鏡、位圖字體等喧兄。 -
laya.webgl
包封裝了WebGL渲染管線无畔,使用WebGL渲染可在初始化時(shí)調(diào)用Laya.init(1000, 800, laya.webgl.WebGL)
-
laya.ani.js
動(dòng)畫模塊包括SWF動(dòng)畫、骨骼動(dòng)畫等 -
laya.filter.js
WebGL濾鏡 -
laya.html.js
封裝了HTML動(dòng)態(tài)排版功能 -
laya.ui.js
提供制作UI的各種組件實(shí)現(xiàn) -
laya.tilemap.js
提供TileMap解析支持
項(xiàng)目資源目錄 laya
laya
用于存放UI項(xiàng)目的文件夾
-
.laya
文件是LayaAirIDE的UI項(xiàng)目配置文件 -
laya\assets
文件夾用于存放UI頁面吠冤、粒子等組件所需的圖片浑彰、音頻等資源 -
laya\pages
文件夾用于存放LayaAirIDE創(chuàng)建原頁面布局比如場景、動(dòng)畫拯辙、預(yù)設(shè)等生成的配置文件
代碼提示目錄 libs
libs
文件夾是LayaAir引擎LayaAir.d.ts
文件郭变,用于代碼提示,若存在第三方類庫使用薄风,相關(guān)的.d.ts
文件會(huì)保存在文件夾下饵较。
項(xiàng)目開發(fā)源代碼目錄 src
src/ui/
目錄是IDE自動(dòng)生成的,
基礎(chǔ)概念
舞臺(tái)Stage
- 舞臺(tái)
stage
是顯示游戲元素的平臺(tái)遭赂,在游戲視覺編程中循诉,一切游戲的元素必須添加到舞臺(tái)才能被顯示。因此撇他,舞臺(tái)是放置對(duì)象的最終容器茄猫。 - 舞臺(tái)自身也是一種可以顯示的對(duì)象,從編程角度來講困肩,任何對(duì)象都具有屬性和行為划纽。
- 舞臺(tái)類,可通過
Laya.stage
單例訪锌畸,是顯示列表的根節(jié)點(diǎn)勇劣,所有顯示對(duì)象都在舞臺(tái)上顯示。 - 舞臺(tái)提供適配模式潭枣,不同適配模式產(chǎn)生不同大小的畫布比默,畫布越大渲染壓力越大。
- 舞臺(tái)提供不同的幀率模式盆犁,幀率越高渲染壓力越大命咐,也越耗電。
顯示對(duì)象
一切在舞臺(tái)上可見的東西都可以稱為顯示對(duì)象谐岁,顯示對(duì)象即包括可見的圖形醋奠、文字榛臼、圖片 、視頻窜司,也包括不可見的音頻沛善、顯示對(duì)象容器等。
顯示列表
顯示對(duì)象在舞臺(tái)上顯示之前例证,還需一個(gè)過程路呜,就是先添加到顯示列表中迷捧。
顯示列表的作用就是將顯示對(duì)象進(jìn)行數(shù)據(jù)索引织咧,用于層級(jí)的顯示順序,然后在舞臺(tái)上顯示漠秋。
場景Scene
- Laya游戲開發(fā)中是由一個(gè)個(gè)的場景所組成的
- Laya引擎加載運(yùn)行顯示場景
- 場景中由一個(gè)個(gè)物體
- 新建場景需設(shè)置場景尺寸和名字
- 層級(jí)視圖用來查看場景中的節(jié)點(diǎn)
- 視圖中的每個(gè)圖標(biāo)表示不一樣的類型
- 場景文件保存在
/laya/pages/
文件夾下 - 場景文件的后綴為
.scene
創(chuàng)建場景
- 新建場景
- 配置設(shè)計(jì)分辨率
- 場景大小與設(shè)計(jì)分辨率保持一致
- 配置適配策略
設(shè)計(jì)分辨率
設(shè)計(jì)分辨率是內(nèi)容產(chǎn)生者在制作場景時(shí)使用的分辨率藍(lán)本笙蒙,而屏幕 分辨率則是游戲在設(shè)備上運(yùn)行時(shí)的實(shí)際屏幕顯示分辨率。通常設(shè)計(jì)分辨率會(huì)采用市場目標(biāo)群體中使用率最高的設(shè)備的屏幕分辨率庆锦,比如目前在Android設(shè)備中 800 x 400
和1280 x 720
兩種屏幕分辨率捅位,或iOS設(shè)備中1136 x 640
和960 x640
兩種屏幕分辨率。
適配策略
- 策略:橫屏
horizontal
搂抒、固定高度fixedheight
艇搀、設(shè)計(jì)寬度1136
、設(shè)計(jì)高度640
- 注意:場景適配模式選擇固定高度
fixedheight
求晶,設(shè)計(jì)寬度與設(shè)計(jì)高度與場景的的寬度和高度保持一致。 - 操作:使用快捷鍵
F9
打開 項(xiàng)目設(shè)置 ,也可選擇菜單中 文件 > 項(xiàng)目設(shè)置 逸月。
節(jié)點(diǎn)
- 場景中的元素都叫做節(jié)點(diǎn)
- 節(jié)點(diǎn)在場景內(nèi)抡柿,節(jié)點(diǎn)按照樹型關(guān)系來進(jìn)行組織。
- Laya定義的節(jié)點(diǎn)類型和預(yù)先定義的特定功能的節(jié)點(diǎn)類型爵赵,在Basics下面吝秕。
- 父節(jié)點(diǎn)與子節(jié)點(diǎn)
編輯器
- 位置平移:
x
/y
相對(duì)坐標(biāo),相對(duì)于父節(jié)點(diǎn)坐標(biāo)空幻,場景的原點(diǎn)位于左上角烁峭。 - 大小改變:
width
/height
- 節(jié)點(diǎn)旋轉(zhuǎn):
rotation
子節(jié)點(diǎn)會(huì)跟著父節(jié)點(diǎn)一起旋轉(zhuǎn) - 節(jié)點(diǎn)縮放:
scaleX
/scaleY
子節(jié)點(diǎn)也會(huì)跟著父節(jié)點(diǎn)一起縮放 - 節(jié)點(diǎn)的中心位置:
pivotX
/pivotY
2D物體的中心點(diǎn),子節(jié)點(diǎn)以父節(jié)點(diǎn)的左上角為原點(diǎn)秕铛。 - 節(jié)點(diǎn)的錨點(diǎn)
anchorX
/anchorY
錨點(diǎn)的左上角坐標(biāo)為(0,0)约郁,錨點(diǎn)的右下角坐標(biāo)為(1,1)。 - 節(jié)點(diǎn)的透明度:
alpha
- 扭曲:
skewX
/skewY
腳本
Laya2.0 IDE采用掛載組件腳本與場景管理的方式進(jìn)行開發(fā)如捅,在IDE中編輯場景和頁面組件棍现,通過添加腳本的方式,使項(xiàng)目開發(fā)更利于程序镜遣、美術(shù)己肮、策劃的協(xié)同工作士袄,并對(duì)初次接觸Laya的開發(fā)者更易于上手且開發(fā)方式更加友好。
- 組件化開發(fā)
創(chuàng)建腳本
- 新建組件類
- 創(chuàng)建組件類實(shí)例到節(jié)點(diǎn)谎僻,一個(gè)節(jié)點(diǎn)可添加多個(gè)組件實(shí)例娄柳。
- 腳本的注冊
操作流程
- 打開LayAir2,新建項(xiàng)目選擇空項(xiàng)目艘绍,編程語言選擇JavaScript赤拒。
- 選擇編輯模式,新建場景命名為
Game
诱鞠,寬度設(shè)置為1136挎挖,高度設(shè)置為940。 - 點(diǎn)擊快捷鍵
F9
打開項(xiàng)目設(shè)置航夺,選擇預(yù)覽設(shè)置蕉朵,選擇場景適配模式為fixedheight
,設(shè)計(jì)寬度設(shè)置為1136阳掐,設(shè)計(jì)高度設(shè)置為940始衅。 - 選擇代碼模式,選擇
src
右鍵新建模板文件缭保,選中新建腳本文件汛闸,命名為GameMgr.js
。
- 創(chuàng)建腳本組件類的模板艺骂,繼承自
Laya.Script
類诸老。 - 為節(jié)點(diǎn)添加組件并找個(gè)定義的腳本類,編輯器會(huì)創(chuàng)建類的實(shí)例到節(jié)點(diǎn)上彻亲。
- 在游戲配置
GameConfig.js
中注冊定義的組件類
export default class GameMgr extends Laya.Script {
constructor() {
super();
/** @prop {name:intType, tips:"整數(shù)類型示例", type:Int, default:1000}*/
let intType = 1000;
/** @prop {name:numType, tips:"數(shù)字類型示例", type:Number, default:1000}*/
let numType = 1000;
/** @prop {name:strType, tips:"字符串類型示例", type:String, default:"hello laya"}*/
let strType = "hello laya";
/** @prop {name:boolType, tips:"布爾類型示例", type:Bool, default:true}*/
let boolType = true;
// 更多參數(shù)說明請?jiān)L問: https://ldc2.layabox.com/doc/?nav=zh-as-2-4-0
}
onEnable() {
}
onDisable() {
}
}
5.進(jìn)入編輯模式孕锄,在場景中添加精靈Sprite
,為精靈添加組件中code
中的GameMgr
苞尝。
6.進(jìn)入代碼模式畸肆,選擇src
目錄下的GameConfig.js
游戲配置文件,在配置文件中注冊剛才創(chuàng)建的GameMgr
組件宙址。
import GameMgr from "./GameMgr"
export default class GameConfig {
static init() {
//注冊Script或者Runtime引用
let reg = Laya.ClassUtils.regClass;
reg("GameMgr.js",GameMgr);
}
}
掛腳本的原則
- 腳本要控制哪個(gè)節(jié)點(diǎn)轴脐,就掛在哪個(gè)節(jié)點(diǎn)上。
- 如果是全局的管理類抡砂,一般都會(huì)掛到根節(jié)點(diǎn)上大咱。
runtime
的作用
LayaAir IDE的資源面板中所有組件均帶有runtime
屬性,runtime
屬性是組件運(yùn)行時(shí)的邏輯類注益,相同組件可使用同一個(gè)runtime
類來實(shí)現(xiàn)相同的功能碴巾。需要注意的是組件的runtime
邏輯類如果不繼承組件自身,若繼承的對(duì)象中沒有該組件的屬性時(shí)丑搔,runtime
屬性則會(huì)失效厦瓢,另外runtime
不支持在view
頁面 和dialog
對(duì)話框場景中使用提揍。
組件固定入口
引擎的運(yùn)行過程
- 引擎加載場景
- 引擎獲取場景中的每個(gè)節(jié)點(diǎn)
- 由節(jié)點(diǎn)獲取每個(gè)組件實(shí)例
- 特定時(shí)機(jī)引擎調(diào)用組件實(shí)例特定入口
組件實(shí)例的固定入口被引擎調(diào)用
-
onAwake
虛方法,組件被激活后執(zhí)行煮仇,此時(shí)所有節(jié)點(diǎn)和組件均已創(chuàng)建完畢劳跃。此方法只會(huì)執(zhí)行一次,使用時(shí)需重寫覆蓋即可浙垫。 -
onDestroy
虛方法刨仑,手動(dòng)調(diào)用節(jié)點(diǎn)銷毀時(shí)執(zhí)行,使用時(shí)重寫覆蓋即可夹姥。 -
onDisable
虛方法杉武,組件被禁用時(shí)執(zhí)行,比如節(jié)點(diǎn)從舞臺(tái)移除后觸發(fā)佃声,使用時(shí)重寫覆蓋即可艺智。 -
onEnable
虛方法,組件被啟用后執(zhí)行圾亏,比如節(jié)點(diǎn)被添加到舞臺(tái)后觸發(fā),使用時(shí)重寫覆蓋即可封拧。 -
onStart
虛方法志鹃,組件第一次執(zhí)行update
之前時(shí)執(zhí)行,只會(huì)執(zhí)行一次泽西,使用時(shí)重寫覆蓋即可曹铃。 -
onUpdate
每幀更新時(shí)執(zhí)行,使用時(shí)重寫覆蓋即可捧杉。 -
onLateUpdate
每幀更新時(shí)執(zhí)行陕见,在update
之后執(zhí)行,使用時(shí)重寫覆蓋即可味抖。
例如:
$ vim GameMgr.js
export default class GameMgr extends Laya.Script {
constructor() {
super();
/** @prop {name:intType, tips:"整數(shù)類型示例", type:Int, default:1000}*/
let intType = 1000;
/** @prop {name:numType, tips:"數(shù)字類型示例", type:Number, default:1000}*/
let numType = 1000;
/** @prop {name:strType, tips:"字符串類型示例", type:String, default:"hello laya"}*/
let strType = "hello laya";
/** @prop {name:boolType, tips:"布爾類型示例", type:Bool, default:true}*/
let boolType = true;
}
onEnable() {
}
onDisable() {
}
//虛方法评甜,僅執(zhí)行一次,組件被激活后執(zhí)行此時(shí)所有節(jié)點(diǎn)和組件均已創(chuàng)建完畢仔涩。
onAwake(){
//需設(shè)置組件的name屬性
console.log(this.owner.name);
console.log("onAwake");
}
//虛方法忍坷,手動(dòng)調(diào)用節(jié)點(diǎn)銷毀時(shí)執(zhí)行。
onDestroy(){
console.log("onDestroy");
}
//虛方法熔脂,僅執(zhí)行一次佩研,第一次執(zhí)行update之前執(zhí)行。
//所有節(jié)點(diǎn)的onAwake調(diào)用完畢后才會(huì)調(diào)用onStart霞揉。
onStart(){
console.log("onStart");
}
//虛方法旬薯,每次刷新時(shí)調(diào)用
onUpdate(){
//console.log("onUpdate");
}
//虛方法,每次刷新發(fā)生在Update之后适秩。
onLateUpdate(){
//console.log("onLateUpdate");
}
}
幫助文檔
- 代碼中查看引擎類的接口
使用快捷鍵F12
代碼模式中查看類的定義
例如:laya.components.Script
繼承自Laya.components.Component
類
- API文檔中查看接口說明
接口文檔地址:http://layaair2.ldc2.layabox.com/api/
- 通過查看代碼API找到組件實(shí)例所依附的節(jié)點(diǎn)
ES6新特性
-
import
/export
導(dǎo)入導(dǎo)出代碼模塊
export default class GameMgr extends Laya.Script {}
import GameMgr from "./GameMgr"
-
pakcage
代碼包的概念
不同開發(fā)者之間編寫代碼绊序,可能會(huì)發(fā)生命令沖突些侍,定義包可以以包名.類名
的形式確定其類型。
declare module laya.components {
class Script extends laya.components.Component {}
}
日志輸出
- 打印輸入日志使用
console.log
- Laya游戲配置文件中開啟調(diào)試
$ vim src/GameConfig.js
GameConfig.debug = true
當(dāng)游戲配置開啟調(diào)試后政模,Laya會(huì)開啟調(diào)試視圖岗宣。
$ vim src/Main.js
//打開調(diào)試面板(通過IDE設(shè)置調(diào)試模式,或者url地址增加debug=true參數(shù)淋样,均可打開調(diào)試面板)
if (GameConfig.debug || Laya.Utils.getQueryString("debug") == "true") Laya.enableDebugPanel();
點(diǎn)擊F5調(diào)試
- Laya場景背后的節(jié)點(diǎn)樹分布
舞臺(tái):所有場景的根節(jié)點(diǎn)
root:場景的父節(jié)點(diǎn)
場景:場景節(jié)點(diǎn)耗式,場景中的物體都是場景的子節(jié)點(diǎn)。
顯示對(duì)象
Laya顯示對(duì)象在laya.display
類中
Laya的顯示對(duì)象可分為
- 節(jié)點(diǎn):
laya.display.Node
- 精靈:
laya.display.Sprite
繼承自laya.display.Node
- 場景:
laya.display.Scene
繼承自laya.display.Sprite
- 舞臺(tái):
laya.display.Stage
繼承自laya.display.Sprite
- 文本:
laya.display.Text
繼承自laya.display.Sprite
游戲配置
-
GameConfig.js
編譯時(shí)會(huì)自動(dòng)生成趁猴,無需人為修改刊咳。 - 編寫的腳本文件可放在
src
中的下級(jí)目錄中,編譯時(shí)可自動(dòng)在GameConfig.js
中注冊腳本儡司。
$ vim src/GameConfig.jsj
import GameMgr from "./game/GameMgr";
export default class GameConfig {
static init() {
//注冊Script或者Runtime引用
let reg = Laya.ClassUtils.regClass;
reg("game/GameMgr.js", GameMgr);
}
}
- 調(diào)試窗口的顯示可使用F9項(xiàng)目設(shè)置中的選項(xiàng)來控制
組件訪問節(jié)點(diǎn)屬性
- 代碼組件中的
this
指的是組件實(shí)例
$ vim src/GameMgr.js
export default class GameMgr extends Laya.Script {
constructor() {
super();
/** @prop {name:intType, tips:"整數(shù)類型示例", type:Int, default:1000}*/
let intType = 1000;
/** @prop {name:numType, tips:"數(shù)字類型示例", type:Number, default:1000}*/
let numType = 1000;
/** @prop {name:strType, tips:"字符串類型示例", type:String, default:"hello laya"}*/
let strType = "hello laya";
/** @prop {name:boolType, tips:"布爾類型示例", type:Bool, default:true}*/
let boolType = true;
}
onEnable() {
}
onDisable() {
}
//虛方法娱挨,僅執(zhí)行一次,組件被激活后執(zhí)行此時(shí)所有節(jié)點(diǎn)和組件均已創(chuàng)建完畢捕犬。
onAwake(){
console.log(this.owner.name);
console.log("onAwake");
}
//虛方法跷坝,手動(dòng)調(diào)用節(jié)點(diǎn)銷毀時(shí)執(zhí)行。
onDestroy(){
console.log("onDestroy");
}
//虛方法碉碉,僅執(zhí)行一次柴钻,第一次執(zhí)行update之前執(zhí)行。
//所有節(jié)點(diǎn)的onAwake調(diào)用完畢后才會(huì)調(diào)用onStart垢粮。
onStart(){
//this表示當(dāng)前組件實(shí)例贴届,this.owner是組件實(shí)例所在的節(jié)點(diǎn)對(duì)象。
console.log("onStart", this.owner);
}
//虛方法蜡吧,每次刷新時(shí)調(diào)用
onUpdate(){
//console.log("onUpdate");
}
//虛方法毫蚓,每次刷新發(fā)生在Update之后。
onLateUpdate(){
//console.log("onLateUpdate");
}
}
- 根據(jù)當(dāng)前組件實(shí)例可以找到對(duì)應(yīng)的節(jié)點(diǎn)昔善,也可在代碼中使用
組件實(shí)例.owner
來獲取元潘。 -
組件實(shí)例.owner
是laya.display.Node
節(jié)點(diǎn)對(duì)象 - 所有場景中的節(jié)點(diǎn)對(duì)象都繼承自
laya.display.Node
,所有場景中的元素繼承自laya.display.Sprite
耀鸦。
節(jié)點(diǎn)屬性
所有場景組件都繼承自Sprite
柬批,所以組件的屬性都會(huì)在Sprite
對(duì)象中。
- 名字:
this.owner.name
獲取節(jié)點(diǎn)名字袖订,屬于laya.display.Node
類的成員氮帐。 - 位置:
this.owner.x
和this.owner.y
屬于laya.display.Sprite
類的成員。 - 大新骞谩:
this.owner.width
和this.owner.height
屬于laya.display.Sprite
類的成員上沐。 - 旋轉(zhuǎn):
this.owner.rotation
旋轉(zhuǎn)的單位是度,屬于laya.display.Sprite
類成員楞艾。 - 縮放:
this.owner.scaleX
和this.owner.scaleY
屬于laya.display.Sprite
類成員参咙。 - 扭曲:
this.owner.skewX
和this.owner.skewY
屬于laya.display.Sprite
類成員龄广。 - 可見度:
this.owner.visible
屬于laya.display.Sprite
類成員。 - 透明度:
this.owner.alpha
屬于laya.display.Sprite
類成員蕴侧。 - 中心點(diǎn):
this.owner.pivotX
和this.owner.pivotY
屬于laya.display.Sprite
類成員择同。
$ vim src/GameMgr.js
export default class GameMgr extends Laya.Script {
constructor() {
super();
/** @prop {name:intType, tips:"整數(shù)類型示例", type:Int, default:1000}*/
let intType = 1000;
/** @prop {name:numType, tips:"數(shù)字類型示例", type:Number, default:1000}*/
let numType = 1000;
/** @prop {name:strType, tips:"字符串類型示例", type:String, default:"hello laya"}*/
let strType = "hello laya";
/** @prop {name:boolType, tips:"布爾類型示例", type:Bool, default:true}*/
let boolType = true;
}
onEnable() {
}
onDisable() {
}
//虛方法,僅執(zhí)行一次净宵,組件被激活后執(zhí)行此時(shí)所有節(jié)點(diǎn)和組件均已創(chuàng)建完畢敲才。
onAwake(){
console.log(this.owner.name);
console.log("onAwake");
}
//虛方法,手動(dòng)調(diào)用節(jié)點(diǎn)銷毀時(shí)執(zhí)行择葡。
onDestroy(){
console.log("onDestroy");
}
//虛方法紧武,僅執(zhí)行一次,第一次執(zhí)行update之前執(zhí)行敏储。
//所有節(jié)點(diǎn)的onAwake調(diào)用完畢后才會(huì)調(diào)用onStart阻星。
onStart(){
//this表示當(dāng)前組件實(shí)例,this.owner是組件實(shí)例所在的節(jié)點(diǎn)對(duì)象已添。
console.log("onStart", this.owner);
//節(jié)點(diǎn)屬性
var owner = this.owner;
//節(jié)點(diǎn)名稱
console.log(owner.name);
//節(jié)點(diǎn)位置
console.log(owner.x, owner.y);
//節(jié)點(diǎn)大小
console.log(owner.width, owner.height);
}
//虛方法妥箕,每次刷新時(shí)調(diào)用
onUpdate(){
//console.log("onUpdate");
}
//虛方法,每次刷新發(fā)生在Update之后酝碳。
onLateUpdate(){
//console.log("onLateUpdate");
}
}
通過節(jié)點(diǎn)獲取組件
-
getComponent(class:any)
獲取組件實(shí)例
$ vim GameMgr.js
定義GameMgr和PlayerMgr腳本矾踱,均添加到同一個(gè)節(jié)點(diǎn)組件上作為代碼組件。在GameMgr代碼節(jié)點(diǎn)上通過getComponent
方法獲取指定的代碼組件疏哗。
import PlayerMgr from "./PlayerMgr";
export default class GameMgr extends Laya.Script {
constructor() {
super();
/** @prop {name:intType, tips:"整數(shù)類型示例", type:Int, default:1000}*/
let intType = 1000;
/** @prop {name:numType, tips:"數(shù)字類型示例", type:Number, default:1000}*/
let numType = 1000;
/** @prop {name:strType, tips:"字符串類型示例", type:String, default:"hello laya"}*/
let strType = "hello laya";
/** @prop {name:boolType, tips:"布爾類型示例", type:Bool, default:true}*/
let boolType = true;
}
onEnable() {
}
onDisable() {
}
//虛方法,僅執(zhí)行一次禾怠,組件被激活后執(zhí)行此時(shí)所有節(jié)點(diǎn)和組件均已創(chuàng)建完畢返奉。
onAwake(){
console.log("onAwake: "+this.owner.name);
}
//虛方法,僅執(zhí)行一次吗氏,第一次執(zhí)行update之前執(zhí)行芽偏。
//所有節(jié)點(diǎn)的onAwake調(diào)用完畢后才會(huì)調(diào)用onStart。
onStart(){
//this表示當(dāng)前組件實(shí)例弦讽,this.owner是組件實(shí)例所在的節(jié)點(diǎn)對(duì)象污尉。
console.log("onStart: "+this.owner.name);
//獲取當(dāng)前節(jié)點(diǎn)上的代碼組件,代碼組件必須首先綁定到節(jié)點(diǎn)上往产,否則返回null被碗。
var player = this.owner.getComponent(PlayerMgr);
console.log(player);//PlayerMgr {_id: 11, _indexInList: -1, _enabled: true, _awaked: true, owner: Scene, …}
//調(diào)用對(duì)應(yīng)代碼組件的自定義方法
player.test();//player manager test method
}
}
如果同一個(gè)節(jié)點(diǎn)上具有多個(gè)相同類的組件實(shí)例則會(huì)返回最先查找到的
-
getComponents(class:any)
獲取滿足條件的組件實(shí)例數(shù)組
onStart(){
//this表示當(dāng)前組件實(shí)例,this.owner是組件實(shí)例所在的節(jié)點(diǎn)對(duì)象仿村。
console.log("onStart: "+this.owner.name);
//獲取當(dāng)前節(jié)點(diǎn)上的代碼組件锐朴,代碼組件必須首先綁定到節(jié)點(diǎn)上,否則返回null蔼囊。
var players = this.owner.getComponents(PlayerMgr);
console.log(players);//Array(1) [PlayerMgr]
}
-
addComponent(type:new()=>any)
使用代碼添加組件到節(jié)點(diǎn)
onStart(){
//this表示當(dāng)前組件實(shí)例焚志,this.owner是組件實(shí)例所在的節(jié)點(diǎn)對(duì)象衣迷。
console.log("onStart: "+this.owner.name);
//添加代碼組件到當(dāng)前組件
var player = this.owner.addComponent(PlayerMgr);
console.log(player)//PlayerMgr {_id: 14, _indexInList: -1, _enabled: true, _awaked: true, owner: Scene, …}
player.test();//player manager run test method
}
編輯器綁定
- 編輯器綁定對(duì)于腳本代碼而言是注釋
/** */
- 編輯器會(huì)解析注釋中
@prop
并提取變量綁定到編輯器
/** @prop {name:“名字”, tip:"提示信息", type:數(shù)據(jù)類型, default:默認(rèn)值}*/
- 綁定到編輯器上的變量會(huì)稱為類的數(shù)據(jù)成員
- 編輯器綁定變量的數(shù)據(jù)類型支持兩種分別是基本數(shù)據(jù)類型和場景節(jié)點(diǎn)類型,場景節(jié)點(diǎn)類型無需攜帶包名酱酬。
操作流程
- 創(chuàng)建標(biāo)準(zhǔn)空Laya項(xiàng)目
- 創(chuàng)建
Game.scene
場景 - 配置項(xiàng)目設(shè)置 編輯模式
F9
:固定高度 設(shè)計(jì)寬高與場景保持一致
- 創(chuàng)建標(biāo)準(zhǔn)Laya組件類并實(shí)例化組件到節(jié)點(diǎn)
- 在
src
目錄下創(chuàng)建game
文件夾并添加腳本Game.js - 在游戲配置文件
src/GameConfig.js
中檢查是否注冊成功 - 掛腳本 創(chuàng)建類的實(shí)例到節(jié)點(diǎn)并選擇腳本需要控制的節(jié)點(diǎn)
- 引擎運(yùn)行時(shí)首先會(huì)加載場景獲取場景樹壶谒,通過場景樹得到節(jié)點(diǎn),通過遍歷節(jié)點(diǎn)獲取每個(gè)節(jié)點(diǎn)上的每個(gè)組件實(shí)例膳沽。
- 根據(jù)場景的樹形結(jié)構(gòu)搭建場景汗菜,場景中節(jié)點(diǎn)具有父子關(guān)系。
- 組件代碼如何綁定數(shù)據(jù)成員到編輯器
$ vim src/game/SceneMgr.js
constructor() {
super();
/** @prop {name:intType, tips:"整數(shù)類型示例", type:Int, default:1000}*/
let intType = 1000;
/** @prop {name:numType, tips:"數(shù)字類型示例", type:Number, default:1000}*/
let numType = 1000;
/** @prop {name:strType, tips:"字符串類型示例", type:String, default:"hello laya"}*/
let strType = "hello laya";
/** @prop {name:boolType, tips:"布爾類型示例", type:Bool, default:true}*/
let boolType = true;
}
編輯器綁定規(guī)則
/** @prop {name:intType, tips:"整數(shù)類型示例", type:Int, default:1000}*/
引擎運(yùn)行時(shí)編輯器會(huì)去識(shí)別注釋中的參數(shù)變量贵少,找到@prop
描述會(huì)將其綁定到編輯器呵俏。當(dāng)加載場景運(yùn)行時(shí),會(huì)將組件實(shí)例的屬性信息添加到組件實(shí)例的成員中滔灶。
通過注釋@prop
定義成員會(huì)綁定到編輯器普碎,注意它不是 JS語法只是運(yùn)行時(shí)的注釋,因此是可以調(diào)整位置的录平。
$ vim src/game/SceneMgr.js
export default class SceneMgr extends Laya.Script {
/** @prop {name:intType, tips:"整數(shù)類型示例", type:Int, default:1000}*/
constructor() {
super();
}
onAwake(){
console.log("onAwake: "+this.owner.name);
}
onStart(){
console.log("onStart: "+this.owner.name);
}
onEnable() {
}
onDisable() {
}
}
編輯器綁定的數(shù)據(jù)類型
- 基本數(shù)據(jù)類型:
Int
麻车、Number
、String
斗这、Bool
- 場景節(jié)點(diǎn)類型(無需帶包名):
Node
动猬、Sprite
、Button
$ vim game/Scene.js
export default class SceneMgr extends Laya.Script {
/** @prop {name:speed, tips:"速度", type:Int, default:1000}*/
constructor() {
super();
}
onAwake(){
console.log("onAwake: "+this.owner.name);
}
onStart(){
console.log("onStart: "+this.owner.name);
console.log("speed: "+this.speed);//200
}
onEnable() {
}
onDisable() {
}
}
設(shè)置組件上的speed
數(shù)值表箭,若不設(shè)置值則輸出值為 undeifned
赁咙。
調(diào)試運(yùn)行查看打印輸出
綁定場景節(jié)點(diǎn)類型
$ vim src/game/SceneMgr.js
export default class SceneMgr extends Laya.Script {
/** @prop {name:speed, tips:"速度", type:Int, default:1000}*/
/** @prop {name:btnStart, tips:"開始按鈕", type:Node, default:null}*/
constructor() {
super();
}
onAwake(){
console.log("onAwake: "+this.owner.name);
}
onStart(){
console.log("onStart: "+this.owner.name);
console.log("speed: "+this.speed);//200
console.log("btnStart: "+this.btnStart+" buttonName:"+this.btnStart.name);//btnStart: [object Object] buttonName:start
}
onEnable() {
}
onDisable() {
}
}
運(yùn)行調(diào)試查看輸出
編輯器綁定常用類型
- 地址:http://ldc2.layabox.com/doc/?nav=zh-js-3-4-0
- 位置:文檔 > IDE篇 > 腳本使用 > 腳本化
查找節(jié)點(diǎn)
- 組件代碼中如何查找節(jié)點(diǎn)
- 根據(jù)腳本的固定入口,引擎的場景會(huì)從節(jié)點(diǎn)獲取到組件實(shí)例免钻,在特定時(shí)機(jī)執(zhí)行組件實(shí)例的固定入口方法彼水。
- 在固定入口方法中的
this
表示當(dāng)前組件實(shí)例所依附的節(jié)點(diǎn)
場景中查找節(jié)點(diǎn)
-
laya.display.Node
類scene
可獲取節(jié)點(diǎn)所在的場景 -
laya.display.Node
類parent
查找子節(jié)點(diǎn)的父節(jié)點(diǎn) -
laya.display.Node
類numChildren
可獲取子節(jié)點(diǎn)的數(shù)量 -
laya.display.Node
類_children
可獲取子節(jié)點(diǎn)的數(shù)組 -
laya.display.Node
類getChildByName()
根據(jù)節(jié)點(diǎn)名稱獲取場景中的子節(jié)點(diǎn) -
laya.display.Node
類getChildByAt(index)
根據(jù)索引查找節(jié)點(diǎn) -
laya.display.Node
類getChildIndex()
獲取節(jié)點(diǎn)的索引值
$ vim src/game/SceneMgr.js
export default class SceneMgr extends Laya.Script {
constructor() {
super();
}
onAwake(){
console.log("onAwake: "+this.owner.name);
}
onStart(){
console.log("onStart: "+this.owner.name);
//當(dāng)前當(dāng)前自己的代碼組件所在的節(jié)點(diǎn)
console.log(this.owner);//Scene {_bits: 70, _children: Array(2), _extUIChild: Array(0), _parent: Sprite, name: "scene", …}
//獲取當(dāng)前節(jié)點(diǎn)所在場景
console.log(this.owner.scene);//Scene {_bits: 70, _children: Array(2), _extUIChild: Array(0), _parent: Sprite, name: "scene", …}
//獲取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
console.log(this.owner.parent);//Sprite {_bits: 70, _children: Array(1), _extUIChild: Array(0), _parent: Stage, name: "root", …}
//獲取子節(jié)點(diǎn)數(shù)量
console.log(this.owner.numChildren);//2
//根據(jù)子節(jié)點(diǎn)名稱獲取當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)
var player = this.owner.getChildByName("player");
console.log(player);//Image {_bits: 6, _children: Array(1), _extUIChild: Array(0), _parent: Scene, name: "player", …}
//獲取子節(jié)點(diǎn)數(shù)組
console.log(this.owner._children);//Array(2) [Image, Button]
//根據(jù)子節(jié)點(diǎn)所在的索引查找
console.log(this.owner.getChildAt(0));//Image {_bits: 6, _children: Array(1), _extUIChild: Array(0), _parent: Scene, name: "player", …}
console.log(this.owner.getChildAt(1));//Button {_bits: 70, _children: Array(1), _extUIChild: Array(0), _parent: Scene, name: "start", …}
}
onEnable() {
}
onDisable() {
}
}
- 代碼中如何添加節(jié)點(diǎn)
-
laya.display.Node
類addChild
添加單個(gè)子節(jié)點(diǎn) -
laya.display.Node
類addChildren
添加多個(gè)子節(jié)點(diǎn)
例如:在當(dāng)前節(jié)點(diǎn) 下添加子節(jié)點(diǎn)
$ vim src/game/SceneMgr.js
export default class SceneMgr extends Laya.Script {
constructor() {
super();
}
onAwake(){
console.log("onAwake: "+this.owner.name);
}
onStart(){
console.log("onStart: "+this.owner.name);
//添加文本節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)下
var txt = new Laya.Text();
txt.color = "#ff0000";
txt.label = "測試文本";
txt.fontSize = 32;
txt.text = "Blank";
this.owner.addChild(txt);
}
onEnable() {
}
onDisable() {
}
}
例如:同時(shí)添加多個(gè)節(jié)點(diǎn)
$ vim src/game/SceneMgr.js
export default class SceneMgr extends Laya.Script {
constructor() {
super();
}
onAwake(){
console.log("onAwake: "+this.owner.name);
}
onStart(){
console.log("onStart: "+this.owner.name);
//添加文本節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)下
var txt = new Laya.Text();
txt.color = "#ff0000";
txt.fontSize = 32;
txt.text = "測試文本";
txt.x = 100;
txt.y = 100;
var text = new Laya.Text();
text.color = "#ffffff";
text.fontSize = 32;
text.text = "測試文本2";
text.x = 1000;
text.y = 500;
this.owner.addChildren(txt, text);
}
onEnable() {
}
onDisable() {
}
}
Sprite
- Laya中
laya.display.Node
處理的是場景樹關(guān)系的對(duì)象,所有的Laya顯示對(duì)象都繼承自它极舔。 - Laya中
laya.display.Sprite
處理的場景中的位置凤覆、大小、縮放等信息拆魏,所有的Laya顯示對(duì)象也都繼承自它盯桦。 -
laya.display.Sprite
是所有顯示對(duì)象的基類
Sprite顯示圖片
- Sprite中的
texture
屬性可指定需要顯示的圖片,若沒有則什么都不顯示渤刃。 - Sprite的縮放參數(shù)
scaleX
和scaleY
拥峦,若scale
為負(fù)數(shù)則會(huì)被鏡像。 - Sprite的大小改變圖片也會(huì)跟著縮放
Image
Image九宮格模式sizeGrid
- 編輯圖片資源設(shè)置九宮格溪掀,其實(shí)是指定拉升區(qū)域事镣,大小改變時(shí)只在指定的拉升區(qū)域里拉升圖片。
- 設(shè)置完九宮格后根據(jù)指定區(qū)域拉升
- 九宮格能節(jié)省圖片大小并保持物體的邊角形狀
- 九宮格需使用
laya.ui.Image
對(duì)象來顯示,laya.ui.Image
繼承自Sprite
Handler
- 創(chuàng)建Handler對(duì)象使用
Laya.Handler.create()
靜態(tài)方法
/*
* 從對(duì)象池內(nèi)創(chuàng)建一個(gè)Handler璃哟,默認(rèn)會(huì)執(zhí)行一次并立即回收氛琢,如果不需要自動(dòng)回收,設(shè)置once參數(shù)為false随闪。
* @param caller 執(zhí)行域(this)阳似。
* @param method 回調(diào)方法。
* @param args 攜帶的參數(shù)铐伴。
* @param once 是否只執(zhí)行一次撮奏,如果為true,回調(diào)后執(zhí)行recover()進(jìn)行回收当宴,默認(rèn)為true畜吊。
* @return 返回創(chuàng)建的handler實(shí)例。
*/
static create(caller:any,method:Function,args?:any[],once?:boolean):Handler;
- Handler對(duì)象不直接使用
new
而使用create
方法從對(duì)象池中創(chuàng)建 - 運(yùn)行
run()
方法將直接觸發(fā)一個(gè)Handler
對(duì)象 - 運(yùn)行
runWith()
方法攜帶參數(shù)觸發(fā)户矢,參數(shù)可以是單個(gè)對(duì)象或數(shù)組玲献。 - Handler主要用于通知和回調(diào),可以先創(chuàng)建一個(gè)Handler并告知管理模塊梯浪,當(dāng)有某事件發(fā)生時(shí)可使用
run
或runWith
觸發(fā)已定義的Handler捌年。
$ vim src/game/SceneMgr.js
export default class SceneMgr extends Laya.Script {
constructor() {
super();
}
onAwake(){
console.log("onAwake: "+this.owner.name);
}
onStart(){
console.log("onStart: "+this.owner.name);
//創(chuàng)建處理器
var handler = Laya.Handler.create(this, function(id,name,pid){
console.log(this);//SceneMgr {_id: 4, _indexInList: -1, _enabled: true, _awaked: true, owner: Scene, …}
console.log(id);//1
console.log(name);//junchow
console.log(pid);//undefined
}, [1,"juncow"], true);
//觸發(fā)處理器
handler.run();
//手動(dòng)回收
var handler = Laya.Handler.create(this, function(id,name,pid){
console.log(this);//SceneMgr {_id: 4, _indexInList: -1, _enabled: true, _awaked: true, owner: Scene, …}
console.log(id);//1
console.log(name);//junchow
console.log(pid);//2
}, [1,"juncow"], false);
handler.runWith(2);
handler.recover();
//傳遞多個(gè)參數(shù)
var handler = Laya.Handler.create(this, function(id,name,pid){
console.log(this);//SceneMgr {_id: 4, _indexInList: -1, _enabled: true, _awaked: true, owner: Scene, …}
console.log(id);//1
console.log(name);//junchow
console.log(pid);//10
}, [1,"juncow"], false);
handler.runWith([10, 100, 1000]);
handler.recover();
}
onEnable() {
}
onDisable() {
}
}