Crystal2Day is designed as a tool to develop games with Crystal fast.
Less work for you, therefore more time for actual game design.
Did you ever want to start a game, but then got frustrated while programming something mundane like a scrolling map, finally implemented it and then gave up when you saw the terrifying news of "20 FPS"?
Then Crystal2Day might just be the solution for you.
Crystal2Day is more than just a Crystal wrapper around a media library.
It provides basic game functions, but also some typical game design structures like maps, scenes and entities.
Mostly, it serves as a layer above lower-level game libraries like SDL, without having to worry about common implementation details.
For example, a map class is already implemented, as well as typical collision routines, a framerate limiter, z-ordering, cameras and many other things.
Essentially, you can build a game using a number of scenes, which can be considered as corkboards. Just pin everything you want on there and let Crystal2Day do the rest.
And even if you want to do everything by yourself, you can just do exactly that, as most SDL functions are available in this library.
Currently this project is in an early state, but will be expanded over time. Note that its syntax may change (frequently) until version 1.0.0.
- Based on SDL
- Simple framework to immediately start working
- Scene system to organize and streamline game design
- Already implemented: Cameras, z-ordering, parallax scrolling, maps, collisions, ...
- Data-driven entitiy system
- Behavior scripting using mruby via Anyolite
- Simple GUI construction (e.g. for debugging) using Dear ImGui
- Crystal (obviously)
- SDL 2 (media library; SDL 3 is not yet supported)
- Git (for installing additional features)
- GCC or Microsoft Visual Studio (for installing additional features)
- Ruby (for installing additional features)
- Rake (for installing additional features)
Currently, this shard can simply be used by adding it into your shard.yml
,
as long as all dependencies are installed correctly.
Make sure to have SDL 2 and its libraries installed, or linking will fail.
If you want to add features like Anyolite or ImGui,
you can install them using rake add_feature_XXX
, where XXX
is one of the
following features:
- anyolite - Support for scripting using mruby
- imgui - A simple GUI application, useful for debugging
It is also possible to install these manually. Crystal2Day will automatically
include these features, if they are found in the lib
directory (for example
after installing them as shards together with Crystal2Day).
NOTE: For ImGui to work on Windows you need to copy both
cimgui.dll
and cimgui.lib
from the Crystal2Day directory to your working directory or set the Crystal
environmental variables so that they are included.
To get started, here is a simple example, which will simply open an empty window:
require "Crystal2Day.cr"
# Just create a customized Scene class
class MyOwnScene < Crystal2Day::Scene
# Any events are passed to this method
def handle_event(event)
if event.type == Crystal2Day::Event::WINDOW
if event.as_window_event.event == Crystal2Day::WindowEvent::CLOSE
# Signal the program to stop the main loop
Crystal2Day.next_scene = nil
end
end
end
end
# All setup for the framework is done in this block
Crystal2Day.run do
# If we only have one window, the framework stores a reference to it
Crystal2Day::Window.new(title: "Hello World", w: 800, h: 600)
# Set the next scene
Crystal2Day.scene = MyOwnScene.new
# Start the game
Crystal2Day.main_routine
end
- Music and sounds
- Textures, sprites, fonts, texts
- Basic shapes (points, lines, boxes, circles, triangles, ellipses)
- Z-Ordering
- Scene system
- Support for multiple windows
- Framerate limiter
- Maps and tilesets
- Basic support for maps created with the Tiled editor
- 2D collision routines
- Entity hook system
- Optional scripting using Anyolite
- Entities with flexible states and multiple script pages
- Entity collision system
- Simple game state
- Resource management system
- Special plugin system
- Imgui support
Currently none
- How should the examples be structured?
- What is the best way to install additional features?
- Should all shards be installed, but their postinstall hooks only be triggered when desired?
- What examples should be made?
- Could entities be bound to maps?
- How should tilesets with overlapping segments be implemented?
- Is the current map streaming way really okay?
- Documentation
- Game controller support
- Entity parent-children system with memory management
- Custom shape designs (colors, textures)
- Quadriliteral shapes
- Map entity group optimization using quadtrees
- Loading scenes and related objects from JSON files
- Also allow symbols as Crystal hash indices
- Particle generator
- Hitshapes and hurtshapes
- Bytecode loading
- Adding static JSON resources at compiletime
- Data serializing
- Data obfuscation
- Animation phase shift patterns
- Various optimizations