1. 程式人生 > >CocosCreator之KUOKUO帶你做觸控後歸位(5)

CocosCreator之KUOKUO帶你做觸控後歸位(5)

本次引擎2.0.5

編輯工具VSCode

如遇不會某個步驟可以先過一遍之前教程,或者下方評論,感謝支援!

目標:讓不聽話小方塊聽話

今天教大家CocosCreator的觸控監聽函式;

(遊戲內座標是中心為原點,對於觸控是左下角為原點,需轉換)

好了,我們新建一個專案:

然後建個白色背景(Sprite(單色))起名bk,

再建一個紅色主角;

我們的主角是怎麼不聽話的呢?

你點它它就亂跑!

我們給它綁個指令碼先:

新建個zhujuejs,哦,記得儲存一下場景。

然後我們把指令碼繫結在主角上:

開啟指令碼,讓指令碼可愛起來。

我們解開onLoad的封印(哈哈),指令碼的執行順序是:onLoad(),然後start(),然後update(dt)

隨後update(dt)在遊戲的每一幀都呼叫。

(我們宣告一些東西都在onLoad,然後在start中處理。)

好,我們寫下一個觸控監聽函式:

在onLoad()函式中寫下了觸控監聽函式,監聽的是‘touchstart’,也就是點選開始

(觸控事件有4個:開始時(1次),移動時(n次),在節點中擡起手(1次),在節點外擡起手(1次))

對應的是:

懂了吧,我們來讓小方塊不聽話:

cc.Class({
    extends: cc.Component,

    properties: {
    },
    onLoad () {
        this.node.on('touchstart',function(){
            //x應該是在-430到430之間運動
            this.node.x = -430 + 860*Math.random();
            //y應該是在-270到270之間運動
            this.node.y = -270 + 540*Math.random();
        },this);
    },

    start () {

    },

    // update (dt) {},
});

滑鼠點下去,它就跑啦~~不聽話吧,滑稽!

但是它是瞬間過去的,我們結合動作系統讓它飄逸起來。

第一步先加動作:

怎麼樣,當你點的時候,你會發現,它咻的一下飛出去了。

怎麼樣?但是不聽話的小方塊不是好方塊。

我們讓它聽話:

我們改一下監聽的動作,監聽touchmove。

有的小夥伴問了:我們手指在螢幕上移動時,怎麼得到觸控點呢?

這麼得到,在function(這裡加個event來接受);

但是我們執行的時候會發現節點不在觸控點,這是因為我之前說的,Cocos有兩個座標系,一個觸控的,一個遊戲內的。

我們轉換一下:

成功是成功了,可是他為什麼會抖動加閃爍呢?

哈哈,因為這個:

因為以本節點(主角)為參考,,但主角在動啊!!!!!

那怎麼辦,找個不動的唄!(主角的父節點是Canvas,不動)

(別告訴我你不會看子節點和父節點,好吧,我簡單講一下,在層級管理器中,預設Canvas是老大,點開它的下拉小三角,那都是它的父節點。同理)

好了,我們以主角的父節點為基準:

cc.Class({
    extends: cc.Component,

    properties: {
    },
    onLoad () {
        this.node.on('touchmove',function(event){
            var touch_xy = event.getLocation();//獲取當前觸點位置
            //以本節點父節點為參考,轉換觸控座標至遊戲座標
            var game_xy = this.node.parent.convertToNodeSpaceAR(touch_xy);
            this.node.x = game_xy.x;
            this.node.y = game_xy.y;
        },this);
    },

    start () {

    },

    // update (dt) {},
});

好了,我們的小方塊可以聽話的跟著觸控點走了呢!

那麼下一個問題,怎麼回去呢???

簡單,加個變數儲存就行了。

(給出程式碼)

cc.Class({
    extends: cc.Component,

    properties: {
        //用於儲存座標
        old_xy:null,
    },
    onLoad () {
        //點選後把座標存好
        this.node.on('touchstart',function(){
            //this.node.position的用處跟分別給x,y賦值是一樣的
            this.old_xy = this.node.position;
        },this);
        //移動
        this.node.on('touchmove',function(event){
            var touch_xy = event.getLocation();//獲取當前觸點位置
            //以本節點父節點為參考,轉換觸控座標至遊戲座標
            var game_xy = this.node.parent.convertToNodeSpaceAR(touch_xy);
            this.node.x = game_xy.x;
            this.node.y = game_xy.y;
        },this);
        //觸控結束時
        this.node.on('touchend',function(){
            //把節點的位置重新給回來
            this.node.position = this.old_xy;
        },this);
    },

    start () {

    },

    // update (dt) {},
});

怎麼樣,學會了嗎?

O(∩_∩)O~~