diff options
author | ubq323 <ubq323@ubq323.website> | 2024-03-21 21:35:15 +0000 |
---|---|---|
committer | ubq323 <ubq323@ubq323.website> | 2024-03-21 21:35:15 +0000 |
commit | f09d855593cc5405937d20571526f81583f0cb8b (patch) | |
tree | 16519799b2aa0c6baa285d2979d0eb93c3b289fe |
the
-rw-r--r-- | main.ha | 62 | ||||
-rw-r--r-- | main.lua | 55 | ||||
-rw-r--r-- | spec | 8 |
3 files changed, 125 insertions, 0 deletions
@@ -0,0 +1,62 @@ +use fmt; +use sdl2; + +export fn main() void = { + sdl2::SDL_Init(sdl2::SDL_INIT_VIDEO)!; + defer sdl2::SDL_Quit(); + + const win = sdl2::SDL_CreateWindow("hi", sdl2::SDL_WINDOWPOS_UNDEFINED, sdl2::SDL_WINDOWPOS_UNDEFINED, 640, 480, sdl2::SDL_WindowFlags::NONE)!; + defer sdl2::SDL_DestroyWindow(win); + + const wsurf = sdl2::SDL_GetWindowSurface(win)!; + const format = wsurf.format; + assert(format.bytesperpixel == 4, "can only work with u32 pixels"); + fmt::printfln("got format {}. bytes per pixel {}. r{:x} g{:x} b{:x} a{:x}", + format.format, format.bytesperpixel, format.rmask, format.gmask, format.bmask, format.amask)!; + fmt::printfln("red: {:x} green {:x} blue {:x}", + sdl2::SDL_MapRGB(format, 255, 0, 0), + sdl2::SDL_MapRGB(format, 0, 255, 0), + sdl2::SDL_MapRGB(format, 0, 0, 255))!; + fmt::println(wsurf.w * wsurf.h)!; + + const pixels = (wsurf.pixels as *opaque: *[*]u32)[..wsurf.w * wsurf.h]; + + + let quit = false; + let n = 0z; + for (!quit) { + let ev = sdl2::event { ... }; + for (sdl2::SDL_PollEvent(&ev)! == 1) switch (ev.event_type) { + case sdl2::SDL_EventType::QUIT => quit = true; + case sdl2::SDL_EventType::KEYDOWN => { + const keysym = ev.key.keysym.sym; + if (keysym == sdl2::SDL_Keycode::ESCAPE) quit = true; + fmt::println("got key", keysym: int)!; + }; + case => void; + }; + + for (let i = 0z; i < 100; i+=1) { + pixels[n] = sdl2::SDL_MapRGB(format, 0, 255, 0); + n += 1; + }; + + + sdl2::SDL_UpdateWindowSurface(win)!; + sdl2::SDL_Delay(1000 / 60); + + // sdl2::SDL_SetRenderDrawColor(render, 50, 50, 50, 255)!; + // sdl2::SDL_RenderClear(render)!; + + // rect.x = (sdl2::SDL_GetTicks(): int)/100; + // sdl2::SDL_SetRenderDrawColor(render, 255, 0, 0, 0)!; + // sdl2::SDL_RenderFillRect(render, &rect)!; + + // sdl2::SDL_RenderPresent(render); + // sdl2::SDL_Delay(1000 / 60); + }; + + + + +}; diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..b03306a --- /dev/null +++ b/main.lua @@ -0,0 +1,55 @@ +local L = love +local G = L.graphics + +local R = 10 + +local canv +function L.load() + canv = G.newCanvas() + canv:renderTo(function() + G.clear(1,1,1) + end) + G.setLineWidth(R) +end + +local T = 0 +function L.update(dt) + T = T + dt +end + + +local function line_between(x0,y0,x1,y1) + canv:renderTo(function() + G.line(x0,y0,x1,y1) + end) +end +local function circle(x,y) + canv:renderTo(function() + G.circle('fill',x,y,R/2) + end) +end + + +local last = nil +function L.draw() + G.setColor(0,0,0) + local x,y = L.mouse.getPosition() + if L.mouse.isDown(1) then + if last == nil then + circle(x,y) + last = {x,y} + else + circle(x,y) + line_between(last[1],last[2],x,y) + last[1],last[2] = x,y + end + elseif last ~= nil then + circle(x,y) + line_between(last[1],last[2],x,y) + last=nil + end + + G.setColor(1,1,1) + G.draw(canv) + +end @@ -0,0 +1,8 @@ +program where you can draw with the mouse +program where you can draw with the mouse and it draws lines between the points +program where you can draw with the mouse and it interpolates nicely with beziers +program where you can do that multiplayerly + hard! +program where you can switch between drawing and moving around +program where you can do that and also see each other's positions + |