html中图形做匀速往返运动,JS运动效果的碰壁运动之实现匀速碰壁(JS漂浮广告实现思路)...

本文介绍了一种模拟匀速碰撞运动的方法,特别关注了弹性小球碰壁的情况。通过HTML和JavaScript,创建了一个小球在密闭空间内随机运动并碰撞反弹的互动效果。代码实现中,小球的速度在碰撞时保持不变,仅改变方向。用户可以通过点击按钮开始或结束小球运动,并记录运动次数作为得分。这个模拟常见于网页飘浮广告的设计中。
摘要由CSDN通过智能技术生成

碰撞运动可能是运动系列里面比较复杂的运动了。

匀速碰壁

碰壁是一种常见的碰撞形式,匀速碰壁是最简单的碰撞运动

假设一个密闭空间内一个弹性小球,小球有一个随机方向随机大小的初始速度。当小球碰壁时,速度不损失,而是做反向的匀速运动

用法常见的得最多的是飘浮广告样式了。html>

开始运动

停止运动

点“开始运动”小球开始运动

var timer,i=0;

//声明得分

var key = 0;

var arr = ['orange','lightgreen','lightcoyal','pink','lightcyan','lightgray','lightseagreen','lightsteelblue'];

function changeColor(){

i++;

if(i == arr.length){

i = 0;

}

test.style.background = arr[i];

}

document.onmousemove = function(){

return false;

}

test.onclick = function(){

//当小球开始运动后,开始记分

if(test.timer){

result.innerHTML = '当前得分为:' + ++key + '分'

}

changeColor();

}

btn1.onclick = function(){

result.innerHTML = ''

//将分数清零

key = 0;

collisionMove({

obj:test

})

clearInterval(timer);

timer = setInterval(function(){

changeColor();

},500);

}

btn2.onclick = function(){

clearInterval(timer);

clearInterval(test.timer);

test.timer = 0;

result.innerHTML = '你得到:' + key + '分,再接再厉!'

}

function getCSS(obj,style){

if(window.getComputedStyle){

return getComputedStyle(obj)[style];

}

return obj.currentStyle[style];

}

function collisionMove(json){

var obj = json.obj;

var fn = json.fn;

//声明x、y轴的当前值

var curX = parseFloat(getCSS(obj,'left'));

var curY = parseFloat(getCSS(obj,'top'));

//声明x、y轴的步长值

var stepX = json.stepX;

var stepY = json.stepY;

//步长值默认值为[-25,-20,-15,-10,-5,0,5,10,15,20]中的一个随机数

stepX = Number(stepX) || 5*Math.floor(Math.random() * 10 - 5);

stepY = Number(stepY) || 5*Math.floor(Math.random() * 10 - 5);

//声明x、y轴方向

var dirX = json.dirX;

var dirY = json.dirY;

dirX = stepX > 0 ? '+' : '-';

dirY = stepY > 0 ? '+' : '-';

//声明offset宽高

var offsetWidth = obj.offsetWidth;

var offsetHeight = obj.offsetHeight;

//声明元素活动区域宽高

var activeWidth = json.activeWidth;

var activeHeight = json.activeHeight;

//元素获取区域宽高默认值为可视区域宽高

activeWidth = Number(activeWidth) || document.documentElement.clientWidth;

activeHeight = Number(activeHeight) || document.documentElement.clientHeight;

//声明left、top样式值

var left;

var top;

//清除定时器

if(obj.timer){return;}

//开启定时器

obj.timer = setInterval(function(){

//获取x、y轴的当前值

curX = parseFloat(getCSS(obj,'left'));

curY = parseFloat(getCSS(obj,'top'));

//更新left、top值

left = curX + stepX;

top = curY + stepY;

//右侧碰壁前一刻,步长大于剩余距离,且元素向右运动时

if((left > activeWidth - offsetWidth) && (dirX == '+')){

left = activeWidth - offsetWidth;

}

//左侧碰壁前一刻,步长大于剩余距离,且元素向左运动时

if((Math.abs(stepX) > curX) && (dirX == '-')){

left = curX;

}

//下侧碰壁前一刻,步长大于剩余距离,且元素向下运动时

if((top > activeHeight - offsetHeight) && (dirY == '+')){

top = activeHeight - offsetHeight;

}

//上侧碰壁前一刻,步长大于剩余距离,且元素向上运动时

if((Math.abs(stepY) > curY) && (dirY == '-')){

top = curY;

}

obj.style.left= left + 'px';

obj.style.top = top + 'px';

//左侧或右侧碰撞瞬间

if(left == activeWidth - offsetWidth || left == curX){

stepX = -stepX;

}

//上侧或下侧碰撞瞬间

if(top == activeHeight - offsetHeight || top == curY){

stepY = -stepY;

}

//更新运动方向

dirX = stepX > 0 ? '+' : '-';

dirY = stepY > 0 ? '+' : '-';

},20);

}

eddad2394ccc6cf525cc160a67573f70.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值