Vous n'êtes pas identifié.
voila, je travaille sur l'adaptation de virtualBoxing en C (le moteur du jeu est fini) . Mais je ne sais pas affihcher un sprite. Alors je souhaiterais que quelqu'un m'explique par exemple le plus simple possible, comment afficher le sprites le simple qui puisse exister!
merci
Hors ligne
G pas le temps, Deather, mail lui tes sources de Foot (les premieres) tu peut faire confiance a CasioWorld
Hors ligne
bon je me demairderai pour ma fonction mé bon sa risk de prendre du tps (jen suis a la 3ème ki marche pas :? :? ) pour afficher un sprite :
créé un table de type :
char <nom du sprite>[5][5] = { {0,0,0,0,0}, {1,1,0,1,0}, {1,1,0,1,0}, {1,0,0,1,0}, {1,1,0,1,0}};
ensuite voila la routine :
drawsprite(x,y,page){ char i,j; for(i=1;i<5;i++){ for(j=1;j<5;j++){ x++; y++; if(<nom du sprite>==1)setPix(x,y,0); } } }
bon c bien posible ke yai des erreur mé bon... mail moa si ya un prob a+ \De@TheR//
Hors ligne
Voila, je suis pas totalement inactif...
En utilisant par exemple
unsigned char monsprite[8]={ 0xAA, //10101010 0x55, //01010101 0xAA, //10101010 0x55, //01010101 0xFF, //11111111 0x00, //00000000 0xFF, //11111111 0x00}; //00000000 sprite8or(20,39,monsprite);
Voila vous compilez ca(le code ci-dessous) avec nasm (ne prenez que les fonctions necessaires...) pour en faire un .obj, et apres on peut le linker avec des programmes faits avec nasm ou turbo c(parce qu'il faut savoir que turbo c rajoute un "_" (sans les ") avant chaque nom, quand on ecrit sprite8(...) turbo c ecrit _sprite8) voila pour les questions repondez au post.
ne vous inquietez pas pour la taille de la routine, c'est beaucoup lus rapide (meme si c'est pas optimisé).
les _specialLeft et les _SpecialRight sont a garder avec la routine principale, ils gerent les bord gauche et droite de l'ecran...
SEGMENT _TEXT class=CODE GLOBAL _Sprite8 GLOBAL _Sprite8or GLOBAL _Sprite8xor GLOBAL _Sprite8_noclip GLOBAL _Sprite8or_noclip GLOBAL _Sprite8xor_noclip ;------------> Sprite8 <----------- ;Affiche le sprite8 à DS:SI ;DX=y CX=x ;registres détruits: AX,BX,CX,DX,SI,DI ;---------------------------------- ;void Sprite8(int x,int y,void* spr); _Sprite8: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8: mov di,1023 mov bx,8 cmp dx,0 jge .clippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg .clippedy ret .clippedTop: cmp dx,56 jle .clippedy mov ax,dx sub ax,56 sub bx,ax jg .clippedy ret .clippedy: sub di,dx cmp cx,0 jge .OKLeft jmp Sprite8_SpecialLeft .OKLeft: cmp cx,120 jl .OKRight jmp Sprite8_SpecialRight .OKRight: sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah and [es:di+bx+64],al xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8_SpecialRight: cmp cx,128 jl .OKclipped ret .OKclipped: mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor al,al or ah,0xff shr ax,cl and [es:di+bx],al xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8_SpecialLeft: cmp cx,-8 jg .OKclipped ret .OKclipped: add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne .loopdisplay ret ;void Sprite8or(int x,int y,void* spr); _Sprite8or: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8or: mov di,1023 mov bx,8 cmp dx,0 jge .clippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg .clippedy ret .clippedTop: cmp dx,56 jle .clippedy mov ax,dx sub ax,56 sub bx,ax jg .clippedy ret .clippedy: sub di,dx cmp cx,0 jge .OKLeft jmp Sprite8or_SpecialLeft .OKLeft: cmp cx,120 jl .OKRight jmp Sprite8or_SpecialRight .OKRight: sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8or_SpecialRight: cmp cx,128 jl .OKclipped ret .OKclipped: mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8or_SpecialLeft: cmp cx,-8 jg .OKclipped ret .OKclipped: add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne .loopdisplay ret ;void Sprite8xor(int x,int y,void* spr); _Sprite8xor: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8xor: mov di,1023 mov bx,8 cmp dx,0 jge .clippedTop add si,dx add bx,dx xor dx,dx cmp bx,0 jg .clippedy ret .clippedTop: cmp dx,56 jle .clippedy mov ax,dx sub ax,56 sub bx,ax jg .clippedy ret .clippedy: sub di,dx cmp cx,0 jge .OKLeft jmp Sprite8xor_SpecialLeft .OKLeft: cmp cx,120 jl .OKRight jmp Sprite8xor_SpecialRight .OKRight: sub di,64 mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8xor_SpecialRight: cmp cx,128 jl .OKclipped ret .OKclipped: mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],ah dec bx cmp bx,dx jne .loopdisplay ret Sprite8xor_SpecialLeft: cmp cx,-8 jg .OKclipped ret .OKclipped: add cx,8 and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al dec bx cmp bx,dx jne .loopdisplay ret ;-----------> Sprite8_noclip <----------- ;Pareil que Sprite8, mais ne gere pas le clipping ;Attention aux limites de l'ecran !! ;---------------------------------------- ;void Sprite8_noclip(int x,int y,void* spr); _Sprite8_noclip: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8_noclip: mov di,959 ;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor al,al or ah,0xff shr ax,cl and [es:di+bx],ah and [es:di+bx+64],al xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret ;void Sprite8or_noclip(int x,int y,void* spr); _Sprite8or_noclip: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8or_noclip: mov di,959 ;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl or [es:di+bx],al or [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret ;void Sprite8xor_noclip(int x,int y,void* spr); _Sprite8xor_noclip: mov cx,[sp+2] mov dx,[sp+4] mov si,[sp+6] Sprite8xor_noclip: mov di,959 ;1023-64 mov bx,8 sub di,dx mov ax,cx and ax,0xfff8 shl ax,3 sub di,ax and cx,7 mov dx,0 sub dx,bx xor bx,bx .loopdisplay: xor ah,ah lodsb xchg al,ah shr ax,cl xor [es:di+bx],al xor [es:di+bx+64],ah dec bx cmp bx,dx jne .loopdisplay ret
Hors ligne
j'ai voulu faire comme deather mais ca ne marche, j'ai rien à l'ecran:
#include <stdio.h>
#include <dos.h>
#include <bios.h>
void aff_pixel(unsigned short int x, unsigned short int y,char state)
{
asm push ax;
asm push cx;
asm push dx;
asm mov cx,x;
asm mov dx,y;
asm mov ax,0x1A20;
asm mov es,ax;
asm mov al,state;
asm mov si,0x003f;
asm sub si,dx;
asm sub cx,0x80;
asm not cx;
asm push cx;
asm and cl,0xf8;
asm shl cx,0x03;
asm add si,cx;
asm pop cx;
asm and cl,0x07;
asm mov ah,0xfe;
asm rol ah,cl;
asm and es:[si],ah;
asm mov ah,al;
asm rol ah,cl;
asm or es:[si],ah;
asm pop dx;
asm pop cx;
asm pop ax;
}
char bombe[5][5] = {
{0,0,0,0,0},
{1,1,0,1,0},
{1,1,0,1,0},
{1,0,0,1,0},
{1,1,0,1,0}};
void drawsprite(x,y,image)
{char i,j;
for(i=1;i<5;i++){
for(j=1;j<5;j++){
x++;
y++;
if(image==1)aff_pixel(x,y,0);}}}
void main(void)
{
drawsprite(20,20,bombe);
getch();
exit();
}
pourtant je suis persuader de ne pas etre bien loin !!!
deja il faut ecrire ca:
void drawsprite(int x,int y,unsigned char image[][]) { char i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { aff_pixel(x+i,y+j,image[j][i]); } } }
perce que ta routine elle affichait un pixel blanc si "image" pointait vers le premier octet du programme, ce qui n'est pas vrai.
avec ce que je t'ai mis ca ira
Hors ligne
c'est bon, j'ai reussit à afficher mon sprite et meme un police de caractere (avec tes sources KTR).c'etait le fete ce matin (devant le match de l'argentine).
je n'ai qu'une chose à dire merci à vous tous !!!
Hors ligne
C quopi cette routine de tapé de la tête Mastermege ?
Hors ligne
pardon mais je n'ai rien compris !
Hors ligne
Mais c'est magnifik !!! Bravo, continu... c vrai ke mastermage va chercher compliké pour trois ligne de code en c franchement..
Hors ligne
au fait je fait un exec windows qui permet de convertir un sprite à dessiner soi-meme à un tableau qui permet d' afficher un sprite avec une fonction bien à moi.
Je le mettrais sur mon site quand les deux seront au point(le site et l' exec).
(le site c [url] www.thunderboom.ifrance.com
ou aussi[url[ www.ifrance.com/thunderboom/
)
Allez @+[/url]
Hors ligne