刚学HTML的canvas,感觉这个家伙挺神奇的,而且人们给我的感觉它很简单,但事实应该不是这样的。起码对于我来说不是简单的,学啥都的有持之以恒的心啊。希望自己可以坚持,带着好奇的心去感受js动画带给自己的快乐吧!!

弄了几个小时的时间,就做了一个这样简单的动画,自己好笨啊。但还是想发上来,总结一下都用到了啥方法。

首先,一定是先创建一个画布canvas,设定画布的长和宽;然后,在画布中插入一种图片,作为背景图;插入图片的方法如下(也可以说加载图片):

var c = document.getElementById("mycanvas");
        var con = c.getContext("2d");

 var img = new Image();//声明一个新的图像对象img.src = "xin.jpg";//图像的来源img.onload = function(){调用onload方法con.drawImage(img,0,0);//将图像画到画布上,起点坐标(0,0)}

       插入的图片是一张心心相印的图像,而本人就想画出一只箭,像丘比特之箭一样,将两颗心串起来。这时候就要考虑:一只箭的有箭尾,箭杆,箭头。

由图可知,这只箭最好是从右下角向左上角穿过,另外箭杆的起始坐标你的想好设置在那里,终点坐标设置在那里,同时这只箭不能连续走下去,中间的有断开的地方(如上图),所以中间断开的坐标你也的选好吧。这些工作做完了,那我们开始画箭杆。这里我的箭杆是一堆连续的小圆构成(你也可以直接用lineTo画直线)

箭杆

首先,使用构造函数建立一个“父类”(我把它当作了C语言里的结构体定义)

function circlc(){this.x = 184;this.y = 0;this.color = "#F09";this.r = 2.6;}

var pen = new circlc();//实例化

接着写画圆的函数把:

function Draw(){con.fillStyle = pen.color;con.beginPath();con.arc(pen.x,pen.y,pen.r,0,Math.PI*2);con.fill();}

然后写该小实心圆移动的方法吧:

function animate(){pen.x -= 1;pen.y = 0.9357*pen.x - 4.5;//一条直线Draw(); }

箭尾

箭尾就是使用moveTo和lineTo函数,首先将画笔的坐标移动到箭杆的起始坐标上(用moveTo),然后用一堆lineTo函数画线,最后用fill()函数填充
function tailDraw(){ con.fillStyle = pen.color; con.beginPath(); con.moveTo(184,168); con.lineTo(185,181); con.lineTo(175,170); con.lineTo(177,158); con.lineTo(187,158); con.lineTo(197,166); con.fill(); }

箭头

箭头和箭尾的画法一样,需要画出一个三角形:
function headDraw(){ con.fillStyle = pen.color; con.beginPath(); con.moveTo(7.5,2.5); con.lineTo(29,7); con.lineTo(11,19); con.fill(); }
好了,差不多了,然后调用一个相当于定时器的东西吧setInterval();我这里写的,个人感觉作为初学者还是有那么一点儿想法的(哈哈!!)
var shif = false;
function show(){   //这个函数是为了一个button准备的shif = !shif;if(shif){tailDraw();//画出箭尾var time1 = setInterval(function(){//调用“定时器1”,定时时间是30mst--;//这个值是和箭杆的pen.x值一样的animate();//画箭杆if(t <= 152)//当箭杆画到这里时,执行if内部的函数{    clearInterval(time1);//关掉“定时器1”pen.x = 40;//将下次画箭杆的坐标设好t = 40;//同样t值跟随var time2 = setInterval(function(){//再开一个“定时器2”t--;animate();//继续画出箭杆if(t <= 10){//箭杆终于画到头了headDraw();//把箭头画出来clearInterval(time2);//关掉“定时器2”}},20);//定时时间20ms}},20);}else{con.clearRect(0,0,200,200);//如果shif值为false,清空画布con.drawImage(img,0,0);   //重画背景图pen.x = 184;//重设箭杆坐标t = 184;//t值跟随}}
个人觉得,这个小程序中,有兴趣的伙伴们可以,再写一个初始化函数就更好了。另外,在画布的最左下角加载一张丘比特的图像,当点击按钮的时候,箭从丘比特的弓上射出
,就更加生动了。最后把所有代码粘过来,各位大神小神,多多指教。








<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>丘比特之箭</title></head><body align="center"><div style="color:#F00"><strong>丘比特之箭</strong></div><div><canvas id="mycanvas" width="200" height="200"></canvas><br><input type="button" value="演示" onClick="show()"></div><script>var c = document.getElementById("mycanvas");var con = c.getContext("2d");var t = 184;var img = new Image();img.src = "xin.jpg";img.onload = function(){con.drawImage(img,0,0);}function circlc(){this.x = 184;this.y = 0;this.color = "#F09";this.r = 2.6;}var pen = new circlc();function tailDraw(){con.fillStyle = pen.color;con.beginPath();con.moveTo(184,168);con.lineTo(185,181);con.lineTo(175,170);con.lineTo(177,158);con.lineTo(187,158);con.lineTo(197,166);con.fill();}function headDraw(){con.fillStyle = pen.color;con.beginPath();con.moveTo(7.5,2.5);con.lineTo(29,7);con.lineTo(11,19);con.fill();}function Draw(){//con.drawImage(img,0,0);con.fillStyle = pen.color;con.beginPath();con.arc(pen.x,pen.y,pen.r,0,Math.PI*2);con.fill();}//window.addEventListener("load",Draw,true);//调试画笔起点的位置(观看用)function animate(){pen.x -= 1;pen.y = 0.9357*pen.x - 4.5;Draw();          }var shif = false;function show(){shif = !shif;if(shif){tailDraw();var time1 = setInterval(function(){t--;animate();if(t <= 152){    clearInterval(time1);pen.x = 40;t = 40;var time2 = setInterval(function(){t--;animate();if(t <= 10){headDraw();clearInterval(time2);}},20);}},20);}else{con.clearRect(0,0,200,200);con.drawImage(img,0,0);   pen.x = 184;t = 184;}}</script></body>
</html>


丘比特之箭——简单的canvas动画相关推荐

  1. 简单的canvas动画原理

    简单的canvas动画原理一般就是如下步骤: setInterval(    function(){        draw(ctx);        update(canvas.width,canv ...

  2. 制作一个简单的canvas动画

    制作一个简单的canvas动画 作者:旺仔 一上来先话不多说上代码,代码能看的懂得,ok,就当我下面所有的内容为废话,代码看的不太懂的,没关系我会一点一点让你懂,不过前提是你有一定的html+css+ ...

  3. html5动态连线,canvas简单连线动画的实现代码

    前言:canvas动画入门系列之简单连线动画.虽然简单,但连线动画应用场景还挺多,因此做了个小demo,一通百通. step1:绘制点 首先创建个标签 设置几个点的坐标 const points = ...

  4. 最简单太阳系H5动画canvas详解 零基础可入

    最简单太阳系H5动画canvas详解 零基础可入 最终结果:(实际为动画效果,金星绕轨道转动) 页面准备/html 要使用canvas,需要首先在页面中要绘制的位置放入canvas标签元素,在后期的绘 ...

  5. 简单的Canvas刮刮乐带动画效果的实例

    今天做了个刮刮乐领奖品的小活动,感觉挺有用的,整理在这儿记录下 上个效果图先: 加了个简单的 css 动画效果 下面贴上主要代码: index.html <!DOCTYPE html> & ...

  6. canvas动画简单操作

    canvas动画 小球滚动效果 关键api: window.requestAnimationFrame(draw) 会递归调用draw函数,替代setIntervalvar x = 20; var s ...

  7. canvas动画3:交互

    canvas动画3 时隔很久,本人终于又写博客了(重度拖延症),把之前留下的canvas交互动画讲一讲. 电脑上的交互,指的是鼠标和键盘,我们今天主要用的是鼠标. 既然是鼠标的话,就要获取鼠标的各种事 ...

  8. 《每周一点canvas动画》——圆周运动

    接<每周一点canvas动画>--波形运动 圆周运动可以分为两种基本的形式:正圆运动和椭圆运动. 在讲解圆周运动之前,必不可少的数学公式即将袭来.so,各位骚年们,请护好自己的膝盖.听不懂 ...

  9. canvas动画:黑客帝国_使用Canvas API进行动画处理-第3部分:重力和动态渲染

    canvas动画:黑客帝国 Over in Part 2 of this series we created a ball that would ricochet around the screen ...

最新文章

  1. 计算机网络第四章ppt谢希仁,计算机网络课件-谢希仁(第四章).ppt
  2. jQuery:动态改变html表单的目标页(Target)
  3. 在windows上的git bash中安装tree 和 linux tree命令使用
  4. 大白话 + 13 张图解 Kafka
  5. 【NLP】如何清理文本数据
  6. java k均值_算法——K均值聚類算法(Java實現)
  7. 使普通的旧Java OSGi兼容
  8. 阿里云云计算 20 在线实验--块存储的使用
  9. json改键值大法,C# Newtonsoft.Json.Linq改字段名 增删改查 有屋设计拆单管理一体化软件 全屋定制拆单 橱柜衣柜设计拆单 整装 木门归方程序
  10. Mac批量恢复废纸篓文件
  11. 秒拍视频其实在你浏览器缓存里
  12. JavaScript 每日一题 #11
  13. R语言绘图:条形图——barplot
  14. 扎根基层一线 助力社区(村)发展
  15. spring boot 集成xxl-job 学习总结
  16. BIM技术都是如何应用于水利工程中
  17. [ERP]ERP项目实施过程中的致命过失
  18. DCDC相关故障分析记录
  19. codevs 1219 骑士游历 1997年
  20. 机器学习与大数据基础知识(二)

热门文章

  1. 使用Nexus3创建docker个人仓库(匿名登录)
  2. 使用计算机配置路由器,路由器使用方法图解教程(路由器与计算机设置)
  3. pyqt5 qfont 字体_PyQt5 控件字体样式等设置的实现
  4. 《信息检索》第一周周五课程调整通知 及 潘德炉院士介绍
  5. GMIC 2018大会AI 生万物 嘉宾分享摘要
  6. 单元测试是什么?怎么写?主要测试什么?
  7. Tif 格式转 JPG、PNG
  8. 2022-2028全球机架风扇托盘行业调研及趋势分析报告
  9. 天使纪元服务器不显示,天使纪元进不去游戏怎么办 为什么玩不了
  10. 征集 | 9大战队4天时间,完成10余个创意项目,智领云HackWeek大赛一触即发!