From 0eed2881ad7bbb2e10c51ccb37216b6542c5a6bc Mon Sep 17 00:00:00 2001 From: Schmop Date: Thu, 16 May 2024 02:37:57 +0200 Subject: [PATCH] Make some schnecken --- src/assets/schnecke.png | Bin 0 -> 57026 bytes src/common/vec.ts | 4 +-- src/env.d.ts | 1 + src/game/fluids/fluids.ts | 1 + src/game/swarm/agent.ts | 63 ++++++++++++++++++++++++-------------- src/game/swarm/swarm.ts | 27 +++++++++++----- src/graphics.ts | 10 +++--- webpack.config.js | 6 +++- 8 files changed, 74 insertions(+), 38 deletions(-) create mode 100644 src/assets/schnecke.png create mode 100644 src/env.d.ts diff --git a/src/assets/schnecke.png b/src/assets/schnecke.png new file mode 100644 index 0000000000000000000000000000000000000000..593a892b51b4d0db8f2e8e3a0f507e260d379b59 GIT binary patch literal 57026 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 ?T{#A(E9$i&CN%E82LY+}l4YRb#O#%B62 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

3I*wnCp*g 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 literal 0 HcmV?d00001 diff --git a/src/common/vec.ts b/src/common/vec.ts index c75ded6..64c8aba 100644 --- a/src/common/vec.ts +++ b/src/common/vec.ts @@ -164,13 +164,13 @@ export class Vec { distance(x: number, y: number): number; distance(x: number|Vec, y?: number): number { if (x instanceof Vec) { - return this.sub(x).length(); + return Math.sqrt((this.x - x.x) * (this.x - x.x) + (this.y - x.y) * (this.y - x.y)); } if (undefined === y) { throw new Error("y-coordinate undefined on vector operation"); } - return this.sub(x, y).length(); + return Math.sqrt((this.x - x) * (this.x - x) + (this.y - y) * (this.y - y)); } rotate(angle: number) { diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..4997750 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1 @@ +declare module "*.png"; diff --git a/src/game/fluids/fluids.ts b/src/game/fluids/fluids.ts index 7f393d3..5046403 100644 --- a/src/game/fluids/fluids.ts +++ b/src/game/fluids/fluids.ts @@ -9,6 +9,7 @@ const gravity = 0.008; const numParticles = 200; const pressureForce = 8000; export const particleSize = 10; +export const imageSize = 64; export const desiredDensity = 6; const densityRadius = 40; const mass = 1; diff --git a/src/game/swarm/agent.ts b/src/game/swarm/agent.ts index 5888aeb..9dec799 100644 --- a/src/game/swarm/agent.ts +++ b/src/game/swarm/agent.ts @@ -1,11 +1,13 @@ import { Canvas } from "@/canvas"; import { GameObject } from "@/common/gameobject"; import { Vec } from "@/common/vec"; -import { particleSize } from "@/game/fluids/fluids"; +import { imageSize, particleSize } from "@/game/fluids/fluids"; import { Swarm } from "@/game/swarm/swarm"; -import { fillCircle, strokeCircle, strokeLine } from "@/graphics"; - +import { drawImageRotated, fillCircle, strokeCircle, strokeLine } from "@/graphics"; +import Schnecke from "@/assets/schnecke.png"; +const schneckenImage = new Image(); +schneckenImage.src = Schnecke; export type NavigationType = 'stayInBounds' | 'doNotBumpIntoFlock' | 'keepFlockClose' | 'behaveLikeFlockDoes' | 'idling'; export type NavigatingDesire = { pos: Vec; @@ -117,14 +119,20 @@ export class Agent extends GameObject { doNotBumpIntoFlock(nextPos: Vec): NavigatingDesire { const {agents} = this.swarm; - const visibleAgentsNotMe = agents - .filter(a => a.pos.distance(this.pos) < this.swarm.config.flockPerceptionDistance && a !== this); - const visibleAgentsInBounds = visibleAgentsNotMe - .filter(a => this.swarm.rect.contains(a.pos)); + const visibleAgentsInBounds = []; let closestAgent: Agent|null = null; - for (const a of visibleAgentsInBounds) { - if (!closestAgent || a.pos.distance(this.pos) < closestAgent.pos.distance(this.pos)) { + let closestDist: number = Infinity; + for (const a of agents) { + const dist = a.pos.distance(this.pos); + if (!this.swarm.rect.contains(a.pos) + || dist >= this.swarm.config.flockPerceptionDistance + || a === this) { + continue; + } + visibleAgentsInBounds.push(a); + if (!closestAgent || dist < closestDist) { closestAgent = a; + closestDist = dist; } } if (!closestAgent) { @@ -135,7 +143,7 @@ export class Agent extends GameObject { }; } const awayFromClosestAgentDir = this.pos.sub(closestAgent.pos).normalize(); - const urgency = Math.max(0, (this.swarm.config.desiredDistanceToEveryone - closestAgent.pos.distance(this.pos)) / this.swarm.config.desiredDistanceToEveryone); + const urgency = Math.max(0, (this.swarm.config.desiredDistanceToEveryone - closestDist) / this.swarm.config.desiredDistanceToEveryone); return { pos: this.pos.add(awayFromClosestAgentDir), urgency: urgency * urgency, @@ -145,10 +153,9 @@ export class Agent extends GameObject { keepFlockClose(nextPos: Vec): NavigatingDesire { const {agents} = this.swarm; - const visibleAgents = agents + const visibleAgentsInBounds = agents + .filter(a => this.swarm.rect.contains(a.pos)) .filter(a => a.pos.distance(this.pos) < this.swarm.config.flockPerceptionDistance); - const visibleAgentsInBounds = visibleAgents - .filter(a => this.swarm.rect.contains(a.pos)); const center = visibleAgentsInBounds .reduce((sum, a) => sum.add(a.pos), new Vec) .scale(1 / visibleAgentsInBounds.length); @@ -203,17 +210,27 @@ export class Agent extends GameObject { } render({ctx, input}: Canvas) { - if (input.mouseDown) { + if (this === this.swarm.selectedAgent) { + console.log(this.dir.clockwiseAngleBetween(1, 0)); + } + if (this.swarm.config.renderStyle === 'image') { + const satisfaction = Math.floor(this.satisfaction()); + const dissatisfaction = 255 - satisfaction; + // draw color + ctx.filter = `hue-rotate(${satisfaction}deg) saturate(1000%)`; + + // set composite mode + drawImageRotated(ctx, schneckenImage, -this.dir.clockwiseAngleBetween(1, 0), this.pos.x, this.pos.y, imageSize, imageSize); + ctx.filter = `none`; + } else if (input.mouseDown) { fillCircle(ctx, this.pos, particleSize, 'gray'); - } else { - if (this.swarm.config.renderStyle === 'satisfaction') { - const satisfaction = this.satisfaction(); - const dissatisfaction = 255 - satisfaction; - fillCircle(ctx, this.pos, particleSize, `rgb(${dissatisfaction}, 0, ${satisfaction})`); - } else { - const color = navigationColorMap[this.lastNavigation.type]; - fillCircle(ctx, this.pos, particleSize, color); - } + } else if (this.swarm.config.renderStyle === 'satisfaction') { + const satisfaction = this.satisfaction(); + const dissatisfaction = 255 - satisfaction; + fillCircle(ctx, this.pos, particleSize, `rgb(${dissatisfaction}, 0, ${satisfaction})`); + } else if (this.swarm.config.renderStyle === 'navigationMode') { + const color = navigationColorMap[this.lastNavigation.type]; + fillCircle(ctx, this.pos, particleSize, color); } if (this.swarm.config.showDirections) { strokeLine(ctx, this.pos, this.pos.add(this.dir.scale(30))); diff --git a/src/game/swarm/swarm.ts b/src/game/swarm/swarm.ts index 685ce1e..8de4fe6 100644 --- a/src/game/swarm/swarm.ts +++ b/src/game/swarm/swarm.ts @@ -6,7 +6,7 @@ import { Agent } from "@/game/swarm/agent"; import { strokeCircle } from "@/graphics"; import Button from "@/ui/button"; -export type RenderStyle = 'satisfaction'|'navigationMode'; +export type RenderStyle = 'satisfaction'|'navigationMode'|'image'; export class Config { numAgents: number = 20; @@ -15,7 +15,7 @@ export class Config { idlingUrgency: number = 0.001; idlingDistance: number = 20; desiredDistanceToEveryone: number = 50; - renderStyle: RenderStyle = 'satisfaction'; + renderStyle: RenderStyle = 'image'; showDirections: boolean = false; showFlockCenter: boolean = false; flockPerceptionDistance: number = 100; @@ -64,15 +64,23 @@ export class Swarm extends GameObject { const buttons = [ new Button("Reset", Rect.bySize(new Vec(10, 10), buttonSize), () => this.init(canvas)), new Button("Toggle Colors", Rect.bySize(new Vec(110, 10), buttonSize), () => { - this.config.renderStyle = this.config.renderStyle === 'satisfaction' ? 'navigationMode' : 'satisfaction'; + const styles: RenderStyle[] = ['satisfaction', 'navigationMode', 'image']; + this.config.renderStyle = styles[(styles.indexOf(this.config.renderStyle) + 1) % styles.length]; }), new Button("Less Agents", Rect.bySize(new Vec(10, 60), buttonSize), () => { - this.config.numAgents -= Math.max(1, this.config.numAgents / 10); - this.init(canvas); + const agentsToRemove = Math.max(1, this.config.numAgents / 10); + this.agents.splice(-agentsToRemove, agentsToRemove).forEach(a => canvas.remove(a)); + this.config.numAgents -= agentsToRemove; }), new Button("More Agents", Rect.bySize(new Vec(110, 60), buttonSize), () => { - this.config.numAgents += Math.max(1, this.config.numAgents / 10); - this.init(canvas); + const agentsToAdd = Math.max(1, this.config.numAgents / 10); + for (let i = 0; i < agentsToAdd; i++) { + const pos = Vec.random(this.rect); + const agent = new Agent(pos, this); + this.agents.push(agent); + canvas.add(agent); + } + this.config.numAgents += agentsToAdd; }), new Button("toggle Directions", Rect.bySize(new Vec(10, 110), buttonSize), () => { this.config.showDirections = !this.config.showDirections; @@ -101,6 +109,11 @@ export class Swarm extends GameObject { } update(canvas: Canvas, delta: DOMHighResTimeStamp) { + if (canvas.input.keypressed('Escape')) { + canvas.camera.reset(); + canvas.camera.unlock(); + this.selectedAgent = null; + } } render(canvas: Canvas) { diff --git a/src/graphics.ts b/src/graphics.ts index 8d55b9c..dda887e 100644 --- a/src/graphics.ts +++ b/src/graphics.ts @@ -9,12 +9,12 @@ export function drawImageRotated( y: number, w: number, h: number, - x2: number, - y2: number, - w2: number, - h2: number, + x2?: number, + y2?: number, + w2?: number, + h2?: number, ) { - if (typeof h2 !== "undefined") { + if (typeof x2 !== "undefined" && typeof h2 !== "undefined" && typeof w2 !== "undefined" && typeof y2 !== "undefined") { ctx.translate(x2, y2); ctx.rotate(angle); ctx.drawImage(img, x, y, w, h, -w2 / 2, -h2 / 2, w2, h2); diff --git a/webpack.config.js b/webpack.config.js index 7f5b051..51d1fc7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -36,9 +36,13 @@ const config = { use: [stylesHandler, "css-loader"], }, { - test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i, + test: /\.(eot|svg|ttf|woff|woff2|jpg|gif)$/i, type: "asset", }, + { + test: /\.(png)$/i, + type: "asset/inline", + }, // Add your rules for custom modules here // Learn more about loaders from https://webpack.js.org/loaders/