Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/lukewilliamboswell/roc-ray

Roc graphics and GUI
https://github.com/lukewilliamboswell/roc-ray

roc-lang

Last synced: 8 days ago
JSON representation

Roc graphics and GUI

Awesome Lists containing this project

README

        

# Roc Ray Graphics Platform

[Roc](https://www.roc-lang.org) platform for building graphics applications, like games and simulations, while using the [Raylib](https://www.raylib.com) graphics library.

We aim to provide a nice experience for the hobby developer or a small team who wants to build a game or graphical application in Roc.

## Features

- Simple API for 2D graphics (3D coming soon)
- Built on the awesome Raylib library
- Cross-platform support for Linux, macOS, and Windows (hopefully Web coming soon)
- Write games using Roc, the Fast, Friendly, and Functional programming language
- Designed for beginners, hobby developers and small teams

## Documentation

Checkout the docs site at [lukewilliamboswell.github.io/roc-ray](https://lukewilliamboswell.github.io/roc-ray/)

## Example

(requires cloning the repository locally)

```roc
app [Model, init, render] { rr: platform "../platform/main.roc" }

import rr.RocRay
import rr.Draw

width = 800
height = 600

Model : {}

init : Task Model []
init =

RocRay.setWindowSize! { width, height }
RocRay.setWindowTitle! "Basic Shapes"

Task.ok {}

render : Model, RocRay.PlatformState -> Task Model []
render = \_, _ ->

Draw.draw! White \{} ->

Draw.text! { pos: { x: 300, y: 50 }, text: "Hello World", size: 40, color: Navy }
Draw.rectangle! { rect: { x: 100, y: 150, width: 250, height: 100 }, color: Aqua }
Draw.rectangleGradientH! { rect: { x: 400, y: 150, width: 250, height: 100 }, top: Lime, bottom: Navy }
Draw.rectangleGradientV! { rect: { x: 300, y: 250, width: 250, height: 100 }, top: Maroon, bottom: Green }
Draw.circle! { center: { x: 200, y: 400 }, radius: 75, color: Fuchsia }
Draw.circleGradient! { center: { x: 600, y: 400 }, radius: 75, inner: Yellow, outer: Maroon }
Draw.line! { start: { x: 100, y: 500 }, end: { x: 500, y: 500 }, color: Red }

Task.ok {}
```

![basic shapes example](examples/demo-basic-shapes.png)

## Getting Started

### Clone the repository

```
$ git clone https://github.com/lukewilliamboswell/roc-ray.git
```

### Linux and MacOS

*Required dependencies*
1. Install [roc](https://www.roc-lang.org)
2. Install [rust](https://www.rust-lang.org/tools/install)
3. Install dev tools on linux `sudo apt install build-essential git` or on macOS `xcode-select --install`
4. Install [just](https://github.com/casey/just?tab=readme-ov-file#packages)

Run an example:

```
$ just dev examples/pong.roc
```

**OR**

Use the [nix package manager](https://nixos.org/download/) to install the dependencies

```
$ nix develop
$ just dev examples/pong.roc
```

### Windows

1. Ensure you have [cargo](https://www.rust-lang.org/tools/install) in your path.
2. Install [just](https://github.com/casey/just?tab=readme-ov-file#packages)
3. Run `just setup` to download a windows build of Roc

Run an example:

```
PS > just dev .\examples\pong.roc
```

The unofficial Windows release of roc can be manually downloaded at [lukewilliamboswell/roc/releases/tag/windows-20241011](https://github.com/lukewilliamboswell/roc/releases/tag/windows-20241011)

```
PS > roc version
roc built from commit b5e3c3e441 with additional changes, committed at 2024-10-09 11:34:35 UTC
```

## Contributing

To run the tests locally:

```
$ ./ci/all_tests.sh
```

We are exploring how we can make a nice API for Roc and experimenting with different ideas, not quite a 1-1 mapping of the raylib API. We hope to find a nice balance between Roc's functional and Raylib's imperative style.

This platform is young, and there is a lot of work to do. You are welcome to contribute ideas or PR's, please let us know if you have any questions or need help.