87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import * as planck from 'planck'
 | |
| import { SpriteInstance } from '../shared/sprites'
 | |
| import { WorldContext } from './World'
 | |
| import { Zone } from './Zone'
 | |
| 
 | |
| export class Entity {
 | |
|   sprite: SpriteInstance
 | |
|   body?: planck.Body
 | |
|   velocity: [number, number] = [0, 0]
 | |
|   acceleration: number = 0.5
 | |
|   maxSpeed: number = 4
 | |
|   direction: number = 0
 | |
|   turnRate: number = 10
 | |
|   zones: Zone[] = []
 | |
|   contacts: Entity[] = []
 | |
| 
 | |
|   constructor(ctor: string) {
 | |
|     this.sprite = new SpriteInstance(ctor)
 | |
|   }
 | |
| 
 | |
|   update(delta: number, ctx?: WorldContext) {
 | |
|     this.sprite.update(delta)
 | |
|   }
 | |
| 
 | |
|   get position(): [number, number] {
 | |
|     if (this.body) {
 | |
|       let p = this.body.getPosition()
 | |
|       return [p.x, p.y]
 | |
|     }
 | |
|     return [this.sprite.container.x, this.sprite.container.y]
 | |
|   }
 | |
|   get x(): number {
 | |
|     if (this.body) {
 | |
|       let p = this.body.getPosition()
 | |
|       return p.x
 | |
|     }
 | |
|     return this.sprite.container.x
 | |
|   }
 | |
|   set x(v: number) {
 | |
|     if (this.body) {
 | |
|       let p = this.body.getPosition()
 | |
|       this.body.setPosition(
 | |
|         planck.Vec2(
 | |
|           v,
 | |
|           p.y,
 | |
|         )
 | |
|       )
 | |
|     } else {
 | |
|       this.sprite.container.y = v
 | |
|     }
 | |
|   }
 | |
|   get y(): number {
 | |
|     if (this.body) {
 | |
|       let p = this.body.getPosition()
 | |
|       return p.y
 | |
|     }
 | |
|     return this.sprite.container.y
 | |
|   }
 | |
|   set y(v: number) {
 | |
|     if (this.body) {
 | |
|       let p = this.body.getPosition()
 | |
|       this.body.setPosition(
 | |
|         planck.Vec2(
 | |
|           p.x,
 | |
|           v,
 | |
|         )
 | |
|       )
 | |
|     } else {
 | |
|       this.sprite.container.y = v
 | |
|     }
 | |
|   }
 | |
|   addZoneContact(zone: Zone) {
 | |
|     if (this.zones.find(v=>v===zone)) return
 | |
|     this.zones.push(zone)
 | |
|   }
 | |
|   removeZoneContact(zone: Zone) {
 | |
|     this.zones = this.zones.filter(v=>v!==zone)
 | |
|   }
 | |
|   addEntityContact(entity: Entity) {
 | |
|     if (this.contacts.find(v=>v===entity)) return
 | |
|     this.contacts.push(entity)
 | |
|   }
 | |
|   removeEntityContact(entity: Entity) {
 | |
|     this.contacts = this.contacts.filter(v=>v!==entity)
 | |
|   }
 | |
| }
 |