GrabSprite sur un sprite et pas sur l'écran

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

GrabSprite sur un sprite et pas sur l'écran

Message par TazNormand »

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
Image
Image
Anonyme

Message par Anonyme »

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 :

Code : Tout sélectionner

Memoire + ( PositionEnX * 4 ) + LargeurDeZoneMemoire2D * ( PositionEnY * 4)
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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 :

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
Image
Image
Anonyme

Message par Anonyme »

Un truc simple , tu connais toutes les positions des carateres dans le fichier de police bitmap ?


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)
tes pixel sont dans *NewMem.

@+
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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 :wink:

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 
Image
Image
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

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 :x
Image
Image
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

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 :)
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

Rectification, même sous Vista à la maison, le fait de mettre le sous système DIRECTX9 déconne tout autant que sur IGP.

vas comprendre Charles ???
Image
Image
Anonyme

Message par Anonyme »

Pas l'air au point le sous système. déjà eu des soucis avec de rendu.
Répondre