1. 程式人生 > >canvas 簡單的小球拋物線實現和簡單的應用

canvas 簡單的小球拋物線實現和簡單的應用

使用canvas實現簡單的小球下落

canvas可以實現一些有趣的繪畫,可以實現規則或者不規則的圖形。我們這裡的小球就是一個通過canvas的方法arc畫出的圓。我們可以使用storke和fil來實現圓的顏色和邊框,如果你還想讓圓在漂亮一些,使用createRadialGradient可以實現球顏色的漸變。

var grad  = context.createRadialGradient(x,y,5,x,y,20);
        //顏色
        grad.addColorStop(0,'rgb(231, 74, 148)');
        grad.addColorStop(0.5
,'rgb(99, 75, 231)'); grad.addColorStop(1,'rgb(78, 228, 156)'); if(jiaflag!=1){ Curve(cxt,x,y); } cxt.beginPath(); cxt.arc(x,y,ball.r,0,2*Math.PI); cxt.strokeStyle="#000000"; cxt.fillStyle=grad;

這裡寫圖片描述
樣子大概就是這樣,createRadialGradient的各個引數的意思是
context.createRadialGradient(x0,y0,r0,x1,y1,r1);
x0 漸變的開始圓的 x 座標
y0 漸變的開始圓的 y 座標
r0 開始圓的半徑
x1 漸變的結束圓的 x 座標
y1 漸變的結束圓的 y 座標
r1 結束圓的半徑

動畫

小球畫好了,怎麼樣才能讓小球動起來呢?其實很簡單,所謂的動畫其實質就是一幀一幀的靜態元素組合起來,讓人眼感覺像是動的一樣。所以讓小球動起來,你需要在頁面讓不停的畫小球,而且你畫的小球的位置要符合運動的規律,這樣你的小球就動了起來。
首先,我們建立一個物件來存放小球的資訊,圓心座標、半徑、角度等等。

var ball = {//初始化小球
        x: 105,
        y: 500,
        r:20,
        g:2,
        vx:-4,
        vy:-40
    }

小球已經存在了我們只需要通過小球的屬性畫出來就行了。這裡我們使用一個方法實現,方便以後使用。

 function drawball(cxt,x,y){//畫小球
        cxt.clearRect(0,0,context.canvas.width,context.canvas.height);
        var grad  = context.createRadialGradient(x,y,5,x,y,20);
        //顏色
        grad.addColorStop(0,'rgb(231, 74, 148)');
        grad.addColorStop(0.5,'rgb(99, 75, 231)');
        grad.addColorStop(1,'rgb(78, 228, 156)');
        cxt.beginPath();
        cxt.arc(x,y,ball.r,0,2*Math.PI);
        cxt.strokeStyle="#000000";
        cxt.fillStyle=grad;
        cxt.stroke();
        cxt.fill();
        cxt.closePath();
    }

這樣我們就通過函式的方法畫出了小球,到時候我們只需要通過不停的呼叫這個方法就可以畫出運動的球了。當然,每次我們只需要出現一個小球,所以需要用clearRect來清除畫布。
小球運動的軌跡,我們就用一個平拋來實現。
平拋運動大家都很熟悉,你需要知道的是水平初速度和垂直初速度還有加速度。這裡我們只是簡單的例子,所以並不會完全按照實際生活中的重力加速度來計算。

 function update(){//通過簡單的運動原理更新小球位置
        ball.x = ball.x + ball.vx;
        ball.y = ball.y + ball.vy;
        ball.vy = ball.vy + ball.g;

        if( ball.y > (600 - ball.r)){//下邊框碰撞檢測
            ball.y = 600 - ball.r;
            ball.vy = -ball.vy*0.5;
        }

        if( ball.x < (ball.r)){//左邊框碰撞檢測
            ball.vx = -ball.vx;
        }
        if( ball.y < (ball.r)){//上邊框碰撞檢測
            ball.y = ball.r;
            ball.vy = -ball.vy*0.5;
        }
    }

這裡我只寫了上、左、下的邊框,右邊的沒寫,所以小球是可以從右邊滾出畫布的。我們可以通過修改的vx、vy來決定是上拋和下拋、左拋和右拋。

小球的運動軌跡

大家可能玩過憤怒的小鳥,在小鳥發射的時候會有一條小鳥經過的軌跡,那麼這些軌跡有事如何實現的呢?原理和我們小球運動是一樣的。不一樣的是我們需要清除畫布確保只有一個小球,而軌跡則需要保留。那麼既然每次都會清除畫布重繪,怎麼樣才能保留運動軌跡的小球的?也很簡單我們只需要定義一個數組來存放每次的運動位置,在小球重繪的時候,使用for迴圈把軌跡重繪就行了。
這裡寫圖片描述

主要的原理就這些,我這裡在畫布上還加了一個橢圓 權當做一個籃框,當小球座標在橢圓內的時候就相當於進了一個球。
這裡寫圖片描述

瀏覽器相容