软件工程:状态,行为,事件+按键处理

继续上一篇教程。

增加功能:

1. 两张超级玛丽素材图片。按方向键,切换朝左朝右。

2. 按左右键,向左右移动。

3.按空格键,跳。在跳的过程中,按空格键无效。

  在跳的状态下,不再处理事件“按空格”。

游戏数据在不同状态下,有不同的刷新修改方法(行为)。不同的状态,能接收的按键、事件不一样。达到特定的事件、条件、时间计数(比如技能冷却、技能有效时间等),切换为新的状态。

应用软件的状态也是如此,订单的状态,图书借阅的状态,送餐的状态。

截图:

代码:

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<!-- <img id="role_png" src="mario.png" alt="The Tulip" /> -->
<canvas width="500" height="300"
		style="border:2px solid blue;"  id="game1"></canvas>aa

<script type="text/javascript">
	//获取绘图环境
	var  paints = document.getElementById('game1').getContext('2d');
 	//图片素材
 	var img = new Image();
    img.src = "mario.png";
    var img2 = new Image();
    img2.src = "marioleft.png";
    // 等待加载完成再绘制
    img.onload = function(){
        paints.drawImage(img, 0,0,50, 50);
        alert("加载完毕");
        // 版权声明:本文为CSDN博主「疯一样的雨」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
		// 原文链接:https://blog.csdn.net/u013564742/article/details/85077633
    }
    alert("游戏编程");
    console.log("path is "+img.src)


    var x=0;
    var y=254;
    var max_y=254;
	var  cnt=0;
	var   jump_cnt=1;
	var w=500;
	var h=300;
	var direction=1;	//1 right

	var	state=0;//0 normal; 2 jump
	
	function  paintback(x, y,w,h){
					//绘制背景,覆盖上一帧画面
					paints.fillStyle='#ccddbb'; 
	                paints.fillRect(x, y,w,h );
	            }
	function  paintfr(x, y){
	                paints.drawImage(direction==1? img: img2, x, y);
	            }
            //
    function 	checkcollision()
	{
		if( x<0)
		{
			x=0;direction=1;
		}
		if( x> w-40)
		{
			x=w-40;direction=-1;
		}
	}
	function 	gameupdate()
	{
		cnt++;	//计数器 
		 
		if( state == 2)
		{ 
			x+= direction *10;
			
			y=  (jump_cnt-7)*(jump_cnt-7)*4+(max_y-49*4); //曲线+最高点y

			jump_cnt++;
			if(jump_cnt>14)
			{
				state =0;	//状态改变
				y= max_y;	//恢复为 normal
			}
		}
		
		checkcollision();
		  paintback(0, 0, w,h);
		 paintfr(x, y);
		 //console.log("x "+x);
		 
	}
	 //方向键功能函数。 按键松开,触发事件
        document.onkeyup =function(e){   
             
            switch(e.keyCode){
				 case 37:  // 方向为左
					direction=-1;
					x+=direction *10; // 系数 1 right; -1,left
                    break;
                case 39:  // 方向为右 
                	direction=1;
                	x+=direction *10; // 系数 1 right; -1,left
                	break;
                case 32:  // 空格 
                   
                   if( state != 2)
                   {
                   		state=2;	
                   		 jump_cnt=1;	//初始化
                   }
                   
                    break;
                }
                gameupdate();
            }
	//启动计时器
setInterval("gameupdate()" , 300);
</script>
</body>
</html>

多个状态,不同的行为,事件。事件包括条件判断、按键、鼠标操作、计时器的时间限制,这些事件导致状态的改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值