一,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>
相关推荐
数据结构与算法 c++实现 祖玛.cpp
通过分析和理解祖玛游戏的Java设计,我们可以从中学习到如何将复杂的游戏逻辑转化为可执行的代码,如何构建吸引人的游戏界面,以及如何实现互动性和用户体验。无论你是初学者还是经验丰富的开发者,深入研究这个项目...
要求用VC设计并实现一个简单的祖玛小游戏:游戏的主角是一只石青蛙,石青蛙会吐出各种颜色的珠子,珠子造型美丽,并且有着神秘的色彩,环绕着石青蛙的是载着珠子的轨道,各种颜色的珠子会沿着轨道往前滑动,石青蛙...
JavaScript通过DOM API可以动态地修改网页内容,例如,当球被消除时,可以使用`removeChild()`或`innerHTML`属性删除相应的HTML元素,实现游戏动态效果。 5. **事件处理**:JavaScript的事件处理机制使得游戏能够...
《Visual C# 实现的祖玛游戏解析》 祖玛游戏是一款深受玩家喜爱的经典益智游戏,其核心玩法是通过发射彩球消除同色球群,防止它们进入终点。在编程领域,用Visual C#来实现祖玛游戏,既能展现编程技术,也能提供一...
PSP 祖玛.iso
《祖玛游戏:一款经典与创新的融合》 祖玛游戏,源于古代玛雅文明的神秘元素,是一款深受全球玩家喜爱的休闲益智类游戏。它以其独特的游戏机制、丰富的关卡设计和色彩鲜明的画面,吸引了无数玩家沉浸在消除与策略的...
AS3提供了强大的绘图API,可以实现复杂的图形绘制和动画效果,如球的滚动、碰撞后的爆炸动画等。 四、碰撞检测 在祖玛游戏中,碰撞检测是关键的一环,主要用于判断球是否与轨道上的其他球或目标发生碰撞。AS3提供...
祖玛游戏的源码包含了游戏的各个组成部分,如游戏规则的实现、用户交互的设计、图形界面的绘制以及物理运动的模拟等。通过分析源码,我们可以深入理解游戏的运作原理,从而提升编程技能,甚至可以在此基础上进行二次...
源代码部分,我们可以期待看到如何利用HGE的API实现祖玛游戏的关键功能,如珠子的移动、碰撞检测、得分计算等。资源文件则可能包括了游戏的背景图像、音效和动画序列等,这些都是构成游戏氛围和交互体验的重要组成...
"祖玛代码"在本文中指的是开发这款游戏的源代码,它包含了游戏逻辑、图形界面、音效处理等多个方面的编程实现。祖玛游戏的核心在于玩家通过控制发射器发射不同颜色的球,与轨道上的球相匹配,达到消除的目的,防止球...
祖玛游戏的分数显示、提示信息、游戏结束画面等都是通过这些API实现的。同时,通过监听鼠标点击、键盘输入等事件,实现用户与游戏的交互。 六、动画与视觉效果 动画是使游戏生动的关键。在AS中,可以使用补间动画、...
本文将深入探讨一个基于C#语言的字符祖玛游戏的实现,帮助读者理解C#的基本语法、游戏逻辑以及事件处理等核心概念。 祖玛游戏是一种流行的游戏类型,其基本玩法是通过发射特定的元素来匹配并消除同色的元素,直到...
开发者可以使用Canvas的API如`fillRect`,`strokeRect`,`beginPath`,`arc`等来绘制各种形状和路径,实现游戏画面的展示。 其次,HTML5的Web Storage API提供了本地存储数据的能力,这在游戏中非常关键,比如用来...
3. **Android SDK**:包含了Android系统的所有API库,开发者需要引用对应的SDK版本来实现各种功能,如图形绘制、音频视频处理、网络通信等。 4. **游戏逻辑与算法**:游戏的核心在于它的规则和逻辑。祖玛游戏的逻辑...
祖玛小游戏是一款经典的休闲益智游戏,其基本玩法是通过发射彩球,匹配三个或更多相同颜色的球来消除它们,防止彩球进入终点。在本文中,我们将深入探讨使用C语言和C++编写祖玛小游戏的相关知识点。 首先,我们要...
《Unity Zuma 祖玛:深度解析游戏源码》 Unity 3D 是一款强大的跨平台游戏开发引擎,被广泛应用于制作各种类型的游戏,包括2D、3D以及各种休闲游戏,如“祖玛”这类经典游戏。本文将深入探讨Unity Zuma游戏的源码,...
AS3.0提供了强大的绘图API,可以创建复杂的2D图形和动画效果。 4. **物理模拟**:为了让游戏中的球按照真实世界的物理规则运动,源代码可能包含了简单的物理引擎,用于计算球的速度、加速度和碰撞效果。 5. **数据...
源代码是实现这一切的基础,通过分析Flash祖玛游戏的ActionScript 3.0源代码,我们可以深入了解游戏开发的核心技术,为自己的游戏开发之路添砖加瓦。 首先,ActionScript 3.0是Adobe Flash Platform的主要编程语言...
《水果祖玛游戏》是一款基于Cocos2d框架开发的经典祖玛类休闲益智游戏。在Cocos2d这个强大的2D游戏开发引擎的支持下,这款游戏不仅拥有精美的画面和流畅的游戏体验,还展现了编程技术在游戏开发中的巧妙运用。 首先...