RAS LE BOL DES LIMITIATIONS DES SPRITES ...

Programmation avancée de jeux en PureBasic
Anonyme

Message par Anonyme »

Je crois que c'est Dr. Dri qui avait utilisé cette technique, mais l'éclairage suivait les blocs de la map tout était carré, et on voyait aussi là ou ce n'était pas éclairé même si c'était plus sombre.
Il suffit de trouver la bonne formule qui permet d'interpolé la lumiere suivant sa distance entre les vertices et la lumiere, puis d'ajuster la bonne valeur.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit : Il suffit de trouver la bonne formule qui permet d'interpolé la lumiere suivant sa distance entre les vertices et la lumiere, puis d'ajuster la bonne valeur.
tu attises ma curiosité :D mais parcontre le faisceau lumineux est obligé de suivre les case de la map non ?
Anonyme

Message par Anonyme »

Non, regarde le code plus bas.
En revanche c'est une lumiere omnidirectionnelle, je te laisse le plaisir de le faire pour un faisceau d'une torche ^^

Code : Tout sélectionner

InitSprite() : InitSprite3D() : InitKeyboard()
OpenScreen(800,600,32,"")

Structure vertex
  sx.f
  sy.f
  sz.f
  rhw.f
  Color.l
  specular.l
  tu.f
  tv.f
EndStructure

Structure PB_Sprite3D
  Texture.l         
  Vertice.vertex[4]
  Width.w
  Height.w
EndStructure


Structure COMPLEX_MAP2D
  *SpritePtr.PB_Sprite3D   ;Pointeur du sprite3D
  Sprite3DID.l
EndStructure

Global Dim Map.COMPLEX_MAP2D(13,10)   ; peut etre remplacer par allocate memory pour des perfs optimales


Procedure RGBA(Red,Green,Blue,Alpha)
  ProcedureReturn RGB(Blue,Green,Red) + Alpha << 24
EndProcedure

Procedure Distance(x1,y1,x2,y2)
  Protected Result.f
  Result = Sqr(  (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)  )
  ProcedureReturn Result
EndProcedure

Procedure CreateGround(x,y,SpriteID)
  SPR3DID=CreateSprite3D(#PB_Any,SpriteID)
  Map(x,y)\SpritePtr = IsSprite3D(SPR3DID)
  Map(x,y)\Sprite3DID = SPR3DID
EndProcedure

;/ CREATION DU SPRITE 2D
Enumeration
  #FLOOR
EndEnumeration

CreateSprite(#FLOOR,64,64,#PB_Sprite_Texture)

StartDrawing(SpriteOutput(#FLOOR))
Box(0,0,64,64,RGB($CE,$CE,$CE))
Box(2,2,60,60,RGB($7E,$A8,$B4))
For i = 0 To 200
  R = Random(10)-Random(10)
  Plot(Random(60)+2,Random(60)+2,RGB(126+R,168+R,80+R))
Next
StopDrawing()


For y = 0 To 10
  For x = 0 To 13
      CreateGround(x,y,#FLOOR)
  Next
Next


Global AmbientLight = 0
Global PointLight.POINT

Repeat
  ExamineKeyboard()
 
  
  
  PointLight\x = 256 + 100 * Cos(ElapsedMilliseconds()/500)
  PointLight\y = 256 + 100 * Sin(ElapsedMilliseconds()/500)
  
  
  Start3D()
  
  For y = 0 To 10
    For x = 0 To 13

      
      
      ;/
      ; INTERPOLATION DE LA LUMIERE SUIVANT LA DISTANCE ENTRE LE POINT LUMINEUX ET LES VERTICES
      V0_DIST = Distance(PointLight\x,PointLight\y,x*64,y*64)
      If V0_DIST<255 
        AmbientLight = 255 - V0_DIST
        Map(x,y)\SpritePtr\Vertice[0]\Color = RGBA(AmbientLight,AmbientLight,AmbientLight,255)
      Else
        AmbientLight = 0
        Map(x,y)\SpritePtr\Vertice[0]\Color = RGBA(AmbientLight,AmbientLight,AmbientLight,255)
      EndIf
      ;/
      V1_DIST = Distance(PointLight\x,PointLight\y,x*64+64,y*64)
      If V1_DIST<255 
        AmbientLight = 255 - V1_DIST
        Map(x,y)\SpritePtr\Vertice[1]\Color = RGBA(AmbientLight,AmbientLight,AmbientLight,255)
      Else
        AmbientLight = 0
        Map(x,y)\SpritePtr\Vertice[1]\Color = RGBA(AmbientLight,AmbientLight,AmbientLight,255)
      EndIf
      ;/
      V2_DIST = Distance(PointLight\x,PointLight\y,x*64,y*64+64)
      If V2_DIST<255 
        AmbientLight = 255 - V2_DIST
        Map(x,y)\SpritePtr\Vertice[2]\Color = RGBA(AmbientLight,AmbientLight,AmbientLight,255)
      Else
        AmbientLight = 0
        Map(x,y)\SpritePtr\Vertice[2]\Color = RGBA(AmbientLight,AmbientLight,AmbientLight,255)
      EndIf
      ;/
      V3_DIST = Distance(PointLight\x,PointLight\y,x*64+64,y*64+64)
      If V3_DIST<255 
        AmbientLight = 255 - V3_DIST
        Map(x,y)\SpritePtr\Vertice[3]\Color = RGBA(AmbientLight,AmbientLight,AmbientLight,255)
      Else
        AmbientLight = 0
        Map(x,y)\SpritePtr\Vertice[3]\Color = RGBA(AmbientLight,AmbientLight,AmbientLight,255)
      EndIf
      ;/
      
      
      

      
                                                                     
     DisplaySprite3D(Map(x,y)\Sprite3DID,x*64,y*64)
    Next
  Next
  
  Stop3D()
  
  
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Outlined)
  Circle(PointLight\x-3,PointLight\y-3,6,RGB(255,0,0))
  
  StopDrawing()
  
  
  
  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Anonyme

Message par Anonyme »

ce que tu peut faire pour un faisceau, tu calcule l'écart d'angle entre les vertices et la direction point lumineux, plus l'angle se rapproche, plus le vertice est éclairer... et inversement :wink:
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :ce que tu peut faire pour un faisceau, tu calcule l'écart d'angle entre les vertices et la direction point lumineux, plus l'angle se rapproche, plus le vertice est éclairer... et inversement :wink:
Oui je vois ce que tu veux dire .... Mais je ne vois pas comment je vais faire pour la limitation du faisceau lorsque tu t'approche d'un objet ou d'un mur.

File:1->Aliens_Invasion.zip
Image

voici la dernière version. J'utilise pour l'instant toutjours la même téchnique.J'ai inclu les sources si ça amuse certain.
La partit s'occupant de l'affichage de la map est dans le fichier
mapengine, et la procedure concerné est RenderMap()
le faisceau lumineu lui est rendu pas la procedure LightEngine()


F2 pour changer de mode
-mode Normal
-mode sans éclairage
-mode masque d'éclairage

Tab pour changer de personnage

les fleches et la souris pour ce promener

2 faisceaux lumineux le FPS chutte (c'est normal mais bon, si une autre technique est probante je l'utiliserais, sinon faut que j'essaye de l'optimisé un peu plus)
Anonyme

Message par Anonyme »

Oui je vois ce que tu veux dire .... Mais je ne vois pas comment je vais faire pour la limitation du faisceau lorsque tu t'approche d'un objet ou d'un mur.

Ce qu'il faut faire dans ce cas, c'est des lancer de rayons à partir de la lumière, mais cela devient tendu à mettre en place, un système d'octree ferais bien l'affaire, mais j'ai pas trop le temps de mettre un tel systeme en place
:?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit : Ce qu'il faut faire dans ce cas, c'est des lancer de rayons à partir de la lumière, mais cela devient tendu à mettre en place, un système d'octree ferais bien l'affaire, mais j'ai pas trop le temps de mettre un tel systeme en place
:?
octree heu ....c'est quoi ça ? je crois que j'ai déjà entendu comtois en parler.
T'inquiète pas si tu n'as pas le temps, tampis, je vais essayer de regarder et sinon ba.... je verrais :p
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :Non, regarde le code plus bas.
En revanche c'est une lumiere omnidirectionnelle, je te laisse le plaisir de le faire pour un faisceau d'une torche ^^
je sais pas comment je me suis débrouiller j'avais pas vu ton poste avec le code.(tu as du le poster pendant quej'écrivais mon poste) L'effet est tres sympa... je vais le regarder de plus prêt et je comprends mieux ce que tu disais...

EDIT: waaaaaou...heu...j'ai rien compris a la première lecture, mais je me replonge dedans merci en tout cas
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

@Cpl.Bator

je crois que j'ai compris. En verite tu change la transparence du sprite constituant la map en fonction de la position de la source lumineuse...

C'est tres intelligent ... Genre de chose que je suis incapable de faire tout seul:( . Maintenant si tu as plusieurs sources lumineuse, c'est pas evident. Et encore plus si il s'agit d'un cone de lumièce representant une lampe torche non ?
Je retourne l'étudier...
Anonyme

Message par Anonyme »

ce n'est pas la transparence qui change, mais la couleur, l'alpha reste a 255
RGBA(AmbientLight,AmbientLight,AmbientLight,255)
si tu as plusieurs source lumineuse, tu stock toute les lumières dans une liste chainée structurée, puis tu calcules toutes les valeurs des vertices en fonction de toute les lumières, pour un cone lumineux, tu rajoute une valeur de direction à ta lumiere, puis tu calcule l'ecart de l'angle entre le vertex et la source lumineuse, plus l'ecart et proche de la direction de ta lumiere , plus le vertice est éclairer, et inversement.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :ce n'est pas la transparence qui change, mais la couleur, l'alpha reste a 255
RGBA(AmbientLight,AmbientLight,AmbientLight,255)
si tu as plusieurs source lumineuse, tu stock toute les lumières dans une liste chainée structurée, puis tu calcules toutes les valeurs des vertices en fonction de toute les lumières, pour un cone lumineux, tu rajoute une valeur de direction à ta lumiere, puis tu calcule l'ecart de l'angle entre le vertex et la source lumineuse, plus l'ecart et proche de la direction de ta lumiere , plus le vertice est éclairer, et inversement.
waaaaaaaaaooooo et ça a l'air si simple quand tu dis ça lolllll
Heuu.... combien tu me prendrais pour m'aider a réécrire le moteur ? :wink:
Ou bien tu me prête ton cerveau une journée ou deux ?lollllllll
Je crois que tu as trouvé la solution mais je suis largué
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

juste pour info, en 2D tu as besoin d'un quadtree pas d'un octree
voir ici http://www.purebasic.fr/french/viewtopic.php?t=6264

[EDIT]
@Cpl.Bator

Oui très sympa ton effet :)
Dernière modification par comtois le dim. 25/févr./2007 11:59, modifié 1 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

@Cpl.Bator
Sympa l'effet! Je me pencherai dessus quand j'aurais du temps ^_^

Dri
Anonyme

Message par Anonyme »

waaaaaaaaaooooo et ça a l'air si simple quand tu dis ça lolllll
Heuu.... combien tu me prendrais pour m'aider a réécrire le moteur ? Wink
Ou bien tu me prête ton cerveau une journée ou deux ?lollllllll
Je crois que tu as trouvé la solution mais je suis largué
tu ne feras pas grand chose avec ma p'tite cervelle ^^

@Comtois , merci de la précision.


@Typhoon

Tu peut reprendre le code complexe de comtois ^^ puis l'adapté à tes besoin
1 case grise = 1 case illuminé, tu peut alors déterminer la distance entre ton point lumineux et les vertices de la case, puis d'affecter la luminosité.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :
tu ne feras pas grand chose avec ma p'tite cervelle ^^
Toujours plus qu'avec la mienne lolllllll
Cpl.Bator a écrit : @Comtois , merci de la précision.
Oui merci le code est interessant
Cpl.Bator a écrit : Tu peut reprendre le code complexe de comtois ^^ puis l'adapté à tes besoin
1 case grise = 1 case illuminé, tu peut alors déterminer la distance entre ton point lumineux et les vertices de la case, puis d'affecter la luminosité.
:oops: [/quote]
c'est un peu ce que j'essayais de faire mais je nage, je nage. Sans compter que je ne sais pas comme intégré les obstacles surtout si il ne sont pas précis a la case car dans un sprite de 32x32 j'ai parfois des murs a 45° et parfois il s'agit d'un cylindre il ne faut pas donc que le faiseau s'arrête de façon carré ... j'aurais de l'argent je vous embaucherais pour me donner un coup de main lolllllllll
Ces codes sont tres interessant mais je vois mes limites... :? Mais j'y retourne quand même au cas ou j'aurais un déclic
Répondre