Question

Je me demande comment le NES affiche son muscle graphique. Je l'ai fait des recherches en ligne et des trucs lu, mais je me demande une dernière chose:. Nametables

En fait, de ce que j'ai lu, chaque bloc de 8x8 dans un des points NES NameTable à un emplacement dans la table de motif, qui détient la mémoire graphique. En outre, le NameTable dispose également d'une table d'attribut qui définit une certaine palette de couleurs pour chaque bloc de 16x16. Ils sont liés tous ensemble comme ceci:

(en supposant que 16 blocs 8x8) NameTable, avec A B C D = pointeurs vers sprite données:

ABBB
CDCC
DDDD
DDDD

Attribut table, avec 1 2 3 = pointeurs vers des données de palette de couleurs, avec

1<2<
^'^'
3<3<
^'^'

Ainsi, dans l'exemple ci-dessus, les blocs seraient colorés comme si

1A 1B 2B 2B

1C 1D 2C 2C

3D 3D 3D 3D

3D 3D 3D 3D

Maintenant, si j'ai sur un écran fixe - il fonctionne très bien! Parce que la résolution NES est 256x240 pixels. Maintenant, comment ces tables sont ajustées pour le défilement?

Parce que NameTable 0 peut faire défiler dans NameTable 1, et si vous continuez à faire défiler NameTable 0 enveloppera à nouveau autour. Que je reçois. Mais ce que je ne comprends pas comment faire défiler la table d'attributs s'enroule autour aussi bien. D'après ce que j'ai lu en ligne, les blocs de 16x16 il assigne des attributs pour provoquera une distorsion des couleurs sur les carreaux de bord de l'écran (comme on le voit lorsque vous faites défiler de gauche à droite et vice-versa SMB3).

Ce qui me préoccupe est que je comprends comment faire défiler les nametables, mais comment faire défiler-vous la table d'attributs? Pour intsance, si j'ai un bloc vert sur le côté gauche de l'écran, déplacement de l'écran à droite devrait en théorie provoquer les tuiles au droit d'être vert et jusqu'à ce qu'ils se déplacer plus en cadre, auquel ils reviennent à leurs couleurs normales.

~~~~ EDIT: Je tiens à signaler que je sais sur le scanlines, X et Y. Cette pensée juste couru dans mon esprit.

Disons que je suis à 10. Y scanline Cela signifie que je lis 10 valeurs dans mes nametables, à l'horizontale. Cela signifierait que ma première colonne est hors de l'écran, car il n'a une largeur de pixel de 8. Cependant, l'attribut de couleur reste, car il a une largeur de 16.

En supposant que l'attribut de couleur pour l'ensemble de la colonne est de couleur verte, je raison de supposer que, pour l'utilisateur, les 6 premiers pixels sur la gauche de l'écran seront de couleur verte, et le plus à droite 10 sur l'écran doit être vert ainsi que? Donc, aurais-je raison dans mon hypothèse que, selon l'écran, à gauche?

Était-ce utile?

La solution

Ce site Je suis sûr que vous êtes déjà très, très bien. Je commencerai en disant que je ne suis arrivé à programmer pour la NES, mais je suis très expérimenté avec tout le matériel Gameboy qui n'a jamais été libéré et les actions NES beaucoup, ahh bizarreries avec le GB / DMG. Je vais parier que vous devez soit faire l'une des quelques petites choses:

  1. Ne pas faire défiler la table d'attributs. Assurez-vous que vos niveaux ont tous similiar des blocs de couleur le long de la direction de votre déplacement. Je suppose que de nombreux jeux de première génération ont fait.

  2. Allez-y et permettre le défilement attribut limité - assurez-vous que les zones où les changements sont INTERVENUES sont partiellement couleur partagée ou assez clairsemé que le changement ne va pas être noticable

  3. Sortez votre ancien skool atari timer 2600 et le temps d'une écriture à enregistrer $ 2006 à la fin de la mise à jour HBLANK pour obtenir l'échange de couleur que vous devez faire, attendre quelques tics, revenir alors au cours de la période de retour HBLANK de telle sorte que le bord gauche de la ligne suivante est pas affectée. Je sens que c'est la solution utilisée le plus souvent, mais sans un très bon émulateur et la patience, ce sera une douleur dans le cul. Il mange aussi un peu dans votre utilisation globale du processeur que vous devez attendre dans les interruptions sur plusieurs lignes de balayage pour obtenir votre effet fait.

Je voudrais avoir une réponse plus concrète pour vous, mais cela aide, espérons un peu. Merci bien le GB / DMG avait un système de défilement un peu plus avancé. :)

Autres conseils

Les deux Super Mario Bros 3 et les artefacts de coloration d'affichage d'aventure de Kirby sur le bord de l'écran lorsque vous faites défiler. Je crois que les deux jeux mis le bit que les 8 pixels obture gauche de l'écran, de sorte 0-8 pixels seront affectés sur une trame.

Si je me souviens bien, Kirby Adventure essaie toujours de mettre les colonnes de couleur glitched sur le côté de l'écran qui défile hors pour le rendre moins visible. Je ne pense pas que ces artefacts peuvent être évités sans passer à la mise en miroir verticale, qui introduit ses propres difficultés.

Disclaimer:. Il a été comme cinq ans que je l'ai écrit un code NES

Chaque NameTable a sa propre table d'attribut, donc il ne devrait pas être des objets graphiques lors du défilement d'un NameTable à l'autre. Le type de couleur glitching vous faites référence est vraiment un problème que si vos rouleaux de jeu à la fois verticalement et horizontalement. Vous avez seulement deux nametables, donc faire défiler les deux sens vous oblige à cannibaliser l'écran visible. Il existe différentes solutions à ce problème, un résumé de ce qui se trouve dans ce poste nesdev:

http://nesdev.parodius.com/bbs/viewtopic. php? p = 58509 # 58509

Ce site peut être d'une certaine aide. http://www.games4nintendo.com/nes/faq.php#4

(Chercher "Quoi de neuf avec $ 2005/2006?" Et commencer à lire autour de cette zone.)

Il ressemble fondamentalement à son impossible de l'obtenir pixel parfait, mais ceux qui vont être les bits que vous allez probablement devoir examiner.

voudrais pouvoir être plus d'aide.

Chaque NameTable a sa propre table d'attributs. Si vous limitez votre monde du jeu à seulement deux écrans, vous aurez seulement besoin d'écrire les nametables et tables d'attributs, une fois. La partie difficile vient quand vous essayez de faire des mondes plus grand que deux écrans. Super Mario Bros 1 a fait en faisant défiler vers la droite, enroulant autour si nécessaire, et de rendre le niveau d'une colonne de blocs à la fois (16 pixels) juste avant que la colonne est en vue. Je ne sais pas comment on pourrait le coder efficacement (garder à l'esprit que vous avez seulement une milliseconde de temps vblank).

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