space_invaders 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +38 -0
- data/Rakefile +1 -0
- data/assets/fonts/unifont.ttf +0 -0
- data/assets/images/Bullet.png +0 -0
- data/assets/images/FullBlock.png +0 -0
- data/assets/images/InvaderA1.png +0 -0
- data/assets/images/InvaderA2.png +0 -0
- data/assets/images/InvaderB1.png +0 -0
- data/assets/images/InvaderB2.png +0 -0
- data/assets/images/InvaderC1.png +0 -0
- data/assets/images/InvaderC2.png +0 -0
- data/assets/images/OkBlock.png +0 -0
- data/assets/images/RedInvader.png +0 -0
- data/assets/images/Ship.png +0 -0
- data/assets/images/ShipCrushedLeft.png +0 -0
- data/assets/images/ShipCrushedRight.png +0 -0
- data/assets/images/WeakBlock.png +0 -0
- data/assets/sounds/InvaderBullet.wav +0 -0
- data/assets/sounds/InvaderHit.wav +0 -0
- data/assets/sounds/ShipBullet.wav +0 -0
- data/assets/sounds/ShipHit.wav +0 -0
- data/bin/space-invaders +9 -0
- data/go.rb +5 -0
- data/lib/space_invaders.rb +4 -0
- data/lib/space_invaders/app.rb +99 -0
- data/lib/space_invaders/base.rb +14 -0
- data/lib/space_invaders/behaviors/centerable.rb +13 -0
- data/lib/space_invaders/behaviors/collideable.rb +18 -0
- data/lib/space_invaders/behaviors/fireable.rb +35 -0
- data/lib/space_invaders/behaviors/mesurable.rb +17 -0
- data/lib/space_invaders/blocks/block.rb +62 -0
- data/lib/space_invaders/blocks/u_block.rb +37 -0
- data/lib/space_invaders/blocks/u_block_container.rb +46 -0
- data/lib/space_invaders/bullets/bullet.rb +46 -0
- data/lib/space_invaders/bullets/bullet_collection.rb +23 -0
- data/lib/space_invaders/invaders/invader.rb +38 -0
- data/lib/space_invaders/invaders/invader_abc.rb +27 -0
- data/lib/space_invaders/invaders/invader_row.rb +52 -0
- data/lib/space_invaders/invaders/invaders_container.rb +146 -0
- data/lib/space_invaders/invaders/red_invader.rb +66 -0
- data/lib/space_invaders/screens/game_over_screen.rb +42 -0
- data/lib/space_invaders/screens/next_level_screen.rb +39 -0
- data/lib/space_invaders/screens/welcome_screen.rb +46 -0
- data/lib/space_invaders/ship/drowned_ship_animator.rb +46 -0
- data/lib/space_invaders/ship/ship.rb +99 -0
- data/lib/space_invaders/statics/button_controller.rb +33 -0
- data/lib/space_invaders/statics/game_status.rb +52 -0
- data/lib/space_invaders/statics/images.rb +39 -0
- data/lib/space_invaders/statics/sounds.rb +37 -0
- data/lib/space_invaders/trackers/lives_tracker.rb +27 -0
- data/lib/space_invaders/trackers/score_tracker.rb +27 -0
- data/lib/space_invaders/utils.rb +19 -0
- data/space_invaders.gemspec +23 -0
- metadata +143 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ef1994e571b0ba658a9cf60b3dae336c4b0339ee
|
4
|
+
data.tar.gz: d62eee014f87581690779525441e4b483f9e693c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 485ada3b384472ab8ce9bba409362b21698f9e1d95d8c0d3e9bbf00f1b0d2390ec3bd5c69c239a20312c02e6bdef443f46fab9c40045168421fdc2d97cb83d7f
|
7
|
+
data.tar.gz: 4622246205ed25368e63f4a92fdd43f7093b5e446655fa8b1d01842753eb4d4837e3c990f6a9c71e7d5bfe8e63ae77bd55974950273eea517010ee3f4b9e440e
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Damir Svrtan
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# Space Invaders
|
2
|
+
|
3
|
+
Classic arcade game Space Invaders written in Ruby w/ [Gosu](https://github.com/jlnr/gosu).
|
4
|
+
|
5
|
+
![Screenshot](http://i.imgur.com/Xfewqhn.png)
|
6
|
+
## Getting Started
|
7
|
+
|
8
|
+
The game is packed as a gem, so you can simply run:
|
9
|
+
|
10
|
+
$ gem install space_invaders
|
11
|
+
$ space-invaders
|
12
|
+
|
13
|
+
Or you can clone the repo and simply run the main file:
|
14
|
+
|
15
|
+
$ git clone git@github.com:DamirSvrtan/space-invaders.rb.git
|
16
|
+
$ ruby go.rb
|
17
|
+
|
18
|
+
## Troubles during installation:
|
19
|
+
|
20
|
+
If you have problems installing the game, you're probably missing some OS specific libraries that Gosu uses. For further information checkout:
|
21
|
+
|
22
|
+
* [Getting started with Gosu on Linux](https://github.com/jlnr/gosu/wiki/Getting-Started-on-Linux)
|
23
|
+
* [Getting started with Gosu on OS-X](https://github.com/jlnr/gosu/wiki/Getting-Started-on-OS-X)
|
24
|
+
* [Getting started with Gosu on Windows](https://github.com/jlnr/gosu/wiki/Getting-Started-on-Windows)
|
25
|
+
|
26
|
+
## Thank you note
|
27
|
+
|
28
|
+
Thnx to people at [RubyWeekly](http://rubyweekly.com/) for publishing awesome stuff every week, such as [Mike Moores talk on LA Ruby Conference about creating games with Gosu](http://www.confreaks.com/videos/3049-larubyconf2014-writing-games-with-ruby?utm_source=rubyweekly&utm_medium=email).
|
29
|
+
|
30
|
+
Graphics partially taken from [How to make games in iOS](http://www.raywenderlich.com/51068/how-to-make-a-game-like-space-invaders-with-sprite-kit-tutorial-part-1).
|
31
|
+
|
32
|
+
## Contributing
|
33
|
+
|
34
|
+
1. Fork it ( http://github.com/<my-github-username>/space_invaders/fork )
|
35
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
36
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
37
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
38
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/bin/space-invaders
ADDED
data/go.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
require "gosu"
|
2
|
+
require 'pry'
|
3
|
+
|
4
|
+
require 'space_invaders/screens/welcome_screen'
|
5
|
+
require 'space_invaders/screens/game_over_screen'
|
6
|
+
require 'space_invaders/screens/next_level_screen'
|
7
|
+
|
8
|
+
require 'space_invaders/trackers/score_tracker'
|
9
|
+
require 'space_invaders/trackers/lives_tracker'
|
10
|
+
|
11
|
+
require 'space_invaders/statics/game_status'
|
12
|
+
require 'space_invaders/statics/button_controller'
|
13
|
+
require 'space_invaders/statics/images'
|
14
|
+
require 'space_invaders/statics/sounds'
|
15
|
+
|
16
|
+
require 'space_invaders/invaders/invaders_container'
|
17
|
+
require 'space_invaders/invaders/red_invader'
|
18
|
+
|
19
|
+
require 'space_invaders/blocks/u_block'
|
20
|
+
require 'space_invaders/blocks/u_block_container'
|
21
|
+
|
22
|
+
require 'space_invaders/ship/ship'
|
23
|
+
require 'space_invaders/base'
|
24
|
+
require 'space_invaders/utils'
|
25
|
+
|
26
|
+
module SpaceInvaders
|
27
|
+
class App < Gosu::Window
|
28
|
+
|
29
|
+
DEFAULT_FONT = "assets/fonts/unifont.ttf"
|
30
|
+
|
31
|
+
STATICS = :game_status, :button_controller, :images, :sounds,
|
32
|
+
:welcome_screen, :game_over_screen, :next_level_screen
|
33
|
+
TRACKERS = :lives_tracker, :score_tracker
|
34
|
+
DYNAMICS = :ship, :invaders_container, :u_block_container, :red_invader
|
35
|
+
|
36
|
+
attr_reader *STATICS, *TRACKERS, *DYNAMICS
|
37
|
+
|
38
|
+
def initialize width=800, height=600, fullscreen=false
|
39
|
+
super
|
40
|
+
self.caption = "Sprite Demonstration"
|
41
|
+
initialize_statics
|
42
|
+
initialize_dynamics_and_trackers
|
43
|
+
end
|
44
|
+
|
45
|
+
def button_down id
|
46
|
+
button_controller.button_down id
|
47
|
+
end
|
48
|
+
|
49
|
+
def update
|
50
|
+
if game_status.drowned_ship?
|
51
|
+
ship.update
|
52
|
+
elsif game_status.being_played?
|
53
|
+
update_dynamics
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def draw
|
58
|
+
if game_status.hasnt_started?
|
59
|
+
welcome_screen.draw
|
60
|
+
elsif game_status.next_level?
|
61
|
+
next_level_screen.draw
|
62
|
+
elsif game_status.drowned_ship? or game_status.being_played?
|
63
|
+
draw_dynamics
|
64
|
+
draw_trackers
|
65
|
+
elsif game_status.finished?
|
66
|
+
game_over_screen.draw
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def initialize_statics
|
71
|
+
define_properties *STATICS
|
72
|
+
end
|
73
|
+
|
74
|
+
def initialize_dynamics_and_trackers
|
75
|
+
define_properties *DYNAMICS, *TRACKERS
|
76
|
+
end
|
77
|
+
|
78
|
+
def draw_dynamics
|
79
|
+
DYNAMICS.each {|dynamic_element| self.send(dynamic_element).draw}
|
80
|
+
end
|
81
|
+
|
82
|
+
def draw_trackers
|
83
|
+
TRACKERS.each {|tracker_element| self.send(tracker_element).draw}
|
84
|
+
end
|
85
|
+
|
86
|
+
def update_dynamics
|
87
|
+
DYNAMICS.each {|dynamic_element| self.send(dynamic_element).update}
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def define_properties(*properties)
|
93
|
+
properties.each do |property|
|
94
|
+
instance_variable_set "@#{property}", Utils.to_klass(property).new(self)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module SpaceInvaders
|
2
|
+
module Centerable
|
3
|
+
def horizontal_center_draw(image, y)
|
4
|
+
x = app.width/2 - image.width/2
|
5
|
+
image.draw(x, y, 1)
|
6
|
+
end
|
7
|
+
|
8
|
+
def vertical_center_draw(image, x)
|
9
|
+
y = app.height/2 - image.height/2
|
10
|
+
image.draw(x, y, 1)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SpaceInvaders
|
2
|
+
module Collideable
|
3
|
+
def collides_with?(bullets)
|
4
|
+
bullets.each do |bullet|
|
5
|
+
if got_hit_by? bullet
|
6
|
+
bullet.delete
|
7
|
+
return true
|
8
|
+
end
|
9
|
+
end
|
10
|
+
return false
|
11
|
+
end
|
12
|
+
|
13
|
+
def got_hit_by?(bullet)
|
14
|
+
bullet.x_position.between?(x_position, x_position + width) and
|
15
|
+
bullet.y_position.between?(y_position, y_position + height)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'space_invaders/bullets/bullet_collection'
|
2
|
+
require 'space_invaders/bullets/bullet'
|
3
|
+
|
4
|
+
module SpaceInvaders
|
5
|
+
module Fireable
|
6
|
+
|
7
|
+
def bullet_collection
|
8
|
+
@bullet_collection ||= BulletCollection.new
|
9
|
+
end
|
10
|
+
|
11
|
+
alias_method :bullets, :bullet_collection
|
12
|
+
|
13
|
+
def fire!
|
14
|
+
bullet = Bullet.new(shooter, bullets_going_down?, bullet_collection, bullet_offset_speed)
|
15
|
+
sound.play
|
16
|
+
end
|
17
|
+
|
18
|
+
def shooter
|
19
|
+
raise NotImplementedError.new("You must implement the inherited shooter method")
|
20
|
+
end
|
21
|
+
|
22
|
+
def sound
|
23
|
+
raise NotImplementedError.new("You must implement the inherited sound method")
|
24
|
+
end
|
25
|
+
|
26
|
+
def bullets_going_down?
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def bullet_offset_speed
|
31
|
+
5
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'space_invaders/base'
|
2
|
+
require 'space_invaders/behaviors/collideable'
|
3
|
+
|
4
|
+
module SpaceInvaders
|
5
|
+
class Block < Base
|
6
|
+
include Collideable
|
7
|
+
|
8
|
+
attr_accessor :health, :x_position, :y_position, :u_block
|
9
|
+
|
10
|
+
def initialize u_block, x_position, y_position
|
11
|
+
super(u_block.app)
|
12
|
+
|
13
|
+
@u_block = u_block
|
14
|
+
@x_position = x_position
|
15
|
+
@y_position = y_position
|
16
|
+
@health = 3
|
17
|
+
set_image
|
18
|
+
end
|
19
|
+
|
20
|
+
def update
|
21
|
+
downgrade_image_or_die if collides_with? rival_bullets
|
22
|
+
end
|
23
|
+
|
24
|
+
def draw
|
25
|
+
@image.draw x_position, y_position, 1
|
26
|
+
end
|
27
|
+
|
28
|
+
def rival_bullets
|
29
|
+
app.ship.bullets.bullets + app.invaders_container.bullets.bullets
|
30
|
+
end
|
31
|
+
|
32
|
+
def width
|
33
|
+
@image.width
|
34
|
+
end
|
35
|
+
|
36
|
+
def height
|
37
|
+
@image.height
|
38
|
+
end
|
39
|
+
|
40
|
+
def dead?
|
41
|
+
health.zero?
|
42
|
+
end
|
43
|
+
|
44
|
+
def downgrade_image_or_die
|
45
|
+
self.health -= 1
|
46
|
+
if health > 0
|
47
|
+
set_image
|
48
|
+
else
|
49
|
+
u_block.delete(self)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def set_image
|
54
|
+
@image = case health
|
55
|
+
when 3 then app.images.full_block
|
56
|
+
when 2 then app.images.ok_block
|
57
|
+
when 1 then app.images.weak_block
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'space_invaders/base'
|
2
|
+
require 'space_invaders/blocks/block'
|
3
|
+
|
4
|
+
module SpaceInvaders
|
5
|
+
class UBlock < Base
|
6
|
+
|
7
|
+
attr_reader :blocks, :x_position, :y_position
|
8
|
+
|
9
|
+
def initialize app, x_position, y_position
|
10
|
+
super app
|
11
|
+
@x_position = x_position
|
12
|
+
@y_position = y_position
|
13
|
+
@blocks = []
|
14
|
+
initialize_blocks
|
15
|
+
end
|
16
|
+
|
17
|
+
def update
|
18
|
+
blocks.each {|block| block.update }
|
19
|
+
end
|
20
|
+
|
21
|
+
def draw
|
22
|
+
blocks.each {|block| block.draw }
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize_blocks
|
26
|
+
x = [10, 10, 10, 40, 70, 70, 70]
|
27
|
+
y = [10, 30, 50, 10, 10, 30, 50]
|
28
|
+
7.times do |i|
|
29
|
+
@blocks << Block.new(self, x[i] + x_position, y[i] + y_position)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete(block)
|
34
|
+
blocks.delete(block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|