GrabSprite sur un sprite et pas sur l'écran
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
GrabSprite sur un sprite et pas sur l'écran
Salut
J'ai un soucis avec grabsprite : je n'arrive pas à faire un grabsprite dès que cela sort de la taille écran.
je m'explique, pour mon tutoriel sur le remake de l'intro Scoopex, j'utilise un grabsprite sur une image de la police que j'affiche sur un buffer pour former mes sprites-caractères.
Mon écran étant en 800x600, et la police originelle en 728x46 ça marche nickel, mais là où ça merde, c'est que j'ai voulu augmenter la taille de la police par 2 ; du coup mon sprite image fait 728x2, et quand je l'affiche, le grabsprite bloque dès que la position X dépasse les 800.
comment faire pour pouvoir "grabber" tout ce qui est après les 800 ?
Au pire, je ferai un tableau avec les "positions" des caractères dans le fichier image, mais pour un tuto, je voudrai faire simple, et utiliser des sprites pour chaque caractère.
merci de votre aide
J'ai un soucis avec grabsprite : je n'arrive pas à faire un grabsprite dès que cela sort de la taille écran.
je m'explique, pour mon tutoriel sur le remake de l'intro Scoopex, j'utilise un grabsprite sur une image de la police que j'affiche sur un buffer pour former mes sprites-caractères.
Mon écran étant en 800x600, et la police originelle en 728x46 ça marche nickel, mais là où ça merde, c'est que j'ai voulu augmenter la taille de la police par 2 ; du coup mon sprite image fait 728x2, et quand je l'affiche, le grabsprite bloque dès que la position X dépasse les 800.
comment faire pour pouvoir "grabber" tout ce qui est après les 800 ?
Au pire, je ferai un tableau avec les "positions" des caractères dans le fichier image, mais pour un tuto, je voudrai faire simple, et utiliser des sprites pour chaque caractère.
merci de votre aide
Mis à part réecrire la fonction GrabSprite() , je vois pas.
Tu stockes les pixels dans un tableau / zone mémoire
Tu tronques les zones mémoire à la taille voulue.
Pour se balader dans une zone mémoire 2D :
Tu stockes les pixels dans un tableau / zone mémoire
Tu tronques les zones mémoire à la taille voulue.
Pour se balader dans une zone mémoire 2D :
Code : Tout sélectionner
Memoire + ( PositionEnX * 4 ) + LargeurDeZoneMemoire2D * ( PositionEnY * 4)
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Bon j'ai essayé autre chose en fait.
D'abord de créer mon sprite caractère, ensuite de "clipper" celui contenant la police entière, et de faire un copysprite du sprite "entier" (sprite n°70 dans mon code)
Résultat : ça marche pas, le sprite caractère change de taille et contient la même chose que le sprite "police", càd TOUS les caractères :
2ème Méthode : j'utilise UseBuffer sur le sprite "Car" et je fais un simple DisplaySprite sur le sprite "Car" (vous suivez ?)
Résultat : Marche pas non plus, sprite "vide"
Je n'ai plus le temps, mais je vais essayer la combinaison ClipSprite/GrabSprite : Je vais clipper mon sprite police sur le caractère que je veux extraire, l'afficher sur "écran" et le grabber dans mon sprite "Car".
Je vous tiens au courant
D'abord de créer mon sprite caractère, ensuite de "clipper" celui contenant la police entière, et de faire un copysprite du sprite "entier" (sprite n°70 dans mon code)
Résultat : ça marche pas, le sprite caractère change de taille et contient la même chose que le sprite "police", càd TOUS les caractères :
Code : Tout sélectionner
Restore FontWidths
Repeat
Read wdth
If wdth>0
; Créer le sprite correspondant au caractère de la police
pp=CreateSprite(Car,wdth*2,46*2,#PB_Sprite_Memory)
; Sélectionner le caractère qui nous intéresse sur le Sprite global de la police
res=ClipSprite(70,X_Depart,0,wdth*2,46*2)
CopySprite(70,Car,#PB_Sprite_Memory)
; Transparence du sprite caractère
TransparentSpriteColor(car,RGB(0,240,0))
Car+1 ; Caractère suivant
X_Depart+(Wdth*2) ; Décaler position dans image BitMap de la largeur précédemment lue
EndIf
Until wdth=0 ; Tant qu'il y a des données à "lire" en datas
2ème Méthode : j'utilise UseBuffer sur le sprite "Car" et je fais un simple DisplaySprite sur le sprite "Car" (vous suivez ?)
Résultat : Marche pas non plus, sprite "vide"
Code : Tout sélectionner
Restore FontWidths
Repeat
Read wdth
If wdth>0
; Créer le sprite correspondant au caractère de la police
pp=CreateSprite(Car,wdth*2,46*2,#PB_Sprite_Memory)
; Sélectionner le caractère qui nous intéresse sur le Sprite global de la police
res=ClipSprite(70,X_Depart,0,wdth*2,46*2)
; Le buffer n'est plus l'écran mais le sprite que l'on va créer
UseBuffer(Car)
; Et l'afficher sur le sprite "Car" càd notre caractère
StartDrawing(ScreenOutput())
DisplaySprite(70,0,0)
StopDrawing()
; Transparence du sprite caractère
TransparentSpriteColor(car,RGB(0,240,0))
; Restaurer le buffer par défaut (écran)
UseBuffer(#PB_Default)
Car+1 ; Caractère suivant
X_Depart+(Wdth*2) ; Décaler position dans image BitMap de la largeur précédemment lue
EndIf
Until wdth=0 ; Tant qu'il y a des données à "lire" en datas
Je n'ai plus le temps, mais je vais essayer la combinaison ClipSprite/GrabSprite : Je vais clipper mon sprite police sur le caractère que je veux extraire, l'afficher sur "écran" et le grabber dans mon sprite "Car".
Je vous tiens au courant
Un truc simple , tu connais toutes les positions des carateres dans le fichier de police bitmap ?
si oui :
tes pixel sont dans *NewMem.
@+
si oui :
Code : Tout sélectionner
*Adresse_debut = *MemoirePixel + (MinX*4) + TailleFichierX * (MinY*4)
*Adresse_fin = *MemoirePixel + (MaxX*4) + TailleFichierX * (MaxY*4)
Longueur = *Adresse_fin - *Adresse_debut
*NewMem = allocatememory(Longueur)
CopyMemory(*Adresse_debut,*NewMem,Longueur)
@+
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Bon, résolu
je faisais une mauvaise utilisation du usebuffer et du grabsprite
merci quand même pour ton astuce Cpl.Bator, je garde l'astuce sous le coude, et attention aux Sylvidres
voici le code qui marche :
je faisais une mauvaise utilisation du usebuffer et du grabsprite
merci quand même pour ton astuce Cpl.Bator, je garde l'astuce sous le coude, et attention aux Sylvidres

voici le code qui marche :
Code : Tout sélectionner
Procedure BMFont() ; Définit la police Bitmap (sprites 1 à 42)
; charger la police bitmap, et en extraire les caractères
font=CatchImage(0,?font)
If font
p=CreateSprite(70,728*2,46*2,#PB_Sprite_Memory) ; Créer un sprite "géant" pour en extraire les sprites caractères
StartDrawing(SpriteOutput(70))
DrawImage(font,0,0) ; Dessiner image sur le sprite 1
StopDrawing()
TransparentSpriteColor(70,RGB(0,240,0))
; Extraction des caractères (1 seule ligne de 43 caractères )
; On lit la datasection FontWidths pour les tailles variables de caractères
Restore FontWidths
Repeat
Read wdth
If wdth>0
; Créer le sprite correspondant au caractère de la police
pp=CreateSprite(Car,wdth*2,46*2,#PB_Sprite_Memory)
; Sélectionner le caractère qui nous intéresse sur le Sprite global de la police
res=ClipSprite(70,X_Depart,0,wdth*2,46*2)
; Le buffer n'est plus l'écran mais le sprite que l'on va créer
UseBuffer(70)
; Grabber le sprite Caractère
res2=GrabSprite(Car,X_Depart,0,wdth*2,43*2,#PB_Sprite_Memory)
; Transparence du sprite caractère
TransparentSpriteColor(car,RGB(0,240,0))
Car+1 ; Caractère suivant
X_Depart+(Wdth*2) ; Décaler position dans image BitMap de la largeur précédemment lue
EndIf
Until wdth=0 ; Tant qu'il y a des données à "lire" en datas
UseBuffer(#PB_Default)
EndIf
EndProcedure
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Bon alors là trop fort
je teste mon code sur le Pc du bureau (avec un chipset intel i915 et 4 mo de Mém. vidéo, si si !!!) et j'obtiens des carrés noirs eu lieu de mes sprites. curieux, je désactive le sous-système DIRECTX9 dans les options du compiler, et là ça marche ???
A la maison, le code fourni fonction nickel, mais je suis sous Vista Pro, avec une carte vidéo HD4850 avec 512 de RAM et DirectX 10.
Bon, pas grave, je cherche pas à comprendre, mais je pense que le problème vient de l'IGP Intel : Vive les chip graphiques intégrés
je teste mon code sur le Pc du bureau (avec un chipset intel i915 et 4 mo de Mém. vidéo, si si !!!) et j'obtiens des carrés noirs eu lieu de mes sprites. curieux, je désactive le sous-système DIRECTX9 dans les options du compiler, et là ça marche ???
A la maison, le code fourni fonction nickel, mais je suis sous Vista Pro, avec une carte vidéo HD4850 avec 512 de RAM et DirectX 10.
Bon, pas grave, je cherche pas à comprendre, mais je pense que le problème vient de l'IGP Intel : Vive les chip graphiques intégrés

Pas la première fois qu'il y a des problèmes avec ces chipsets. Bravo Intel, le numéro un des fondeurs, qui montre l'exemple! Quand je pense que dans leurs beaux discours commerciaux, DirectX devrait gentiment prendre le relais de la carte graphique quand les fonctions ne sont pas implémentées en hard... Mon oeil! Le programmeur doit tout faire lui-même, tout tester, et dire à directx de le faire ou pas. C'est complètement idiot, et bonjour le merdier, notamment lors des changements de version! Et comment faire des programmes qui font tous les même chose, alors qu'il aurait été si simple de l'intégrer une bonne fois pour toutes dans leur API.
C'était mon coup de gueule du jour
C'était mon coup de gueule du jour

- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)