← Casa completaObjeto 3Dfogon/pecera
Pecera
Arrastrá para girarlo// «Pecera» · gpt-6-sol (medium)
// A rectangular fish tank on a small wooden cabinet: light blue water (glass edges a bit lighter), sand and pebbles on the bottom, green water plants, a little treasure chest, and two orange goldfish.
// A little wooden stand for the aquarium.
box(7, 15, 0, 10, 19, 5, "#a66b3c");
box(37, 15, 0, 40, 19, 5, "#a66b3c");
box(7, 31, 0, 10, 35, 5, "#966039");
box(37, 31, 0, 40, 35, 5, "#966039");
box(6, 14, 4, 41, 36, 14, "#b87a43");
box(7, 14, 5, 40, 15, 12, "#d69a58");
box(7, 35, 5, 40, 36, 12, "#986038");
box(6, 13, 13, 41, 37, 15, "#e0a65e");
box(6, 12, 14, 41, 37, 15, "#f0bb75");
box(7, 13, 15, 40, 36, 15, "#f7cc89");
// Cabinet doors, raised panels, and chunky brass pulls.
box(8, 12, 5, 23, 13, 12, "#87542f");
box(25, 12, 5, 39, 13, 12, "#87542f");
box(10, 11, 6, 21, 12, 11, "#d8a067");
box(27, 11, 6, 37, 12, 11, "#d8a067");
box(11, 10, 7, 20, 10, 10, "#e9b779");
box(28, 10, 7, 36, 10, 10, "#e9b779");
box(22, 9, 8, 23, 10, 9, "#f7d888");
box(25, 9, 8, 26, 10, 9, "#f7d888");
box(7, 12, 4, 40, 13, 4, "#85532f");
for (let x = 9; x <= 38; x++) {
if (rand() < 0.22) set(x, 10, 6 + Math.floor(rand() * 5), "#dca972");
}
// Dark gasket and a thick, pale-blue glass floor.
box(5, 12, 16, 42, 37, 17, "#6b97a0");
box(6, 13, 17, 41, 36, 18, "#a9dce1");
// Sandy bed, uneven along its top.
box(8, 14, 19, 39, 35, 20, "#eed79a");
for (let x = 8; x <= 39; x++) {
for (let y = 14; y <= 35; y++) {
const r = rand();
set(x, y, 20, r < 0.18 ? "#fff0bc" : r < 0.38 ? "#d8bc80" : "#eed79a");
if (rand() < 0.055) set(x, y, 21, "#e9cf90");
}
}
// The back and sides suggest clear, softly blue water while leaving the
// front open so all the tiny inhabitants remain visible.
box(8, 35, 21, 39, 36, 37, "#a8d9e8");
box(8, 35, 34, 39, 35, 37, "#b9e8f0");
for (let x = 9; x <= 38; x++) {
for (let z = 22; z <= 35; z++) {
if (rand() < 0.13) set(x, 34, z, rand() < 0.5 ? "#b8e4ed" : "#9bd2e3");
}
}
box(7, 14, 19, 8, 35, 37, "#b8e5ed");
box(39, 14, 19, 40, 35, 37, "#b8e5ed");
box(8, 14, 37, 39, 35, 37, "#c5edf2");
// Rounded pebbles scattered across the sand.
const stones = [
[11, 19, 2, "#b4a498"], [17, 27, 2, "#d2b5a0"],
[23, 17, 1, "#9ab5af"], [34, 24, 2, "#c6a68d"],
[38, 31, 1, "#a3ada1"], [14, 33, 2, "#e1c5a5"],
[29, 16, 1, "#a4b9b2"], [20, 32, 1, "#c5a390"]
];
for (const [x, y, r, c] of stones) ellipsoid(x, y, 21, r, r, 1, c);
// Water plants: broad toy-like leaves and several reaching stems.
const plants = [
[11, 30, 32], [15, 33, 29], [22, 32, 34],
[35, 30, 33], [38, 27, 29]
];
for (const [x, y, top] of plants) {
box(x - 1, y - 1, 20, x + 1, y + 1, 21, "#669b5e");
line(x, y, 21, x, y, top, 0, "#3c9465");
for (let z = 24; z < top; z += 3) {
const side = ((z + x) % 2) ? 1 : -1;
ellipsoid(x + side * 2, y, z, 2, 1, 1, "#55b579");
set(x + side * 3, y, z, "#77cd8b");
}
ellipsoid(x, y, top, 1, 1, 2, "#70c987");
}
// A tiny treasure chest tucked into the back of the tank.
box(26, 27, 21, 33, 32, 24, "#805332");
box(27, 26, 22, 32, 26, 24, "#b8793e");
box(26, 27, 25, 33, 32, 26, "#bd8144");
box(27, 26, 26, 32, 32, 26, "#e5ab5e");
box(26, 26, 22, 26, 32, 26, "#e4bd72");
box(33, 26, 22, 33, 32, 26, "#e4bd72");
box(29, 25, 23, 30, 26, 25, "#f7d279");
set(29, 24, 24, "#fff1ac");
// Bubbles rising in front of the backdrop.
for (const [x, y, z] of [
[24, 23, 24], [23, 23, 27], [25, 24, 30], [24, 23, 33],
[37, 22, 25], [36, 22, 28], [38, 23, 31]
]) {
set(x, y, z, "#eafffa");
set(x + 1, y, z + 1, "#d2f5f5");
}
// Front glass highlights and a substantial, readable aquarium frame.
box(6, 12, 18, 41, 13, 19, "#c6edf1");
box(6, 12, 36, 41, 13, 37, "#d5f4f4");
box(6, 12, 18, 7, 13, 38, "#c4edf1");
box(40, 12, 18, 41, 13, 38, "#c4edf1");
box(5, 12, 38, 42, 37, 39, "#6b9ca7");
box(6, 12, 39, 41, 36, 40, "#a7d5dd");
box(8, 11, 40, 39, 12, 40, "#d9f3f2");
box(9, 11, 27, 9, 11, 33, "#e8fbf8");
box(10, 11, 31, 10, 11, 35, "#e8fbf8");
box(38, 11, 23, 38, 11, 29, "#e8fbf8");
// Each goldfish is an independently bobbing part.
part("goldfish-one", [17, 21, 28]);
ellipsoid(17, 21, 28, 3, 2, 2, "#f9a632");
ellipsoid(18, 20, 29, 2, 1, 1, "#ffcc60");
ellipsoid(14, 21, 28, 1, 1, 1, "#e97b24");
ellipsoid(12, 21, 29, 2, 1, 1, "#ffb245");
ellipsoid(12, 21, 27, 2, 1, 1, "#ef8a2c");
line(16, 21, 30, 15, 21, 32, 0, "#f28c2e");
ellipsoid(17, 19, 27, 1, 1, 1, "#f28b2c");
set(19, 19, 29, "#fff8df");
set(20, 18, 29, "#343c45");
set(21, 20, 27, "#e97931");
animate("goldfish-one", { type: "bob", axis: "x", speed: 1, amplitude: 4 });
part("body");
part("goldfish-two", [31, 20, 30]);
ellipsoid(31, 20, 30, 3, 2, 2, "#ed8d2b");
ellipsoid(30, 19, 31, 2, 1, 1, "#ffc459");
ellipsoid(34, 20, 30, 1, 1, 1, "#dc7225");
ellipsoid(36, 20, 31, 2, 1, 1, "#ffb044");
ellipsoid(36, 20, 29, 2, 1, 1, "#f49131");
line(31, 20, 32, 32, 20, 34, 0, "#f5a238");
ellipsoid(31, 18, 29, 1, 1, 1, "#f6a139");
set(29, 18, 31, "#fff8df");
set(28, 17, 31, "#343c45");
set(27, 19, 29, "#e77b2c");
animate("goldfish-two", { type: "bob", axis: "z", speed: 1.5, amplitude: 2 });
part("body");import { draw } from "./assets/voxel";
import { pecera } from "./assets/pecera";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, pecera, 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 pecera
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["pecera"] })
# Queda en client/assets/pecera.ts
# https://fogon.page/object/pecera