1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
require 'ruby2d'
require 'ruby2d/camera'
require 'felflame'
# configuration for the simulation
# change values here to see a change in the simulation
FF::Cmp.new('SingletonConfig',
# Show vectors
debug: true,
# If the camera should follow the "center mass"
follow: false,
# The velocity limit of a boid
# Set to negative to disable
limit: 6.0,
# How strong the bounds should be
# Higher is stronger
bounds_strength: 1.0,
# What the bounds are
xmax: 480.0, xmin: -580.0,
ymax: 250.0, ymin: -340.0,
# How much the boids try to pull together
# Smaller is stronger
cohesion: 6000.0,
# How much the boids push away from eachother
# Smaller is stronger
seperation: 375.0,
# What the range of seperating should be
seperation_distance: 150.0,
# How strong their vector alignment should be
# Smaller is stronger
alignment: 1000.0,
# How much they try to follow their target(your mouse cursor)
# Smaller is stronger
target_strength: 2500.0,
# These are later set by the mouse position
target_x: 0, target_y: 0)
$config = FF::Cmp::SingletonConfig.new
# Used by the Camera Library
set(title: "Ruboids", width: 1164, height: 764, resizable: true)
Dir[File.join(__dir__, 'lib/**', '*.rb')].sort.each { |file| require file }
# Comment out to remove a rule
FF::Scn::BoidCalculations.add FF::Sys::Cohesion
#FF::Scn::BoidCalculations.add FF::Sys::Alignment
FF::Scn::BoidCalculations.add FF::Sys::Seperation
#FF::Scn::BoidCalculations.add FF::Sys::Target
FF::Scn::BoidCalculations.add FF::Sys::Bounds
FF::Stg.add FF::Scn::BoidCalculations
class GameWindow < Ruby2D::Window
def initialize
super
Camera::Image.new('assets/Background.png', x: -get(:width)+57, y: -get(:height)+97, z: -99)
randspot = ((-get(:height) / 2)..(get(:height)/2)).to_a
7.times do
Fish.create(randspot.sample.to_f, randspot.sample.to_f)
end
2.times do
Piranha.create(randspot.sample.to_f, randspot.sample.to_f)
end
unless $config.debug
FF::Cmp::BoidVisuals.each do |boid|
boid.vect.remove
end
end
end
def update
$config.target_x = Camera.coordinate_to_worldspace(get(:mouse_x), get(:mouse_y))[0]
$config.target_y = Camera.coordinate_to_worldspace(get(:mouse_y), get(:mouse_y))[1]
FF::Stage.call
Camera.y += 1 if key_held('s')
Camera.y -= 1 if key_held('w')
Camera.x += 1 if key_held('d')
Camera.x -= 1 if key_held('a')
Camera.zoom *= 1.1 if key_held('z')
Camera.zoom /= 1.1 if key_held('x')
end
def render
end
end
gamewindow = GameWindow.new
gamewindow.set(title: get(:title), width: get(:width), height: get(:height), resizable: get(:resizable))
gamewindow.show
|