← FantasíaObjeto 3Dfogon/elfo-arquero
Elfo arquero
Arrastrá para girarlo// «Elfo arquero» · gpt-6-sol (medium)
// A slender cartoon elf archer standing facing front (-y): long pointy ears, long blond hair, big friendly eyes, a forest-green hooded tunic with a brown leather belt, tall brown boots, a wooden longbow held in the left hand and a quiver of arrows with green feathers on the back.
// Storybook elf archer — front faces -y.
const green = "#326b48";
const lightGreen = "#45845a";
const darkGreen = "#244c3c";
const skin = "#efbd8d";
const skinShade = "#d99a72";
const gold = "#f5cf65";
const hairShade = "#dba846";
const leather = "#70462e";
const leatherLight = "#98613a";
const bootDark = "#4e342b";
// Walking legs, each pivoting at its hip.
part("leftLeg", [20, 24, 16]);
ellipsoid(20, 24, 12, 3, 3, 5, "#385b42");
box(18, 22, 5, 22, 26, 12, leather);
box(17, 20, 0, 22, 27, 6, bootDark);
box(17, 17, 0, 22, 24, 3, leather);
box(18, 17, 3, 21, 18, 3, leatherLight);
box(18, 20, 8, 22, 22, 9, leatherLight);
animate("leftLeg", { type: "swing", axis: "x", speed: 5, amplitude: 0.3 });
part("rightLeg", [28, 24, 16]);
ellipsoid(28, 24, 12, 3, 3, 5, "#385b42");
box(26, 22, 5, 30, 26, 12, leather);
box(26, 20, 0, 31, 27, 6, bootDark);
box(26, 17, 0, 31, 24, 3, leather);
box(27, 17, 3, 30, 18, 3, leatherLight);
box(26, 20, 8, 30, 22, 9, leatherLight);
animate("rightLeg", { type: "swing", axis: "x", speed: -5, amplitude: 0.3 });
part("body", [24, 24, 22]);
// Tunic: rounded shoulders, narrow waist, and a flared hem.
ellipsoid(24, 24, 24, 8, 6, 8, green);
ellipsoid(24, 24, 17, 8, 6, 4, darkGreen);
ellipsoid(24, 22, 18, 7, 5, 4, green);
for (let x = 18; x <= 30; x++) {
const hem = 15 + Math.round(Math.abs(x - 24) / 3);
set(x, 18, hem, lightGreen);
}
line(19, 18, 27, 24, 17, 22, 1, lightGreen);
line(29, 18, 27, 24, 17, 22, 1, lightGreen);
box(18, 18, 19, 30, 29, 20, leather);
box(22, 17, 19, 26, 18, 21, "#c99a48");
box(23, 16, 19, 25, 17, 20, "#f5d477");
// The free arm and its little leather glove.
ellipsoid(16, 23, 27, 3, 3, 3, darkGreen);
line(15, 22, 26, 13, 19, 20, 2, green);
ellipsoid(13, 18, 19, 2, 2, 2, leatherLight);
set(12, 16, 19, skin);
// Quiver sits behind the right shoulder, with arrows rising past the hood.
line(31, 31, 20, 27, 29, 27, 1, leatherLight);
ellipsoid(32, 32, 27, 3, 3, 7, leather);
box(30, 29, 22, 34, 32, 23, leatherLight);
box(30, 29, 31, 34, 32, 32, "#b77b44");
for (const [x, top] of [[30, 42], [32, 45], [34, 43]]) {
line(x, 31, 29, x, 31, top - 2, 0, "#c79a57");
line(x - 1, 31, top - 3, x, 31, top, 0, "#66ae68");
line(x + 1, 31, top - 3, x, 31, top, 0, "#3c814f");
set(x, 31, top, "#e4d6a3");
}
// Hood and long blond hair behind the face.
ellipsoid(24, 24, 35, 10, 9, 9, darkGreen);
ellipsoid(24, 23, 37, 9, 9, 7, green);
ellipsoid(17, 19, 29, 3, 4, 9, hairShade);
ellipsoid(31, 19, 29, 3, 4, 9, hairShade);
line(17, 15, 32, 17, 16, 25, 1, gold);
line(31, 15, 32, 31, 16, 25, 1, gold);
// Long pointed ears, backed by the hood.
line(17, 20, 35, 8, 19, 39, 2, skinShade);
line(17, 17, 35, 8, 17, 39, 1, skin);
line(31, 20, 35, 40, 19, 39, 2, skinShade);
line(31, 17, 35, 40, 17, 39, 1, skin);
line(13, 16, 37, 9, 16, 39, 0, "#c97878");
line(35, 16, 37, 39, 16, 39, 0, "#c97878");
// Big soft face and sweeping blond fringe.
ellipsoid(24, 17, 34, 7, 5, 7, skinShade);
ellipsoid(24, 15, 35, 7, 4, 7, skin);
ellipsoid(24, 17, 41, 7, 4, 2, gold);
line(18, 14, 40, 21, 12, 39, 1, gold);
line(29, 13, 40, 26, 12, 39, 1, hairShade);
for (const x of [18, 30]) {
line(x, 14, 38, x, 13, 29, 1, gold);
line(x, 13, 31, x, 12, 27, 0, hairShade);
}
// Friendly oversized eyes, rosy cheeks, nose, and smile.
for (const x of [21, 27]) {
ellipsoid(x, 11, 35, 2, 1, 2, "#fff5dd");
box(x, 10, 34, x + 1, 10, 36, "#354b46");
set(x, 9, 36, "#ffffff");
}
set(18, 11, 32, "#d98984");
set(30, 11, 32, "#d98984");
set(24, 10, 32, skinShade);
line(22, 11, 30, 24, 10, 29, 0, "#a95752");
line(24, 10, 29, 26, 11, 30, 0, "#a95752");
// The bow, glove, and entire holding arm share one shoulder pivot.
part("bowArm", [32, 23, 28]);
ellipsoid(32, 23, 28, 3, 3, 3, darkGreen);
line(33, 22, 27, 36, 18, 23, 2, green);
line(36, 18, 23, 39, 16, 23, 1, skin);
ellipsoid(39, 16, 23, 2, 2, 2, leatherLight);
// Curved wooden longbow and a fine taut string.
const bow = [
[39, 9], [41, 12], [43, 17], [44, 23],
[43, 29], [41, 34], [39, 37]
];
for (let i = 0; i < bow.length - 1; i++) {
line(bow[i][0], 16, bow[i][1],
bow[i + 1][0], 16, bow[i + 1][1], 1, leather);
}
line(39, 15, 10, 39, 15, 36, 0, "#e6d6a5");
for (const [x, z] of bow) set(x, 15, z, leatherLight);
box(43, 15, 21, 44, 17, 25, leatherLight);
set(44, 14, 23, "#d8b56b");
animate("bowArm", { type: "swing", axis: "x", speed: 2, amplitude: 0.25 });import { draw } from "./assets/voxel";
import { elfoArquero } from "./assets/elfo-arquero";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, elfoArquero, 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 elfo-arquero
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["elfo-arquero"] })
# Queda en client/assets/elfo-arquero.ts
# https://fogon.page/object/elfo-arquero