国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

怎樣用JS編寫模擬器

來源:懂視網 責編:小采 時間:2020-11-27 20:01:24
文檔

怎樣用JS編寫模擬器

怎樣用JS編寫模擬器:這次給大家?guī)碓鯓佑肑S編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。0x00 CHIP8簡介我們根據(jù)CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的
推薦度:
導讀怎樣用JS編寫模擬器:這次給大家?guī)碓鯓佑肑S編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。0x00 CHIP8簡介我們根據(jù)CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的

這次給大家?guī)碓鯓佑肑S編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。

0x00 CHIP8簡介

我們根據(jù)CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的出現(xiàn)讓電子游戲編程變得簡單些了(相對于那個年代來說)。用CHIP8實現(xiàn)的電子游戲有,比如小蜜蜂,俄羅斯方塊,吃豆人等。更多可以前往CHIP8的Wiki了解。

0x01 創(chuàng)建CHIP8對象

我們假設CHIP8是由處理器、鍵盤、顯示屏與揚聲器組成,其中CPU是CHIP8核心,那么代碼應該像這樣的:

<!DOCTYPE html><html><head> 
 <title>創(chuàng)建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 編寫簡單的顯示屏

根據(jù)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 () {//自定義實現(xiàn)顯示渲染
 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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

怎樣用JS編寫模擬器

怎樣用JS編寫模擬器:這次給大家?guī)碓鯓佑肑S編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。0x00 CHIP8簡介我們根據(jù)CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的
推薦度:
標簽: 使用 如何 js
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 看全色黄大色黄女片爽毛片 | 中文字幕日韩有码 | 久国产精品视频 | 欧美第五页 | 精品在线网站 | 亚洲欧美日韩在线观看 | 国产99在线播放 | 91中文| 国产精品日韩欧美一区二区三区 | 欧美在线视频一区二区 | 人与鲁牲交持级毛片 | 欧美伊人久久大香线蕉综合69 | 国产精品视频一区二区噜噜 | 欧美日韩中字 | 国产网站免费观看 | 日本伊人久久 | 久久91精品国产91久久 | 日韩黄色网址 | 国产精品久久久久久久毛片 | 国产精品亚洲精品日韩动图 | 久久久久久久国产精品 | 国产欧美日韩精品在钱 | 亚洲精品在线免费观看 | 91日韩欧美| 日本不卡视频一区二区三区 | 亚洲第七页 | 色老头久久久久久久久久 | 国产精品一区二区久久 | 高清在线一区二区 | 香蕉一区二区 | 香蕉乱码成人久久天堂爱免费 | 国产一页 | 欧美 亚洲 另类 热图 | 国产精品久久久久一区二区 | 欧美日韩国产一区二区三区在线观看 | 欧美国产综合 | 97热久久免费频精品99国产成人 | 91色老99久久九九爱精品 | 国产精品网站在线进入 | 亚洲综合在线视频 | 欧美阿v高清资源在线 |