Battlecity 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Battlecity.gemspec +1 -0
- data/bin/battlecity +40 -0
- data/lib/Battlecity/version.rb +1 -1
- data/lib/entities/brick.rb +17 -0
- data/lib/entities/bullet.rb +57 -0
- data/lib/entities/bush.rb +13 -0
- data/lib/entities/collider.rb +23 -0
- data/lib/entities/eagle.rb +23 -0
- data/lib/entities/enemy.rb +101 -0
- data/lib/entities/explosion.rb +17 -0
- data/lib/entities/gameobject.rb +46 -0
- data/lib/entities/player.rb +145 -0
- data/lib/entities/stone.rb +17 -0
- data/lib/entities/tank.rb +70 -0
- data/lib/entities/upgrade.rb +27 -0
- data/lib/entities/water.rb +13 -0
- data/lib/gamestates/game_state.rb +27 -0
- data/lib/gamestates/menu_state.rb +45 -0
- data/lib/gamestates/play_state.rb +31 -0
- data/lib/main.rb +14 -0
- data/lib/misc/ai.rb +37 -0
- data/lib/misc/game_window.rb +45 -0
- data/lib/misc/level.rb +139 -0
- data/lib/misc/map.rb +95 -0
- data/lib/misc/mediamanager.rb +105 -0
- data/lib/misc/sprite.rb +53 -0
- data/media/emulogic.ttf +0 -0
- data/media/sprites.png +0 -0
- data/media/sprites_transparent.png +0 -0
- metadata +30 -8
- data/.idea/.name +0 -1
- data/.idea/Battlecity.iml +0 -74
- data/.idea/misc.xml +0 -14
- data/.idea/modules.xml +0 -8
- data/.idea/vcs.xml +0 -6
- data/.idea/workspace.xml +0 -459
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5c57043a068e9d86f83544fff09e2c6efff74dc
|
4
|
+
data.tar.gz: 781b99c3a4008950c40222633d807c3345960e3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b88914f4c3f371f8f2894a7dc474ecf64503b63c7713b7135d3820a7a8533adbb881c768f22a0aea34631d3f21bcadd7a6eece4894bef10c0bdb7a2ceef98e21
|
7
|
+
data.tar.gz: e5b8346f0ee2097e910a47c4188e75cc0485295002d9946594545c32f563517c82e84305a32bc4d9c59ec48888f17410e36b04c4632937c93f4c932a415b7dfb
|
data/Battlecity.gemspec
CHANGED
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
|
+
# spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
20
|
spec.require_paths = ["lib"]
|
data/bin/battlecity
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gosu_texture_packer'
|
3
|
+
require 'perlin_noise'
|
4
|
+
require 'gosu'
|
5
|
+
|
6
|
+
root_dir = File.expand_path(File.join(
|
7
|
+
File.dirname(File.dirname(__FILE__)), 'lib'))
|
8
|
+
|
9
|
+
%w(
|
10
|
+
entities/stone.rb
|
11
|
+
entities/bush.rb
|
12
|
+
entities/gameobject.rb
|
13
|
+
entities/collider.rb
|
14
|
+
entities/brick.rb
|
15
|
+
entities/bullet.rb
|
16
|
+
entities/enemy.rb
|
17
|
+
entities/tank.rb
|
18
|
+
entities/explosion.rb
|
19
|
+
entities/eagle.rb
|
20
|
+
entities/player.rb
|
21
|
+
entities/upgrade.rb
|
22
|
+
entities/water.rb
|
23
|
+
misc/ai.rb
|
24
|
+
misc/game_window.rb
|
25
|
+
misc/map.rb
|
26
|
+
misc/mediamanager.rb
|
27
|
+
misc/level.rb
|
28
|
+
misc/sprite.rb
|
29
|
+
Battlecity.rb
|
30
|
+
gamestates/menu_state.rb
|
31
|
+
gamestates/play_state.rb
|
32
|
+
gamestates/game_state.rb
|
33
|
+
).each do |f|
|
34
|
+
require File.join(root_dir, f)
|
35
|
+
end
|
36
|
+
|
37
|
+
$debug = false
|
38
|
+
$window = GameWindow.new
|
39
|
+
GameState.switch(MenuState.instance)
|
40
|
+
$window.show
|
data/lib/Battlecity/version.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'gameobject'
|
2
|
+
|
3
|
+
# class Brick
|
4
|
+
class Brick < GameObject
|
5
|
+
def initialize(x, y)
|
6
|
+
super(x, y, 2, 2, true)
|
7
|
+
@sprite = Sprite.new(:brickwall, false)
|
8
|
+
end
|
9
|
+
|
10
|
+
def hitted(_obj)
|
11
|
+
@done = true
|
12
|
+
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
@sprite.update
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative 'gameobject'
|
2
|
+
require_relative 'explosion'
|
3
|
+
require_relative 'water'
|
4
|
+
|
5
|
+
# class Bullet
|
6
|
+
class Bullet < GameObject
|
7
|
+
attr_reader :powerful
|
8
|
+
|
9
|
+
def initialize(tank, powerful = false)
|
10
|
+
super(tank.canoonX, tank.canoonY, 1, 1, true)
|
11
|
+
@direction = tank.direction
|
12
|
+
@done = false
|
13
|
+
@powerful = powerful
|
14
|
+
@sprite = get_sprite
|
15
|
+
end
|
16
|
+
|
17
|
+
def update
|
18
|
+
return if done?
|
19
|
+
move
|
20
|
+
@sprite.update
|
21
|
+
end
|
22
|
+
|
23
|
+
def done?
|
24
|
+
@done
|
25
|
+
end
|
26
|
+
|
27
|
+
def collision_detect(objects)
|
28
|
+
objects.each do |o|
|
29
|
+
return nil if o.is_a?(Enemy) && o.immortal?
|
30
|
+
if collide?(o) && !o.is_a?(Water) && !o.is_a?(Upgrade)
|
31
|
+
@done = true
|
32
|
+
o.hitted(self)
|
33
|
+
return Explosion.new(@x, @y)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def move
|
40
|
+
@x -= 2 if @direction == :left
|
41
|
+
@x += 2 if @direction == :right
|
42
|
+
@y += 2 if @direction == :down
|
43
|
+
@y -= 2 if @direction == :up
|
44
|
+
@done = true if @x < 0
|
45
|
+
@done = true if @y < 0
|
46
|
+
@done = true if @x > 240
|
47
|
+
@done = true if @y > 208
|
48
|
+
@collider.update(@x, @y)
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_sprite
|
52
|
+
return Sprite.new(:bullet_left, false) if @direction == :left
|
53
|
+
return Sprite.new(:bullet_up, false) if @direction == :up
|
54
|
+
return Sprite.new(:bullet_down, false) if @direction == :down
|
55
|
+
return Sprite.new(:bullet_right, false) if @direction == :right
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# class Collider
|
2
|
+
class Collider
|
3
|
+
attr_reader :x, :y, :width, :height
|
4
|
+
|
5
|
+
def initialize(x, y, width, height)
|
6
|
+
@x = x
|
7
|
+
@y = y
|
8
|
+
@width = width
|
9
|
+
@height = height
|
10
|
+
end
|
11
|
+
|
12
|
+
def update(x, y)
|
13
|
+
@x = x
|
14
|
+
@y = y
|
15
|
+
end
|
16
|
+
|
17
|
+
def collides?(b)
|
18
|
+
(@x + @width * 8) >= (b.x + 3) &&
|
19
|
+
(x + 2 <= (b.x + b.width * 8)) &&
|
20
|
+
((y + height * 8) >= b.y + 3) &&
|
21
|
+
(y + 2 <= (b.y + b.height * 8))
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'gameobject'
|
2
|
+
|
3
|
+
# class Eagle
|
4
|
+
class Eagle < GameObject
|
5
|
+
def initialize(x, y)
|
6
|
+
super(x, y, 2, 2, true)
|
7
|
+
@sprite = Sprite.new(:eagle, false)
|
8
|
+
@hitted = false
|
9
|
+
end
|
10
|
+
|
11
|
+
def hitted(_obj)
|
12
|
+
@hitted = true
|
13
|
+
end
|
14
|
+
|
15
|
+
def update
|
16
|
+
@sprite = Sprite.new(:eagledead, false) if @hitted
|
17
|
+
@sprite.update
|
18
|
+
end
|
19
|
+
|
20
|
+
def dead?
|
21
|
+
@hitted
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require_relative 'gameobject'
|
2
|
+
require_relative 'tank'
|
3
|
+
require_relative '../misc/ai'
|
4
|
+
|
5
|
+
# class Enemy
|
6
|
+
class Enemy < Tank
|
7
|
+
attr_reader :bullet
|
8
|
+
def initialize(x, y, map, level = 1)
|
9
|
+
super(x, y, :down)
|
10
|
+
@newtank = 200
|
11
|
+
@level = level
|
12
|
+
@spritedb = create_sprites
|
13
|
+
@sprite = get_sprite
|
14
|
+
@bullet = nil
|
15
|
+
@map = map
|
16
|
+
@ai = AI.new(self, @map)
|
17
|
+
@lifes = level
|
18
|
+
@lifes = 1 if level == 5
|
19
|
+
@speed = 2 if level == 5
|
20
|
+
end
|
21
|
+
|
22
|
+
def update
|
23
|
+
super
|
24
|
+
@newtank -= 1 if @newtank > 0
|
25
|
+
return if done?
|
26
|
+
move if @moving
|
27
|
+
@sprite = get_sprite
|
28
|
+
@sprite.repeat = @moving
|
29
|
+
@sprite.update
|
30
|
+
check_missile
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_sprite
|
34
|
+
return @spritedb[:newtank] if @newtank > 0
|
35
|
+
return @spritedb[:enemy_up] if @direction == :up
|
36
|
+
return @spritedb[:enemy_left] if @direction == :left
|
37
|
+
return @spritedb[:enemy_right] if @direction == :right
|
38
|
+
return @spritedb[:enemy_down] if @direction == :down
|
39
|
+
end
|
40
|
+
|
41
|
+
def collision_detect(objects)
|
42
|
+
return if @newtank > 0
|
43
|
+
objects.each do |o|
|
44
|
+
if collide?(o)
|
45
|
+
return nil if o.is_a?(Upgrade) || o.is_a?(Bullet)
|
46
|
+
return nil if o.is_a?(Enemy) && o.immortal?
|
47
|
+
# puts "#{self} coliding with #{o}"
|
48
|
+
return_back
|
49
|
+
end
|
50
|
+
end
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
|
54
|
+
def hitted(_obj)
|
55
|
+
@lifes -= 1
|
56
|
+
return if @lifes > 0
|
57
|
+
@done = true
|
58
|
+
@sprite.done = true
|
59
|
+
@map.add_explosion(@x, @y)
|
60
|
+
end
|
61
|
+
|
62
|
+
def ai
|
63
|
+
return if @newtank > 0
|
64
|
+
@ai.step
|
65
|
+
end
|
66
|
+
|
67
|
+
def immortal?
|
68
|
+
@newtank > 0
|
69
|
+
end
|
70
|
+
|
71
|
+
def create_sprites
|
72
|
+
return { :enemy_up => Sprite.new(:enemy1up, false),
|
73
|
+
:enemy_left => Sprite.new(:enemy1left, false),
|
74
|
+
:enemy_down => Sprite.new(:enemy1down, false),
|
75
|
+
:enemy_right => Sprite.new(:enemy1right, false),
|
76
|
+
:newtank => Sprite.new(:newtank, 100) } if @level == 1
|
77
|
+
|
78
|
+
return { :enemy_up => Sprite.new(:enemy2up, false),
|
79
|
+
:enemy_left => Sprite.new(:enemy2left, false),
|
80
|
+
:enemy_down => Sprite.new(:enemy2down, false),
|
81
|
+
:enemy_right => Sprite.new(:enemy2right, false),
|
82
|
+
:newtank => Sprite.new(:newtank, true) } if @level == 2
|
83
|
+
|
84
|
+
return { :enemy_up => Sprite.new(:enemy3up, false),
|
85
|
+
:enemy_left => Sprite.new(:enemy3left, false),
|
86
|
+
:enemy_down => Sprite.new(:enemy3down, false),
|
87
|
+
:enemy_right => Sprite.new(:enemy3right, false),
|
88
|
+
:newtank => Sprite.new(:newtank, true) } if @level == 3
|
89
|
+
|
90
|
+
return { :enemy_up => Sprite.new(:enemy4up, false),
|
91
|
+
:enemy_left => Sprite.new(:enemy4left, false),
|
92
|
+
:enemy_down => Sprite.new(:enemy4down, false),
|
93
|
+
:enemy_right => Sprite.new(:enemy4right, false),
|
94
|
+
:newtank => Sprite.new(:newtank, true) } if @level == 4
|
95
|
+
return { :enemy_up => Sprite.new(:enemy5up, false),
|
96
|
+
:enemy_left => Sprite.new(:enemy5left, false),
|
97
|
+
:enemy_down => Sprite.new(:enemy5down, false),
|
98
|
+
:enemy_right => Sprite.new(:enemy5right, false),
|
99
|
+
:newtank => Sprite.new(:newtank, true) } if @level == 5
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'gameobject'
|
2
|
+
|
3
|
+
# class Explosion
|
4
|
+
class Explosion < GameObject
|
5
|
+
def initialize(x, y)
|
6
|
+
super(x, y, 2, 2, false)
|
7
|
+
@sprite = Sprite.new(:explosion_small, false, 100, true)
|
8
|
+
end
|
9
|
+
|
10
|
+
def done?
|
11
|
+
@sprite.done?
|
12
|
+
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
@sprite.update
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'collider'
|
2
|
+
require_relative '../misc/sprite'
|
3
|
+
|
4
|
+
# class GameObject
|
5
|
+
class GameObject
|
6
|
+
attr_reader :collider
|
7
|
+
attr_reader :x, :y
|
8
|
+
|
9
|
+
def initialize(x, y, width, heigth, solid = true)
|
10
|
+
@x = x
|
11
|
+
@y = y
|
12
|
+
@collider = nil
|
13
|
+
@collider = Collider.new(x, y, width, heigth) if solid
|
14
|
+
@done = false
|
15
|
+
end
|
16
|
+
|
17
|
+
def solid?
|
18
|
+
!@collider.nil?
|
19
|
+
end
|
20
|
+
|
21
|
+
def draw
|
22
|
+
@sprite.draw(@x, @y, 1) if solid?
|
23
|
+
@sprite.draw(@x, @y, 3) unless solid?
|
24
|
+
end
|
25
|
+
|
26
|
+
def done?
|
27
|
+
@done
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
fail NotImplementedError, 'Abstract method, IMPLEMENT update (call @sprite.update!)'
|
32
|
+
end
|
33
|
+
|
34
|
+
def collide?(other)
|
35
|
+
return false if @collider.nil? || other.collider.nil? || other == self
|
36
|
+
@collider.collides?(other.collider)
|
37
|
+
end
|
38
|
+
|
39
|
+
def collision_detect(_objects)
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def hitted(_by)
|
44
|
+
# puts "#{self} hitted by #{by}"
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require_relative 'tank'
|
2
|
+
class Player < Tank
|
3
|
+
attr_reader :bullet
|
4
|
+
|
5
|
+
def initialize(x, y, map, player2=false)
|
6
|
+
super(x, y, :up)
|
7
|
+
@player2 = player2
|
8
|
+
@level = 1
|
9
|
+
@speed = 2
|
10
|
+
@spritedb = create_sprites(player2)
|
11
|
+
@sprite = get_sprite
|
12
|
+
@bullet = nil
|
13
|
+
@map = map
|
14
|
+
end
|
15
|
+
|
16
|
+
def input(input)
|
17
|
+
missile = nil
|
18
|
+
if @player2
|
19
|
+
missile = input_p2(input)
|
20
|
+
else
|
21
|
+
@moving = true
|
22
|
+
if input.include?(:p1up)
|
23
|
+
@direction = :up
|
24
|
+
elsif input.include?(:p1left)
|
25
|
+
@direction = :left
|
26
|
+
elsif input.include?(:p1down)
|
27
|
+
@direction = :down
|
28
|
+
elsif input.include?(:p1right)
|
29
|
+
@direction = :right
|
30
|
+
else
|
31
|
+
@moving = false
|
32
|
+
end
|
33
|
+
missile = shoot if (input.include?(:p1shoot))
|
34
|
+
end
|
35
|
+
missile
|
36
|
+
end
|
37
|
+
|
38
|
+
def input_p2(input)
|
39
|
+
missile = nil
|
40
|
+
@moving = true
|
41
|
+
if input.include?(:p2up)
|
42
|
+
@direction = :up
|
43
|
+
elsif input.include?(:p2left)
|
44
|
+
@direction = :left
|
45
|
+
elsif input.include?(:p2down)
|
46
|
+
@direction = :down
|
47
|
+
elsif input.include?(:p2right)
|
48
|
+
@direction = :right
|
49
|
+
else
|
50
|
+
@moving = false
|
51
|
+
end
|
52
|
+
missile = shoot if (input.include?(:p2shoot))
|
53
|
+
missile
|
54
|
+
end
|
55
|
+
|
56
|
+
def update
|
57
|
+
super
|
58
|
+
return if done?
|
59
|
+
move if @moving
|
60
|
+
@sprite = get_sprite
|
61
|
+
@sprite.pause = !@moving
|
62
|
+
@sprite.update
|
63
|
+
check_missile
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_sprite
|
67
|
+
return @spritedb[:player_up] if @direction == :up
|
68
|
+
return @spritedb[:player_left] if @direction == :left
|
69
|
+
return @spritedb[:player_right] if @direction == :right
|
70
|
+
return @spritedb[:player_down] if @direction == :down
|
71
|
+
end
|
72
|
+
|
73
|
+
def collision_detect(objects)
|
74
|
+
objects.each do |o|
|
75
|
+
if collide?(o) && o != @missile
|
76
|
+
# puts "#{self} coliding with #{o}"
|
77
|
+
if (o.is_a?(Upgrade))
|
78
|
+
upgrade_taken(o)
|
79
|
+
elsif @moving && o != @missile
|
80
|
+
return_back
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
|
87
|
+
def level_up
|
88
|
+
return if @level == 4
|
89
|
+
@level += 1
|
90
|
+
@speed += 0.5
|
91
|
+
@spritedb = create_sprites(@player2)
|
92
|
+
end
|
93
|
+
|
94
|
+
def hitted(obj)
|
95
|
+
@done = true
|
96
|
+
@sprite.done = true
|
97
|
+
@map.add_explosion(@x, @y)
|
98
|
+
end
|
99
|
+
|
100
|
+
def upgrade_taken(upgrade)
|
101
|
+
if upgrade.type == :powerup_star
|
102
|
+
level_up
|
103
|
+
elsif upgrade.type == :powerup_timer
|
104
|
+
@map.upgrade_timer
|
105
|
+
elsif upgrade.type == :powerup_granade
|
106
|
+
@map.upgrade_granade
|
107
|
+
end
|
108
|
+
upgrade.taken(self)
|
109
|
+
end
|
110
|
+
|
111
|
+
def create_sprites(player2)
|
112
|
+
return { :player_up => Sprite.new( :player2_1up, false),
|
113
|
+
:player_left => Sprite.new( :player2_1left, false),
|
114
|
+
:player_down => Sprite.new( :player2_1down, false),
|
115
|
+
:player_right => Sprite.new( :player2_1right, false) } if player2 && @level == 1
|
116
|
+
return { :player_up => Sprite.new( :player1_1up, false),
|
117
|
+
:player_left => Sprite.new( :player1_1left, false),
|
118
|
+
:player_down => Sprite.new( :player1_1down, false),
|
119
|
+
:player_right => Sprite.new( :player1_1right, false) } if !player2 && @level == 1
|
120
|
+
return { :player_up => Sprite.new( :player2_2up, false),
|
121
|
+
:player_left => Sprite.new( :player2_2left, false),
|
122
|
+
:player_down => Sprite.new( :player2_2down, false),
|
123
|
+
:player_right => Sprite.new( :player2_2right, false) } if player2 && @level == 2
|
124
|
+
return { :player_up => Sprite.new( :player1_2up, false),
|
125
|
+
:player_left => Sprite.new( :player1_2left, false),
|
126
|
+
:player_down => Sprite.new( :player1_2down, false),
|
127
|
+
:player_right => Sprite.new( :player1_2right, false) } if !player2 && @level == 2
|
128
|
+
return { :player_up => Sprite.new( :player2_3up, false),
|
129
|
+
:player_left => Sprite.new( :player2_3left, false),
|
130
|
+
:player_down => Sprite.new( :player2_3down, false),
|
131
|
+
:player_right => Sprite.new( :player2_3right, false) } if player2 && @level == 3
|
132
|
+
return { :player_up => Sprite.new( :player1_3up, false),
|
133
|
+
:player_left => Sprite.new( :player1_3left, false),
|
134
|
+
:player_down => Sprite.new( :player1_3down, false),
|
135
|
+
:player_right => Sprite.new( :player1_3right, false) } if !player2 && @level == 3
|
136
|
+
return { :player_up => Sprite.new( :player2_4up, false),
|
137
|
+
:player_left => Sprite.new( :player2_4left, false),
|
138
|
+
:player_down => Sprite.new( :player2_4down, false),
|
139
|
+
:player_right => Sprite.new( :player2_4right, false) } if player2 && @level == 4
|
140
|
+
return { :player_up => Sprite.new( :player1_4up, false),
|
141
|
+
:player_left => Sprite.new( :player1_4left, false),
|
142
|
+
:player_down => Sprite.new( :player1_4down, false),
|
143
|
+
:player_right => Sprite.new( :player1_4right, false) } if !player2 && @level == 4
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'gameobject'
|
2
|
+
|
3
|
+
# class Stone
|
4
|
+
class Stone < GameObject
|
5
|
+
def initialize(x, y)
|
6
|
+
super(x, y, 2, 2, true)
|
7
|
+
@sprite = Sprite.new(:stonewall, false)
|
8
|
+
end
|
9
|
+
|
10
|
+
def hitted(obj)
|
11
|
+
@done = true if obj.powerful == true
|
12
|
+
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
@sprite.update
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require_relative 'gameobject'
|
2
|
+
require_relative 'bullet'
|
3
|
+
|
4
|
+
# class Tank
|
5
|
+
class Tank < GameObject
|
6
|
+
attr_accessor :direction
|
7
|
+
|
8
|
+
def initialize(x, y, direction)
|
9
|
+
super(x, y, 2, 2, true)
|
10
|
+
@direction = direction
|
11
|
+
@missile = nil
|
12
|
+
@shoot_timer = 0
|
13
|
+
@level = 0
|
14
|
+
@speed = 1
|
15
|
+
end
|
16
|
+
|
17
|
+
def move
|
18
|
+
@x -= 0.5 * @speed if @direction == :left
|
19
|
+
@x += 0.5 * @speed if @direction == :right
|
20
|
+
@y += 0.5 * @speed if @direction == :down
|
21
|
+
@y -= 0.5 * @speed if @direction == :up
|
22
|
+
@x = 0 if @x < 0
|
23
|
+
@y = 0 if @y < 0
|
24
|
+
@x = 240 if @x > 240
|
25
|
+
@y = 208 if @y > 208
|
26
|
+
@collider.update(@x, @y)
|
27
|
+
end
|
28
|
+
|
29
|
+
def return_back
|
30
|
+
@x += 0.5 * @speed if @direction == :left
|
31
|
+
@x -= 0.5 * @speed if @direction == :right
|
32
|
+
@y -= 0.5 * @speed if @direction == :down
|
33
|
+
@y += 0.5 * @speed if @direction == :up
|
34
|
+
@collider.update(@x, @y)
|
35
|
+
end
|
36
|
+
|
37
|
+
def shoot
|
38
|
+
@missile = Bullet.new(self, true) if can_shoot? && @level == 4
|
39
|
+
@missile = Bullet.new(self) if can_shoot?
|
40
|
+
@missile
|
41
|
+
end
|
42
|
+
|
43
|
+
def can_shoot?
|
44
|
+
@missile.nil? && @shoot_timer == 0
|
45
|
+
end
|
46
|
+
|
47
|
+
def canoonX
|
48
|
+
return @x + 14 if @direction == :right
|
49
|
+
return @x - 12 if @direction == :left
|
50
|
+
return @x + 3 if @direction == :up || @direction == :down
|
51
|
+
end
|
52
|
+
|
53
|
+
def canoonY
|
54
|
+
return @y + 14 if @direction == :down
|
55
|
+
return @y - 12 if @direction == :up
|
56
|
+
@y
|
57
|
+
end
|
58
|
+
|
59
|
+
def check_missile
|
60
|
+
return if @missile.nil?
|
61
|
+
if @missile.done?
|
62
|
+
@missile = nil
|
63
|
+
@shoot_timer = 20 - @level * 3
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def update
|
68
|
+
@shoot_timer -= 1 if @shoot_timer > 0
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative 'gameobject'
|
2
|
+
|
3
|
+
# class Upgrade
|
4
|
+
class Upgrade < GameObject
|
5
|
+
attr_reader :type
|
6
|
+
|
7
|
+
def initialize(x, y, type)
|
8
|
+
super(x, y, 2, 2, true)
|
9
|
+
@type = type
|
10
|
+
@sprite = @sprite = Sprite.new(@type, true, 500)
|
11
|
+
@taken = false
|
12
|
+
@lifetime = 900 # cca 15 sekund
|
13
|
+
end
|
14
|
+
|
15
|
+
def taken(_obj)
|
16
|
+
@taken = true
|
17
|
+
end
|
18
|
+
|
19
|
+
def update
|
20
|
+
@lifetime -= 1 if @lifetime > 0
|
21
|
+
@sprite.update
|
22
|
+
end
|
23
|
+
|
24
|
+
def done?
|
25
|
+
@taken || @lifetime == 0
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# class GameState
|
2
|
+
class GameState
|
3
|
+
def self.switch(new_state)
|
4
|
+
$window.state && $window.state.leave
|
5
|
+
$window.state = new_state
|
6
|
+
new_state.enter
|
7
|
+
end
|
8
|
+
|
9
|
+
def enter
|
10
|
+
end
|
11
|
+
|
12
|
+
def leave
|
13
|
+
end
|
14
|
+
|
15
|
+
def draw
|
16
|
+
end
|
17
|
+
|
18
|
+
def update
|
19
|
+
end
|
20
|
+
|
21
|
+
def needs_redraw?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
def button_down(_id)
|
26
|
+
end
|
27
|
+
end
|