InitEngine3D(): Ungültiger Speicherzugriff

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

InitEngine3D(): Ungültiger Speicherzugriff

Beitrag 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
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: InitEngine3D(): Ungültiger Speicherzugriff

Beitrag von DarkDragon »

Du brauchst libXxf86vm ;-) und dann musst du das OpenGL Subsystem benutzen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: InitEngine3D(): Ungültiger Speicherzugriff

Beitrag 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
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: InitEngine3D(): Ungültiger Speicherzugriff

Beitrag von DarkDragon »

Wo ist dein RenderWorld()? Nur danach darfst du mit den 2D Operationen arbeiten. :wink:
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: InitEngine3D(): Ungültiger Speicherzugriff

Beitrag 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.
Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: InitEngine3D(): Ungültiger Speicherzugriff

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: InitEngine3D(): Ungültiger Speicherzugriff

Beitrag 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:
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: InitEngine3D(): Ungültiger Speicherzugriff

Beitrag 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
Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: InitEngine3D(): Ungültiger Speicherzugriff

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: InitEngine3D(): Ungültiger Speicherzugriff

Beitrag 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
Bild
Antworten