Page 1 of 4

[ENGINE] 2D Engine Nautilus (Win x86 & x64)

Posted: Sun Jun 23, 2019 1:08 pm
by Mijikai
Nautilus is a small 2D (legacy OpenGL) Engine

Features:
- Easy to use interfaces
- Animation system for tiles
- Layer support (10 layers [0 - 9] or unlimited in succession)
- Support for bitmap-fonts
- Drawing commands for primitives (box, circle, line, ...)
- OpenGL api is still access- and useable

Notes:
- Use the unicode compiler
- There is no documentation right now but most of the functions are self-explanatory

If you have questions, ideas or critique let me know :)

Current Version / Last Update:
viewtopic.php?p=563734#p563734

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Sat Jun 29, 2019 10:34 am
by Mijikai
Update: Version 0.26 beta

Added functions to create lights within the Engine.

New core function:

Code: Select all

;...
CreateLight(Width.i,Height.i)
;...
New interface:

Code: Select all

Interface NAUTILUS_LIGHT;light texture object/interface created with CreateLight()
  Point.i(X.i,Y.i,Radius.i,ColorARGB.i = $FFFFFFFF)
  PointLinear.i(X.i,Y.i,Radius.i,X1.i,Y1.i,X2.i,Y2.i,ColorARGB.i = $FFFFFFFF)
  Box.i(X.i,Y.i,Width.i,Height.i,ColorARGB.i = $FFFFFFFF)
  BoxLinear.i(X.i,Y.i,Width.i,Height.i,X1.i,Y1.i,X2.i,Y2.i,ColorARGB.i = $FFFFFFFF)
  Area.i(X.i,Y.i,RadiusX.i,RadiusY.i,ColorARGB.i = $FFFFFFFF)
  AreaLinear.i(X.i,Y.i,RadiusX.i,RadiusY.i,X1.i,Y1.i,X2.i,Y2.i,ColorARGB.i = $FFFFFFFF)
  Save.i(File.s)
  CreateAtlas.i()
  Release.i()
EndInterface

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Sat Jun 29, 2019 1:51 pm
by linkerstorm
Hi.

Just a message to thank you : this is a great job !

Keep the good work til the 1.0 relase :D

Congartulations.

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Sun Jun 30, 2019 11:36 am
by Mijikai
linkerstorm wrote:Hi.

Just a message to thank you : this is a great job !

Keep the good work til the 1.0 relase :D

Congartulations.
Thanks :)

Update: Version 0.30 beta

- Optimizations
- New Functions for Sprites & Tiles

Sprite and Tiles can now be transformed/distorted (with rotation, tint & alpha)
This for example could be used to map textures on walls in a pseudo 3D world (ex. Wolfenstein).

New Functions:

Code: Select all

Interface NAUTILUS_TILE
  ;...
  DrawMap.i(Index.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null)
  DrawMapFx.i(Index.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null,AnchorX.f = #Null,AnchorY.f = #Null,Angle.f = #Null,Tint.l = #Null)
  ;...
  DrawLightMap.i(Index.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null)
  DrawLightMapFx.i(Index.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null,AnchorX.f = #Null,AnchorY.f = #Null,Angle.f = #Null,Tint.l = #Null)
  ;...
  LayerDrawMap.i(Layer.i,Index.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null)
  LayerDrawMapFx.i(Layer.i,Index.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null,AnchorX.f = #Null,AnchorY.f = #Null,Angle.f = #Null,Tint.l = #Null)
  ;...
  LayerLightMap.i(Layer.i,Index.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null)
  LayerLightMapFx.i(Layer.i,Index.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null,AnchorX.f = #Null,AnchorY.f = #Null,Angle.f = #Null,Tint.l = #Null)
  ;...
EndInterface

Interface NAUTILUS_SPRITE
  ;...
  DrawMap.i(X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null)
  DrawMapFx.i(X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null,Angle.f = #Null,AnchorX.f = #Null,AnchorY.f = #Null,Tint.l = #Null)
  ;...
  DrawLightMap.i(X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null)
  DrawLightMapFx.i(X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null,AnchorX.f = #Null,AnchorY.f = #Null,Angle.f = #Null,Tint.l = #Null)
  ;...
  LayerDrawMap.i(Layer.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null)
  LayerDrawMapFx.i(Layer.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null,AnchorX.f = #Null,AnchorY.f = #Null,Angle.f = #Null,Tint.l = #Null)
  ;...
  LayerLightMap.i(Layer.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null)
  LayerLightMapFx.i(Layer.i,X1.f,Y1.f,X2.f,Y2.f,X3.f,Y3.f,X4.f,Y4.f,Alpha.a = #Null,AnchorX.f = #Null,AnchorY.f = #Null,Angle.f = #Null,Tint.l = #Null)
  ;...
EndInterface

Example:
Image

Code:

Code: Select all

EnableExplicit

;Nautilus Engine Example
;Version: 0.30 beta
;Author: Mijikai

XIncludeFile "nautilus.pbi"

Structure VECTOR_STRUCT
  x.f
  y.f
EndStructure

Procedure.i DrawPlant(*tile.NAUTILUS_TILE,X.f,Y.f,Distortion.f)
  *tile\DrawMap(-1,X + Distortion ,Y      ,X + 64 + Distortion,Y      ,X + 64,Y + 64,X,Y + 64)
  *tile\DrawMap(-1,X              ,Y + 64 ,X + 64             ,Y + 64 ,X + 64 + Distortion,Y + 128,X + Distortion,Y + 128)
  *tile\DrawMap(-1,X + Distortion ,Y +128 ,X + 64 + Distortion,Y + 128,X + 64,Y + 192,X,Y + 192)
EndProcedure

Procedure.i Main(Width.i,Height.i,Title.s,ViewWidth.i,ViewHeight.i,FPS.i)
  Protected win.i
  Protected win_handle.i
  Protected win_flag.i
  Protected win_msg.i
  Protected *engine.NAUTILUS_ENGINE
  Protected engine_delta.f
  Protected engine_fps.i
  Protected engine_error.i
  Protected screen_center.VECTOR_STRUCT
  Protected *atlas.NAUTILUS_ATLAS
  Protected *tile.NAUTILUS_TILE
  Protected dist.f
  Protected dist_flag.b
  win_flag|#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
  win_flag|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
  win = OpenWindow(#PB_Any,#Null,#Null,Width,Height,Title,win_flag)
  If win
    win_handle = WindowID(win)
    *engine = nautilusCreate(win_handle,ViewWidth,ViewHeight,FPS);init the engine
    If *engine
      *engine\RenderAspect()                ;keep the aspect ratio
      *engine\RenderColor($400A05)          ;change render color
      *engine\RenderFilter()
      *engine\ViewPortCenter(@screen_center);get the screen (viewport) center
      *engine\DrawTextResize(8,12)          ;set new size for standart text drawing with the ENGINE interface
      *engine\DrawTextSetSpacing(6)         ;and set the spacing between chars
      *atlas = *engine\CreateAtlas(?plant,#Null$)
      *tile  = *atlas\CreateTile(4,1,0,0,64,64)
      *tile\Animation(120,#True)
      Repeat
        Repeat
          win_msg = WindowEvent()
          If win_msg = #PB_Event_CloseWindow
            Break 2
          EndIf 
        Until win_msg = #Null
        *engine\RenderBegin(@engine_delta,@engine_fps,@engine_error)
        
        If dist_flag
          dist - 0.25 * engine_delta
          If dist < -5
            dist_flag = #False
          EndIf
        Else
          dist + 0.25 * engine_delta
          If dist > 5
            dist_flag = #True
          EndIf
        EndIf 
        DrawPlant(*tile,120,100,dist)
        DrawPlant(*tile,220,100,dist)
        DrawPlant(*tile,320,100,dist)
        DrawPlant(*tile,420,100,dist)
        *engine\DrawText(10,10,"Nautilus Engine",#False,#False,200,$FFDFBF)
        *engine\DrawText(10,25,"FPS " + Str(engine_fps),#False,#False,200,$FFDFBF)
        *engine\DrawText(10,40,"DLT " + StrF(engine_delta,2),#False,#False,200,$FFDFBF)
        *engine\RenderEnd()
        If engine_error
          Break
        EndIf 
      ForEver
      *engine\Release()
    EndIf 
    CloseWindow(win)
  EndIf
EndProcedure

Main(1080,720,"Example Nautilu Engine v.0.30 beta",600,400,30)

End

DataSection
  plant:
  ;{ File: plant.png - Size: 1265 Bytes
  !dw 05089h, 0474Eh, 00A0Dh, 00A1Ah, 00000h, 00D00h, 04849h, 05244h, 00000h, 00001h, 00000h, 04000h, 00208h, 00000h, 07A00h, 03E3Fh, 000E9h, 00000h, 07406h, 04E52h, 00053h, 00000h, 00000h, 06E00h, 007A6h, 00091h, 00000h, 07009h, 05948h, 00073h, 00E00h, 000C4h, 00E00h, 001C4h, 02B95h, 01B0Eh, 00000h, 09104h, 04449h, 05441h
  !dw 0DA78h, 09CEDh, 06E3Dh, 0311Bh, 08510h, 0C5E5h, 05222h, 0C290h, 0D406h, 08545h, 01700h, 00F86h, 052A1h, 001A5h, 0425Fh, 0D077h, 07419h, 05D07h, 080C2h, 0974Bh, 0443Eh, 0C290h, 00B80h, 08155h, 0A4E0h, 00AF2h, 038D8h, 00829h, 00410h, 0E5C9h, 067F2h, 0CB86h, 0DEB5h, 059D7h, 09612h, 0338Fh, 0C8F3h, 01FD9h, 0C5EFh, 09484h
  !dw 087EBh, 0D3BBh, 03FCFh, 0CFF2h, 0DF2Fh, 07DBFh, 0B7BCh, 0D7D5h, 0E3FAh, 06DBDh, 0CD8Fh, 0F6F4h, 0E5EAh, 071FEh, 03052h, 07FD0h, 0FA6Eh, 009ABh, 06700h, 00C0Ch, 06000h, 00000h, 00060h, 06000h, 00000h, 00060h, 06000h, 00000h, 08060h, 05912h, 0D7EEh, 0FDCBh, 0991Ah, 0E703h, 08068h, 04BF2h, 0FE1Fh, 054FCh, 0C806h, 0CB99h
  !dw 0B1DEh, 00FE4h, 0375Eh, 0654Fh, 006DAh, 03FA5h, 015BAh, 0F2A1h, 0A74Ch, 00698h, 04CDFh, 078C6h, 06C64h, 0457Dh, 08FE9h, 0CFABh, 0542Ah, 050E2h, 0F099h, 0D719h, 01BF1h, 02BEDh, 03F6Eh, 093BBh, 01D64h, 0F437h, 03873h, 0448Dh, 03576h, 0C98Ah, 0C2ABh, 0FDDCh, 0C94Fh, 0AE1Bh, 0985Bh, 05798h, 04397h, 0BB42h, 0BE3Eh, 0742Eh
  !dw 07BBCh, 03591h, 095B6h, 08663h, 08279h, 09BDEh, 05500h, 05B8Fh, 0FC92h, 0D876h, 09924h, 0B522h, 0A7B8h, 0B607h, 042C0h, 0E594h, 03BD5h, 041D9h, 07794h, 05A0Dh, 01215h, 0AEDFh, 00DDAh, 0A375h, 01C79h, 009F1h, 09993h, 051DDh, 06D0Ah, 054B4h, 03E91h, 05CEDh, 0D6E6h, 067C8h, 0EB07h, 02FD5h, 0CF3Eh, 05D5Ch, 0430Eh, 09E56h
  !dw 0F54Eh, 02029h, 061EDh, 08D6Eh, 03E7Ah, 0FBFBh, 0B9ABh, 0B87Eh, 05FF3h, 01738h, 055BBh, 092CAh, 0DCB9h, 0E5AFh, 07C11h, 0D388h, 09B4Fh, 0B14Bh, 0A9CBh, 010EDh, 07EB7h, 08B07h, 02ADDh, 0C3C8h, 007A6h, 0E358h, 02BDFh, 0EA4Ch, 0D477h, 0DD58h, 0E26Bh, 06EC5h, 0D875h, 08B3Eh, 0696Fh, 02D93h, 0A68Eh, 02A0Eh, 05886h, 0D7EEh
  !dw 09BAFh, 03927h, 00A6Eh, 07CF5h, 0E666h, 0AF80h, 053C7h, 0A443h, 01B8Eh, 09031h, 0543Ch, 06C7Bh, 0F9EAh, 07F2Ch, 0B0CFh, 0ADD8h, 0E3ACh, 0767Ah, 0DAA1h, 0662Ah, 05E5Dh, 07B59h, 0556Ch, 063BFh, 0DAA0h, 03267h, 01E7Ch, 04AE8h, 04A7Ch, 01C74h, 0493Bh, 0EACEh, 07749h, 01AAFh, 0CF7Fh, 01699h, 05FA5h, 0D870h, 0673Eh, 0BF8Bh
  !dw 0B159h, 05761h, 0DC81h, 04873h, 0469Ch, 06C7Bh, 0B7DAh, 04F93h, 0DBE8h, 04363h, 0DA9Bh, 0FA9Ch, 063DBh, 05843h, 00E3Dh, 0A1FDh, 03221h, 05BF5h, 0085Bh, 0FD6Eh, 099D1h, 0C775h, 0365Fh, 0628Dh, 07F20h, 095FDh, 01CFFh, 0977Ah, 097D2h, 0C7FBh, 0CDE9h, 0E3A5h, 0D307h, 04B9Bh, 0FFF7h, 08A74h, 0D3E3h, 05F46h, 0EFD3h, 07FE8h
  !dw 0A446h, 05ADFh, 0E946h, 0DBFAh, 02363h, 0EAC7h, 0AABAh, 0A893h, 0E1DFh, 04481h, 0AFFDh, 0A79Bh, 0FD2Eh, 026AEh, 0D439h, 062C7h, 0A60Ch, 0D76Dh, 01EACh, 07EC2h, 0EA5Dh, 028E7h, 04D50h, 0C73Fh, 0FC85h, 0FA3Ch, 0F9EBh, 0E98Ch, 0842Eh, 007DCh, 0F568h, 06ECBh, 01DD9h, 0027Fh, 0F003h, 0C1CDh, 07D1Dh, 04BC2h, 04C60h, 03C5Bh
  !dw 0FEABh, 0F1CCh, 0ED67h, 049D1h, 0217Ah, 025C7h, 06B07h, 0BBF5h, 0AA07h, 0AB3Dh, 01E47h, 03085h, 07207h, 05202h, 0B5BDh, 0987Ah, 007CEh, 06A48h, 04C48h, 0ABA1h, 0487Ah, 0786Eh, 04769h, 0E7ABh, 07233h, 0F30Fh, 06E75h, 0FA79h, 0AE88h, 0C7D5h, 0FE27h, 04475h, 06826h, 051D7h, 0FA35h, 0971Ch, 0CC35h, 00A63h, 051A7h, 057E9h
  !dw 04EFBh, 06456h, 0680Ah, 0C03Dh, 0FD5Dh, 06BDCh, 0A268h, 02AFEh, 07AA8h, 06DE4h, 09F1Ah, 0E273h, 0AAA2h, 09AC7h, 07492h, 0DCFDh, 063D5h, 0115Dh, 0E2A8h, 09DAFh, 0B235h, 05A86h, 02B3Bh, 0BB15h, 00965h, 0AFF1h, 072E3h, 0F5A0h, 01173h, 0E40Ah, 033E4h, 0FF57h, 0F4E8h, 0C773h, 0ED5Fh, 0F21Ch, 0FD3Ch, 05EA5h, 01FADh, 0FE3Ch
  !dw 0BA75h, 027B3h, 0F7E1h, 0C44Dh, 03A5Dh, 08F71h, 0F693h, 0B129h, 00F08h, 0BB88h, 029C5h, 0F3FAh, 0353Fh, 0A848h, 07ADFh, 08545h, 0BDDBh, 02F6Ah, 01E97h, 0B8FFh, 023D1h, 0600Dh, 06BD6h, 00E68h, 07AA4h, 09CF3h, 0833Dh, 0B419h, 04578h, 090D4h, 07FA9h, 0E790h, 0E567h, 0A1A0h, 0A435h, 09FE9h, 0FA0Ch, 06678h, 0FC7Ah, 0F513h
  !dw 0445Fh, 08D14h, 06999h, 069A9h, 07B7Ah, 07EE5h, 0E9B9h, 0C7E9h, 04D6Fh, 0E7BDh, 0E410h, 0AFD5h, 03F1Eh, 07F51h, 08B86h, 0D657h, 0A889h, 044BDh, 0FC62h, 087ADh, 060CDh, 07500h, 04D0Dh, 04FD7h, 0127Fh, 059ECh, 0879Ah, 0B3EDh, 033E7h, 05D5Bh, 07BEAh, 0F59Fh, 06D67h, 013ACh, 067F5h, 06F16h, 02466h, 0FE3Dh, 07799h, 07330h
  !dw 0261Fh, 0CFD1h, 003B2h, 05FF8h, 05D5Bh, 056ECh, 00E3Eh, 0EA1Eh, 0D7ACh, 06F67h, 0592Dh, 06F7Fh, 0C622h, 07F12h, 03EC7h, 05F9Ch, 0C07Fh, 0516Bh, 0D77Ah, 01F39h, 0C565h, 0FF56h, 0F4B8h, 0135Bh, 0BA31h, 09BF8h, 070FBh, 0FD7Eh, 097F1h, 00141h, 0E920h, 086DFh, 046A5h, 0C64Ah, 07C82h, 06472h, 04BD4h, 06952h, 061E2h, 05400h
  !dw 059CFh, 09783h, 002E3h, 00018h, 01800h, 00000h, 00018h, 01800h, 00000h, 00018h, 01800h, 00000h, 0C018h, 0F21Bh, 0F357h, 00665h, 0CFFAh, 03F50h, 00076h, 01D80h, 00000h, 08018h, 0F69Bh, 0E4EDh, 06AF3h, 062C1h, 0FE81h, 0A94Fh, 0D29Fh, 03D00h, 0B6AFh, 0F8FBh, 0FBD7h, 0BE6Ah, 08161h, 033FEh, 08FD4h, 00816h, 005A0h, 00002h
  !dw 00006h, 00600h, 00000h, 00006h, 00600h, 00000h, 00006h, 00600h, 00000h, 00006h, 00600h, 00000h, 00006h, 00600h, 00000h, 00006h, 00600h, 00000h, 00006h, 00600h, 06000h, 0FC7Ch, 0BA07h, 0D3D6h, 0562Dh, 0CDB2h, 0009Bh, 00000h, 04900h, 04E45h, 0AE44h, 06042h, 00082h
  ;}
EndDataSection

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Mon Jul 01, 2019 2:47 pm
by applePi
Thanks, certainly nice, the dancing trees example is animated and wonderful
i have tested these: with nautilus_demo.pb added it before line: *engine\RenderEnd():
*engine\DrawCircle(200,200,100,#False,$FFFFFFFF)
*engine\DrawLineSize(3)
*engine\DrawLine(200,100,400,450,$FFFFFFFF)
it seems to me but not sure that the thick line is beautified, ie there is no cracks in it.
i suggest more simple and complex examples added gradually will be great you can add it also to the engine package.

Regards

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Mon Jul 01, 2019 9:12 pm
by Mijikai
applePi wrote:Thanks, certainly nice, the dancing trees example is animated and wonderful
i have tested these: with nautilus_demo.pb added it before line: *engine\RenderEnd():
*engine\DrawCircle(200,200,100,#False,$FFFFFFFF)
*engine\DrawLineSize(3)
*engine\DrawLine(200,100,400,450,$FFFFFFFF)
it seems to me but not sure that the thick line is beautified, ie there is no cracks in it.
i suggest more simple and complex examples added gradually will be great you can add it also to the engine package.

Regards
Thanks :)
Ill try to add examples over time.

For now i can share this text drawing demo:

Code: Select all

EnableExplicit

;SYNTHETIC DREAMS
;Author Mijikai 

XIncludeFile "nautilus.pbi"

Structure VECTOR_STRUCT
  x.f
  y.f
EndStructure

Structure FX
  a.f
  b.VECTOR_STRUCT
  c.i
EndStructure

Procedure.i Main(Width.i,Height.i,Title.s,ViewWidth.i,ViewHeight.i,FPS.i)
  Protected win.i
  Protected win_handle.i
  Protected win_flag.i
  Protected win_msg.i
  Protected *engine.NAUTILUS_ENGINE
  Protected engine_delta.f
  Protected engine_fps.i
  Protected engine_error.i
  Protected screen_center.VECTOR_STRUCT
  Protected index.f
  Protected flip.i
  Protected anc.f
  Protected rot.f
  Protected w.f
  Protected h.f
  Protected draw.i
  Protected NewList npos.FX()
  Protected rest.f
  Protected aa.f
  Protected bb.f
  Protected af.f
  Protected bf.f
  win_flag|#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
  win_flag|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
  win = OpenWindow(#PB_Any,#Null,#Null,Width,Height,Title,win_flag)
  If win
    win_handle = WindowID(win)
    *engine = nautilusCreate(win_handle,ViewWidth,ViewHeight,FPS);Version: 0.30 beta
    If *engine
      *engine\RenderAspect()  
      *engine\RenderColor($2E0000)
      *engine\ViewPortCenter(@screen_center)
      aa = 20
      bb = 20
      af = 70
      bf = 40
      Repeat
        Repeat
          win_msg = WindowEvent()
          If win_msg = #PB_Event_CloseWindow
            Break 2
          EndIf 
        Until win_msg = #Null
        *engine\RenderBegin(@engine_delta,@engine_fps,@engine_error)
        draw = 0  
        If index > 6
          If flip
            anc - 4
            flip = Bool(anc > -af)
          Else
            anc + 1
            flip = Bool(anc > bf)
          EndIf
          index = engine_delta
        Else
          index + 1 * engine_delta
          rot + 1 * engine_delta
          If rot > 359
            rot = 0
          EndIf
        EndIf
        w = aa - anc
        h = bb + anc
        ForEach npos()
          *engine\DrawTextModEx(screen_center\x,screen_center\y,"SYNTHETIC DREAMS",npos()\b\x,npos()\b\y,#True,#True,60,npos()\a,npos()\c)
          *engine\DrawTextModEx(screen_center\x,screen_center\y,"SYNTHETIC DREAMS",npos()\b\x,npos()\b\y,#True,#True,60,-npos()\a,npos()\c)
          draw + 32
        Next
        If ListSize(npos()) < 168
          If AddElement(npos())
            npos()\a = anc
            npos()\b\x = -200 + Abs(w) + rot
            npos()\b\y = 800 + Abs(h) - rot
            npos()\c = RGB(rot,0,255 - rot)
          EndIf 
        EndIf
        *engine\DrawTextLightModEx(screen_center\x,screen_center\y,"SYNTHETIC DREAMS",w,h,#True,#True,anc,$FFFFFFFF)
        *engine\DrawTextLightModEx(screen_center\x + 3,screen_center\y + 1,"SYNTHETIC DREAMS",w,h,#True,#True,anc,$FF4060FF)
        draw + 32 
        ;*engine\DrawText(10,10,Str(draw))
        ;*engine\DrawText(10,20,Str(engine_fps))
        If rest > 100
          ClearList(npos())
          rest = engine_delta
          aa = 20 + Random(100)
          bb = 20 + Random(200)
          af = 40 + Random(300)
          bf = 40 + Random(300)
        Else
          rest + engine_delta
        EndIf
        *engine\RenderEnd()
        If engine_error
          Break
        EndIf 
      ForEver
      *engine\Release()
    EndIf 
    CloseWindow(win)
  EndIf
EndProcedure

Main(1080,720,"SYNTHETIC DREAMS by Mijikai",900,300,60)

End

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Sat Jul 06, 2019 11:39 am
by Mijikai
Update: Version 0.31 beta

Added a new Interface for collision detection.

Code: Select all

Interface NAUTILUS_ENGINE
  ;...
  CreateCollision.i();<- create collision interface
  ;...
EndInterface

Interface NAUTILUS_COLLISION
  Box(X1.f,Y1.f,W1.f,H1.f,X2.f,Y2.f,W2.f,H2.f)
  BoxEx(*PosA,W1.f,H1.f,*PosB,W2.f,H2.f)
  Sprite.i(X1.f,Y1.f,*SpriteA,X2.f,Y2.f,*SpriteB);<- sprites or tiles (or both)!
  SpriteEx.i(*PosA,*SpriteA,*PosB,*SpriteB);<- sprites or tiles (or both)!
  LineLine.i(*LineA_XY1,*LineA_XY2,*LineB_XY1,*LineB_XY2,*Offset = #Null)
  LineLineEx.i(*LineA,*LineB,*Offset = #Null)
EndInterface
Currently theres no support for rotated sprites and tiles!

Example:
Image

Code: Select all

EnableExplicit

;Nautilus Engine Demo
;Version: 0.31 beta
;Author: Mijikai

;Look at nautilus.pbi to see all interfaces and functions!

XIncludeFile "nautilus.pbi"

Structure VECTOR_STRUCT
  x.f
  y.f
EndStructure

Structure LINE_STRUCT
  a.VECTOR_STRUCT
  b.VECTOR_STRUCT
EndStructure

Procedure.i Demo(Width.i,Height.i,Title.s,ViewWidth.i,ViewHeight.i,FPS.i)
  Protected win.i
  Protected win_handle.i
  Protected win_flag.i
  Protected win_msg.i
  Protected *engine.NAUTILUS_ENGINE
  Protected engine_delta.f
  Protected engine_fps.i
  Protected engine_error.i
  Protected *collision.NAUTILUS_COLLISION
  Protected LineA.LINE_STRUCT
  Protected LineB.LINE_STRUCT
  Protected Intersect.VECTOR_STRUCT
  Protected BoxPos.VECTOR_STRUCT
  win_flag|#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
  win_flag|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
  win = OpenWindow(#PB_Any,#Null,#Null,Width,Height,Title,win_flag)
  If win
    win_handle = WindowID(win)
    *engine = nautilusCreate(win_handle,ViewWidth,ViewHeight,FPS)
    If *engine
      *engine\RenderAspect()
      *collision = *engine\CreateCollision()
      LineA\a\x = 300
      LineA\a\y = 100
      LineA\b\x = 400
      LineA\b\y = 500
      LineB\a\x = 10
      LineB\a\y = 100
      Repeat
        Repeat
          win_msg = WindowEvent()
          If win_msg = #PB_Event_CloseWindow
            Break 2
          EndIf 
        Until win_msg = #Null
        *engine\InputMouse(@LineB\b)
        BoxPos = LineB\b
        BoxPos\x - 50
        BoxPos\y - 50
        *engine\RenderBegin(@engine_delta,@engine_fps,@engine_error)
        *engine\DrawLine(LineA\a\x,LineA\a\y,LineA\b\x,LineA\b\y)
        *engine\DrawLine(LineB\a\x,LineB\a\y,LineB\b\x,LineB\b\y)
        If *collision\LineLineEx(@LineA,@LineB,@Intersect)
          *engine\DrawCircle(Intersect\x,Intersect\y,10)
          *engine\DrawText(Intersect\x + 20,Intersect\y,"LINE INTERSECTION!")
        EndIf
        *engine\DrawBox(200,200,100,100)
        *engine\DrawBox(BoxPos\x,BoxPos\y,100,100)
        If *collision\Box(200,200,100,100,BoxPos\x,BoxPos\y,100,100)
          *engine\DrawText(BoxPos\x,BoxPos\y - 20,"BOX COLLISION!")
        EndIf
        *engine\RenderEnd()
        If engine_error
          Break
        EndIf 
      ForEver
      *engine\Release()
    EndIf 
    CloseWindow(win)
  EndIf
EndProcedure

Demo(1080,720,"Box Collosion & Line Intersection - Nautilus Engine v.0.31 beta",600,400,30)

End

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Sat Jul 13, 2019 9:46 am
by Mijikai
Update: Version 0.33 beta

Added a new Interface with 2D TileMap & Camera functions :)

Interface:

Code: Select all


Interface NAUTILUS_ENGINE
  ;...
  CreateOrtho.i(TilesX.i,TilesY.i,TileWidth.i,TileHeight.i);<- Create NAUTILUS_ORTHO object/interface
  ;...
EndInterface

Interface NAUTILUS_ORTHO
  Tiles.i()
  TilesX.i()
  TilesY.i()
  TileWidth.i()
  TileHeight.i()
  CameraCreate.i(X.f,Y.i,Width.f,Height.f)
  CameraOrigin.i(Camera.i,*Origin,*Offset = #Null)
  CameraMove.i(Camera.i,*Move,*Offset = #Null)
  CameraIndex.i(Camera.i,*Index)
  CameraPosition.i(Camera.i,*Position)
  CameraClamp.i(Camera.i,TilesX.i = 2,TilesY.i = 2)
  CameraZoom.f(Camera.i,Min.f,Max.f,*Scale = #Null)
  CameraScale.f(Camera.i)
  CameraUpdate.i(Camera.i,*Clamp = #Null,*Translation = #Null)
  CameraDestroy.i(Camera.i)
  Mouse.i(Camera.i,*Mouse,*Position,*Index = #Null)
  WorldToScreen.i(Camera.i,*Input,*Output)
  ScreenToWorld.i(Camera.i,*Input,*Output)
  TileMapCreate.i()
  TileMapToScreen.i(Camera.i,X.i,Y.i,*Position,*Link = #Null)
  TileMapGet.i(X.i,Y.i)
  TileMapSet.i(X.i,Y.i,Link.i)
  TileMapDestroy.i()
  Release.i()
EndInterface
Example:
Image

Code:

Code: Select all


EnableExplicit

;Nautilus Engine
;Version: 0.33 beta
;Author: Mijikai

;Ortho Camera Example

XIncludeFile "nautilus.pbi"

Macro WindowEvents()
  Repeat
    win_msg = WindowEvent()
    If win_msg = #PB_Event_CloseWindow
      Break 2
    EndIf 
  Until win_msg = #Null
EndMacro

Procedure.i Demo(Width.i,Height.i,Title.s,ViewWidth.i,ViewHeight.i,FPS.i)
  Protected win.i
  Protected win_handle.i
  Protected win_flag.i
  Protected win_msg.i
  Protected *engine.NAUTILUS_ENGINE
  Protected engine_delta.f
  Protected engine_fps.i
  Protected engine_error.i
  Protected screen_center.NAUTILUS_VECTOR_STRUCT
  Protected *atlas.NAUTILUS_ATLAS
  Protected *tile.NAUTILUS_TILE
  ;---------------------------------------------------------
  Protected mouse.NAUTILUS_VECTOR_STRUCT
  Protected *ortho.NAUTILUS_ORTHO
  Protected cam.i
  Protected cam_scale.f
  Protected cam_origin.NAUTILUS_VECTOR_STRUCT
  Protected cam_move.NAUTILUS_VECTOR_STRUCT
  Protected cam_clamp.NAUTILUS_CLAMP_STRUCT
  Protected px.i
  Protected py.i
  Protected tile_position.NAUTILUS_VECTOR_STRUCT
  Protected tile_link.i
  Protected mouse_active.i
  Protected mouse_position.NAUTILUS_VECTOR_STRUCT
  Protected mouse_index.NAUTILUS_INDEX_STRUCT
  ;---------------------------------------------------------
  win_flag|#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
  win_flag|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
  win = OpenWindow(#PB_Any,#Null,#Null,Width,Height,Title,win_flag)
  If win
    win_handle = WindowID(win)
    *engine = nautilusCreate(win_handle,ViewWidth,ViewHeight,FPS)
    If *engine
      *engine\RenderFilter()
      *engine\RenderAspect()
      *engine\RenderColor($400A05)          
      *engine\ViewPortCenter(@screen_center)
      *atlas = *engine\CreateAtlas(?floor,#Null$)
      *tile = *atlas\CreateTile(2,1,0,0,32,32)
      ;---------------------------------------------------------
      *ortho = *engine\CreateOrtho(100,100,32,32) ;<- create the ortho object/interface
      *ortho\TileMapCreate()                      ;<- create a tilemap (not needed a camera can also be used with a custom tilemap!)
      For py = 0 To *ortho\TilesY() - 1
        For px = 0 To *ortho\TilesX() - 1
          *ortho\TileMapSet(px,py,Random(1))      ;<- set the link - the link stores informations related to the tile
        Next
      Next
      cam = *ortho\CameraCreate(100,100,400,200)  ;<- create a camera
      cam_scale = 1                               ;<- initial scale/zoom factor
      cam_origin\x = 16                           ;<- camera origin
      cam_origin\x = 16
      *ortho\CameraOrigin(cam,@cam_origin)        ;<- set camera origin
      ;---------------------------------------------------------
      Repeat
        WindowEvents()
        If *engine\InputKey(#VK_ESCAPE):Break:EndIf
        If *engine\InputKey(#VK_W):cam_move\y - 4 * engine_delta:EndIf
        If *engine\InputKey(#VK_S):cam_move\y + 4 * engine_delta:EndIf
        If *engine\InputKey(#VK_A):cam_move\x - 4 * engine_delta:EndIf
        If *engine\InputKey(#VK_D):cam_move\x + 4 * engine_delta:EndIf
        *engine\InputMouse(@mouse) 
        cam_scale + (*engine\InputMouseWheel() / 1000)                        ;<- camera zoom
        Round(cam_scale ,#PB_Round_Nearest)
        mouse_active = *ortho\Mouse(cam,@mouse,@mouse_position,@mouse_index)  ;<- get the tile map mouse positions
        *ortho\CameraMove(cam,@cam_move)                                      ;<- move the camera to new position
        *ortho\CameraZoom(cam,0.5,3,@cam_scale)                               ;<- zoom the camera
        *engine\RenderBegin(@engine_delta,@engine_fps,@engine_error)
        ;---------------------------------------------------------
        *engine\RenderClip(100,100,400,200)                                   ;<- clip the camera
        *engine\RenderPush()                                                  ;<- backup the current render matrix
        *ortho\CameraUpdate(cam,@cam_clamp)                                   ;<- update the camera
        For py = cam_clamp\min\y To cam_clamp\max\y
          For px = cam_clamp\min\x To cam_clamp\max\x
            *ortho\TileMapToScreen(cam,px,py,@tile_position,@tile_link)       ;<- translate all tiles that are visible
            If mouse_active
              If px = mouse_index\x And py = mouse_index\y
                *tile\DrawEx(tile_link,tile_position\x,tile_position\y,#False,#Null,#Null,$FF00FF)
              Else
                *tile\Draw(tile_link,tile_position\x,tile_position\y)
              EndIf 
            Else
              *tile\Draw(tile_link,tile_position\x,tile_position\y)
            EndIf
          Next
        Next
        *engine\RenderPop()                                                   ;<- restore render matrix
        *engine\RenderUnclip()                                                ;<- unclip the camera
        *engine\DrawBox(100,100,400,200)
        ;---------------------------------------------------------
        *engine\DrawText(10,10,"Nautilus Engine",#False,#False,200)
        *engine\DrawText(10,25,"FPS " + Str(engine_fps),#False,#False,200)
        *engine\DrawText(10,40,"DLT " + StrF(engine_delta,2),#False,#False,200)
        *engine\DrawText(10,55,"Mouse Index: " + Str(mouse_index\x) + " x " + Str(mouse_index\y),#False,#False,200)
        *engine\RenderEnd()
        If engine_error;exit if there is an error
          Break
        EndIf 
      ForEver
      *engine\Release();this will free all resources and objects/interfaces
    EndIf 
    CloseWindow(win)
  EndIf
EndProcedure

Demo(1080,720,"Nautilus Engine (Ortho Camera) v.0.33 beta",600,400,60)

End

DataSection
  floor:
  ;{ floor.png - Size: 236 Bytes
  !dw 05089h, 0474Eh, 00A0Dh, 00A1Ah, 00000h, 00D00h, 04849h, 05244h, 00000h, 04000h, 00000h, 02000h, 00208h, 00000h, 02D00h, 0E9FFh, 000D3h, 00000h, 049B3h, 04144h, 05854h, 0EDC3h, 0C198h, 00409h, 00C21h, 03345h, 0F4CBh, 055E0h, 06CF0h, 0E917h, 032C5h, 0C3ACh, 0925Eh, 0522Ah, 05D85h, 0C1ECh, 09645h, 07765h, 01660h, 0701Dh
  !dw 039F8h, 08129h, 05F07h, 03BC9h, 0CB64h, 0D339h, 0B5CAh, 09113h, 07AAAh, 067EFh, 043D0h, 0B308h, 07BF9h, 0A53Bh, 08694h, 04BD3h, 0FD29h, 08F3Ch, 00AFFh, 02220h, 0C631h, 07481h, 0DCE7h, 0F5FBh, 06F80h, 0CC66h, 06B5Ch, 0D53Dh, 0FCEAh, 02D07h, 0085Eh, 00080h, 03403h, 04D7Ah, 0D999h, 096AFh, 09C88h, 0F56Dh, 0BE21h, 0002Eh
  !dw 0AF33h, 003FDh, 06D5Fh, 08D08h, 00022h, 04002h, 0D0A3h, 03428h, 00B0Ah, 00021h, 00A34h, 0428Dh, 018A3h, 00462h, 083B8h, 00F46h, 0F734h, 07D47h, 0E66Ch, 06BA6h, 05554h, 03EC7h, 0034Ch, 0E5B6h, 054EEh, 0B6FEh, 07AFAh, 009FDh, 00798h, 0BD79h, 02B92h, 094DFh, 00000h, 00000h, 04549h, 0444Eh, 042AEh, 08260h
  ;}
EndDataSection

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Sat Jul 13, 2019 6:53 pm
by Mijikai
Update: Version 0.34 beta

Added new Function for Fake 3D effects :)

Code: Select all

Interface NAUTILUS_ORTHO
  ;...
  ProjectionFx.i(*Origin,*Target,*Position,Factor.f = 10)
  ;...
EndInterface
Example:
Image

Code:

Code: Select all

EnableExplicit

;Nautilus Engine
;Version: 0.34 beta
;Author: Mijikai

;Ortho - ProjectionFx example

XIncludeFile "nautilus.pbi"

Macro WindowEvents()
  Repeat
    win_msg = WindowEvent()
    If win_msg = #PB_Event_CloseWindow
      Break 2
    EndIf 
  Until win_msg = #Null
EndMacro

Procedure.i DrawPilon(*engine.NAUTILUS_ENGINE,*ortho.NAUTILUS_ORTHO,X.f,Y.f,*Translate.NAUTILUS_VECTOR_STRUCT,*Player.NAUTILUS_VECTOR_STRUCT,Factor.f)
  Protected pos.NAUTILUS_VECTOR_STRUCT
  Protected pro.NAUTILUS_VECTOR_STRUCT
  pos\x = X + *Translate\x
  pos\y = Y + *Translate\y
  *engine\DrawCircle(pos\x,pos\y,10) 
  *ortho\ProjectionFx(*Player,@pos,@pro,Factor);<- 2d to fake 3d!
  *engine\DrawLine(pos\x,pos\y,*Player\x,*Player\y,$88888888)
  *engine\DrawLine(pos\x,pos\y,pro\x,pro\y)
  *engine\DrawCircle(pro\x,pro\y,10,#True,$AAFF00FF)
EndProcedure

Procedure.i Demo(Width.i,Height.i,Title.s,ViewWidth.i,ViewHeight.i,FPS.i)
  Protected win.i
  Protected win_handle.i
  Protected win_flag.i
  Protected win_msg.i
  Protected *engine.NAUTILUS_ENGINE
  Protected engine_delta.f
  Protected engine_fps.i
  Protected engine_error.i
  ;---------------------------------------------------------
  Protected *ortho.NAUTILUS_ORTHO
  Protected player.NAUTILUS_VECTOR_STRUCT
  Protected translate.NAUTILUS_VECTOR_STRUCT
  Protected index.i
  Protected fac.f = 10
  ;---------------------------------------------------------
  win_flag|#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
  win_flag|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
  win = OpenWindow(#PB_Any,#Null,#Null,Width,Height,Title,win_flag)
  If win
    win_handle = WindowID(win)
    *engine = nautilusCreate(win_handle,ViewWidth,ViewHeight,FPS)
    If *engine
      *engine\RenderFilter()
      *engine\RenderAspect()
      *engine\RenderColor($400A05)
      *ortho = *engine\CreateOrtho();<- create 'empty' ortho object / we just need access to the ProjectFx() function!
      translate\x = 300
      translate\y = 200
      player\x = 300 
      player\y = 200
      ;---------------------------------------------------------
      Repeat
        WindowEvents()
        If *engine\InputKey(#VK_W):translate\y + 5 * engine_delta:EndIf
        If *engine\InputKey(#VK_S):translate\y - 5 * engine_delta:EndIf
        If *engine\InputKey(#VK_A):translate\x + 5 * engine_delta:EndIf
        If *engine\InputKey(#VK_D):translate\x - 5 * engine_delta:EndIf
        fac + (*engine\InputMouseWheel() / 100)
        If fac > 100:fac = 100:EndIf
        If fac < 1:fac = 1:EndIf
        *engine\RenderBegin(@engine_delta,@engine_fps,@engine_error) 
        *engine\DrawCircle(300,200,10,#True)
        For index = - 100 To 100 Step 10
          DrawPilon(*engine,*ortho,index,100,@translate,@player,fac)
          DrawPilon(*engine,*ortho,index,index,@translate,@player,fac)
          DrawPilon(*engine,*ortho,100,index,@translate,@player,fac)
        Next 
        *engine\RenderEnd()
        If engine_error
          Break
        EndIf 
      ForEver
      *engine\Release()
    EndIf 
    CloseWindow(win)
  EndIf
EndProcedure

Demo(1080,720,"Nautilus Engine (Ortho ProjectionFx) v.0.34 beta",600,400,60)

End

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Wed Jul 17, 2019 4:09 pm
by Mijikai
Update: Version 0.35 beta

New Functions :)
Direct Pixel access for Sprites, Tiles and Fonts.

Code: Select all

Interface NAUTILUS_ATLAS
  Pixel.i();<- returns the texture as buffer
  PixelSize.i(*Bits);<- size of the texture buffer
  PixelGet.i(*Bits,X.i,Y.i)
  PixelSet.i(*Bits,X.i,Y.i,ColorABGR.i)
  PixelUpdate.i(X.i,Y.i,Width.i,Height.i,*Bits);<- update/ change the displayed texture
  PixelFree.i(*Bits);<- free the texture buffer
  ;...
EndInterface

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Tue Jul 30, 2019 11:06 am
by Mijikai
Version 1.00 :)

Finally :D

New functions (Pathfinding):

Code: Select all

Interface NAUTILUS_COLLISION
  ;...
  AStarMaskCreate.i(*Buffer,Width.i,Height.i)
  AStarMaskWidth.i(Mask.i)
  AStarMaskHeight.i(Mask.i)
  AStarMaskSet.i(Mask.i,X.i,Y.i,Flag.b = #True)
  AStarMaskGet.i(Mask.i,X.i,Y.i)
  AStarMaskFree.i(Mask.i)
  AStarPathCreate.i(Mask.i,*Start,*Stop,Diagonal.b = #False,Smooth.b = #False,Steps.i = #Null) 
  AStarPath.i(Path.i,*Offset)
  AStarPathFree.i(Path.i)
EndInterface
Thanks @diceman for helping me with the pathfinding :)

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Wed Jul 31, 2019 3:42 am
by gurj
Line 33: nautilusCreate() is not a function, array, list, map or macro

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Wed Jul 31, 2019 7:38 am
by Mijikai
gurj wrote:Line 33: nautilusCreate() is not a function, array, list, map or macro
Have you included the pbi?

Code: Select all

XIncludeFile "nautilus.pbi"

Is it possible to get more information?

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Wed Jul 31, 2019 1:41 pm
by gurj
yes,has this:
XIncludeFile "nautilus.pbi"
it is your first post codes.

Re: [ENGINE] 2D Engine Nautilus (Win)

Posted: Wed Jul 31, 2019 3:58 pm
by gurj
In your first post, no 'nautilusCreate' was found.
and, i test your first Example: Image...