background + 64 sprites en HuC

Discussions techniques et Pixel Art en 9 bits.

Modérateurs : SirG, Redfield1, shubibiman, Laucops

Répondre
philippe
Please Insert Disc!
Messages : 29
Inscription : ven. 01 oct. 2010 19:49

background + 64 sprites en HuC

Message par philippe »

Bonjour,

Je souhaite afficher un background et 64 sprites. J'ai beaucoup de difficulté pour trouver des sources en HuC. De nombreux liens ne sont plus actif depuis belle lurette: des sources, des démos, des jeux qui s'évanouissent... comme des larmes sous la pluie.

Pour lutter contre l'oubli, inscription gratuite:http://www.mirari.fr/user/account

Premiers pas
Pour le jeu PONG (huc_dos_142*), l'image Ball est d'une taille de 32*32, alors que 16*16 parait largement suffisant.

La balle étant d'une taille 8*8, de précieux octets me semble ainsi gaspillé. Alors pourquoi utiliser une image PCX de 32*32 ?


*J'ai aussi remarque que la version HUC.H est plus ancien, et donc moins complet.
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: background + 64 sprites en HuC

Message par touko »

tu as celui là : http://www.zeograd.com/creation_download.php?lang=fr

C'est la partie download du site de zeograd (huc), par contre tu n'a pas toujours les sources .

Pour le background, il doit être au format .pcx, en 16 couleurs (pour commencer), et multiple de 16 .

tu dois inclure ton background avant le main comme ça :

Code : Tout sélectionner

#define   TILE_VRAM  0x1000 

#inctile(tiles_gfx, "background.pcx", 16,14)   /* inclue une image de 256*224 (16 tiles * 16 pixels)*(14 tiles *16 pixels) */
#incpal(tiles_pal,  "background.pcx")            /* inclue la palette (16 couleur ici)
#incbat(bg_bat,"background.pcx",TILE_VRAM,16,14)  /* inclue la BAT (Background Attribute Table )

main()
{
    disp_off();	   
    load_background(tiles_gfx, tiles_pal, bg_bat,16,14); 
   vsync();
    disp_on();  
}
Ca devrai marcher, pour afficher une image 256*224 :wink: . (j'ai pas testé, et comme je fais plus comme ça depuis longtemps).
philippe
Please Insert Disc!
Messages : 29
Inscription : ven. 01 oct. 2010 19:49

Re: background + 64 sprites en HuC

Message par philippe »

Merci beaucoup touko, je vais tester rapidement pour le background. :D
UP
J'ai enfin réussi: http://www.mirari.fr/vuy9
Image

J'arrive à créer un .pce pour un simple hello word, mais je n'y arrive pas pour un sprite. Je me suis pourtant inspiré de l'exemple pong.

Veuillez trouvez ci-dessous mon dossier:
http://www.mirari.fr/EVND

ps: j'ai mis une image jpeg (4errors), sur le message d'erreur.

UP
J'avais oublié les commandes de chargement à la fin du code, voilà qui est corrigé:

Code : Tout sélectionner

/*
 PCE - HuC - Affichage d'un sprite 0.2
 28/03/2011
 */
 
#include "huc.h"

#define         BALL    0x7000 /* valeur qui commence à partir de 7000*/
/* Fonction principale*/
main()
{


set_color_rgb(1, 7, 7, 7);
set_font_color(1, 0);
set_font_pal(0);
load_default_font();
put_string("Affichage d'un sprite 0.2", 0, 0);

/* chargement dans la mémoire vidéo, adresse 7000, de l'image ball pour le sprite n°0 :*/
	load_sprites(0x7000, ball, 1); 
/*// load_vram(int vaddr, int *data, int nb);*/
	init_satb(); /*// initialisation de la bibliothèque des sprites*/
	spr_set(0); /*//selectionne le sprite n°0 (0 à 63) pour lui donner les ordres ci-dessous.*/
	spr_x(10); 
	spr_y(100);
	spr_pattern(BALL); /*// place l'adresse de la palette du sprite dans la mémoire vidéo*/
	spr_ctrl(SIZE_MAS|FLIP_MAS, SZ_16x16|NO_FLIP); /* attributions: masque, taille et orientation du sprite.*/
	spr_pal(0); /* indique le n° de la palette (0 à15)*/
	spr_pri(1); /* priorité d'affichage (0 = derrière le background)*/
	
/* Boucle Principale */
	for (;;)
	{
	vsync(1); /* synchronisation de l'écran*/




	spr_set(0);
	spr_x(50);
	spr_y(100);
	
	satb_update(); /*// rafraichissement des sprites */

	}


}

/* 
 * the sprite data
 */

#incspr(ball,"ball.pcx",0,0,1,1);      /* ball */

#incpal(ball_colors,"ball.pcx",0,1);




Plus de message d'erreur, mais le sprite ne s'affiche toujours pas.
Image
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: background + 64 sprites en HuC

Message par touko »

Mets tes inclusions avant,comme avec le bacgnd .

J'ai fait quelques modifs :

Code : Tout sélectionner

/*
PCE - HuC - Affichage d'un sprite 0.2
28/03/2011
*/

#include "huc.h"

#define         BALL    0x7000 /* valeur qui commence à partir de 7000*/

/* 
* the sprite data
*/

#incspr(ball,"ball.pcx",1,1);      /* ball */
#incpal(ball_colors,"ball.pcx");

/* Fonction principale*/
main()
{


set_color_rgb(1, 7, 7, 7);
set_font_color(1, 0);
set_font_pal(0);
load_default_font();

/* chargement dans la mémoire vidéo, adresse 7000, de l'image ball pour le sprite n°0 :*/
   load_sprites(BALL, ball, 0x40);   /* Autant utiliser ton define */
/*// load_vram(int vaddr, int *data, int nb);*/
   init_satb(); /*// initialisation de la bibliothèque des sprites*/
   spr_set(0); /*//selectionne le sprite n°0 (0 à 63) pour lui donner les ordres ci-dessous.*/
   spr_x(10); 
   spr_y(100);
   spr_pattern(BALL); /*// place l'adresse de la palette du sprite dans la mémoire vidéo*/
   spr_ctrl(SIZE_MAS|FLIP_MAS, SZ_16x16|NO_FLIP); /* attributions: masque, taille et orientation du sprite.*/
   spr_pal(0); /* indique le n° de la palette (0 à15)*/
   spr_pri(1); /* priorité d'affichage (0 = derrière le background)*/
   spr_show();  /* tu avais oublié ça */
   
   disp_on();
   put_string("Affichage d'un sprite 0.2", 0, 0);

   
/* Boucle Principale */
   for (;;)
   {
     spr_set(0);
     spr_x(50);
     spr_y(100);
     vsync(); /* synchronisation de l'écran*/   
       satb_update(); /*// rafraichissement des sprites */
   }


}

Tu avais oublié le spr_show(); pour rendre ton sprite visible.

Si tu as des questions n'hésites pas.
philippe
Please Insert Disc!
Messages : 29
Inscription : ven. 01 oct. 2010 19:49

Re: background + 64 sprites en HuC

Message par philippe »

touko a écrit : Tu avais oublié le spr_show(); pour rendre ton sprite visible.[/code]

Si tu as des questions n'hésites pas.
Merci :)

En fait, il manquait l'attribution d'une palette pour le sprite, avec la commande set_sprpal. Sans elle le sprite ne s'affiche pas.
Je me sens un peu plus à l'aise, puisque j'affiche maintenant plusieurs sprites devant un background, et la, heu, sous-commande FLIP_X marche très bien, je suis content. J'ai trouvé plusieurs codes sur le site que tu m'a indiqué (animation et scrolling), beaucoup de découvertes en perspective. :mrgreen:

Je ne comprend pas la fonction des commandes jumelles disp_on() et disp_off() :?:

C'est la première fois que je vois le raccourcis comme par exemple:

Code : Tout sélectionner

tempx=(sx>>4)+8
ça correspond à quoi ? :oops:

Sprites.inc est le programme qui gère bien tout ce qui touche au sprite (prototype des fonctions)? Le point chaud d'un sprite se situe en haut à gauche ?

Huc dépend de pceas ? Il n'y a pas de mise à jour depuis 2005 ?

Ensuite je me pose des questions sur l'ouverture hardware de la console, notamment sur les cartes Arcade Card et Street Fighter 2' et son étonnante capacité: 20 megas, il s'agit de 20 Mo ?
http://wiki.pcengine.info/pmwiki.php?n= ... ArcadeCard
ça serait cool de proposer son jeu sur une HuCard avec une mémoire étendu. Il y a un programmeur/ingénieur qui a étudié les puces de ces cartes ?
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: background + 64 sprites en HuC

Message par touko »

disp_on() et disp_off(), servent à activer /desactiver la sortie ecran .

si tu fait un disp_off(), plus rien ne sera affiché à l'écran, faudra refaire un disp_on();.

Non c'est 20 mb(megabits) .
Pour les périfs style arcade card, faut faire attention, pas énormement de personnes en ont, et pour le moment il n'y a pas de lib pour l'exploiter, donc faudra tout faire à la mano.

Tu verras, tu passera vite au SCD-rom :mrgreen:
philippe
Please Insert Disc!
Messages : 29
Inscription : ven. 01 oct. 2010 19:49

Re: background + 64 sprites en HuC

Message par philippe »

faire tout à la mano: en assembleur ?

tempx=sx>>4
Chaque fois que la valeur sx est incrémenté de 16, alors ++tempx. Vu que les sprites sont d'une taille de 16*16, je commence à percevoir l'utilité de la chose.

Si j'ai bien compris, la console peut afficher 256 couleurs. Mais je dois être dans l'erreur car il y a des jeux avec 29 couleurs affichées simultanément, d'autre 51 couleurs, et d'ailleurs pourquoi une telle différence ?
Avatar de l’utilisateur
touko
NECromancer
Messages : 2297
Inscription : lun. 31 mars 2008 14:32

Re: background + 64 sprites en HuC

Message par touko »

philippe a écrit :faire tout à la mano: en assembleur ?
Tu peux le faire en c, mais l'assembleur est fortement recommandé.
philippe a écrit : tempx=sx>>4
Chaque fois que la valeur sx est incrémenté de 16, alors ++tempx. Vu que les sprites sont d'une taille de 16*16, je commence à percevoir l'utilité de la chose.
Là tu divises par 16, pour multiplier c'est sx<<4
Les sprites ont une taille min de 16*16, mais max de 32*64 .
philippe a écrit : Si j'ai bien compris, la console peut afficher 256 couleurs. Mais je dois être dans l'erreur car il y a des jeux avec 29 couleurs affichées simultanément, d'autre 51 couleurs, et d'ailleurs pourquoi une telle différence ?
En fait si on compte toutes les palettes (sprites+bckgnd), on peut afficher 481 couleurs
16+15*15 (pour le bckgnd) et 16*15 (pour les sprites).
La couleur 0 n'est visible que pour la palette 0, et sert de masque avec les sprites.

Ensuite, pour le bckgnd c'est pas une palette de 256 couleurs, mais 1palette de 16 couleurs et 15 palettes de 15 couleurs (la couleur 0 est transparente).
Ensuite les images ne sont pas au format bitmap, mais décomposées en tiles de 8*8 pixels ..
Chaque tile peut avoir 1 des 16 palettes pour le backgnd, avec une restriction, une tile ne peut pas avoir des couleurs de la palette 0 et des couleurs d'une autre palette.
Donc en pratique c'est très difficile d'avoir 256 couleurs pour un bckgnd, possible qu'a la mano.
C'est un système à chier pour des images statiques, mais super pour des maps.
Répondre