← Casa completaObjeto 3Dfogon/parlante
Parlante
Arrastrá para girarlo// «Parlante» · gpt-6-sol (medium)
// A tall standing speaker: a black wooden box with two round speaker cones on the front (a small tweeter above a big woofer) with grey rings, and a small glowing power light.
const wood = ["#171513", "#1d1917", "#24201d", "#2b2520"];
const face = "#131416";
const metal = ["#626970", "#899198", "#b6bdc0"];
for (let x = 13; x <= 35; x++) {
for (let y = 17; y <= 33; y++) {
for (let z = 2; z <= 40; z++) {
if ((x === 13 || x === 35) && (z === 2 || z === 40)) continue;
let c = wood[Math.floor(rand() * wood.length)];
if (z >= 39) c = rand() < 0.25 ? "#37302a" : "#2d2722";
if (x === 13) c = "#302923";
if (x === 35) c = "#171412";
set(x, y, z, c);
}
}
}
// Little feet lift the cabinet just off the floor.
for (const x of [16, 31]) {
box(x, 21, 0, x + 2, 29, 2, "#171513");
box(x, 19, 0, x + 2, 21, 1, "#3b3530");
}
// Thick wooden surround and recessed black front panel.
box(14, 16, 3, 34, 18, 38, "#302923");
box(15, 15, 4, 33, 16, 37, face);
box(14, 16, 5, 14, 16, 37, "#44382e");
box(34, 16, 5, 34, 16, 37, "#211b18");
box(15, 16, 38, 33, 18, 39, "#40352b");
box(15, 16, 3, 33, 18, 4, "#211d19");
// Fine walnut grain on the visible sides.
for (let i = 0; i < 45; i++) {
const z = 5 + Math.floor(rand() * 32);
const y = 19 + Math.floor(rand() * 13);
set(13, y, z, rand() < 0.5 ? "#3a3028" : "#211c18");
}
// Front-panel corner fasteners.
for (const x of [16, 32]) {
for (const z of [6, 36]) {
set(x, 14, z, "#777a78");
set(x, 13, z, "#b7b9b3");
}
}
// Stationary woofer surround and mounting ring.
for (let dx = -11; dx <= 11; dx++) {
for (let dz = -11; dz <= 11; dz++) {
const r = Math.hypot(dx, dz);
const x = 23 + dx, z = 15 + dz;
if (r <= 10.7 && r >= 8.35) {
set(x, 14, z, r > 9.8 ? "#222528" : "#525a60");
if (r >= 9.1 && r <= 10.2)
set(x, 13, z, dz > 0 ? metal[2] : metal[0]);
if (r >= 8.4 && r < 9.1) set(x, 12, z, "#25292d");
}
}
}
for (const [dx, dz] of [[0, 10], [0, -10], [-10, 0], [10, 0]]) {
set(23 + dx, 12, 15 + dz, "#35393b");
set(23 + dx, 11, 15 + dz, "#bec3c1");
}
// Small tweeter: silver bezel, dark cone, and bright center dome.
for (let dx = -5; dx <= 5; dx++) {
for (let dz = -5; dz <= 5; dz++) {
const r = Math.hypot(dx, dz);
const x = 23 + dx, z = 32 + dz;
if (r <= 5.15) set(x, 14, z, "#34393c");
if (r >= 3.7 && r <= 5.15)
set(x, 13, z, dz > 0 ? "#b4bab9" : "#747d80");
if (r < 3.75) set(x, 13, z, r > 2.5 ? "#262b2e" : "#434a4d");
if (r < 1.65) set(x, 12, z, dz > 0 ? "#929c9e" : "#677176");
}
}
set(22, 11, 33, "#cbd1cf");
// Chunky volume knob and a tiny illuminated power button.
box(30, 14, 34, 32, 15, 36, "#555b5c");
box(30, 13, 34, 32, 13, 36, "#a9afad");
set(31, 12, 35, "#4c5254");
set(31, 11, 36, "#e0e0d1");
box(30, 14, 28, 32, 15, 30, "#545e58");
set(31, 13, 29, "#a8e6aa");
set(31, 12, 29, "#d5ffd2");
set(30, 13, 30, "#81bb86");
// The cone alone pumps; the heavy surround stays attached to the cabinet.
part("woofer", [23, 15, 15]);
for (let dx = -8; dx <= 8; dx++) {
for (let dz = -8; dz <= 8; dz++) {
const r = Math.hypot(dx, dz);
if (r > 8.45) continue;
const x = 23 + dx, z = 15 + dz;
let y, color;
if (r > 7.5) {
y = 13;
color = "#41484c";
} else if (r > 5.3) {
y = 14;
color = dz > 0 ? "#565e63" : "#394146";
} else if (r > 3.1) {
y = 15;
color = dz > 0 ? "#485156" : "#30383d";
} else {
y = 13;
color = dz > 0 ? "#666e71" : "#424a4e";
}
set(x, y + 1, z, "#252a2d");
set(x, y, z, color);
if (r > 2.7 && r <= 3.2) set(x, y - 1, z, "#242a2e");
if (r < 1.3 && dz > 0) set(x, 12, z, "#858d8d");
}
}
animate("woofer", { type: "bob", axis: "y", speed: 6, amplitude: 1 });
part("body", [24, 24, 0]);import { draw } from "./assets/voxel";
import { parlante } from "./assets/parlante";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, parlante, 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 parlante
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["parlante"] })
# Queda en client/assets/parlante.ts
# https://fogon.page/object/parlante