原生js实现红球碰撞篮球效果

1. 屏幕中随机产生n个蓝色大小不一的气泡,坐标随机

2. 红色气泡跟随鼠标移动

3. 当红色气泡会与蓝色气泡发生碰撞效果(类似桌球) 

4. 红色气泡会被屏幕边缘阻挡

5. 蓝色气泡左右屏上下屏互通

6. 蓝色气泡的运动及互动行为请自由发挥

HTML部分:
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>上机</title>
	<link rel="stylesheet" href="./css/index.css">
</head>
<body>
	<div class="container">
		<img class = "redBall" src="./images/1.png" alt="红球" width="100px" height="100px">
		<img class = "blueBall" src="./images/2.png" alt="篮球">
	</div>
	<script src = "./js/index.js"></script>
</body>
</html>

CSS部分:
*{
	margin:0;
	padding: 0;
}
.container{
	width: 800px;
	height: 400px;
	position: relative;
	margin: 0 auto;
	border: 1px solid #ddd;
	overflow: hidden;
}
.blueBall{
	width: 80px;
	height: 80px;
	position: absolute;
	z-index: 1;
	transition: top 2s,left 2s;
}
.redBall{
	position: absolute;
	z-index: 2;
}
js部分:
var blueBall = document.getElementsByClassName("blueBall");
var container = document.getElementsByClassName("container");
var redBall = document.getElementsByClassName("redBall")[0];

//创建篮球DOM
var blueimg = document.createElement("img");
blueimg.setAttribute("src","./images/2.png");
blueimg.setAttribute("alt","篮球");
blueimg.setAttribute("class","blueBall");


//蓝色球数量最少8个最多16个;
var ballNum = Math.ceil(Math.random() * 8 + 8);

for (var i = ballNum - 1; i >= 0; i--) {
	let oi = blueimg.cloneNode(true);
	container[0].appendChild(oi);
}

/*
*设置球的大小
*/
for (var i = 0; i < blueBall.length; i++) {
	let ballSize = hwsize();
	blueBall[i].style.width = ballSize + "px";
	blueBall[i].style.height = ballSize + "px";
}

/*
*随机排序蓝球
*/
for (var i = 0; i < blueBall.length; i++) {
	blueBall[i].style.top = Math.ceil(Math.random() * 400) + "px";
	blueBall[i].style.left = Math.ceil(Math.random() * 800) + "px";
}



 //获取篮球大小范围为50-100
function hwsize() {                             
	return Math.ceil(Math.random() * 50) + 50;
}



/*
*红球随鼠标移动
*code start
*/
container[0].addEventListener("mousemove",function(e){
	var redYX = redPositionX(e);
	redBall.style.left =redYX.x  + "px";
	redBall.style.top = redYX.y + "px";
	for (let i = blueBall.length - 1; i >= 0; i--) {
		blueBoom(i);
    }
});

function redPositionX(e) {
	var redXY = {
	x: 0,
	y: 0	
	};
	var ok = e.clientX - container[0].offsetLeft - redBall.width/2;
	var yes = e.clientY - container[0].offsetTop - redBall.height/2;
	console.log(yes);
	if(ok < 0){
		redXY.x = 0;
	}else{
		if(ok > (800 - redBall.width)){
			redXY.x = 800 - redBall.width;
		}else{
			redXY.x = ok;
		}
	}
	if(yes < 0){
		redXY.y = 0;
	}else{
		if(yes > (400 - redBall.height)){
			redXY.y = 400 - redBall.height;
		}else{
			redXY.y = yes;
		}
	}
	return redXY;
}
/*
*code end
*/

/*
*实现蓝色小球的碰撞
*code start
*/
function blueBoom(i){


	//获取篮球相对浏览器的位置
	var blueX = blueBall[i].offsetLeft;
	var blueY = blueBall[i].offsetTop;

	//获取红球相对浏览器的位置
	var redX = redBall.offsetLeft;
	var redY = redBall.offsetTop;

	sizeX = redX - blueX;
	sizeY = redY - blueY;

	if(sizeX < 0){
		var absX = Math.abs(sizeX);
		if(absX < redBall.width){
			if(sizeY < 0 ){
				var absY = Math.abs(sizeY);
				if(absY < redBall.width){
					//code 小球移动
					blueBall[i].style.top = 50 + "px";
					blueBall[i].style.left = 50 + "px";
				}
				return;
			}else{
				if(absY < blueBall[i].width){
					//code 小球移动
				}
				return;
			}	
		}
		return;
	}else{
		if(absX < blueBall[i].width){
			if(sizeY < 0 ){
				var absY = Math.abs(sizeY);
				if(absY < redBall.width){
					//code 小球移动
				}
				return;
			}else{
				if(absY < blueBall[i].width){
					//code 小球移动
				}
				return;
			}
		}
		return;
	}

}
代码并为完成,但是大致思路就是这样,只需要在我写注释的地方规定篮球的移动轨迹即可。红篮球图片奉上






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原生JS实现卡牌翻牌效果可以通过以下步骤实现: 1. 创建一个Card对象,包含卡片的图像路径、状态(是否翻开)等属性。 2. 创建一个Card数组,用于存储所有的卡片对象。 3. 使用Array.sort()方法对卡片数组进行乱序处理,以实现随机分配卡片。 4. 将乱序后的卡片数组分配到不同的方格下,并隐藏卡片的图像。 5. 监听鼠标点击事件,并通过事件委托判断点击的单位是否为已经翻开的卡片。 6. 根据点击的卡片的id判断是否与上一张翻开的卡片的id相同,从而判断是否翻牌成功。 7. 如果翻牌成功,则保持卡片翻开状态;如果翻牌不成功,则在0.3秒后自动翻转回方格。 8. 当所有卡片都成功翻牌时,游戏胜利。 以上是实现卡牌翻牌效果的主要逻辑。你可以根据需要自行编写代码实现。\[3\] #### 引用[.reference_title] - *1* *2* [cocos2d-x 卡牌翻牌效果实现](https://blog.csdn.net/yanghuiliu/article/details/9115833)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [原生JS记忆翻牌小游戏](https://blog.csdn.net/Y_qilin_/article/details/114292713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值