1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 6 <title>弹跳球</title> 7 <style type="text/css"> 8 form{width:330px; margin:20px; background-color:brown; padding:20px;} 9 input:valid{background:green;} 10 input:invalid{background:red;} 11 </style> 12 <script type="text/javascript"> 13 //主要搞清楚HTML5渐变里面的几个函数的意思,下面有注释 14 var boxx=20; 15 var boxy=30; 16 var boxwidth=350; 17 var boxheight=250; 18 var ballrad=10; 19 var boxboundx=boxwidth+boxx-ballrad; //虚拟的右边界,为了判断球是否撞墙了,若装墙了则让圆心等于它,因为墙的厚度,即下面的lineWidth已设为球的半径 20 var boxboundy=boxheight+boxy-ballrad; 21 var inboxboundx=boxx+ballrad; 22 var inboxboundy=boxy+ballrad; 23 var ballx=50; 24 var bally=60; 25 var ball2x=200; 26 var ball2y=210; 27 var ballrad2=10; 28 var ctx; 29 var ballvx=4; 30 var ballvy=8; 31 var ball2vx=-5; 32 var ball2vy=9; 33 var grad; 34 var color; 35 var hue=[ 36 [255,0,0],[255,255,0],[0,255,0],[0,255,0],[255,0,255] 37 ]; 38 function init(){ 39 ctx=document.getElementByIdx_x_x("canvas").getContext('2d'); 40 ctx.lineWidth=ballrad; 41 grad=ctx.createLinearGradient(boxx,boxy,boxx+boxwidth,boxy+boxheight); //创建一个渐变对象,从x1,y1线性渐变到x2,y2,注意现在并不是显示出来,可想象为最底层的图层 42 for(h=0;h<hue.length;h++){ 43 color="rgb("+hue[h][0]+","+hue[h][1]+","+hue[h][2]+")"; 44 grad.addColorStop(h/6,color); 45 } 46 ctx.fillStyle=grad; 47 // 48 moveball(); 49 setInterval(moveball,100); 50 } 51 function moveball(){ 52 ctx.clearRect(boxx,boxy,boxwidth,boxheight); 53 moveandcheck(); 54 ctx.beginPath(); 55 ctx.arc(ballx,bally,ballrad,0,Math.PI*2,true); //画圆 56 ctx.fill(); //填充 57 ctx.beginPath(); 58 ctx.arc(ball2x,ball2y,ballrad2,0,Math.PI*2,true); //画圆 59 ctx.fill(); //填充 60 ctx.fillRect(boxx,boxy,ballrad,boxheight); //左墙 ,函数fillRect()才是在刚createLinearGradient()的基础上选择性的显示,参数给出显示范围 61 //注意区分strokeRect()是用来画线,不是填充 62 ctx.fillRect(boxx+boxwidth,boxy,ballrad,boxheight); //右墙 63 ctx.fillRect(boxx,boxy,boxwidth,ballrad); 64 ctx.fillRect(boxx,boxy+boxheight-ballrad,boxwidth,ballrad); 65 } 66 function moveandcheck(){ 67 var nballx=ballx+ballvx; 68 var nbally=bally+ballvy; 69 if(nballx>boxboundx){ 70 ballvx=-ballvx; 71 nballx=boxboundx; 72 } 73 if(nballx<inboxboundx){ 74 nballx=inboxboundx; 75 ballvx=-ballvx; 76 } 77 if(nbally>boxboundy){ 78 ballvy=-ballvy; 79 nbally=boxboundy; 80 } 81 if(nbally<inboxboundy){ 82 ballvy=-ballvy; 83 nbally=inboxboundy; 84 } 85 ballx=nballx; 86 bally=nbally; 87 var nball2x=ball2x+ball2vx; //处理第二个球 88 var nball2y=ball2y+ball2vy; 89 if(nball2x>boxboundx){ 90 ball2vx=-ball2vx; 91 nball2x=boxboundx; 92 } 93 if(nball2x<inboxboundx){ 94 nball2x=inboxboundx; 95 ball2vx=-ball2vx; 96 } 97 if(nball2y>boxboundy){ 98 ball2vy=-ball2vy; 99 nball2y=boxboundy; 100 } 101 if(nball2y<inboxboundy){ 102 ball2vy=-ball2vy; 103 nball2y=inboxboundy; 104 } 105 ball2x=nball2x; 106 ball2y=nball2y; 107 } 108 function change(){ 109 ballvx=Number(f.hv.value); 110 ballvy=Number(f.vv.value); 111 return false; 112 } 113 </script> 114 </head> 115 <body onLoad="init();"> 116 <canvas id="canvas" width="400" height="300"> 117 Your brower doesn't support HTML5. 118 </canvas> 119 <br /> 120 <form name="f" id="f" onsubmit="return change()"> 121 Horizontal velocity<input name="hv" id="hv" value="4" type="number" min="-10" max="20" /> 122 Vertital velocity<input name="vv" id="vv" value="8" type="number" min="-10" max="20" /> 123 <input type="submit" value="Change" /> 124 </form> 125 </body> 126 </html>