Wrapperlib für Grim2D

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Wrapperlib für Grim2D

Beitrag von Deeem2031 »

Ich habe gestern eine DirectX8 2D-Engine gefunden ( http://grim.10tons.org/ ) und hab mal versucht die in PB zum laufen zu bringen, kann ja nicht so schwer sein... War dann aber doch bisl komplizierter, hab über 10 Stunden gebraucht um ein lauffähiges Beispiel in PB zu starten.
Und damit nicht jeder daran verzweifelt, hab ich für die Lib einen Wrapper geschrieben. Dadurch kann man dann die Funktionen mit Grim_...(...) aufrufen (z.B. Grim_System_Initiate()), nur bei Grim_System_GetState() muss man aufpassen was zurückgegeben wird, bei String oder Float wird nämlich der Pointer dazu zurückgegeben:

Code: Alles auswählen

Debug PeekF(Grim_System_GetState(#grSTATE_FONTSCALE))
Debug PeekS(Grim_System_GetState(#grSTATE_TITLE))
Vielleicht erstell ich auch noch eine Resident für die Konstanten, so viele sind das ja nicht.. (Erledigt!)

Hier gibts die Lib: http://www.purearea.net/pb/showcase/sho ... p=0&sort=1 (oder auch direkt: http://www.deeem2031.de/GrimWrapper.zip )

Und noch ein kleines BeispielProggy (Nachbau des 1. Tutorials von Grim)

Code: Alles auswählen

Procedure FrameProc()
  If Grim_Key_Down(#DIK_ESCAPE)
    ProcedureReturn #False
  EndIf
  ProcedureReturn #True
EndProcedure

If OpenLibrary(0,"c:\purebasic\compilers\grim.dll")
  Grim_GetInterface(0,"c:\purebasic\compilers\grim.dll")
  
  Grim_System_SetState(#grSTATE_FRAMEFUNC,@FrameProc())
  Grim_System_SetState(#grSTATE_WINDOWED,#True)
  Grim_System_SetState(#grSTATE_KEYBOARD,#True)  
  
  Grim_System_Initiate()
  Grim_System_Start()
  
  Grim_System_Shutdown()
  Grim_Inferface_Release()
  
  CloseLibrary(0)
EndIf
[EDIT] Die Resident ist jetzt auch mit drin.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Wers schon getestet hat: Hab 2 kleine Bugs (mit Grim_System_SetState() und Grim_Quads_SetRotation()) gefunden, sind jetzt behoben.

Und hier noch die Übersetzung des 3. Tutorials:

Code: Alles auswählen

Procedure FrameFunc()
  Static time.f
  
  tex_id.l = Grim_Texture_Get("rendertarget")
  
	; now let's set the texture as render target
	If Grim_System_SetRenderTarget(tex_id) = #False
		MessageRequester("Message","Failed To set render target!")
    ProcedureReturn #False
  EndIf
  
  ; now if succeeded all the quads are drawn into the
  ; TEXTURE. let's render text with random color:
  r.f = Random(100) * 0.01
  g.f = Random(100) * 0.01
  b.f = Random(100) * 0.01
  Grim_Quads_SetColor(r, g, b, 1)
  ; set the text size To 100% of the bitmap pixel size
  Grim_System_SetState(#grSTATE_FONTSCALE, 1.0);
  Grim_Quads_RenderText(Random(256), Random(256), "Grim")
  
  ; calling the funtion with parameter -1 (Default
  ; parameter) sets the target back To screen Buffer.
  Grim_System_SetRenderTarget();
  
  ; now clear the screen to white
  Grim_System_ClearScreen(1,1,1,0);
  
  Grim_Quads_SetSubset(0,0,1,1);
  Grim_Quads_SetColor(1,1,1,1);
  
  ; let's set the render target texture as current texture
  Grim_Texture_Set(tex_id);
  
  ; let's draw couple of them on screen
  Grim_Quads_Begin();
  ; rotate 45 degrees For artistic impression =)
  Grim_Quads_SetRotation(3.141 / 4);
  Grim_Quads_Draw(100,100,256,256);
  Grim_Quads_SetRotation(3.141 / 3);
  Grim_Quads_Draw(300,300,256,256);
  Grim_Quads_End();
  
  If Grim_Key_Down(#DIK_ESCAPE)
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure


If OpenLibrary(0,"c:\purebasic\compilers\grim.dll")
  If Grim_GetInterface(0,"c:\purebasic\compilers\grim.dll")
    
    ; this time we use the Default config box to set up
    ; screen mode and stuff.
    If Grim_System_InvokeConfig() = #False
      ; user chose "Exit" from the dialog, so by all
      ; means let's exit..
      Grim_Inferface_Release()
      End
    EndIf
    
    ; User chose "Run". The states grSTATE_WINDOWED, 
    ; grSTATE_SCREENBPP/WIDTH/HEIGHT are now set for us.
    
    ; set the window title
    Grim_System_SetState(#grSTATE_TITLE, "Grim tut 03 - Render Target: Texture");
    Grim_System_SetState(#grSTATE_KEYBOARD, #True);
    Grim_System_SetState(#grSTATE_FRAMEFUNC, @FrameFunc());
    
    
    ; some system states have to be set before call 
    ; to Initiate(), some  after
    Grim_System_Initiate()
    
    If Grim_Texture_Create("rendertarget", 256, 256) = #False
      
      cout.s + Grim_System_GetErrorMessage() + #CRLF$
      cout + "Render target texture creation failed."
      cout + "Your display adapter might not support render"
      cout + "target texs or you might be out of tex memory."  + #CRLF$
      MessageRequester("Message",cout)
    EndIf
    
    tex_id.l = Grim_Texture_Get("rendertarget")
    
    ; now let's set the texture as render target
    If Grim_System_SetRenderTarget(tex_id) = #False
      MessageRequester("Message","Failed to set render target!")
    EndIf
      
    ; clear the TEXTURE to black
    Grim_System_ClearScreen(0,0,0,0)
    
    ; set the target back to screen buffer:
    Grim_System_SetRenderTarget();
    Grim_System_Start()
    
    Grim_System_Shutdown()
    Grim_Inferface_Release()
  EndIf
  CloseLibrary(0)
EndIf
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Funktioniert die Engine nur mit DirectX8? Das wäre sehr schade, da
ihc mit DirectX so gut wie nichts anfangen kann :(.
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Du brauchst doch DirectX nicht verstehen, das macht doch die Engine für dich ..?!
Guck dir am besten die beiden Beispiele an, die Engine ist echt simpel. Dafür ist sie allerdings auch nicht gerade umfangreich. Aber es gibt schon ein komerzielles Spiel (von den gleichen Entwicklern) welches die Engine benutzt. Paar Screenshots findet ihr dort: http://crimsonland.reflexive.com/crimso ... creenshots
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten