使用electron为贪吃蛇游戏创建全局快捷键

上图就是我们的简体版贪吃蛇游戏,我们可以看到使用键盘上面的上下左右可以对贪吃蛇进行控制。
The picture above is our simplified version of Snake Eating Game. We can see that the top
and bottom of the keyboard can control Snake Eating.
所用到的代码如下
The code used is as follows
//这个是对方向进行的控制
//This is direction control.
window.document.onkeydown = function(event) {
if (!allowPressKeys){
return null;
}
let keyCode;
if(!event)
{
keyCode = window.event.keyCode;
}
else
{
keyCode = event.keyCode;
}
switch(keyCode)
{
case 37:
if (direction !== 'right') {
moveLeft();
}
break;
case 38:
if (direction !== 'down'){
moveUp();
}
break;
case 39:
if (direction !== 'left'){
moveRight();
}
break;
case 40:
if (direction !== 'up'){
moveDown();
}
break;
default:
break;
}
};
app.css
body {
margin: 1em;
padding: 0;
background: #111;
color: white;
font-family: helvetica;
}
canvas {
border: solid 1px red;
width: 800px;
height: 400px;
}
#scoreboard {
padding-bottom: 1em;
}
#label, #score, #bar {
float: left;
padding: 8px;
}
#pause_menu, #restart_menu {
display: none;
}
app.js
'use strict';
let currentState;
let canvas, ctx, gridSize, currentPosition, snakeBody, snakeLength, direction, score, suggestedPoint, allowPressKeys, interval, choice;
function updateScore () {
score = (snakeLength - 3) * 10;
document.getElementById('score').innerText = score;
}
function hasPoint (element) {
return (element[0] === suggestedPoint[0] && element[1] === suggestedPoint[1]);
}
function makeFoodItem () {
suggestedPoint = [Math.floor(Math.random()*(canvas.width/gridSize))*gridSize, Math.floor(Math.random()*(canvas.height/gridSize))*gridSize];
if (snakeBody.some(hasPoint)) {
makeFoodItem();
} else {
ctx.fillStyle = 'rgb(10,100,0)';
ctx.fillRect(suggestedPoint[0], suggestedPoint[1], gridSize, gridSize);
}
}
function hasEatenItself (element) {
return (element[0] === currentPosition.x && element[1] === currentPosition.y);
}
function leftPosition(){
return currentPosition.x - gridSize;
}
function rightPosition(){
return currentPosition.x + gridSize;
}
function upPosition(){
return currentPosition.y - gridSize;
}
function downPosition(){
return currentPosition.y + gridSize;
}
function whichWayToGo (axisType) {
if (axisType === 'x') {
choice = (currentPosition.x > canvas.width / 2) ? moveLeft() : moveRight();
} else {
choice = (currentPosition.y > canvas.height / 2) ? moveUp() : moveDown();
}
}
function moveUp(){
if (upPosition() >= 0) {
executeMove('up', 'y', upPosition());
} else {
whichWayToGo('x');
}
}
function moveDown(){
if (downPosition() < canvas.height) {
executeMove('down', 'y', downPosition());
} else {
whichWayToGo('x');
}
}
function moveLeft(){
if (leftPosition() >= 0) {
executeMove('left', 'x', leftPosition());
} else {
whichWayToGo('y');
}
}
function moveRight(){
if (rightPosition() < canvas.width) {
executeMove('right', 'x', rightPosition());
} else {
whichWayToGo('y');
}
}
function executeMove(dirValue, axisType, axisValue) {
direction = dirValue;
currentPosition[axisType] = axisValue;
drawSnake();
}
function moveSnake(){
switch (direction) {
case 'up':
moveUp();
break;
case 'down':
moveDown();
break;
case 'left':
moveLeft();
break;
case 'right':
moveRight();
break;
}
}
function restart () {
document.getElementById('play_menu').style.display='block';
document.getElementById('pause_menu').style.display='none';
document.getElementById('restart_menu').style.display='none';
pause();
start();
}
function pause(){
document.getElementById('play_menu').style.display='none';
document.getElementById('pause_menu').style.display='block';
clearInterval(interval);
allowPressKeys = false;
}
function play(){
document.getElementById('play_menu').style.display='block';
document.getElementById('pause_menu').style.display='none';
interval = setInterval(moveSnake,100);
allowPressKeys = true;
}
function gameOver(){
pause();
window.alert('Game Over. Your score was ' + score);
ctx.clearRect(0,0, canvas.width, canvas.height);
document.getElementById('play_menu').style.display='none';
document.getElementById('restart_menu').style.display='block';
}
function drawSnake() {
if (snakeBody.some(hasEatenItself)) {
gameOver();
return false;
}
snakeBody.push([currentPosition.x, currentPosition.y]);
ctx.fillStyle = 'rgb(200,0,0)';
ctx.fillRect(currentPosition.x, currentPosition.y, gridSize, gridSize);
if (snakeBody.length > snakeLength) {
let itemToRemove = snakeBody.shift();
ctx.clearRect(itemToRemove[0], itemToRemove[1], gridSize, gridSize);
}
if (currentPosition.x === suggestedPoint[0] && currentPosition.y === suggestedPoint[1]) {
makeFoodItem();
snakeLength += 1;
updateScore();
}
}
window.document.onkeydown = function(event) {
if (!allowPressKeys){
return null;
}
let keyCode;
if(!event)
{
keyCode = window.event.keyCode;
}
else
{
keyCode = event.keyCode;
}
switch(keyCode)
{
case 37:
if (direction !== 'right') {
moveLeft();
}
break;
case 38:
if (direction !== 'down'){
moveUp();
}
break;
case 39:
if (direction !== 'left'){
moveRight();
}
break;
case 40:
if (direction !== 'up'){
moveDown();
}
break;
default:
break;
}
};
function start () {
ctx.clearRect(0,0, canvas.width, canvas.height);
currentPosition = {'x':50, 'y':50};
snakeBody = [];
snakeLength = 3;
updateScore();
makeFoodItem();
drawSnake();
direction = 'right';
play();
}
function initialize () {
canvas = document.querySelector('canvas');
ctx = canvas.getContext('2d');
gridSize = 10;
start();
}
function togglePauseState () {
if (currentState) {
if (currentState === 'play') {
pause();
currentState = 'pause';
} else {
play();
currentState = 'play';
}
} else {
pause();
currentState = 'play';
}
}
const ipcRenderer = require('electron').ipcRenderer;
function togglePauseState () {
if (currentState) {
if (currentState === 'play') {
pause();
currentState = 'pause';
} else {
play();
currentState = 'play';
}
} else {
pause();
currentState = 'play';
}
}
ipcRenderer.on('togglePauseState', togglePauseState);
window.onload = initialize;
<html>
<head>
<title>Snake</title>
<link href="app.css" rel="stylesheet" />
<script src="app.js"></script>
</head>
<body>
<div id="scoreboard">
<span id="label">Score:</span>
<span id="score"></span>
<div id="bar">
<div id="play_menu">
<button onclick="pause();">Pause</button>
</div>
<div id="pause_menu">
<button onclick="play();">Resume</button>
<button onclick="restart();">Restart</button>
</div>
<div id="restart_menu">
<button onclick="restart();">Restart</button>
</div>
</div>
</div>
</div>
<canvas></canvas>
</body>
</html>
main.js
'use strict';
const {app, globalShortcut, BrowserWindow} = require('electron');
let mainWindow = null;
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
app.on('ready', () => {
mainWindow = new BrowserWindow({
width: 840,
height: 470,
useContentSize: true
});
mainWindow.loadURL(`file://${__dirname}/index.html`);
mainWindow.on('closed', () => { mainWindow = null; });
const pauseKey = globalShortcut.register('CommandOrControl+P', () => {
mainWindow.webContents.send('togglePauseState');
});
if (!pauseKey) alert('You will not be able to pause the game from the keyboard');
});
app.on('will-quit', () => {
globalShortcut.unregister('CommandOrControl+P');
});
"name": "snake-electron",
"version": "1.0.0",
"description": "The Snake game, built with Electron for the book 'Cross Platform Desktop Applications'",
"main": "main.js",
"scripts": {
"start": "node_modules/.bin/electron .",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"electron",
"keyboard",
"shortcuts"
],
"author": "Paul Jensen ",
"license": "MIT",
"dependencies": {
"electron-prebuilt": "^1.2.5"
}
}
本文的例子学习自 >这本书
by要学的东西很多,我还差很远
使用electron为贪吃蛇游戏创建全局快捷键的更多相关文章
- 用OpenGL简单编写的一个最简单贪吃蛇游戏
刚学OpenGL的时候,写的一个最简单的贪吃蛇游戏代码 如下: //贪吃蛇游戏 #include<stdio.h> #include<stdlib.h> #include< ...
- 用Java开发贪吃蛇游戏
贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始 ...
- Qt 学习之路 2(34):贪吃蛇游戏(4)
Qt 学习之路 2(34):贪吃蛇游戏(4) 豆子 2012年12月30日 Qt 学习之路 2 73条评论 这将是我们这个稍大一些的示例程序的最后一部分.在本章中,我们将完成GameControlle ...
- Qt 学习之路 2(32):贪吃蛇游戏(2)
Qt 学习之路 2(32):贪吃蛇游戏(2) 豆子 2012年12月27日 Qt 学习之路 2 55条评论 下面我们继续上一章的内容.在上一章中,我们已经完成了地图的设计,当然是相当简单的.在我们的游 ...
- Qt 学习之路 2(31):贪吃蛇游戏(1)
Qt 学习之路 2(31):贪吃蛇游戏(1) 豆子 2012年12月18日 Qt 学习之路 2 41条评论 经过前面一段时间的学习,我们已经了解到有关 Qt 相当多的知识.现在,我们将把前面所讲过的知 ...
- Linux平台下贪吃蛇游戏的运行
1.参考资料说明: 这是一个在Linux系统下实现的简单的贪吃蛇游戏,同学找帮忙,我就直接在Red Hat中调试了一下,参考的是百度文库中"maosuhan"仁兄的文章,结合自己的 ...
- 一个原生JS实现的不太成熟的贪吃蛇游戏
一个初初初初级前端民工 主要是记录一下写过的东西,复习用 大佬们如果看到代码哪里不符合规范,或者有更好写法的,欢迎各位批评指正 十分感谢 实现一个贪吃蛇游戏需要几步? 1.有地图 2.有蛇 3.有食物 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
随机推荐
- GlusterFS分布式存储集群部署记录-相关补充
接着上一篇Centos7下GlusterFS分布式存储集群环境部署记录文档,继续做一些补充记录,希望能加深对GlusterFS存储操作的理解和熟悉度. ======================== ...
- js 时间戳转换为日期格式
//将1525854409000类型的时间转换成“yyyy-MM-dd”或“yyyy-MM-dd hh:mm:ss” //info.birthday是后台获取到的Date类型的出生日期数据, / ...
- [BUAA-SE-2018]结对作业测试报告
目录 1. 测试方式 2. 评分规则 2.1 测试点组成 2.2 性能测试的分级 2.3 重新提交的扣分策略 3. 评测结果 3.1 罗老师班 3.2 任老师班 3.3 表中数据的说明 4. 测试点下 ...
- ELF文件格式分析
一般的 ELF 文件包括三个索引表:ELF header,Program header table,Section header table. 1)ELF header:在文件的开始,保存了路 ...
- 同步手绘板——android端下笔后颜色变化
实现效果 : 在设计之初我们以为是改变笔线条的粗细来实现类似效果,后来通过找其他相关软件比对发现是不改变线条的粗细,通过改变透明度实现下笔后颜色的渐变,虽然已实现,但渐变效果很一般,不流畅,算法还待优 ...
- 实验1--用C语言编程四则运算
#include<stdio.h>#include<stdlib.h>#include <time.h>#define N 30main(){int a,b,k,i ...
- [BUAA_SE_2017]个人项目-Sudoku
个人项目作业-数独 Github项目地址 时间预估 PSP2.1 Personal Software Process Stages 预估时间(分钟) 实际耗时(分钟) Planning 计划 60 · ...
- HDU 2053 Switch Game
http://acm.hdu.edu.cn/showproblem.php?pid=2053 Problem Description There are many lamps in a line. A ...
- Ehcache配置参数示例
从Ehcache的jar包里抽取的 <!-- ~ Licensed to the Apache Software Foundation (ASF) under one ~ or more con ...
- Test Scenarios for Excel Export functionality
1 File should get exported in proper file extension2 File name for the exported excel file should be ...