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 一.纵版射击游戏的特点 纵版射击游戏是一种 ...
随机推荐
- Redis备份及回收策略
Redis备份(持久化) Redis备份存在两种方式: 1.一种是"RDB".是快照(snapshotting),它是备份当前瞬间Redis在内存中的数据记录; 2.另一种是&qu ...
- Array 遍历数组
public static void main(String args){ int a[][] = new int[3][4]; for(int i=0;i<a.length;i++){ for ...
- 23【notepad++】修改背景颜色
notepad++是一款功能丰富的编辑器,运行在windows平台上的编辑工具. 但它默认设置是白色背景,黑色文字,长时间看很刺眼.那么怎么设定成为暗色背景,亮色文字呢? 点击,设置->语言格式 ...
- Delphi中记录体做为属性的赋值方法
1. 起源 此问题源于[秋风人事档案管理系统]用Delphi XE重编译中所发现. 快十年了,当初Delphi 7所编写项目,想用Delphi XE重新编译,并打算做为Free软件发布,编译错误中发现 ...
- 【linux C】C语言中常用的几个函数的总结【一】
1.memset函数 定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”.每种类型的变量都有各自的 ...
- 662. Maximum Width of Binary Tree二叉树的最大宽度
[抄题]: Given a binary tree, write a function to get the maximum width of the given tree. The width of ...
- swift4.2 - 距离传感器
import UIKit class ViewController: UIViewController { deinit { NotificationCenter.default.removeObse ...
- Windows 获取unix timestamp
#include <stdio.h> #include <time.h> int main(){ SYSTEMTIME lpSysTime; GetLocalTime(& ...
- Exploring the world of Android :: Part 1
This blog is accidentally find out, it tells the story of one of our friends about the exploration o ...
- Django 导入css文件,样式不起作用。Resource interpreted as Stylesheet but transferred with MIME type application/x-css
笔者今天在模板中加载css文件时,发现 css样式能够下载再来却无法起作用,而且,图片.js都能够正常使用. 并且 浏览器提示: Resource interpreted as Stylesheet ...