← Monstruos y enemigosObjeto 3Dfogon/alien
Alien
Arrastrá para girarlo// «Alien» · gpt-6-sol (medium)
// A cartoon grey alien facing -y: a slim pale green body, a huge bulb-shaped head with big glossy black almond eyes, a tiny mouth, a silver jumpsuit with a glowing purple emblem, holding a small ray gun with a glowing tip.
const green = "#a9d9ad", greenLight = "#c4efc4", greenDark = "#78ae89";
const silver = "#b9c4d1", silverLight = "#e2e9ed", silverDark = "#778799";
const purple = "#a34cff";
// Legs: separate parts pivoting at the hips.
for (const [name, cx, speed] of [["leftLeg", 20, 4], ["rightLeg", 28, -4]]) {
part(name, [cx, 24, 13]);
box(cx - 2, 21, 4, cx + 2, 26, 13, silverDark);
box(cx - 2, 20, 6, cx + 2, 25, 12, silver);
box(cx - 2, 20, 7, cx + 2, 20, 10, silverLight);
box(cx - 3, 18, 0, cx + 2, 27, 4, "#526376");
box(cx - 3, 17, 1, cx + 2, 23, 3, "#899aac");
box(cx - 2, 18, 4, cx + 2, 26, 5, "#a7b4c1");
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
part("body");
// Slim silver jumpsuit, with darker lower and side panels.
ellipsoid(24, 24, 19, 7, 6, 8, silverDark);
ellipsoid(24, 23, 20, 6, 6, 7, silver);
ellipsoid(24, 20, 20, 5, 2, 6, silverLight);
box(19, 19, 12, 29, 28, 14, "#66778a");
box(20, 18, 14, 28, 19, 15, silverLight);
box(22, 17, 13, 26, 17, 14, purple);
box(23, 16, 14, 25, 16, 14, "#ec9bff");
// Neck and collar.
cylinder(24, 23, 24, 3, 5, greenDark);
box(22, 19, 25, 26, 23, 28, green);
box(19, 18, 24, 29, 20, 25, silverLight);
box(20, 18, 24, 28, 18, 24, "#637586");
// Chunky arms, ending in little pale-green hands.
line(18, 23, 23, 13, 19, 17, 2, silverDark);
line(18, 21, 23, 13, 18, 18, 1, silverLight);
ellipsoid(12, 18, 16, 3, 3, 3, green);
line(30, 23, 23, 35, 18, 18, 2, silverDark);
line(30, 21, 23, 35, 17, 19, 1, silverLight);
ellipsoid(35, 16, 17, 3, 3, 3, green);
// Glowing diamond insignia on the front of the suit.
for (let z = 17; z <= 23; z++) {
const half = 3 - Math.abs(z - 20);
for (let x = 24 - half; x <= 24 + half; x++) {
set(x, 16, z, "#59647e");
if (Math.abs(x - 24) < half || half === 0)
set(x, 15, z, z === 20 ? "#f2b5ff" : purple);
}
}
set(24, 14, 20, "#ffffff");
// Huge bulb-shaped head. Its lower face is narrower than its cranium.
function headBlob(cx, cy, cz, rx, ry, rz) {
for (let z = Math.ceil(cz - rz); z <= cz + rz; z++)
for (let y = Math.ceil(cy - ry); y <= cy + ry; y++)
for (let x = Math.ceil(cx - rx); x <= cx + rx; x++) {
const d = ((x-cx)/rx)**2 + ((y-cy)/ry)**2 + ((z-cz)/rz)**2;
if (d > 1) continue;
let color = z < 29 ? greenDark : z > 38 || y < 19 ? greenLight : green;
if (d > 0.76 && rand() < 0.11)
color = z < 31 ? "#90c399" : "#b6e2b6";
set(x, y, z, color);
}
}
headBlob(24, 23, 34, 14, 10, 10);
headBlob(24, 21, 29, 10, 8, 6);
headBlob(24, 24, 37, 12, 9, 7);
// Find the face surface so the eyes follow its curve.
function faceY(x, z) {
for (let y = 9; y <= 24; y++)
if (get(x, y, z)) return y;
return undefined;
}
// Broad tilted black almond eyes, with tiny bright cyan reflections.
for (const [cx, side] of [[17, -1], [31, 1]]) {
for (let x = cx - 6; x <= cx + 6; x++)
for (let z = 29; z <= 40; z++) {
const dz = z - 34 - side * (x - cx) * 0.34;
const shape = ((x-cx)/5.7)**2 + (dz/4.0)**2;
const y = faceY(x, z);
if (y === undefined || shape > 1) continue;
set(x, y - 1, z, shape > 0.76 ? "#477c70" : "#080d20");
if (shape < 0.70) set(x, y - 2, z, "#090d19");
}
const glintX = cx - 2;
for (const [dx, dz, c] of [
[0, 2, "#caffff"], [1, 2, "#68f4ff"],
[0, 1, "#40d9f1"], [2, -1, "#258ea9"]
]) {
const x = glintX + dx, z = 35 + dz, y = faceY(x, z);
if (y !== undefined) set(x, y - 3, z, c);
}
}
// Tiny nose and friendly little mouth.
for (const x of [22, 26]) {
const y = faceY(x, 29);
if (y !== undefined) set(x, y - 1, 29, "#668f77");
}
for (const [x, z] of [[22, 27], [23, 26], [24, 26], [25, 26], [26, 27]]) {
const y = faceY(x, z);
if (y !== undefined) set(x, y - 1, z, "#4b625e");
}
// Small, chunky ray gun held out in front.
box(33, 11, 17, 39, 18, 22, "#42465d");
box(34, 11, 19, 38, 17, 21, silver);
box(34, 12, 21, 38, 17, 22, silverLight);
box(35, 15, 14, 38, 18, 18, "#566377");
box(35, 14, 15, 37, 16, 17, "#a0afbd");
box(34, 9, 18, 38, 12, 21, "#666181");
box(35, 9, 19, 37, 11, 20, "#d4b1e8");
set(36, 13, 22, purple);
// The muzzle is its own pulsing, glowing part.
part("rayGunTip", [36, 9, 20]);
box(34, 7, 18, 38, 9, 21, "#ba55ed");
box(35, 6, 19, 37, 7, 20, "#f093ff");
set(36, 5, 20, "#ffffff");
animate("rayGunTip", {
type: "colors",
palette: ["#8434d6", "#c448f3", "#ff80df", "#ffffff"],
pattern: "pulse",
glow: 0.9
});import { draw } from "./assets/voxel";
import { alien } from "./assets/alien";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, alien, 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 alien
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["alien"] })
# Queda en client/assets/alien.ts
# https://fogon.page/object/alien