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 一.纵版射击游戏的特点 纵版射击游戏是一种 ...
随机推荐
- HDU-2054.A==B?(字符串简单处理)
这道题......被我各种姿势搞死的... 本题大意:给出两个数A和B,判断A和B是否相等,对应输出YES or NO. 本题思路:本题我有两种思路,第一种是直接去除前导零和后导零然后稍加处理比较字符 ...
- Python+Selenium学习--访问连接
场景 web UI测试里最简单也是最基本的事情就是访问1个链接了. 在python的webdrive中,访问url时应该使用get方法. 代码 #!/usr/bin/env python # -*- ...
- UNITY3D 2D物流流体插件下载|Liquid Physics 2D
制作类似<鳄鱼小顽皮爱洗澡>游戏的必备插件 下载地址: https://item.taobao.com/item.htm?spm=0.7095261.0.0.47411debZFbEUn& ...
- 微信小程序开发——活动规则类文案文件读取及自动转换为小程序排版代码
前言: 最近做的小程序活动规则内容比较多,且一直处于修改中.由于小程序并不支持类似Html5中的预排版,所以,活动规则内容修改较大的时候,仍需要对新的内容用小程序的<text>组件做下排版 ...
- 浅谈CSRF
CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...
- [剑指Offer]39-数组中出现次数超过一半的数字(快排延申,找第k大数同理)
题目链接 https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&t ...
- 计算Python运行时间
可以调用datetime 或者 time库实现得到Python运行时间 方法1 import datetime start_t = datetime.datetime.now() #运行大型代码 e ...
- JAVA EXAM3 复习提纲
[Practice11_Zipcode_ArrayList] Zipcode class: //3 variables: zipcode, city, county, and compare by c ...
- swift - 正则表达式
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...
- ln: operation not permitted
ln: operation not permitted 在挂载的磁盘上建立软链接提示没有操作权限 例如: ln -s aa bb1ln:aa operation not permitted------ ...