64 lines
1.8 KiB
Text
64 lines
1.8 KiB
Text
import "graphics" for Canvas, Color, ImageData
|
|
import "dome" for Window
|
|
import "math" for Math
|
|
|
|
class PlasmaEffect {
|
|
construct new(width, height) {
|
|
Window.title = "Plasma Effect"
|
|
Window.resize(width, height)
|
|
Canvas.resize(width, height)
|
|
_w = width
|
|
_h = height
|
|
_bmp = ImageData.create("plasma_effect", _w, _h)
|
|
_plasma = createPlasma() // stores the hues for the colors
|
|
}
|
|
|
|
init() {
|
|
_frame = 0
|
|
_hueShift = 0
|
|
Canvas.cls(Color.white)
|
|
}
|
|
|
|
createPlasma() {
|
|
var buffer = List.filled(_w, null)
|
|
for (x in 0..._w) {
|
|
buffer[x] = List.filled(_h, 0)
|
|
for (y in 0..._h) {
|
|
var value = Math.sin(x / 16)
|
|
value = value + Math.sin(y / 8)
|
|
value = value + Math.sin((x + y) / 16)
|
|
value = value + Math.sin((x * x + y * y).sqrt / 8)
|
|
value = value + 4 // shift range from -4 .. 4 to 0 .. 8
|
|
value = value / 8 // bring range down to 0 .. 1
|
|
if (value < 0 || value > 1) Fiber.abort("Hue value out of bounds")
|
|
buffer[x][y] = value
|
|
pset(x, y, Color.hsv(value * 360, 1, 1))
|
|
}
|
|
}
|
|
return buffer
|
|
}
|
|
|
|
pset(x, y, col) { _bmp.pset(x, y, col) }
|
|
|
|
pget(x, y) { _bmp.pget(x, y) }
|
|
|
|
update() {
|
|
_frame = _frame + 1
|
|
if (_frame % 3 == 0) { // update every 3 frames or 1/20th second
|
|
_hueShift = (_hueShift + 0.02) % 1
|
|
}
|
|
}
|
|
|
|
draw(alpha) {
|
|
for (x in 0..._w) {
|
|
for (y in 0..._h) {
|
|
var hue = (_hueShift + _plasma[x][y]) % 1
|
|
var col = Color.hsv(hue * 360, 1, 1)
|
|
pset(x, y, col)
|
|
}
|
|
}
|
|
_bmp.draw(0, 0)
|
|
}
|
|
}
|
|
|
|
var Game = PlasmaEffect.new(640, 640)
|