This commit is contained in:
Elizabeth Hunt 2025-03-02 19:11:33 -07:00
parent 196773c363
commit 78797aa175
Signed by: simponic
GPG Key ID: 2909B9A7FF6213EE
7 changed files with 60 additions and 36 deletions

View File

@ -8,7 +8,5 @@ export class RadialObserve extends Component {
public radius: number = 0, public radius: number = 0,
) { ) {
super(ComponentNames.RadialObserve); super(ComponentNames.RadialObserve);
this.onObservation = onObservation;
} }
} }

View File

@ -9,6 +9,7 @@ import {
LambdaTerm, LambdaTerm,
Modal, Modal,
Pushable, Pushable,
RadialObserve,
Sprite, Sprite,
} from "../components"; } from "../components";
import { Coord2D } from "../interfaces"; import { Coord2D } from "../interfaces";
@ -40,6 +41,8 @@ export class FunctionBox extends Entity {
this.addComponent(new Pushable()); this.addComponent(new Pushable());
this.addComponent(new RadialObserve());
this.addComponent(new Grid(gridPosition)); this.addComponent(new Grid(gridPosition));
this.addComponent( this.addComponent(

View File

@ -1,5 +1,11 @@
import { Entity, EntityNames } from "."; import { Entity, EntityNames } from ".";
import { Colliding, ComponentNames, FacingDirection, Grid, RadialObserve } from "../components"; import {
Colliding,
ComponentNames,
FacingDirection,
Grid,
RadialObserve,
} from "../components";
import { Game } from "../Game"; import { Game } from "../Game";
import { Coord2D, Direction } from "../interfaces"; import { Coord2D, Direction } from "../interfaces";
@ -7,7 +13,7 @@ export class Piston extends Entity {
constructor(gridPosition: Coord2D, direction: Direction) { constructor(gridPosition: Coord2D, direction: Direction) {
super(EntityNames.Piston); super(EntityNames.Piston);
const radius = 1 + .001; const radius = 1;
this.addComponent(new RadialObserve(this.onObservation.bind(this), radius)); this.addComponent(new RadialObserve(this.onObservation.bind(this), radius));
this.addComponent(new FacingDirection(direction)); this.addComponent(new FacingDirection(direction));
@ -18,24 +24,31 @@ export class Piston extends Entity {
} }
private onObservation(_game: Game, entity: Entity) { private onObservation(_game: Game, entity: Entity) {
const facingDirection = this.getComponent<FacingDirection>(ComponentNames.FacingDirection); const facingDirection = this.getComponent<FacingDirection>(
ComponentNames.FacingDirection,
);
const myPosition = this.getComponent<Grid>(ComponentNames.Grid).gridPosition; const myPosition = this.getComponent<Grid>(
ComponentNames.Grid,
).gridPosition;
const observingGrid = entity.getComponent<Grid>(ComponentNames.Grid); const observingGrid = entity.getComponent<Grid>(ComponentNames.Grid);
const observingPosition = observingGrid.gridPosition; const observingPosition = observingGrid.gridPosition;
const [dx, dy] = [myPosition.x - observingPosition.x, myPosition.y - observingPosition.y].map(x => Math.round(x)); const [dx, dy] = [
myPosition.x - observingPosition.x,
myPosition.y - observingPosition.y,
].map((x) => Math.round(x));
const v: Record<typeof dx, Record<typeof dy, Direction>> = { const v: Record<typeof dx, Record<typeof dy, Direction>> = {
[-1]: { [-1]: {
[dy]: Direction.RIGHT, [dy]: Direction.RIGHT,
}, },
[1]: { [1]: {
[dy]: Direction.LEFT, [dy]: Direction.LEFT,
}, },
[0]: { [0]: {
[-1]: Direction.UP, [-1]: Direction.UP,
[1]: Direction.DOWN, [1]: Direction.DOWN,
} },
}; };
if (facingDirection.currentDirection !== v[dx][dy]) { if (facingDirection.currentDirection !== v[dx][dy]) {

View File

@ -60,7 +60,6 @@ export class CarCadr extends Level {
new Wall({ x: 10, y: 5 }), new Wall({ x: 10, y: 5 }),
new Wall({ x: 12, y: 5 }), new Wall({ x: 12, y: 5 }),
new Wall({ x: 12, y: 3 }), new Wall({ x: 12, y: 3 }),
new Piston({ x: 10, y: 6 }, Direction.RIGHT),
new FunctionApplication({ x: 12, y: 6 }, "(_INPUT _KEY)"), new FunctionApplication({ x: 12, y: 6 }, "(_INPUT _KEY)"),
new Wall({ x: 10, y: 7 }), new Wall({ x: 10, y: 7 }),
new Wall({ x: 11, y: 7 }), new Wall({ x: 11, y: 7 }),

View File

@ -27,34 +27,38 @@ export class FacingDirection extends System {
game.forEachEntityWithComponent( game.forEachEntityWithComponent(
ComponentNames.FacingDirection, ComponentNames.FacingDirection,
(entity) => { (entity) => {
if (!entity.hasComponent(ComponentNames.BoundingBox)) {
return;
}
const boundingBox = entity.getComponent<BoundingBox>(
ComponentNames.BoundingBox,
)!;
const facingDirection = entity.getComponent<FacingDirectionComponent>( const facingDirection = entity.getComponent<FacingDirectionComponent>(
ComponentNames.FacingDirection, ComponentNames.FacingDirection,
); );
if (!entity.hasComponent(ComponentNames.Sprite)) {
return;
}
const { center } = boundingBox; if (entity.hasComponent(ComponentNames.Control)) {
const angle = Math.atan2( const boundingBox = entity.getComponent<BoundingBox>(
mousePosition.y - center.y, ComponentNames.BoundingBox,
mousePosition.x - center.x, )!;
);
const mouseInBoundingBox = const { center } = boundingBox;
boundingBox.isCollidingWith(mouseBoundingBox); const angle = Math.atan2(
const direction = mouseInBoundingBox mousePosition.y - center.y,
? Direction.NONE mousePosition.x - center.x,
: angleToDirection(angle); );
facingDirection.setDirection(direction); const mouseInBoundingBox =
entity.addComponent(facingDirection); boundingBox.isCollidingWith(mouseBoundingBox);
const direction = mouseInBoundingBox
? Direction.NONE
: angleToDirection(angle);
facingDirection.setDirection(direction);
entity.addComponent(facingDirection);
}
const oldSprite = entity.getComponent<Sprite>(ComponentNames.Sprite); const oldSprite = entity.getComponent<Sprite>(ComponentNames.Sprite);
const sprite = facingDirection.directionSprites.get(direction)!; const sprite = facingDirection.directionSprites.get(
facingDirection.currentDirection,
)!;
sprite.fillTimingsFromSprite(oldSprite); sprite.fillTimingsFromSprite(oldSprite);
entity.addComponent(sprite); entity.addComponent(sprite);

View File

@ -54,6 +54,9 @@ export class Grid extends System {
if (!entity.hasComponent(ComponentNames.Grid)) { if (!entity.hasComponent(ComponentNames.Grid)) {
return; return;
} }
if (!entity.hasComponent(ComponentNames.Control)) {
return;
}
const grid = entity.getComponent<GridComponent>(ComponentNames.Grid)!; const grid = entity.getComponent<GridComponent>(ComponentNames.Grid)!;
const facingDirection = entity.getComponent<FacingDirection>( const facingDirection = entity.getComponent<FacingDirection>(

View File

@ -1,5 +1,9 @@
import { System, SystemNames } from "."; import { System, SystemNames } from ".";
import { ComponentNames, Grid, RadialObserve as RadialObserveComponent } from "../components"; import {
ComponentNames,
Grid,
RadialObserve as RadialObserveComponent,
} from "../components";
import { Entity, EntityNames } from "../entities"; import { Entity, EntityNames } from "../entities";
import { Game } from "../Game"; import { Game } from "../Game";
import { cartesianDistance } from "../interfaces"; import { cartesianDistance } from "../interfaces";
@ -24,7 +28,7 @@ export class RadialObserve extends System {
ComponentNames.RadialObserve, ComponentNames.RadialObserve,
); );
if (!entityObserve.onObservation) { if (!entityObserve.onObservation) {
return; return;
} }
const entityPosition = entity.getComponent<Grid>( const entityPosition = entity.getComponent<Grid>(
@ -54,7 +58,7 @@ export class RadialObserve extends System {
}); });
for (const observation of observations) { for (const observation of observations) {
entityObserve.onObservation!(game, observation); entityObserve.onObservation!(game, observation);
} }
}); });
} }