网页游戏开发基础——Canvas基本图形绘制

deer332025-03-28技术文章41

  什么是Canvas?Canvas是HTML5新增的一个标签,你可以把它翻译为画布,通过它可以绘制二维或三维图形,有了它就可以不用安装flash而实现复杂的动画功能。如何通过Canvas绘图?下面我们来看一个简单的例子,涵盖Canvas初始化、图片加载、图形绘制、图片显示等基本功能。

  一、HTML页面结构

  先看看HTML页面结构,详细代码如下:

  标签指定网页标题;</span></p><p data-track='5'><span style='letter-spacing: 1px;'>  <meta>标签指定页面使用的字符集;</span></p><p data-track='6'><span style='letter-spacing: 1px;'>  <style>标签定义了一个名叫CenterWarp的样式;</span></p><p data-track='7'><span style='letter-spacing: 1px;'>  <body>标签中的onload="main()"表示页面加载完毕后调用main函数。</span></p><p data-track='8'><span style='letter-spacing: 1px;'>  <body>标签里有一个<div>标签,它的样式表示它的宽高为浏览器客户区的宽高,它的子元素水平、垂直居中。</span></p><p data-track='9'><span style='letter-spacing: 1px;'>  <canvas>标签定义了一块绘图区域,但canvas元素本身不绘制,你必须通过JavaScript脚本来绘制,注意其中的id="GameCanvans",表示可以通过JavaScript函数document.getElementById("GameCanvans")来将对Canvas元素的引用保存至一个变量中,在随后的代码可通过此变量来调用Canvas的绘图函数。</span></p><p data-track='10'><span style='letter-spacing: 1px;'>  <strong>二、Canvas初始化</strong></span></p><p data-track='11'><span style='letter-spacing: 1px;'>  首先获取对Canvas元素的引用,然后再获取绘图上下文,代码参见initCanvas()函数:</span></p><div class='pgc-img'><p class='pgc-img-caption'></p></div><p data-track='12' class='syl-page-br syl-page-br-hide' style><br></p><p data-track='13'><span style='letter-spacing: 1px;'>此函数首先通过g_canvas=document.getElementById("GameCanvans")函数将Canvas元素的引用保存至全局变量g_canvas中,接着通过g_canvas获取Canvas元素的绘图上下文,并将绘图上下文保存至全局变量g_context中,即g_context=g_canvas.getContext("2d");在接下来的代码中通过此全局变量来调用Canvas的绘图函数。注意:getContext()函数的参数为"2d",表示获取的是2d绘图上下文,即进行二维绘制。接下来的代码设置了Canvas的宽、高,分别为320和240,最后根据初始化的结果返回true或false。</span></p><p data-track='14'><span style='letter-spacing: 1px;'>函数clearScreen()的作用是用黑色填充整个Canvas区域,即用黑色清屏。fillRect()函数有四个参数,依次为填充区域左上角x、y坐标,填充区域宽、高。</span></p><p data-track='15'><span style='letter-spacing: 1px;'>  <strong>三、绘制空心矩形、填充矩形</strong></span></p><p data-track='16'><span style='letter-spacing: 1px;'>  绘制空心矩形需要设置strokeStyle,即矩形边框颜色,然后调用strokeRect()函数,四个参数依次为矩形左上角x、y坐标,宽、高。</span></p><div class='pgc-img'><p class='pgc-img-caption'></p></div><p data-track='17'><span style='letter-spacing: 1px;'>  填充矩形的代码与清屏的代码类似,相关说明参见清屏函数clearScreen()。</span></p><p data-track='18'><span style='letter-spacing: 1px;'>  <strong>四、显示图片</strong></span></p><p data-track='19'><span style='letter-spacing: 1px;'>  在Canvas中显示一幅图片需要分两步实现,首先要加载图片,接下来等图片加载完毕后才能绘制,我们先看看加载图片的代码:</span></p><p data-track='20'><span style='letter-spacing: 1px;'>  function loadPicture(){</span></p><p data-track='21'><span style='letter-spacing: 1px;'>    g_image=new Image();</span></p><p data-track='22'><span style='letter-spacing: 1px;'>    g_image.src="default.png";</span></p><p data-track='23'><span style='letter-spacing: 1px;'>    g_image.onload=function(){</span></p><p data-track='24'><span style='letter-spacing: 1px;'>      drawPicture();</span></p><p data-track='25'><span style='letter-spacing: 1px;'>    }</span></p><p data-track='26'><span style='letter-spacing: 1px;'>  }</span></p><p data-track='27'><span style='letter-spacing: 1px;'>  第1步:先创建一个Image对象;</span></p><p data-track='28'><span style='letter-spacing: 1px;'>  第2步:设置此图片对象的src属性,即图片路径(此处是相对路径,即,与JavaScript脚本文件处于相同路径);</span></p><p data-track='29'><span style='letter-spacing: 1px;'>  第3步:图片加载完毕后,调用绘图函数drawPicture()来绘图。</span></p><p data-track='30'><span style='letter-spacing: 1px;'>  g_image.onload=function(){}表示图片加载完毕后执行花括号中的语句,类似于<body>标签中的onload="main()",页面加载完毕后执行main()函数。</span></p><p data-track='31'><span style='letter-spacing: 1px;'>  最后,让我们来看看drawPicture()函数的代码</span></p><p data-track='32'><span style='letter-spacing: 1px;'>  function drawPicture(){</span></p><p data-track='33'><span style='letter-spacing: 1px;'>    g_context.drawImage(g_image,0,0,300,180,10,50,300,180);</span></p><p data-track='34'><span style='letter-spacing: 1px;'>  }</span></p><p data-track='35'><span style='letter-spacing: 1px;'>  即,调用Canvas的drawImage()函数绘图,其参数含义分别表示:</span></p><p data-track='36'><span style='letter-spacing: 1px;'>  1、g_image:图片对象</span></p><p data-track='37'><span style='letter-spacing: 1px;'>  2、0:图像左上角x坐标</span></p><p data-track='38'><span style='letter-spacing: 1px;'>  3、0:图像左上角y坐标</span></p><p data-track='39'><span style='letter-spacing: 1px;'>  4、300:图像宽度</span></p><p data-track='40'><span style='letter-spacing: 1px;'>  5、180:图像高度</span></p><p data-track='41'><span style='letter-spacing: 1px;'>  此例中图片尺寸为400×400,(0,0,300,180)表示从图片左上角(0,0)处复制300×180部分图片到Canvas中</span></p><p data-track='42'><span style='letter-spacing: 1px;'>  6、10:表示在Canvas中绘制的左上角x坐标</span></p><p data-track='43'><span style='letter-spacing: 1px;'>  7、50:表示在Canvas中绘制的左上角y坐标</span></p><p data-track='44'><span style='letter-spacing: 1px;'>  8、300:表示在Canvas中绘制的宽度</span></p><p data-track='45'><span style='letter-spacing: 1px;'>  9、180:表示在Canvas中绘制的高度</span></p><p data-track='46'><span style='letter-spacing: 1px;'>  将参数8和参数9改为与参数4、参数5不一样的数值可以实现缩放效果。</span></p><p data-track='47'><span style='letter-spacing: 1px;'>default.png如下图</span></p><div class='pgc-img'><p class='pgc-img-caption'></p></div><p data-track='48'><span style='letter-spacing: 1px;'>完整的代码如下:</span></p><p data-track='49' class='syl-line-pure-english'><span style='letter-spacing: 1px;'><script type="text/javascript"></span></p><p data-track='50'><span style='letter-spacing: 1px;'>  var g_canvas,g_context,g_image;</span></p><p data-track='51'><span style='letter-spacing: 1px;'>  function initCanvas(){</span></p><p data-track='52'><span style='letter-spacing: 1px;'>    g_canvas=document.getElementById("GameCanvans");</span></p><p data-track='53'><span style='letter-spacing: 1px;'>    g_context=g_canvas.getContext("2d");</span></p><p data-track='54'><span style='letter-spacing: 1px;'>    g_canvas.width=320;</span></p><p data-track='55'><span style='letter-spacing: 1px;'>    g_canvas.height=240;</span></p><p data-track='56'><span style='letter-spacing: 1px;'>    return (g_canvas&&g_context);</span></p><p data-track='57'><span style='letter-spacing: 1px;'>  }</span></p><p data-track='58' class='syl-page-br' style><br></p><p data-track='59'><span style='letter-spacing: 1px;'>  function clearScreen(){</span></p><p data-track='60'><span style='letter-spacing: 1px;'>    g_context.fillStyle="black";</span></p><p data-track='61'><span style='letter-spacing: 1px;'>    g_context.fillRect(0,0,320,240);</span></p><p data-track='62'><span style='letter-spacing: 1px;'>  }</span></p><p data-track='63' class='syl-page-br' style><br></p><p data-track='64'><span style='letter-spacing: 1px;'>  function drawWhiteRect(){</span></p><p data-track='65'><span style='letter-spacing: 1px;'>    g_context.strokeStyle="white";</span></p><p data-track='66'><span style='letter-spacing: 1px;'>    g_context.strokeRect(10,30,300,10);</span></p><p data-track='67'><span style='letter-spacing: 1px;'>  }</span></p><p data-track='68' class='syl-page-br' style><br></p><p data-track='69'><span style='letter-spacing: 1px;'>  function fillRedRect(){</span></p><p data-track='70'><span style='letter-spacing: 1px;'>    g_context.fillStyle="red";</span></p><p data-track='71'><span style='letter-spacing: 1px;'>    g_context.fillRect(10,10,300,10);</span></p><p data-track='72'><span style='letter-spacing: 1px;'>  }</span></p><p data-track='73' class='syl-page-br' style><br></p><p data-track='74'><span style='letter-spacing: 1px;'>  function drawPicture(){</span></p><p data-track='75'><span style='letter-spacing: 1px;'>    g_context.drawImage(g_image,0,0,300,180,10,50,300,180);</span></p><p data-track='76'><span style='letter-spacing: 1px;'>  }</span></p><p data-track='77' class='syl-page-br' style><br></p><p data-track='78'><span style='letter-spacing: 1px;'>  function loadPicture(){</span></p><p data-track='79'><span style='letter-spacing: 1px;'>    g_image=new Image();</span></p><p data-track='80'><span style='letter-spacing: 1px;'>    g_image.src="default.png";</span></p><p data-track='81'><span style='letter-spacing: 1px;'>    g_image.onload=function(){</span></p><p data-track='82'><span style='letter-spacing: 1px;'>      drawPicture();</span></p><p data-track='83'><span style='letter-spacing: 1px;'>    }</span></p><p data-track='84'><span style='letter-spacing: 1px;'>  }</span></p><p data-track='85' class='syl-page-br' style><br></p><p data-track='86'><span style='letter-spacing: 1px;'>  function main(){</span></p><p data-track='87'><span style='letter-spacing: 1px;'>    if(!initCanvas()){</span></p><p data-track='88'><span style='letter-spacing: 1px;'>      console.log("初始化canvas失败!");</span></p><p data-track='89'><span style='letter-spacing: 1px;'>      return;</span></p><p data-track='90'><span style='letter-spacing: 1px;'>    }</span></p><p data-track='91'><span style='letter-spacing: 1px;'>    clearScreen();</span></p><p data-track='92'><span style='letter-spacing: 1px;'>    fillRedRect();</span></p><p data-track='93'><span style='letter-spacing: 1px;'>    drawWhiteRect();</span></p><p data-track='94'><span style='letter-spacing: 1px;'>    loadPicture();</span></p><p data-track='95'><span style='letter-spacing: 1px;'>  }</span></p><p data-track='96' class='syl-line-pure-english'><span style='letter-spacing: 1px;'></script></span></p><p data-track='97'><span style='letter-spacing: 1px;'>  保存以上代码,并在浏览器中打开,将显示如下结果:</span></p><div class='pgc-img'><p class='pgc-img-caption'></p></div><p data-track='98'><span style='letter-spacing: 1px;'>  好了,Canvas基本的绘图功能就介绍完了,现在我们已经完全具备开发简单网页游戏的能力了,接下来将给大家详细介绍如何实现一个数独游戏,敬请关注。</span></p> </div> </div> </div> <div class="block"> <div class="posttitle"><h4>相关文章</h4></div> <div class="relatecon"> <div class="relatelist"><a href="http://www.deer33.com/post/2578.html" title="DQN 玩 2048 实战|第一期!搭建游戏环境(附 PyGame 可视化源码)">DQN 玩 2048 实战|第一期!搭建游戏环境(附 PyGame 可视化源码)</a><span class="posttime">2025-03-28</span></div><div class="relatelist"><a href="http://www.deer33.com/post/2580.html" title="DeepSeek用137秒生成课堂互动游戏,手把手教你怎么操作">DeepSeek用137秒生成课堂互动游戏,手把手教你怎么操作</a><span class="posttime">2025-03-28</span></div><div class="relatelist"><a href="http://www.deer33.com/post/2581.html" title="用AI写代码效率翻5倍!实测用DeepSeek,编程小白也能秒出小游戏">用AI写代码效率翻5倍!实测用DeepSeek,编程小白也能秒出小游戏</a><span class="posttime">2025-03-28</span></div><div class="relatelist"><a href="http://www.deer33.com/post/2582.html" title="利用DeepSeek生成3D模型的网页代码">利用DeepSeek生成3D模型的网页代码</a><span class="posttime">2025-03-28</span></div><div class="relatelist"><a href="http://www.deer33.com/post/2583.html" title="用DEEPSEEK 写的小游戏,直接运行太牛了!~">用DEEPSEEK 写的小游戏,直接运行太牛了!~</a><span class="posttime">2025-03-28</span></div><div class="relatelist"><a href="http://www.deer33.com/post/2585.html" title="网页游戏的开发流程">网页游戏的开发流程</a><span class="posttime">2025-03-28</span></div> </div> </div> </div> <div class="sidebar fixed"> <dl id="divCatalog" class="sidebox"> <dt class="sidetitle">网站分类</dt> <dd> <ul><li><a title="技术文章" href="http://www.deer33.com/?cate=1">技术文章</a></li> </ul> </dd> </dl><dl id="divTags" class="sidebox"> <dt class="sidetitle">标签列表</dt> <dd> <ul><li><a title="数据库设计工具有哪些" href="http://www.deer33.com/tags-2.html">数据库设计工具有哪些<span class="tag-count"> (34)</span></a></li> <li><a title="网上商城项目完整源码" href="http://www.deer33.com/tags-3.html">网上商城项目完整源码<span class="tag-count"> (34)</span></a></li> <li><a title="系统管理系统" href="http://www.deer33.com/tags-6.html">系统管理系统<span class="tag-count"> (43)</span></a></li> <li><a title="round向上取整公式怎么用" href="http://www.deer33.com/tags-7.html">round向上取整公式怎么用<span class="tag-count"> (57)</span></a></li> <li><a title="htmlinput属性" href="http://www.deer33.com/tags-11.html">htmlinput属性<span class="tag-count"> (46)</span></a></li> <li><a title="html5下载官方网站" href="http://www.deer33.com/tags-12.html">html5下载官方网站<span class="tag-count"> (48)</span></a></li> <li><a title="python正则表达式使用实例" href="http://www.deer33.com/tags-15.html">python正则表达式使用实例<span class="tag-count"> (35)</span></a></li> <li><a title="程序员需要考哪些证书" href="http://www.deer33.com/tags-16.html">程序员需要考哪些证书<span class="tag-count"> (34)</span></a></li> <li><a title="程序员基础知识" href="http://www.deer33.com/tags-17.html">程序员基础知识<span class="tag-count"> (33)</span></a></li> <li><a title="源代码电影在线播放" href="http://www.deer33.com/tags-26.html">源代码电影在线播放<span class="tag-count"> (37)</span></a></li> <li><a title="java我的世界启动器" href="http://www.deer33.com/tags-29.html">java我的世界启动器<span class="tag-count"> (44)</span></a></li> <li><a title="手机数控编程软件免费" href="http://www.deer33.com/tags-36.html">手机数控编程软件免费<span class="tag-count"> (56)</span></a></li> <li><a title="如何编程序" href="http://www.deer33.com/tags-37.html">如何编程序<span class="tag-count"> (35)</span></a></li> <li><a title="手机编程游戏软件" href="http://www.deer33.com/tags-43.html">手机编程游戏软件<span class="tag-count"> (35)</span></a></li> <li><a title="简单学生的网页代码" href="http://www.deer33.com/tags-44.html">简单学生的网页代码<span class="tag-count"> (35)</span></a></li> <li><a title="sql必知必会" href="http://www.deer33.com/tags-56.html">sql必知必会<span class="tag-count"> (36)</span></a></li> <li><a title="二次函数公式大全表格" href="http://www.deer33.com/tags-59.html">二次函数公式大全表格<span class="tag-count"> (36)</span></a></li> <li><a title="jquery事件处理" href="http://www.deer33.com/tags-62.html">jquery事件处理<span class="tag-count"> (34)</span></a></li> <li><a title="jquery ui下载" href="http://www.deer33.com/tags-63.html">jquery ui下载<span class="tag-count"> (36)</span></a></li> <li><a title="jquery是什么库" href="http://www.deer33.com/tags-64.html">jquery是什么库<span class="tag-count"> (35)</span></a></li> <li><a title="网站免费源码大全下载" href="http://www.deer33.com/tags-153.html">网站免费源码大全下载<span class="tag-count"> (34)</span></a></li> <li><a title="常用控件" href="http://www.deer33.com/tags-254.html">常用控件<span class="tag-count"> (35)</span></a></li> <li><a title="wordpress网站建设" href="http://www.deer33.com/tags-329.html">wordpress网站建设<span class="tag-count"> (34)</span></a></li> <li><a title="反函数和原函数关系" href="http://www.deer33.com/tags-335.html">反函数和原函数关系<span class="tag-count"> (34)</span></a></li> <li><a title="sqlserver" href="http://www.deer33.com/tags-360.html">sqlserver<span class="tag-count"> (34)</span></a></li> </ul> </dd> </dl><dl id="divComments" class="sidebox"> <dt class="sidetitle">最新留言</dt> <dd> <ul></ul> </dd> </dl></div> </div> </div> </div> </div> <div class="footer"> <div class="fademask"></div> <div class="wrap"> <h3><a href="https://beian.miit.gov.cn/" target="_blank">蜀ICP备2024111239号-17 </a></h3> <!--<h4>Powered By <a href="https://www.zblogcn.com/" title="Z-BlogPHP 1.7.3 Build 173295" target="_blank" rel="noopener norefferrer">Z-BlogPHP</a>. Theme by <a href="https://www.toyean.com/" target="_blank" title="拓源网">TOYEAN</a>.</h4>--> </div> </div> <div class="edgebar"> </div></body> </html><!--88.51 ms , 9 queries , 3856kb memory , 0 error-->