Page 1 sur 1

GrabSprite sur un sprite et pas sur l'écran

Publié : jeu. 30/juil./2009 15:28
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

Publié : jeu. 30/juil./2009 15:33
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)

Publié : jeu. 30/juil./2009 16:36
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

Publié : jeu. 30/juil./2009 18:25
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.

@+

Publié : sam. 01/août/2009 15:33
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 

Publié : lun. 03/août/2009 15:35
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

Publié : lun. 03/août/2009 16:00
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 :)

Publié : mar. 04/août/2009 17:38
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 ???

Publié : mar. 04/août/2009 17:46
par Anonyme
Pas l'air au point le sous système. déjà eu des soucis avec de rendu.