Browse Source

Fun with explosions!

Also reorganized code a bit.
master
Ben Kurtovic 13 years ago
parent
commit
40ccab732f
5 changed files with 157 additions and 29 deletions
  1. +6
    -1
      bullet.nls
  2. +66
    -0
      explosion.nls
  3. +38
    -17
      lobo.nlogo
  4. +26
    -4
      player.nls
  5. +21
    -7
      tank.nls

+ 6
- 1
bullet.nls View File

@@ -10,6 +10,10 @@ bullets-own [
travel-distance
]

;; ==========
;; Procedures
;; ==========

to fire-bullet
hatch-bullets 1 [
set max-travel-distance 8
@@ -31,13 +35,14 @@ to do-bullet-logic
fd speed
set travel-distance travel-distance + speed
if travel-distance > max-travel-distance [
explode "decay"
die
]

let mxcor xcor
let mycor ycor
let is-close-enough false
let target min-one-of (turtles-here with [breed = tanks]) [distancexy mxcor mycor]
let target min-one-of tanks-here [distancexy mxcor mycor]
if target != nobody [
ask target [
if distancexy mxcor mycor < 0.65 [


+ 66
- 0
explosion.nls View File

@@ -0,0 +1,66 @@
;; lobo: Logo Bolo
;; (c) Ben Kurtovic, 2011

globals [
explodes
]

breed [explosions explosion]

explosions-own [
midlife
size-increment
time-to-live
]

;; ==========
;; Procedures
;; ==========

to make-explosions-table
; Fun with particle effects!
set explodes table:make
table:put explodes "decay" [["explosion-decay" 0.65 10 0.5]]
table:put explodes "shot" [["explosion-shot" 1.25 10 0.5]]
table:put explodes "kill" [["explosion-kill" 3 20 0.5] ["explosion-shot" 1.25 15 1]
["explosion-shot" 1.25 15 1 ] ["explosion-shot" 1.25 10 1]
["explosion-shot" 1.25 10 1 ] ["explosion-decay" 0.65 10 2]
["explosion-decay" 0.65 10 2 ] ["explosion-decay" 0.65 7.5 2]
["explosion-decay" 0.65 7.5 2 ] ["explosion-decay" 0.65 5 3]
["explosion-decay" 0.65 5 3 ]]
end

to explode [name]
debug "EXPLODE" name
let data table:get explodes name
foreach data [create-explosion ?]
end

to create-explosion [info]
let sprite (item 0 info)
let maxsize (item 1 info)
let lifespan (item 2 info)
let deviation (item 3 info)
hatch-explosions 1 [
set shape sprite
set size maxsize / 2
set midlife lifespan / 2
set size-increment (maxsize / lifespan) * 2
set time-to-live lifespan
set heading random 360
fd (random 100) / (100 / deviation)
]
end

to keep-exploding
if time-to-live = 0 [
die
]
set time-to-live time-to-live - 1
set midlife midlife - 1
ifelse midlife > 0 [
set size size + size-increment
] [
set size size - size-increment
]
end

+ 38
- 17
lobo.nlogo View File

@@ -6,6 +6,7 @@

__includes [
"bullet.nls"
"explosion.nls"
"player.nls"
"tank.nls"
]
@@ -19,12 +20,6 @@ globals [
last-tick-time
max-fps
mouse-was-down?
player
player-deaths
player-has-target?
player-kills
player-target-xcor
player-target-ycor
sounds
]

@@ -36,9 +31,9 @@ to setup
clear-all
no-display
setup-defaults
ask patches [
set pcolor (random 3) - 5 + green
]
make-sounds-table
make-explosions-table
load-map
spawn-player
spawn-tank 0 ask tank 1 [ setxy -6 0 ]
spawn-tank 1 ask tank 2 [ setxy 6 0 ]
@@ -56,6 +51,9 @@ to go
ask bullets [
do-bullet-logic
]
ask explosions [
keep-exploding
]
show-crosshair
render
keep-time
@@ -93,18 +91,20 @@ to setup-defaults
set player-kills 0
set player-target-xcor 0
set player-target-ycor 0
make-sounds-table
end

to make-sounds-table
set sounds table:make
table:put sounds "fire" "Hand Clap"
table:put sounds "shot player" "Acoustic Snare"
table:put sounds "shot ally" "Acoustic Snare"
table:put sounds "shot enemy" "Acoustic Snare"
table:put sounds "kill player" "Electric Snare"
table:put sounds "kill ally" "Electric Snare"
table:put sounds "kill enemy" "Electric Snare"
table:put sounds "fire" "Hand Clap"
table:put sounds "noammo" "Cowbell"
table:put sounds "shot" "Acoustic Snare"
table:put sounds "kill" "Electric Snare"
end

to load-map
ask patches [
set pcolor (random 3) - 5 + green
]
end

to show-crosshair
@@ -412,6 +412,27 @@ Rectangle -7500403 true false 165 210 195 268
Rectangle -7500403 true false 105 210 135 268
Polygon -7500403 true false 105 210 135 150 135 210 105 210

explosion-decay
false
0
Circle -2674135 true false 2 2 295
Circle -955883 true false 75 75 148

explosion-kill
false
0
Circle -6459832 true false 2 2 297
Circle -2674135 true false 30 30 240
Circle -955883 true false 60 60 180
Circle -1184463 true false 90 90 120

explosion-shot
false
0
Circle -2674135 true false 0 0 300
Circle -955883 true false 45 45 210
Circle -1184463 true false 90 90 120

tank
true
1


+ 26
- 4
player.nls View File

@@ -1,6 +1,19 @@
;; lobo: Logo Bolo
;; (c) Ben Kurtovic, 2011

globals [
player
player-deaths
player-has-target?
player-kills
player-target-xcor
player-target-ycor
]

;; ==========
;; Procedures
;; ==========

to spawn-player
create-tanks 1 [
set player tank who
@@ -11,10 +24,16 @@ end
to do-player-logic
if mouse-inside? [
if mouse-down? and not mouse-was-down? [
set is-accelerating? true
set player-has-target? true
set player-target-xcor (round mouse-xcor)
set player-target-ycor (round mouse-ycor)
let txcor round mouse-xcor
let tycor round mouse-ycor
ifelse player-has-target? and player-target-xcor = txcor and player-target-ycor = tycor [
cancel-target
] [
set is-accelerating? true
set player-has-target? true
set player-target-xcor txcor
set player-target-ycor tycor
]
]
set mouse-was-down? mouse-down?
]
@@ -23,6 +42,8 @@ to do-player-logic
tank-facexy player-target-xcor player-target-ycor
let dist distancexy player-target-xcor player-target-ycor
if dist < 2 and speed > 0.075 [
; Turn on "brakes" if we're getting
; close and we're moving fast:
decelerate friction * 5
]
if dist < 0.1 [
@@ -42,4 +63,5 @@ end
to cancel-target
set is-accelerating? false
set player-has-target? false
set speed speed / 2
end

+ 21
- 7
tank.nls View File

@@ -18,6 +18,10 @@ tanks-own [
team
]

;; ==========
;; Procedures
;; ==========

to spawn-tank [tank-team]
create-tanks 1 [
set-tank-vars tank-team false
@@ -83,12 +87,16 @@ to tank-facexy [txcor tycor]
end

to fire
if ammunition > 0 and fire-cool-down = 0 [
debug "FIRE" (word who " (" ammunition " left)")
set ammunition ammunition - 1
if fire-cool-down = 0 [
ifelse ammunition > 0 [
debug "FIRE" (word who " (" ammunition " left)")
set ammunition ammunition - 1
fire-bullet
play-sound "fire"
] [
play-sound "noammo"
]
set fire-cool-down max-fire-rate
fire-bullet
play-sound "fire"
]
end

@@ -96,15 +104,17 @@ to shot-at
debug "SHOT" (word who " by " ([shooter] of myself))
set armor armor - 1
ifelse armor = 0 [
explode "kill"
play-sound "kill"
kill-tank
] [
play-sound (word "shot " get-tank-affiliation)
explode "shot"
play-sound "shot"
]
end

to kill-tank
debug "KILL" (word who " by " ([shooter] of myself))
play-sound (word "kill " get-tank-affiliation)
if is-player? [
set player-deaths player-deaths + 1
]
@@ -114,6 +124,10 @@ to kill-tank
die
end

;; =========
;; Reporters
;; =========

to-report get-tank-affiliation
if is-player? [ report "player" ]
if team = 0 [ report "ally" ]


Loading…
Cancel
Save