85 lines
2.9 KiB
CoffeeScript
85 lines
2.9 KiB
CoffeeScript
# 0000000 000 000 000 000 00000000 000000000
|
|
# 000 000 000 000 000 000 000 000
|
|
# 0000000 000 000 000 000 0000000 000
|
|
# 000 000 000 000 000 000 000 000
|
|
# 0000000 0000000 0000000 0000000 00000000 000
|
|
|
|
Item = require './item'
|
|
Action = require './action'
|
|
Timer = require './timer'
|
|
Material = require './material'
|
|
|
|
class Bullet extends Item
|
|
|
|
constructor: () ->
|
|
@size = 0.2
|
|
@shooter = null
|
|
super
|
|
@addAction new Action @, Action.FLY, "fly", 40
|
|
@addAction new Action @, Action.EXPLODE, "explode", 200
|
|
|
|
del: ->
|
|
if @mesh?
|
|
world.scene.remove @mesh
|
|
Timer.removeActionsOfObject @
|
|
_.pull world.objects, @
|
|
@mesh = null
|
|
|
|
createMesh: ->
|
|
geom = new THREE.SphereGeometry 1, 16, 16
|
|
@mesh = new THREE.Mesh geom, Material.bullet.clone()
|
|
@mesh.scale.set @size, @size, @size
|
|
|
|
@shootFromBot: (bot) ->
|
|
bullet = new Bullet()
|
|
world.addObject bullet
|
|
bullet.direction = bot.currentDir()
|
|
bullet.setPosition bot.position.plus bullet.direction.mul 0.8
|
|
bullet.shooter = bot
|
|
bullet.mesh.material.color.set bot.mesh.material.color
|
|
world.playSound 'BULLET_SHOT', bot.getPos()
|
|
|
|
return if bullet.hitObjectAtPos bot.position.plus bullet.direction
|
|
|
|
Timer.addAction bullet.getActionWithId Action.FLY
|
|
|
|
performAction: (action) ->
|
|
relTime = action.getRelativeTime()
|
|
if action.id == Action.FLY
|
|
@current_position = @position.plus @direction.mul relTime
|
|
else if action.id == Action.EXPLODE
|
|
@size = 0.2 + relTime/2.0
|
|
@mesh?.material.opacity = 0.8 * (1.0-relTime)
|
|
|
|
step: (step) ->
|
|
@mesh.position.copy @current_position
|
|
@mesh.scale.set @size, @size, @size
|
|
|
|
hitObjectAtPos: (pos) ->
|
|
|
|
world.switchAtPos(pos)?.bulletImpact()
|
|
|
|
if world.isInvalidPos(pos) or world.isOccupiedPos pos
|
|
hitObject = world.getRealOccupantAtPos pos
|
|
if hitObject != @shooter
|
|
if hitObject?
|
|
hitObject.bulletImpact()
|
|
world.playSound hitObject.bulletHitSound?() ? 'BULLET_HIT_OBJECT'
|
|
else
|
|
world.playSound 'BULLET_HIT_WALL', pos
|
|
Timer.addAction @getActionWithId Action.EXPLODE
|
|
return true
|
|
false
|
|
|
|
finishAction: (action) -> @position = @current_position if action.name == "fly"
|
|
|
|
actionFinished: (action) ->
|
|
if action.id == Action.FLY
|
|
if @hitObjectAtPos @position.plus @direction.mul 0.5
|
|
return
|
|
Timer.addAction @getActionWithId Action.FLY
|
|
else if action.id == Action.EXPLODE
|
|
@del()
|
|
|
|
module.exports = Bullet
|