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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 295f017681ff7f3ff610c43795a8ab295f16686e
4
- data.tar.gz: f68f91fa0b4a9f8608582802390dadb30403f975
3
+ metadata.gz: f5c57043a068e9d86f83544fff09e2c6efff74dc
4
+ data.tar.gz: 781b99c3a4008950c40222633d807c3345960e3e
5
5
  SHA512:
6
- metadata.gz: cbbe226246bc96d2d1cc7c120975ac9ba1f76de59606c0f96a4b743912d373772c56bb46da11a10813e423fb7dfdeeb29c1882f3cc06b0b593f51818dd607df8
7
- data.tar.gz: 7fbcf4c57ff32cdd1ff51b7102856440d98f901e606d51df9912fd2aa48b03b7e4f02316d1d9c812d08967fc656afab63d971f73daa648a563115533f17b7851
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
@@ -1,3 +1,3 @@
1
1
  module Battlecity
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -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,13 @@
1
+ require_relative 'gameobject'
2
+
3
+ # class Bush
4
+ class Bush < GameObject
5
+ def initialize(x, y)
6
+ super(x, y, 2, 2, false)
7
+ @sprite = Sprite.new(:bush, false)
8
+ end
9
+
10
+ def update
11
+ @sprite.update
12
+ end
13
+ 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,13 @@
1
+ require_relative 'gameobject'
2
+
3
+ # class Water
4
+ class Water < GameObject
5
+ def initialize(x, y)
6
+ super(x, y, 2, 2)
7
+ @sprite = Sprite.new(:water, true)
8
+ end
9
+
10
+ def update
11
+ @sprite.update
12
+ end
13
+ 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