Skip to content

☄️ Small Golang library for simulating 2D particles with the help of SDL2.

License

Notifications You must be signed in to change notification settings

hawkgs/go-gravity

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-gravity

Small Golang library for simulating 2D particles with the help of SDL2.

GoGravity

Setup

In order to run/try the code in rendering package, you must install SDL2 along with the Golang bindings. Of course, you are free to choose whatever rendering method you want since the core of the library is decoupled from SDL2.

Vector

The Vector struct is one of the cores of the library. You can perform basic operations over it like addition, multiplication, normalization and many more.

Force

The library has a set of forces (vectors) like wind, gravity, kinetic friction, etc.

Mover

The movers represent a moving particle which is affected by the forces you apply on it. It has its own location, velocity and mass.

var location *Vector // Initial location
var container *Vector // The boundaries where the mover can move
var obj interface{} // Represents the object of the rendering engine you are using (eg. SDL2 Rect)

// ...

// Our mover
mover := vectors.NewMover(&obj, location, container)

// Some forces
gravity := forces.CreateGravity()
push := forces.CreatePush(315, 0.2, 30)
friction := forces.CreateKineticFriction(mover)

// Rendering loop - each iteration represents a new frame.
// It is all rendering engine-specific stuff...
running := true
for running {
    // ...

    mover.ApplyForce(gravity.GetForce())
    mover.ApplyForce(push.GetForce())
    mover.ApplyForce(friction.GetForce())

    mover.Update()
    // Update mover's obj

    // Bounce, if an end has been reached
    mover.BounceOff()

    // ...
}

Particle System

Is a set of particles (Particle, a Mover wrapper) with predefined forces applied to them.

SDL2 Demo

// Create group of rects
var rectGroup []*sdl.Rect
// ...

// Create configuration and the particle system itself
psConf := particles.NewConf(false, 100, 100, location, container)
ps := particles.NewParticleSystem(rectGroup, psConf)

// Rendering loop
running := true
for running {
    // Break on quit
    // ...

    // Clear the window on every frame
    renderer.Clear()
    renderer.SetDrawColor(255, 255, 255, 255)
    renderer.FillRect(&sdl.Rect{X: 0, Y: 0, W: WindowWidth, H: WindowHeight})

    // Update the particle system and all of the SDL2 Rects
    ps.UpdateSystemSdl2(func(obj interface{}) {
        renderer.SetDrawColor(0, 0, 0, 255)
        switch obj.(type) {
        case *sdl.Rect:
            renderer.DrawRect(obj.(*sdl.Rect))
        }
    })

    renderer.Present()
    sdl.Delay(1000 / FrameRate)
}

About

☄️ Small Golang library for simulating 2D particles with the help of SDL2.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages