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

Code: Alles auswählen

Ungültiger Speicherzugriff
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 :allright: 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. :wink:

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. :allright:
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. :allright:
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.
:lol:

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
TheCreepyProgramer hat geschrieben: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
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