← BásicoObjeto 3Dfogon/parada-de-colectivo
Parada de colectivo
Arrastrá para girarlo// «Parada de colectivo» · gpt-6-sol (medium)
// Bus shelter («Parada de colectivo»).
const C = {
curb: "#626c6e", curbLight: "#879292",
grout: "#b8c5c4", tile: "#e0e7e3", tileAlt: "#d4deda",
frame: "#253d46", frameLight: "#49646a",
glass: "#79949a", glassLight: "#a7bab9",
roofDark: "#205568", roof: "#327c91", roofLight: "#438da0",
woodDark: "#99591f", wood: "#c98532", woodLight: "#efac4d",
metal: "#718384", white: "#eaf0df", yellow: "#f2c83e"
};
// Raised sidewalk and dark curb.
box(2, 4, 0, 45, 41, 2, C.curb);
box(3, 7, 3, 44, 40, 3, C.grout);
box(2, 4, 2, 45, 6, 2, C.curbLight);
box(8, 4, 3, 39, 4, 3, C.yellow);
box(8, 5, 3, 39, 5, 3, "#b99c37");
// Large square paving slabs, separated by visible joints.
for (let x = 4; x <= 43; x += 6) {
for (let y = 8; y <= 39; y += 6) {
const shade = rand() < 0.28 ? C.tileAlt : C.tile;
box(x, y, 3, Math.min(x + 4, 44), Math.min(y + 4, 40), 3, shade);
if (rand() < 0.28) {
set(x + 2, y + 2, 3, "#e9eeea");
}
}
}
// Left enclosed end: charcoal posts around blue-gray glass.
box(9, 15, 4, 11, 33, 30, C.frame);
box(11, 17, 7, 11, 31, 28, C.glass);
box(9, 17, 7, 9, 31, 28, "#586f77");
box(9, 15, 4, 12, 16, 31, C.frame);
box(9, 32, 4, 12, 34, 31, C.frame);
box(9, 15, 5, 12, 34, 6, "#344b51");
box(9, 17, 27, 9, 29, 28, "#77959c");
line(10, 18, 27, 10, 28, 9, 0, "#9ab1b2");
// Back panels and their strong vertical framing.
box(12, 32, 6, 34, 33, 30, C.frame);
box(13, 31, 9, 26, 31, 28, "#c7bea3");
box(27, 31, 8, 32, 31, 28, C.glassLight);
box(27, 30, 10, 27, 30, 27, "#bfd0ca");
box(31, 30, 10, 31, 30, 27, "#bdcfca");
box(12, 30, 5, 13, 34, 31, C.frame);
box(33, 29, 4, 35, 34, 31, C.frame);
box(33, 29, 4, 35, 35, 5, "#52676a");
box(12, 31, 28, 34, 34, 30, C.frameLight);
// Bench: three warm wooden back slats and a thick projecting seat.
for (const z of [17, 20, 23]) {
box(14, 28, z, 29, 29, z + 1, C.woodDark);
box(14, 27, z + 1, 29, 28, z + 1, C.wood);
box(15, 27, z + 1, 28, 27, z + 1, C.woodLight);
}
box(14, 22, 12, 30, 28, 13, C.woodDark);
box(14, 22, 14, 30, 28, 14, C.wood);
box(15, 22, 14, 29, 22, 14, C.woodLight);
box(15, 23, 15, 29, 27, 15, "#d99439");
for (const x of [16, 28]) {
box(x, 26, 4, x + 1, 28, 12, C.frame);
box(x, 23, 5, x + 1, 27, 6, C.frameLight);
box(x, 27, 13, x + 1, 29, 23, C.frame);
}
box(18, 25, 8, 25, 26, 9, "#526568");
// Broad gently stepped blue roof with paneled sheets and heavy fascia.
for (let y = 12; y <= 35; y++) {
const z = 33 + Math.floor((y - 12) / 9);
box(7, y, z - 2, 37, y, z - 1, C.roofDark);
box(8, y, z, 36, y, z, y % 9 === 2 ? C.roofLight : C.roof);
for (const x of [13, 20, 27, 34]) {
set(x, y, z, C.roofDark);
if (x + 1 <= 36) set(x + 1, y, z, C.roofLight);
}
}
box(7, 11, 31, 37, 12, 32, C.roofDark);
box(8, 11, 32, 36, 11, 32, "#347a8c");
box(7, 11, 30, 8, 35, 31, "#204a59");
box(8, 34, 34, 36, 36, 35, C.roofDark);
for (const x of [13, 20, 27, 34]) {
box(x, 11, 31, x, 13, 33, "#245466");
}
// White BUS lettering hanging beneath the front roof edge.
const letters = {
B: ["110", "101", "110", "101", "110"],
U: ["101", "101", "101", "101", "111"],
S: ["111", "100", "111", "001", "111"]
};
let lx = 23;
for (const ch of "BUS") {
for (let row = 0; row < 5; row++) {
for (let col = 0; col < 3; col++) {
if (letters[ch][row][col] === "1") {
set(lx + col, 12, 29 - row, C.white);
set(lx + col, 13, 29 - row, "#abbfbb");
}
}
}
lx += 4;
}
// Freestanding bus-stop sign, taller than the canopy.
box(39, 19, 3, 42, 22, 5, "#41555a");
box(40, 20, 5, 41, 21, 35, C.metal);
box(40, 19, 9, 40, 19, 30, "#a9b3ac");
box(38, 17, 33, 43, 23, 40, C.frame);
box(38, 17, 40, 43, 23, 41, "#276782");
box(39, 16, 34, 42, 16, 39, C.white);
box(39, 15, 35, 42, 15, 38, "#316b87");
box(40, 14, 36, 41, 14, 37, "#ebefe2");
set(40, 14, 35, C.yellow);
set(41, 14, 35, C.yellow);
box(39, 16, 29, 42, 17, 33, "#d8dfd5");
box(39, 15, 30, 42, 15, 32, "#f0eee0");
box(40, 14, 31, 41, 14, 31, "#d7a946");
box(43, 17, 34, 44, 19, 35, C.yellow);
// Compact dark-blue litter bin near the front-left corner.
box(9, 9, 4, 14, 14, 11, "#284450");
box(10, 8, 6, 13, 8, 10, "#405f6b");
box(11, 7, 7, 12, 7, 9, "#b8d2d2");
box(8, 8, 11, 15, 15, 12, "#304d5b");
box(9, 9, 13, 14, 14, 13, "#416c7c");
box(10, 8, 4, 13, 9, 5, "#1f3640");import { draw } from "./assets/voxel";
import { paradaDeColectivo } from "./assets/parada-de-colectivo";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, paradaDeColectivo, 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 parada-de-colectivo
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["parada-de-colectivo"] })
# Queda en client/assets/parada-de-colectivo.ts
# https://fogon.page/object/parada-de-colectivo