Je voulais pouvoir avoir un sol qui ne soit pas uniforme si j'utilise des bytes alors il faut que je marche par case...passe ou passe pas. Mais peut être que j'y arriverait !
Oui c'est un peu prêt ça ! J'ai pas essayer pour les Sprite3D mais si tu retrouve quelques choses n'hesite pas...peut être que ça me donner des idées
Bon voici le code que j'ai fait...ça marche super lentement...et je suis pas vraiment satisfait du rendu...mais si vous savez comment optimiser tout ça et améliorer le rendu je suis preneur. Dans mon idée de depart je voulais en même temps faire un bump-mapping pour améliorer l'effet d'optique mais je crois queje peu abandonner. voilà
ce n'est peut être pas assez documenté. si vous avez des questions n'hesitez pas
Code : Tout sélectionner
InitSprite()
InitKeyboard()
OpenScreen(800,600,32,"")
UsePNGImageDecoder()
LoadImage(1,"image.png")
CreateImage(2,800,600,32)
Global Dim Image(800,600)
Global Dim LightMask(800,600)
Global Dim Mask(800,600)
Global Dim ImageFinal(800,600)
Procedure ImageToTable(Image, Table) ; Retourne 1 si l'image a été chargée dans le tableau ImageID=#Image : Table=@Tableau(), ex : Dim Tableau(ImageWidth(), ImageHeight()) -> @Tableau()
If Image>=0 And Table
ImageID = ImageID (Image)
Hdc = CreateCompatibleDC_ ( GetDC_ ( ImageID ))
If HDC
bmi.BITMAPINFO
bm.BITMAP
GetObject_ ( ImageID , SizeOf(BITMAP), @bm.BITMAP)
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiheader\biWidth = bm\bmWidth
bmi\bmiheader\biHeight = bm\bmHeight
bmi\bmiheader\biPlanes = 1
bmi\bmiheader\biBitCount = 32
bmi\bmiheader\biCompression = #BI_RGB
HList = AllocateMemory (bm\bmWidth*bm\bmHeight*4)
GetDIBits_ (hDC, ImageID ,0,bm\bmHeight,HList,bmi, #DIB_RGB_COLORS )
For nn = 0 To bm\bmWidth - 1
For n = 0 To bm\bmHeight - 1
s = HList + nn * 4 + (bm\bmHeight - 1 - n) * bm\bmWidth * 4
d = Table + n * 4 + nn * bm\bmHeight * 4
CopyMemory (s + 2, d, 1)
CopyMemory (s + 1, d + 1, 1)
CopyMemory (s, d + 2, 1)
Next n
Table+4
Next nn
FreeMemory (HList)
Else
ProcedureReturn
EndIf
ProcedureReturn 1
EndIf
EndProcedure
Procedure TableToImage(Image, Table) ; Crée une image à partir du tableau Image=#Image, Table=@Tableau(), ex : Dim Tableau(ImageWidth(),ImageHeight()) -> @Tableau()
If IsImage (Image) And Table
ImageID = ImageID (Image)
bm.BITMAP
GetObject_ ( ImageID , SizeOf(BITMAP), @bm.BITMAP)
bmi.BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiheader\biWidth = bm\bmWidth
bmi\bmiheader\biHeight = bm\bmHeight
bmi\bmiheader\biPlanes = 1
bmi\bmiheader\biBitCount = 32
bmi\bmiheader\biCompression = #BI_RGB
pixel= AllocateMemory (bm\bmHeight*bm\bmWidth*4)
For nn = 0 To bm\bmwidth - 1
For n = 0 To bm\bmheight - 1
s = Table + n * 4 + nn * bm\bmHeight * 4
d = pixel + nn * 4 + (bm\bmHeight - 1 - n) * bm\bmWidth * 4
CopyMemory (s, d + 2, 1)
CopyMemory (s + 1, d + 1, 1)
CopyMemory (s + 2, d, 1)
Next
table + 4
Next
HDC= StartDrawing ( ImageOutput (Image))
SetDIBits_ (HDC, ImageID ,0, ImageHeight (Image), pixel, bmi, #DIB_RGB_COLORS )
StopDrawing ()
FreeMemory (pixel)
ProcedureReturn 1
EndIf
EndProcedure
Procedure Light(LightX.l,LightY.l,Angle.l,Anglef.l,Puissance.l,Color.l)
StartDrawing(ScreenOutput())
For i = -Anglef To Anglef
For p = 0 To Puissance
X = LightX + P * Cos( (i/2+Angle) *2*3.1415/360)
Y = LightY + P * Sin((i/2+Angle) *2*3.1415/360)
lightlevel=((Puissance-p)*255/Puissance+(255*(Anglef/2-Abs(i))/Anglef/2))/2;ça donne la forme de la luminosité
;lightlevel=(Puissance-p)*255/Puissance
red=lightlevel*Red(Color)/255
green=lightlevel*Green(Color)/255
blue=lightlevel*Blue(Color)/255
;LightMask(X,Y)=RGB(red,green,blue)
If X>0 And X<800 And Y>0 And Y<600
If LightMask(X,Y)>1
LightMask(X,Y)=RGB((Red(LightMask(X,Y))+lightlevel),(Green(LightMask(X,Y))+lightlevel),(Blue(LightMask(X,Y))+lightlevel))
If LightMask(X,Y)>RGB(255,255,255):LightMask(X,Y)=RGB(255,255,255):EndIf
Else
LightMask(X,Y)=RGB(lightlevel,lightlevel,lightlevel)
EndIf
EndIf
;On verfie maintenant si quelques choses est sur le chemin du rayon
Color = Mask(X,Y)
If Color>1: Goto nextAngle: :EndIf ; si c'est le cas on arrête le rayon et on passe au suivant
Next p
nextAngle:
Next i
StopDrawing()
EndProcedure
;Fusion des masks sur le buffer
Procedure Display()
For zx=0 To 800
For zy=0 To 600
Light=LightMask(zx,zy);luminosité et couleur de la pixel
If Light>1
col=Image(zx,zy); couleur du decore
red=Int(Red(col)*Red(Light)/255)
green=Int(Green(col)*Red(Light)/255)
blue=Int(Blue(col)*Red(Light)/255)
col=RGB(red,green,blue)
ImageFinal(zx,zy)=col
LightMask(zx,zy)=0
Else
ImageFinal(zx,zy)=0
EndIf
Next
Next
EndProcedure
ImageToTable(1,Image()) ; Le decor
Repeat
ExamineKeyboard() :
Light(320,300,A,30,280,RGB(255,255,255))
Light(400,250,-A,60,150,RGB(255,255,255))
Display()
A=A+10
If A>360:A=0:EndIf
TableToImage(2,ImageFinal())
If Val(FormatDate("%ss", Date()))=sek
FPS+1
Else
FPS$=Str(FPS)
FPS=0
EndIf
sek=Val(FormatDate("%ss", Date()))
StartDrawing(ScreenOutput())
DrawImage(ImageID(2), 0, 0)
DrawingMode(1)
FrontColor(RGB(255,255,255))
DrawText(320,1,"FPS: "+FPS$)
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)