split splosions and projectiles into separate files

This commit is contained in:
Fraser Graham 2013-10-20 20:54:19 -07:00
parent 541e213c66
commit 776a7eee98
5 changed files with 100 additions and 79 deletions

59
game.go
View File

@ -163,9 +163,10 @@ func (g *game) run() {
} }
sort.Sort(RobotSorter{Robots: payload.Robots}) sort.Sort(RobotSorter{Robots: payload.Robots})
payload.Projectiles = append(payload.Projectiles, g.nudgeProjectiles()
g.nudgeProjectiles()..., for p := range g.projectiles {
) payload.Projectiles = append(payload.Projectiles, *p)
}
for s := range g.splosions { for s := range g.splosions {
s.Tick() s.Tick()
@ -234,57 +235,7 @@ func (g *game) run() {
func (g *game) nudgeProjectiles() (rprojectiles []Projectile) { func (g *game) nudgeProjectiles() (rprojectiles []Projectile) {
rprojectiles = make([]Projectile, 0) rprojectiles = make([]Projectile, 0)
for p := range g.projectiles { for p := range g.projectiles {
newPos := move(p.Position, p.MoveTo, float32(p.Speed), delta) p.Tick(g)
hit_player := false
for player := range g.players {
if player.Robot.Id == p.Id {
continue
}
dist := v.Distance(player.Robot.Position, p.Position)
if dist < 5.0 {
hit_player = true
}
}
// Are we going to intersect the destination zone in this tick?
r_dest := v.Rect2d{
A: v.Point2d{X: p.MoveTo.X - 3, Y: p.MoveTo.Y - 3},
B: v.Point2d{X: p.MoveTo.X + 3, Y: p.MoveTo.Y + 3}}
travel := newPos.Sub(p.Position)
arrived, _, _ := v.RectIntersection(r_dest, p.Position, travel)
if arrived || hit_player {
delete(g.projectiles, p)
// Spawn a splosion
splo := &Splosion{
Id: p.Id,
Position: p.Position,
Radius: p.Radius,
MaxDamage: 10,
MinDamage: 5,
Lifespan: 8,
}
g.splosions[splo] = true
for player := range g.players {
dist := v.Distance(player.Robot.Position, p.Position)
if dist < float32(p.Radius) {
// TODO map damage Max to Min based on distance from explosion
if player.Robot.Health > 0 {
player.Robot.Health -= p.Damage
if player.Robot.Health <= 0 {
}
}
}
}
} else {
p.Position.X = newPos.X
p.Position.Y = newPos.Y
rprojectiles = append(rprojectiles, *p)
}
} }
return return
} }

70
projectile.go Normal file
View File

@ -0,0 +1,70 @@
package main
import (
v "bitbucket.org/hackerbots/vector"
)
type Projectile struct {
Id string `json:"id"`
Position v.Point2d `json:"position"`
MoveTo v.Point2d `json:"-"`
Radius int `json:"radius"`
Speed float32 `json:"-"`
Damage int `json:"-"`
}
func (p *Projectile) Tick(g *game) {
vec := p.MoveTo.Sub(p.Position)
v_norm := vec.Normalize()
v_scaled := v_norm.Scale(p.Speed * delta)
newPos := p.Position.Add(v_scaled)
hit_player := false
for player := range g.players {
if player.Robot.Id == p.Id {
continue
}
dist := v.Distance(player.Robot.Position, p.Position)
if dist < 5.0 {
hit_player = true
}
}
// Are we going to intersect the destination zone in this tick?
r_dest := v.Rect2d{
A: v.Point2d{X: p.MoveTo.X - 3, Y: p.MoveTo.Y - 3},
B: v.Point2d{X: p.MoveTo.X + 3, Y: p.MoveTo.Y + 3}}
travel := newPos.Sub(p.Position)
arrived, _, _ := v.RectIntersection(r_dest, p.Position, travel)
if arrived || hit_player {
delete(g.projectiles, p)
// Spawn a splosion
splo := &Splosion{
Id: p.Id,
Position: p.Position,
Radius: p.Radius,
MaxDamage: 10,
MinDamage: 5,
Lifespan: 8,
}
g.splosions[splo] = true
for player := range g.players {
dist := v.Distance(player.Robot.Position, p.Position)
if dist < float32(p.Radius) {
// TODO map damage Max to Min based on distance from explosion
if player.Robot.Health > 0 {
player.Robot.Health -= p.Damage
if player.Robot.Health <= 0 {
}
}
}
}
} else {
p.Position.X = newPos.X
p.Position.Y = newPos.Y
}
}

View File

@ -103,31 +103,6 @@ func (s StatsRequest) Valid() bool {
return true return true
} }
type Projectile struct {
Id string `json:"id"`
Position v.Point2d `json:"position"`
MoveTo v.Point2d `json:"-"`
Radius int `json:"radius"`
Speed float32 `json:"-"`
Damage int `json:"-"`
}
type Splosion struct {
Id string `json:"id"`
Position v.Point2d `json:"position"`
Radius int `json:"radius"`
MaxDamage int `json:"-"`
MinDamage int `json:"-"`
Lifespan int `json:"-"`
}
func (s *Splosion) Tick() {
s.Lifespan--
}
func (s *Splosion) Alive() bool {
return s.Lifespan > 0
}
type Instruction struct { type Instruction struct {
MoveTo *v.Point2d `json:"move_to,omitempty"` MoveTo *v.Point2d `json:"move_to,omitempty"`

View File

@ -2,6 +2,7 @@ package main
import ( import (
"code.google.com/p/go.net/websocket" "code.google.com/p/go.net/websocket"
"log"
) )
type Spectator struct { type Spectator struct {
@ -12,9 +13,11 @@ type Spectator struct {
func (s *Spectator) sender() { func (s *Spectator) sender() {
for things := range s.send { for things := range s.send {
err := websocket.JSON.Send(s.ws, *things) err := websocket.JSON.Send(s.ws, *things)
log.Printf("%v", things)
if err != nil { if err != nil {
break break
} }
} }
s.ws.Close() s.ws.Close()
log.Printf("Spectator sender close")
} }

22
splosion.go Normal file
View File

@ -0,0 +1,22 @@
package main
import (
v "bitbucket.org/hackerbots/vector"
)
type Splosion struct {
Id string `json:"id"`
Position v.Point2d `json:"position"`
Radius int `json:"radius"`
MaxDamage int `json:"-"`
MinDamage int `json:"-"`
Lifespan int `json:"-"`
}
func (s *Splosion) Tick() {
s.Lifespan--
}
func (s *Splosion) Alive() bool {
return s.Lifespan > 0
}