游戏来源于 Mdn学习网站

该例子用于对象的理解非常有效(建议看完上面网站的内容在开始练习)



弹球

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 学习四 对象应用 吃货游戏的更多相关文章

  1. js学习日记-对象字面量

    一.对象字面量语法 var person={ name:'小王', age:18, _pri:233 } 成员名称的单引号不是必须的 最后一个成员结尾不要用逗号,不然在某些浏览器中会抛出错误 成员名相 ...

  2. JS学习四(BOM DOM)

    BOM                Screen对象 console.log(window.width);//屏幕宽度 console.log(window.height);//屏幕高度 conso ...

  3. js学习--浏览器对象计时器setInterval()与setTimeout()的使用与区别

    一.setInterval()与setTimeout()的定义: 二.setInterval()与setTimeout()的使用:    1.setInterval()与clearInterval() ...

  4. Hibernate基础学习(四)—对象-关系映射(上)

    一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...

  5. spring学习 四 对象的创建

    spring中,有三种创建对象的方式 (1)构造创建 (2)实例工厂构造 (3)静态工厂构造 一  构造器创建 在构造器创建对象时,有无参构造和有参构造 两种 (1)在spring中,默认的是无参构造 ...

  6. JS 学习(四)对象

    对象 在JS中,对象是数据(变量),拥有属性和方法. JS中所有事物都是对象:字符串.数字.数组.日期等. 对象是拥有属性和方法的特殊数据类型. 属性是与对象相关的值. 方法是能够在对象上执行的动作. ...

  7. Node.js学习笔记(四): 全局对象

    在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性. 这 ...

  8. web前端学习(四)JavaScript学习笔记部分(6)-- js内置对象

    1.JS内置对象-什么是对象 1.1.什么是对象: JavaScript中的所有事物都是对象:字符串.数值.数组.函数 每个对象带有属性和方法 JavaScript允许自定义对象 1.2.自定义对象: ...

  9. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

随机推荐

  1. Value '0000-00-00' can not be represented as java.sql.Date解决办法

    java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp 问题描述 ...

  2. 剑指offer31----栈的压入、弹出序列

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对 ...

  3. 创建新文件(包括上级文件夹),获取外置SD卡的根目录

    public String hebGetExternalRootDir(String externalAndriodSubDirPath){ if ( externalAndriodSubDirPat ...

  4. Scala学习(三)——集合

    基本数据结构 Scala提供了一些不错的集合. 数组 Array 数组是有序的,可以包含重复项,并且可变. val numbers = Array(1, 2, 3, 4, 5, 1, 2, 3, 4, ...

  5. 使用EXSI创建虚拟机

    使用exsi创建虚拟主机之前需要确定好使用什么系统来创建虚拟主机,而本地电脑上的镜像服务器是无法直接使用的,我们需要先将镜像上传到服务器的存储器上,然后才能在提供给虚拟服务器使用,如何替换呢,参考下方 ...

  6. 批处理bat相关

    时间 %date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2% 判断 if %date:~2,1%==/ (echo en ...

  7. Servlet请求参数的方式

    今天整理了以下几种常用的Servlet请求参数的方式,下面简单地介绍 1)getParameter(String key)返回一个字符串,获得name和key 一样的表单控件的数据,如果有重复的nam ...

  8. 使用Android自带的资源

    Android自带的资源文件有 :https://developer.android.google.cn/reference/android/R.html 代码中使用如下: 1.查看源代码的资源文件 ...

  9. CircleCi 不更新某个分支的两种方法

    概述 今天我发现我的所有项目的 CircleCi 部署全部都会更新 gh-pages 分支.找了好久,终于找到了不更新的方法.于是我总结了一下,记录下来,供以后开发时参考,相信对其他人也有用. onl ...

  10. 阶段3 2.Spring_08.面向切面编程 AOP_4 spring基于XML的AOP-配置步骤

    resources下新建bean.xml文件 xmlns:aop 先配置IOC aop 通知类就是logger.id配置为logAdvice表示日志的通知 梳理流程 首先我们在这有个Service它需 ...