问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

桌游模拟器怎么写脚本

发布网友 发布时间:2022-05-15 08:14

我来回答

2个回答

懂视网 时间:2022-05-15 12:36

这次给大家带来怎样用JS编写模拟器,用JS编写模拟器的注意事项有哪些,下面就是实战案例,一起来看一下。

0x00 CHIP8简介

我们根据CHIP8的Wiki可以了解到CHIP8是一种解释性的编程语言。最初被应用是在1970年代中期。CHIP8的程序运行在CHIP8虚拟机中,它的出现让电子游戏编程变得简单些了(相对于那个年代来说)。用CHIP8实现的电子游戏有,比如小蜜蜂,俄罗斯方块,吃豆人等。更多可以前往CHIP8的Wiki了解。

0x01 创建CHIP8对象

我们假设CHIP8是由处理器、键盘、显示屏与扬声器组成,其中CPU是CHIP8核心,那么代码应该像这样的:

<!DOCTYPE html><html><head> 
 <title>创建Chip8对象</title></head><body> 
 <script>
 (function () {  function CPU() {/*...*/ };  function Screen() {/*...*/ };  function Keyboard() {/*...*/ };  function Speaker(){/*...*/ };  window.CHIP8 = function () {  var c8 = new CPU();
  c8.screen = new Screen();
  c8.speaker = new Speaker();
  c8.input = new Keyboard();  return c8;
  };
 })(); </script></body></html>

0x02 编写简单的显示屏

根据CHIP8的Wiki可以了解到,CHIP8显示分辨率是64X32的像素,并且是单色的。某像素点为1则屏幕上显示相应像素点,为0则不显示。但某个像素点由有到无则进位标识被设置为1,可以用来进行冲撞检测。
那么代码应该像这样:

function Screen() { this.rows = 32;//32行
 this.columns = 64;//64列
 this.resolution = this.rows * this.columns;//分辨率
 this.bitMap = new Array(this.resolution);//像素点阵
 this.clear = function () { this.bitMap = new Array(this.resolution);
 } this.render = function () { };//显示渲染
 this.setPixel = function (x, y) {//在屏幕坐标(x,y)进行计算与显示
 // 显示溢出处理
 if (x > this.columns - 1) while (x > this.columns - 1) x -= this.columns; if (x < 0) while (x < 0) x += this.columns; if (y > this.rows - 1) while (y > this.rows - 1) y -= this.rows; if (y < 0) while (y < 0) y += this.rows; //获取点阵索引
 var location = x + (y * this.columns); //反向显示,假设二值颜色黑白分别用1、0代表,那么值为1那么就将值设置成0,同理0的话变成1
 this.bitMap[location] = this.bitMap[location] ^ 1; return !this.bitMap[location];
 }
};

编写好显示模块我们编写显示屏来测试显示模块(在线查看屏幕测试):

var chip8 = CHIP8();
chip8.screen.render = function () {//自定义实现显示渲染
 var boxs = document.getElementById("boxs");
 boxs.innerHTML = ""; for (var i of this.bitMap) { var d = document.createElement("span");
 d.style = "width: 5px;height: 5px;float: left;";
 d.style.backgroundColor = i ? "#000" : "#fff";
 boxs.appendChild(d);
 }
};/** 测试 **/chip8.screen.setPixel(2, 2);//设置x,y坐标像素chip8.screen.render();
chip8.screen.setPixel(2, 2);//设置x,y坐标像素

0x03 编写扬声器

这里需要参考 Web APIs:

API https://developer.mozilla.org/en-US/docs/Web/API/AudioContext
API https://developer.mozilla.org/en-US/docs/Web/API/OscillatorNode

示例 https://mdn.github.io/violent-theremin/

示例 https://codepen.io/gregh/pen/LxJEaj

扬声器也十分简单:

function Speaker() { var contextClass = (window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.oAudioContext || window.msAudioContext)
 , context
 , oscillator
 , gain; 
 if (contextClass) {
 context = new contextClass();
 gain = context.createGain();
 gain.connect(context.destination);
 } 
 //播放声音
 this.play = function (frequency) { //API https://developer.mozilla.org/en-US/docs/Web/API/OscillatorNode
 //示例 https://mdn.github.io/violent-theremin/
 if (context && !oscillator) {
  oscillator = context.createOscillator();
  oscillator.frequency.value = frequency || 440;//声音频率 
  oscillator.type = oscillator.TRIANGLE;//波形这里用的是三角波 查看示例:https://codepen.io/gregh/pen/LxJEaj
  oscillator.connect(gain);
  oscillator.start(0);
 }
 } 
 //停止播放
 this.clear = this.stop = function () { if (oscillator) {
  oscillator.stop(0);
  oscillator.disconnect(0);
  oscillator = null;
 }
 }
};

编写好扬声器我们可以对扬声器进行测试(在线查看扬声器测试):

<!DOCTYPE html><html><head> 
 <title>编写扬声器</title></head><body>
 频率: <input type="range" id="frequency" value="440" min="100" max="1000">
 <label id="showfv">(440)</label>
 <button id="play_btn">播放</button>
 <script>
 (function () {  function CPU() {/*...*/ };  function Screen() {/*...*/ };//略...
  function Keyboard() {/*...*/ };  function Speaker() {/*...*/};//略...
  window.CHIP8 = function () {  var c8 = new CPU();
  c8.screen = new Screen();
  c8.speaker = new Speaker();
  c8.input = new Keyboard();  return c8;
  };
 })(); var chip8 = CHIP8(); //=======
 var f = document.getElementById("frequency"); var isPlay = false; var play_btn = document.getElementById("play_btn");
 f.onchange = function () {  var v = Number(this.value);  document.getElementById("showfv").innerHTML = "(" + v + ")";  if (isPlay) {
  chip8.speaker.stop();
  chip8.speaker.play(v);
  }
 };
 play_btn.onclick = function () {
  isPlay = !isPlay;  this.innerHTML = isPlay ? '停止' : '播放';  if (!isPlay) chip8.speaker.stop();  else chip8.speaker.play(f.value);
 }; </script></body></html>

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

相关阅读:

ES6的字符串模板详解

ES6的变量的作用域与声明详解

怎样利用插件工具将ES6的代码转化成ES5

热心网友 时间:2022-05-15 09:44

用按键精灵配合模拟器。
如果是做游戏脚本用按键精灵配合模拟器一般通过找色找图有时候会用到找文字的也有。像这类tc群控加js脚本群控可以同步控制手机脚本可以自动去执行我们需要的操作比如发送话术什么的。这种写法一般是控件点击无视分辨率。也是很多引流工作室在用。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长沙到西昌。坐火车先从长沙到成都、成都东,再到西昌,哪个方便一些 S先生与P先生谜题的题面 为什么首都设在襄阳 改姓可以不随父母性吗 韩艺瑟怎么改姓? 纸、墨、笔、砚是中国传统的文房四宝,墨的使用最早在 [ ] A.商代后期... 想问下创维光伏E企赢模式有哪些优势,到底值不值得投资啊?有没有合作... 太平洋太享e保百万医疗值得入手吗?每年花多少钱? 爱e满分适合哪些人买?注意哪些问题? 太平洋太享e保百万医疗适合哪些人买?价格多少? 刚买的oppoa53手机怎么老是黑屏 刚买的oppoa53看电视老是黑屏黑屏时间是一秒,过一会又黑怎么回事 oppoa53手机怎么没有熄屏时间 oppoa53息屏显示时间 康赞臣阿胶红糖姜茶的怎么食用? 康赞臣阿胶红糖姜茶的食材是什么? 毕加索07年,30卖到40迈的时候车量晃动 什么情况? 糯米粉怎么做点心? 东风雪铁龙毕加索07年新版2.0的加满油多少升 用糯米粉怎样做糕点? 07年雪铁龙毕加索2.0怠速很抖,怎么维修 康赞臣阿胶红糖姜茶多少钱一盒? 稀有品种,雪铁龙萨拉毕加索一年记,感谢你的陪伴 07年的毕加索故障是加速传感器踏板信号一短路怎么查找 买来的AE LOGO模板能够修改LOG么? QQ音乐在QQ上不显示 别人看的我到的 我看到自己 跟别人的。 求解。 为什么手机上QQ空间下载的图片在手机里却找不到?谢谢了,大神帮忙啊 我看他的qq音乐,他那会显示我去看过吗? 用醋洗头,是白醋还是陈醋 我的QQ音乐被播放多次,能看是谁播放的吗? 车辆维护费和年检费应记在哪个科目(及其子科目) 汽车保养费计入哪个会计科目 汽车服务行业的补制回单费记入什么科目 汽车美容保养费记什么科目 会计科目中的汽车费用包括哪些? 汽车加油费和维修费记入什么会计科目 – 手机爱问 各位浪琴手表粉,这款是浪琴什么型号? 纠结中,想买款浪琴的手表,是浪琴嘉岚系列的好还是军旗系列好啊? 浪琴手表多少钱一个? 百度百科里的浪琴手表型号? 墨西哥7.4级地震,对当地造成了多大影响? 实拍威马汽车-威马EX5,20万级别纯电SUV! 威马汽车EX5的动力性能怎么样? 威马汽车EX5车身都有什么颜色? 威马汽车ex5最大功率和电池容量是多少? 威马汽车ex5的驱动方式和悬挂类型是什么? 威马E500电动汽车质量怎么样 威马ex5出厂牌在那里 威马W6,开起来和EX5的区别到底有多大? 威马汽车ex5的变速箱类型是什么?