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

Developed or developing a new product in PureBasic? Tell the world about it.
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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
Last edited by Mijikai on Wed Dec 30, 2020 9:45 pm, edited 39 times in total.
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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
linkerstorm
User
User
Posts: 47
Joined: Sun Feb 18, 2007 11:57 am

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

Post 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.
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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
applePi
Addict
Addict
Posts: 1404
Joined: Sun Jun 25, 2006 7:28 pm

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

Post 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
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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
Last edited by Mijikai on Sun Jul 28, 2019 7:48 pm, edited 1 time in total.
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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 :)
User avatar
gurj
Enthusiast
Enthusiast
Posts: 640
Joined: Thu Jan 22, 2009 3:48 am
Location: china
Contact:

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

Post by gurj »

Line 33: nautilusCreate() is not a function, array, list, map or macro
my pb for chinese:
http://ataorj.ys168.com
User avatar
Mijikai
Addict
Addict
Posts: 873
Joined: Sun Sep 11, 2016 2:17 pm

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

Post 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?
User avatar
gurj
Enthusiast
Enthusiast
Posts: 640
Joined: Thu Jan 22, 2009 3:48 am
Location: china
Contact:

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

Post by gurj »

yes,has this:
XIncludeFile "nautilus.pbi"
it is your first post codes.
my pb for chinese:
http://ataorj.ys168.com
User avatar
gurj
Enthusiast
Enthusiast
Posts: 640
Joined: Thu Jan 22, 2009 3:48 am
Location: china
Contact:

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

Post by gurj »

In your first post, no 'nautilusCreate' was found.
and, i test your first Example: Image...
my pb for chinese:
http://ataorj.ys168.com
Post Reply