<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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編寫模擬器:這次給大家帶來怎樣用JS編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰案例,一起來看一下。0x00 CHIP8簡介我們根據CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的
        推薦度:
        導讀怎樣用JS編寫模擬器:這次給大家帶來怎樣用JS編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰案例,一起來看一下。0x00 CHIP8簡介我們根據CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的

        這次給大家帶來怎樣用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

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

        文檔

        怎樣用JS編寫模擬器

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 成人毛片免费观看| 久久国产精品免费网站| 亚洲日韩AV一区二区三区四区| 222www免费视频| 最近2019中文字幕免费直播| 四虎在线免费播放| 亚洲高清免费视频| 免费精品人在线二线三线区别 | 日韩a级毛片免费视频| 国产一区二区三区在线免费观看 | 热99re久久精品精品免费| 久久成人国产精品免费软件| 人人公开免费超级碰碰碰视频| 亚洲高清资源在线观看| 2020国产精品亚洲综合网| 午夜在线免费视频 | 新最免费影视大全在线播放| 57pao国产成视频免费播放| 国产美女在线精品免费观看| 亚洲日韩久久综合中文字幕| 性做久久久久免费观看| 免费又黄又爽又猛大片午夜| 免费一区二区无码视频在线播放| 国产精品色拉拉免费看| 亚洲国产精品狼友中文久久久| 日韩精品一区二区亚洲AV观看| 亚洲黄色中文字幕| 成人浮力影院免费看| 亚洲精品国产第一综合99久久| 特黄特色的大片观看免费视频| 日韩亚洲国产高清免费视频| 好爽…又高潮了毛片免费看| 亚洲av色香蕉一区二区三区| 无人在线直播免费观看| 国产成人亚洲午夜电影| 国产精品综合专区中文字幕免费播放| 亚洲色欲色欲www| 国产一区视频在线免费观看| 在线观看特色大片免费网站| 99在线精品免费视频九九视| 亚洲AV无码1区2区久久|