← Casa completaObjeto 3Dfogon/escritorio-gamer
Escritorio gamer
Arrastrá para girarlo// «Escritorio gamer» · gpt-6-sol (medium)
// A gaming desk: a wide black desk with carbon-texture top and angular legs with red accents, a glowing RGB light strip along the edge, two monitors on top, a keyboard, a mouse on a big pad and a pair of headphones.
const black = "#202229", charcoal = "#30323a", edge = "#454750";
const red = "#dc505b", redDark = "#963844";
const walnut = "#76513f";
// Wide, thick desktop.
box(3, 9, 18, 44, 37, 20, black);
box(4, 10, 21, 43, 36, 21, "#292b31");
box(3, 9, 18, 44, 9, 18, "#17191e");
box(3, 36, 18, 44, 37, 20, "#353137");
// Fine, diagonal carbon weave on the top.
for (let x = 5; x <= 42; x++) {
for (let y = 11; y <= 35; y++) {
if ((x + 2 * y) % 6 === 0)
set(x, y, 21, rand() < 0.7 ? "#373940" : "#414148");
else if (rand() < 0.045)
set(x, y, 21, "#24262d");
}
}
// Chunky, slightly splayed angular legs, front and back.
for (const side of [0, 1]) {
const inner = side ? 37 : 7;
const outer = side ? 42 : 3;
for (const y of [13, 32]) {
line(outer, y, 0, inner, y, 18, 2, charcoal);
line(outer, y, 0, inner, y, 18, 1, "#24262c");
box(outer - 1, y - 2, 0, outer + 1, y + 2, 1, "#17191e");
line(outer, y - 2, 2, inner, y - 2, 16, 0, red);
line(outer, y - 2, 2, inner, y - 2, 9, 0, redDark);
}
line(outer, 14, 5, outer, 31, 5, 1, "#292a30");
line(outer, 16, 5, outer, 29, 5, 0, walnut);
}
box(8, 32, 13, 39, 33, 16, "#292a30");
box(9, 32, 15, 38, 32, 15, redDark);
// Narrow walnut trim warms up the black desk.
box(5, 10, 18, 42, 10, 18, walnut);
box(5, 36, 20, 42, 36, 20, "#9a6b50");
// Both monitor stands sit behind the desk accessories.
for (const cx of [15, 33]) {
box(cx - 4, 27, 22, cx + 4, 33, 22, "#17191f");
box(cx - 3, 27, 23, cx + 3, 32, 23, "#43444b");
box(cx - 1, 29, 23, cx + 1, 31, 27, "#55545c");
box(cx, 29, 23, cx, 29, 26, "#a3a2aa");
}
// Two thick, toy-like monitor casings.
for (const [x0, x1] of [[7, 23], [25, 41]]) {
box(x0, 28, 26, x1, 31, 40, "#181a21");
box(x0, 27, 26, x1, 27, 40, "#34363f");
box(x0 + 1, 27, 27, x1 - 1, 27, 38, "#101a27");
box(x0 + 2, 27, 39, x1 - 2, 27, 39, "#55545e");
set((x0 + x1) / 2, 26, 26, "#85ded1");
}
// Left screen: cheerful little landscape game.
box(9, 26, 28, 21, 26, 37, "#86cde3");
box(9, 26, 28, 21, 26, 30, "#448b72");
box(9, 26, 31, 21, 26, 31, "#c3dca7");
box(9, 26, 32, 21, 26, 32, "#a6d9d7");
box(16, 26, 34, 19, 26, 35, "#ffe4a8");
box(17, 26, 36, 18, 26, 36, "#ffedc3");
line(9, 26, 31, 13, 26, 34, 0, "#76afa8");
line(13, 26, 34, 17, 26, 31, 0, "#76afa8");
line(15, 26, 30, 20, 26, 33, 0, "#286f6e");
box(11, 25, 29, 12, 25, 31, "#f7c18e");
set(12, 25, 32, "#ffebbc");
box(9, 25, 37, 13, 25, 37, "#e8f5e9");
set(10, 24, 37, "#6da88f");
// Right screen: purple arcade wallpaper and bright UI.
box(27, 26, 28, 39, 26, 37, "#554a91");
box(27, 25, 28, 39, 25, 29, "#31385c");
for (let x = 28; x <= 38; x += 3) {
box(x, 25, 30, x + 1, 25, 30, "#9c82c5");
}
line(29, 25, 32, 33, 25, 36, 0, "#90e4db");
line(33, 25, 36, 37, 25, 32, 0, "#90e4db");
line(37, 25, 32, 33, 25, 29, 0, "#f0a5b0");
line(33, 25, 29, 29, 25, 32, 0, "#f0a5b0");
box(32, 24, 32, 34, 24, 33, "#fff0bd");
box(28, 25, 37, 31, 25, 37, "#b5a2d7");
set(38, 25, 37, "#a9eadc");
// Large fabric desk mat, with rounded-looking clipped corners.
box(13, 12, 22, 37, 25, 22, "#161b22");
box(14, 12, 22, 36, 25, 22, "#222934");
box(13, 14, 22, 13, 23, 22, "#805978");
box(37, 14, 22, 37, 23, 22, "#805978");
box(15, 13, 22, 35, 13, 22, "#5a6475");
box(15, 24, 22, 35, 24, 22, "#4a5363");
// Keyboard: raised case and rows of individually readable keys.
box(15, 15, 23, 29, 20, 23, "#10131a");
box(16, 16, 24, 28, 19, 24, "#4b4e59");
for (let y = 16; y <= 19; y++) {
for (let x = 16; x <= 28; x += 2) {
const colors = ["#e5d8de", "#aee5da", "#b5cce8", "#f2c5aa"];
set(x, y, 25, colors[(x + y) % colors.length]);
}
}
box(20, 16, 25, 25, 16, 25, "#e9e0dc");
box(18, 15, 23, 26, 15, 23, "#676574");
// Mouse on the right of the keyboard.
box(33, 16, 23, 35, 19, 23, "#d8dedc");
box(33, 17, 24, 35, 19, 24, "#eff1e9");
box(34, 16, 24, 34, 17, 24, "#55515e");
set(34, 18, 25, "#88dace");
// Headphones resting on a little stand at the right.
box(39, 22, 22, 42, 25, 22, "#45434b");
box(40, 23, 23, 41, 24, 27, "#7d6b74");
line(36, 21, 28, 36, 21, 31, 1, "#efa69d");
line(36, 21, 31, 39, 21, 34, 1, "#efa69d");
line(39, 21, 34, 42, 21, 34, 1, "#efa69d");
line(42, 21, 34, 44, 21, 31, 1, "#efa69d");
line(44, 21, 31, 44, 21, 28, 1, "#efa69d");
box(35, 19, 26, 37, 22, 29, "#34343e");
box(43, 19, 26, 45, 22, 29, "#34343e");
box(35, 18, 27, 37, 18, 28, "#b9e2d5");
box(43, 18, 27, 45, 18, 28, "#b9e2d5");
box(38, 20, 34, 42, 21, 34, "#f6bbb0");
// Animated RGB strip inset into the entire front edge.
part("rgb", [24, 9, 19]);
const rgb = ["#ff6376", "#a47aff", "#64a8ff", "#77e7e1", "#a0e9a0"];
for (let x = 5; x <= 42; x++) {
set(x, 8, 19, rgb[Math.floor((x - 5) / 8) % rgb.length]);
}
for (let y = 10; y <= 34; y++) {
set(3, y, 19, rgb[Math.floor(y / 6) % rgb.length]);
set(44, y, 19, rgb[Math.floor((y + 2) / 6) % rgb.length]);
}
animate("rgb", {
type: "colors",
palette: rgb,
pattern: "wave",
glow: 0.9
});
part("body");import { draw } from "./assets/voxel";
import { escritorioGamer } from "./assets/escritorio-gamer";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, escritorioGamer, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add escritorio-gamer
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["escritorio-gamer"] })
# Queda en client/assets/escritorio-gamer.ts
# https://fogon.page/object/escritorio-gamer