Laya Base

開發(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)中添加帶樣式的文本

實(shí)現(xiàn)
  1. 進(jìn)入項(xiàng)目src目錄下新建App.js
$ cd demo
$ http-server ./
$ vim ./src/App.js
  1. 進(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);
  1. 選擇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)建場景

  1. 新建場景
  2. 配置設(shè)計(jì)分辨率
  3. 場景大小與設(shè)計(jì)分辨率保持一致
  4. 配置適配策略

設(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 4001280 x 720兩種屏幕分辨率捅位,或iOS設(shè)備中1136 x 640960 x640兩種屏幕分辨率。

適配策略

  • 策略:橫屏horizontal搂抒、固定高度fixedheight艇搀、設(shè)計(jì)寬度1136、設(shè)計(jì)高度640
  • 注意:場景適配模式選擇固定高度fixedheight求晶,設(shè)計(jì)寬度與設(shè)計(jì)高度與場景的的寬度和高度保持一致。
  • 操作:使用快捷鍵 F9打開 項(xiàng)目設(shè)置 ,也可選擇菜單中 文件 > 項(xiàng)目設(shè)置 逸月。
場景適配參數(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
旋轉(zhuǎn)縮放

腳本

Laya2.0 IDE采用掛載組件腳本與場景管理的方式進(jìn)行開發(fā)如捅,在IDE中編輯場景和頁面組件棍现,通過添加腳本的方式,使項(xiàng)目開發(fā)更利于程序镜遣、美術(shù)己肮、策劃的協(xié)同工作士袄,并對(duì)初次接觸Laya的開發(fā)者更易于上手且開發(fā)方式更加友好。

  • 組件化開發(fā)

創(chuàng)建腳本

  1. 新建組件類
  2. 創(chuàng)建組件類實(shí)例到節(jié)點(diǎn)谎僻,一個(gè)節(jié)點(diǎn)可添加多個(gè)組件實(shí)例娄柳。
  3. 腳本的注冊

操作流程

  1. 打開LayAir2,新建項(xiàng)目選擇空項(xiàng)目艘绍,編程語言選擇JavaScript赤拒。
  2. 選擇編輯模式,新建場景命名為Game诱鞠,寬度設(shè)置為1136挎挖,高度設(shè)置為940。
  3. 點(diǎn)擊快捷鍵F9打開項(xiàng)目設(shè)置航夺,選擇預(yù)覽設(shè)置蕉朵,選擇場景適配模式為fixedheight,設(shè)計(jì)寬度設(shè)置為1136阳掐,設(shè)計(jì)高度設(shè)置為940始衅。
  4. 選擇代碼模式,選擇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);
    }
}

掛腳本的原則

  1. 腳本要控制哪個(gè)節(jié)點(diǎn)轴脐,就掛在哪個(gè)節(jié)點(diǎn)上。
  2. 如果是全局的管理類抡砂,一般都會(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)行過程

  1. 引擎加載場景
  2. 引擎獲取場景中的每個(gè)節(jié)點(diǎn)
  3. 由節(jié)點(diǎn)獲取每個(gè)組件實(shí)例
  4. 特定時(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代碼模式中查看類的定義

F12轉(zhuǎn)到定義

例如:laya.components.Script繼承自Laya.components.Component

  • API文檔中查看接口說明

接口文檔地址:http://layaair2.ldc2.layabox.com/api/

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)來控制
項(xiàng)目設(shè)置

組件訪問節(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í)例.ownerlaya.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.xthis.owner.y屬于laya.display.Sprite類的成員。
  • 大新骞谩:this.owner.widththis.owner.height屬于laya.display.Sprite類的成員上沐。
  • 旋轉(zhuǎn):this.owner.rotation旋轉(zhuǎn)的單位是度,屬于laya.display.Sprite類成員楞艾。
  • 縮放:this.owner.scaleXthis.owner.scaleY屬于laya.display.Sprite類成員参咙。
  • 扭曲:this.owner.skewXthis.owner.skewY屬于laya.display.Sprite類成員龄广。
  • 可見度:this.owner.visible屬于laya.display.Sprite類成員。
  • 透明度:this.owner.alpha屬于laya.display.Sprite類成員蕴侧。
  • 中心點(diǎn):this.owner.pivotXthis.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)類型無需攜帶包名酱酬。

操作流程

  1. 創(chuàng)建標(biāo)準(zhǔn)空Laya項(xiàng)目
  • 創(chuàng)建Game.scene場景
  • 配置項(xiàng)目設(shè)置 編輯模式F9:固定高度 設(shè)計(jì)寬高與場景保持一致
  1. 創(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)系。
  1. 組件代碼如何綁定數(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ī)則

編輯器綁定規(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() {
    }
}
編輯器綁定規(guī)則

編輯器綁定的數(shù)據(jù)類型

  • 基本數(shù)據(jù)類型:Int麻车、NumberString斗这、Bool
  • 場景節(jié)點(diǎn)類型(無需帶包名):Node动猬、SpriteButton
$ 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赁咙。

設(shè)置組件上的數(shù)值

調(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)試查看輸出

調(diào)試

編輯器綁定常用類型

查找節(jié)點(diǎn)

  1. 組件代碼中如何查找節(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.Nodescene可獲取節(jié)點(diǎn)所在的場景
  • laya.display.Nodeparent查找子節(jié)點(diǎn)的父節(jié)點(diǎn)
  • laya.display.NodenumChildren可獲取子節(jié)點(diǎn)的數(shù)量
  • laya.display.Node_children可獲取子節(jié)點(diǎn)的數(shù)組
  • laya.display.NodegetChildByName()根據(jù)節(jié)點(diǎn)名稱獲取場景中的子節(jié)點(diǎn)
  • laya.display.NodegetChildByAt(index)根據(jù)索引查找節(jié)點(diǎn)
  • laya.display.NodegetChildIndex()獲取節(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() {
    }
}
  1. 代碼中如何添加節(jié)點(diǎn)
  • laya.display.NodeaddChild添加單個(gè)子節(jié)點(diǎn)
  • laya.display.NodeaddChildren添加多個(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顯示圖片

  • Sprite中的texture屬性可指定需要顯示的圖片,若沒有則什么都不顯示渤刃。
  • Sprite的縮放參數(shù)scaleXscaleY拥峦,若scale為負(fù)數(shù)則會(huì)被鏡像。
  • Sprite的大小改變圖片也會(huì)跟著縮放
Sprite圖片

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í)可使用runrunWith觸發(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() {
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挂洛,隨后出現(xiàn)的幾起案子礼预,更是在濱河造成了極大的恐慌,老刑警劉巖虏劲,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件托酸,死亡現(xiàn)場離奇詭異,居然都是意外死亡柒巫,警方通過查閱死者的電腦和手機(jī)获高,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吻育,“玉大人,你說我怎么就攤上這事淤井〔继郏” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵币狠,是天一觀的道長游两。 經(jīng)常有香客問我,道長漩绵,這世上最難降的妖魔是什么贱案? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮止吐,結(jié)果婚禮上宝踪,老公的妹妹穿的比我還像新娘侨糟。我一直安慰自己,他們只是感情好瘩燥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布秕重。 她就那樣靜靜地躺著,像睡著了一般厉膀。 火紅的嫁衣襯著肌膚如雪溶耘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天服鹅,我揣著相機(jī)與錄音凳兵,去河邊找鬼。 笑死企软,一個(gè)胖子當(dāng)著我的面吹牛庐扫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澜倦,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼聚蝶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了藻治?” 一聲冷哼從身側(cè)響起碘勉,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桩卵,沒想到半個(gè)月后验靡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雏节,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年胜嗓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钩乍。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辞州,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寥粹,到底是詐尸還是另有隱情变过,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布涝涤,位于F島的核電站媚狰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阔拳。R本人自食惡果不足惜崭孤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辨宠,春花似錦遗锣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至派殷,卻和暖如春还最,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毡惜。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工拓轻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人经伙。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓扶叉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帕膜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枣氧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353