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.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.
RAS LE BOL DES LIMITIATIONS DES SPRITES ...
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 ^^
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)
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.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
File:1->Aliens_Invasion.zip

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)
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

octree heu ....c'est quoi ça ? je crois que j'ai déjà entendu comtois en parler.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
T'inquiète pas si tu n'as pas le temps, tampis, je vais essayer de regarder et sinon ba.... je verrais :p
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...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 ^^
EDIT: waaaaaou...heu...j'ai rien compris a la première lecture, mais je me replonge dedans merci en tout cas
@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...
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...
ce n'est pas la transparence qui change, mais la couleur, l'alpha reste a 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.RGBA(AmbientLight,AmbientLight,AmbientLight,255)
waaaaaaaaaooooo et ça a l'air si simple quand tu dis ça lolllllCpl.Bator a écrit :ce n'est pas la transparence qui change, mais la couleur, l'alpha reste a 255si 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.RGBA(AmbientLight,AmbientLight,AmbientLight,255)
Heuu.... combien tu me prendrais pour m'aider a réécrire le moteur ?

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é
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
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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tu ne feras pas grand chose avec ma p'tite cervelle ^^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 , 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é.
Toujours plus qu'avec la mienne lolllllllCpl.Bator a écrit :
tu ne feras pas grand chose avec ma p'tite cervelle ^^
Oui merci le code est interessantCpl.Bator a écrit : @Comtois , merci de la précision.
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é.

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...
