Coder Social home page Coder Social logo

ryanpcmcquen / basque Goto Github PK

View Code? Open in Web Editor NEW
442.0 15.0 24.0 64.66 MB

A top-down 2d game engine, written from scratch in under 1000 lines of C. Development of the game based on this engine is streamed on Twitch: https://www.twitch.tv/ryanpcmcquen

Home Page: https://ryanpcmcquen.itch.io/basque

License: Mozilla Public License 2.0

Makefile 6.42% Batchfile 3.97% C 63.30% Shell 0.88% HTML 25.28% Nix 0.15%
sdl2 2d-game-engine gitpod sdl2-mixer sdl2-ttf sdl2-image game-engine c-game game-engine-2d hacktoberfest

basque's Introduction

Basque

Basque is a cross-platform top-down 2d game engine.


Running on Windows:

Basque Windows demo

Running on Mac:

Basque Mac demo

Running on Linux:

Basque Linux demo

Running in your browser (thanks to WebAssembly and Emscripten):

Basque Wasm demo

Play Basque Wasm

Now with touch controls!


Packages for all platforms are available under the GitHub Action here:

Compiling ...

Or on Itch:

https://ryanpcmcquen.itch.io/basque


Too lazy to do local setup? You can give it a spin using Gitpod or Replit, the only downfall will be lack of audio.

Open in Gitpod

Run on Replit


Global keyboard shortcuts:

: Move player North

: Move player East

: Move player South

: Move player West

q: Quit

e: Toggle edit mode

Edit mode shortcuts:

l: Toggle map library

Mouse button 1 (left click): Place tile

Mouse button 2 (right click): Select tile


Why do this?

Why not just use Godot/Unity/et cetera? Basque has a very different priority list than these engines. It is not a generic engine. There isn't much here, but it is a good starting point if you are looking to roll your own engine, here is what it does:

  • Compiles cross platform (Linux/Mac/Windows/WebAssembly, see Esoteric ports for other platforms).
  • Visual map editing (with an easy to understand plain text format).
  • Spritesheet animation.
  • Background music.
  • Scrolling.
  • Collision detection.
  • Rudimentary frame rate limiting.
  • Accepts command line arguments (currently only for enabling fullscreen mode).
  • Resolution detection (estimates window size to 80% of the screen or uses the full resolution for fullscreen mode, this can be switched off).
  • High DPI awareness. By default the game will not run in high DPI mode, but it will be aware of high DPI contexts. This prevents things from looking fuzzy with weird scaling settings.
  • Automated GitHub and GitLab packaging pipelines.
  • Scancode based movement (rather than event loop key states). This keeps the controls from being susceptible to operating system key repeat rates and delays.
  • Unicode (UTF-8) file path support.

Everything that is here should not be considered a final or optimal solution, but rather, a simple approach that can be morphed into a better solution. At this point the engine will become more specific to the game I am building, which is why I see this as the best time to open source it. Hopefully, it can be useful to others, either as a starting point, or as a reference of some things you can accomplish with SDL2.


Map editing/layouts/attributes:

The current map system utilizes three main files:

While editing the map, you may use the visual map editor (available in DEBUG_MODE by pressing e) or edit the text files directly. Basque checks the timestamps of the files, and will reload them if they change, you do not need to recompile or relaunch Basque to do this. map_layout.txt also has suffixed versions created, with the intention of supporting future redo/undo functionality. The current number of versions that are kept is 100. This is of course, configurable.

map_attributes.txt follows the following format (all items are integers):

TILE_INDEX:
{ X_CLIP, Y_CLIP }, { NORTH_BORDER, EAST_BORDER, SOUTH_BORDER, WEST_BORDER },

Comments preceded with // in the attributes file are allowed. The other file types do not allow comments.

map_layout.txt and map_library.txt are comma separated integers, representing the tile indices. Newlines represent new rows.

For example:

  0,  1,  2,  3,  4,  1,  5,  _
 27, 16, 16, 16, 16, 16, 17,  _
 27, 16, 16, 16, 16, 16, 17,  _
 27, 16, 28, 16, 16, 16, 17,  _

The visual map editor (available in DEBUG_MODE by pressing e) automatically writes the indices with even spacing. _ is a shortcut for a blank tile (the index for which is configurable under configuration.h).

map_library.txt is intended to be a resource for picking tiles (available in DEBUG_MODE -> EDIT_MODE by pressing l), while editing the world map (map_layout.txt). It has a few special properties. It will not show the player, and it always appears starting at the top left corner of the screen. It is also not editable by the map editor.


Basque currently requires:

  • SDL2
  • SDL2_image
  • SDL2_mixer
  • SDL2_ttf

Getting SDL2 installed:

Linux:

apt:
sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
dnf:
sudo dnf install SDL2-devel SDL2_image-devel SDL2_mixer-devel SDL2_ttf-devel
eopkg:
sudo eopkg install sdl2-devel sdl2-image-devel sdl2-mixer-devel sdl2-ttf-devel
nix:
nix-env --install SDL2 SDL2_image SDL2_mixer SDL2_ttf

Or whatever the equivalent package is for your distro.

Mac:

brew install sdl2 sdl2_image sdl2_mixer sdl2_ttf

Windows:

Run the script here: install_sdl_on_windows.cmd


Or follow one of the below procedures:

Cmd or Powershell:
nuget install sdl2.nuget -NonInteractive -ExcludeVersion -OutputDirectory C:\INCLUDE\
nuget install sdl2_image.nuget -NonInteractive -ExcludeVersion -OutputDirectory C:\INCLUDE\
nuget install sdl2_mixer.nuget -NonInteractive -ExcludeVersion -OutputDirectory C:\INCLUDE\
nuget install sdl2_ttf.nuget -NonInteractive -ExcludeVersion -OutputDirectory C:\INCLUDE\
mkdir C:\INCLUDE\SDL2\

:: Headers:
robocopy C:\INCLUDE\sdl2.nuget\build\native\include\ C:\INCLUDE\SDL2\
robocopy C:\INCLUDE\sdl2_image.nuget\build\native\include\ C:\INCLUDE\SDL2\
robocopy C:\INCLUDE\sdl2_mixer.nuget\build\native\include\ C:\INCLUDE\SDL2\
robocopy C:\INCLUDE\sdl2_ttf.nuget\build\native\include\ C:\INCLUDE\SDL2\

:: Libs:
robocopy C:\INCLUDE\sdl2.nuget\build\native\lib\x64\ C:\INCLUDE\SDL2\
robocopy C:\INCLUDE\sdl2_image.nuget\build\native\lib\x64\ C:\INCLUDE\SDL2\
robocopy C:\INCLUDE\sdl2_mixer.nuget\build\native\lib\x64\ C:\INCLUDE\SDL2\
robocopy C:\INCLUDE\sdl2_ttf.nuget\build\native\lib\x64\ C:\INCLUDE\SDL2\

:: DLLs:
robocopy C:\INCLUDE\sdl2.nuget.redist\build\native\bin\x64\ C:\INCLUDE\SDL2\
robocopy C:\INCLUDE\sdl2_image.nuget.redist\build\native\bin\x64\ C:\INCLUDE\SDL2\
robocopy C:\INCLUDE\sdl2_mixer.nuget.redist\build\native\bin\x64\ C:\INCLUDE\SDL2\
robocopy C:\INCLUDE\sdl2_ttf.nuget.redist\build\native\bin\x64\ C:\INCLUDE\SDL2\

Cmd or Powershell as admin:

:: System DLLs:
robocopy C:\INCLUDE\sdl2.nuget.redist\build\native\bin\x64\ C:\Windows\System32\ *.dll
robocopy C:\INCLUDE\sdl2.nuget.redist\build\native\bin\x64\ C:\Windows\SysWOW64\ *.dll

robocopy C:\INCLUDE\sdl2_image.nuget.redist\build\native\bin\x64\ C:\Windows\System32\ *.dll
robocopy C:\INCLUDE\sdl2_image.nuget.redist\build\native\bin\x64\ C:\Windows\SysWOW64\ *.dll

robocopy C:\INCLUDE\sdl2_mixer.nuget.redist\build\native\bin\x64\ C:\Windows\System32\ *.dll
robocopy C:\INCLUDE\sdl2_mixer.nuget.redist\build\native\bin\x64\ C:\Windows\SysWOW64\ *.dll

robocopy C:\INCLUDE\sdl2_ttf.nuget.redist\build\native\bin\x64\ C:\Windows\System32\ *.dll
robocopy C:\INCLUDE\sdl2_ttf.nuget.redist\build\native\bin\x64\ C:\Windows\SysWOW64\ *.dll
Old school:
  1. Download the latest VC development files from: https://libsdl.org

  2. Place the entire contents of include and lib under C:\INCLUDE\SDL2.

  3. Copy all DLLs under lib to C:\Windows\System32 and C:\Windows\SysWOW64.

  4. Repeat for SDL2_image, SDL2_mixer, and SDL2_ttf.

  5. Profit.


Compiling:

Linux & Mac:

make

Windows:

nmake

Packaging:

To produce a zip containing the binary and all assets, run the below commands.

This should run on any system, as it includes SDL2 and the like, but every system is different, so nothing is guaranteed.

Linux:

make && make --always-make linux

Mac:

make && make --always-make mac

Windows:

nmake && nmake /a windows

WebAssembly (requires emsdk: https://github.com/emscripten-core/emsdk):

make --always-make wasm

Running:

After compiling for your platform, you can launch with ./basque (or basque.exe on Windows). Passing -f or --fullscreen will launch the app in fullscreen, rather than the resolution specified in configuration.h.

Esoteric ports:

BSD:

Basque on BSD

Pocketchip:

Basque on a PocketCHIP

Haiku:

Basque on Haiku Basque on Haiku

AmigaOS 4.1:

Basque on AmigaOS

Thanks to seventhwonder-amiga!

Nintendo Switch:

Basque on Nintendo Switch

Thanks to fontire!

In progress:

  • ReactOS
  • Solaris
  • TempleOS

basque's People

Contributors

actions-user avatar lucaspcram avatar ryanpcmcquen avatar timgates42 avatar tonydestefano avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

basque's Issues

Bug: Player easily falls out-of-bounds

Moving vertically near the edge of a column of tiles allows the player to then move outside the bounds.

This should be solvable with standard bounding boxes.

Build error Windows 10 SDL2 2.0.12

clang -Wall -Wextra -std=c99 -I C:\INCLUDE\ source\basque.c -L C:\INCLUDE\SDL2\ -l C:\INCLUDE\sdl2.nuget\build\native\lib\x64\dynamic\SDL2.lib -l C:\INCLUDE\sdl2.nuget\build\native\lib\x64\dynamic\SDL2main.lib -l C:\INCLUDE\sdl2_image.nuget\build\native\lib\x64\dynamic\SDL2_image.lib -l C:\INCLUDE\sdl2_mixer.nuget.\build\native\lib\x64\dynamic\SDL2_mixer.lib -l 
C:\INCLUDE\sdl2_ttf.nuget\build\native\lib\x64\dynamic\SDL2_ttf.lib -Xlinker /SUBSYSTEM:WINDOWS -o basque.exe SDL2main.lib(SDL_windows_main.obj) : error LNK2019: unresolved external symbol __imp_CommandLineToArgvW referenced in function main_getcmdline basque.exe : fatal error LNK1120: 1 unresolved externals clang: error: linker command failed with exit code 1120 (use -v to see invocation) NMAKE : fatal error U1077: 
'"C:\Program Files\LLVM\bin\clang.EXE"' : return code '0x460' Stop.

Seg fault

Builds clean on Ubuntu 19.10 but segfaults when run.

➜  linux git:(master) ✗ ./basque 
INFO: Basque started with 3x scaling.
[1]    15193 segmentation fault (core dumped)  ./basque

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.