上一话完成了拖拽移动功能,现在是时候让NPC车辆自动出现了
前几话,咱们有几张车子的图片还没用到,这话使用它们吧
首先定义一个数组变量,用于存放大量的NPC车子队伍
var npccars; npccars = new Array();
然后在animate()方法中里面添加一个setnpccar()方法用来自动增加NPC车
function setnpccar() { var carnpc1 = Object.create(Car); var deshu = (Math.random() * 10) * (300 / 10); carnpc1.x = deshu; carnpc1.y = 0-80; carnpc1.img = new Image(); switch (Math.floor(Math.random() * 5)) { case 0: carnpc1.img.src = "img/car2.png"; break; case 1: carnpc1.img.src = "img/car3.png"; break; case 2: carnpc1.img.src = "img/car4.png"; break; case 3: carnpc1.img.src = "img/car5.png"; break; case 4: carnpc1.img.src = "img/car6.png"; break; } carnpc1.width = 40; carnpc1.height = 80; npccars.push(carnpc1); if (npccars.length > 0) { for (var i = 0; i < npccars.length; i++) { npccars[i].y += 5; if(npccars[i].y>540) { npccars[i].y=-80; npccars.pop (); } } } }
解释:var carnpc1 = Object.create(Car); 代表新定义一个变量,并把它实例化为Car类,也就是生成一辆新车
var deshu = (Math.random() * 10) * (300 / 10); 代表根据屏幕的宽随机生成屏幕宽除以10再乘以随机1到10系数的X坐标,我们这里的屏幕宽为300,可以修改为自己需要的屏幕宽度;这样就会根据屏幕宽随机生成X坐标
carnpc1.x = deshu; 代表把上面的X坐标值赋值给新车
carnpc1.y = 0-80; 代表把0减去车子的高度的Y坐标赋值给新车
carnpc1.img = new Image(); 实例化图片对象并赋值给新车
switch (Math.floor(Math.random() * 5))
{
case 0:
carnpc1.img.src = "img/car2.png";
break;
case 1:
carnpc1.img.src = "img/car3.png";
break;
case 2:
carnpc1.img.src = "img/car4.png";
break;
case 3:
carnpc1.img.src = "img/car5.png";
break;
case 4:
carnpc1.img.src = "img/car6.png";
break;
}
代表用switch 条件选择 Math.floor(Math.random() * 5) 的得数,也就是随机生成0-4的数字,并根据得出数字做如果为0作case 0的处理(把新车的图片路径赋值为“img/car2.png”), 如果为1作case 1的处理(把新车的图片路径赋值为“img/car3.png”),如果为2作case 2的处理(把新车的图片路径赋值为“img/car4.png”),如果为3作case 3的处理(把新车的图片路径赋值为“img/car5.png”),如果为4作case 4的处理(把新车的图片路径赋值为“img/car6.png”)
carnpc1.width = 40; //代表把新车的宽度赋值为40
carnpc1.height = 80; //代表把新车的高度赋值为80
npccars.push(carnpc1); //代表把新车对象放进定义的NPC车子数组里,便于保存
if (npccars.length > 0)
{
for (var i = 0; i < npccars.length; i++) {
npccars[i].y += 5;
if(npccars[i].y>540)
{
npccars[i].y=-80;
npccars.pop ();
}
}
}
解释:if (npccars.length > 0) 当npc车子数组的长度大于0的时候做下面处理
for (var i = 0; i < npccars.length; i++) {} 用for循环巡视NPC车子数组中的每一辆车子
并且把每一辆车子的Y坐标加上5 npccars[i].y += 5;
如果每一辆车子中,有车子的y坐标已经大于屏幕的高度540,把这辆车子的y坐标设为负80 npccars[i].y=-80;
并且删除NPC车辆数组里面的最后一个元素 npccars.pop ();
由于在animate()方法里面,setnpccar()方法也会同样不断执行,NPC车子就会大量出现在我们的屏幕中,并且向下移动
最后只需要在animate()方法里面根据NPC车子数组的总长度,画出所有NPC车子
- if (npccars.length > 0) {
- //ctx.fillText(npccars.length, 10, 20);
- for (var i = 0; i < npccars.length; i++) {
- ctx.drawImage(npccars[i].img, npccars[i].x, npccars[i].y, npccars[i].width, npccars[i].height);
- }
- }
很容易想象,这样密集的NPC车,咱们的主角车肯定被辗轧,死定了,,,,
而且图上面显示的NPC车子还互相辗轧对方,看起来很不现实,车子怎么能互相辗轧呢,所以我们下一话来优化NPC的出现,,并且来实现NPC车对主角车的碰撞检测
完整代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <title>赛车游戏</title> <script type="text/javascript"> var ctx; var canvas1; var roadpic; var zhujuepic; var fenjiepic; var fen_y; var road_d; var zhujue; var is_clicked_zhujue; var npccars; function Car(x, y, width, height, img) { this.x = x; this.y = y; this.width = width; this.height = height; this.img = img; } function init() { ctx = document.getElementById('canvas').getContext('2d'); canvas1 = document.getElementById('canvas'); canvas1.addEventListener('touchstart', onTouchStart, false); canvas1.addEventListener('touchmove', onTouchMove, false); canvas1.addEventListener('touchend', onTouchEnd, false); //------------------------------------------// zhujue = Object.create(Car); zhujue.x = canvas1.width / 2 - 40 / 2; zhujue.y = canvas1.height - 80; zhujue.width = 40; zhujue.height = 80; zhujuepic = new Image(); zhujue.img = zhujuepic; //------------------------------------------// roadpic = new Image(); fenjiepic = new Image(); roadpic.src = "img/road.png"; zhujuepic.src = "img/car1.png"; fenjiepic.src = "img/fenjie.png"; fen_y = 0; road_d = 1; npccars = new Array(); setInterval(function(e) { animate(); }, 50); } function onTouchMove(event) { var touch = event.targetTouches[0]; if (is_clicked_zhujue) { zhujue.x = touch.pageX - zhujue.width / 2; zhujue.y = touch.pageY - zhujue.height / 2; } } function onTouchStart(event) { var touch = event.targetTouches[0]; if (checkimpact(touch.pageX, touch.pageY, zhujue)) { //alert("1"); is_clicked_zhujue = true; } } function onTouchEnd(event) { is_clicked_zhujue = false; } function animate() { ctx.clearRect(0, 0, canvas1.width, canvas1.height); //----------------------------------// if (road_d == 1) { ctx.drawImage(roadpic, 0, 0, canvas1.width + 8, canvas1.height + 8); road_d = 0; } else { ctx.drawImage(roadpic, 0, 0, canvas1.width, canvas1.height); road_d = 1; } //----------------------------------// for (var i = 0; i < 50; i++) { ctx.drawImage(fenjiepic, canvas1.width / 2 - 10 / 2, fen_y - 80 * i, 10, 30); } if (fen_y < canvas1.height) { fen_y = fen_y + 150; } else if (fen_y >= canvas1.height) { fen_y = 0; } //----------------------------------// setnpccar(); if (npccars.length > 0) { //ctx.fillText(npccars.length, 10, 20); for (var i = 0; i < npccars.length; i++) { ctx.drawImage(npccars[i].img, npccars[i].x, npccars[i].y, npccars[i].width, npccars[i].height); } } ctx.drawImage(zhujue.img, zhujue.x, zhujue.y, zhujue.width, zhujue.height); } function checkimpact(finger_x, finger_y, el2) { var e1 = { x: finger_x, y: finger_y, w: 10, h: 10 } var e2 = { x: el2.x, y: el2.y, w: el2.width, h: el2.height } var px, py; px = e1.x <= e2.x ? e2.x : e1.x; py = e1.y <= e2.y ? e2.y : e1.y; if (px >= e1.x && px <= e1.x + e1.w && py >= e1.y && py <= e1.y + e1.h && px >= e2.x && px <= e2.x + e2.w && py >= e2.y && py <= e2.y + e2.h) { return true; } else { return false; } } function setnpccar() { var carnpc1 = Object.create(Car); var deshu = (Math.random() * 10) * (300 / 10); carnpc1.x = deshu; carnpc1.y = 0-80; carnpc1.img = new Image(); switch (Math.floor(Math.random() * 5)) { case 0: carnpc1.img.src = "img/car2.png"; break; case 1: carnpc1.img.src = "img/car3.png"; break; case 2: carnpc1.img.src = "img/car4.png"; break; case 3: carnpc1.img.src = "img/car5.png"; break; case 4: carnpc1.img.src = "img/car6.png"; break; } carnpc1.width = 40; carnpc1.height = 80; npccars.push(carnpc1); if (npccars.length > 0) { for (var i = 0; i < npccars.length; i++) { npccars[i].y += 5; if(npccars[i].y>540) { npccars[i].y=-80; npccars.pop (); } } } } </script> </head> <body onLoad="init();"> <canvas id="canvas" width="300" height="540"> </canvas> </body> </html>