Jsnes
Un émulateur JavaScript NES. C'est une bibliothèque qui fonctionne à la fois dans le navigateur et Node.js. Pour Node.js ou Webpack: $ npm installer jsnes Dans...
Choisir une liste...
JSNES
Un émulateur JavaScript NES.
C'est une bibliothèque qui fonctionne à la fois dans le navigateur et Node.js.
Installation
Pour Node.js ou Webpack:
$ npm install jsnes
Dans le navigateur, vous pouvez utiliserunpkg:
<script type="text/javascript" src="https://unpkg.com/jsnes/dist/jsnes.min.js"></script>
Utilisation
Navigateur
La façon la plus facile d'utiliser JSNES dans une page Web est avecjsnes.Browser. Il gère automatiquement le rendu de toile, l'audio, l'entrée du clavier, l'entrée du gamepad et le timing du cadre.
<div id="nes" style="width: 512px; height: 480px"></div>
<script src="https://unpkg.com/jsnes/dist/jsnes.min.js"></script>
<script>
var browser = new jsnes.Browser({
container: document.getElementById("nes"),
onError: function (e) {
console.error(e);
},
});
jsnes.Browser.loadROMFromURL("my-rom.nes", function (err, data) {
if (err) {
console.error(err);
return;
}
browser.loadROM(data);
});
</script>
Si vous avez déjà des données ROM en tant que chaîne ou tableau d'octets, vous pouvez les passer directement :
var browser = new jsnes.Browser({
container: document.getElementById("nes"),
romData: romData,
});
VoirKeyboard Controlsci-dessous pour les liaisons par défaut. Les jeux sont également pris en charge automatiquement.
Réagir
import { Browser } from "jsnes";
function Emulator({ romData }) {
const containerRef = useRef(null);
const browserRef = useRef(null);
useEffect(() => {
browserRef.current = new Browser({
container: containerRef.current,
romData: romData,
});
return () => browserRef.current.destroy();
}, [romData]);
return <div ref={containerRef} />;
}
Un frontend React complet est disponible dans leweb/répertoire de ce dépôt.
Node.js / intégration personnalisée
Si vous avez besoin d'un contrôle de niveau inférieur (réalisation personnalisée, manipulation audio ou exécution dans Node.js), utilisez leNESclasse directement:
// Initialize and set up outputs
var nes = new jsnes.NES({
onFrame: function(frameBuffer) {
// ... write frameBuffer to screen
},
onAudioSample: function(left, right) {
// ... play audio sample
}
});
// Read ROM data from disk (using Node.js APIs, for the sake of this example)
const fs = require('fs');
var romData = fs.readFileSync('path/to/rom.nes', {encoding: 'binary'});
// Load ROM data as a string or byte array
nes.loadROM(romData);
// Run frames at 60 fps, or as fast as you can.
// You are responsible for reliable timing as best you can on your platform.
nes.frame();
nes.frame();
// ...
// Hook up whatever input device you have to the controller.
nes.buttonDown(1, jsnes.Controller.BUTTON_A);
nes.frame();
nes.buttonUp(1, jsnes.Controller.BUTTON_A);
nes.frame();
// ...
Un exemple complet d'intégration est dans leexample/répertoire.
Référence API
NES
var nes = new jsnes.NES(options);
Options:
Option Type Description
- C'est quoi ?
AutresonFrameAutresfunction(frameBuffer)Appelé à la fin de chaque cadre avec un tampon 256×240 pixels (Int32Array des valeurs ARGB). Autres
AutresonAudioSampleAutresfunction(left, right)Appelé pour chaque échantillon audio avec des valeurs de canal gauche/droit (-1.0 à 1.0).
AutresonStatusUpdateAutresfunction(status)Appelé avec des messages d'état (par exemple « Prêt à charger un ROM. »). Autres
AutresonBatteryRamWriteAutresfunction(address, value)Appelé lorsque SRAM est écrit. Utilisez ceci pour conserver les données. Autres
AutresemulateSoundAutresbooleanActiver/désactiver l'émulation audio. Par défaut & #160;:true..
AutressampleRateAutresnumberTaux d'échantillonnage audio en Hz48000..
AutrespreferredFrameRateAutresnumberTaux de cadre cible. Par défaut & #160;:60.
Méthodes:
Description de la méthode
C'est pas vrai.
Autresnes.loadROM(data)Charger un ROM à partir d'une chaîne, d'Uint8Array ou d'ArrayBuffer.
Autresnes.frame()Exécuter un cadre d'émulation. Appelez ça à 60 fps.
Autresnes.buttonDown(player, button)Appuyez sur un bouton.playerest1ou2..
Autresnes.buttonUp(player, button)Libérez un bouton.
Autresnes.reset()Réinitialisez l'émulateur (comme en appuyant sur le bouton de réinitialisation du NES). Autres
Autresnes.reloadROM()Rechargez le ROM actuel à partir de zéro.
Autresnes.getFPS()Obtenez le nombre d'images par seconde actuel.
Autresnes.setFramerate(rate)Changer le taux d'image cible.
Autresnes.toJSON()Sérialiser l'état de l'émulateur (pour les états de sauvegarde).
Autresnes.fromJSON(data)Restaurer l'état d'émulateur d'un précédenttoJSON()appelez.
autresnes.zapperMove(x, y)Déplacez le pistolet léger Zapper aux coordonnées données du pixel.
Autresnes.zapperFireDown()Lancez la gâchette Zapper.
Autresnes.zapperFireUp()Libérez la gâchette Zapper
Constantes du bouton(lejsnes.Controller) :
BUTTON_A,BUTTON_B,BUTTON_SELECT,BUTTON_START,BUTTON_UP,BUTTON_DOWN,BUTTON_LEFT,BUTTON_RIGHT,BUTTON_TURBO_A,BUTTON_TURBO_B
Browser
var browser = new jsnes.Browser(options);
Options:
Option Type Description
- C'est quoi ?
AutrescontainerAutresHTMLElementAutresRequis.L'élément DOM à rendre dans.
AutresromDataAutresstringROM données à charger immédiatement. Si omis, appelezloadROM()plus tard.
autresonErrorAutresfunction(error)Appelé lorsque l'émulateur rencontre une erreur lors de l'exécution du cadre.
AutresonBatteryRamWriteAutresfunction(address, value)Appelé lorsque le SRAM soutenu par batterie est écrit
Méthodes:
Description de la méthode
C'est pas vrai.
Autresbrowser.start()Commence l'émulation. Appelé automatiquement siromDataa été fourni.
autresbrowser.stop()Une émulation de la pause.
Autresbrowser.loadROM(data)Chargez un nouveau ROM et commencez l'émulation.
Autresbrowser.fitInParent()Repositionner la toile pour remplir son contenant.
Autresbrowser.screenshot()Retourne unHTMLImageElementdu cadre actuel.
autresbrowser.destroy()Nettoyage complet: arrêter l'émulation, supprimer les auditeurs, enlever la toile. Autres
AutresBrowser.loadROMFromURL(url, callback)Méthode statique. Saisissez les données ROM d'une URL. Le rappel est(error, data).
Propriétés & #160;:
Description des biens
C'est quoi ?
Autresbrowser.nesLe sous-jacentNESinstance.
autresbrowser.keyboardLesKeyboardControllerpour remappage des clés.
autresbrowser.gamepadLesGamepadControllerpour remappage des boutons du gamepad
Contrôles clavier
Lorsque vous utilisezjsnes.Browser, les fixations suivantes du clavier sont configurées par défaut :
Button de joueur de joueur de joueur de joueur C'est quoi, ça ? En haut / en bas / à gauche / à droite Numéro de téléphone Z (ou Y) Turbo A.S. — Turbo B- Démarrage en entrée numpad Sélectionner Ctrl de droite Numpad 3
Turbo A et Turbo B se comportent comme A et B mais le feu automatique se répète pendant que la clé est retenue.
Les fixations clés peuvent être personnalisées à l'exécution via lebrowser.keyboardpropriété. UtilisationsetKeys()fournir une cartographie personnalisée (persistant à localStorage) etloadKeys()pour le recharger :
// Get the current key map
var keys = browser.keyboard.keys;
// Remap Player 1 A button to the J key (keyCode 74)
keys[74] = [1, jsnes.Controller.BUTTON_A, "J"];
browser.keyboard.setKeys(keys);
Construire
Pour construire une distribution :
$ npm run build
Cela créeradist/jsnes.min.js.
Essais de marche
$ npm test
Code de présentation
Tous les codes doivent être conformesPrettierformatage. La suite de test ne passera que si elle le fait.
Pour formater automatiquement tout votre code, lancez :
$ npm run format
Projets connexes
- NEStation- NES multijoueur sur Internet !
Je vous remercie
JSNES est basé surJames Sanders' vNES, et doit beaucoup à elle. Ça n'aurait pas eu lieu sansMatt Wescott's JSSpeccy, qui a suscité l'idée originale. (Ben, vers 2008: "Hmm, je me demande quoi d'autre pourrait fonctionner dans un navigateur?!")