html5 canvas 实现简易马祖小游戏

参考妙趣课堂的视频,做了这个游戏,通过这个游戏可以了解到canvas的强大。废话不多说,直接上代码。

html代码:

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>马祖</title>
	<link rel="stylesheet" type="text/css" href="css/mazu.css">
</head>
<body>
	<div id="box">
		<canvas id="mycanvas" width="600" height="600"></canvas>
	</div>
<script type="text/javascript" src="js/mazu.js"></script>
</body>
</html>

css代码:这里我用的是less

@black:#000;
@white:#fff;
* {
	margin: 0;
	padding: 0;
}
body {
	background-color:@black;
}
#box {
	background-color: @white;
	width: 600px;
	height: 600px;
	margin: 20px auto;
}

less转化为css:

* {
  margin: 0;
  padding: 0;
}
body {
  background-color: #000000;
}
#box {
  background-color: #ffffff;
  width: 600px;
  height: 600px;
  margin: 20px auto;
}

js代码(有注释):

window.onload = function() {
	var oc = document.getElementById("mycanvas");
	var ogc = oc.getContext('2d');
	var i = 0;

	var img = new Image();
	img.src = "images/cartIcon.jpg";
	img.onload = function() {
		setInterval(function() {
			ogc.clearRect(0, 0, oc.width, oc.height);
			ogc.beginPath();
			ogc.arc(300, 200, 200, -90 * Math.PI / 180, 180 * Math.PI / 180, false); //参数分别为x,y,r,弧度,旋转方向
			// ogc.closePath();//首尾连接
			// ogc.fill();
			ogc.stroke();

			ogc.beginPath();
			ogc.arc(250, 200, 150, -180 * Math.PI / 180, 0 * Math.PI / 180, false); //参数分别为x,y,r,弧度,旋转方向
			ogc.stroke();

			ogc.beginPath();
			ogc.arc(400, 200, 20, 0 * Math.PI / 180, 360 * Math.PI / 180, false); //参数分别为x,y,r,弧度,旋转方向
			ogc.stroke();

			for (var i = 0, length = ball.length; i < length; i++) {

				ogc.beginPath();
				ogc.moveTo(ball[i].x, ball[i].y);
				ogc.arc(ball[i].x, ball[i].y, 20, 0 * Math.PI / 180, 360 * Math.PI / 180, false);
				ogc.fill();
			}
			ogc.save();   //独立出来,不执行计时器,否则计时器会让transform累加
			ogc.translate(300,200);
			ogc.rotate(iRotate);
			ogc.translate(-23,-20);
			ogc.drawImage(img,0,0);
			ogc.restore();

			for (var i = 0, length = bullet.length; i < length; i++) {
				ogc.save();
				ogc.fillStyle='red';
				ogc.beginPath();
				ogc.moveTo(bullet[i].x, bullet[i].y);
				ogc.arc(bullet[i].x, bullet[i].y, 20, 0 * Math.PI / 180, 360 * Math.PI / 180, false);
				ogc.fill();
				ogc.restore();
			}
		}, 1000 / 60);

		setInterval(function() {
			for (var i = 0, length = ball.length; i < length; i++) {

				ball[i].num++;
				if (ball[i].num == 270) {
					ball[i].r = 150;
					ball[i].startX = 250;
					ball[i].startY = 50;
				}
				if (ball[i].num == 270 + 180) {
					alert("boom!!!!!!!!!!!!!!!!!");
					window.location.reload();
				}
				ball[i].x = Math.sin(ball[i].num * Math.PI / 180) * ball[i].r + ball[i].startX;
				ball[i].y = ball[i].r - Math.cos(ball[i].num * Math.PI / 180) * ball[i].r + ball[i].startY;
			}

			for (var i=0,length=bullet.length;i<length;i++){
				bullet[i].x =bullet[i].x+bullet[i].sX;
				bullet[i].y =bullet[i].y+bullet[i].sY;
			}

			for (var i=0,length=bullet.length;i<length;i++){
				for (var j = 0; j < ball.length; j++){
					if(pz(bullet[i].x,bullet[i].y,ball[j].x,ball[j].y)){
						bullet.splice(i,1);
						ball.splice(j,1);
						break;
					}
				}
			}
		}, 30);

		var ball = [];

		setInterval(function() {
			ball.push({
				x: 300,
				y: 0,
				r: 200,
				num: 0, //弧度
				startX: 300,
				startY: 0
			});
		}, 350);

		var iRotate = 0;
		oc.onmousemove = function(ev){

			var ev = ev || window.event;
			var x = ev.clientX-oc.offsetLeft;
			var y = ev.clientY-oc.offsetTop;

			var a = x-300;
			var b = y-200;
			var c = Math.sqrt(a*a+b*b);

			if(a>0 && b>0){
				iRotate = Math.asin(b/c)+90*Math.PI/180;
			}else if(a>0){
				iRotate = Math.asin(a/c);
			}

			if(a<0 && b>0){
				iRotate =-( Math.asin(b/c)+90*Math.PI/180);
			}else if(a<0){
				iRotate = Math.asin(a/c);
			}

		}

		var bullet = [];

		oc.onclick = function(ev){

			var ev = ev || window.event;
			var x = ev.clientX-oc.offsetLeft;
			var y = ev.clientY-oc.offsetTop;

			var a = x-300;
			var b = y-200;
			var c = Math.sqrt(a*a+b*b);

			var speed = 5;
			var sX = speed*a/c;
			var sY = speed*b/c;

			bullet.push({
				x :300,
				y :200,
				sX :sX,
				sY :sY
			});

		}

	};

	function pz(x1,y1,x2,y2){
		var a=x1-x2;
		var b=y1-y2;
		var c = Math.sqrt(a*a+b*b);
		if(c<40){
			return true;

		}else{
			return false;
		}
	}

	// setInterval(function(){
	// 	ogc.clearRect(0,0,oc.width,oc.height)
	// 	ogc.beginPath();
	// 	ogc.arc(i++,i++,20,0*Math.PI/180,360*Math.PI/180,false);//参数分别为x,y,r,弧度,旋转方向
	// 	ogc.stroke();
	// }, 50)
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 16:05:56

html5 canvas 实现简易马祖小游戏的相关文章

HTML5版的String Avoider小游戏

HTML5版的String Avoider小游戏 http://www.newgrounds.com/portal/view/300760 蛮简单也蛮考验耐心,从游戏起始点移动鼠标到终点位置,鼠标移动过程绘制出移动轨迹的String平滑曲线,整个过程不能碰撞到边界,从技术角度来说其核心就是根据鼠标移动位置生成String线的算法,该游戏是ActionScript写的Flash版,这里将其改造成HTML5版的JavaScript实现,并增加可自定义关卡功能的一种设计思路. String连线我是缓存

用canvas写一个h5小游戏

这篇文章我们来讲一讲用canvas画一个躲水果的小游戏.就是通过手指控制一个人物移动来躲避水果,若发生碰撞,则游戏结束. 我们定义一个game_control对象来处理初始化,事件绑定,游戏开始,游戏结果判定,游戏结束等判定. 在游戏中,我们需要一个人物以及三种水果的图片,我们做成了雪碧图. 接下来直接上代码吧~ 首先我们定义一个ship对象,3个水果.一个人物都是基于这个对象的. function ship(options){ if (options) { var width=options.

canvas随笔之2048小游戏

HTML: <!DOCTYPE HTML> <html> <head> <title>2048小游戏</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, u

C语言实现简易2048小游戏

一直很喜欢玩这个小游戏,简单的游戏中包含运气与思考与策略,喜欢这种简约又不失内涵的游戏风格.于是萌生了用C语言实现一下的想法. 具体代码是模仿这个:https://www.cnblogs.com/judgeyoung/p/3760515.html 博主分析的都很到位,很多算法技巧都值得借鉴,C语言实现2048的主要思想已经在那个博客中详细的分析了,但是我觉得在博主的代码中还是有很多很好的思想是值得我借鉴学习的. 比如这个生成随机数,顺便规定随机数的概率: /* 生成随机数 函数定义 */ voi

怎样用HTML5 Canvas制作一个简单的游戏

为了让大家清楚HTML5制作游戏的简单流程,所以先了制作一个非常简单的游戏,来看一看这个过程.   游戏非常简单,无非就是英雄抓住怪物就得分,然后游戏重新开始,怪物出现在地图的随机位置,英雄初始化在地图的中间.点击[这里](../simple_canvas_game-master/index.html "simple_canvas_game"),我们可以直接先玩玩这个游戏 ![simple_game](Figure/1_simple_game.png) ## 1. 创建一个Canvas

HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识

一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas" width="600" height="300">您的浏览器不支持canvas,可以选择升级您的浏览器</canvas> 2 开发基于canvas的应用程序的最基本的几个操作 1),使用document.getElementById()方

&#128146; es6 + canvas 开源 盖楼小游戏 完整代码注释 从零教你做游戏(一)

盖楼游戏 一个基于 Canvas 的盖楼游戏 Demo 预览 在线预览地址 (Demo Link) 手机设备可以扫描下方二维码 github https://github.com/bmqb/tower_game 喜欢的朋友 给个star 支持一下哦 Game Rule 游戏规则 以下为默认游戏规则,也可参照下节自定义游戏参数 每局游戏生命值为3,掉落一块楼层生命值减1,掉落3块后游戏结束,单局游戏无时间限制 成功盖楼加25分,完美盖楼加50分,连续完美盖楼额外加25分,楼层掉落扣除生命值1,单局

21款网页版html5小游戏源码

html5魅族创意的贪食蛇游戏源码下载 html5网页版打砖块小游戏源码下载 html5 3D立体魔方小游戏源码下载 html5网页版飞机躲避游戏源码下载 html5三国人物连连看游戏源码下载 js html5 2048数字游戏源码_2048网页版源码下载 html5盲打高手打飞字游戏下载_网页版英文打飞字游戏源码下载 jQuery flappy bird电脑版小游戏源码下载 网页版html5 3d俄罗斯方块游戏源码下载 jQuery html5迷宫游戏源码下载 html5网页游戏仿flappy

HTML5小游戏源码收藏

html5魅族创意的贪食蛇游戏源码下载 html5网页版打砖块小游戏源码下载 html5 3D立体魔方小游戏源码下载 html5网页版飞机躲避游戏源码下载 html5三国人物连连看游戏源码下载 js html5 2048数字游戏源码_2048网页版源码下载 html5盲打高手打飞字游戏下载_网页版英文打飞字游戏源码下载 jQuery flappy bird电脑版小游戏源码下载 网页版html5 3d俄罗斯方块游戏源码下载 jQuery html5迷宫游戏源码下载 html5网页游戏仿flappy