1. 程式人生 > >使用貝塞爾曲線設計飛昇動畫

使用貝塞爾曲線設計飛昇動畫

在遊戲中,資源的獲取或者獎勵的獲得,都會有一個簡單的動畫,以提高使用者體驗。

引擎cocos creator 語言JavaScript

需求

1.在資源點開始要做個簡單的出現的動畫,之後停頓很短時間,讓玩家有感覺。
  2.停頓完成後飛昇到頂部資源欄此資源處。
  3.到達頂部資源處後,此資源顯示出做出接受飛昇上來的資源的動畫。

方案

使用貝塞爾曲線,延時

解決

設飛昇起點為A,停頓點為B,重點為C
  1.在資源欄資源處新增一個動畫。
  2.資源在A點時,做第一段貝賽爾曲線運動到B點,距離不能太遠,用時不能太長。
  3.資源到達B點時,設計一個延時再做下一段動畫,延時時間不能太長影響體驗。
  4.在延時後做第二段貝塞爾曲線運動到達C點。
  5.到達C點時,飛昇上來的資源消失,大概同時播放資源欄資源處的動畫。

程式碼

1.此處用3個金幣來做飛昇動作。id用來標識是哪個資源(此處為金幣),initPos為起始座標,targetPos為終點座標。最後發出事件。

for (var i = 0; i < 3; i++) {
    var ev = new cc.Event.EventCustom('onPickRes', true);
    ev.setUserData({
        resID: tb.TID_RESOURCE_MONEY,
        initPos: kf.getLocationInRoot(this.flyGoldNode),
        targetPos: {x: 0, y : 0}
    });
    this.node.dispatchEvent(ev);
}

2.這裡為收到1事件的處理,首先如果是這個資源,進行初始設定。flyResItemName為動畫的那個類(它作為元件的);targetPos為重新設定的終點位置;this.flyGoldNode為掛載飛昇上去後資源欄那個資源動畫的節點;this.titleBar是其他隱藏掉的東西;this.flyGoldAnimation為飛昇上去後資源欄那個資源的動畫(動畫前0.5s啥都不做,未來和飛昇動作匹配);script代表貝賽爾曲線那個類(3就是那個類)。

if(resID === tb.TID_RESOURCE_MONEY) {
    flyResItemName = "flyResGold";
    targetPos = kf.getLocationInRoot(this.flyGoldNode);
    this.flyGoldNode.active = true;
    this.titleBar.getComponent("titleBar").setGoldIcon(false);
    this.flyGoldAnimation.play( );
}

if(!flyResItemName) return;
var instance = this.preloadLogic.getPrefabEx(flyResItemName);
var script = instance.getComponent(flyResItemName);
script.init(initPos, targetPos);
this.node.addChild(instance);
script.fly();

3.飛昇-停頓-飛昇動畫的實現

  init函式主要是初始化。
  fly函式實現了兩個貝賽爾曲線(bezier和nextBezier),進行Bezier後調delayTime延時0.05作為停頓效果,再進行nextBezier。
  update主要用於資源的管理,更新(比如飛到位後根據this.actionState動作的狀態消失)。
cc.Class({
    extends: cc.Component,

    properties: {

    },

    // use this for initialization
    onLoad: function () {
        this.preloadLogic = kf.require("logic.preload");
    },

    init: function (initPos, targetPos) {
        this.actionState = null;
        this.initPos = initPos;
        this.targetPos = targetPos;
    },

    fly: function () {
        this.node.setPosition(this.initPos);
        this.node.stopAllActions();
        var bezier = [cc.p(this.initPos.x + Math.random()*20, this.initPos.y + Math.random()*20), cc.p(this.initPos.x + Math.random()*40, this.initPos.y + Math.random()*40), cc.p(this.initPos.x+ Math.random()*80, this.initPos.y + Math.random()*50)];
        var action = cc.bezierTo(0.5, bezier);

        var nextBezier = [cc.p(this.node.x + Math.random()*200 - 100, this.node.y + 200), cc.p(this.node.x + Math.random()*200 - 100, this.node.y + 350), this.targetPos];
        var nextAction = cc.bezierTo(0.5, nextBezier);

        this.actionState = this.node.runAction(cc.sequence(action, cc.sequence(cc.delayTime(0.05), nextAction)));
    },

    update: function () {
        if(this.actionState && this.actionState.isDone()){
            this.preloadLogic.putInPool(this.node.name, this.node);
            this.actionState = null;
        }
    }
});

4.物件池中物件管理。

  getPrefabEx:size判斷物件池中是否有空閒物件。如果沒有空閒物件,也就是物件池中備用物件不夠時,我們就用 cc.instantiate 重新建立。
  putInPool:將節點放進物件池,這個方法會同時呼叫節點的 removeFromParent。
preloadLogic.getPrefabEx = function (name) {
    var prefab = undefined;
    if(this.isPool(name)){
        var pool = this[name+'Pool'];
        if (pool.size() > 0) {
            prefab = pool.get();
            this.reRegisterEvent(prefab,name);
        } else {
            prefab = cc.instantiate(this[name+'Prefab']);
        }
    }

    return prefab;
};
preloadLogic.putInPool = function (name, prefab) {
    var pool = this[name+'Pool'];
    if(pool){
        var js = prefab.getComponent(name);
        if (js && js.unregisterEvent) {
            js.unregisterEvent();
            js.registerHandler = [];
        }
        pool.put(prefab);
    }
};
preloadLogic.isPool = function (name) {
    return this[name + "Pool"] && this[name + "Prefab"];
};

preloadLogic.reRegisterEvent = function(node,name){
    var jsComp = node.getComponent(name);
    if (jsComp && jsComp.registerEvent && jsComp._isOnLoadCalled !== 0)
        jsComp.registerEvent();
};

總結

在過程中有幾次設計問題,在資源欄資源那個動畫處,本來動畫沒有前0.5s啥不做這個設計,也想用延時來做,但是在delay之後,動畫play卻沒有呼叫,這是個疑惑點,研究下。
  加油!

相關推薦

使用曲線設計飛昇動畫

在遊戲中,資源的獲取或者獎勵的獲得,都會有一個簡單的動畫,以提高使用者體驗。引擎cocos creator 語言JavaScript需求1.在資源點開始要做個簡單的出現的動畫,之後停頓很短時間,讓玩家有感覺。  2.停頓完成後飛昇到頂部資源欄此資源處。  3.到達頂部資源處後

曲線與CSS3動畫、SVG和canvas的應用

document cnblogs blank otto style 函數 alt one absolut 簡介 貝塞爾曲線是可以做出很多復雜的效果來的,比如彈跳球的復雜動畫效果,首先加速下降,停止,然後彈起時逐漸減速的效果。 使用貝塞爾曲線常用的兩個網址如下: 緩動函

可視化n次曲線及過程動畫演示--大寶劍

ike all AS 2個 pat title pre while todo 先拋一個動畫模擬的一個例子,吊一吊Xing趣(4次) 不夠強?再來一個 這樣子,滿足你。demo說明 git倉庫地址示例 我眼睛花,沒看懂,能暫停不了? 可以控制動畫暫停與繼續。(供大家清

曲線實現的購物車添加商品動畫效果

right map 繪制 開始 enter 監聽 idg 過程 protected 效果圖如下: 1.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xm

把商品添加到購物車的動畫效果(曲線

param from mat 位置 hold pos 開始 onclick border 目錄(?)[+] 如圖: 參考: Android補間動畫,屬性動畫實現購物車添加動畫 思路: 確定動畫的起終點 在起終點之間使用二次貝塞爾曲線填充起終點之間的點的軌跡 設置屬

css曲線模仿餓了麽購物車小球動畫

viewport title output 代碼 put 動畫效果 doc int class 在線觀看貝塞爾曲線值:傳送門 在線觀看動畫效果:傳送門 代碼: <!DOCTYPE html> <html> <head> <me

多個曲線在同一個animate動畫中的實踐

貝塞爾曲線(Bézier curve): 又稱貝茲曲線或貝濟埃曲線,是應用於二維圖形應用程式的數學曲線。一般的向量圖形軟體通過它來精確畫出曲線,貝茲曲線由線段與節點組成,節點是可拖動的支點,線段像可伸縮的皮筋,我們在繪圖工具上看到的鋼筆工具就是來做這種向量曲線的。貝塞爾曲線是計算機圖形學中相

曲線動畫demo(仿美人相機效果)

效果如圖: 仿美人相機,手勢滑動隱藏頂部view。為了方便講解,將螢幕分為幾個區域,如圖: 在拖動過程中: 1、拖動距離小於minMoveDistance,貝賽爾曲線發生形變 2、拖動大於minMoveDistance,整個view開始下移 在鬆開手時: 1、

自定義view,曲線實現水波紋效果的動畫

作為一名碼農,除了用基本的姿勢去搬磚,還應該get一些炫酷的技能,用高逼格的姿態去搬磚。而貝塞爾曲線無疑是炫酷技能之一。 簡介: Bézier curve(貝塞爾曲線)是應用於二維圖形應用程式的數學曲線。 曲線定義:起始點、終止點(也稱錨點)、控制點。通過調整控

曲線生成動畫

剛剛開始接觸java swing,做了一個小小的java介面程式展示貝塞爾曲線的生成過程,同時作為自己的技術練習。 貝塞爾曲線介紹 簡單來說,貝塞爾曲線就是一條經過平滑操作的折線,這條折線的頂點叫做“控制點”,控制著貝塞爾曲線的走向。 由於用計算機畫圖大部分時間是操作滑鼠來掌握線條的路

一個精美的跳動小球—手把手教你用曲線實現一個酷炫跳動動畫

前言介紹 手把手教你用貝塞爾曲線實現一個精美的跳動的小球。 正文 效果展示: 說點題外話 一開始呢,我就想實現一個這樣的效果,於是就新建了一個專案開始擼,結果中間嘗試了幾種實現方案都不是很理想,也有一些條件未能實現就停止開發了,後面又去惡補了一下相關知識,突然在某一天的某一刻的某一瞬間靈感來了

Android自定義View阻尼動畫&曲線的實現

效果圖:直接上程式碼啦:package com.example.administrator.myapplication.customview; import android.animation.Animator; import android.animation.Anim

一個曲線動畫演示

經常寫動畫,好的動畫效果,可以使應用的level提升好幾個檔次, 下面有一個動畫顯得很舒服!個人表示很喜歡,在此做個記錄。 //貝塞爾曲線動畫 - (IBAction)clickAction:(UIButton *)sender { //把圖

動畫】簡易製作曲線動畫(JS+css3+canvas)

一些廢話(直接看程式碼的可跳過) 貝塞爾曲線:什麼是貝塞爾曲線?用過PS的就知道,那破鋼筆工具就是,什麼,沒用過?自行百度用法。 需要的工具 ctrl+c、ctrl+v 直接上程式碼 <!DOCTYPE html>

Android 高階UI解密 (四) :花式玩轉曲線(波浪、軌跡變換動畫

講解此UI系列必然少不了一個奇妙數學曲線—–貝塞爾曲線,它目前運用於App的範圍是在太廣了,最初的QQ氣泡拖拽,到個人介面的波浪效果、Loading波浪效果,甚至於軌跡變化的動畫都可以依賴貝塞爾曲線完成,多麼完美的曲線,妙也! 此篇文章並不自己造輪子實現貝塞爾

android高階動畫——曲線

Android高階動畫所有程式碼 簡介:貝塞爾曲線是計算機圖形學中相當重要的引數曲線。可以用數學公式來描述一段曲線。 用途:1、貝塞爾曲線可以幫助我們在二維平面內用平滑的曲線畫出各種圖形。 2、同時也可以給動畫提供一個平滑的曲線運動路徑。 android中我們通過Path可

購物車特效-曲線動畫(點選新增按鈕,產生拋物線動畫效果)

demo效果: l 購物車特效原理: 1.從新增按鈕獲取開始座標 2.從購物車圖示獲取結束座標 3.打氣一個檢視,新增屬性動畫ObjectAnimator(縮小),ValueAnimator(路線) 4.動畫開始時新增該檢視,動畫結束刪除該檢視 5.運動路徑使用T

Android開發之曲線進階篇(仿直播送禮物,餓了麼購物車動畫

又是一年畢業季,今年終於輪到我了,最近一邊忙著公司的專案,一邊趕著畢設和論文,還私下和朋友搞了些小外包,然後還要還抽出時間寫部落格,真是忙的不要不要的。 好了,言歸正傳,前幾天寫了一篇關於貝塞爾曲線的基礎篇,如果你對貝塞爾曲線還不是很瞭解,建議你先去閱讀下:Android開發之貝塞爾曲線初體驗 ,今天這篇文

Unity遊戲中使用曲線

str net 順序 復雜 讓我 創建 函數 高程 gin 孫廣東 2015.8.15比方在3D rpg遊戲中。我們想設置彈道,不同的軌跡類型!目的:這篇文章的主要目的是要給你關於在遊戲怎樣使用貝塞爾曲線的基本想法。 貝塞爾曲線是最主要的曲線,一般用

iOS 使用曲線繪制路徑

繪制直線 多邊形 ini rcc 三個點 memory images arc poi 使用貝塞爾曲線繪制路徑 大多數時候,我們在開發中使用的控件的邊框是矩形,或者做一點圓角,是使得矩形的角看起來更加的圓滑。 但是如果我們想要一個不規則的圖形怎麽辦?有人說,叫UI