wollte schon nen neuen Thread öffnen, dachte mir aber das passt hier genauso gut rein. Da ihr schon geschrieben habt man könne seine eigene Engine proggen.
Hab den Code aus dem "Racingtest" Codebeispiel von Purebasic.de "rausgeschweißt".
Läuft auch soweit nur wenn man sich bewegt werden einige Sprites falsch transformiert...
Um den Code zu test solltet ihr euch bidde die Daten von Purebasic.de runterladen und den Code dann einfach in den Ordner einsetzen.
Code: Alles auswählen
;*******************************************************************
;* *
;* StreetRace by Scarabol\2006 (E-Mail: Scarabol@web.de) *
;* *
;* Tested with Windows XP *
;* Compiled with PureBasic 4.00 *
;* *
;*******************************************************************
#ERRMSG="Error"
Global fullscreen.b
Macro RGB(Red, Green, Blue)
Red + Green*256 + Blue*65536
EndMacro
If InitSprite()=0
MessageRequester(#ERRMSG,"Could not initialize DirectDraw",0):End
EndIf
If InitSprite3D()=0
MessageRequester(#ERRMSG,"Could not initialize Direct3D",0):End
EndIf
If InitKeyboard()=0
MessageRequester(#ERRMSG,"Could not initialize Keyboard",0):End
EndIf
If InitSound()=0
MessageRequester(#ERRMSG,"Could not initialize Sound",0):End
EndIf
If fullscreen
If InitMovie()=0
MessageRequester(#ERRMSG,"Could not initialize Music",0):End
EndIf
EndIf
UsePNGImageDecoder()
UseJPEGImageDecoder()
#SX=640
#SY=480
#MAXGFX=28
#VIEWPOINT=300
#BGMFILE="bgm.mp3"
#MAXLENK=0.0275
Global mapname.s
Global trees.b,bgmloaded.b,mp3found.b,billboardsactive.b,lastmp3.w,Debugy.b
Global fps.w,fpstemp.w,maxfps.w,avgfps.w
Global xan.f,yan.f,zan.f,Pspeed.f
Global mapx.w,mapy.w,startx.w,starty.w,view.b,steering.b
Global sichtweite.f
Global gridx.w,gridy.w,steering.b,crashready.b,coll_L.b,coll_M.b,coll_R.b
Global gridxl.w,gridyl.w,gridxr.w,gridyr.w
Global lenkeinschlag.f,lenkung.f,x.f,y.f,z.f,framelimit.b
billboardsactive=1
sichtweite=25
mp3found=0
gridx=0
gridy=0
framelimit=60
Debugy=0
degree.f=1.5 ;für Neigung der Strecke
crashready=100
coll_L=0
coll_M=0
coll_R=0
mapname="track.mkt"
Structure Tvektor
x.f
y.f
z.f
id.w
EndStructure
Structure Szbuffer
i.w
j.w
z.f
xs.f
ys.f
EndStructure
Procedure loadgfx(sprnum.w,path.s,type.l)
If LoadSprite(sprnum,path,type)=0
MessageRequester(#ERRMSG,"Error while loading sprite <"+path+">",0):End
EndIf
If type=#PB_Sprite_Texture
If CreateSprite3D(sprnum,sprnum)=0
MessageRequester(#ERRMSG,"Error while creating texture <"+path+">",0):End
EndIf
EndIf
EndProcedure
Procedure loadJPEGgfx(sprnum.w,path.s,type.l)
If LoadSprite(sprnum,path,type)=0
MessageRequester(#ERRMSG,"Error while loading sprite <"+path+">",0):End
EndIf
If type=#PB_Sprite_Texture
If CreateSprite3D(sprnum,sprnum)=0
MessageRequester(#ERRMSG,"Error while creating texture <"+path+">",0):End
EndIf
EndIf
EndProcedure
Procedure fps()
Repeat
Delay(1000)
fps=fpstemp
avgfps=Round((avgfps+fps)/2,0)
If fps>maxfps
maxfps=fps
EndIf
fpstemp=0
ForEver
EndProcedure
Procedure.s snapshot()
GrabSprite(999,0,0,#SX,#SY)
fileS.w=0
screenS.s=""
Repeat
screenS=Str(screen_num)
If Len(screenS)=1
screenS="00"+screenS
EndIf
If Len(screenS)=2
screenS="0"+screenS
EndIf
screenS="screenshot"+screenS+".bmp"
If ReadFile(0,screenS)<>0
CloseFile(0)
Else
SaveSprite(999,screenS)
FreeSprite(999)
fileS=1
EndIf
screen_num=screen_num+1
Until fileS=1
ProcedureReturn screenS
EndProcedure
ReadFile(0,mapname) ;- Umgebung laden
;******************************************************************
mapx=ReadWord(0):mapy=ReadWord(0):startx=ReadWord(0):starty:ReadWord(0)
Dim course.b(mapx,mapy)
Dim gridOrigin.Tvektor(mapx,mapy)
Dim gridRot.Tvektor(mapx,mapy)
Dim grid3D.Tvektor(mapx,mapy)
Dim grid2D.Tvektor(mapx,mapy)
Dim gridWall.Tvektor(mapx,mapy)
Dim cx.w(4)
Dim cy.w(4)
startx=63
starty=64+2
For i=0 To mapx-1
For j=0 To mapy-1
course(i,j)=ReadByte(0)
gridOrigin(i,j)\x=i-startx;mapx/2
gridOrigin(i,j)\y=j-starty;mapx/2
gridOrigin(i,j)\z=6.0-(ValF(Str(ReadByte(0))+"."+Str(ReadByte(0))))
gridwall(i,j)\x=gridOrigin(i,j)\x
gridwall(i,j)\y=gridOrigin(i,j)\y
Next
Next
; LoadImage(0,mapname) ;- Umgebung laden
; ;******************************************************************
; mapx=ImageWidth(0)
; mapy=ImageHeight(0)
; Dim course.b(mapx,mapy)
; Dim gridOrigin.Tvektor(mapx,mapy)
; Dim gridRot.Tvektor(mapx,mapy)
; Dim grid3D.Tvektor(mapx,mapy)
; Dim grid2D.Tvektor(mapx,mapy)
; Dim gridWall.Tvektor(mapx,mapy)
; Dim cx.w(4)
; Dim cy.w(4)
;
; startx=63
; starty=64+2
;
; StartDrawing(ImageOutput(0))
; For i=0 To mapx-1
; For j=0 To mapy-1
; course(i,j)=8
; gridOrigin(i,j)\x=i-startx
; gridOrigin(i,j)\y=j-starty
; gridOrigin(i,j)\z=Red(Point(i,j))
;
; gridwall(i,j)\x=gridOrigin(i,j)\x
; gridwall(i,j)\y=gridOrigin(i,j)\y
; Next
; Next
; StopDrawing()
;
; ;******************************************************************
; FreeImage(0)
;SetRefreshRate(100)
If fullscreen
OpenScreen(#SX,#SY,16,"MK-Test")
Else
OpenWindow(1,#PB_Ignore,#PB_Ignore,640,480,"MK-Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetActiveWindow(1)
OpenWindowedScreen(WindowID(1),0,0,#SX,#SY,0,0,0)
EndIf
SetFrameRate(framelimit)
TransparentSpriteColor(#PB_Default,RGB(255,0,255))
LoadFont(0,"Impact",30)
LoadFont(1,"Arial",10)
LoadFont(2,"Arial",8)
LoadFont(3,"Arial",6)
For i=0 To #MAXGFX
nameStr.s=Str(i)
If Len(nameStr)=1
nameStr="0"+nameStr
EndIf
If i=21 Or i=22 Or i=23
loadgfx(i,"gfx/"+nameStr+".bmp",#PB_Sprite_Texture)
Else
loadJPEGgfx(i,"gfx/"+nameStr+".jpg",#PB_Sprite_Texture)
EndIf
Next
ClearScreen(0)
tid=CreateThread(@fps(),0)
Global s3dq.b
s3dq=0
Sprite3DQuality(s3dq)
;- Repeat Start
Repeat
If fullscreen=0
Event.l = WindowEvent()
EndIf
FlipBuffers()
ClearScreen(RGB(157,157,159))
;Playfield*********************************************
;******************************************************
;- Umgebung darstellen
;Vorbereiten des 3D-Grids, Ansicht ändern
For i=0 To mapx-1
For j=0 To mapy-1
gridOrigin(i,j)\y+Pspeed/10
Next
Next
For i=0 To mapx-1
For j=0 To mapy-1
; gridOrigin(i,j)\y-Pspeed/70
Next
Next
; If steering<>0
lenkeinschlag.f=(-steering)
If lenkeinschlag>#MAXLENK
lenkeinschlag=#MAXLENK
ElseIf lenkeinschlag<-#MAXLENK
lenkeinschlag=-#MAXLENK
EndIf
If Pspeed<0
lenkeinschlag=-lenkeinschlag
EndIf
If coll_R=1
; lenkeinschlag=(0.05)
EndIf
Slenk.f=Sin(lenkeinschlag)
Clenk.f=Cos(lenkeinschlag)
For i=0 To mapx-1
For j=0 To mapy-1
yt.f=gridOrigin(i,j)\y
xt.f=gridOrigin(i,j)\x
gridOrigin(i,j)\x=xt*Clenk-yt*Slenk
gridOrigin(i,j)\y=xt*Slenk+yt*Clenk
Next
Next
; Else
; EndIf
steering=0
Sdeg.f=Sin(-degree)
Cdeg.f=Cos(-degree)
For i=0 To mapx-1
For j=0 To mapy-1
z.f=gridOrigin(i,j)\z
y.f=gridOrigin(i,j)\y
grid3D(i,j)\z=y*Sdeg+z*Cdeg
If ((grid3D(i,j)\z>0) And (grid3D(i,j)\z<SICHTWEITE))
grid3D(i,j)\y=y*Cdeg-z*Sdeg
grid3D(i,j)\y=grid3D(i,j)\y-4.8
grid3D(i,j)\x=gridOrigin(i,j)\x
;Hier 2D-Ansicht in Array scrhreiben...
x1=grid3D(i,j)\x*#VIEWPOINT/grid3D(i,j)\z+(#SX/2)
y1=grid3D(i,j)\y*#VIEWPOINT/grid3D(i,j)\z+(#SY/2)
grid2D(i,j)\x=x1
grid2D(i,j)\y=y1
EndIf
Next
Next
billboards.w = 0
;Texture-View
NewList Lzbuffer.Szbuffer()
For i=0 To mapx-2
For j=0 To mapy-2
If (grid3D(i,j)\z>0 And grid3D(i,j)\z<sichtweite And course(i,j)<>0) Or (grid3D(i,j)\z>0 And grid3D(i,j)\z<sichtweite And course(i,j)=0)
x1=grid2D(i,j)\x
y1=grid2D(i,j)\y
x2=grid2D(i+1,j)\x
y2=grid2D(i+1,j)\y
x3=grid2D(i+1,j+1)\x
y3=grid2D(i+1,j+1)\y
x4=grid2D(i,j+1)\x
y4=grid2D(i,j+1)\y
If (x1>=0 And x1<=#SX And y1>=0 And y1<=#SY) Or (x2>=0 And x2<=#SX And y2>=0 And y2<=#SY) Or (x3>=0 And x3<=#SX And y3>=0 And y3<=#SY) Or (x4>=0 And x4<=#SX And y4>=0 And y4<=#SY)
;Vektoren, die man nicht sieht, sollen ausgeschlossen werden
;Elemente hinzufügen, die gezeigt werden
AddElement(Lzbuffer())
Lzbuffer()\i=i
Lzbuffer()\j=j
Lzbuffer()\z=grid3D(i,j)\z
EndIf
EndIf
Next
Next
;Elemente im Z-Buffer in Array legen und sortieren
elements.w=CountList(Lzbuffer())
Dim zbuffer.Szbuffer(elements)
i=0
ResetList(Lzbuffer())
While (NextElement(Lzbuffer()))
zbuffer(i)\i=Lzbuffer()\i
zbuffer(i)\j=Lzbuffer()\j
zbuffer(i)\z=Lzbuffer()\z
i+1
Wend
ClearList(Lzbuffer())
;Z-Buffer***************************
TMPzbuffer.Szbuffer
For i=0 To elements-1
min.w=i
For j=(i+1) To elements-1
If zbuffer(min)\z<zbuffer(j)\z
min=j
EndIf
Next
TMPzbuffer\i=zbuffer(min)\i
TMPzbuffer\j=zbuffer(min)\j
TMPzbuffer\z=zbuffer(min)\z
zbuffer(min)\i=zbuffer(i)\i
zbuffer(min)\j=zbuffer(i)\j
zbuffer(min)\z=zbuffer(i)\z
zbuffer(i)\i=TMPzbuffer\i
zbuffer(i)\j=TMPzbuffer\j
zbuffer(i)\z=TMPzbuffer\z
Next
;Z-Buffer***************************
;Grafiken im Z-Buffer können jetzt ausgegeben werden
Start3D()
For i=0 To (elements-1)
x1=grid2D(zbuffer(i)\i,zbuffer(i)\j)\x
y1=grid2D(zbuffer(i)\i,zbuffer(i)\j)\y
x2=grid2D(zbuffer(i)\i+1,zbuffer(i)\j)\x
y2=grid2D(zbuffer(i)\i+1,zbuffer(i)\j)\y
x3=grid2D(zbuffer(i)\i+1,zbuffer(i)\j+1)\x
y3=grid2D(zbuffer(i)\i+1,zbuffer(i)\j+1)\y
x4=grid2D(zbuffer(i)\i,zbuffer(i)\j+1)\x
y4=grid2D(zbuffer(i)\i,zbuffer(i)\j+1)\y
If course(zbuffer(i)\i,zbuffer(i)\j)=21 Or course(zbuffer(i)\i,zbuffer(i)\j)=22 Or course(zbuffer(i)\i,zbuffer(i)\j)=23
;Hier werden die Billboards behandelt
;Untergrund zeichnen (Grass, etc.)
TransformSprite3D(0,x1,y1,x2,y2,x3,y3,x4,y4)
DisplaySprite3D(0,0,0)
If billboardsactive
billboards+1
;linken oberen Vektor finden
xs=x1
If xs>x2
x2=xs
EndIf
If xs>x3
x3=xs
EndIf
If xs>x4
x4=xs
EndIf
ys=y1
If ys>y2
y2=ys
EndIf
If ys>y3
y3=ys
EndIf
If ys>y4
y4=ys
EndIf
;Billboard zoomen und zeichnen
zx=(SpriteWidth(course(zbuffer(i)\i,zbuffer(i)\j))*5/(zbuffer(i)\z))
zy=(SpriteHeight(course(zbuffer(i)\i,zbuffer(i)\j))*5/(zbuffer(i)\z))
ZoomSprite3D(course(zbuffer(i)\i,zbuffer(i)\j),zx,zy)
DisplaySprite3D(course(zbuffer(i)\i,zbuffer(i)\j),xs-(zx/3),ys-(zy))
EndIf
Else
TransformSprite3D(course(zbuffer(i)\i,zbuffer(i)\j),x1,y1,x2,y2,x3,y3,x4,y4)
DisplaySprite3D(course(zbuffer(i)\i,zbuffer(i)\j),0,0)
EndIf
Next
Stop3D()
;Frames per Second
fpstemp+1
;Debug-Informationen
If Debugy=1
StartDrawing(ScreenOutput())
DrawingMode(1)
DrawingFont(FontID(1))
FrontColor(RGB(255,255,0))
DrawText(5,#SY-155,"Racingtest by Tomek Misztal / 2003")
DrawText(5,#SY-140,"E-Mail: tomcat128@gmx.de")
DrawText(5,#SY-125,"Compiled with PureBasic 3.51")
FrontColor(#White)
DrawText(5,#SY-110,"Texture-Quality("+Str(s3dq)+")")
If framelimit
DrawText(5,#SY-95,"Framelimit: "+Str(framelimit))
Else
DrawText(5,#SY-95,"Framelimit: no limit")
EndIf
If coll_L=1
FrontColor(#Red)
DrawText(5,#SY-80,"L:("+Str(gridxl)+","+Str(gridyl)+")")
ElseIf coll_L=2
FrontColor(#Green)
DrawText(5,#SY-80,"L:("+Str(gridxl)+","+Str(gridyl)+")")
Else
FrontColor(#White)
DrawText(5,#SY-80,"L:("+Str(gridxl)+","+Str(gridyl)+")")
EndIf
If coll_M=1
FrontColor(#Red)
DrawText(75,#SY-80,"M:("+Str(gridx)+","+Str(gridy)+")")
ElseIf coll_M=2
FrontColor(#Green)
DrawText(75,#SY-80,"M:("+Str(gridx)+","+Str(gridy)+")")
Else
FrontColor(#White)
DrawText(75,#SY-80,"M:("+Str(gridx)+","+Str(gridy)+")")
EndIf
If coll_R=1
FrontColor(#Red)
DrawText(140,#SY-80,"R:("+Str(gridxr)+","+Str(gridyr)+")")
ElseIf coll_R=2
FrontColor(#Green)
DrawText(140,#SY-80,"R:("+Str(gridxr)+","+Str(gridyr)+")")
Else
FrontColor(#White)
DrawText(140,#SY-80,"R:("+Str(gridxr)+","+Str(gridyr)+")")
EndIf
FrontColor(#White)
DrawText(5,#SY-65,"FPS (max): "+Str(fps)+ "("+Str(maxfps)+")")
DrawText(5,#SY-50,"View-Distance (-/+): "+StrF(sichtweite))
DrawText(5,#SY-35,"Z-Sorting: "+Str(elements))
DrawText(5,#SY-20,"Billboards: "+Str(billboards))
StopDrawing()
EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Add) And sichtweite<50.0
sichtweite+1
If sichtweite>50.0
sichtweite=50.0
EndIf
EndIf
If KeyboardPushed(#PB_Key_Subtract) And sichtweite>6.0
sichtweite-1
If sichtweite<6.0
sichtweite=6.0
EndIf
EndIf
If KeyboardReleased(#PB_Key_F5)
If Debugy=1
Debugy=0
Else
Debugy=1
EndIf
EndIf
If KeyboardReleased(#PB_Key_F9)
If s3dq
s3dq=0
Else
s3dq=1
EndIf
Sprite3DQuality(s3dq)
EndIf
If KeyboardReleased(#PB_Key_F12)
Snapshot()
EndIf
If KeyboardPushed(#PB_Key_Down)
Pspeed = -1
ElseIf KeyboardPushed(#PB_Key_Up)
Pspeed = 1
Else
Pspeed = 0
EndIf
;*****************************************************
;Lenkung
If (KeyboardPushed(#PB_Key_Left) And KeyboardPushed(#PB_Key_Right)=0)
steering=-1
ElseIf (KeyboardPushed(#PB_Key_Right) And KeyboardPushed(#PB_Key_Left)=0)
steering=1
Else
steering=0
EndIf
If fullscreen=0 And Event=#PB_Event_CloseWindow
exit=1
EndIf
Until KeyboardPushed(1) Or exit
KillThread(tid)
If fullscreen=0
CloseScreen()
CloseWindow(1)
EndIf
End