Es ist mein erstes in 3d, daher hab ich auch ein Beispiel als Grundlage genommen, naja, aber irgendwie geht nichts so, wie es soll:
Ich habe den ScreenRequester3d benutzt:
Code: Alles auswählen
;
; ------------------------------------------------------------
;
; PureBasic - Common 3D functions
;
; (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
Global ScreenHeight.w
Global ScreenWidth.w
#WINDOW_Screen3DRequester = 0
#GADGET_FullScreen = 1
#GADGET_Windowed = 2
#GADGET_ScreenModesLabel = 3
#GADGET_WindowedModes = 4
#GADGET_Launch = 5
#GADGET_Cancel = 6
#GADGET_Logo = 7
#GADGET_Frame = 8
#GADGET_ScreenModes = 9
Global Screen3DRequester_FullScreen, Screen3DRequester_ShowStats
Procedure Screen3DRequester()
OpenPreferences("Demos3D.prefs")
FullScreen = ReadPreferenceLong ("FullScreen" , 1)
FullScreenMode$ = ReadPreferenceString("FullScreenMode" , "640 x 480")
WindowedScreenMode$ = ReadPreferenceString("WindowedScreenMode", "512 x 384")
If OpenWindow(#WINDOW_Screen3DRequester, 0, 0, 396, 205, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_Invisible, "World Conquest - 3d")
If CreateGadgetList(WindowID())
Top = 6
ImageGadget (#GADGET_Logo, 6, Top, 0, 0, LoadImage(0,"Data\PureBasicLogo.bmp"), #PB_Image_Border) : Top+76
Frame3DGadget(#GADGET_Frame, 6, Top, 384, 80, "", 0) : Top+20
OptionGadget(#GADGET_FullScreen, 70, Top, 100, 20, "Fullscreen") : Top+25
OptionGadget(#GADGET_Windowed , 70, Top, 100, 20, "Windowed") : Top-25
ComboBoxGadget (#GADGET_ScreenModes , 190, Top, 150, 200) : Top+25
ComboBoxGadget (#GADGET_WindowedModes, 190, Top, 150, 200) : Top+45
ButtonGadget (#GADGET_Launch, 6, Top, 180, 25, "Launch", #PB_Button_Default)
ButtonGadget (#GADGET_Cancel, 200, Top, 190, 25, "Cancel")
If ExamineScreenModes()
While NextScreenMode()
Width = ScreenModeWidth()
Height = ScreenModeHeight()
If Width <> PreviousWidth Or Height <> PreviousHeight
If Depth <> 8
AddGadgetItem(#GADGET_ScreenModes, -1, Str(Width)+" x "+Str(Height))
EndIf
EndIf
PreviousWidth = Width
PreviousHeight = Height
Wend
EndIf
DesktopWidth = 1024 ; GetSystemMetrics_(#SM_CXSCREEN)
DesktopHeight = 768 ; GetSystemMetrics_(#SM_CYSCREEN)
NbScreenModes = 7
Restore WindowedScreenDimensions
Repeat
Read CurrentWidth
Read CurrentHeight
If CurrentWidth < DesktopWidth And CurrentHeight < DesktopHeight
AddGadgetItem(#GADGET_WindowedModes, -1, Str(CurrentWidth)+ " x "+Str(CurrentHeight))
NbScreenModes - 1
Else
NbScreenModes = 0
EndIf
Until NbScreenModes = 0
SetGadgetState(#GADGET_FullScreen, FullScreen)
SetGadgetState(#GADGET_Windowed , 1-FullScreen)
SetGadgetText (#GADGET_ScreenModes , FullScreenMode$)
SetGadgetText (#GADGET_WindowedModes, WindowedScreenMode$)
DisableGadget (#GADGET_ScreenModes , 1-FullScreen)
DisableGadget (#GADGET_WindowedModes, FullScreen)
HideWindow(#WINDOW_Screen3DRequester, 0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadgetID()
Case #GADGET_Launch
Quit = 2
Case #GADGET_Cancel
Quit = 1
Case #GADGET_FullScreen
DisableGadget(#GADGET_ScreenModes , 0)
DisableGadget(#GADGET_WindowedModes, 1)
Case #GADGET_Windowed
DisableGadget(#GADGET_ScreenModes , 1)
DisableGadget(#GADGET_WindowedModes, 0)
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit > 0
FullScreen = GetGadgetState(#GADGET_FullScreen)
FullScreenMode$ = GetGadgetText (#GADGET_ScreenModes)
WindowedScreenMode$ = GetGadgetText (#GADGET_WindowedModes)
CloseWindow(#WINDOW_Screen3DRequester)
EndIf
EndIf
If Quit = 2 ; Launch button has been pressed
CreatePreferences("Demos3D.prefs")
WritePreferenceLong ("FullScreen" , FullScreen)
WritePreferenceString("FullScreenMode" , FullScreenMode$)
WritePreferenceString("WindowedScreenMode", WindowedScreenMode$)
If FullScreen
ScreenMode$ = FullScreenMode$
Else
ScreenMode$ = WindowedScreenMode$
EndIf
ScreenWidth = Val(StringField(ScreenMode$, 1, " "))
ScreenHeight = Val(Right(ScreenMode$, Len(ScreenMode$)-FindString(ScreenMode$, "x", 1)-1))
Screen3DRequester_FullScreen = FullScreen ; Global variable, for the Screen3DEvents
If FullScreen
Result = OpenScreen(ScreenWidth, ScreenHeight, 32, "3D Demos")
Else
If OpenWindow(0, 0, 0, ScreenWidth, ScreenHeight+MenuHeight(), #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "PureBasic - 3D Demos")
CreateMenu(0, WindowID())
MenuTitle("Project")
MenuItem(0, "Quit")
MenuTitle("About")
MenuItem(1, "About...")
Result = OpenWindowedScreen(WindowID(), 0, 0, ScreenWidth, ScreenHeight, 0, 0, 0)
EndIf
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Procedure Screen3DEvents()
If Screen3DRequester_FullScreen = 0 ; Handle all the events relatives to the window..
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenuID()
Case 0
Quit = 1
Case 2
MessageRequester("Info", "Windowed 3D in PureBasic !", 0)
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
If Quit = 1 : End : EndIf ; Quit the app immediately
Until Event = 0
EndIf
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
Screen3DRequester_ShowStats = 1-Screen3DRequester_ShowStats ; Switch the ShowStats on/off
EndIf
EndIf
EndProcedure
Procedure Screen3DStats()
If Screen3DRequester_ShowStats
If StartDrawing(ScreenOutput())
FrontColor(255, 255, 255)
DrawingMode(1)
Locate(0, 0) : DrawText(StrF(Engine3DFrameRate(0),1)+" FPS")
Locate(0, 20) : DrawText(Str(CountRenderedTriangles())+" Triangles")
StopDrawing()
EndIf
EndIf
EndProcedure
DataSection
WindowedScreenDimensions:
Data.l 320, 240
Data.l 512, 384
Data.l 640, 480
Data.l 800, 600
Data.l 1024, 768
Data.l 1280, 1024
Data.l 1600, 1200
EndDataSection;
; ------------------------------------------------------------
;
; PureBasic - Common 3D functions
;
; (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
Global ScreenHeight.w
Global ScreenWidth.w
#WINDOW_Screen3DRequester = 0
#GADGET_FullScreen = 1
#GADGET_Windowed = 2
#GADGET_ScreenModesLabel = 3
#GADGET_WindowedModes = 4
#GADGET_Launch = 5
#GADGET_Cancel = 6
#GADGET_Logo = 7
#GADGET_Frame = 8
#GADGET_ScreenModes = 9
Global Screen3DRequester_FullScreen, Screen3DRequester_ShowStats
Procedure Screen3DRequester()
OpenPreferences("Demos3D.prefs")
FullScreen = ReadPreferenceLong ("FullScreen" , 1)
FullScreenMode$ = ReadPreferenceString("FullScreenMode" , "640 x 480")
WindowedScreenMode$ = ReadPreferenceString("WindowedScreenMode", "512 x 384")
If OpenWindow(#WINDOW_Screen3DRequester, 0, 0, 396, 205, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_Invisible, "World Conquest - 3d")
If CreateGadgetList(WindowID())
Top = 6
ImageGadget (#GADGET_Logo, 6, Top, 0, 0, LoadImage(0,"Data\PureBasicLogo.bmp"), #PB_Image_Border) : Top+76
Frame3DGadget(#GADGET_Frame, 6, Top, 384, 80, "", 0) : Top+20
OptionGadget(#GADGET_FullScreen, 70, Top, 100, 20, "Fullscreen") : Top+25
OptionGadget(#GADGET_Windowed , 70, Top, 100, 20, "Windowed") : Top-25
ComboBoxGadget (#GADGET_ScreenModes , 190, Top, 150, 200) : Top+25
ComboBoxGadget (#GADGET_WindowedModes, 190, Top, 150, 200) : Top+45
ButtonGadget (#GADGET_Launch, 6, Top, 180, 25, "Launch", #PB_Button_Default)
ButtonGadget (#GADGET_Cancel, 200, Top, 190, 25, "Cancel")
If ExamineScreenModes()
While NextScreenMode()
Width = ScreenModeWidth()
Height = ScreenModeHeight()
If Width <> PreviousWidth Or Height <> PreviousHeight
If Depth <> 8
AddGadgetItem(#GADGET_ScreenModes, -1, Str(Width)+" x "+Str(Height))
EndIf
EndIf
PreviousWidth = Width
PreviousHeight = Height
Wend
EndIf
DesktopWidth = 1024 ; GetSystemMetrics_(#SM_CXSCREEN)
DesktopHeight = 768 ; GetSystemMetrics_(#SM_CYSCREEN)
NbScreenModes = 7
Restore WindowedScreenDimensions
Repeat
Read CurrentWidth
Read CurrentHeight
If CurrentWidth < DesktopWidth And CurrentHeight < DesktopHeight
AddGadgetItem(#GADGET_WindowedModes, -1, Str(CurrentWidth)+ " x "+Str(CurrentHeight))
NbScreenModes - 1
Else
NbScreenModes = 0
EndIf
Until NbScreenModes = 0
SetGadgetState(#GADGET_FullScreen, FullScreen)
SetGadgetState(#GADGET_Windowed , 1-FullScreen)
SetGadgetText (#GADGET_ScreenModes , FullScreenMode$)
SetGadgetText (#GADGET_WindowedModes, WindowedScreenMode$)
DisableGadget (#GADGET_ScreenModes , 1-FullScreen)
DisableGadget (#GADGET_WindowedModes, FullScreen)
HideWindow(#WINDOW_Screen3DRequester, 0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadgetID()
Case #GADGET_Launch
Quit = 2
Case #GADGET_Cancel
Quit = 1
Case #GADGET_FullScreen
DisableGadget(#GADGET_ScreenModes , 0)
DisableGadget(#GADGET_WindowedModes, 1)
Case #GADGET_Windowed
DisableGadget(#GADGET_ScreenModes , 1)
DisableGadget(#GADGET_WindowedModes, 0)
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit > 0
FullScreen = GetGadgetState(#GADGET_FullScreen)
FullScreenMode$ = GetGadgetText (#GADGET_ScreenModes)
WindowedScreenMode$ = GetGadgetText (#GADGET_WindowedModes)
CloseWindow(#WINDOW_Screen3DRequester)
EndIf
EndIf
If Quit = 2 ; Launch button has been pressed
CreatePreferences("Demos3D.prefs")
WritePreferenceLong ("FullScreen" , FullScreen)
WritePreferenceString("FullScreenMode" , FullScreenMode$)
WritePreferenceString("WindowedScreenMode", WindowedScreenMode$)
If FullScreen
ScreenMode$ = FullScreenMode$
Else
ScreenMode$ = WindowedScreenMode$
EndIf
ScreenWidth = Val(StringField(ScreenMode$, 1, " "))
ScreenHeight = Val(Right(ScreenMode$, Len(ScreenMode$)-FindString(ScreenMode$, "x", 1)-1))
Screen3DRequester_FullScreen = FullScreen ; Global variable, for the Screen3DEvents
If FullScreen
Result = OpenScreen(ScreenWidth, ScreenHeight, 32, "3D Demos")
Else
If OpenWindow(0, 0, 0, ScreenWidth, ScreenHeight+MenuHeight(), #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "PureBasic - 3D Demos")
CreateMenu(0, WindowID())
MenuTitle("Project")
MenuItem(0, "Quit")
MenuTitle("About")
MenuItem(1, "About...")
Result = OpenWindowedScreen(WindowID(), 0, 0, ScreenWidth, ScreenHeight, 0, 0, 0)
EndIf
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Procedure Screen3DEvents()
If Screen3DRequester_FullScreen = 0 ; Handle all the events relatives to the window..
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenuID()
Case 0
Quit = 1
Case 2
MessageRequester("Info", "Windowed 3D in PureBasic !", 0)
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
If Quit = 1 : End : EndIf ; Quit the app immediately
Until Event = 0
EndIf
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
Screen3DRequester_ShowStats = 1-Screen3DRequester_ShowStats ; Switch the ShowStats on/off
EndIf
EndIf
EndProcedure
Procedure Screen3DStats()
If Screen3DRequester_ShowStats
If StartDrawing(ScreenOutput())
FrontColor(255, 255, 255)
DrawingMode(1)
Locate(0, 0) : DrawText(StrF(Engine3DFrameRate(0),1)+" FPS")
Locate(0, 20) : DrawText(Str(CountRenderedTriangles())+" Triangles")
StopDrawing()
EndIf
EndIf
EndProcedure
DataSection
WindowedScreenDimensions:
Data.l 320, 240
Data.l 512, 384
Data.l 640, 480
Data.l 800, 600
Data.l 1024, 768
Data.l 1280, 1024
Data.l 1600, 1200
EndDataSection
Code: Alles auswählen
#CameraSpeed = 20
#max=10
Dim marked.b(#max)
IncludeFile "Screen3DRequester.pb"
DefType.f KeyX, KeyY, MouseX, MouseY
#RobotMesh = 2
#RobotTexture = 2
Dim movX.b(#max)
Global x.b
Global frame.w
Dim movZ.b(#max)
Dim movY.b(#max)
Dim rotate.b(#max)
InitEngine3D()
Add3DArchive("3d\", #PB_3DArchive_FileSystem)
LoadImage(1,"grafic\cursor.bmp")
InitSprite()
InitSprite3D()
Sprite3DQuality(1)
InitKeyboard()
InitMouse()
;ClearScreen(0,0,0)
If Screen3DRequester()
AmbientColor(RGB(255,255,255))
UseJPEGImageDecoder()
LoadImage(10,"3d\Terrain_Texture_g.jpg")
CreateMaterial (0, LoadTexture(0, "Terrain_Texture.jpg"))
AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1)
CreateTerrain("Terrain.png", MaterialID(0), 4, 1, 4, 4)
FOV = 65
CreateLight(0, RGB(0,0,255), 400.0, 0, 0) ; Blue light
CreateLight(1, RGB(255,0,0), -100.0, 0, 0) ; Red light
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0, 500, 800, 400)
RotateCamera(0,0,-90,0)
CameraRenderMode(1,#PB_Camera_Wireframe)
CameraFOV(0,65)
SkyDome("sky.jpg",1)
LoadMesh(#RobotMesh, "Robot.mesh")
LoadTexture(#RobotTexture, "r2skin.jpg")
CreateMaterial(1,TextureID(#RobotTexture))
For x=1 To #max/2
CreateEntity(x,MeshID(#RobotMesh),MaterialID(1))
EntityLocate(x,500,10,300+x*50)
AnimateEntity(x, "Walk")
Next
For x=1 To #max/2
CreateEntity(x+#max/2,MeshID(#RobotMesh),MaterialID(1))
EntityLocate(x+#max/2,400,10,300+x*50)
AnimateEntity(x+#max/2, "Walk")
Next
For x=1 To #max
movX(x)=3
Next
;Fog(RGB(220,220,220),1,1000,1500)
FreeCamera(1)
MouseLocate(250,250)
RotateCamera(0,0,30,0)
mov=3
RotateCamera(0,90,0,0)
;MessageRequester("info","sceenhight:"+Str(ScreenHeight)+" ScreenWitdh:"+Str(ScreenWidth))
Repeat
ClearScreen(0, 0, 0)
Screen3DEvents()
frame=Engine3DFrameRate(#PB_Engine3D_Current)
For x=1 To #max
If EntityX(x)=>800 And rotate(x)<>1
RotateEntity(x,180,0,0)
movX(x)=-3
rotate(X)=1
ElseIf EntityX(x)<=250 And rotate(x) <>2
movX(x)=3
RotateEntity(x,180,0,0)
rotate(x)=2
EndIf
If TerrainHeight(EntityX(x),EntityZ(x))>EntityY(x)+1
movY(x)=3
If movX(x)>0
movX(x)=2
ElseIf movX(x)<0
movX(x)=-2
EndIf
ElseIf TerrainHeight(EntityX(x),EntityZ(x))<EntityY(x)+1
movY(x)=-3
If movX(x)>0
movX(x)=4
ElseIf movX(x)<0
movX(x)=-4
EndIf
Else
movY(x)=0
EndIf
MoveEntity(x,movX(x),movY(x),0)
Next
;LightColor(1,RGB(Random(255),Random(255),Random(255)))
ExamineMouse()
CameraLocate(0,CameraX(0),800,CameraZ(0))
KeyX=0
KeyY=0
If MouseX()=0
KeyX = -#CameraSpeed
ElseIf MouseX()>=(ScreenWidth-2)
KeyX = #CameraSpeed
EndIf
If MouseY()=0
KeyY = -#CameraSpeed
ElseIf MouseY()>=(ScreenHeight-2)
KeyY = #CameraSpeed
EndIf
ExamineKeyboard()
MouseX = 0
If KeyboardPushed(#PB_Key_Pad4)
MouseX=#CameraSpeed/2
ElseIf KeyboardPushed(#PB_Key_Pad6)
MouseX=-#CameraSpeed/2
EndIf
MouseY=0
If KeyboardPushed(#PB_Key_Pad2)
MouseY=-#CameraSpeed/2
ElseIf KeyboardPushed(#PB_Key_Pad8)
MouseY=#CameraSpeed/2
EndIf
If KeyboardPushed(#PB_Key_Up)
KeyY=-#CameraSpeed*2
ElseIf KeyboardPushed(#PB_Key_Down)
KeyY=#CameraSpeed*2
EndIf
If KeyboardPushed(#PB_Key_Left)
KeyX=-#CameraSpeed*2
ElseIf KeyboardPushed(#PB_Key_Right)
KeyX=#CameraSpeed*2
EndIf
Height.f = TerrainHeight(CameraX(0), CameraZ(0))
If MouseWheel()>0
FOV - 1 : If FOV < 20:FOV=20:EndIf
CameraFOV(0,FOV):EndIf
If MouseWheel()<0
FOV + 1 : If FOV > 160:FOV=160:EndIf
CameraFOV(0,FOV):EndIf
RotateCamera(0, MouseX, MouseY, RollZ)
MoveCamera(0, KeyX, 0, KeyY)
;RotateCamera(1, MouseX, 0, RollZ)
;MoveCamera (1, KeyX, -KeyY, 0)
RenderWorld()
Screen3DStats()
If KeyboardPushed(#PB_Key_F12)
GrabSprite(2,0,0,ScreenWidth,ScreenHeight)
SaveSprite(2,"Screenshot.bmp")
FreeSprite(2)
EndIf
If MouseButton(1)=1
If mark=0
mark=1
startX=MouseX()
startY=MouseY()
For x=1 To #max
marked(x)=0
Next
EndIf
StartDrawing(TextureOutput(0))
DrawImage(UseImage(10),0,0)
DrawingMode(4)
Box(startX,startY,MouseX()-startX,MouseY()-startY,RGB(0,255,0))
StopDrawing()
Else
mark=0
EndIf
StartDrawing(TextureOutput(0))
;DrawImage(UseImage(10),0,0)
Circle(CameraX(0),CameraZ(0),10)
StopDrawing()
StartDrawing(ScreenOutput())
;DrawImage(UseImage(1),MouseX(),MouseY())
For x=0 To 10
Line(MouseX(),MouseY(),50+x,50,RGB(0,255,0))
Line(MouseX(),MouseY(),10+x,40+x,RGB(0,255,0))
Line(MouseX(),MouseY(),40+x,10+x,RGB(0,255,0))
Next
DrawingMode(1)
FrontColor(255,255,255)
Locate(1,1)
DrawText("X:"+Str(CameraX(0)))
Locate(1,20)
DrawText("Y:"+Str(CameraY(0)))
Locate(1,40)
DrawText("Z:"+Str(CameraZ(0)))
Locate(1,60)
DrawText("MausX:"+Str(MouseX()))
Locate(1,80)
DrawText("MausY:"+Str(MouseY()))
Locate(1,100)
DrawText("FPS:"+Str(frame))
StopDrawing()
;DisplayTransparentSprite(1,MouseX(),MouseY())
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
End
Was alles nicht geht:
1.Wenn ich die Textur über die bestehende schreibe, ist sie spiegelvergehrt, weshalb die datei textur_g existiert (gespiegelt, kann aber doch nicht sein, oder?)
2.Den schwarzen Punkt habe ich eigentlich immer in der Bildschirmmmitte erwartet, es istcameraX und Z, aber der Punkt macht komisches!
3.Der Güne Einheitenmarkierkasten ist irgendwo (das hat sicher was mit cos und sin zu tun, oder), wenn man das bild dreht
4.Gibt es sowas wie entyty collision? (Um die roboter zu markieren?)
5. Mit welchem Programm kann man animierte meshes erstellen?
6.Mit wieviel fps läuft das im durschschnitt? (also bei euch)
7.Warum geht das licht nicht?
Danke Schonmal für die hilfe, vor alle in den Punkten 1-4
P.S.: Wenn lycos Probleme macht, einfach auf meiner homepage wc.rar in die adressleiste tippen (hinter mitglied.lycos.de/benpicco)
Ich überlege ernsthaft, den anbieter zu wechseln...