ramen is a simple console emulator written in go that can be used to create various ascii / text (roguelike) games. It's based on the great ebiten library and inspired by libraries like libtcod.
Warning: API and features are not fixed yet. Bugs will happen!
- PNG Fonts with more than 256 chars possible
- Fonts can contain chars and colored tiles
- Create sub-consoles to organize rendering
- Component based ui system
- Inlined color definitions in strings
- Pre-build components ready to use
- TextBox
- Button
- REXPaint file parsing
- Everything ebiten can do
- Input: Mouse, Keyboard, Gamepads, Touches
- Audio: MP3, Ogg/Vorbis, WAV, PCM
- ...
go get github.com/BigJk/ramen/...
In ramen you change the content of the console by applying transformations to cells. Examples would be:
// set one cell at position 10,15 to a green @:
con.Transform(10, 15, t.CharByte('@'), t.Foreground(concolor.RGB(0, 255, 0)))
// change the background of the area 0,0 with the width and height of 25,25:
con.TransformArea(0, 0, 25, 25, t.Background(concolor.RGBA(255, 255, 255, 20)))
// change the background of all the cells:
con.TransformAll(t.Background(concolor.RGBA(255, 255, 255, 10)))
All transformer functions accept objects that implement the t.Transformer interface, so it's also possible to create transformers with custom behaviour by implementing that interface.
There are also convenient string printing functions. The console.Print function supports parsing of inlined color definitions that can change the forground and background color of parts of the string.
[[f:#ff0000]]red foreground\n[[f:#ffffff|b:#000000]]white foreground and black background\n[[b:#00ff00]]green background
package main
import (
"fmt"
"github.com/BigJk/ramen/concolor"
"github.com/BigJk/ramen/console"
"github.com/BigJk/ramen/font"
"github.com/BigJk/ramen/t"
"github.com/hajimehoshi/ebiten/v2"
)
func main() {
// create a 50x30 cells console with the title 'ramen example'
con, err := console.New(50, 30, font.DefaultFont, "ramen example")
if err != nil {
panic(err)
}
// set a tick hook. This function will be executed
// each tick (60 ticks per second by default) even
// when the fps is lower than 60fps. This is a good
// place for your game logic.
//
// The timeDelta parameter is the elapsed time in seconds
// since the last tick.
con.SetTickHook(func(timeElapsed float64) error {
// your game logic
return nil
})
// set a pre-render hook. This function will be executed
// each frame before the drawing happens. This is a good
// place to draw onto the console, because it only executes
// if a draw is really about to happen.
//
// The timeDelta parameter is the elapsed time in seconds
// since the last frame.
con.SetPreRenderHook(func(screen *ebiten.Image, timeDelta float64) error {
con.ClearAll() // clear console
con.TransformAll(t.Background(concolor.RGB(50, 50, 50))) // set the background
con.Print(2, 2, "Hello!\nTEST\n Line 3", t.Foreground(concolor.RGB(0, 255, 0)), t.Background(concolor.RGB(255, 0, 0)))
con.Print(2, 7, fmt.Sprintf("TPS: %0.2f\nFPS: %0.2f\nElapsed: %0.4f", ebiten.CurrentFPS(), ebiten.CurrentFPS(), timeDelta))
return nil
})
// start the console with a scaling of 1
con.Start(1)
}