Isometrische 2D Spiele-Engine

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Isometrische 2D Spiele-Engine

Beitrag 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?).
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Isometrische 2D Spiele-Engine

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

Re: Isometrische 2D Spiele-Engine

Beitrag 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)?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Isometrische 2D Spiele-Engine

Beitrag 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.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Isometrische 2D Spiele-Engine

Beitrag 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
Zuletzt geändert von Mijikai am 24.02.2019 21:08, insgesamt 3-mal geändert.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Isometrische 2D Spiele-Engine

Beitrag 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
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Isometrische 2D Spiele-Engine

Beitrag von diceman »

Respektable Leistung, so far. :allright:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Isometrische 2D Spiele-Engine

Beitrag 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.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Isometrische 2D Spiele-Engine

Beitrag 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
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Isometrische 2D Spiele-Engine

Beitrag 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.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Antworten