Page 1 sur 1

Effet d'ombre avec des sprites

Publié : dim. 05/sept./2004 19:15
par Thyphoon
Salut

Je galère sur un truc pour la création de mon jeu !
Comment faire un effet d'ombre pour un personage

j'ai un gros sprite qui sert de decord
et actuellement j'affiche un sprite tout bête sur le decord avec la commande DisplayTransparentSprite
Que me conseillez vous ? Passer tout en Sprite3D , restez en Sprite 2D ?
Auriez vous un petit exemple de code ?
Merci
Thyphoon

Publié : dim. 05/sept./2004 21:37
par Thyphoon
Voilà ce que j'ai fait mais je ne suis pas satisfait l'ombre n'est pas assez opaque pas assez visible
Le jeu se déroule sur un ecran en 640X480

Code : Tout sélectionner

 ;On affiche le sprite du personage
TransparentSpriteColor(#perso, 255, 0, 255)
CopySprite(#perso,6,#PB_Sprite_Texture) ; je copie le sprite pour pouvoir le mettre en 3D
CreateSprite3D(6,6); hop en 3D

Start3D() 
Sprite3DQuality(1)
h=SpriteHeight(6) 
w=SpriteWidth(6) 
d=(Xperso*20/640)-10
Debug(Str(d))
TransformSprite3D(6, 0+d,-5, w+d, -5, 0, h, w, h)  ; l'ompre se deforme
TransparentSpriteColor(6, 255, 0, 255)
Sprite3DBlendingMode(11,10)  ;mode d'affichage de l'ombre
DisplaySprite3D(6,Xperso+d,Yperso,255)  ;on affiche l'ombre

Stop3D()
  DisplayTransparentSprite(#Perso,Xperso,Yperso)
qu'en pensez vous ? des idées ? je maitrise pas du tout le Sprite3DBlendingMode donc peut être que c'est a ce niveau là que je peu jouer mais j'avoue que je met des valeur un peu au pif

Publié : lun. 06/sept./2004 16:14
par Aranoth
moi j'aurait fait à partir d'un sprite 2 sprites 3D, un pour l'objet et l'autre je l'aurait rencouvert de noir sauf a la couleur de transparence et je l'aurait affiché en biais et en semi-transparence, enfin c'est ce que je ferait moi pour mon jeu

Publié : mar. 07/sept./2004 4:13
par Thyphoon
Pas bête ton idée....mais plus ça vas plus je pense que je vais le faire en Sprite 2D et non 3D, déjà pour garder une compatibilité avec linux, et AmigaOs. Mais ton idée est bonne !! :o)

Publié : mar. 07/sept./2004 7:34
par Thyphoon
Donc voilà ce que ça donne une procédure

Code : Tout sélectionner

Procedure OmbrageSprite(no.l)
  StartDrawing(SpriteOutput(no)) 
  For v = 0 To SpriteHeight(no)-1 
    For u = 0 To (SpriteWidth(no) - 1 )
      CoulG = Point(u, v) 
      If CoulG=RGB(255,0,255)
        Plot(u,v,RGB(0,0,0)) 
      Else
        Plot(u,v,RGB(1,1,1)) 
      EndIf
    Next
  Next
  StopDrawing()
EndProcedure
Et ensuite dans la boucle principal :

Code : Tout sélectionner

;Affichage du personnage
CopySprite(#perso, #ombre, 0) ; je copie le sprite du perso pour faire l'ombre
OmbrageSprite(#ombre); je transforme le sprite qui sert a l'ombre 
DisplayTranslucideSprite(#ombre,Xperso+7,Yperso,180); je l'affiche a l'ecran
  
 TransparentSpriteColor(#perso, 255, 0, 255); transparence pour le sprite du perso
  DisplayTransparentSprite(#perso,Xperso,Yperso); On affiche le perso

Le rendu est exactement ce que je voulais....parcontre c'est beaucou plus gournand que je le pensais en resource !!!!il faut dire que j'ai pas trop comprit l'astuce pour les commandes StartSpecialFX()
Voilà pour l'instant si j'ai mieux je le posterais ici...si quelqu'un a une meilleur solution qu'il n'hesite pas a proposer
Thyphoon

Publié : mar. 07/sept./2004 9:57
par filperj
Dans un bloc startspecialfx()/stopspecialfx(), il vaut mieux n'utiliser que des sprites qui ont étés créés (ou chargés) avec le flag #pb_sprite_memory.
Par ex, tu devrai faire:

Code : Tout sélectionner

CopySprite(#perso, #ombre, #pb_sprite_memory)
etc...

Publié : mar. 07/sept./2004 10:24
par comtois
j'ignore si ça représente bcp de sprites à calculer ,mais tu as peut-être intérêt à les calculer une bonne fois pour toute et les enregistrer sur ton disque .

Publié : mar. 07/sept./2004 12:35
par Thyphoon
pour filperj : Merci pour l'info mais je n'arrive pas utiliser StartSpecial FX...quand je l'utilise il y a mes sprites dit "normal" qui n'apparaisse plus... j'ai pas tres bien pigé ou mettre ces commandes...mais quand je les mets pas ça marche même si c'est lent !

Pour comtois: Tu as peut être raison car tout mes sprites on besoin d'une ombre...mais il y en a tellement (de sprite) que pour des economies de temps et de mémoire je préfèrerais utiliser une commande pour faire les ombres.

Côté puissance c'est marrant j'ai l'impression qu'avec mon PIV2GHz je dois faire beaucoup plus attention qu'avec mon 1200 et 68030 et le BlitzBasic... Je trouve qu'on arrive rapidement a une limitation des possibilités en 2D : Pourtant si on veut faire une appli pour AmigaOS et Linux en plus de windows ...on est vite limité ! Vous trouvez pas ?

Publié : mar. 07/sept./2004 21:23
par Flype
non tu n'es pas si limité que çà. je t'assure...
ne serait qu'en connaissant ces jeux 2D fait en purebasic :
http://perso.wanadoo.fr/darkprograms/downloads.html

j'ai eu aussi un amiga1200 et je programmais dessus :wink:
en amos, en blitz...

avec "specialfx" tu comprendras pourquoi.
je vais essayé de te faire un exemple

Publié : mer. 08/sept./2004 4:34
par Thyphoon
Merci Flype ! je veux bien un exemple avec SpecialFx car je t'avoue que je n'arrive pas du tout a utilisé ce mode !! ça marche mieu quand je met SpecialFX() en commentaire que lorsque je le rajoute :roll:
merci d'avance

Publié : mer. 08/sept./2004 7:12
par Flype
oui et bien ca ma fait pareil au debut...
bon patiente encore un peu je pars bosser, ce soir j'essaierai

Publié : mer. 08/sept./2004 7:22
par Thyphoon
Merci Flype !
hé hé ça me rassure de savoir que ça fait pareil chez toi :wink:
Bonne journée de boulot !!! :P