Seite 1 von 2
InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 10.07.2011 11:10
von TheCreepyProgramer
Hallo,
wenn ich InitEngine3D() aufrufen will, kommt immer die Fehlermeldung
Wenn ich das Library-Subsystem auf "opengl" umstelle, kommt die Meldung:
Code: Alles auswählen
/usr/bin/ld: cannot find -lXxf86vm
collect2: ld returned 1 exit status
Code:
Code: Alles auswählen
;- Initialisierungen
InitSprite()
InitEngine3D()
window = OpenWindow(#PB_Any, 0, 0, 800, 600, #Name, #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
If window
Repeat
event = WindowEvent()
Select event
Case #PB_Event_CloseWindow
End
EndSelect
Until event = 0
EndIf
TheCreepyProgramer
Re: InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 10.07.2011 16:10
von DarkDragon
Du brauchst libXxf86vm

und dann musst du das OpenGL Subsystem benutzen.
Re: InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 10.07.2011 19:02
von TheCreepyProgramer
Ach, deswegen hat es nicht funktioniert. Danke

Aber bei mir wird jetzt bei dem Code immer nur ein komisches Flirren angezeigt:
Code: Alles auswählen
;- Initialisierungen
InitSprite()
InitKeyboard()
InitMouse()
InitEngine3D()
UsePNGImageDecoder()
hWnd = OpenWindow(#PB_Any, 0, 0, 800, 600, #Name, #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
If hWnd
hScr = OpenWindowedScreen(WindowID(hWnd), 0, 0, WindowWidth(hWnd), WindowHeight(hWnd), 1, 0, 0)
If hScr = 0
MessageRequester(#Name, "Can't initialize screen!")
End
EndIf
sMouse = LoadSprite(#PB_Any, GetPathPart(ProgramFilename())+"sprites/mouse.png")
If sMouse = 0
MessageRequester(#Name, "Failed to load "+GetPathPart(ProgramFilename())+"sprites/mouse.png!")
End
EndIf
TransparentSpriteColor(sMouse, RGB(255, 0, 255))
Repeat
Repeat
hEvent = WindowEvent()
Select hEvent
Case #PB_Event_CloseWindow
End
EndSelect
Until hEvent = 0
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
Gosub FPS
StartDrawing(ScreenOutput())
DrawText(0, 0, FPS$+" FPS", RGB(0, 255, 0), RGB(0, 0, 0))
StopDrawing()
ExamineMouse()
mouseX = MouseX()
mouseY = MouseY()
DisplayTransparentSprite(sMouse, MouseX(), MouseY())
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Escape)
End
EndIf
Delay(20)
ForEver
EndIf
FPS:
If sek = Val(FormatDate("%ss", Date()))
FPS + 1
Else
FPS$ = Str(FPS)
FPS = 0
EndIf
sek = Val(FormatDate("%ss", Date()))
Return
Re: InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 10.07.2011 19:19
von DarkDragon
Wo ist dein RenderWorld()? Nur danach darfst du mit den 2D Operationen arbeiten.

Re: InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 10.07.2011 20:14
von TheCreepyProgramer
Ach bei InitEngine3D() braucht man erst RenderWorld()? Wusste ich gar nicht. Vielen Dank.

Noch eine Frage: Wie kann ich es machen, dass ich unterschiedliche Bildschirme habe, also z.B. Startschirm, Spiel und Pause? Bei Startschirm und Pause brauche ich das RenderWorld() nicht.
Re: InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 10.07.2011 22:43
von GPI
Gosub FPS
gewöhn dir das ganz schnell ab! Goto und Gosub sind in höheren Programmiersprachen no-gos und können gerade bei größeren Projekten erhebliche Probleme verursachen.
Ist wie mit den Flugzeug - das hat auch einen Schleudersitz - aber deswegen benutzt man ihn nicht dauernt.
Re: InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 11.07.2011 07:34
von DarkDragon
TheCreepyProgramer hat geschrieben:Ach bei InitEngine3D() braucht man erst RenderWorld()? Wusste ich gar nicht. Vielen Dank.

Noch eine Frage: Wie kann ich es machen, dass ich unterschiedliche Bildschirme habe, also z.B. Startschirm, Spiel und Pause? Bei Startschirm und Pause brauche ich das RenderWorld() nicht.
Ganz einfach: du zeichnest einfach was anderes. RenderWorld brauchst du jedenfalls immer, sonst bekommst du dieses Flackern

.
Code: Alles auswählen
ClearScreen()
RenderWorld()
Select Modus
Case #STARTSCHIRM
Zeichne dies
Case #SPIEL
Zeichne jenes
...
EndSelect
FlipBuffers()
GPI hat geschrieben:Ist wie mit den Flugzeug - das hat auch einen Schleudersitz - aber deswegen benutzt man ihn nicht dauernt.

Re: InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 11.07.2011 13:58
von TheCreepyProgramer
GPI hat geschrieben:Gosub FPS
gewöhn dir das ganz schnell ab! Goto und Gosub sind in höheren Programmiersprachen no-gos und können gerade bei größeren Projekten erhebliche Probleme verursachen.
Ist wie mit den Flugzeug - das hat auch einen Schleudersitz - aber deswegen benutzt man ihn nicht dauernt.
PureBasic ist aber Basic, und keine "höhere" Programmiersprache

Aber selbst im Codearchiv steht das so drinnen:
http://www.purearea.net/pb/CodeArchiv/G ... ate/FPS.pb
Edit: Ich denke, dass es nicht im Sinne des Erfinders ist, dass jetzt der ganze Bildschirm voller roter, blauer und grüner Pixel ist.
Code: Alles auswählen
;- Initialisierungen
InitSprite()
InitKeyboard()
InitMouse()
InitEngine3D()
UsePNGImageDecoder()
Global screen = 0 ;0 = Startbildschirm, 1 = Spiel, 2 = Pause
hWnd = OpenWindow(#PB_Any, 0, 0, 800, 600, #Name, #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
If hWnd
hScr = OpenWindowedScreen(WindowID(hWnd), 0, 0, WindowWidth(hWnd), WindowHeight(hWnd), 1, 0, 0)
If hScr = 0
MessageRequester(#Name, "Can't initialize screen!")
End
EndIf
sMouse = LoadSprite(#PB_Any, GetPathPart(ProgramFilename())+"sprites/mouse.png")
If sMouse = 0
MessageRequester(#Name, "Failed to load "+GetPathPart(ProgramFilename())+"sprites/mouse.png!")
End
EndIf
TransparentSpriteColor(sMouse, RGB(255, 0, 255))
Repeat
Repeat
hEvent = WindowEvent()
Select hEvent
Case #PB_Event_CloseWindow
End
EndSelect
Until hEvent = 0
ClearScreen(RGB(0, 0, 0))
RenderWorld()
Select screen
Case 0 ;- Startbildschirm
Gosub FPS
StartDrawing(ScreenOutput())
DrawText(0, 0, FPS$+" FPS", RGB(0, 255, 0), RGB(0, 0, 0))
StopDrawing()
ExamineMouse()
mouseX = MouseX()
mouseY = MouseY()
DisplayTransparentSprite(sMouse, MouseX(), MouseY())
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Escape)
End
EndIf
EndSelect
FlipBuffers()
Delay(20)
ForEver
EndIf
FPS:
If sek = Val(FormatDate("%ss", Date()))
FPS + 1
Else
FPS$ = Str(FPS)
FPS = 0
EndIf
sek = Val(FormatDate("%ss", Date()))
Return
Re: InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 11.07.2011 20:20
von GPI
http://de.wikipedia.org/wiki/H%C3%B6her ... iersprache - Höhere Programmiersprachen sind so ziemlich alle. Ob das Beispiel in Codearchiv steht oder nicht, ist eigentlich wurscht - schlechter Programmierstiel bleibt schlechter Programmierstiel. Und PureBasic ist kein Basic. Es ist ein Mischmasch aus Basic, Assembler, C - man findet von allen Sprachen Elemente drin. Reine Basic-Varianten gibt es eigentlich gar nicht mehr. Der C64 hatte sowas...
Wie gesagt - gewöhn dir das ab - es verursacht nur Probleme. Alleine, das in Prozeduren man einen eigenen Namensraum hat, ist Gold wert und verhindert Konflikte.
Re: InitEngine3D(): Ungültiger Speicherzugriff
Verfasst: 14.07.2011 21:31
von TheCreepyProgramer
Okay, ich jetzt auch über SetFrameRate() die Framerate gesetzt, sollte also kein Problem sein, oder?
Aber etwas anderes: Bei folgendem Code kommt immer die Fehlermeldung
Das Terrain muss vor jeglicher Kamera erstellt werden
Code: Alles auswählen
;- Initialisierungen
InitSprite()
InitKeyboard()
InitMouse()
InitEngine3D()
UsePNGImageDecoder()
Global path.s = GetPathPart(ProgramFilename())
Debug path
hWnd = OpenWindow(#PB_Any, 0, 0, 800, 600, #Name, #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
If hWnd
hScr = OpenWindowedScreen(WindowID(hWnd), 0, 0, WindowWidth(hWnd), WindowHeight(hWnd), 1, 0, 0)
If hScr = 0
MessageRequester(#Name, "Can't initialize screen!")
End
EndIf
SetFrameRate(40)
sMouse = LoadSprite(#PB_Any, path+"sprites/mouse.png")
If sMouse = 0
MessageRequester(#Name, "Failed to load "+path+"sprites/mouse.png!")
End
EndIf
TransparentSpriteColor(sMouse, RGB(255, 0, 255))
;- 3D Archive
Add3DArchive("textures", #PB_3DArchive_FileSystem)
Add3DArchive("terrain", #PB_3DArchive_FileSystem)
Add3DArchive("sprites", #PB_3DArchive_FileSystem)
Repeat
Repeat
hEvent = WindowEvent()
Select hEvent
Case #PB_Event_CloseWindow
End
EndSelect
Until hEvent = 0
FrameTime = Time - ElapsedMilliseconds()
Time = ElapsedMilliseconds()
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
mat = CreateMaterial(#PB_Any, LoadTexture(100, "1_global.png"))
AddMaterialLayer(mat, LoadTexture(101, "1_detail.png"))
CreateTerrain("1.png", MaterialID(mat)) ;Hier kommt die Fehlermeldung
ucam = CreateCamera(#PB_Any, 5, 5, 100, 100)
RenderWorld()
;Wenn ich hier ein FreeCamera() einfüge, blinkt nur unten links ein kleines Bild
ForEver
EndIf