canvas動畫 自由落體運動

2022-07-07 22:54:16 字數 2153 閱讀 9621

經過前面的文章,我們已經能夠在canvas畫布上畫出各種炫酷的圖形和畫面,但是這些畫面都是禁止的,怎麼樣才能讓他們動起來呢?

儲存canvas狀態。

繪製動畫圖形(animated shapes)。

恢復 canvas 狀態。

在 canvas 上繪製內容是用 canvas 提供的或者自定義的方法,而通常,我們僅僅在指令碼執行結束後才能看見結果,比如說,在 for 迴圈裡面做完成動畫是不太可能的。

因此,為了實現動畫,我們需要一些可以定時執行重繪的方法。window物件提供了下面的方法實現定時動畫:

如果你並不需要與使用者互動,你可以使用setinterval()方法,它就可以定期執行指定**。如果我們需要做乙個遊戲,我們可以使用鍵盤或者滑鼠事件配合上settimeout()方法來實現。通過設定事件監聽,我們可以捕捉使用者的互動,並執行相應的動作。

window.requestanimationframe()這個方法提供了更加平緩並更加有效率的方式來執行動畫,當系統準備好了重繪條件的時候,才呼叫繪製動畫幀。一般每秒鐘**函式執行60次,也有可能會被降低。

window.requestanimationframe = (function();

})();

上面介紹了canvas動畫的基本概念,接下來我們將會在canvas中實現小球下落的動畫。小球的完整**再本文結尾。點選可跳轉到結尾。

首先需要在canvas上繪製乙個小球。

var ctx = document.getelementbyid('canvas').getcontext('2d');

if (!ctx)

var ball = ,

clear: function()

}ball.draw(); // 繪製小球

繪製了小球之後,要新增動畫,還需要為小球新增速率向量進行移動。另外,速度也是變化的量,對於只有落體運動,還有豎直方向的重力加速度,所以還需要為小球加上加速度。

var ball = ,

dx: function() ,

dy: function() ,

next: function() ,

};

var animate; // 記錄動畫

ball.draw();

// 繪製一幀

function draw()

若沒有任何的碰撞檢測,我們的小球很快就會超出畫布。我們需要檢查小球的 x 和 y 位置是否已經超出畫布的尺寸以及是否需要將速度向量反轉。

boundary: function(top, right, bottom, left)  else if (this.y < top)  else if (ball.x > right)  else if (ball.x < left) 

}

為了使得小球運動更加逼真,可以新增拖尾效果。使用clearrect函式清除前一幀動畫時,若用乙個半透明的fillrect函式取代之,就可輕鬆製作長尾效果。

ctx.fillstyle = 'rgba(255,255,255,0.3)';

ctx.fillrect(0,0,canvas.width,canvas.height);

移動滑鼠到canvas內可讓小球動起來!

在實際的生活中,小球碰撞到地面**的時候,**的高度會越來越低,因為碰撞地面損失了一部分速度。

boundary: function(top, right, bottom, left)  else if (this.y < top)  else if (ball.x > right)  else if (ball.x < left) 

}

上面這種方式會偶爾使得小球無法**。

在碰撞地面的時候,小球的**之後的速度和位移,準確值需要根據嚴格的勻加速公式以及損失之後的速度來計算。

邊界檢查時上述方法是檢查圓心和邊界的位置,更好的方式是檢查圓周和邊界的距離。

原始碼可以以及效果可以參考這兒:本文例項

上述所有方式的源**如下:

```html

ball animate

```

模擬自由落體運動的小球

基於vs2019 easyx外掛程式 c c include include include using namespace std int main double y 100 double step 0 double g 0.5 while 1 if y 580 防止小球穿過地面 cleardev...

OpenGL繪製球體模擬自由落體運動(基於Qt)

自由落體的物理公式想必大家都清楚 y vt 0.5gt 2 但是用程式如何模擬這個過程呢?1 其中比較關鍵的是設定乙個計時器,在乙個視覺暫留時間段 dt 0.02s 內根據小球的位置座標繪製小球。2 在小球彈到地面的時候會因為碰撞而有能量損耗,其表現形式為速度減小並反向,而速度減小則可以通過改變加速...

NOIP 2002 自由落體

題目描述 在高為 h 的天花板上有 n 個小球,體積不計,位置分別為 0,1,2,n 1。在地面上有乙個小車 長為 l,高為 k,距原點距離為 s1 已知小球下落距離計算公式為 d 1 2 g t 2 其中 g 10,t 為下落時間。地面上的小車以速度 v 前進。小車與所有小球同時開始運動,當小球距...