Prendre un sprite comme mask
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
Prendre un sprite comme mask
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
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
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.
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.
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)
@Ar-s
je savais bien que j'avais deja vu ça
sinon on peut faire une grosse arnaque , mais c'est moin joli que le code de AR-s c'est sur
je savais bien que j'avais deja vu ça

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

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
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?
Ah oui, ce sera un sprite3d bien sûr

Poshu> Ah bon? Le jeu 3d tu entends?
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
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é.
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é.
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
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.
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.
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
)
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

- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
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 ^^
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 heureuxCrystal 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 ^^

- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
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.
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.