当前位置: 首页 > 编程日记 > 正文

游戏开发:js实现简单的板球游戏

js实现简单的板球游戏


大家好,本次我们来使用js来实现一个简单的板球游戏。截图如下:

首先,设计页面代码,页面代码很简单,因为整个几乎是使用js编写的,页面几乎没有代码,如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title></title>

<style type="text/css">

body{

margin: 0px;

}

</style>

<script src="js/common.js" type="text/javascript" charset="utf-8"></script>

</head>

<body>


</body>

</html>


接下来就是主要的js代码common.js,如下:

// 画布的宽高

var canvasWidth;

var canvasHeight;

// 方块的背景图片

var bg;

// 球

var ball;

// 板

var board;

// 背景方块的宽度

var breakWidth;


// 球的坐标和速度

var ballX = 100;

var ballY;

var xVal = 5;

var yVal = -5;


// 板的坐标

var boardX = 0;

var boardY;


// 方块数组

var breakers = [];


// 板的原始长度

var boardWidth = 242;

// 计时变量

var time = 0;

// 记录是否改变状态

var breakerChanged = false;


var col = 10;


window.onload = function(){

// 创建并设置canvas

var canvas = document.createElement("canvas");

canvas.width = window.innerWidth;

canvas.height = window.innerHeight;

canvasWidth = canvas.width;

canvasHeight = canvas.height;

breakWidth = (canvasWidth-10) / col;


// 将画布添加到body中

document.body.appendChild(canvas);

var context = canvas.getContext("2d");


// 球的初始Y值

ballY = canvasHeight - 80;

// 板的初始Y值

boardY = canvasHeight - 20;


// 加载所有的图片

loadAllImage();


// 定义键盘响应事件

document.onkeydown = boardMove;


// 开始启动程序

setInterval(run, 20);


function run(){

// 清空画布

context.clearRect(0,0,canvasWidth, canvasHeight);

// 绘制背景、小球、板

context.drawImage(bg, 0, -50, canvasWidth, canvasHeight + 50);

context.drawImage(ball, ballX, ballY);

context.drawImage(board, boardX, boardY, board.width, board.height);


// 如果处于变长的过程中

if(breakerChanged){

// 继续计时

time++;

// 当时间达到5秒钟

if(time >= 250){

// 还原

breakerChanged = false;

time = 0;

board.width = boardWidth;

}

}


// 绘制方块

updateBreakers();


// 更新小球的位置

updateBall();


// 球与方块的碰撞

ballHitBreakers();


// 球与板的碰撞

ballHitBoard();

}


function boardMove(){

// 向左移动

if(event.keyCode == 37){

boardX -= 30;

if(boardX <= 0){

boardX = 0;

}

}

// 向右移动

else if(event.keyCode == 39){

boardX += 30;

if(boardX >= canvasWidth - board.width){

boardX = canvasWidth - board.width;

}

}

}


// 简单判断球和板的碰撞

function ballHitBoard(){

if(hit(boardX, boardY - 60, board.width, board.height, ballX, ballY)){

yVal = -yVal;

}

}


// 简单判断球和方块的碰撞

function ballHitBreakers(){

// 从后面开始循环

for (var i = breakers.length - 1; i >= 0; i--) {

var breaker = breakers[i];// 3个属性,item, x, y

// 如果碰撞

if(hit(breaker.x, breaker.y, breakWidth, 30, ballX, ballY)){

// 变长的状态

if(breaker.state == 1){

// 判断是否已经处于变长状态

if(breakerChanged){

// 如果已经变长,应该刷新时间

board.width = boardWidth * 1.5;

time = 0;

}else{

// 如果开始变长,就改变状态

board.width = boardWidth * 1.5;

breakerChanged = true;

}

}else if(breaker.state == 2){

// 判断是否已经处于变长状态

if(breakerChanged){

// 如果已经变长,应该刷新时间

board.width = boardWidth * 0.5;

time = 0;

}else{

// 如果开始变长,就改变状态

board.width = boardWidth * 0.5;

breakerChanged = true;

}

}


// 方块消失(数组删除一个元素)

breakers.splice(i, 1);

// 球返回

yVal = -yVal;

}

}

}


// 简单碰撞函数

function hit(bx, by, bw, bh, x, y){

if(x >= bx && x <= bx + bw && y >= by && y <= by + bh){

return true;

}else{

return false;

}

}


// 球的运动

function updateBall(){

ballX += xVal;

ballY += yVal;


// 靠近左边的边距

if(ballX <= 0){

xVal = -xVal;

}


// 靠近顶部的边距

if(ballY <= 30){

yVal = -yVal;

}


// 测试代码,让球永远不掉落

//if(ballY >= canvasHeight - 80){

//yVal = -yVal;

//}


// 靠近右边的边距

if(ballX >= canvasWidth - 60){

xVal = -xVal;

}

}


// 加载所有的方块

function createBreakers(){

// 循环行

for (var i = 0; i < col; i++) {

// 循环列

for (var j = 0; j < col; j++) {

// 得到一个4~9的随机数

var num = Math.floor(Math.random() * 6) + 4;

// 创建一个图片

var item = loadImage("img/ball/" + num + ".png");

var x = breakWidth * j + j * 2;

var y = 30 * i + 30;


// 键值对(key-value)

// {"item":item, "x":x, "y":y}


// 如果是绿色的方块,让板变长

if(num == 9){

breakers.push({"item":item, "x":x, "y":y, "state":1});

}

else if(num == 4){

breakers.push({"item":item, "x":x, "y":y, "state":2});

}

else{

breakers.push({"item":item, "x":x, "y":y, "state":0});

}



}

}


}


// 绘制所有的方块

function updateBreakers(){

for (var i = 0; i < breakers.length; i++) {

context.drawImage(breakers[i].item, breakers[i].x, breakers[i].y, breakWidth, 30);

}

}


function loadAllImage(){

bg = loadImage("img/ball/bg.png");

ball = loadImage("img/ball/ball.png");

board = loadImage("img/ball/board.png");

// 创建方块

createBreakers();

}


// 加载单张图片

function loadImage(url){

var img = new Image();

img.src = url;

return img;

}

};


大家可以试试,具体的代码和资源见附件。


相关文章:

SLAM精度测评——EVO进阶

1. 基本概念 1.1 Umeyama算法 ATE&#xff1a; evo_ape tum state_groundtruth_estimate0/data.tum orb2/CameraTrajectory.txt -r trans_part -va --plot --plot_mode xy --save_results /home/sun/evo/v1_01_easy/orb2/ate.zip RPE&#xff1a; evo_rpe tum state_groun…

python读取图片并且显示

使用python-opencv读取图片&#xff0c;利用opencv或matplotlib显示图片。 # -*- coding: utf-8 -*-import numpy as np from matplotlib import pyplot as plt #import urllib import cv2def load_image1(file):# Load an color image in grayscaleimg cv2.imread(file,0)cv…

shiro认证

shiro权限认证&#xff1a; 具体的认证流程是这样的&#xff1a; 一般流程&#xff1a; 通过.ini的文件来初始化工厂&#xff0c;.ini的文件的好处是可以创建多个组&#xff0c;而.properties的文件只能创建一组。 系统默认有shiro.ini的文件&#xff0c;但是一般我们是自定义数…

小猿圈Linux基础面试题,看看你能答对几道?

最近身边的很多朋友都在学习linux&#xff0c;从最开始的安装软件都需要百度一天的他们&#xff0c;现在已经成长为了&#xff0c;不需要百度就可以把自己弄懵圈的了&#xff0c;接下来的几天小猿圈linux老师会为大家准备一些实用的linux技巧分析给大家&#xff0c;希望对你有所…

ORB-SLAM2 论文翻译

https://ug98gs7tbw.feishu.cn/docs/doccnKKOWAjkKv7AzAiEvbnM3Tf

mxnet教程1

import mxnet as mx #%matplotlib inline import os import subprocess import numpy as np import matplotlib.pyplot as plt import tarfileimport warnings warnings.filterwarnings("ignore", categoryDeprecationWarning)# 从内存中读取数据 def test1():data …

番外:Spring MVC环境搭建和Mybatis配置避坑篇

2019独角兽企业重金招聘Python工程师标准>>> web.xml引入对spring mvc的支持&#xff1b; spring-mvc配置spring-mvc&#xff1b; spring-mybatis配置mybatis支持&#xff0c;并指名mapper文件的位置&#xff1b; mybaits-config配置mybatis&#xff1b; jdbc.prope…

50个云终端只需一台服务器是怎么一回事

看到这个标题也许有人会说50个云终端只需要一台服务器这应该是不可能的吧&#xff0c;即使是真的那这个服务器的配置和价格应该也要非常高的吧。但是如果有人和你说50个云终端只需要一台中等配置和价格的服务器就可以的呢。而且这50个用户桌面都可以正常的使用不会出现卡顿等现…

SLAM学习,小白入门到殿堂级大牛资料整理

总结一下我接触过的SLAM算法吧,主要集中在visual slam: 特征法: ORB SLAM https://github.com/raulmur/ORB_SLAM2优势: 在静态环境下定位准确,稳定, 单目和双目版本都可以达到实时(高于10frames/s)。代码可读性强,易扩展, 网上也有实现和imu融合的版本。 劣势:建的地图…

python解析json

“data.json”文件内容如下&#xff1a; {"id":"1220562","alt":"http:\/\/book.douban.com\/book\/1220562","rating":{"max":10, "average":"7.0", "numRaters":282, "min…

8.改进应用程序

2019独角兽企业重金招聘Python工程师标准>>> ##8.1数字格式设置&#xff08;storyboard&#xff09; ##8.1.2可选类型拆封 import Cocoa extension Double{var dollars : String{let formatter : NumberFormatter NumberFormatter()//NSNumberFormatter弃用var re…

小猿圈Linux学习-Linux种搜索的命令

做Linux工程师的每天都不能少的工作就是搜索文件&#xff0c;这是他们的日常活动&#xff0c;很繁琐很枯燥&#xff0c;所以我们就需要知道一些搜索的命令&#xff0c;这些命令更高效更快捷&#xff0c;今天小猿圈就给大家分享4个可以搜索的Linux命令。。 方法 1&#xff1a;使…

SURF与SIFT比较分析

opencv3.2 SURF实现特征点匹配 opencv3.2中SurfFeatureDetector、SurfDescriptorExtractor、BruteForceMatcher这三个的使用方法已经和原先2.4版本前不一样了。 使用方法示例如下&#xff1a; Ptr<SURF> detector SURF::create(minHessian);detector->detect(img_1…

python文件和目录

# -*- coding: utf-8 -*-import osdef printFile(rootDir):allFiles os.listdir(rootDir) #列出文件夹下所有文件和目录for i in range(0, len(allFiles)):# print(rootDir allFiles[i])path os.path.join(rootDir, allFiles[i])if not os.path.isfile(path):print(path, &q…

你不怕他离职吗?

图片来自“wikiart” 这是我同事在晚上11点多跟我聊微信时问起的一个问题&#xff0c;我觉得这个问题还是挺有代表性的&#xff0c;所以我还是决定就这个问题展开聊聊我对这句话的看法。 我同事之所以这么说&#xff0c;是因为他的组员&#xff0c;也就是问题中的那个他&#x…

tensorflow 1

import tensorflow as tf import numpy as np import matplotlib.pylab as pltdef tfDemo1():#create datax_data np.random.rand(100).astype(np.float32)y_data x_data * 0.1 0.3#create tensorflow structureWeightstf.Variable(tf.random_uniform([1],-1.0,1.0)) #一维&…

SLAM资源整理

资源整理 浙大3D Group VINS orbslam2 orbslam2 video study https://www.bilibili.com/video/BV1bK4y197kB/?spm_id_fromautoNext orbslam2 csdn https://blog.csdn.net/ncepu_chen/category_9874746.html https://www.zhihu.com/column/c_1114864226103037952 https:…

Golang微服务开发实践

github: github.com/yun-mu/Micr… 微服务概念学习&#xff1a;可参考 Nginx 的微服务文章 微服务最佳实践&#xff1a;可参考 微服务最佳实践 demo 简介 服务&#xff1a; consignment-service&#xff08;货运服务&#xff09;user-service&#xff08;用户服务&#xff09;l…

Linux ssh/scp/docker学习

文章目录Linux ssh/scp/docker使用学习1. ssh 登录2. scp传输文件3. docker4. git checkout 替换指定分支的单个文件Linux ssh/scp/docker使用学习 1. ssh 登录 sudo ssh fireflyip (登录账号密码) scp -r company/data_depthfill/ firefly192.168.105.6:/tmp/ ​​​​ 2…

tensorflow mnist 1

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import keras.backend.tensorflow_backend as KTFdef add_layer(inputs,in_size,out_size,activation_functionNone):#Weights是一个矩阵&#xff0c;[行&#xff0c;列]为[in_size,out_s…

framework7使用笔记

2019独角兽企业重金招聘Python工程师标准>>> myApp.addView(.view-main, {}); 以上这句代码一定要添加 &#xff0c;否则链接的页面不能正常加载 --------------------------------------------- 如果初始化时定义了preprocess&#xff0c;则页面上链接的自动加载将…

Linux:检查当前运行级别的五种方法

2019独角兽企业重金招聘Python工程师标准>>> 运行级就是Linux操作系统当前正在运行的功能级别。存在七个运行级别&#xff0c;编号从0到6。系统可以引导到任何给定的运行级别。运行级别由数字标识。每个运行级别指定不同的系统配置&#xff0c;并允许访问不同的进程…

概率机器人资料整理

机器人算法仿真 https://atsushisakai.github.io/PythonRobotics/ 最大熵对应的概率分布及其优化推导 https://www.cnblogs.com/yychi/p/9401807.html 矩阵计算网址 http://www.yunsuan.info/matrixcomputations/index.html

LLVM官方文档翻译---- LLVM原子指令与并发指引

英文原文地址&#xff1a;http://llvm.org/docs/Atomics.html 译文原文地址&#xff1a;http://blog.csdn.net/wuhui_gdnt/article/details/52485591 注&#xff1a;该文章转载已经得到译者授权。 --------------------------------------------------------------------------…

matplotlib画图

import matplotlib.pyplot as plt import numpy as npdef test1():# 从[-1,1]中等距去50个数作为x的取值x np.linspace(-1, 1, 50)print(x)y 2*x 1y1 2**x 1# 第一个是横坐标的值&#xff0c;第二个是纵坐标的值plt.plot(x, y)plt.plot(x, y1)# 必要方法&#xff0c;用于将…

学习新对象字面量语法

目标 使用简写属性名称使用简写方法名称使用计算属性名称问题 哪些部分是冗余的? const person{name:name,address:address,sayHello:function(){/*......*/},sayName:function(){/*......*/}sayAddress:function(){/*......*/}} 复制代码简写属性名称 //ES5 const message{te…

ORB-SLAM2代码/流程详解

ORB-SLAM2代码详解 文章目录ORB-SLAM2代码详解1. ORB-SLAM2代码详解01_ORB-SLAM2代码运行流程1 运行官方Demo1.2. 阅读代码之前你应该知道的事情1.2.1 变量命名规则1.3 理解多线程1.3.1 为什么要使用多线程?1.3.2 多线程中的锁1.4 SLAM主类System1.4.1 System类是ORB-SLAM2系统…

VS2010 CUDA 5.5 Win7 64位配置以及项目创建配置

一.安装CUDA5.5以及配置VS助手 1、安装之前必须确认自己电脑的GPU支持CUDA。在设备管理器中找到显示适配器&#xff08;Display adapters)&#xff0c;找到自己电脑的显卡型号&#xff0c;如果包含在http://www.nvidia.com/object/cuda_gpus.html的列表中&#xff0c;说明支持…

HTC VIVE SDK 中的例子 hellovr_opengl 程序流程分析

最近Vive的VR头盔设备很火&#xff0c;恰逢项目需求&#xff0c;所以对 SDK 中的例子 hellovr_opengl 做了比较细致的代码分析&#xff0c;先将流程图绘制如下&#xff0c;便于大家理解。 在ViVe头盔中实现立体效果的技术核心&#xff1a; 如果要外挂Vive的VR设备实现立体效果&…

Proximal Algorithms 4 Algorithms

目录 Proximal minimization解释\(f(x) g(x)\)解释1 最大最小算法不动点解释Forward-backward 迭代解释加速 proximal gradient method交替方向方法 ADMM解释1 自动控制解释2 Augmented Largranians解释3 Flow interpretation解释4 不动点特别的情况 \(f(x) g(Ax)\)Proximal …