使用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& ...
随机推荐
- php5.6安装Zend Opcache扩展
假设php5.6安装路径为/data2/php[root@nextcloud src]# pwd/usr/local/src[root@nextcloud src]# wget http://pecl ...
- [LeetCode] 307. Range Sum Query - Mutable 解题思路
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- c++ 中关于一些变量不能声明的问题
j0,j1,jn,y0,y1,yn被c++中某些函数占用了,所以是不能被声明的,今天就遇到了这个问题,结果我在自己写的程序中找了半天都没找到重复申明的y1
- 2016.3.24 OneZero站立会议
会议时间:2016.3.24 15:35-15:55 会议成员:王巍 夏一名 冉华 张敏 会议内容: 1.确立UI界面原形(见http://www.cnblogs.com/zhangminss/p/5 ...
- Linux环境C程序设计
Linux基础 常用shell命令 命令 说明 命令 说明 man 查看联机帮助 ls 查看目录及文件列表 cp 复制目录或文件 mv 移动目录或文件 cd 改变文件或目录 rm 删除文件或目录 mk ...
- 发布阶段 github和360移动助手及总结
经过一系列的冲刺和加工 最激动人心的无非在发布平台上公布上自己辛苦奋斗了一个周期的产品,这个时候的我们就像Iphone 6发布会上得CEO,为自己的产品完美画上了研发的句号. 接下来的日子就是准备ve ...
- socket.io框架
socket.io框架 一.问题背景 目前公司在互联网产品上需要程序与前端部分要进行一个实时交互,在进行一定程度上的选型后,决定使用socket.io框架进行一个实践,算是公司的一个新的 尝试,也算是 ...
- Flask-论坛开发-4-知识点补充
对Flask感兴趣的,可以看下这个视频教程:http://study.163.com/course/courseLearn.htm?courseId=1004091002 1. WTForms 表单使 ...
- [2017BUAA软工]个人项目
软工个人项目 一.Github项目地址 https://github.com/Lydia-yang/2017BUAA-SoftwareEngineering 二.解题思路 在刚开始拿到题目的时候,关于 ...
- Linux中gcc与g++编译器的区别
一.对于C文件 对于C文件gcc和g++所做的事情确实是一样的,g++在编译C文件时调用了gcc. 二.对于C++文件 1.预处理 预处理gcc与g++做了相同的事. 2.编译 gcc无法自动和c++ ...