第七讲:HTML5中的canvas两个小球全然弹性碰撞

第七讲:HTML5中的canvas两个小球全然弹性碰撞

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

<html>
	<head>
		<title>小球之间的碰撞(全然弹性碰撞)</title>
		<script src="../js/jscex.jscexRequire.min.js" type="text/javascript"></script>
	</head>
	
	<body>
		<canvas id="mc" width="1200px" height="600px">
		</canvas>
		<script type="text/javascript">
			var canvas = document.getElementById('mc');
			var cxt = canvas.getContext('2d');
			//设置画布背景颜色
			cxt.fillStyle = "#030303";
   	 	cxt.fillRect(0, 0, canvas.width, canvas.height);
			var cyc = 20;
			var balls = [];
			//定义一个向x轴正前方运动
			var ball_1 = {
				x:100,
				y:550,
				r:50,
				vx:500,
				vy:0
			};
			//定义一个向x轴反方向运动
			var ball_2 = {
				x:1000,
				y:550,
				r:50,
				vx:-400,
				vy:0
			};
			balls.push(ball_1);
			balls.push(ball_2);
			cxt.fillStyle = "#030303";
			cxt.fillRect(0,0,canvas.width,canvas.height);
			//画出两个小球
			function init () {
				cxt.fillStyle = "#fff";
				for(var i in balls){
					cxt.beginPath();
					cxt.arc(balls[i].x,balls[i].y,balls[i].r,0,Math.PI*2,true);
					cxt.closePath();
					cxt.fill();
				}	
			}
			init();
			var ct 
			//动态绘出小球相碰撞的情形
			var somethingAsync = eval(Jscex.compile("async", function (ct) {
				while (true) {
					cxt.fillStyle = "rgba(0,0,0,1)";
					cxt.fillRect(0,0,canvas.width,canvas.height);
					cxt.fillStyle = "#fff";
					//小球运动
					for(var i in balls){
						balls[i].x += balls[i].vx *cyc /1000;
						cxt.beginPath();
						cxt.arc(balls[i].x,balls[i].y,balls[i].r,0,Math.PI*2,true);
						cxt.closePath();
						cxt.fill();
						//小球触碰左右两个墙壁
						if(balls[i].x + balls[i].r >= canvas.width || balls[i].x <= balls[i].r){
							balls[i].vx *= -1;
						}
					}
					//推断两个小球是否相互碰撞
					if(Math.abs(ball_1.x - ball_2.x) <= 2*50){
						var temp = ball_1.vx;
								ball_1.vx = ball_2.vx;
								ball_2.vx = temp;
					}
					$await(Jscex.Async.sleep(cyc,ct));	
				}		
			}));
			//手动控制小球的运动
			function Button1_onclick() {
        ct.cancel();
      }
      function Button2_onclick() {
        ct = new Jscex.Async.CancellationToken();
        somethingAsync(ct).start();
      }
      
		</script>
		<br>
		<br />
     <br />
     <input id="Button2" class="css3btn" type="button" value="run" onclick="return Button2_onclick()" />
     <input id="Button1" class="css3btn" type="button" value="stop" onclick="return Button1_onclick()" />

	</body>
</html>


第七讲:HTML5中的canvas两个小球全然弹性碰撞

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118899.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • iOS PerformSelector 遗漏问题

    iOS PerformSelector 遗漏问题一基础用法performSelecor响应了OC语言的动态性:延迟到运行时才绑定方法。当我们在使用以下方法时:[objperformSelector:@selector(play)];[objperformSelector:@selector(play:)withObject:@"李周"];[objperformSelector:@selector(play:with:)…

    2025年7月5日
    3
  • ibatis动态传入表名造成的SQL注入的解决方案(摘录的)

    ibatis动态传入表名造成的SQL注入的解决方案(摘录的)

    2021年8月26日
    57
  • Modelsim的安装教程

    Modelsim的安装教程提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Modelsim安装二、激活成功教程1.拷贝Crack文件夹中的文件2.激活成功教程过程可能出现的错误前言Modelsim的安装与激活成功教程使用一、Modelsim安装打开下在之后的文件夹,直接双击exe文件进行安装。不熟悉时,可以直接使用默认路径进行安装,不进行路径上的修改。1、下载并解压好文件包,然后运行安装程序根据向导提示进行软件安装2、依提示安装软件过程中需要注意的是,会有三个弹出框提示,首先是是否创建桌面快捷方式提示

    2022年6月16日
    83
  • python抛出异常和捕获异常_python自定义异常

    python抛出异常和捕获异常_python自定义异常主动抛异常1.抛异常有时,程序需要主动抛出异常,因为某些情况下,你需要反馈消息给更上层的调用者,告诉它有一些异常情况发生,而你抛出异常的地方,没有能力处理它,因此需要向上抛出异常。这种情况为什么不让系统自己抛出异常呢?一个原因是上层的调用者本身就希望能够捕获有别于系统异常的自定义异常,二来,有些情况下,程序的逻辑是没有异常的,但是,从业务角度考虑,的确是一个不寻常的情况,因此需要我们主动抛出异常…

    2022年10月10日
    2
  • SSH-Struts(一)——基本原理「建议收藏」

    SSH-Struts(一)——基本原理

    2022年1月25日
    50
  • nfs41client loaded successfully_storcli创建raid

    nfs41client loaded successfully_storcli创建raid1、系统准备系统:ubuntu14.04,按照官网系统需要安装以下环境 环境 说明 安装配置方法 Ccompiler 编译器 移植时configure配置为交叉编译器 make 执行Makefile Ubuntu…

    2022年8月15日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号