js 学习四 对象应用 吃货游戏
该例子用于对象的理解非常有效(建议看完上面网站的内容在开始练习)
弹球
body {
margin: 0;
overflow: hidden;
font-family: "PingFangSC-Regular", "微软雅黑", sans-serif;
height: 100%;
}
h1 {
font-size: 2rem;
letter-spacing: \-1px;
position: absolute;
margin: 0;
top: \-4px;
right: 5px;
color: transparent;
text-shadow: 0 0 4px white;
}
p {
position: absolute;
margin: 0;
top: 35px;
right: 5px;
color: #aaa;
}
弹球
//弹球的个数
const BALLS\_COUNT \= 25;
//弹球的半径范围
const BALL\_SIZE\_MIN \= 10;
const BALL\_SIZE\_MAX \= 20;
// 弹球的速度
const BALL\_SPEED\_MAX \= 7;
// 设定画布
var canvas \= document.querySelector("canvas");
var pcount \= document.querySelector("p");
var ctx \= canvas.getContext("2d");
//获取屏幕的宽高 并设置为画布的宽高
var width \= (canvas.width \= window.innerWidth);
var height \= (canvas.height \= window.innerHeight);
// 生成随机数的函数
function random(min, max) {
return Math.floor(Math.random() \* (max \- min)) + min;
}
// 生成随机颜色的函数
function randomColor() {
return (
"rgb(" + random(0, 255) + ", " + random(0, 255) + ", " +random(0, 255) + ")");
}
//定义形状
function Shape(x, y, velX, velY, exists) {
this.x \= x;
this.y \= y;
this.velX \= velX;
this.velY \= velY;
this.exists \= exists;
}
// 创建弹球对象
function Ball(x, y, velX, velY, color, size, exists) {
Shape.call(this, x, y, velX, velY, exists);
this.color \= color;
this.size \= size;
}
Ball.prototype \= Object.create(Shape.prototype);
Ball.prototype.constructor \= Ball;
// 定义绘制球的函数
Ball.prototype.draw \= function() {
ctx.beginPath();
ctx.fillStyle \= this.color;
ctx.arc(this.x, this.y, this.size, 0, 2 \* Math.PI);
ctx.fill();
};
//更新跳球的位置
Ball.prototype.update \= function() {
//到达右边,反弹
if (this.x + this.size \>= width) {
this.velX \= \-this.velX;
}
//到达左边,反弹
if (this.x \- this.size <= 0) {
this.velX \= \-this.velX;
}
//到达底部,反弹
if (this.y + this.size \>= height) {
this.velY \= \-this.velY;
}
//到达顶部 反弹
if (this.y \- this.size <= 0) {
this.velY \= \-this.velY;
}
this.x += this.velX;
this.y += this.velY;
};
//弹球的碰撞处理
Ball.prototype.collisionDetect \= function() {
for (var j \= 0; j < balls.length; j++) {
//是不是弹球本身
if (balls\[j\] \=== this) continue;
var dx \= this.x \- balls\[j\].x;
var dy \= this.y \- balls\[j\].y;
var distance \= Math.sqrt(dx \* dx + dy \* dy);
//碰撞改变两个球的颜色
if (distance < this.size + balls\[j\].size) {
this.color \= balls\[j\].color \= randomColor();
}
}
};
//定义一个小吃货
function EvilCircle(x, y, exists) {
Shape.call(this, x, y, 20, 20, exists);
this.color \= "white";
this.size \= 10;
}
EvilCircle.prototype \= Object.create(Shape.prototype);
EvilCircle.prototype.constructor \= EvilCircle;
// 定义绘制小吃货的函数
EvilCircle.prototype.draw \= function() {
ctx.beginPath();
ctx.strokeStyle \= this.color;
ctx.arc(this.x, this.y, this.size, 0, 2 \* Math.PI);
ctx.stroke();
};
// 检查小吃货是否碰壁
EvilCircle.prototype.checkBounds \= function() {
if (this.x + this.size \>= width) {
this.velX \= \-this.velX;
}
if (this.x \- this.size <= 0) {
this.x \= this.size;
}
if (this.y + this.size \>= height) {
this.y \= height \- this.size;
}
if (this.y \- this.size <= 0) {
this.y \= this.size;
}
};
// 定义小吃货移动函数
EvilCircle.prototype.setControls \= function() {
window.onkeydown \= e \=> {
if (e.key \=== "a") {
this.x \-= this.velX;
} else if (e.key \=== "d") {
this.x += this.velX;
} else if (e.key \=== "w") {
this.y \-= this.velY;
} else if (e.key \=== "s") {
this.y += this.velY;
}
//上下左右移动
if (e.key \=== "ArrowLeft") {
this.x \-= this.velX;
} else if (e.key \=== "ArrowRight") {
this.x += this.velX;
} else if (e.key \=== "ArrowUp") {
this.y \-= this.velY;
} else if (e.key \=== "ArrowDown") {
this.y += this.velY;
}
};
};
//小吃货碰撞到了弹球
EvilCircle.prototype.collisionDetect \= function() {
for (var j \= 0; j < balls.length; j++) {
//弹球没被吃
if (balls\[j\].exists) {
var dx \= this.x \- balls\[j\].x;
var dy \= this.y \- balls\[j\].y;
var distance \= Math.sqrt(dx \* dx + dy \* dy);
if (distance < this.size + balls\[j\].size) {
//标记弹球被吃
balls\[j\].exists \= false;
}
}
}
};
//激活小吃货
EvilCircle.prototype.run \= function() {
this.draw();
this.checkBounds();
this.collisionDetect();
};
//创建吃货
var evilCircle \= new EvilCircle(20, 20, true);
evilCircle.setControls();
// 定义一个数组来保存所有的球
var balls \= \[\];
pcount.textContent \= "还剩" + BALLS\_COUNT + "个球";
for (let i \= 0; i < BALLS\_COUNT; i++) {
var size \= random(BALL\_SIZE\_MIN, BALL\_SIZE\_MAX);
var ball \= new Ball(
// 为避免绘制错误,球至少离画布边缘球本身一倍宽度的距离
random(0 + size, width \- size),
random(0 + size, height \- size),
random(\-BALL\_SPEED\_MAX, BALL\_SPEED\_MAX),
random(\-BALL\_SPEED\_MAX, BALL\_SPEED\_MAX),
randomColor(),
size,
true
);
balls.push(ball);
}
// 定义一个循环来不停地播放
function loop() {
background("rgb(0, 0, 0)");
for (var i \= 0; i < balls.length; i++) {
if (!balls\[i\].exists) {
continue;
}
balls\[i\].draw();
balls\[i\].update();
balls\[i\].collisionDetect();
}
evilCircle.run();
var newballs \= balls.filter(balls \=> balls.exists);
pcount.textContent \= "还剩" + newballs.length + "个球";
requestAnimationFrame(loop);
}
function background(color) {
ctx.fillStyle \= color;
ctx.fillRect(0, 0, width, height);
ctx.beginPath();
}
loop();
js 学习四 对象应用 吃货游戏的更多相关文章
- js学习日记-对象字面量
一.对象字面量语法 var person={ name:'小王', age:18, _pri:233 } 成员名称的单引号不是必须的 最后一个成员结尾不要用逗号,不然在某些浏览器中会抛出错误 成员名相 ...
- JS学习四(BOM DOM)
BOM Screen对象 console.log(window.width);//屏幕宽度 console.log(window.height);//屏幕高度 conso ...
- js学习--浏览器对象计时器setInterval()与setTimeout()的使用与区别
一.setInterval()与setTimeout()的定义: 二.setInterval()与setTimeout()的使用: 1.setInterval()与clearInterval() ...
- Hibernate基础学习(四)—对象-关系映射(上)
一.映射对象标识符 Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...
- spring学习 四 对象的创建
spring中,有三种创建对象的方式 (1)构造创建 (2)实例工厂构造 (3)静态工厂构造 一 构造器创建 在构造器创建对象时,有无参构造和有参构造 两种 (1)在spring中,默认的是无参构造 ...
- JS 学习(四)对象
对象 在JS中,对象是数据(变量),拥有属性和方法. JS中所有事物都是对象:字符串.数字.数组.日期等. 对象是拥有属性和方法的特殊数据类型. 属性是与对象相关的值. 方法是能够在对象上执行的动作. ...
- Node.js学习笔记(四): 全局对象
在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性. 这 ...
- web前端学习(四)JavaScript学习笔记部分(6)-- js内置对象
1.JS内置对象-什么是对象 1.1.什么是对象: JavaScript中的所有事物都是对象:字符串.数值.数组.函数 每个对象带有属性和方法 JavaScript允许自定义对象 1.2.自定义对象: ...
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
随机推荐
- C++入门经典-例4.11-名称空间的定义和使用
1:名称空间,也成为名字空间.命名空间,关键字为namespace.我们经常使用这样一条语句: using namespace std: 我们要使用标准输入输出流,除了包含它们所在的头文件外,还必须使 ...
- jsvnadmin访问一直登陆 找不到用户
报错:AH01618: user zhangsan not found: /svn/hangzhi 在svnadmin控制台上将用户分好组,不然即使有账户也登不上
- SpringBoot 2.x 使用Redis作为项目数据缓存
一.添加依赖 <!-- 添加缓存支持 --> <dependency> <groupId>org.springframework.boot</groupId& ...
- 清明 DAY 4
~~~~~zhx并没有讲完~~~~~~QAQ~~~~~~ (其实并没有更完)
- DP练习题——洛谷P1970花匠
目录 题目描述: 输入输出格式: 输入格式: 输出格式: 输入输出样例: 输入样例: 输出样例: 题目分析: 解法一: 解法二: 结语: 题目描述: 洛谷\(P1970\) 花匠栋栋种了一排花,每株花 ...
- C# 防火墙操作之启用与关闭
通过代码操作防火墙的方式有两种:一是代码操作修改注册表启用或关闭防火墙:二是直接操作防火墙对象来启用或关闭防火墙.不论哪一种方式,都需要使用管理员权限,所以操作前需要判断程序是否具有管理员权限. 1. ...
- 第一篇 python数据类型
IO文件输出 问题1:Python如何实现print不换行? 默认情况下Python的print()函数是换行的,如 print("你好大成") print("!!!&q ...
- Windows 10 无法访问共享的解决办法大全
本文前面介绍 Windows 10 操作系统无法访问其他电脑的共享文件夹,而其他电脑访问该共享可以访问的解决办法. 简单点说就是,你的操作系统是 Win10 ,你访问不了某台电脑的共享,但是别人可以. ...
- WebSocket-Node
WebSocket Client & Server Implementation for Node 参考资料:[https://github.com/theturtle32/WebSocket ...
- tmux 学习
这几天学习了一下 tmux的使用 tmux 可以同时打开多个窗口 关于使用技巧 复制文章一下 哈哈 感谢网友 ================================华丽的分割线====== ...