https://github.com/jampekka/webtrajsim
Raw File
Tip revision: 61b0c3047004e8dfa7ee181975b13b94a3cf9668 authored by Jami Pekkanen on 28 December 2016, 19:53:27 UTC
Texture filtering tweaking
Tip revision: 61b0c30
controls.ls
P = require 'bluebird'
$ = require 'jquery'
{Signal} = require './signal.ls'

export class WsController
	@Connect = (url) -> new P (resolve, reject) ->
		socket = new WebSocket url
		socket.onopen = ->
			resolve new WsController socket

	(@socket) ->
		@throttle = 0
		@brake = 0
		@steering = 0
		@direction = 1
		@change = new Signal
		@socket.onmessage = (msg) ~>
			event = JSON.parse msg.data
			for key, value of event
				@change.dispatch key, value
			@ <<< event

	set: (obj) ->
		@socket.send JSON.stringify obj

	close: ->
		@socket.onmessage = null
		@socket.close()

export class KeyboardController
	->
		@throttle = 0
		@brake = 0
		@steering = 0
		@direction = 1

		@throttleTarget = 0
		@brakeTarget = 0
		@steeringLeft = 0
		@steeringRight = 0

		@up = 0
		@down = 0
		@left = 0
		@right = 0

		changeSpeed = 2

		nudge = (dt, name, target) ~>
			return if not isFinite dt
			diff = target - @[name]
			change = dt*changeSpeed*Math.sign(diff)
			if diff < 0
				change = Math.max change, diff
			else
				change = Math.min change, diff
			@[name] += change

		@_closed = false
		prevTime = undefined
		tick = ~>
			return if @_closed
			time = Date.now()
			dt = (time - prevTime)/1000
			prevTime := time
			nudge dt, \throttle, @throttleTarget
			nudge dt, \brake, @brakeTarget
			nudge dt, \steering, (@steeringLeft - @steeringRight)
			requestAnimationFrame tick
		tick()
		@change = new Signal

		UP = 38
		DOWN = 40
		SPACE = 32
		LEFT = 37
		RIGHT = 39
		CTRL = 17

		$("body")
		.keydown @_keydown = (e) ~>
			switch e.which
			| UP => @throttleTarget = 1 ; @_update 'up', 1
			| DOWN => @brakeTarget = 1 ; @_update 'down', 1
			| LEFT => @steeringLeft = 1; @_update 'left', 1
			| RIGHT => @steeringRight = 1; @_update 'right', 1
			| CTRL => @_update \blinder, true
			| SPACE => @_update \catch, true

		.keyup @_keyup = (e) ~>
			switch e.which
			| UP => @throttleTarget = 0 ; @_update 'up', 0
			| DOWN => @brakeTarget = 0 ; @_update 'down', 0
			| LEFT => @steeringLeft = 0 ; @_update 'left', 0
			| RIGHT => @steeringRight = 0 ; @_update 'right', 0
			| CTRL => @_update \blinder, false
			| SPACE => @_update \catch, false



	_update: (key, value) ->
		return if @[key] == value
		@change.dispatch key, value
		@[key] = value

	set: ->

	close: ->
		@_closed = true
		$("body")
		.off "keydown", @_keydown
		.off "keyup", @_keyup

export NonSteeringControl = (orig) ->
	ctrl = ^^orig
	ctrl.steering = 0
	return ctrl


export class TargetSpeedController
	(@target=0) ->
		@throttle = 0
		@brake = 0
		@steering = 0
		@direction = 1

	tick: (speed, dt) ->
		delta = @target - speed
		force = Math.tanh delta
		if force > 0
			@throttle = force
			@brake = 0
		else
			@brake = force
			@throttle = 0

	set: ->
back to top