Add circle drawing
This commit is contained in:
parent
e955a4c00d
commit
6dc5127926
@ -3,6 +3,8 @@ import {
|
|||||||
clearScreen,
|
clearScreen,
|
||||||
fillRect,
|
fillRect,
|
||||||
cameraPos,
|
cameraPos,
|
||||||
|
fillCircle,
|
||||||
|
outlineCircle,
|
||||||
} from "./window.ts";
|
} from "./window.ts";
|
||||||
import { Font, font } from "./font.ts";
|
import { Font, font } from "./font.ts";
|
||||||
import { keyDown, keyPressed, keyReleased } from "./keyboard.ts";
|
import { keyDown, keyPressed, keyReleased } from "./keyboard.ts";
|
||||||
@ -92,6 +94,8 @@ const faux = {
|
|||||||
txt: drawText,
|
txt: drawText,
|
||||||
rectfill: fillRect,
|
rectfill: fillRect,
|
||||||
rect: outlineRect,
|
rect: outlineRect,
|
||||||
|
circfill: fillCircle,
|
||||||
|
circ: outlineCircle,
|
||||||
map: (mapSheet: number, tileX: number, tileY: number, screenX: number, screenY: number, tileW: number, tileH: number) => {
|
map: (mapSheet: number, tileX: number, tileY: number, screenX: number, screenY: number, tileW: number, tileH: number) => {
|
||||||
const originalSpritesheet = getSpritesheet() ?? 0;
|
const originalSpritesheet = getSpritesheet() ?? 0;
|
||||||
getMapSheet(mapSheet).forEach(([sprSheet, spr], i) => {
|
getMapSheet(mapSheet).forEach(([sprSheet, spr], i) => {
|
||||||
|
1
carts/tmp/circ.fx
Normal file
1
carts/tmp/circ.fx
Normal file
@ -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}]
|
@ -27,8 +27,8 @@
|
|||||||
- [ ] color
|
- [ ] color
|
||||||
- [x] cls
|
- [x] cls
|
||||||
- [x] camera
|
- [x] camera
|
||||||
- [ ] circ
|
- [x] circ
|
||||||
- [ ] circfill
|
- [x] circfill
|
||||||
- [ ] oval
|
- [ ] oval
|
||||||
- [ ] ovalfill
|
- [ ] ovalfill
|
||||||
- [ ] line
|
- [ ] line
|
||||||
|
33
window.ts
33
window.ts
@ -144,7 +144,7 @@ export const setPixelColorRaw = (x: number, y: number, color: number) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const setPixelColor = (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<number>) => {
|
export const setPixelsInRect = (x: number, y: number, w: number, pixels: Array<number>) => {
|
||||||
@ -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));
|
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) => {
|
export const fillRectRaw = (x: number, y: number, w: number, h: number, color: number) => {
|
||||||
setPixelsInRectRaw(x, y, w, Array(w*h).fill(color));
|
setPixelsInRectRaw(x, y, w, Array(w*h).fill(color));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user