学了一些HTML5的一些基本知识,开始学习制作......
介绍一些基本知识: px(像素)---》1px等于多少? 1cm or 2cm -->no no no!
(1).像素是一个密度单位:无法用度量....
(2) stoke--->画线 fill--->填充
(3)再画图形时,一定记得路径闭合...
(4)在绘制图片时:需要注意的是:先加载图片,在进行绘制
绘制照片的一些基本步骤:
(1) 创建image对象 new Image();
(2)指定图片(或者路径) src=" "
(3)先加载,再进行一段绘制 dirawImage();
代码详细的注释:
1 <html>
2 <head>
3
4 </head>
5 <body>
6 <!--用canvas画布画一个矩形-->
7 <canvas id="gxjun"width="500px"height="400px"style="border: 2px solid blue"></canvas>
8 <script type="text/javascript">
9 <!--得到画布-->
10 var canvas_1=document.getElementById("gxjun");
11 var cnt=canvas_1.getContext("2d");
12 //alert(cxt);
13 //moveto设置点位置
14 cnt.moveTo(20,20);
15 //有上面那个点为起点 设置第二个点位置
16 cnt.lineTo(20,90);
17 //将两个点连接起来
18 cnt.stroke();
19 //画出一个填充的三角形.-->路径
20 //开始新路径
21 cnt.beginPath();
22 cnt.moveTo(40,20);
23 cnt.lineTo(40,90);
24 cnt.lineTo(80,90);
25 //闭合路径,把最后这个点和第一点MoveTO()闭合
26 cnt.closePath();
27 //cnt.stroke();
28 //填充矩形 由于三角形闭合了,所以填充了三角形
29 //注意的一点是: 只有矩形才会不用路径闭合
30 cnt.fill();
31 cnt.strokeRect(100,20,30,50); //strokeRect(x,y,weidth,height);
32 //填充矩形
33 cnt.fillStyle="#004DFF"; //填充颜色
34 cnt.fillRect(140,20,30,50);
35 //画其他图形时一定的记得开始和闭合
36 cnt.beginPath();
37 //如何话圆形 arc函数
38 //这些参数的含义(x,y,radius,开始度数,结束的度 针还是逆时
39 cnt.fillStyle="#FF0000";
40 cnt.arc(220,40,20,0,360,false); cnt.closePath();
41 cnt.stroke();
42 cnt.fill();
43 //画图像
44 var img_1=new Image();
45 img_1.src="10.jpg";
46 //加载完毕后再绘图....
47 img_1.onload=function(){
48 //(object,x,y,weidth,height)
49 cnt.drawImage(img_1,20,100,155,220);
50 }
51 </script>
52 </body>
53 </html>
效果图:
有关Javascript写字体:
代码:
1 <html>
2 <head》</head>
3 <body>
4 <!--用canvas画布画一个矩形-->
5 <canvas id="gxjun"width="500px"height="400px"style="border: 2px solid blue"></canvas>
6 <script type="text/javascript">
7 <!--得到画布-->
8 var canvas_1=document.getElementById("gxjun");
9 var cnt=canvas_1.getContext("2d");
10 //alert(cxt);
11 //moveto设置点位置
12 cnt.moveTo(20,20);
13 //有上面那个点为起点 设置第二个点位置
14 cnt.lineTo(20,90);
15 //将两个点连接起来
16 cnt.stroke();
17 //画出一个填充的三角形.-->路径
18 //开始新路径
19 cnt.beginPath();
20 cnt.moveTo(40,20);
21 cnt.lineTo(40,90);
22 cnt.lineTo(80,90);
23 //闭合路径,把最后这个点和第一点MoveTO()闭合
24 cnt.closePath();
25 //cnt.stroke();
26 //填充矩形 由于三角形闭合了,所以填充了三角形
27 //注意的一点是: 只有矩形才会不用路径闭合
28 cnt.fill();
29 cnt.strokeRect(100,20,30,50); //strokeRect(x,y,weidth,height);
30 //填充矩形
31 cnt.fillStyle="#004DFF"; //填充颜色
32 cnt.fillRect(140,20,30,50);
33 //画其他图形时一定的记得开始和闭合
34 cnt.beginPath();
35 //如何话圆形 arc函数
36 //这些参数的含义(x,y,radius,开始度数,结束的度 针还是逆时
37 cnt.fillStyle="#FF0000";
38 cnt.arc(220,40,20,0,360,false); cnt.closePath();
39 cnt.stroke();
40 cnt.fill();
41 //画图像
42 var img_1=new Image();
43 img_1.src="10.jpg";
44 //加载完毕后再绘图....
45 img_1.onload=function(){
46 //(object,x,y,weidth,height)
47 cnt.drawImage(img_1,20,100,155,220);
48 //在画布上写字
49 //设置字体的大小
50 var text="火影忍着之战国时代"
51 cnt.fillStyle="#0000FF";
52 cnt.font="30px 华文彩云";
53 cnt.fillText(text,200,200);
54 }
55 </script>
56 </body>
57 </html>>
效果图:
1.画坦克的思路: 以坦克的左上角为参照点,然后画出坦克的其它部分。这样的 好处是当左上角的坐标变换,坦克就会整体移动。(画出图片时比较耗费cpu)
画出第一辆坦克..
代码:
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <!--meta charset="utf-16"/-->
5 </head>
6 <body>
7 <h1>经典坦克大战</h1>
8 <!--画布即作为坦克大战的地图-->
9 <canvas id="tankMap" width="600px" height="500px"
10 style="background-color: black; border: 2px solid red"></canvas>
11 <script type="text/javascript">
12 //得到画布
13 var canvas1=document.getElementById("tankMap");
14 //得到绘图上下文(即画笔)
15 var cxt=canvas1.getContext("2d");
16 //我的坦克hero
17 var herox=130;
18 var heroy=30;
19 // alert(cxt);
20 //设置颜色
21 cxt.fillStyle="#DED284";
22 //先画出左面的矩形
23 cxt.fillRect(herox,heroy,5,30);
24 //平移画出右边的矩形
25 cxt.fillRect(herox+15,heroy,5,30);
26 //画出中间矩形
27 cxt.fillRect(herox +6,heroy + 5,8,20);
28 //画出坦克的盖子
29 cxt.fillStyle="#FFD972";
30 cxt.arc(herox +10,heroy +15,4,0,360,true);
31 cxt.fill();
32 //画出炮筒(直线)
33 cxt.strokeStyle="#FFD972";
34 cxt.lineWidth=1.5;
35 cxt.beginPath();
36 cxt.moveTo(herox +10,heroy +15);
37 cxt.lineTo(herox +10,heroy);
38 cxt.closePath();
39 cxt.stroke();
40 cxt.fillStyle="#FFD972";
41 cxt.arc(herox +10,heroy,1.5,0,360,true);
42 cxt.fill();
43 </script>
44 </body>
45 </html>
效果图:
附加一个小功能,让小球开始移动....
代码:
1 <!DOCTYPE html>
2 <html>
3 <head>
4 //meta charset="utf-8";
5 </head>
6 <!--当按键后去调用test函数-->
7 <body onkeydown="test()">
8 <h1>小球上下左右移动</h1>
9 <canvas id="test" width="400px" height="300px"
10 style="background-color:black; border: 2px solid blue">
11 </canvas>
12 <script type="text/javascript">
13 //得到画布
14 var canvas1=document.getElementById("test");
15 //得到绘图上下文(画笔)
16 var cxt= canvas1.getContext("2d");
17 //画出红色圆球
18 var ballx=30;
19 var bally=30;
20 function drawball()
21 {
22 cxt.beginPath();
23 cxt.fillStyle="#FF0000";
24 cxt.arc(ballx,bally,10,0,360,false);
25 cxt.closePath();
26 cxt.fill();
27 }
28 //alert(cxt);
29 //现在我摁下wsaf依次表示上下左右-
30 //说明:当我们按下一个建,实际上触发一个onkeydowm
31 drawball();
32 function test(){
33 //我怎么知道,玩家按下的是什么键
34 //说明当按下键后,事件---》event对象----》事件处理函数()
35 var code=event.keyCode;
36 //键盘上的每一个字母对应的是ascii
37 switch(code)
38 {
39 case 87: bally--; break;
40 case 68: ballx++; break;
41 case 83: bally++; break;
42 case 65: ballx--; break;
43 }
44 cxt.clearRect(0,0,400,300);
45 drawball();
46 }
47 </script>
48 </body>
49 </html>
效果如图:
好了,又小球衍生出第一辆坦克....
代码:
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <!--meta charset="utf-16"/-->
5 </head>
6 <body onkeydown="getCommand()">
7 <h1>经典坦克大战</h1>
8 <!--画布即作为坦克大战的地图-->
9 <canvas id="tankMap" width="600px" height="500px"
10 style="background-color: black; border: 2px solid red"></canvas>
11 <script type="text/javascript">
12 //定义一个HEro类
13 // x,y表示坐标 direct表示方向
14 function Hero(x,y,direct){
15 this.x=x;
16 this.y=y;
17 this.direct=direct;
18 this.speed=1;
19 //上移
20 this.moveUp=function() {
21 this.y-=this.speed;
22 this.direct=0;
23 }
24 this.moveDown=function(){
25 this.y+=this.speed;
26 this.direct=2;
27 }
28 this.moveRight=function(){
29 this.x+=this.speed;
30 this.direct=1;
31 }
32 this.moveLeft=function() {
33 this.x-=this.speed;
34 this.direct=3; //改变方向
35 }
36 }
37 //得到画布
38 var canvas1=document.getElementById("tankMap");
39 //得到绘图上下文(即画笔)
40 var cxt=canvas1.getContext("2d");
41 //我的坦克hero
42 // var herox=130;
43 //var heroy=30;
44 // alert(cxt);
45 //坦克的方向:0表示向上,1表示向右,2表示下,3表示左
46 var hero = new Hero(40,40,0);
47 //把绘制坦克封装成为一个函数
48 function drawTank(tank){
49
50 switch(tank.direct)
51 {
52 case 0: //塔克
53 case 2:
54 //设置颜色
55 cxt.fillStyle="#BA9658" ;
56 //先画出左面的矩形
57 cxt.fillRect(tank.x,tank.y,5,30);
58 //平移画出右边的矩形
59 cxt.fillRect(tank.x+15,tank.y,5,30);
60 //画出中间矩形
61 cxt.fillRect(tank.x +5,tank.y+ 5,10,20);
62 //画出坦克的盖子
63 cxt.fillStyle="#FEF26E" ;
64 cxt.arc(tank.x +10,tank.y +15,4,0,360,false);
65 cxt.fill();
66 //画出炮筒(直线)
67 cxt.strokeStyle="#FEF26E" ;
68 cxt.lineWidth=1.5;
69 cxt.beginPath();
70 cxt.moveTo(tank.x +10,tank.y +15);
71 var cnt=0;
72 if(tank.direct==0) cnt=0;
73 else if(tank.direct==2)cnt=30;
74 cxt.lineTo(tank.x +10,tank.y+cnt);
75 break;
76 case 1:
77 case 3:
78 //设置颜色
79 cxt.fillStyle="#BA9658" ;
80 //先画出左面的矩形
81 cxt.fillRect(tank.x,tank.y,30,5);
82 //平移画出右边的矩形
83 cxt.fillRect(tank.x,tank.y+15,30,5);
84 //画出中间矩形
85 cxt.fillRect(tank.x +6,tank.y+ 5,20,10);
86 //画出坦克的盖子
87 cxt.fillStyle="#FEF26E" ;
88 cxt.arc(tank.x +15,tank.y +10,4,0,360,false);
89 cxt.fill();
90 //画出炮筒(直线)
91 cxt.strokeStyle="#FEF26E" ;
92 cxt.lineWidth=1.5;
93 cxt.beginPath();
94 cxt.moveTo(tank.x +15,tank.y +10);
95 if(tank.direct==1)
96 cxt.lineTo(tank.x +30,tank.y+10);
97 else if(tank.direct==3)
98 cxt.lineTo(tank.x,tank.y+10);
99 // cxt.fillStyle="#FEF26E" ;
100 //cxt.beginPath();
101 //cxt.arc(tank.x +10,tank.y+cnt,1.5,0,360,false);
102 //cxt.closePath();
103 //cxt.fill();
104
105
106 break;
107
108 }
109 cxt.closePath();
110 cxt.stroke();
111
112
113 }
114 drawTank(hero);
115 //这是一个接收按键的函数
116 function getCommand(){
117 //alert("汗啊");
118 var code = event.keyCode;
119 // alert(code);
120 switch(code)
121 {
122 // 向上
123 case 38:
124 case 87: hero.moveUp(); break;
125 //向左
126 case 37:
127 case 65: hero.moveLeft(); break;
128 //向下
129 case 40:
130 case 83: hero.moveDown(); break;
131 //向右
132 case 39:
133 case 68: hero.moveRight(); break;
134 }
135 cxt.clearRect(0,0,600,500);
136 drawTank(hero);
137 }
138 </script>
139 </body>
140 </html>
效果图:
当然想韩老师所说的我们可以将其分为两个文件。一个js文件和一个html文件:
其实内容没有任何变化,就只是将其拆分为两部分只是为了看起来方便一些》。。。
1.tankgame2.js文件
1 // x,y表示坐标 direct表示方向
2 function Hero(x,y,direct){
3 this.x=x;
4 this.y=y;
5 this.direct=direct;
6 this.speed=1;
7 //上移
8 this.moveUp=function() {
9 this.y-=this.speed;
10 this.direct=0;
11 }
12 this.moveDown=function(){
13 this.y+=this.speed;
14 this.direct=2;
15 }
16 this.moveRight=function(){
17 this.x+=this.speed;
18 this.direct=1;
19 }
20 this.moveLeft=function() {
21 this.x-=this.speed;
22 this.direct=3; //改变方向
23 }
24 }
25
26 //把绘制坦克封装成为一个函数
27 function drawTank(tank){
28
29 switch(tank.direct)
30 {
31 case 0: //塔克
32 case 2:
33 //设置颜色
34 cxt.fillStyle="#BA9658" ;
35 //先画出左面的矩形
36 cxt.fillRect(tank.x,tank.y,5,30);
37 //平移画出右边的矩形
38 cxt.fillRect(tank.x+15,tank.y,5,30);
39 //画出中间矩形
40 cxt.fillRect(tank.x +5,tank.y+ 5,10,20);
41 //画出坦克的盖子
42 cxt.fillStyle="#FEF26E" ;
43 cxt.arc(tank.x +10,tank.y +15,4,0,360,false);
44 cxt.fill();
45 //画出炮筒(直线)
46 cxt.strokeStyle="#FEF26E" ;
47 cxt.lineWidth=1.5;
48 cxt.beginPath();
49 cxt.moveTo(tank.x +10,tank.y +15);
50 var cnt=0;
51 if(tank.direct==0) cnt=0;
52 else if(tank.direct==2)cnt=30;
53 cxt.lineTo(tank.x +10,tank.y+cnt);
54 break;
55 case 1:
56 case 3:
57 //设置颜色
58 cxt.fillStyle="#BA9658" ;
59 //先画出左面的矩形
60 cxt.fillRect(tank.x,tank.y,30,5);
61 //平移画出右边的矩形
62 cxt.fillRect(tank.x,tank.y+15,30,5);
63 //画出中间矩形
64 cxt.fillRect(tank.x +6,tank.y+ 5,20,10);
65 //画出坦克的盖子
66 cxt.fillStyle="#FEF26E" ;
67 cxt.arc(tank.x +15,tank.y +10,4,0,360,false);
68 cxt.fill();
69 //画出炮筒(直线)
70 cxt.strokeStyle="#FEF26E" ;
71 cxt.lineWidth=1.5;
72 cxt.beginPath();
73 cxt.moveTo(tank.x +15,tank.y +10);
74 if(tank.direct==1)
75 cxt.lineTo(tank.x +30,tank.y+10);
76 else if(tank.direct==3)
77 cxt.lineTo(tank.x,tank.y+10);
78 // cxt.fillStyle="#FEF26E" ;
79 //cxt.beginPath();
80 //cxt.arc(tank.x +10,tank.y+cnt,1.5,0,360,false);
81 //cxt.closePath();
82 //cxt.fill();
83
84
85 break;
86
87 }
88 cxt.closePath();
89 cxt.stroke();
90
91
92 }
2.html文件...
代码:
<!DOCTYPE html>
<html>
<head>
<!--meta charset="utf-16"/-->
</head>
<body onkeydown="getCommand()">
<h1>经典坦克大战</h1>
<!--画布即作为坦克大战的地图-->
<canvas id="tankMap" width="600px" height="500px"
style="background-color: black; border: 2px solid red"></canvas>
<script type="text/javascript" src="tankgame2.js"></script>
<script type="text/javascript">
//定义一个HEro类
//得到画布
var canvas1=document.getElementById("tankMap");
//得到绘图上下文(即画笔)
var cxt=canvas1.getContext("2d");
//我的坦克hero
// var herox=130;
//var heroy=30;
// alert(cxt);
//坦克的方向:0表示向上,1表示向右,2表示下,3表示左
var hero = new Hero(40,40,0);
drawTank(hero);
//这是一个接收按键的函数
function getCommand(){
//alert("汗啊");
var code = event.keyCode;
// alert(code);
switch(code)
{
// 向上
case 38:
case 87: hero.moveUp(); break;
//向左
case 37:
case 65: hero.moveLeft(); break;
//向下
case 40:
case 83: hero.moveDown(); break;
//向右
case 39:
case 68: hero.moveRight(); break;
}
cxt.clearRect(0,0,600,500);
drawTank(hero);
}
</script>
</body>
</html>
效果图还是一样的