canvas 实现飞碟射击游戏
var canvas = document.getElementById('canvas');
var cxt = canvas.getContext('2d');
// 射击角度
var ang = 0;
// 子弹
var bullets = [];
// 飞碟
var fly = {'x':100, 'y':100};
// 得分
var score = 0;
// 清除画布
function erase() {
cxt.clearRect(0, 0, canvas.width, canvas.height)
}
// 画炮台
function draw() {
cxt.save();
cxt.beginPath();
cxt.translate(300, 400);
cxt.arc(0, 0, 100, 0, -180*Math.PI/180, true);
cxt.stroke();
cxt.closePath();
cxt.restore();
cxt.save();
cxt.translate(300, 400);
cxt.rotate(ang);
cxt.fillRect(-10, -100, 20, 80);
cxt.restore();
}
// 画飞碟
function drawFly(){
cxt.save();
cxt.fillStyle = 'red';
cxt.beginPath();
cxt.arc(fly.x, fly.y, 10, 0, 360*Math.PI/180, true);
cxt.fill();
cxt.closePath();
cxt.restore();
}
// 画子弹
function drawBullet(){
for(var i=0; i<bullets.length; i++){
cxt.save();
cxt.translate(300, 400);
cxt.rotate(bullets[i].ang);
cxt.fillStyle = 'grey';
cxt.beginPath();
cxt.arc(bullets[i].x, bullets[i].y, 10, 0, 360*Math.PI/180, true);
cxt.fill();
cxt.closePath();
cxt.restore();
}
}
// 随机飞碟
function randomBullet(){
var x = Math.round(Math.random()*580) + 10;
var y = Math.round(Math.random()*190) + 10;
fly.x = x;
fly.y = y;
}
// 子弹运行
function step(){
var _bullets = [];
for(var i=0; i<bullets.length; i++){
var x = 300 - Math.sin(bullets[i].ang)*bullets[i].y;
var y = 400 - Math.abs(Math.cos(bullets[i].ang)*bullets[i].y);
if(Math.sqrt((fly.x-x)*(fly.x-x)+(fly.y-y)*(fly.y-y)) < 20){
score ++;
randomBullet();
}
bullets[i].y -= 5;
if(bullets[i].y > -500 && bullets[i].x > -300 && bullets[i].x < 300){
_bullets.push(bullets[i]);
}
}
bullets = _bullets;
}
// 画得分
function drawScore() {
cxt.save();
cxt.font="20px Verdana";
cxt.fillStyle = 'skyblue';
cxt.fillText('得分:' + score, 500, 50);
cxt.restore();
}
// 鼠标移动控制炮台
canvas.onmousemove = function(e){
var ev = e || window.event;
var _x = ev.clientX - canvas.offsetLeft;
var _y = ev.clientY - canvas.offsetTop;
if(Math.sqrt((_x-300)*(_x-300)+(_y-400)*(_y-400)) <=100){
ang = Math.atan((_x - 300)/(400 - _y));
}
};
// 单击鼠标进行射击
var lastTime = 0;
canvas.onclick = function(){
var nowDate = new Date();
if(nowDate.getTime() - lastTime < 200){
return;
}
lastTime = nowDate.getTime();
var bullet = {'x':0,'y':-110,'ang':ang};
bullets.push(bullet);
};
function animate() {
erase();
draw();
drawFly();
drawBullet();
step();
drawScore();
timer = requestAnimationFrame(animate);
}
animate();
canvas 实现飞碟射击游戏的更多相关文章
- Skytte:一款令人印象深刻的 HTML5 射击游戏
Skytte 是一款浏览器里的 2D 射击游戏.使用 Canvas 元素和大量的 JavaScript 代码实现.Skytte 是用我们的开源和现代的前端技术创造的.经典,快节奏的横向滚动射击游戏,探 ...
- 简单的射击游戏HTML+JS实现
一直想自己写一个游戏玩,时间和精力都不太允许,最近几天刚好有空闲时间,就琢磨了这个小游戏. 刚开始想着计算图片重叠事件,然后让炮弹和飞机消失,傻乎乎写了一天,越整越乱.今天一大早晕过来了,改用数组以后 ...
- 一款简单射击游戏IOS源码
源码描述: 一款基于cocos2d的简单设计游戏,并且也是一款基于cocos2d的简单射击游戏(含苹果IAD广告), 游戏操作很简单,哪个数字大就点击射击哪个.里面有苹果iad广告,功能简单完整,适合 ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇08:弹幕系统》本系列完结
8.弹幕系统 弹幕系统概述: 弹幕系统的设计体现了射击游戏的基本要素,玩家要在敌人放出的大量子弹(弹幕)的细小空隙间闪避,能在玩家闪躲弹幕的时候给玩家带来快感,接近满屏的子弹,增加了对玩家的视觉冲击力 ...
- 有图有真相,分享一款网页版HTML5飞机射击游戏
本飞机射击游戏是使用HTML5代码写的,尝试通过统一开发环境(UDE)将游戏托管在MM应用引擎,直接生成了网页版游戏,游戏简单易上手,非常适合用来当做小休闲打发时间. 游戏地址:http://flyg ...
- D3D游戏编程系列(六):自己动手编写第一人称射击游戏之第一人称视角的构建
说起第一人称射击游戏,不得不提第一人称视角啊,没有这个,那么这个第一就无从谈起啊,我作为一个观察者究竟如何在这个地图上顺利的移动和观察呢,那么,我们一起来研究下. 我们首先来看下CDXCamera类: ...
- Unity3D--学习太空射击游戏制作(二)
步骤三:创建主角 游戏的主角是一艘太空飞船,我们将使用一个飞船模型作为游戏的主角,并赋予他一个脚本,控制他的运动,游戏体的组件必须依赖于脚本才能运行. 01:在Project窗口找到Player.fb ...
- Unity3D--学习太空射击游戏制作(一)
近期买了本书在学习一些Unity3D的东西,在了解了Unity3D工具的基本面板后开始学习一个太空射击游戏的开发过程. 首先下载一个关于本游戏的资源文件,(百度云下载地址:http://pan.bai ...
- cocos2d-x学习日志(10) --射击游戏(喵星战争)
转载请标明:转载自[小枫栏目],博文链接:http://blog.csdn.net/rexuefengye/article/details/10553487 一.纵版射击游戏的特点 纵版射击游戏是一种 ...
随机推荐
- cdh5.13.1 hadoop hdfs HA模式无法启动
经过观察日志发现,JN三个节点启动正常,只有NN节点启动时提示JN节点没有格式化 停止HDFS下面所有服务 先启动JN节点 然后启动一个NN节点,观察三个JN节点日志 发现其中一个节点的日志正常,没有 ...
- 在CentOS7.4上手动编译安装Mysql-5.7.20
实验环境:CentOS 7.4 mysql软件: mysql-boost-5.7.20.tar.gz 1.安装编译工具 yum -y install \ncurses \ncurses-devel \ ...
- Django的auth【认证】模块简介
首先我们先来复习一下路由别名如何使用,这里仅仅复习一下二级路由的路由别名该如何使用 ·1.在视图函数中使用二级路由别名,需要加上app的名称+“:”+ “路由别名” from django.urls ...
- Java_7 ArrayList集合
1 ArrayList创建变量的步骤 1: 导入包 java.util包中 2: 创建引用类型的变量 数据类型< 集合存储的数据类型> 变量名 = new 数据类型<集合存储的数据类 ...
- Dockerfile指令学习 (转)
原文地址:http://blog.csdn.net/we_shell/article/details/38445979 Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一 ...
- python3.x:No matching distribution found for PIL
安装完成即可解决无法引入PIL的问题.
- go语言中常用的文件和文件夹操作函数
package main; import ( "os" "log" "time" "fmt" ) //一些常用的文件操作 ...
- JSON与GSON比较
JSON: 是Android SDK官方的库,所以在开发移动端的工程时就必须使用JSON.进行数据的转换和处理 GSON: GSON适用于服务端,gson比json功能更加强大.比如在集合类的处理.自 ...
- Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead.解决方法
今天在eclipse里报这个错误: Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead. Please ...
- netcore webapi 用户 'IIS APPPOOL\无托管代码' 登录失败
配置在iis上,除了环境配置错误的原因还有一种可能是连接字符串的问题,iis要求使用sql server的sa或者其他登录用户. ps:连接字符串: "Default": &qu ...