A dead simple 2D game library for Go

Overview

Ebiten (v2)

PkgGoDev Build Status Build Status Go Report Card

A dead simple 2D game library for Go

Ebiten is an open source game library for the Go programming language. Ebiten's simple API allows you to quickly and easily develop 2D games that can be deployed across multiple platforms.

Overview

Platforms

Note: Gamepad and keyboard are not available on Android/iOS.

For installation on desktops, see the installation instruction.

Features

  • 2D Graphics (Geometry/Color matrix transformation, Various composition modes, Offscreen rendering, Fullscreen, Text rendering, Automatic batches, Automatic texture atlas)
  • Input (Mouse, Keyboard, Gamepads, Touches)
  • Audio (Ogg/Vorbis, MP3, WAV, PCM)

Packages

Community

Slack

#ebiten channel in Gophers Slack

License

Ebiten is licensed under Apache license version 2.0. See LICENSE file.

Comments
  • internal/graphicsdriver/directx: low performance

    internal/graphicsdriver/directx: low performance

    Easiest way to reproduce for now is with my game AAAAXY, which currently (for this reason) defaults to OpenGL rather than DirectX:

    • Download AAAAXY from https://github.com/divVerent/aaaaxy/ (latest release will do)
    • Also download the file "benchmark.dem" from the github repository, and put it next to the exe file.

    In PowerShell, run:

    $Env:EBITEN_GRAPHICS_LIBRARY = "opengl"
    Measure-Command { .\aaaaxy-windows-amd64.exe -load_config=false -demo_play="benchmark.dem" -demo_timedemo -vsync=false }
    ...
    TotalMilliseconds : 23103.9543
    $Env:EBITEN_GRAPHICS_LIBRARY = "directx"
    Measure-Command { .\aaaaxy-windows-amd64.exe -load_config=false -demo_play="benchmark.dem" -demo_timedemo -vsync=false }
    ...
    TotalMilliseconds : 39587.4662
    

    (to view runtime fps, can run .\aaaaxy-windows-amd64.exe -load_config=false -vsync=false -show_fps, which shows me 110fps at the start of the game in OpenGL, and 19fps in DirectX - the lower difference in TotalMilliseconds is primarily due to loading time "equalizing" things somewhat)

    Issue may be GPU specific though - I have this issue on one of these: https://www.amazon.com/2019office%E3%80%91-Ultra-Light-High-Speed-High-Performance-Notebook/dp/B09CQ22335/ref=sr_1_3?keywords=7+inch+laptop&qid=1657310835&sr=8-3 - according to Device Manager I have an Intel(R) HD Graphics 500.

    -vsync=false is most certainly not at fault - with vsync on, I can't reach 60fps either, which is very noticeable.

    os:windows performance needs-investigation 
    opened by divVerent 63
  • internal/gamepaddb: standard layout is not correctly detected on Android

    internal/gamepaddb: standard layout is not correctly detected on Android

    I am connecting a generic X-Box gamepad (this one: https://github.com/gabomdq/SDL_GameControllerDB/pull/452) but am getting:

    09-06 07:34:08.860 25521 25559 I GoLog   : 2022/09/06 11:34:08.860469 [INFO] gamepad Generic X-Box pad added
    09-06 07:34:08.860 25521 25559 I GoLog   : 2022/09/06 11:34:08.860534 [ERROR] gamepad Generic X-Box pad has no standard layout - cannot use
    

    This can't be right - it doesn't get much more standard layout than this.

    However, on Android, Ebitengine always returns false to hasOwnStandardLayoutMapping, and for some reason we don't match the gamecontrollerdb entry either (not sure if that'd even work, as it depends on the order the OS returns buttons in, which likely differs between Android and Linux).

    In addition, the Java code in cmd/ebitenmobile/gobind.go very much looks like Android does usually provide the standard layout mapping internally (see names like KEYCODE_BUTTON_SELECT).

    bug os:android 
    opened by divVerent 47
  • Fullscreen broken on X11 with HiDPI

    Fullscreen broken on X11 with HiDPI

    Repro:

    • Set display DPI to something other than 96: echo Xft.dpi: 144 | xrdb -merge
    • Run examples/windowsize
    • Press F

    Observe that a large part of the screen is cut off (see screenshots).

    20210820-100222 20210820-100226

    Note how Xft.dpi does not influence the Device Scale Factor, but it does change the initial window size and causes this weird fullscreen scale up.

    Reproduced on:

    • X11/i3
    • Wayland/Sway/Xwayland

    Does NOT reproduce on:

    • Cinnamon

    Most likely because ebiten has its own support for querying device scale that is specific to Cinnamon and GNOME, while not supporting anything else; at the same time, glfw has its different support and these two disagree.

    Maybe we should just always use glfw's content scale?

    Note though:

    // deviceScaleFactor() is a scale by desktop environment (e.g., Cinnamon), while GetContentScale() is X's scale.
    

    I do not quite understand this - when do these two ever differ, except when there simply is no desktop environment managing this at all? In fact, do we ever handle the case of these two differing right?

    bug os:linux 
    opened by divVerent 45
  • Regression: invisible window, wrong fullscreen size

    Regression: invisible window, wrong fullscreen size

    On my system (Linux/Sway/XWayland), 77664ff0575c8f51e1ba5cd3604a57808fbf95f4 causes a regression:

    • Before the commit, Ebiten windows get created on the correct screen and get centered correctly.
    • After the commit, I don't get any visible window, and in fullscreen it displays too small in the bottom left corner.

    Commenting out the initializeWindowAfterCreation(window) in createWindow() fixes it, although I do not yet know why. What the function does looks reasonable to me (other than the window being way too small, 16x16).

    Checking with xwininfo reveals that the window actually gets created but outside the visible area of my dual screen setup. Fullscreen oddly uses the wrong size.

    I suggest backing out the commit for now, unless it fixes similar issues on other systems. Or maybe have it temporarily controlled by an environment variable until fixed for good?

    bug os:linux 
    opened by divVerent 41
  • Immediate crash when running gamepad example locally

    Immediate crash when running gamepad example locally

    I'm running Void Linux. I copied the code for the gamepad example and removed the // +build example jsgo. It compiles, but upon running it immediately crashes.

    Error Log

    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    GLFW: An uncaught error has occurred: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    GLFW: Please report this bug in the Go package immediately.
    panic: InvalidValue: Invalid button in gamepad mapping 030000004c050000cc09000011810000 (PS4 Controller)
    
    goroutine 1 [running]:
    github.com/go-gl/glfw/v3.3/glfw.acceptError(0xc00015de58, 0x1, 0x1, 0xc00016a120, 0xc00000e160)
    	/home/semi/go/src/github.com/go-gl/glfw/v3.3/glfw/error.go:174 +0x216
    github.com/go-gl/glfw/v3.3/glfw.Init(0xddf27cfb, 0xb94fc6b71120b9e0)
    	/home/semi/go/src/github.com/go-gl/glfw/v3.3/glfw/glfw.go:37 +0x54
    github.com/hajimehoshi/ebiten/internal/glfw.Init(...)
    	/home/semi/go/src/github.com/hajimehoshi/ebiten/internal/glfw/glfw_notwindows.go:291
    github.com/hajimehoshi/ebiten/internal/uidriver/glfw.initialize(0xc0001005a0, 0xc000100570)
    	/home/semi/go/src/github.com/hajimehoshi/ebiten/internal/uidriver/glfw/ui.go:129 +0x26
    github.com/hajimehoshi/ebiten/internal/uidriver/glfw.init.1()
    	/home/semi/go/src/github.com/hajimehoshi/ebiten/internal/uidriver/glfw/ui.go:119 +0x22
    
    bug external 
    opened by semilin 38
  • ebiten: deprecate `FPSMode`, undeprecate `SetVsyncEnable`, and add more APIs to control TPS/FPS

    ebiten: deprecate `FPSMode`, undeprecate `SetVsyncEnable`, and add more APIs to control TPS/FPS

    FPSModeVsyncOffMinimum is quite odd since a) this affects TPS and b) this consumes GPU power unnecessarily (e.g. when a mouse is dragged).

    To solve these issues, we have discussed at the Discord server and came up with these ideas, instead of introducing a new FPS mode like FPSModeVsyncOnMinimum:

    1. Undeprecate SetVsyncEnabled and deprecate FPSMode to make the API orthogonal with new APIs
    2. Add a new TPS mode SyncWithInput, with which Update is called only when inputting occurs. Draw's timing is also adjusted. When vsync is on, Draw is also called only when inputting occurs, but the maximum is limited by vsync. When vsync is off, Draw is not limited by vsync. This should be the same as FPSModeVsyncOffMinimum. As SetTPS affects Draw, this might be odd, but basically we cannot control the timings of Draw directly in the first place. This solves the problem a) by the clearner APIs and also b) partially by SyncWithInput with vsync-on.
    3. Add a new error value SkipDraw, which skips Draw (and the previous framebuffer is used for swapping framebuffers). This solves the problem b) by suppressing Draw (e.g. when a mouse is dragged).

    @tinne26 @Zyko0 Any thoughts?

    feature wontfix request 
    opened by hajimehoshi 37
  • cmd/ebitenmobile: support current NDK

    cmd/ebitenmobile: support current NDK

    Hi,

    I've installed a fresh Android Studio with NDK 24.0.8215888. When trying to use ebitenmobile, I get:

    $ export ANDROID_HOME=$HOME/Android/Sdk
    $ export ANDROID_NDK_HOME=$HOME/Android/Sdk/ndk/24.0.8215888
    $ go run github.com/hajimehoshi/ebiten/v2/cmd/ebitenmobile \
    	bind -target android -javapkg io.github.divverent.aaaaxy.android \
    	-androidapi 21 \
    	-o aaaaxy.aar \
    	github.com/divVerent/aaaaxy/internal/mobile
    2022/05/02 09:20:33 gomobile [init] failed: gomobile: No compiler for 386 was found in the NDK (tried /home/rpolzer/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android16-clang). Make sure your NDK version is >= r19c. Use `sdkmanager --update` to update it.
    

    I do not know why it tries to search SDK 16 binaries (and for x86 even, which is an odd platform for Android); this NDK comes with versions 21 to 32 for aarch64 and x86_64, as well as 19 to 32 for armv7a and i686.

    I would assume that passing -androidapi sets which NDK binaries it'll use, but to no avail.

    In general, the ebitenmobile instructions could be a LOT clearer - many things in there I just do not understand and will have to figure out by trial and error, not being an Android developer myself.

    bug os:android external 
    opened by divVerent 34
  • graphics: Shader API

    graphics: Shader API

    EDIT: There is a proposal document for the shader language:

    https://docs.google.com/document/d/1yVfqWY6B-yF0H3NOVff3r791_n2zUu8BUWdW9TuEorw/edit?usp=sharing


    In Unity, there is a converter from HLSL to GLSL for portability

    https://docs.unity3d.com/Manual/SL-ShadingLanguage.html

    feature request 
    opened by hajimehoshi 34
  • graphics: HTML5-Canvas-like API

    graphics: HTML5-Canvas-like API

    Random note

    How to implement

    For simple primitives, GLSL would work. For complex things like filling polygon, GLSL would also work but stencil buffers might be better.

    Or, how about implementing scan-line algorithm on GLSL without vertices?

    What kind of features there are in HTML5 Canvas

    Ref: https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D

    • Shapes / Paths

      • Line
      • Rectangle
      • Polygon
      • Arc
        • Circle
        • Ellipse
      • Bezier Curve
      • Quadratic Curve
    • Line style

      • Width
      • Cap
      • Join
      • Miter Limit
      • Dash
    • Fill/Stroke Style

      • Solid
      • Gradient
      • Pattern
    • Shadow

      • Blur
      • Color
      • Offset
    • Paths

      • Fill (non-zero / even-odd) (NanoVG supports only even-odd)
      • Stroke
      • Clip
    • Others

      • imageSmoothingEnabled (Anti alias)

    I don't think we need all the above items though...

    Text

    As for text rendering, we already have github.com/hajimehoshi/ebiten/text and that's fine. For true type fonts, using bezier curves might be more effective, but the text package accepts more general font.Face interface, that can be any rasterized data.

    Filling pattern / Clip

    We already have composition modes, so I don't think we need API to specify complex filling pattern and clipping. Just filling with a solid color might be enough.

    Actual use cases

    I need actual use cases before considering API. This is similar way to Go2 language change.

    • Prototyping
    • Graphs or charts
    • UI
    feature 
    opened by hajimehoshi 33
  • Add a single-thread mode by introducing a new build tag

    Add a single-thread mode by introducing a new build tag

    This project is super cool so I finally started porting the cp-examples over to ebiten. With vsync off I noticed the ebiten tumble ran much slower than the cp-example tumble that builds the triangles every single frame.

    The cp-example was getting ~1600 FPS and ebiten was at ~600 FPS.

    So I did some profiling and noticed some channel related locks. From what I understand most game engines are single threaded, so I removed the threading and the ebiten version is now getting ~2100 FPS.

    Is there a specific design decision that lead to threading in the GLFW code? If there's a good reason maybe add an option to disable threading to unlock peak performance?

    performance 
    opened by jakecoffman 32
  • Dual monitor setups on Windows with different windows scaling

    Dual monitor setups on Windows with different windows scaling

    When you're running an app produced on windows when you have 2 different scaling options the game resizes based on what the active window is rather than what desktop it's on.

    image

    image

    https://user-images.githubusercontent.com/111667/136635776-6c38c056-e4d3-4385-8fbc-3af684361458.mp4

    See video.. All I'm doing is switching window (not ebiten related either). Between display 1 and 2.

    It seems it's basing it's internal scaling based on what the active window is. I don't often program using windows api so I can't tell you what the solution is. But some testing with another app shows that: https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-windowposchanged is triggered with SWP_NOSIZE when I move a window between the two. (But not my field.)

    Sorry originally logged on wrong repo: https://github.com/ebiten/ebiten.org/issues/63

    bug os:windows 
    opened by arran4 30
  • Changing Fullscreen Mode while Mouse is Captured Moves Mouse

    Changing Fullscreen Mode while Mouse is Captured Moves Mouse

    Ebitengine Version

    v2.4.3

    Operating System

    • [ ] Windows
    • [ ] macOS
    • [X] Linux
    • [ ] FreeBSD
    • [ ] OpenBSD
    • [ ] Android
    • [ ] iOS
    • [ ] Nintendo Switch
    • [ ] Xbox
    • [ ] Web Browsers

    Go Version (go version)

    go 1.19.3 linux/amd64

    What steps will reproduce the problem?

    When you toggle fullscreen with the cursor mode set to CursorModeCaptured, it moves the mouse's position.

    What is the expected result?

    That the cursor doesn't change position (as the application's layout doesn't change), or that it changes position to be . If this is unavoidable, it might be advised to allow us to force the cursor's position with an API, like ebiten.SetCursorPosition(), or to return a delta of the cursor's movement over the previous frame, like ebiten.CursorMovement() or ebiten.CursorDelta().

    What happens instead?

    The cursor does, instead, change position.

    Anything else you feel useful to add?

    Here's an example project:

    
    type Game struct{}
    
    func (g *Game) Update() error {
    
    	var err error
    
    	if inpututil.IsKeyJustPressed(ebiten.KeyF4) {
    		ebiten.SetFullscreen(!ebiten.IsFullscreen())
    	}
    
    	if inpututil.IsKeyJustPressed(ebiten.KeyEscape) {
    		err = errors.New("quit")
    	}
    
    	fmt.Println(ebiten.CursorPosition())
    
    	return err
    
    }
    
    func (g *Game) Draw(screen *ebiten.Image) {}
    
    func (g *Game) Layout(w, h int) (int, int) {
    	return 320, 240
    }
    
    func NewGame() *Game { return &Game{} }
    
    func main() {
    
    	ebiten.SetCursorMode(ebiten.CursorModeCaptured)
    
    	if err := ebiten.RunGame(NewGame()); err != nil {
    		panic(err)
    	}
    
    }
    
    
    
    bug os:linux needs-investigation 
    opened by SolarLune 1
  • internal/glfw: rare crash at setting an icon on macOS

    internal/glfw: rare crash at setting an icon on macOS

    Ebitengine Version

    v2.5.0-alpha.7

    Operating System

    • [ ] Windows
    • [X] macOS
    • [ ] Linux
    • [ ] FreeBSD
    • [ ] OpenBSD
    • [ ] Android
    • [ ] iOS
    • [ ] Nintendo Switch
    • [ ] Xbox
    • [ ] Web Browsers

    Go Version (go version)

    go version go1.19.2 darwin/amd64

    What steps will reproduce the problem?

    Just launch an application.

    What is the expected result?

    panic: NotInitialized: The GLFW library is not initialized
    
    goroutine 1 [running, locked to thread]:
    github.com/go-gl/glfw/v3.3/glfw.acceptError({0x0, 0x0, 0xc00005ef00?})
    	/Users/daigosato/go/pkg/mod/github.com/go-gl/glfw/v3.3/[email protected]/error.go:174 +0x1d9
    github.com/go-gl/glfw/v3.3/glfw.panicError(...)
    	/Users/daigosato/go/pkg/mod/github.com/go-gl/glfw/v3.3/[email protected]/error.go:185
    github.com/go-gl/glfw/v3.3/glfw.(*Window).GetMonitor(0x1000067f1?)
    	/Users/daigosato/go/pkg/mod/github.com/go-gl/glfw/v3.3/[email protected]/window.go:662 +0x2b
    github.com/hajimehoshi/ebiten/v2/internal/glfw.(*Window).GetMonitor(...)
    	/Users/daigosato/go/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/glfw/glfw_notwindows.go:128
    github.com/hajimehoshi/ebiten/v2/internal/ui.(*userInterfaceImpl).isFullscreen(0x100d62540)
    	/Users/daigosato/go/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/ui/ui_glfw.go:537 +0x33
    github.com/hajimehoshi/ebiten/v2/internal/ui.(*userInterfaceImpl).loop.func3.1()
    	/Users/daigosato/go/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/ui/ui_glfw.go:1156 +0x5c
    github.com/hajimehoshi/ebiten/v2/internal/thread.(*OSThread).Loop.func1(0xc01b217e08?, 0xc01b217df8?)
    	/Users/daigosato/go/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/thread/thread.go:54 +0x53
    github.com/hajimehoshi/ebiten/v2/internal/thread.(*OSThread).Loop(0xc000123998)
    	/Users/daigosato/go/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/thread/thread.go:55 +0x2e
    github.com/hajimehoshi/ebiten/v2/internal/ui.(*userInterfaceImpl).Run(0x100d62540, {0x10082c668?, 0xc000240bd0})
    	/Users/daigosato/go/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/ui/run_notsinglethread.go:52 +0x231
    github.com/hajimehoshi/ebiten/v2.RunGame({0x1008293a8, 0xc000001680})
    	/Users/daigosato/go/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/run.go:233 +0x9d
    main.main()
    	/Users/daigosato/Development/odencat/rpgsnack/rpgsnack-runtime/main.go:127 +0x1d9
    

    What happens instead?

    No crash

    Anything else you feel useful to add?

    The issue is very rare and there is no stable way to reproduce this.

    bug os:macos 
    opened by hajimehoshi 5
  • internal/graphics: `Vertices` and `QuadVertices`  are not concurrent-safe

    internal/graphics: `Vertices` and `QuadVertices` are not concurrent-safe

    Ebitengine Version

    d898bb1ce4f2cb6a819e00c0b5bd30ef1e638775

    Operating System

    • [ ] Windows
    • [ ] macOS
    • [ ] Linux
    • [ ] FreeBSD
    • [ ] OpenBSD
    • [ ] Android
    • [ ] iOS
    • [ ] Nintendo Switch
    • [ ] Xbox
    • [ ] Web Browsers

    Go Version (go version)

    go version go1.19.2 darwin/amd64

    What steps will reproduce the problem?

    -race sometimes detects the race condition in this function.

    What is the expected result?

    No race condition.

    What happens instead?

    A race condition is detected at https://github.com/hajimehoshi/ebiten/blob/2.4/internal/graphics/vertex.go#L153

    WARNING: DATA RACE
    Write at 0x00c00035c100 by goroutine 24:
      github.com/hajimehoshi/ebiten/v2/internal/graphics.QuadVertices()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/graphics/vertex.go:153 +0x135
      github.com/hajimehoshi/ebiten/v2.(*Image).DrawImage()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/image.go:310 +0x837
      github.com/hajimehoshi/ebiten/v2/ebitenutil.drawDebugText()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/ebitenutil/debugprint.go:81 +0x4cf
      github.com/hajimehoshi/ebiten/v2/ebitenutil.DebugPrintAt()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/ebitenutil/debugprint.go:52 +0x44
      github.com/hajimehoshi/ebiten/v2/ebitenutil.DebugPrint()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/ebitenutil/debugprint.go:45 +0x26
      main.(*LoadingScreen).Draw()
          /home/sion/src/github.com/sinisterstuf/escort-mission/loadingscreen.go:22 +0x25
      main.(*Game).Draw()
          /home/sion/src/github.com/sinisterstuf/escort-mission/main.go:142 +0xd2
      github.com/hajimehoshi/ebiten/v2.(*imageDumperGame).Draw()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/run.go:162 +0x70
      github.com/hajimehoshi/ebiten/v2.(*gameForUI).Draw()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/gameforui.go:65 +0x81
      github.com/hajimehoshi/ebiten/v2/internal/ui.(*context).drawGame()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/ui/context.go:159 +0x306
      github.com/hajimehoshi/ebiten/v2/internal/ui.(*context).updateFrameImpl()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/ui/context.go:139 +0x453
      github.com/hajimehoshi/ebiten/v2/internal/ui.(*context).updateFrame()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/ui/context.go:63 +0x7c
      github.com/hajimehoshi/ebiten/v2/internal/ui.(*userInterfaceImpl).loop()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/ui/ui_glfw.go:1126 +0x5ae
      github.com/hajimehoshi/ebiten/v2/internal/ui.(*userInterfaceImpl).Run.func1()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/ui/run_notsinglethread.go:46 +0x295
    
    Previous write at 0x00c00035c100 by goroutine 23:
      github.com/hajimehoshi/ebiten/v2/internal/graphics.QuadVertices()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/graphics/vertex.go:153 +0x135
      github.com/hajimehoshi/ebiten/v2.(*Image).DrawImage()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/image.go:310 +0x837
      main.(*TileRenderer).Render()
          /home/sion/src/github.com/sinisterstuf/escort-mission/renderer.go:162 +0x4ed
      main.NewGameScreen()
          /home/sion/src/github.com/sinisterstuf/escort-mission/gamescreen.go:108 +0xa6c
      main.main.func1()
          /home/sion/src/github.com/sinisterstuf/escort-mission/main.go:51 +0x39
    
    Goroutine 24 (running) created at:
      github.com/hajimehoshi/ebiten/v2/internal/ui.(*userInterfaceImpl).Run()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/internal/ui/run_notsinglethread.go:33 +0x3c6
      github.com/hajimehoshi/ebiten/v2.RunGame()
          /home/sion/pkg/mod/github.com/hajimehoshi/ebiten/[email protected]/run.go:204 +0x20d
      main.main()
          /home/sion/src/github.com/sinisterstuf/escort-mission/main.go:53 +0x615
    
    Goroutine 23 (running) created at:
      main.main()
          /home/sion/src/github.com/sinisterstuf/escort-mission/main.go:51 +0x604
    

    Anything else you feel useful to add?

    @sinisterstuf reported this.

    bug needs-investigation 
    opened by hajimehoshi 5
  • examples/windowsize: FPS is too high (about 120) on macOS w/ OpenGL

    examples/windowsize: FPS is too high (about 120) on macOS w/ OpenGL

    Ebitengine Version

    d40760716838f5c424da09d8f468e3a72fdc72ab

    Operating System

    • [ ] Windows
    • [X] macOS
    • [ ] Linux
    • [ ] FreeBSD
    • [ ] OpenBSD
    • [ ] Android
    • [ ] iOS
    • [ ] Nintendo Switch
    • [ ] Xbox
    • [ ] Web Browsers

    Go Version (go version)

    go version go1.19.2 darwin/amd64

    What steps will reproduce the problem?

    Run examples/windowsize with EBITENGINE_GRAPHICS_LIBRARY=opengl

    What is the expected result?

    60FPS

    What happens instead?

    About 120FPS

    Anything else you feel useful to add?

    This might be an issue from macOS 13.

                        'c.          [email protected] 
                     ,xNMM.          ------------------------------------------ 
                   .OMMMMo           OS: macOS 13.0 22A380 x86_64 
                   OMMM0,            Host: MacBookPro16,2 
         .;loddo:' loolloddol;.      Kernel: 22.1.0 
       cKMMMMMMMMMMNWMMMMMMMMMM0:    Uptime: 5 days, 12 hours, 52 mins 
     .KMMMMMMMMMMMMMMMMMMMMMMMWd.    Packages: 188 (brew) 
     XMMMMMMMMMMMMMMMMMMMMMMMX.      Shell: bash 3.2.57 
    ;MMMMMMMMMMMMMMMMMMMMMMMM:       Resolution: [email protected] 
    :MMMMMMMMMMMMMMMMMMMMMMMM:       DE: Aqua 
    .MMMMMMMMMMMMMMMMMMMMMMMMX.      WM: Quartz Compositor 
     kMMMMMMMMMMMMMMMMMMMMMMMMWd.    WM Theme: Blue (Light) 
     .XMMMMMMMMMMMMMMMMMMMMMMMMMMk   Terminal: tmux 
      .XMMMMMMMMMMMMMMMMMMMMMMMMK.   CPU: Intel i7-1068NG7 (8) @ 2.30GHz 
        kMMMMMMMMMMMMMMMMMMMMMMd     GPU: Intel Iris Plus Graphics 
         ;KMMMMMMMWXXWMMMMMMMk.      Memory: 20445MiB / 32768MiB 
           .cooc,.    .,coo:.
                                                             
                                                             
    
    
    bug os:macos help-wanted 
    opened by hajimehoshi 0
  • examples/subimage: SubImage as a destination should work more efficiently on browsers

    examples/subimage: SubImage as a destination should work more efficiently on browsers

    Ebitengine Version

    9aedafbb1af36e3a664d83417a79b15b39ec5fe6

    Operating System

    • [ ] Windows
    • [ ] macOS
    • [ ] Linux
    • [ ] FreeBSD
    • [ ] OpenBSD
    • [ ] Android
    • [ ] iOS
    • [ ] Nintendo Switch
    • [ ] Xbox
    • [X] Web Browsers

    Go Version (go version)

    go version go1.19.2 darwin/amd64

    What steps will reproduce the problem?

    examples/subimage doesn't work efficiently on browsers. On MacBook Pro 2020 Chrome, the FPS was less than 10.

    What is the expected result?

    60 FPS.

    What happens instead?

    Less than 10 FPS.

    Anything else you feel useful to add?

    • The original issue was for DirectX (#2232), but this was resolved.
    • WebGPU might improve the situation (#719)
    • Desktop OpenGL doesn't have this issue.
    performance 
    opened by hajimehoshi 0
  • Remove the restriction on len(indices)

    Remove the restriction on len(indices)

    Operating System

    • [ ] Windows
    • [ ] macOS
    • [ ] Linux
    • [ ] FreeBSD
    • [ ] OpenBSD
    • [ ] Android
    • [ ] iOS
    • [ ] Nintendo Switch
    • [ ] Xbox
    • [ ] Web Browsers

    What feature would you like to be added?

    panic: ebiten: len(indices) must be <= MaxIndicesCount

    This happens when a user issues too many indices, even if the biggest index from the slice satisfies <= MaxIndicesCount (because some indices can be repeated).

    I wonder if it is possible to push the limit further, or remove it completely for indices?

    Why is this needed?

    • If uint16 (which is a self-documenting restriction already) overflowing is programming knowledge, and there is a way to push more indices to a DrawTriangles command, I'm not sure that it makes sense to prevent it in ebitengine.
    • It would allow users to push a single vertices/indices batch for a single command if numbers aren't too high and not have to arbitrarily split these slices and commands on the user side (would impact performance too).
    feature request 
    opened by Zyko0 0
Releases(v2.4.13)
Owner
Hajime Hoshi
Software Engineer
Hajime Hoshi
Simple 2D game to teach myself various things about game development and ECS, etc

2d-grass-game I really don't know what to name this game. Its a big grass field, and its in 2d so....2D Grass game This is a simple 2D game to teach m

James Wynne III 1 Jan 17, 2022
Arkanoid game in Go using Ebiten game engine with ECS.

Arkanoid-go Arkanoid game in Go using Ebiten game engine with ECS. You must have Git LFS installed when cloning the repository to download assets. See

null 55 Oct 9, 2022
AircraftWar - a game powered by Go+ spx game engine

AircraftWar - a game powered by Go+ spx game engine How to run Download Go+ and build it. See https://github.com/goplus/gop#how-to-build. Download thi

GoPlus 1 Jan 5, 2022
FlappyCalf - a game powered by Go+ spx game engine

FlappyCalf - a game powered by Go+ spx game engine How to run Download Go+ and build it. See https://github.com/goplus/gop#how-to-build. Download this

GoPlus 3 Nov 6, 2022
FlappyCalf - a game powered by Go+ spx game engine

FlappyCalf - a game powered by Go+ spx game engine How to run Download Go+ and build it. See https://github.com/goplus/gop#how-to-build. Download this

GoPlus 3 Nov 6, 2022
MazePlay - a game powered by Go+ spx game engine

MazePlay - a game powered by Go+ spx game engine How to run Download Go+ and build it. See https://github.com/goplus/gop#how-to-build. Download this g

GoPlus 1 Dec 16, 2021
RundQuiz-Game - This is a Go exercise that implements and builds a quiz game from a list of math questions in a CSV file.

Go RundQuiz Game Exercise details This exercise is broken into two parts to help simplify the process of explaining it as well as to make it easier to

IkehAkinyemi 0 Jan 5, 2022
A hand-crafted 2D game library in Go

Pixel A hand-crafted 2D game library in Go. Take a look into the features to see what it can do. go get github.com/faiface/pixel If you are using Mod

Michal Štrba 4.1k Nov 26, 2022
Rock-paper-scissors game library

jankensheep Rock-paper-scissors game library Examples Play with two players:

Genta Kamitani 6 May 13, 2022
Golang writen 3D render library and some game-relative concepts

Golang writen 3D render library and some game-relative concepts.

null 2 Jun 6, 2022
Battleblips - Work in progress multiplayer terminal base battleship game written in Go (with mouse support!) using tcell library

battleblips Work in progress multiplayer terminal base battleship game written in Go (with mouse support!) using tcell library (see https://github.com

null 1 Apr 26, 2022
Spaceshooter - A port to go of the pygame Space Shooter game using the ebiten library

Space Shooter This is a port to go of the pygame Space Shooter (https://github.c

Jesús Espino 5 Sep 29, 2022
Simple 2D game prototyping framework.

prototype Simply prototype 2D games using an easy, minimal interface that lets you draw simple primitives and images on the screen, easily handle mous

null 76 Nov 16, 2022
Bampf is a simple 3D arcade style game. Collect Energy Cores in order to finish a level. Teleport (bampf) to safety or use cloaking abilities to avoid Sentinels.

Bampf Bampf is a simple 3D arcade style game. Collect energy cores in order to finish a level. Teleport (bampf) to safety or use cloaking abilities to

null 39 Apr 7, 2021
This is a "simple" game server. Main functionalities are matching and establishing a connection between players

Game Server This is a "simple" game server. Main functionalities are matching and establishing a connection between players How to Run? run the server

eco 8 Aug 28, 2022
Simple rule based matchmaking for your online game with support of Redcon(RESP) protocol.

Simple Matchmaking Simple rule based matchmaking for your online game with support of Redcon(RESP) protocol. 1- Simple Match Rule Easiest usage of sys

Fatih Kahveci 77 Nov 23, 2022
A simple desktop snake game

A simple desktop snake game that's supposed to run on Linux and Mac OS (maybe eventually on Windows). Work on the game is currently in progress - so i

Meghashyam Chirravoori 2 Oct 12, 2021
Simple word guessing game written in golang.

Word Guessing Game Simple word guessing game written in golang. successTexts := []string{ "You guessed right! ????????", "Correct! ✅", "Horray!

Mahmudul Hasan 1 Oct 19, 2021
Simple moonlander like game with some new mechanics

Space Crane game Controls Arrows - control ship engines Q/A - wind/unwind crane chain Tab - capture cargo Screenshots Features Levels Levels are simpl

Maxim Kozlov 16 Aug 24, 2022