又在别的地方嫖到了这个效果研究了亿下下,制作过程如下(超详细):
<canvas id="canvas"></canvas>
#canvas{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
box-shadow: 0 0 10px rgb(150, 150, 150);
}
position: absolute; 绝对定位。
top: 50%;
left: 50%;
transform: translate(-50%,-50%); 居中。
box-shadow: 0 0 10px rgb(150, 150, 150); 阴影。
var canvas = document.querySelector("#canvas");
var ctx = canvas.getContext('2d');
//画布宽
var wide=600;
//画布高
var high=600;
// 变量,判断一次渲染中只识别按键一次
var kd = 0;
//当前分数
var fraction =0;
//速度,就是执行定时器的时间参数
var speed = 250;
// 蛇的初始颜色 红色
var yanse = `red`;
// 蛇数组,组成蛇的每一个方块
var snake = [];
// 食物数组
var food = {};
// 蛇的移动方向,x轴:1为向右,-1为向左;y轴:1为向下,-1为向上 。不能斜着走,所以0为某轴无方向。
var diretion = {
x:-1,
y:0
}
// 给画布宽高赋值 打算画一个长宽都是30个20px的方块画布
canvas.width = wide;
canvas.height = high;
function chushi(){
//蛇初始长度为3个方块,位置如下(这个随意)
for(let i =0;i<3;i++){
snake.push({
x: i+10,
y: 10
})
}
// 给食物一个随机位置和随机颜色
food = {
x: parseInt(Math.random()*30),
y: parseInt(Math.random()*30),
color:`rgb(${Math.random()*255},${Math.random()*255},${Math.random()*255})`
}
}
// 绘制图形
function draw(){
// 绘制显示当前分数的文字
ctx.fillStyle = 'rgba(255,255,255,0.5)';
ctx.font="50px 仿宋";
ctx.textAlign = 'center';
ctx.fillText("你的分数为:"+fraction+" 分",300,300);
// 绘制方格,长宽都是30个,都是19px*19px的方格
for(let i=0;i<30;i++){
for(let j=0;j<30;j++){
ctx.fillStyle = 'rgba(255, 255, 255,.3)';
ctx.fillRect(i*20,j*20,19,19);
}
}
// 绘制蛇
for(let i=0;i<snake.length;i++){
temp = snake[i];
ctx.fillStyle = yanse;
ctx.fillRect(temp.x*20,temp.y*20,19,19);
// 判断蛇头(第一个方块)是否与身体某个方块重合 ,就是头撞到身体
if(temp.x==snake[0].x&&temp.y==snake[0].y&&i!=0){
// 游戏结束,重新给初始化
alert('游戏结束~点击确认再来一次~');
fraction = 0;
snake.length=0;
chushi();
}
}
// 绘制食物,绘制一个圆形
ctx.beginPath();
ctx.fillStyle = food.color;
ctx.arc(food.x*20+9.5,food.y*20+9.5,7,0,Math.PI*2,false);
ctx.stroke();
ctx.fill();
ctx.closePath();
// 给蛇头绘制一个字符,☆ ,好区分头尾 ,也可省略
ctx.fillStyle = 'yellow';
ctx.font="15px 仿宋";
ctx.textAlign = "start";
ctx.fillText("☆",snake[0].x*20+2,snake[0].y*20+14.5);
}
//更新
function update(){
// 建一个对象head,这个为蛇的新头,通过绘制新头,去掉尾部实现移动效果
var head = {};
//判断蛇头是否遇到边界,到边界则在另一边重新绘制 x轴
switch (snake[0].x+diretion.x){
case -1: head.x=29;break;
case 30: head.x=0;break;
// 没到边界则为当前位置加方向
default: head.x = snake[0].x+diretion.x;
}
//判断蛇头是否遇到边界,到边界则在另一边重新绘制 y轴
switch (snake[0].y+diretion.y){
case -1: head.y=29;break;
case 30: head.y=0;break;
// 没到边界则为当前位置加方向
default: head.y = snake[0].y+diretion.y;
}
// 判断新蛇头是否与食物重合,就是吃到食物
if(head.x==food.x&&head.y==food.y){
//蛇的颜色为吃到食物的颜色
yanse = food.color;
// 重新给食物初始化
food = {
x: parseInt(Math.random()*30),
y: parseInt(Math.random()*30),
color:`rgb(${Math.random()*255},${Math.random()*255},${Math.random()*255})`
}
//在蛇尾添加一节
let temp = snake[length-1];
snake.push(temp);
fraction+=1;
// 吃完食物速度加快
if(speed>80){
//定时器间隔减10
speed = speed-10;
// 清除原来定时器,重新绘制
clearInterval(time);
time = setInterval(function () {
kd = 0;
ctx.clearRect(0, 0, wide, high);
update();
draw();
}, speed);
}
}
//添加新头
snake.splice(0,0,head);
//去掉尾部
snake.pop();
}
//判断点击事件
document.addEventListener('keydown', event=>{
switch (event.keyCode){
// 按了向上键
case 38:
// 判断当前不是向下移动与还没按过键,否则蛇会重叠
if(diretion.y!=1&&kd==0){
// 重新给移动方向赋值
diretion.x=0;
diretion.y=-1;
kd=1;
}
break;
// 下面以此类推一样的原理
case 39:
if(diretion.x!=-1&&kd==0){
diretion.x=1;
diretion.y=0;
kd=1;
}
break;
case 40:
if(diretion.y!=-1&&kd==0){
diretion.x=0;
diretion.y=1;
kd=1;
}
break;
case 37:
if(diretion.x!=1&&kd==0){
diretion.x=-1;
diretion.y=0;
kd=1;
}
break;
}
})
chushi();
var time = setInterval(function(){
kd=0;
ctx.clearRect(0,0,wide,high);
update();
draw();
},speed);
编是一个有着6年工作经验的工程师,关于C++编程,自己有做材料的整合,一个完整的C++编程学习路线,学习资料和工具,能够进我的群10048,-83029收取,免费送给大家,希望你也能凭着自己的努力,成为下一个优秀的程序员
C++ 资源大全中文版
我想很多程序员应该记得 GitHub 上有一个 Awesome – XXX 系列的资源整理。awesome-cpp 就是 fffaraz 发起维护的 C++ 资源列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。
Awesome 系列虽然挺全,但基本只对收录的资源做了极为简要的介绍,如果有更详细的中文介绍,对相应开发者的帮助会更大。这也是我们发起这个开源项目的初衷。
伯乐在线已在 GitHub 上发起「C++ 资源大全中文版」的整理。欢迎扩散、欢迎加入。https://github.com/jobbole/awesome-cpp-cn
标准库
C++标准库,包括了STL容器,算法和函数等。
框架
C++通用框架和库
人工智能
异步事件循环
音频
音频,声音,音乐,数字化音乐库
生态学
生物信息,基因组学和生物技术
压缩
压缩和归档库
并发性
并发执行和多线程
容器
密码学
算法
数据库
数据库,SQL服务器,ODBC驱动程序和工具
调试
调试库, 内存和资源泄露检测,单元测试
游戏引擎
图形用户界面
图形
图像处理
国际化
Json
日志
Boost.Log :设计非常模块化,并且具有扩展性
easyloggingpp:C++日志库,只包含单一的头文件。
Log4cpp :一系列C++类库,灵活添加日志到文件,系统日志,IDSA和其他地方。
templog:轻量级C++库,可以添加日志到你的C++应用程序中
机器学习
数学
多媒体
网络
物理学
动力学仿真引擎
机器人学
科学计算
脚本
序列化
视频
虚拟机
Web应用框架
XML
XML就是个垃圾,xml的解析很烦人,对于计算机它也是个灾难。这种糟糕的东西完全没有存在的理由了。-Linus Torvalds
多项混杂
一些有用的库或者工具,但是不适合上面的分类,或者还没有分类。
软件
用于创建开发环境的软件
编译器
C/C++编译器列表
在线编译器
在线C/C++编译器列表
调试器
C/C++调试器列表
集成开发环境(IDE)
C/C++集成开发环境列表
构建系统
静态代码分析
提高质量,减少瑕疵的代码分析工具列表
给大家推荐一下学习研究HTML5必备的一些个网站,更加有利于大家对html5的学些和研究。
1. W3C HTML 5 权威教程,学习HTML5的各种标签,查询参考手册。
2. HTMLDemos可以插件HTML5标签在各浏览器的兼容性,同时你还可以查看各种HTML5的标准Demo演示。
3. 苹果提供的HTML5演示站点,提供很多很绚丽的HTML5Demo。链接
4. 测试浏览器对HTML5的支持,并打分,可以知道你当前的浏览器对HTML5的支持情况如何,各种标签和组件的支持情况。链接
5.360的HTML5基地。链接
6. WHATWG博客是网络超文本应用技术工作小组(Web Hypertext Application Technology Working Group)的博客。链接
7. HTML5医生发表了许多文章,都是关于HTML5及其语义、及如何正确使用它的。他们也通过“询问医生”收集了很多问题,并在文章中予以回答,所有人都可从中受益。链接
8. 这是一个以表格制成的备忘单形式的单页面,描述了HTML5、CSS3、SVG及其他未来网络技术的特征。链接
9. 这个备忘单就是一个简单的可视网格,包含了所有HTML5标签和相关的属性。链接
10 .一个提供HTML5各种功能演示的网站,提供各种HTML5的显示Demo。链接
11. 这个网站提供了大量的HTML5游戏资源,喜欢HTML5游戏的童鞋们,可以千万别错过哦。链接
12. 一个HTML 5的文档资料网站,做得很出色。介绍的图片全是用了涂鸦的方式,很直观,很可爱的网站。链接
13.h5之家(中文学习园地)。链接
今天就给大家推荐到这里,这15个网站,基本上可以算得上是HTML5学习研究的上上至宝了。如果你也有更好的HTML5网站推荐,欢迎评论并留下网址信息,方便整理。
出于对PMCAFF用户的尊重,任何在PMCAFF产品经理社区发布的内容,在未经允许的情况下,不得在任何平台被直接或间接发布使用或被用于其他任何商业目的。如有违反上述声明者本网站将追究其相关法律责任。
微信公众号:pmcaffcom
投稿邮箱:tougao@pmcaff.com
Greated by PMCAFF产品经理社区 - www.pmcaff.com
*请认真填写需求信息,我们会在24小时内与您取得联系。