Seite 3 von 5

Re: Isometrische 2D Spiele-Engine

Verfasst: 28.01.2019 22:43
von Mijikai
Update:

Bin jetzt vorläufig fertig mit dem Tile Interface :mrgreen:

Für jeden Spritesheet wird ein Tile Interface erstellt.
Jedes Tile kann einzeln oder als Animation gerendert werden.
Das Start/End Frame sowie die Animationszeit kann geändert werden.
Optional kann die Animation als Oneshot abgespielt werden.
Der Animationsmodus kann geändert werden.
Alle Tiles können auch auf ein Layer gepusht werden.

Interface:

Code: Alles auswählen

;PureBasic v.5.62
Interface TILE
  TileWidth.f()
  TileHeight.f()
  TileCenterX.f()
  TileCenterY.f()
  TileResize.i(Width.f,Height.f)
  TileResetSize.i()
  Animate.i(Flag.b = -1)
  AnimateOnce.i(Flag.b = -1)
  FrameClock(Clock.i = -1)
  Frame.i()
  Frames.i()
  FrameStart.i(Index.i = -1)
  FrameEnd.i(Index.i = -1)
  FrameReset(Zero.b = #False)
  TileDraw.i(Index.i,X.f,Y.f,Center.b = #False,Alpha.a = #Null)
  TileDrawFx.i(Index.i,X.f,Y.f,Center.b = #False,Alpha.a = #Null,Angle.f = #Null,Tint.l = #Null)
  TilePushDraw(Layer.i,Index.i,X.f,Y.f,Center.b = #False,Alpha.a = #Null)
  TilePushDrawFx(Layer.i,Index.i,X.f,Y.f,Center.b = #False,Alpha.a = #Null,Angle.f = #Null,Tint.l = #Null)
  TileShape.i(Index.i,X.f,Y.f,Width.f = #Null,Height.f = #Null,Center.b = #False,Alpha.a = #Null)
  TileShapeFx.i(Index.i,X.f,Y.f,Width.f = #Null,Height.f = #Null,Center.b = #False,Alpha.a = #Null,Angle.f= #Null,Tint.l = #Null)
  TilePushShape(Layer.i,Index.i,X.f,Y.f,Width.f = #Null,Height.f = #Null,Center.b = #False,Alpha.a = #Null)
  TilePushShapeFx(Layer.i,Index.i,X.f,Y.f,Width.f = #Null,Height.f = #Null,Center.b = #False,Alpha.a = #Null,Angle.f = #Null,Tint.l = #Null)
  TileLight.i(Index.i,X.f,Y.f,Center.b = #False,Tint.l = #Null)
  TileLightFx.i(Index.i,X.f,Y.f,Center.b = #False,Angle.f = #Null,Tint.l = #Null)
  TilePushLight(Layer.i,Index.i,X.f,Y.f,Center.b = #False,Tint.l = #Null)
  TilePushLightFx(Layer.i,Index.i,X.f,Y.f,Center.b = #False,Angle.f = #Null,Tint.l = #Null)
  TileShapeLight.i(Index.i,X.f,Y.f,Width.f = #Null,Height.f = #Null,Center.b = #False,Tint.l = #Null)
  TileShapeLightFx.i(Index.i,X.f,Y.f,Width.f = #Null,Height.f = #Null,Center.b = #False,Angle.f = #Null,Tint.l = #Null)
  TilePushShapeLight(Layer.i,Index.i,X.f,Y.f,Width.f = #Null,Height.f = #Null,Center.b = #False,Tint.l = #Null)
  TilePushShapeLightFx(Layer.i,Index.i,X.f,Y.f,Width.f = #Null,Height.f = #Null,Center.b = #False,Angle.f = #Null,Tint.l = #Null)
  TileCreateCopy.i()
  Release.i()
EndInterface
Jetzt muss ich mir mal wieder Gedanken zur Anbindung der Engine an PureBasic machen.
Momentan wird der Render Context (bzw. das Hauptinterface) der Engine mit dem Fenster Handle (WindowID()) initialisiert.
Alle PureBasic Funktionen bleiben erhalten!

So wird die Engine (momentan) eingebunden:

Code: Alles auswählen

;PureBasic v.5.62
Procedure.i Main(Title.s,Width.i,Height.i,ViewWidth.i,ViewHeight.i)
  Protected Window.i
  Protected WindowHandle.i
  Protected WindowFlags.i
  Protected WindowMsg.i
  ;--------------------------
  Protected *engine.ENGINE
  ;--------------------------
  WindowFlags|#PB_Window_SystemMenu|#PB_Window_ScreenCentered
  WindowFlags|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget
  WindowFlags|#PB_Window_SizeGadget
  Window = OpenWindow(#PB_Any,#Null,#Null,Width,Height,Title,WindowFlags)
  If Window
    WindowHandle = WindowID(Window)
    *engine = EngineCreate(WindowHandle,Width,Height,30);width and height here are the viewport size! - fps can be set freely between 30 and 80!
    If *engine
      Repeat
        Repeat
          WindowMsg = WindowEvent();PureBasics message & event handling stays fully intact!
          If WindowMsg = #PB_Event_CloseWindow 
            Break 2
          EndIf 
        Until WindowMsg = #Null
        *engine\RenderBegin()
        ;------------------------------------------
        ;//draw stuff
        ;------------------------------------------
        *engine\RenderEnd()
        EndIf
        If *engine\RenderClock();game timer - with deltatime & fps 
          ;does not hog cpu like PureBasics SetFrameRate() (unusable) -> i made a bug report but so far it was not addressed!
          ;-> https://www.purebasic.fr/english/viewtopic.php?f=4&t=69315&hilit=SetFramerate
          Break
        EndIf
      ForEver
      *engine\Release();release all resources (includes all loaded sprites and tiles (spritesheets))
    EndIf
    CloseWindow(Window)
  EndIf
EndProcedure
Eventuell ist es besser Fenster mit der Engine zu erstellen als das Message-System von PureBasic umzuleiten.
Auch muss ich noch herausfinden wie ich FullScreen realisiere (#WS_POPUP + ChangeDisplaySettings_()).
Bin bei ~3000 lines of code :coderselixir:

Für Tipps und Anregungen zu FullScreen & eigenes Fenster ja/nein wäre ich dankbar (warum das PureBasic Fenster behalten?).

Re: Isometrische 2D Spiele-Engine

Verfasst: 30.01.2019 21:39
von Mijikai
Update:
Eigentlich wollte ich eine Demo zum aktuellen Stand posten...
Jetzt bastel ich wieder an den Interfaces :roll:
Momentan bekommt jedes Sprite & Tile (Objekt) ein eigenes Interface.
Das ist schön und gut - allerdings wäre es besser ein Basis-Interface zu
verteilen und nicht jedes mal ein Neues zu erzeugen.
Also altes Interface handling raus und... :coderselixir:

Re: Isometrische 2D Spiele-Engine

Verfasst: 30.01.2019 23:43
von GPI
Ich würd das PB-Fenster behalten.
Ein Grund könnte bspw. sein, das man auch ein Menü drin haben möchte...

Es braucht halt eine "dostuff"-Funktion deiner Engine, die man in die Schleife einbauen kann.

Ansonsten mach ich das mit Vollbildschirm bei mir so (Fenster wird normal mit Rahmen und allen drum und dran erzeugt und jenachdem der Rahmen deaktiviert oder aktiviert.
Ist dann zwar nur ein "Fenster-Vollbildschirm" aber immerhin.

Code: Alles auswählen

#StyleBorder=( #WS_BORDER|#WS_SIZEBOX|#WS_DLGFRAME)

StyleBorder= GetWindowLongPtr_(WindowID(win), #GWL_STYLE) & #StyleBorder
...
If config::var\FullScreen
    SetWindowLongPtr_(WindowID(win),#GWL_STYLE, GetWindowLongPtr_(WindowID(win),#GWL_STYLE) & ~#StyleBorder)
    SetWindowState(win,#PB_Window_Maximize)

  Else
    SetWindowLongPtr_(WindowID(win),#GWL_STYLE, GetWindowLongPtr_(WindowID(win),#GWL_STYLE) | #StyleBorder)
    SetWindowState(win,#PB_Window_Normal)

  EndIf  
...
Wird das eigentlich eine 2D-Engine (also flache Strukturen) oder 3D (mit Höhen)?

Re: Isometrische 2D Spiele-Engine

Verfasst: 31.01.2019 08:53
von Mijikai
GPI hat geschrieben:Ich würd das PB-Fenster behalten.
Ein Grund könnte bspw. sein, das man auch ein Menü drin haben möchte...
...
Wird das eigentlich eine 2D-Engine (also flache Strukturen) oder 3D (mit Höhen)?
Danke @GPI,
ich werde nun weiter mit den PureBasic-Fenstern arbeiten.

Alles ist flach 2D.

Re: Isometrische 2D Spiele-Engine

Verfasst: 02.02.2019 15:55
von Mijikai
Update:

Endlich ist der grafische Teil der Engine (OpenGL) soweit das getestet werden darf :D

Bild

Hatte bisher noch keine Zeit eine Anleitung für die Engine zu schreiben
aber die meisten Funktionen sind aber selbsterklärend.

Würde mich über Informationen zu eventuellen Bugs freuen :)

Beispiel Code (x86) mit Download Links:

CODE & LINKS ENTFERNT!
-> nicht mehr aktuell / relevant

Re: Isometrische 2D Spiele-Engine

Verfasst: 03.02.2019 13:01
von Mijikai
Update:
Jetzt geht es weiter mit der Kamera und dem Tile drawing (neues System).

Erste Tests:
- FPS < 60 wegen Aufnahme Software!
- Zoom schrittweise - kein Lag! (Mausrad)
Bild

Re: Isometrische 2D Spiele-Engine

Verfasst: 03.02.2019 13:42
von diceman
Respektable Leistung, so far. :allright:

Re: Isometrische 2D Spiele-Engine

Verfasst: 16.02.2019 07:33
von Mijikai
Update:

Es gibt viel zu tun :coderselixir:
Jetzt ist es möglich Lichter direkt in der Engine zu erstellen was vorher nur mit fertigen Texturen ging.
Es werden runde, quadratische und elliptische Lichter unterstützt (Radius als Switch -/0/+).

Code: Alles auswählen

CreateLight(Width.i,Height.i,LightA.a,LightB.a,Radius.f = #Null)
Das Zeichnen der einzelnen Lichter geschieht weiterhin über das Sprite Interface.

Hier noch eine Demo mit vielen animierten Lichten (Framedrops wegen Aufnahmesoftware!)

Bild
>> Bild Groß <<

Nur ein Licht unterschiedlich gerendert.

Re: Isometrische 2D Spiele-Engine

Verfasst: 24.02.2019 21:05
von Mijikai
Update:

Jetzt ist die Arbeit am grafischen Teil der Engine vorläufig beendet :D
Hab das Zeichnen nochmal komplett umgekrempelt alles basiert nun auf Textur Atlanten
was das Rendern weiter beschleunigen sollte.

Jetzt kommen (endlich) andere Dinge wie A* Pathfinding usw.
Aber jetzt spiele ich erst mal mit der Engine rum (zur Belohnung) um zu testen ob alles soweit funktioniert.

z.B.: Schrift rotiert, skaliert und eingefärbt - wird nun aus einem Atlas gerendert.
Bild

Re: Isometrische 2D Spiele-Engine

Verfasst: 18.03.2019 13:41
von diceman
Ist das mit der A*-Pfadsuche noch ein Thema? :)
Frage nur, weil ich hätte eine entsprechende Funktion vorliegen, die ich mal in Blitzbasic programmiert, und dann auch erfolgreich nach PureBasic übersetzt habe. Läuft flott und fehlerfrei. Alles was die Funktion braucht, ist ein Array vom entsprechenden Level, welches mit mit Nullen (Mauern/Hindernisse) und Einsen (frei) gefüllt ist.