Jsnes

bfirsh bfirsh
Dépôt créer le : 30/06/2009
Forks: 849 Watcher: 0 6338
Choisir une liste...
FR

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

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?!")

Contributeurs GitHub

dependabot[bot]
dependabot[bot]
8 contributions
dependabot-preview[bot]
dependabot-preview[bot]
633 contributions
bfirsh
bfirsh
441 contributions
dependabot-support
dependabot-support
100 contributions
ds17f
ds17f
16 contributions
claude
claude
15 contributions
ezrayoung
ezrayoung
8 contributions
allie
allie
7 contributions
BenShelton
BenShelton
4 contributions
workhorsy
workhorsy
4 contributions
arielscarpinelli
arielscarpinelli
3 contributions
domsleee
domsleee
3 contributions
malignantz
malignantz
3 contributions
Glinkis
Glinkis
3 contributions
jancborchardt
jancborchardt
2 contributions
gutomaia
gutomaia
2 contributions
isharacomix
isharacomix
2 contributions
ZhaoTonggang
ZhaoTonggang
1 contributions
yasaricli
yasaricli
1 contributions
slembcke
slembcke
1 contributions
pubby
pubby
1 contributions
ninjadynamics
ninjadynamics
1 contributions
kira1928
kira1928
1 contributions
ecin
ecin
1 contributions
nosrevi
nosrevi
1 contributions
b4rtaz
b4rtaz
1 contributions
minimi
minimi
1 contributions
shicks
shicks
1 contributions
rcopera
rcopera
1 contributions
PXblast
PXblast
1 contributions