Question

OK. Je suis Essense essayer de faire ma propre interprétation du matériel NES, donc je peux faire un jeu qui serait idéalement ressembler à ce que un jeu NES ressemblerait. Je suis actuellement coincé avec la façon d'ajuster comment dessiner la surface de jeu à la mémoire vidéo (back buffer).

backbuffer

Les NES avaient des restrictions à l'NameTable ou backbuffer. Pour mon exemple, le backbuffer est 256x240pixels grand, ou la taille d'un écran. Si je dessinais cela à la télévision, il remplirait parfaitement à l'écran. Maintenant, si je dessinais ce à l'écran avec un décalage de X = 5, l'image entière serait déplacé et s'enrouler autour de l'écran.

Par exemple .....

ORIGINAL, NO OFFSET:                      DRAWN WITH OFFSET OF X=5:
ABCDEFGHIJK                               GHIJKABCDEF

DRAWN WITH OFFSET OF X=-5:
FGHIJKABCDE

L'écran est divisé en carrés de 8x8 pixels chacun, soit un total 32x30 lignes et colonnes. (256x240 pixels). Le décalage est représenté en pixels - pas de colonnes; donc en théorie, je pouvais compenser l'écran de 5 pixels et chaque colonne serait déplacé vers la droite en cinq pixels.

NIVEAU DE CONCEPTION

Mes étapes sont constituées d'écrans, contenant des données qui sont représentées dans 16x15 lignes et de colonnes, chacune de 16x16 pixels. Ceci est d'imiter combien de jeux NES données de niveau stockées -. Chaque tuile contient les informations sur ce qui devrait être dans chaque bloc de 8x8

par exemple:.

AA
BC     with A,B,C,D representing what 8x8 graphic should go where

Concept du niveau est représenté par cela aussi, chaque numéro étant un écran différent et -. Rien qui signifie, null

-----
-123-
---4-
--54-
-----

Caractère POSITIONNEMENT C'est facile. Je sais déjà comment je peux déterminer quelle table, la ligne et la colonne mes personnages sont en fonction de leur positionnement absolu. Je peux également déterminer le positionnement relatif dans l'écran.

Avec cette information, je peux facilement comprendre les colonnes sont à gauche et à droite du caractère, le cas échéant (si le personnage est sur le côté gauche de l'écran 1, thered être pas de niveau plus gauche)

Voici est la question DUN DUN DUN Comment puis-je dessine mes niveaux à l'écran, de sorte qu'ils passer d'un à l'autre. Il serait relativement facile de dessiner un écran à la fois, et lorsque le personnage arrive au bord il suffit de retourner à un autre écran.

Cependant, le problème que je suis sur le plan conceptuel ayant est que je dois « flux » les données de niveau sur l'écran. Ce, permet de dire le personnage se déplace 24 pixels vers la droite. Le BG a besoin de se déplacer ainsi.

Alors, je dois régler le défilement de la backbuffer par 24 pixels. Cependant, le défilement tout seul provoque l'écran pour envelopper plus, diplsaying ancienne partie du niveau. Ainsi, pendant le défilement, je dois vous assurer d'attirer de nouveaux morceaux de niveau dans la mémoire tampon de retour. Mais avant que je puisse le faire, je dois déterminer quels carreaux doivent se laisser entraîner d'abord. Et si la personne passe 24 pixels à gauche, je dois redessiner des tuiles sur le backbuffer et modifier en conséquence le décalage ainsi.

Et ne l'oublions pas que si le personnage se déplace à droite et il n'y a pas de données plus niveau à tirer, il ne devrait pas être compensée mais le caractère se rapproche du côté de l'écran (au lieu d'être centré au milieu de la l'écran par l'intermédiaire de l'axe X).

En fait, je viens de beaucoup de différents nombres et les valeurs coincé dans mon esprit en ce moment - essayer d'envelopper la tête autour de nombreux concepts et ils ont causé mon cerveau de se transformer en goo. Quelqu'un at-il une perspective sur la façon dont je peux aborder ce sujet?

EDIT: En utilisant VB.Net. C # est applicable aussi bien (programme I dans les deux)

Était-ce utile?

La solution

La façon dont la NES était fait avec 4 tables de noms, chaque 256x240. Lorsque vous l'un de l'défile écran, celui adjacent se défilera sur. Pour obtenir « mondes » plus grand que 512x480, vous mettez à jour la table de noms aux positions qui sont Offscreen.

En général, une cartouche aurait un tableau géant dans la mémoire morte avec toutes les données de niveau, et permettrait de suivre la position générale par 1 ou 2 variables de mémoire vive. Puis, quand le jeu défilée, il mettra à jour les variables de RAM, les utiliser pour rechercher la table de données de niveau et copier les nouvelles données de niveau dans les parties de la table de noms qui étaient hors-champ.

Donc en fait votre tampon de retour doit être 512x480, et vous montrer qu'une partie de celui-ci 256x240.

Avez-vous regardé le démontage pour tous les jeux NES qui ont de grands mondes de défilement? Je pense qu'un démontage partiel de Metroid est là quelque part ...

... ouais, a trouvé quelques documents à romhacking.net

démontage Metroid ; pas vraiment bien commenté, mais avec un peu d'effort, il ne devrait pas être trop difficile à comprendre.

Un autre démontage qui est mieux commenté.

EDIT: Au 2ème démontage posté ci-dessus, consultez MetroidGameEnginePage.txt à la routine « de SetupRoom » et la routine « DrawRoom »; aussi la routine à l'étiquette montre de LEB4D comment la table de noms est mis à jour dans un cas. Regardez aussi les commentaires détaillés ci-dessus la routine « GetNameTable ». En général, une recherche de texte pour « table de noms » dans le document que vous obtiendrez beaucoup plus.

EDIT EDIT: Toujours à romhacking.net; la carte mémoire pour SMB pourrait être utile.

Autres conseils

Je mis en place une grille de contrôle d'image et de charger les niveaux à partir d'une base de données qui stocke ce que la colonne et de la ligne de chaque image par rapport au niveau. Une fois l'image qui représente le personnage du jeu devient assez loin à droite (vous auriez à stocker son emplacement dans certaines variables de niveau du module) de l'écran que vous chargez la colonne suivante d'images (tout en déplaçant toutes les autres images une à la gauche et retrait de la première colonne).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top