Vous n'êtes pas identifié.
sinon tu utilises un pointeur far.
unsigned char far* seg = 0x1A20;
unsigned char far* seg = (unsigned char far* ) 0x1A200000;
Hors ligne
@dada66 : pour drawsprite, faut lui donner quels arguments ?
le pointeur far, il sert à quoi dans l'affaire ?
Hors ligne
le pointeur far est nécessaire parce que les données ne sont pas dans le meme segment que le programme, il faut donc spécifier une adresse complète...
Hors ligne
void DrawSprite(unsigned short x, unsigned short y, const void* sprite, unsigned char mask, char height);
x et y no comment!
sprite : pointeur sur un sprite codé en octet/octet
mask : masque d'effaçage (ex:la police ne fait que 4 caractères de larges donc le masque vaut 11110000b soit 0xF0 les '1' correspondent aux données qui seront affichées)
height = hauteur du sprite (5 pour la police)
Hors ligne
"unsigned short x, unsigned short y"
On peut aussi mettre:
"short x, short y" ce qui:
1- est moins long à écrire
2- permet d' écrire du texte en partie en dehors de l' écran -permet des textes défilants-
Hors ligne
dans ce cas tu meme écrire "int x, int y" vu qu'en entier ne fait que 2 octets sur g100
Hors ligne
et puis aussi
#define I int
I x,I y
Hors ligne
heu ... ça devien pas racourci à l'extreme là ?
ça me rapelle un truc que j'ai lu une fois "comment rendre un source illisible"
Hors ligne
Concours du code c le plus illisible :
[URL=http://www.de.ioccc.org/main.html]http://www.de.ioccc.org/main.html[/URL]
le plus marrant c'est de trouver a quoi sert le programme lol
Hors ligne
int loadfont (int zone,char police []) { struct memory_zone bf; search_mem_zone(zone,police,&bf); font = (unsigned char far*)MK_FP(bf.b_segment, bf.b_inner_offset); return (0); }
Cette fonction m'en inspire une autre :
unsigned char far* load_memzone_data (int zone,char name []) { struct memory_zone bf; search_mem_zone(zone,name,&bf); return (unsigned char far*)MK_FP(bf.b_segment, bf.b_inner_offset); }
et puis on fait par exemple : unsigned char far* game_map=load_memzone_data(3,"GAMEMAP");
la syntaxe est elle correcte ?
Hors ligne
ha bah oui effectivement, c'est très resemblant ... je jure que c'était pas intentionel !
ça m'as l'air ok
Hors ligne
Allez voir le sujet sur sprite maker... en attendant qq chose de bcp plus flexible qui arrive
Hors ligne
j'ai regardé, mais bon ça ne dispense pas mon jeu pour le concours d'une fonction de ce type pour les données autres que les sprites...
Hors ligne
Hors ligne
bon bah ça y est, la fonction est prete !
//textbm 2 : la revenche du octet par octet (il revien et il est pas content) par Bija et Madjar #include <memzones.c> unsigned char far* font; void loadfont (int zone,char police []) { struct memory_zone bf; search_mem_zone(zone,police,&bf); font = (unsigned char far*)MK_FP(bf.b_segment, bf.b_inner_offset); } void printbm (int x,int y,char lettre) { char a; int i; short adresse_video; int debut=0,fin=5; char decalage; if (y<0) debut=-y; // clipping haut if (y>63) fin=63-y; // clipping bas if ( x<0 ) return; //clipping : vérifie que ca ne dépasse pas de l'écran à gauche for (i=debut;i<fin;i++) //le sprite comporte 5 lignes { a= font [lettre*8+i]; //on récupré la ligne du sprite dans a adresse_video = 1023 - y - ( x / 8 ) *64 - i; //on calcule l'adresse video en mode C3 decalage = x%8; //on calcule le décalage asm mov si, x asm mov ax, 0x1A20 //l'adresse du 1er buffer dans ax asm mov es, ax //pour la mettre dans es asm xor ax, ax //on met ax à 0 asm mov ah, a //on met la 1ere ligne du sprite dans ah asm mov cl, decalage //le décalage dans cl asm shr ax,cl //on décale ax pour avoir la bonne position asm mov di,adresse_video //l'adresse dans di asm mov bx,0x0FFF //seuls les 4 premiers bits de ax sont utilisés donc bx est un masque qu'on va appliquer sur l'écran asm ror bx,cl //on fait une rotation a bx en fonction du décalage asm cmp si, 120 asm ja gauche droite: asm and [es:di-64],bl asm or [es:di-64],al gauche: asm cmp si, 127 asm ja fin asm and [es:di],bh //on met les bits du sprite à 0 et les autres sont conservés asm or [es:di],ah //on affiche le sprite avec un or fin: }} void textbm (int x, int y,char texte[]) { int a; for (a=0; a<strlen(texte); a++) printbm(x+5*a,y,texte[a]); } void main () { loadfont(3,"FONT"); textbm (0,0,"J'AIME LE POULET !"); textbm (0,6,"J'aime le poulet !"); textbm (0,12,"MADJAR IL EST TROP BEAU"); textbm (0,18,"Madjar il est trop beau"); textbm (0,24,"BIJA EST PAS MAL NON PLUS"); textbm (0,30,"Bija est pas mal non plus"); getch(); }
en théorie, elle est po bugué
éclatez vous !
Hors ligne
et voila le fruit d'efforts acharnés ...
enfin si vous avez des questions ou que vous remarquez que notre code est aps optimisé du tout nhésitez pas à ne le dire !!
Hors ligne
bon désolé de réveiller ce post mais j'ai fait la fonction mais en mode DB
si ca intéresse qqn : http://paulhaz.free.fr/casio/textb3.h
et si qqn regarde le code et qu'il trouve comment supprimer la boucle ne C, qu'il me le dise !!
j'avais essayé de faire un lds si,.. pour ensuite copier les données avec des instrctions en assembleur mais ca marchait pas ...
Hors ligne
Il faudrait que tu essaies qq chose comme ca:
void printb (int x,int y,int lettre,int segm) { asm { push ds mov ax,segm sub ax,y sub ax,4 mov es,ax // es = segment corresp a la ligne la plus basse du sprite mov cx,x mov di,1022 mov ax,cx shr ax,3 sub di,ax // es:di -> mot qui va recevoir la ligne en question and cl,7 mov dx,0xFF00 // masque ror dx,cl lds si,font mov bx,lettre shl bx,3 add si,bx dec si // ds:si -> octet precedant le premier octet du sprite mov bx,5 // 5 lignes a afficher } boucle: asm { // on balaie le sprite de bas en haut en decrementant bx xor al,al mov ah,[ds:si+bx] ror ax,cl and [es:di],dx or [es:di],ax add di,16 // passe a la ligne suivante dec bx jnz boucle // on continue tant que bx!=0 pop ds } }
:!: non testé
Hors ligne
j'avais essayé lds si,font mais ca marchait pas
enfin j'essaierais qd meme ton code ....
tiens ca me fait penser que j'ai pas mis de commentaire ..
merci !
Hors ligne
j'ai testé ca marche super sauf pour le masque
c'est
mov dx,0xFFF // masque
(le lien est mis a jour)
Hors ligne
Moui pour le masque en fait j'ai pas trop compris pourquoi c'était 0x0FFF donc j'ai fait comme d'habitude et j'ai mis 0xFF00
Enfin si ca marche avec ta valeur tant mieux
Hors ligne
j'ai mis 0x0FFF
parceque la ligne du sprite fait 4 pixels de longueur donc faut efacer les 4 pixels correspondants
apres je sais pas comment les autres programmeurs font habituellement !
Hors ligne
Ah oui effectivement, je comprends mieux (je pensais plutot à un masque inverse lol)
Hors ligne