Geen omschrijving

Karl Zylinski 4ca5775e29 Generalise 'build_web' program so it sounds less tied to the examples 1 maand geleden
.github 6be8507d02 Make ci check instead of build 1 maand geleden
.sublime 4ca5775e29 Generalise 'build_web' program so it sounds less tied to the examples 1 maand geleden
api_doc_builder 2355e776cd Docs 1 maand geleden
build_web 4ca5775e29 Generalise 'build_web' program so it sounds less tied to the examples 1 maand geleden
examples 4ca5775e29 Generalise 'build_web' program so it sounds less tied to the examples 1 maand geleden
handle_map c994c4c77b Some kind of texture handle concept 5 maanden geleden
.gitignore 4ca5775e29 Generalise 'build_web' program so it sounds less tied to the examples 1 maand geleden
LICENSE 361c3c9672 Snake example 5 maanden geleden
README.md d47c699426 Update README.md 1 maand geleden
TODO.md e929de5497 todo 1 maand geleden
karl2d.doc.odin fc5fefe7aa Docs 1 maand geleden
karl2d.odin b204807c4f Docs 1 maand geleden
render_backend_chooser.odin 0bac2e5a50 Better render backend naming 1 maand geleden
render_backend_d3d11.odin 0bac2e5a50 Better render backend naming 1 maand geleden
render_backend_d3d11_default_shader.hlsl 3d076f7bf5 Rename default hlsl shader 2 maanden geleden
render_backend_gl.odin 0bac2e5a50 Better render backend naming 1 maand geleden
render_backend_gl_default_fragment_shader.glsl 4ec00f3e66 Use 300 es shader for default gl/webgl shader (works with both APIs) 1 maand geleden
render_backend_gl_default_vertex_shader.glsl 4ec00f3e66 Use 300 es shader for default gl/webgl shader (works with both APIs) 1 maand geleden
render_backend_gl_windows.odin 13490b536d Enable vsync on gl-windows 2 maanden geleden
render_backend_interface.odin 100d2362e2 Render texture support in GL 1 maand geleden
render_backend_nil.odin 29c7af8a60 Render texture support for webGL 1 maand geleden
render_backend_webgl.odin 787c8b342b Use CheckFramebufferStatus in webgl (added it to bindings) 1 maand geleden
roboto.ttf 3cc43427a0 Some basic font rendering 4 maanden geleden
window_interface.odin 6c2c299d69 Some initial work on JS windowing interface and WebGL backend -- not even half done! 1 maand geleden
window_interface_chooser.odin 6c2c299d69 Some initial work on JS windowing interface and WebGL backend -- not even half done! 1 maand geleden
window_js.odin 8e60a70482 JS wheel event 1 maand geleden
window_win32.odin 1c4ab18c9b more clear screen_width/height name 1 maand geleden

README.md

karl2d_logo

Karl2D is a library for creating 2D games using the Odin programming language. The focus is on making 2D gamdev fun, fast and beginner friendly.

See karl2d.doc.odin for an API overview.

Here's a minimal "Hello world" program:

package hello_world

import k2 "karl2d"
import "core:log"

main :: proc() {
	context.logger = log.create_console_logger()
	k2.init(1920, 1080, "Hellope!")

	for !k2.shutdown_wanted() {
		k2.new_frame()
		k2.process_events()
		k2.clear(k2.LIGHT_BLUE)
		k2.draw_text("Hellope!", {10, 10}, 100, k2.BLACK)
		k2.present()
		free_all(context.temp_allocator)
	}

	k2.shutdown()
}

See the examples folder for a wide variety of example programs.

Some examples are available as live web builds: box2d, fonts, gamepad, minimal, mouse, render_texture, snake.

Discuss and get help in the #karl2d channel on my Discord server.

FIRST BETA

Karl2D is currently in its FIRST BETA period. This first beta has these features:

  • Rendering of shapes, textures and text with automatic batching
  • Support for shaders and cameras
  • Windows support (D3D11 and OpenGL)
  • Web support (WebGL, no emscripten needed!)
  • Input: Mouse, keyboard, gamepad

[!WARNING] This first beta does NOT have the following features, but they are planned in the order stated:

  • Linux
  • Sound
  • System for cross-compiling shaders between different backends (HLSL, GLSL etc)
  • Mac (metal)

Feedback wanted

Here are some things I want to get feedback on during this first beta:

  • Is the k2.new_frame() concept OK? It sets the "frame time" and clears some frame-specific state. I was thinking of merging new_frame() and process_events(), but something tells me that some people may want to move their event processing around. Initially I was toying with the idea to have the user use core:time and figure out dt etc themselves, but that was not good for first-user experience.

  • How do people think that DPI scaling should work? I've had bad experiences with high DPI mode Raylib. So I've gone for an idea where you always get everything in native coords and then you scale yourself using the number returned by k2.get_window_scale()

  • Because of how web builds need init and step to be split up, I also split the examples up this way, so we can use them both on desktop and on web. This sometimes made them a bit more chatty. For example, I had to move some variables to the global scope. Should I approach this differently?

  • Is it annoying that the documentation file karl2d.doc.odin has a real .odin file extension? I like that it gets syntax highlight for everyone etc. But it can also be a bit disruptive it "go to symbol" etc. Perhaps I should chance it to .odin_doc or something.

Join my Discord server and let me know in the #karl2d channel what you think! Here's the invite: https://discord.gg/4FsHgtBmFK

How to make a web build of your game

See the minimal_web example: https://github.com/karl-zylinski/karl2d/blob/master/examples/minimal_web/minimal_web.odin

There's a comment at the top of that file on how to use the build_web_example tool (which you find in the examples folder too). You can use that tool to make your own web build as well.

[!NOTE] Desktop programs can have the whole program in a main procedure. But web builds need to be split into main and step procedures, where step is called each frame by the browser in order to create a "game loop"

Architecture notes

The platform-independent parts and the main API lives in karl2d.odin

karl2d.odin in turn has a window interface and a rendering backend.

The window interface depends on the operating system. I do not use anything like GLFW in order to abstract away window creation and event handling. Less libraries between you and the OS, less trouble when shipping!

The rendering backend tells Karl2D how to talk to the GPU. I currently support three rendering APIs: D3D11, OpenGL and WebGL. On some platforms you have multiple choices, for exmaple on Windows you can use both D3D11 and OpenGL.

The platform indepdentent code in karl2d.odin creates a list of vertices for each batch it needs to render. That's done independently of the rendering backend. The backend is just fed that list, along with information about what shader and such to use.

The web builds do not need emscripten, instead I've written a WebGL backend and make use of the official Odin JS runtime. This makes building for the web easier and less error-prone.

Is this a Raylib clone?

The API was originally based on Raylib API, because I like that API. But I have changed things I don't like about Raylib and made the API more Odin-friendly. The implementation is meant to have as few dependencies as possible (mostly core libs and some libraries from vendor). The web builds do not need emscripten, it uses Odin's js_wasm32 target.

Since I have shipped an actual game using Odin + Raylib, I am in a good position to know what worked well and what worked less well. I have tried to put that experience into this library.

Have fun!

Logo by chris_php