Page 1 sur 1

Prendre un sprite comme mask

Publié : lun. 19/mai/2008 14:40
par Crystal Noir
hello,

Je me pose une question toute bête, c'est simple en plus mais je vois pas.

Imaginez une image plein écran n'importe quoi.

Imaginez maintenant un sprite en forme de spot lumineux (genre un halo).

Ce que je veux c'est faire un viewport. C'est à dire que quand je bouge le halo à l'écran il fait apparaitre l'image derrière le halo mais uniquement ce qui se trouve sur le halo donc tout est noir sauf ce que j'éclaire avec mon halo.

Vous voyez ?

Alors j'ai bien pensé au clipsprite et tout le bazar pour rendre une seule partie de l'image sur mon halo lumineux, seulement le clip sprite me fait un rectangle et prend pas en compte la forme ronde du halo.

Ca m'énerve car dans bmax je fais ca en 10 secondes grâce aux viewports. là c'est un peu le bazar, donc ma question comment utiliser un sprite comme mask ?

Merci

Publié : lun. 19/mai/2008 15:27
par poshu
mmmh. Je pense qu'il faudrait effectuer l'effet inverse, afficher uniquement les pixels qui doivent être visible, et en jouant avec le RGB pour donner un effet d'ombre autour de l'image. J'vais y jeter un oeuil via clipsprite.

Je vais rajouter ma frustration: pour le jeu, pure n'est vraiment pas au point. J'vais craquer pour PureGDK. J'en suis sûr.

Publié : lun. 19/mai/2008 15:43
par Ar-S
Je ne sais pas si c'est ce que tu cherches mais ce code pourrait t'aider.

Code : Tout sélectionner

Structure APIC
  ;____________________________________________________________________________
  ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  ; (BBL V0.08)
  ; Structure permettant de gérer un BitMap créé par l'API pointé par ABmp
  ; et d'y accéder grâce l'imageID
  ;____________________________________________________________________________
  ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  id.l      ; ID de l'image
  pBmp.l    ; (Pointeur 32 bits) Pointeur d'accès direct à l'image
  W.l       ; Largeur de l'image
  H.l       ; Hauteur de l'image
  
EndStructure



Macro Argb(A, R, G, B)
  
  ((((A << 24) + (R << 16) ) + (G << 8) ) + B)
  
EndMacro


Procedure DrawLocate(*Buffer.APIC, x.l, y.l)
  With *Buffer
    *Adr = \pBmp + (((y * \W) + x) * 4)
  EndWith
  
  ProcedureReturn *Adr
EndProcedure



Procedure CreateAlphaImage(*Buffer.APIC, W.l, H.l)
  ;____________________________________________________________________________
  ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  ; (BBL V0.08)
  ; Crée une zone mémoire pour l'édition d'une image Alpha
  ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  ; Entrées *H (Structure ADESS)
  ; ¯¯¯¯¯¯¯ W (LONG) Largeur de l'image
  ;         H (LONG) Hauteur de l'image
  ;
  ; Sortie Le buffer est modifié notamment le pointeur d'accès direct à
  ; ¯¯¯¯¯¯ l'image pBmp
  ;____________________________________________________________________________
  ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  
  With *Buffer
    
    \W = W
    \H = H
    \pBmp = AllocateMemory((\W * \H) << 2)
    
  EndWith
  
EndProcedure



Procedure CatchAlphaImage(*Buffer.APIC)
  ;____________________________________________________________________________
  ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  ; (BBL V0.08)
  ; Crée une image Alpha de 32 bits de profondeur à partir d'une zone mémoire
  ; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  ; Entrée Adresse pointant sur l'image
  ; ¯¯¯¯¯¯
  ; Sortie Retourne le handle de l'image (= ImageID)
  ; ¯¯¯¯¯¯
  ; Remarque >> Cette fonction s'exécute APRES CreateAlphaImage()
  ; ¯¯¯¯¯¯¯¯
  ;____________________________________________________________________________
  ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯   
  
  With *Buffer
    
    \id = CreateBitmap_(\W, \H, 1, 32, \pBmp)
    
  EndWith
  
EndProcedure

Procedure InitPlugIn()
  UseJPEGImageDecoder()
  UsePNGImageDecoder()
  InitSprite()
  InitMouse()
  InitKeyboard()
EndProcedure

Procedure InitDatas()
	LoadImage(0,Left(GetHomeDirectory(), 1) + ":\Windows\Web\Wallpaper\ami.jpg") ;-TON IMAGE BMP ICI
EndProcedure

Procedure InitDisplay(W.l, H.l)
  ExamineDesktops()
  OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0), "teste", #PB_Window_BorderLess)
  OpenWindowedScreen(WindowID(0), 0, 0, DesktopWidth(0), DesktopHeight(0), 0, 0, 0)
  FlipBuffers()     
EndProcedure

Procedure Init(x.l, y.l)
  InitPlugIn()
  InitDisplay(x, y)
  InitDatas()
EndProcedure

Procedure Main(W.l, H.l, Size.l)
  
  Init(W, H)
  
  Sombre.APIC
  
  CreateAlphaImage(Sombre, Size, Size)
  
  For y = 0 To Size - 1
    
    For x = 0 To Size - 1
      
      dx = x - Size >> 1
      dy = y - Size >> 1
      dx * dx
      dy * dy
      Dist.F = Sqr(dx + dy)
      Dist = (Dist * 255.0) / (Size / 2.0)
      If (Dist <= 0.0): Dist = 1: EndIf
      If (Dist > 255.0): Dist = 255: EndIf
      C.l = Dist
      C & $FF
      C << 24
      PokeL(DrawLocate(Sombre, x, y), C)
      
    Next
    PokeL(DrawLocate(Sombre, Size / 2, y), $FF000000)
  Next
  For x = 0 To Size - 1
    PokeL(DrawLocate(Sombre, x, Size / 2), $FF000000)
  Next
  
  CatchAlphaImage(Sombre)
  
  Repeat
    AMx = Mx
    AMy = My
    ExamineMouse()
    Mx = MouseX()
    My = MouseY()
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Escape)
      End
    EndIf
    If (AMx <> Mx) Or (AMy <> My)
      GrabImage(0, 1, Mx, My, Size, Size)
      StartDrawing(ScreenOutput())
      Box(AMx, AMy, Size, Size, #Black)
      DrawImage(ImageID(1), Mx, My)
      DrawAlphaImage(Sombre\id, Mx, My)
      StopDrawing()
      FlipBuffers()
    EndIf
    Event = WindowEvent()
    Delay(5)
  Until Event = #PB_Event_CloseWindow
  
EndProcedure


Main(800, 500, 400)

Publié : lun. 19/mai/2008 16:01
par Backup
@Ar-s
je savais bien que j'avais deja vu ça :D

sinon on peut faire une grosse arnaque , mais c'est moin joli que le code de AR-s c'est sur :D

Code : Tout sélectionner


; connerie codé par Dobro


Enumeration
    #Sprite_fond
    #Sprite_hallo
    #Window
    #Police
EndEnumeration

Structure sprite
    x.l
    y.l
    sensx.l
    sensy.l
EndStructure
Dim sprite.sprite(1)


; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
    WindowID = OpenWindow(#Window, 0, 0,320, 200, "hello",  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered ) 
    Result = OpenWindowedScreen(WindowID(#Window) ,0,0, 320, 200, 1, 0,0)
    
    ; creation d'un Sprite de fond
    CreateSprite(#Sprite_fond, 640, 400)  
    StartDrawing(SpriteOutput(#Sprite_fond) ) ; on dessine dedans
        For y=1 To 400 Step 10
            For x=1 To 640 Step 10 
                Circle(x, y, 5 , RGB($FF,$0,$FF)) 
            Next x
        Next y
    StopDrawing() 
    
    ; creation d'un Sprite
    CreateSprite(#Sprite_hallo, 640, 400)  
    StartDrawing(SpriteOutput(#Sprite_hallo) ) ; on dessine dedans 
        Box(0, 0, 640 ,400, RGB($FF,$FF,$0))  
        Circle(320, 200, 64 , RGB($0,$0,$0))  
    StopDrawing() 
    
    
    Resultat = InitMouse()  
    sprite(1)\x=-160
    sprite(1)\y=-100
    sprite(1)\sensx=2
    sprite(1)\sensy=2
    
    Repeat
        While WindowEvent() : Wend
        ExamineMouse() 
        WindowEvent()  
        Delay(2)
        
        If MouseButton(2)
            End 
        EndIf
        
        sprite(#Sprite_hallo)\x=sprite(#Sprite_hallo)\x+sprite(1)\sensx
        sprite(#Sprite_hallo)\y=sprite(#Sprite_hallo)\y+sprite(#Sprite_hallo)\sensy
        If  sprite(#Sprite_hallo)\x<-320
            sprite(#Sprite_hallo)\sensx=-sprite(#Sprite_hallo)\sensx 
        EndIf
        If  sprite(1)\x>0
            sprite(#Sprite_hallo)\sensx=-sprite(#Sprite_hallo)\sensx
            
        EndIf
        If  sprite(#Sprite_hallo)\y>50-64
            sprite(#Sprite_hallo)\sensy=-sprite(#Sprite_hallo)\sensy
            
        EndIf
        If  sprite(#Sprite_hallo)\y<-200
            sprite(#Sprite_hallo)\sensy=-sprite(#Sprite_hallo)\sensy
            
        EndIf
        
        DisplaySprite(#Sprite_fond, 0, 0)  
        
        DisplayTransparentSprite(#Sprite_hallo, sprite(#Sprite_hallo)\x, sprite(#Sprite_hallo)\y) 
        
        
        FlipBuffers():; affiche l'ecran
        ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
        
    Until Event=#PB_Event_CloseWindow 
 

Publié : lun. 19/mai/2008 16:28
par djes
Si tu sais faire un halo, tu sais faire l'inverse : un sprite tout noir avec un trou dedans. C'est ce qu'a fait Ar-s. Tu peux aussi le faire avec un logiciel et l'enregistrer avec une couche alpha (en png par exemple). Fais le en 256*256 et agrandit le avec zoomsprite3d.

Ah oui, ce sera un sprite3d bien sûr :)

Poshu> Ah bon? Le jeu 3d tu entends?

Publié : lun. 19/mai/2008 17:38
par Ar-S
Pour info ce code n'est pas de moi hein, je suis encore bien incapable de pondre un code de ce genre. Surtout pour une appli graphique, je ne m'y suis pas ou presque pas intéressé. :P

Publié : lun. 19/mai/2008 18:12
par Crystal Noir
Je regarderai ca de plus près merci ^^

C'est quand même idiot, en bmax il suffit d'avoir une ligne de code pour faire ce que je veux !

Au pire je vous filerai un ex compilé de ce que je veux faire. Bon c'est pas aussi joli que ce je veux mais ca vous donnera l'idée ^^

Publié : lun. 19/mai/2008 18:25
par poshu
djes > même le jeu 2D. J'ai produit récemment une démo de shmup. Bon, sans avoir de véritable expérience dans la création de jeu, je sais me débrouiller en général, et là, j'ai peiné comme jamais: entre la doc qui n'est pas à jour (doc anglaise qui me disait que le canal alpha des png était ignoré pour l'instant), des fonctions qui donnent des résultats plus qu'étranges, l'obligation d'avoir recourt à des librairies externes pour les pad, l'impossibilité de jongler entre les sprites et les sprite3D en même temps pour fatiguer à la fois la CG et le CPU... J'ai été plus efficace avec dark basic qu'avec pure pour ce qui est du jeu.

Au delà de ça, j'aime pure; plus que tout autre langage. Et coup de chance: je développe surtout des programmes, mais un petit jeu pour se relaxer de temps en temps, c'est cool, et Pure n'est à mon avis pas adapté.

Publié : lun. 19/mai/2008 18:27
par Crystal Noir
bah moi je trouve que si ^^ seulement il faut le caresser dans le bon sens du poil, le problème avec pure et comme d'autres langages c'est qu'il rend la tâche facile mais pour certaines c'est une autre paire de manche alors que d'autres langages permettent de faire la même chose plus facilement.

Et vice versa, les autres te demanderont des lignes et des lignes pour un truc que pure fait en une seule.

en fait chaque langage a ses avantages et inconvénients.

Cela dit je te l'accorde pure n'est pas simple concernant le jeu

Pour ce qui est de dbpro, pour la 3D il m'a gonflé mais il faudrait que je reste un peu niveau 2D.

Publié : lun. 19/mai/2008 19:29
par djes
Tu sais, je suis bien placé pour te dire que pure peut être très efficace pour les jeux. Le truc est qu'il faut savoir bidouiller un peu. Ce n'est pas vraiment un langage de débutants en fait!

Oui, parfois il faut utiliser des libs externes, comme pour le pad, ou des fonctions à soi, qui utilisent les api par exemple; mais justement, le fait qu'on puisse le faire très facilement est très positif!

Pour moi, pure permet de créer l'architecture du jeu, la gestion des variables, des procédures, les allocations mémoire, l'assembleur, le chargement des images, des préférences; mais il ne fait pas tout; je ne connais aucun langage qui le fasse sans te limiter quelque part.

Et puis la doc est là pour t'aider, servir de référence, mais le forum (surtout anglais), et les exemples sont bien plus parlants, et surtout incroyablement plus rapides à consulter!

Et puis il faut pousser un peu; on peut parfaitement mélanger les sprites "normaux" et les sprites 3d... De même qu'on peut mélanger tout ça avec de l'ogre! La doc dit le contraire, mais si on devait se fier à tout ce qu'on nous dit... C'est ça, "bidouiller" (regarde la traduction de ce mot en anglais :o )

Publié : lun. 19/mai/2008 20:54
par Crystal Noir
vi bon chuis pas un débutant non plus en pure (Cf CPS Crystal Particle System, avec bougie et cie) mais sans parler de tout cela , pour des effets etc... il est bien mais faut reconnaître que pour les jeux il n'est pas non plus le plus simple.

en revanche il a une belle panoplie de fonction pour des effets super chouettes ^^

Publié : lun. 19/mai/2008 21:31
par djes
Crystal Noir a écrit :vi bon chuis pas un débutant non plus en pure (Cf CPS Crystal Particle System, avec bougie et cie) mais sans parler de tout cela , pour des effets etc... il est bien mais faut reconnaître que pour les jeux il n'est pas non plus le plus simple.

en revanche il a une belle panoplie de fonction pour des effets super chouettes ^^
Je m'adressais plutôt à poshu :=). Moi depuis qu'il y a l'alpha je suis très heureux :); mais on pourrait rajouter des trucs, oui. La version 4.30 devrait voir un nouveau portage de ogre, et ça va faire du bien!

Publié : lun. 19/mai/2008 21:44
par Crystal Noir
Remarques je dis que je suis pas débutant mais chuis pas foutu de fair eun viewport à 2 balles :D cherchez l'erreur mdr

Publié : mar. 20/mai/2008 1:34
par poshu
Oh oui, via bricolage, j'ai réussi à coder ce que je voulais (maniac shoot qui tiens la charge d'un dodonpachi dai ou jou tranquillement), mais globalement, les fonctions ne me satisfont pas au même niveau que les fonctions "pour application" de pure: on a d'un coté un langage parfait (ou presque, mais demander plus, c'est tirer le diable par la queue) et de l'autre un langage qui n'est vraiment pas mature.
Je comprends tout à fait que pure s'oriente vers la plus grosse demande, mais qui de l'oeuf ou de la poule est arrivée en premier?
Y aurait il plus de demande pour le jeu si le langage attirait les dev amateur avec des fonctions jeu, ou les dev amateurs doivent ils acheter la licence en espérant que leurs demandes seront écoutées?

Toujours est il qu'en matière de 3D, avec un code plus simple, je perf plus sur dark basic pro. Et ca, c'est chiant.