js模擬拋物運動和慣性運動
js模擬拋物運動和慣性運動
一.普通移動
利用請求動畫幀requesrannamitionframe()----16.67ms執行一次
1.佈局
<body>
<div class="wrap">
<div class="ball"></div>
</div>
</body>
2.CSS樣式
<style>
.wrap{
width: 1200px;
height: 600px;
background-color: aqua;
margin: 50px auto;
position: relative;
}
.ball{
width: 100px;
height: 100px;
background-color: red;
/* 設定圓角*/
border-radius: 50%;
position: absolute;
left: 0;
top: 0;
}
</style>
3.js實現(遞迴函式實現)
<script>
var spX = 3;
var spY = 3;
var oB = document.querySelector(".ball");
var oW = document.querySelector(".wrap");
requestAnimationFrame(function moveBall (){
oB.style.left = oB.offsetLeft+spX+"px";
oB.style.top =oB.offsetTop+spY+"px";
requestAnimationFrame(moveball);//遞迴函式持續進行
}
二.在固定範圍內運動
*大於最大值就把當前最大值給他並且速度取反
requestAnimationFrame(function moveBall (){
var wL = oB.offsetLeft + spX;
var wT = oB.offsetTop + spY;
//右
if(wL>=oW.offsetWidth-oB.offsetWidth){
wL = oW.offsetWidth-oB.offsetWidth;
spX = -spX;
}
//左
if(wL<=0){
wL = 0;
spX = -spX;
}
//下
if(wT>=oW.offsetHeight-oB.offsetHeight){
wT = oW.offsetHeight-oB.offsetHeight;
spY = -spY;
}
//上
if(wT<=0){
wT = 0;
spY = -spY;
}
oB.style.left = wL + "px";
oB.style.top = wT + "px";
requestAnimationFrame(moveBall);
})
三.在丟擲的方向繼續移動
*換算速度進行求解
//一幀代表兩次onmousemove的時間間隔
<script>
// 往那個方向仍就往哪個方向移動
var spX = 3;
var spY = 3;
var oB = document.querySelector(".ball");
var oW = document.querySelector(".wrap");
oB.onmousedown = function (){
var oBOff = offsetWindow(this);
var disX = event.pageX - oBOff[0];
var disY = event.pageY - oBOff[1];
//時間
var oldT = 0;
var newT = 0;
var chaT = 0;
//位置
var oldP = [0,0];
var newP = [0,0];
var chaX = 0;
var chaY = 0;
document.onmousemove = function (){
var oWOff = offsetWindow(oW);
var wL = event.pageX - disX - oWOff[0];
var wT = event.pageY - disY - oWOff[1];
wL = Math.max(0,wL);
wL = Math.min(oW.offsetWidth-oB.offsetWidth,wL);
wT = Math.max(0,wT);
wT = Math.min(oW.offsetHeight-oB.offsetHeight,wT);
oB.style.left = wL + "px";
oB.style.top = wT + "px";
//得到新位置新時間
newT = new Date().getTime();
newP[0] = wL;
newP[1] = wT;
chaT = newT - oldT;
chaX = newP[0] - oldP[0];
chaY = newP[1] - oldP[1];
oldT = newT;
oldP[0] = newP[0];
oldP[1] = newP[1];
}
document.onmouseup = function (){
spX = chaX*16.67 / chaT;
//spX=chaX/chaT;表示1ms的走過的距離速度
spY = chaY*16.67 / chaT;
//得到速度開啟計時器
requestAnimationFrame(function moveBall (){
var wL = oB.offsetLeft + spX;
var wT = oB.offsetTop + spY;
if(wL>=oW.offsetWidth-oB.offsetWidth){
wL = oW.offsetWidth-oB.offsetWidth;
spX = -spX;
}
if(wL<=0){
wL = 0;
spX = -spX;
}
if(wT>=oW.offsetHeight-oB.offsetHeight){
wT = oW.offsetHeight-oB.offsetHeight;
spY = -spY;
}
if(wT<=0){
wT = 0;
spY = -spY;
}
oB.style.left = wL + "px";
oB.style.top = wT + "px";
requestAnimationFrame(moveBall);
})
//清空原有效果
document.onmousemove = document.onmouseup = null;
}
stopDefault(event);
}
</script>
四.模擬帶有重力加速的的場景
*速度隨之越來越快
末尾賦值 oB.style.left = wL + "px";
oB.style.top = wT + "px";
後spY+=0.3;
五.帶有摩擦效果
變化使speed*0.85....
速度損耗,慢慢停下來
致使判斷終點關閉計時器
<script>
var oW = document.querySelector(".wrap");
var oB = document.querySelector(".ball");
var spX = 5;
var spY = 3;
var timer = requestAnimationFrame(function moveBall (){
timer = requestAnimationFrame(moveBall);
var wL = oB.offsetLeft + spX;
var wT = oB.offsetTop + spY;
if(wL>=oW.offsetWidth-oB.offsetWidth){
wL = oW.offsetWidth-oB.offsetWidth;
spX = -spX*0.9;
spY = spY*0.9;
}
if(wL<=0){
wL = 0;
spX = -spX*0.9;
spY = spY*0.9;
}
if(wT>=oW.offsetHeight-oB.offsetHeight){
wT = oW.offsetHeight-oB.offsetHeight;
//判斷速度,關閉計時器,停在終點
spY = -spY*0.9;
spX = spX*0.9;
if(Math.abs(spY)<=1.5&&Math.abs(spX)<=1.5){
cancelAnimationFrame(timer);
}
}
if(wT<=0){
wT = 0;
spY = -spY*0.95;
}
oB.style.left = wL + "px";
oB.style.top = wT + "px";
spY += 0.3;
})
</script>
相關文章
- JavaScript模擬拋物運動的程式碼實現JavaScript
- canvas小球拋物線運動Canvas
- 移動機器人運動規劃及運動模擬機器人
- JavaScript模擬拋物效果JavaScript
- js動畫 Css提供的運動 js提供的運動JS動畫CSS
- CVPR 2019 | 條件運動傳播:從運動中學習物體性質
- Python模擬太陽-地球-月亮運動模型Python模型
- 整合運放線性區運用的模擬實驗
- javascript 多物體運動JavaScript
- 原生JS實現拋物線動畫以及動態模糊效果JS動畫
- 原生JavaScript運動功能系列(四):多物體多值鏈式運動JavaScript
- 小程式拋物線動畫動畫
- openCV檢測物體是否運動OpenCV
- JavaScript元素上下彈性運動JavaScript
- unity3D 兩點拋物線模擬炮彈Unity3D
- 同時運動 + 鏈式運動
- 登Nature,大腦如何控制運動?DeepMind設計擁有「AI大腦」的虛擬動物AI
- 用C++模擬蚊子的運動來檢驗概率論內容C++
- OverScroll彈性滾動和慣性滾動效果的實現原理——CoordinatorLayout+Behavior
- 分析和自動化推動IT運營革命
- 運動控制
- 模擬資料管理與運維管理,驅動新型電力系統創新運維
- Python自動化運維之IPy模組Python運維
- 自動化運維工具之Puppet模組運維
- 論IT運維自動化的重要性運維
- 類似微信首頁彈性滾動和慣性滾動效果的實現——OverScroll
- 驅動遊戲世界運轉的“心跳”:遊戲迴圈及實時模擬遊戲
- IT運維之自動化運維運維
- 《Boneworks》:顛覆性物理模擬,超強互動
- 運動與健康
- JavaScript運動框架JavaScript框架
- [Linux]Ansible自動化運維② - 工具與模組Linux運維
- 哪種碳水化合物池對運動和大腦更重要?
- 移動端模擬滾動
- 模擬高爾夫快速發展,揮杆高爾夫模擬器讓普通人加入高爾夫運動
- 前端也要懂物理 —— 慣性滾動篇前端
- 系統性體育運動可提高NAD+
- Linux運維習慣小結Linux運維