← AnimalesObjeto 3Dfogon/luciernaga
Luciérnaga
Arrastrá para girarlo// «Luciérnaga» · gpt-6-sol (medium)
// A cartoon firefly: a small dark brown body with a red-orange head shield, antennae, little legs, translucent wings and a big round glowing yellow-green tail light at the back.
// Six little legs and rounded feet.
for (const side of [-1, 1]) {
for (const y of [17, 24, 30]) {
const hipX = 24 + side * 6;
const footX = 24 + side * (y === 24 ? 12 : 11);
line(hipX, y, 14, footX, y + 1, 4, 1.4, "#38251e");
sphere(footX, y, 2, 2.2, "#513025");
box(footX - 1, y - 1, 0, footX + 1, y + 1, 1, "#38251e");
}
}
// Dark, plump body.
ellipsoid(24, 25, 17, 7, 10, 8, "#38251e");
ellipsoid(24, 24, 19, 7, 8, 7, "#593526");
ellipsoid(24, 23, 23, 5, 5, 2, "#70452d");
ellipsoid(24, 30, 17, 7, 4, 7, "#41291f");
// A dark rim makes the lantern read as part of the firefly.
ellipsoid(24, 35, 17, 8, 9, 8, "#39291c");
ellipsoid(24, 35, 19, 7, 8, 6, "#594027");
// Oversized red-orange head and its bright top shield.
ellipsoid(24, 16, 19, 8, 8, 8, "#9e3924");
ellipsoid(24, 15, 20, 7, 7, 7, "#dc592d");
ellipsoid(24, 15, 24, 7, 6, 3, "#f07834");
ellipsoid(24, 14, 26, 5, 4, 1, "#ff9947");
// Simple glossy dot eyes.
for (const x of [20, 28]) {
sphere(x, 9, 20, 1.7, "#211b19");
set(x - 1, 8, 21, "#fff4d6");
}
// Two curved, club-tipped antennae.
for (const side of [-1, 1]) {
const root = 24 + side * 4;
line(root, 11, 25, root + side * 1, 8, 30, 0.8, "#493023");
line(root + side, 8, 30, root + side * 4, 5, 34, 0.8, "#493023");
sphere(root + side * 4, 5, 34, 1.5, "#71412a");
}
// Pulsing yellow-green lantern. Its darker rim stays still.
part("light", [24, 35, 17]);
ellipsoid(24, 36, 17, 7, 7, 7, "#c9ee42");
ellipsoid(24, 36, 19, 6, 6, 5, "#e5f65b");
animate("light", {
type: "colors",
palette: ["#bbeb39", "#dafa50", "#fff46a", "#e8f84e"],
pattern: "pulse",
glow: 0.8
});
part("body");
ellipsoid(21, 32, 22, 2, 3, 1, "#fff7a3");
sphere(20, 31, 21, 1, "#fffcd0");
// Thin, broad wings, each hinged at the shoulder.
for (const side of [-1, 1]) {
const name = side === -1 ? "leftWing" : "rightWing";
part(name, [24 + side * 6, 24, 25]);
ellipsoid(24 + side * 13, 27, 27, 8, 5, 2, "#799d92");
ellipsoid(24 + side * 13, 27, 28, 7, 4, 1, "#bce6d7");
ellipsoid(24 + side * 12, 31, 27, 6, 4, 2, "#91b9aa");
ellipsoid(24 + side * 12, 31, 28, 5, 3, 1, "#d5f2dd");
line(24 + side * 6, 24, 28, 24 + side * 18, 27, 29, 0, "#e9f7d9");
line(24 + side * 9, 26, 29, 24 + side * 15, 32, 29, 0, "#e9f7d9");
animate(name, {
type: "swing",
axis: "y",
speed: side === -1 ? 10 : -10,
amplitude: 0.4
});
}import { draw } from "./assets/voxel";
import { luciernaga } from "./assets/luciernaga";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, luciernaga, 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 luciernaga
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["luciernaga"] })
# Queda en client/assets/luciernaga.ts
# https://fogon.page/object/luciernaga