Skip to content

Instantly share code, notes, and snippets.

@PifyZ
Last active July 20, 2016 19:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PifyZ/1b0e4fce06a0d81e72e67e45e41570f4 to your computer and use it in GitHub Desktop.
Save PifyZ/1b0e4fce06a0d81e72e67e45e41570f4 to your computer and use it in GitHub Desktop.
import dom
type
Canvas* = ref CanvasObj
CanvasObj {.importc.} = object of dom.Element
CanvasContext2d* = ref CanvasContext2dObj
CanvasContext2dObj {.importc.} = object
font*: cstring
globalAlpha*: float
globalCompositeOperation*: cstring
shadowOffsetX*: float
shadowOffsetY*: float
shadowBlur*: float
shadowColor*: cstring
lineWidth*: float
lineCap*: cstring
lineJoin*: cstring
miterLimit*: float
lineDashOffset*: float
CanvasPattern = object of dom.Element
CanvasGradient = object of dom.Element
HTMLImageElement = object of dom.Element
HTMLCanvasElement = object of dom.Element
HTMLVideoElement = object of dom.Element
HTMLElement = object of dom.Element
proc getContext2d*(c: Canvas): CanvasContext2d =
{.emit: "`result` = `c`.getContext('2d');".}
proc requestAnimationFrame*(fn: proc) =
{.emit: "`result` = requestAnimationFrame(`fn`);".}
proc save*(c: CanvasContext2d) {.importcpp.}
proc restore*(c: CanvasContext2d) {.importcpp.}
proc scale*(c: CanvasContext2d, x, y: float) {.importcpp.}
proc rotate*(c: CanvasContext2d, angle: float) {.importcpp.}
proc translate*(c: CanvasContext2d, x, y: float) {.importcpp.}
proc transform*(ctx: CanvasContext2d, a, b, c, d, e, f: float) {.importcpp.}
proc setTransform*(ctx: CanvasContext2d, a, b, c, d, e, f: float) {.importcpp.}
proc strokeStyle*(c: CanvasContext2d) {.importcpp.}
proc fillStyle*(c: CanvasContext2d) {.importcpp.}
proc strokeStyle*(c: CanvasContext2d, value: cstring) {.importcpp.}
proc strokeStyle*(c: CanvasContext2d, value: CanvasPattern) {.importcpp.}
proc strokeStyle*(c: CanvasContext2d, value: CanvasGradient) {.importcpp.}
proc fillStyle*(c: CanvasContext2d, value: cstring) {.importcpp.}
proc fillStyle*(c: CanvasContext2d, value: CanvasPattern) {.importcpp.}
proc fillStyle*(c: CanvasContext2d, value: CanvasGradient) {.importcpp.}
proc createLinearGradient*(c: CanvasContext2d, x0, y0, x1, y1: float) {.importcpp.}
proc createRadialGradient*(c: CanvasContext2d, x0, y0, r0, x1, y2, r1: float) {.importcpp.}
proc createPattern*(c: CanvasContext2d, image: HTMLImageElement, repetition: cstring) {.importcpp.}
proc createPattern*(c: CanvasContext2d, image: HTMLCanvasElement, repetition: cstring) {.importcpp.}
proc createPattern*(c: CanvasContext2d, image: HTMLVideoElement, repetition: cstring) {.importcpp.}
proc clearRect*(c: CanvasContext2d, x, y, w, h: float) {.importcpp.}
proc fillRect*(c: CanvasContext2d, x, y, w, h: float) {.importcpp.}
proc strokeRect*(c: CanvasContext2d, x, y, w, h: float) {.importcpp.}
proc beginPath*(c: CanvasContext2d) {.importcpp.}
proc fill*(c: CanvasContext2d) {.importcpp.}
proc fill*(c: CanvasContext2d, fillRule: cstring) {.importcpp.}
proc stroke*(c: CanvasContext2d) {.importcpp.}
proc drawFocusIfNeeded*(c: CanvasContext2d, element: HTMLElement) {.importcpp.}
proc clip*(c: CanvasContext2d) {.importcpp.}
proc isPointInPath*(c: CanvasContext2d, x, y: float) {.importcpp.}
proc closePath*(c: CanvasContext2d) {.importcpp.}
proc moveTo*(c: CanvasContext2d, x, y: float) {.importcpp.}
proc lineTo*(c: CanvasContext2d, x, y: float) {.importcpp.}
proc quadraticCurveTo*(c: CanvasContext2d, cpx, cpy, x, y: float) {.importcpp.}
proc bezierCurveTo*(c: CanvasContext2d, cp1x, cp1y, cp2x, cp2y, x, y: float) {.importcpp.}
proc arcTo*(c: CanvasContext2d, x1, y1, x2, y2, radius: float) {.importcpp.}
proc rect*(c: CanvasContext2d, x, y, w, h: float) {.importcpp.}
proc arc*(c: CanvasContext2d, x, y, radius, startAngle, endAngle: float) {.importcpp.}
proc arc*(c: CanvasContext2d, x, y, radius, startAngle, endAngle: float, anticlockwise: bool) {.importcpp.}
proc fillText*(c: CanvasContext2d, text: cstring, x, y, maxWidth: float) {.importcpp.}
proc strokeText*(c: CanvasContext2d, text: cstring, x, y, maxWidth: float) {.importcpp.}
proc fillText*(c: CanvasContext2d, text: cstring, x, y: float) {.importcpp.}
proc strokeText*(c: CanvasContext2d, text: cstring, x, y: float) {.importcpp.}
proc measureText*(c: CanvasContext2d, text: cstring) {.importcpp.}
proc setLineDash*(c: CanvasContext2d, segments: openArray[float]) {.importcpp.}
proc getLineDash*(c: CanvasContext2d) {.importcpp.}
proc lineDashOffset*(c: CanvasContext2d) {.importcpp.}
# incomplet
type
Component* = ref object of RootObj
Position* = ref object of Component
x*: float
y*: float
Velocity* = ref object of Component
x*: float
y*: float
Health* = ref object of Component
health*: float
Lifetime* = ref object of Component
duration*: float
Appareance* = ref object of Component
fn*: proc()
Explosive* = ref object of Component
ray*: float
timeBeforeExplosion*: float
Weight* = ref object of Component
weight*: float
Level* = ref object of Component
level*: seq[seq[int]]
proc newPosition*(x = 0.0, y = 0.0): auto =
Position(x: x, y: y)
proc newVelocity*(x = 0.0, y = 0.0): auto =
Velocity(x: x, y: y)
proc newHealth*(value = 0.0): auto =
Health(health: value)
proc newLifetime*(value = 0.0): auto =
Lifetime(duration: value)
proc newAppareance*(value: proc): auto =
Appareance(fn: value)
proc newExplosive*(ray: float, timeBeforeExplosion: float): auto =
Explosive(ray: ray, timeBeforeExplosion: timeBeforeExplosion)
proc newWeight*(value = 0.0): auto =
Weight(weight: value)
proc newLevel*(value = @[]): auto =
Level(level: value)
import components
import tables
type
Entity* = ref object
components: seq[Component]
proc newEntity*(): auto =
Entity(components: @[])
proc addComponent*(entity: Entity, component: Component) =
entity.components.add(component)
proc hasComponent*[T](entity: Entity): bool =
for component in entity.components:
if component of T:
return true
return false
proc getComponent*[T](entity: Entity): T =
for component in entity.components:
if component of T:
return cast[T](component)
return nil
import dom
import canvas
import components
import entities
let
c = dom.document.getElementById("app").Canvas
ctx = c.getContext2d()
ctx.font = "30px Arial"
proc systemRender(ents: seq[Entity]) =
ctx.clearRect(0, 0, 640, 480)
for entity in ents:
var position = getComponent[Position](entity)
if position != nil:
ctx.strokeText($position.x, 10, 50)
position.x += 1
proc update(ents: seq[Entity]) =
systemRender(ents)
requestAnimationFrame(proc() = update(ents))
proc init() =
var player = newEntity()
player.addComponent(newPosition(42, 20))
player.addComponent(newHealth(100))
var ents: seq[Entity] = @[]
ents.add(player)
update(ents)
init()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment