diff --git a/builtins.ts b/builtins.ts index 8e36ec6..2e4a9fa 100644 --- a/builtins.ts +++ b/builtins.ts @@ -3,6 +3,8 @@ import { clearScreen, fillRect, cameraPos, +fillCircle, +outlineCircle, } from "./window.ts"; import { Font, font } from "./font.ts"; import { keyDown, keyPressed, keyReleased } from "./keyboard.ts"; @@ -92,6 +94,8 @@ const faux = { txt: drawText, rectfill: fillRect, rect: outlineRect, + circfill: fillCircle, + circ: outlineCircle, map: (mapSheet: number, tileX: number, tileY: number, screenX: number, screenY: number, tileW: number, tileH: number) => { const originalSpritesheet = getSpritesheet() ?? 0; getMapSheet(mapSheet).forEach(([sprSheet, spr], i) => { diff --git a/carts/tmp/circ.fx b/carts/tmp/circ.fx new file mode 100644 index 0000000..8f70c7d --- /dev/null +++ b/carts/tmp/circ.fx @@ -0,0 +1 @@ +[{"sheet_type":"code","value":"// Sample\n\nlet r = 0;\nlet d = 1;\nreturn {\n\tinit() {},\n\tupdate() {\n\t\tif (r >= 20) {\n\t\t\td = -1;\n\t\t} else if (r < 0) {\n\t\t\td = 1;\n\t\t}\n\t\tr += d*0.1;\t\n\t},\n\tdraw() {\n\t\tcls();\n\t\tcirc(50, 50, 6, 17);\n\t\ttxt(10,10,\"Hello, World!\");\n\t}\n}"},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null},{"sheet_type":"none","value":null}] \ No newline at end of file diff --git a/pico8_builtins.txt b/pico8_builtins.txt index 997b1e7..6be41b5 100644 --- a/pico8_builtins.txt +++ b/pico8_builtins.txt @@ -27,8 +27,8 @@ - [ ] color - [x] cls - [x] camera -- [ ] circ -- [ ] circfill +- [x] circ +- [x] circfill - [ ] oval - [ ] ovalfill - [ ] line diff --git a/window.ts b/window.ts index 4727ff2..af9bb8d 100644 --- a/window.ts +++ b/window.ts @@ -144,7 +144,7 @@ export const setPixelColorRaw = (x: number, y: number, color: number) => { } export const setPixelColor = (x: number, y: number, color: number) => { - return setPixelColorRaw(x - cameraPos.x, y - cameraPos.y, color); + return setPixelColorRaw(Math.floor(x - cameraPos.x), Math.floor(y - cameraPos.y), color); } export const setPixelsInRect = (x: number, y: number, w: number, pixels: Array) => { @@ -163,6 +163,37 @@ export const fillRect = (x: number, y: number, w: number, h: number, color: numb setPixelsInRect(x, y, w, Array(w*h).fill(color)); } +export const fillCircle = (x: number, y: number, r: number, color: number) => { + const left = Math.floor(x-r-1); + const top = Math.floor(y-r-1); + for (let i = left; i <= Math.ceil(x+r+1); i ++) { + for (let j = top; j <= Math.ceil(y+r+1); j ++) { + if (Math.sqrt((x-i)**2 + (y-j)**2) <= r+0.5) { + setPixelColor(i, j, color); + } + } + } +} + +export const outlineCircle = (x: number, y: number, r: number, color: number) => { + const left = Math.floor(x-r-1); + const top = Math.floor(y-r-1); + const inR = (d: number) => d <= r+0.5 && d > r-0.5; + for (let i = left; i <= Math.ceil(x+r+1); i ++) { + for (let j = top; j <= Math.ceil(y+r+1); j ++) { + const d = Math.sqrt((x-i)**2 + (y-j)**2); + if (inR(d)) { + const dh = Math.sqrt((x-(i+Math.sign(i-x)))**2 + (y-j)**2); + const dv = Math.sqrt((x-i)**2 + (y-(j+Math.sign(j-y)))**2); + const h = Math.abs(x-i) > Math.abs(y-j); + if (!inR(h ? dh : dv)) { + setPixelColor(i, j, color); + } + } + } + } +} + export const fillRectRaw = (x: number, y: number, w: number, h: number, color: number) => { setPixelsInRectRaw(x, y, w, Array(w*h).fill(color)); }