`
xiaomiya
  • 浏览: 131417 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

canvasapi及实现简易祖玛

阅读更多

一,canvas简介

1,我们说canvas,是一个html5的一种元素,通过使用javascript,可用于绘制图形,动画,图表,照片构图,或在飞行的任何其他可视化对象。

2,支持的浏览器,

Internet Explorer (9.0+)

Safari (3.0+)

Firefox (3.0+)

Chrome (3.0+)

Opera (10.0+)

iOS (1.0+)

Android (1.0+)

3,开始使用

<canvas id="canvas1" width="600" height="600"><span>不支持canvas浏览器</span></canvas>

如果这里不定义widht和height默认是宽300,高150

 

 

var oC = document.getElementById('c1');
	
var oGC = oC.getContext('2d');  //webgl : 3D绘图

 

, 

 

//oGC.fillRect(50,50,100,100);//填充
	
oGC.strokeRect(50,50,100,100);//带边框的方块(这里会感觉到边框有两像素)换成下面的

(造成的原因:我们的画图跟在ps里面画图是一样的,我们从坐标为50,50处开始画图边框为1像素的方块,他从边框的1像素的中心处开始画,然后分成0.5。。计算机会自动给我填充成1像素。。所以看上去边框有两像素)
oGC.strokeRect(50.5,50.5,100,100);

 

 

        var oC = document.getElementById('c1');
	
	var oGC = oC.getContext('2d');  
	
	oGC.fillStyle = 'red';
	
	oGC.strokeStyle = 'blue';
	oGC.lineWidth = 10;
	
	oGC.fillRect(50,50,100,100);
	
	oGC.strokeRect(50.5,50.5,100,100);

 这里有个顺序问题。

 

边界绘制

oGC.lineJoin = 'bevel';

 

 

        oGC.beginPath();//开始
	
	oGC.moveTo(100,100);//移动
	
	oGC.lineTo(200,200);//线
	
	oGC.lineTo(300,200);//另一个线
	
	oGC.closePath();//闭合
	
	oGC.stroke();

 

 

	oGC.beginPath();
	
	oGC.rect(100,100,100,100);//矩形
	
	oGC.closePath();
	
	oGC.fill();
	
	oGC.clearRect(0,0,oC.width,oC.height);//删除一个画布的矩形区域的  

 

 

oGC.save();//保存路径
	
	oGC.fillStyle = 'red';
	
	oGC.beginPath();
	
	oGC.moveTo(100,100);
	
	oGC.lineTo(200,200);
	
	oGC.lineTo(300,200);
	
	oGC.closePath();
	
	oGC.fill();
	
	oGC.restore();//恢复路径

 

鼠标画线

<script>

window.onload = function(){
	var oC = document.getElementById('c1');
	
	var oGC = oC.getContext('2d');  
	
	oC.onmousedown = function(ev){
		var ev = ev || window.event;
		oGC.moveTo(ev.clientX-oC.offsetLeft,ev.clientY-oC.offsetTop);
		document.onmousemove = function(ev){
			var ev = ev || window.event;
			oGC.lineTo(ev.clientX-oC.offsetLeft,ev.clientY-oC.offsetTop);
			oGC.stroke();
		};
		document.onmouseup = function(){
			document.onmousemove = null;
			document.onmouseup = null;
		};
	};
	
};

</script>

 

方块运动

使用定时器来清除画布再次画

<script>

window.onload = function(){
	var oC = document.getElementById('c1');
	
	var oGC = oC.getContext('2d');  
	
	var num = 0;
	
	oGC.fillRect(0,0,100,100);
	
	setInterval(function(){
		
		num++;
		
		oGC.clearRect(0,0,oC.width,oC.height);
		
		oGC.fillRect(num,num,100,100);
		
	},30);
	
};

</script>

 

 ,

画圆,弧度

window.onload = function(){
	var oC = document.getElementById('c1');
	var oGC = oC.getContext('2d');
	
	oGC.moveTo(200,200);
	
	//弧度 = 角度*Math.PI/180
	
	oGC.arc(200,200,150,0,90*Math.PI/180,true);
	
	oGC.stroke();
	
};

 

可以来画个时钟

<script>

window.onload = function(){
	var oC = document.getElementById('c1');
	var oGC = oC.getContext('2d');
	
	function toDraw(){
		
		var x = 200;
		var y = 200;
		var r = 150;
		
		oGC.clearRect(0,0,oC.width,oC.height);
		
		var oDate = new Date();
		var oHours = oDate.getHours();
		var oMin = oDate.getMinutes();
		var oSen = oDate.getSeconds();
		
		var oHoursValue = (-90 + oHours*30 + oMin/2) * Math.PI/180;
		var oMinValue = (-90 + oMin*6) * Math.PI/180;
		var oSenValue = (-90 + oSen*6) * Math.PI/180;
		
		
		/*oGC.moveTo(x,y);
		
		oGC.arc(x,y,r,0,6*Math.PI/180,false);
		
		oGC.moveTo(x,y);
		
		oGC.arc(x,y,r,6*Math.PI/180,12*Math.PI/180,false);*/
		
		oGC.beginPath();
		
		for(var i=0;i<60;i++){
			oGC.moveTo(x,y);
			oGC.arc(x,y,r,6*i*Math.PI/180,6*(i+1)*Math.PI/180,false);
		}
		
		oGC.closePath();
		
		oGC.stroke();
		
		
		
		oGC.fillStyle = 'white';
		
		oGC.beginPath();
		
		oGC.moveTo(x,y);
		oGC.arc(x,y,r*19/20,0,360*(i+1)*Math.PI/180,false);
		
		oGC.closePath();
		
		oGC.fill();
		
		
		oGC.lineWidth = 3;
		
		oGC.beginPath();
		
		for(var i=0;i<12;i++){
			oGC.moveTo(x,y);
			oGC.arc(x,y,r,30*i*Math.PI/180,30*(i+1)*Math.PI/180,false);
		}
		
		oGC.closePath();
		
		oGC.stroke();
		
		
		oGC.fillStyle = 'white';
		
		oGC.beginPath();
		
		oGC.moveTo(x,y);
		oGC.arc(x,y,r*18/20,0,360*(i+1)*Math.PI/180,false);
		
		oGC.closePath();
		
		oGC.fill();
		
		
		oGC.lineWidth = 5;
		
		oGC.beginPath();
		oGC.moveTo(x,y);
		
		oGC.arc(x,y,r*10/20,oHoursValue,oHoursValue,false);
		
		oGC.closePath();
		oGC.stroke();
		
		oGC.lineWidth = 3;
		oGC.beginPath();
		oGC.moveTo(x,y);
		
		oGC.arc(x,y,r*14/20,oMinValue,oMinValue,false);
		
		oGC.closePath();
		oGC.stroke();
		
		
		oGC.lineWidth = 1;
		oGC.beginPath();
		oGC.moveTo(x,y);
		
		oGC.arc(x,y,r*19/20,oSenValue,oSenValue,false);
		
		oGC.closePath();
		oGC.stroke();
		
		
	}
	
	setInterval(toDraw,1000);
	
	toDraw();
	
};

</script>

 

绘制其他曲线

arcTo(x1,y1,x2,y2,r)

第一组坐标,第二组坐标,半径

quadraticCurveTo(dx,dy,x1,y1);

贝塞尔曲线,第一组控制点,第二组结束坐标

bezierCurveTo(dx1,dy1,dx2,dy2,x1,y1);

贝塞尔曲线,第一组控制点,第二组控制点,第三组结束坐标

<script>

window.onload = function(){
	var oC = document.getElementById('c1');
	var oGC = oC.getContext('2d');
	
	/*

	oGC.moveTo(100,200);
	
	oGC.arcTo(100,100,200,100,50);
	
	oGC.stroke();
	
	oGC.moveTo(100,200);
	
	oGC.quadraticCurveTo(100,100,200,100);
	
	oGC.stroke();*/
	
	oGC.moveTo(100,200);
	
	oGC.bezierCurveTo(100,100,200,200,200,100);
	
	oGC.stroke();
	
};

</script>

 

变换

translate

偏移,从起点为基准点,移动当前坐标位置

rotate

旋转,参数为弧度

scale

缩放

<script>

window.onload = function(){
	var oC = document.getElementById('c1');
	var oGC = oC.getContext('2d');
	
	oGC.translate(100,100);
	
	oGC.rotate(20*Math.PI/180);
	oGC.rotate(25*Math.PI/180);
	
	oGC.scale(2,2);
	
	oGC.fillRect(0,0,100,100);
	
};

</script>

 

移动加缩放的方块

<script>

window.onload = function(){
	var oC = document.getElementById('c1');
	var oGC = oC.getContext('2d');
	
	var num = 0;
	
	var num2 = 0;
	
	var value = 1;
	
	
	setInterval(function(){
		
		
		
		num++;
		
		oGC.save();
		
		oGC.clearRect(0,0,oC.width,oC.height);
		
		oGC.translate(100,100);
		
		if(num2 == 100){
			value = -1;
		}
		else if(num2 == 0){
			value = 1;
		}
		
		num2 += value;
		
		oGC.scale( num2*1/50,num2*1/50 );
		
		oGC.rotate(num*Math.PI/180);
		
		oGC.translate(-50,-50);
		
		oGC.fillRect(0,0,100,100);
		
		oGC.restore();  
		
	},30);
	
};

</script>

 

这里未完待续,,,,,,,,,,,

 

 

 

二,使用canvas完成简易祖玛游戏直接上代码可以运行

<!DOCTYPE html>
<html>
<head>
	<title>html5canvasZM</title>
</head>
<style>
body,html,div,p{margin: 0; padding:0 }
body{ background: #000}
#zm{ background: #fff; width: 600px; margin: 20px auto}
</style>
<body>
<div id="zm">
	<canvas id="canvas1" width="600" height="600"></canvas>
</div>
<script>
window.onload = function(){
	var oC = document.getElementById('canvas1');
	var oGC = oC.getContext('2d');
	var i = 0;
	var yImg = new Image();
	yImg.src = "images/person.png";
	yImg.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);//弧度 = 角度*Math.PI/180
			//oGC.closePath();
			oGC.stroke();
			//画出第二大园的二分之一
			oGC.beginPath();
			oGC.arc(250,200,150,180*Math.PI/180,360*Math.PI/180,false);
			oGC.stroke();
			//画出中间的小圆的全部
			oGC.beginPath();
			oGC.arc(400,200,20,0,360*Math.PI/180,false);
			oGC.stroke();

			for(var i=0; i<ball.length;i++){
				//画出小黑球
				oGC.beginPath();
				oGC.moveTo(ball[i].x,ball[i].y);
				oGC.arc(ball[i].x,ball[i].y,20,0,360*Math.PI/180,false);
				oGC.fill();
			}
			//中间青蛙的位置
			oGC.save();
			oGC.translate(300,200);
			oGC.rotate(iRotate);
			oGC.translate(-40,-40);
			oGC.drawImage(yImg,0,0);
			oGC.restore();

			for(var i=0;i<bullet.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();
			}
			//画出简易祖玛字样
			oGC.save();
			oGC.font = '60px impact';
			oGC.textBaseline = 'top';
			oGC.fillStyle = '#404143';
			oGC.shadowOffsetX = 3;
			oGC.shadowOffsetY = 3;
			oGC.shadowColor = '#092253';
			oGC.shadowBlur = 5;
			var w = oGC.measureText('简易祖玛').width;
			var h = 60;
			oGC.fillText('简易祖玛', (oC.width - w)/2 , 450 );
			oGC.restore();

		},1000/60);

		setInterval(function(){
			for(var i=0; i<ball.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("游戏结束");
					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;i<bullet.length;i++){
				bullet[i].x = bullet[i].x + bullet[i].sX;
				bullet[i].y = bullet[i].y + bullet[i].sY;
			}

			for(var i=0;i<bullet.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.onmousedown = 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;
		}
		
	}
}
</script>
</body>
</html>

 

0
0
分享到:
评论

相关推荐

    数据结构与算法 c++实现 祖玛.cpp

    数据结构与算法 c++实现 祖玛.cpp

    zuma.zip_祖玛_祖玛java设计

    通过分析和理解祖玛游戏的Java设计,我们可以从中学习到如何将复杂的游戏逻辑转化为可执行的代码,如何构建吸引人的游戏界面,以及如何实现互动性和用户体验。无论你是初学者还是经验丰富的开发者,深入研究这个项目...

    用VC设计并实现一个简单的祖玛小游戏

    要求用VC设计并实现一个简单的祖玛小游戏:游戏的主角是一只石青蛙,石青蛙会吐出各种颜色的珠子,珠子造型美丽,并且有着神秘的色彩,环绕着石青蛙的是载着珠子的轨道,各种颜色的珠子会沿着轨道往前滑动,石青蛙...

    基于html的祖玛游戏

    JavaScript通过DOM API可以动态地修改网页内容,例如,当球被消除时,可以使用`removeChild()`或`innerHTML`属性删除相应的HTML元素,实现游戏动态效果。 5. **事件处理**:JavaScript的事件处理机制使得游戏能够...

    Visual C# 的祖玛游戏

    《Visual C# 实现的祖玛游戏解析》 祖玛游戏是一款深受玩家喜爱的经典益智游戏,其核心玩法是通过发射彩球消除同色球群,防止它们进入终点。在编程领域,用Visual C#来实现祖玛游戏,既能展现编程技术,也能提供一...

    PSP 祖玛.iso

    PSP 祖玛.iso

    祖玛游戏Game.zip

    《祖玛游戏:一款经典与创新的融合》 祖玛游戏,源于古代玛雅文明的神秘元素,是一款深受全球玩家喜爱的休闲益智类游戏。它以其独特的游戏机制、丰富的关卡设计和色彩鲜明的画面,吸引了无数玩家沉浸在消除与策略的...

    祖玛flashAS3源码

    AS3提供了强大的绘图API,可以实现复杂的图形绘制和动画效果,如球的滚动、碰撞后的爆炸动画等。 四、碰撞检测 在祖玛游戏中,碰撞检测是关键的一环,主要用于判断球是否与轨道上的其他球或目标发生碰撞。AS3提供...

    祖玛游戏源码

    祖玛游戏的源码包含了游戏的各个组成部分,如游戏规则的实现、用户交互的设计、图形界面的绘制以及物理运动的模拟等。通过分析源码,我们可以深入理解游戏的运作原理,从而提升编程技能,甚至可以在此基础上进行二次...

    祖玛游戏一个测试程序

    源代码部分,我们可以期待看到如何利用HGE的API实现祖玛游戏的关键功能,如珠子的移动、碰撞检测、得分计算等。资源文件则可能包括了游戏的背景图像、音效和动画序列等,这些都是构成游戏氛围和交互体验的重要组成...

    祖玛代码 下载

    "祖玛代码"在本文中指的是开发这款游戏的源代码,它包含了游戏逻辑、图形界面、音效处理等多个方面的编程实现。祖玛游戏的核心在于玩家通过控制发射器发射不同颜色的球,与轨道上的球相匹配,达到消除的目的,防止球...

    flash祖玛游戏源代码

    祖玛游戏的分数显示、提示信息、游戏结束画面等都是通过这些API实现的。同时,通过监听鼠标点击、键盘输入等事件,实现用户与游戏的交互。 六、动画与视觉效果 动画是使游戏生动的关键。在AS中,可以使用补间动画、...

    c#字符祖玛游戏

    本文将深入探讨一个基于C#语言的字符祖玛游戏的实现,帮助读者理解C#的基本语法、游戏逻辑以及事件处理等核心概念。 祖玛游戏是一种流行的游戏类型,其基本玩法是通过发射特定的元素来匹配并消除同色的元素,直到...

    2015良心系列_HTML5祖玛游戏源码

    开发者可以使用Canvas的API如`fillRect`,`strokeRect`,`beginPath`,`arc`等来绘制各种形状和路径,实现游戏画面的展示。 其次,HTML5的Web Storage API提供了本地存储数据的能力,这在游戏中非常关键,比如用来...

    简单祖玛游戏源码

    3. **Android SDK**:包含了Android系统的所有API库,开发者需要引用对应的SDK版本来实现各种功能,如图形绘制、音频视频处理、网络通信等。 4. **游戏逻辑与算法**:游戏的核心在于它的规则和逻辑。祖玛游戏的逻辑...

    祖玛小游戏代码有详细代码可运行

    祖玛小游戏是一款经典的休闲益智游戏,其基本玩法是通过发射彩球,匹配三个或更多相同颜色的球来消除它们,防止彩球进入终点。在本文中,我们将深入探讨使用C语言和C++编写祖玛小游戏的相关知识点。 首先,我们要...

    Unity Zuma 祖玛

    《Unity Zuma 祖玛:深度解析游戏源码》 Unity 3D 是一款强大的跨平台游戏开发引擎,被广泛应用于制作各种类型的游戏,包括2D、3D以及各种休闲游戏,如“祖玛”这类经典游戏。本文将深入探讨Unity Zuma游戏的源码,...

    祖玛源代码

    AS3.0提供了强大的绘图API,可以创建复杂的2D图形和动画效果。 4. **物理模拟**:为了让游戏中的球按照真实世界的物理规则运动,源代码可能包含了简单的物理引擎,用于计算球的速度、加速度和碰撞效果。 5. **数据...

    Flash祖玛游戏源代码

    源代码是实现这一切的基础,通过分析Flash祖玛游戏的ActionScript 3.0源代码,我们可以深入了解游戏开发的核心技术,为自己的游戏开发之路添砖加瓦。 首先,ActionScript 3.0是Adobe Flash Platform的主要编程语言...

    水果祖玛游戏

    《水果祖玛游戏》是一款基于Cocos2d框架开发的经典祖玛类休闲益智游戏。在Cocos2d这个强大的2D游戏开发引擎的支持下,这款游戏不仅拥有精美的画面和流畅的游戏体验,还展现了编程技术在游戏开发中的巧妙运用。 首先...

Global site tag (gtag.js) - Google Analytics