chingu 0.5.8.1 → 0.5.8.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.
- data.tar.gz.sig +0 -0
- data/Manifest.txt +3 -1
- data/README.rdoc +7 -3
- data/chingu.gemspec +3 -3
- data/examples/example13.rb +88 -0
- data/examples/high_score_list.yml +21 -0
- data/lib/chingu.rb +1 -2
- data/lib/chingu/animation.rb +4 -3
- data/lib/chingu/assets.rb +5 -17
- data/lib/chingu/basic_game_object.rb +3 -3
- data/lib/chingu/high_score_list.rb +117 -0
- data/lib/chingu/text.rb +49 -12
- data/lib/chingu/traits/timer.rb +21 -8
- data/lib/chingu/window.rb +4 -5
- metadata +5 -3
- metadata.gz.sig +0 -0
- data/lib/chingu/high_score.rb +0 -60
data.tar.gz.sig
CHANGED
Binary file
|
data/Manifest.txt
CHANGED
@@ -16,6 +16,7 @@ examples/example1.rb
|
|
16
16
|
examples/example10.rb
|
17
17
|
examples/example11.rb
|
18
18
|
examples/example12.rb
|
19
|
+
examples/example13.rb
|
19
20
|
examples/example2.rb
|
20
21
|
examples/example3.rb
|
21
22
|
examples/example4.rb
|
@@ -25,6 +26,7 @@ examples/example7.rb
|
|
25
26
|
examples/example8.rb
|
26
27
|
examples/example9.rb
|
27
28
|
examples/game1.rb
|
29
|
+
examples/high_score_list.yml
|
28
30
|
examples/media/Parallax-scroll-example-layer-0.png
|
29
31
|
examples/media/Parallax-scroll-example-layer-1.png
|
30
32
|
examples/media/Parallax-scroll-example-layer-2.png
|
@@ -71,7 +73,7 @@ lib/chingu/helpers/gfx.rb
|
|
71
73
|
lib/chingu/helpers/input_client.rb
|
72
74
|
lib/chingu/helpers/input_dispatcher.rb
|
73
75
|
lib/chingu/helpers/rotation_center.rb
|
74
|
-
lib/chingu/
|
76
|
+
lib/chingu/high_score_list.rb
|
75
77
|
lib/chingu/inflector.rb
|
76
78
|
lib/chingu/input.rb
|
77
79
|
lib/chingu/named_resource.rb
|
data/README.rdoc
CHANGED
@@ -528,10 +528,14 @@ You also have:
|
|
528
528
|
Sound["shot.png"]
|
529
529
|
Song["intromusic.ogg"]
|
530
530
|
|
531
|
-
|
531
|
+
The default settings are like this:
|
532
|
+
Image["image.png"] -- searches directories ".", "images", "gfx" and "media"
|
533
|
+
Sample["sample.wav"] -- searches directories ".", "sounds", "sfx" and "media"
|
534
|
+
Song["song.ogg"] -- searches directories ".", "songs", "sounds", "sfx" and "media"
|
535
|
+
|
532
536
|
Add your own searchpaths like this:
|
533
|
-
Gosu::Image.autoload_dirs << File.join(
|
534
|
-
Gosu::Sound.autoload_dirs << File.join(
|
537
|
+
Gosu::Image.autoload_dirs << File.join(ROOT, "gfx")
|
538
|
+
Gosu::Sound.autoload_dirs << File.join(ROOT, "samples")
|
535
539
|
|
536
540
|
This will add \path\to\your\game\gfx and \path\to\your\game\samples to Image and Sound.
|
537
541
|
|
data/chingu.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{chingu}
|
5
|
-
s.version = "0.5.8.
|
5
|
+
s.version = "0.5.8.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["ippa"]
|
9
|
-
s.date = %q{2009-10-
|
9
|
+
s.date = %q{2009-10-22}
|
10
10
|
s.description = %q{OpenGL accelerated 2D game framework for Ruby.
|
11
11
|
Builds on the awesome Gosu (Ruby/C++) which provides all the core functionality.
|
12
12
|
It adds simple yet powerful game states, prettier input handling, deployment safe asset-handling, a basic re-usable game object and automation of common task.}
|
13
13
|
s.email = ["ippa@rubylicio.us"]
|
14
14
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "benchmarks/README.txt"]
|
15
|
-
s.files = ["History.txt", "LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "benchmarks/README.txt", "benchmarks/benchmark.rb", "benchmarks/benchmark3.rb", "benchmarks/benchmark4.rb", "benchmarks/benchmark5.rb", "benchmarks/benchmark6.rb", "benchmarks/meta_benchmark.rb", "benchmarks/meta_benchmark2.rb", "chingu.gemspec", "examples/example1.rb", "examples/example10.rb", "examples/example11.rb", "examples/example12.rb", "examples/example2.rb", "examples/example3.rb", "examples/example4.rb", "examples/example5.rb", "examples/example6.rb", "examples/example7.rb", "examples/example8.rb", "examples/example9.rb", "examples/game1.rb", "examples/media/Parallax-scroll-example-layer-0.png", "examples/media/Parallax-scroll-example-layer-1.png", "examples/media/Parallax-scroll-example-layer-2.png", "examples/media/Parallax-scroll-example-layer-3.png", "examples/media/background1.png", "examples/media/bullet.png", "examples/media/bullet_hit.wav", "examples/media/city1.csv", "examples/media/city1.png", "examples/media/city2.png", "examples/media/droid.bmp", "examples/media/enemy_bullet.png", "examples/media/explosion.wav", "examples/media/fire_bullet.png", "examples/media/fireball.png", "examples/media/laser.wav", "examples/media/particle.png", "examples/media/plane.csv", "examples/media/plane.png", "examples/media/ruby.png", "examples/media/saucer.csv", "examples/media/saucer.gal", "examples/media/saucer.png", "examples/media/spaceship.png", "examples/media/stickfigure.bmp", "examples/media/stickfigure.png", "examples/media/video_games.png", "lib/chingu.rb", "lib/chingu/animation.rb", "lib/chingu/assets.rb", "lib/chingu/basic_game_object.rb", "lib/chingu/core_extensions.rb", "lib/chingu/fpscounter.rb", "lib/chingu/game_object.rb", "lib/chingu/game_object_list.rb", "lib/chingu/game_state.rb", "lib/chingu/game_state_manager.rb", "lib/chingu/game_states/debug.rb", "lib/chingu/game_states/fade_to.rb", "lib/chingu/game_states/pause.rb", "lib/chingu/helpers/game_object.rb", "lib/chingu/helpers/game_state.rb", "lib/chingu/helpers/gfx.rb", "lib/chingu/helpers/input_client.rb", "lib/chingu/helpers/input_dispatcher.rb", "lib/chingu/helpers/rotation_center.rb", "lib/chingu/
|
15
|
+
s.files = ["History.txt", "LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "benchmarks/README.txt", "benchmarks/benchmark.rb", "benchmarks/benchmark3.rb", "benchmarks/benchmark4.rb", "benchmarks/benchmark5.rb", "benchmarks/benchmark6.rb", "benchmarks/meta_benchmark.rb", "benchmarks/meta_benchmark2.rb", "chingu.gemspec", "examples/example1.rb", "examples/example10.rb", "examples/example11.rb", "examples/example12.rb", "examples/example13.rb", "examples/example2.rb", "examples/example3.rb", "examples/example4.rb", "examples/example5.rb", "examples/example6.rb", "examples/example7.rb", "examples/example8.rb", "examples/example9.rb", "examples/game1.rb", "examples/high_score_list.yml", "examples/media/Parallax-scroll-example-layer-0.png", "examples/media/Parallax-scroll-example-layer-1.png", "examples/media/Parallax-scroll-example-layer-2.png", "examples/media/Parallax-scroll-example-layer-3.png", "examples/media/background1.png", "examples/media/bullet.png", "examples/media/bullet_hit.wav", "examples/media/city1.csv", "examples/media/city1.png", "examples/media/city2.png", "examples/media/droid.bmp", "examples/media/enemy_bullet.png", "examples/media/explosion.wav", "examples/media/fire_bullet.png", "examples/media/fireball.png", "examples/media/laser.wav", "examples/media/particle.png", "examples/media/plane.csv", "examples/media/plane.png", "examples/media/ruby.png", "examples/media/saucer.csv", "examples/media/saucer.gal", "examples/media/saucer.png", "examples/media/spaceship.png", "examples/media/stickfigure.bmp", "examples/media/stickfigure.png", "examples/media/video_games.png", "lib/chingu.rb", "lib/chingu/animation.rb", "lib/chingu/assets.rb", "lib/chingu/basic_game_object.rb", "lib/chingu/core_extensions.rb", "lib/chingu/fpscounter.rb", "lib/chingu/game_object.rb", "lib/chingu/game_object_list.rb", "lib/chingu/game_state.rb", "lib/chingu/game_state_manager.rb", "lib/chingu/game_states/debug.rb", "lib/chingu/game_states/fade_to.rb", "lib/chingu/game_states/pause.rb", "lib/chingu/helpers/game_object.rb", "lib/chingu/helpers/game_state.rb", "lib/chingu/helpers/gfx.rb", "lib/chingu/helpers/input_client.rb", "lib/chingu/helpers/input_dispatcher.rb", "lib/chingu/helpers/rotation_center.rb", "lib/chingu/high_score_list.rb", "lib/chingu/inflector.rb", "lib/chingu/input.rb", "lib/chingu/named_resource.rb", "lib/chingu/parallax.rb", "lib/chingu/particle.rb", "lib/chingu/rect.rb", "lib/chingu/require_all.rb", "lib/chingu/text.rb", "lib/chingu/traits/collision_detection.rb", "lib/chingu/traits/effect.rb", "lib/chingu/traits/retrofy.rb", "lib/chingu/traits/timer.rb", "lib/chingu/traits/velocity.rb", "lib/chingu/window.rb"]
|
16
16
|
s.homepage = %q{http://github.com/ippa/chingu/tree/master}
|
17
17
|
s.rdoc_options = ["--main", "README.rdoc"]
|
18
18
|
s.require_paths = ["lib"]
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require File.join(File.dirname($0), "..", "lib", "chingu")
|
3
|
+
include Gosu
|
4
|
+
include Chingu
|
5
|
+
|
6
|
+
#
|
7
|
+
# Demonstrating Chingus HighScoreList-class
|
8
|
+
# I couldn't keep myself from spicying it up some though :P
|
9
|
+
#
|
10
|
+
class Game < Chingu::Window
|
11
|
+
def initialize
|
12
|
+
super(640,400)
|
13
|
+
self.input = {:esc => :exit}
|
14
|
+
self.caption = "Example of Chingus HighScore class"
|
15
|
+
|
16
|
+
PulsatingText.create("HIGH SCORES", :x => $window.width/2, :y => 50, :size => 70)
|
17
|
+
|
18
|
+
#
|
19
|
+
# Load a list from disk, defaults to "high_score_list.yml"
|
20
|
+
# Argument :size forces list to this size
|
21
|
+
#
|
22
|
+
@high_score_list = HighScoreList.load(:size => 10)
|
23
|
+
|
24
|
+
#
|
25
|
+
# Add some new high scores to the list. :name and :score are required but you can put whatever.
|
26
|
+
# They will mix with the old scores, automatic default sorting on :score
|
27
|
+
#
|
28
|
+
10.times { @high_score_list.add(:name => "NEW", :score => rand(10000)) }
|
29
|
+
|
30
|
+
#
|
31
|
+
# Iterate through all high scores and create the visual represenation of it
|
32
|
+
#
|
33
|
+
@high_score_list.each_with_index do |high_score, index|
|
34
|
+
y = index * 25 + 100
|
35
|
+
Text.create(high_score[:name], :x => 200, :y => y, :size => 20)
|
36
|
+
Text.create(high_score[:score], :x => 400, :y => y, :size => 20)
|
37
|
+
end
|
38
|
+
|
39
|
+
5.times do
|
40
|
+
score = rand(20000)
|
41
|
+
puts "position for #{score}: #{@high_score_list.position_by_score(score)}"
|
42
|
+
end
|
43
|
+
|
44
|
+
# @high_score_list.save # Uncomment to save list to disk
|
45
|
+
end
|
46
|
+
|
47
|
+
def update
|
48
|
+
super
|
49
|
+
self.caption = "FPS #{$window.fps} - game objects: #{game_objects.size}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# colorful pulsating text...
|
55
|
+
#
|
56
|
+
class PulsatingText < Text
|
57
|
+
has_trait :timer, :effect
|
58
|
+
@@red = Color.new(0xFFFF0000)
|
59
|
+
@@green = Color.new(0xFF00FF00)
|
60
|
+
@@blue = Color.new(0xFF0000FF)
|
61
|
+
|
62
|
+
def initialize(text, options = {})
|
63
|
+
super(text, options)
|
64
|
+
|
65
|
+
options = text if text.is_a? Hash
|
66
|
+
@pulse = options[:pulse] || false
|
67
|
+
self.rotation_center(:center_center)
|
68
|
+
every(20) { create_pulse } if @pulse == false
|
69
|
+
end
|
70
|
+
|
71
|
+
def create_pulse
|
72
|
+
pulse = PulsatingText.create(@text, :x => @x, :y => @y, :height => @height, :pulse => true, :image => @image, :zorder => @zorder+1)
|
73
|
+
colors = [@@red, @@green, @@blue]
|
74
|
+
pulse.color = colors[rand(colors.size)].dup
|
75
|
+
pulse.mode = :additive
|
76
|
+
pulse.alpha -= 150
|
77
|
+
pulse.scale_rate = 0.002
|
78
|
+
pulse.fade_rate = -3 + rand(2)
|
79
|
+
pulse.rotation_rate = rand(2)==0 ? 0.05 : -0.05
|
80
|
+
end
|
81
|
+
|
82
|
+
def update
|
83
|
+
destroy if self.alpha == 0
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
Game.new.show
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
- :name: ABC
|
3
|
+
:score: 9260
|
4
|
+
- :name: ABC
|
5
|
+
:score: 9112
|
6
|
+
- :name: ABC
|
7
|
+
:score: 8660
|
8
|
+
- :name: ABC
|
9
|
+
:score: 8030
|
10
|
+
- :name: ABC
|
11
|
+
:score: 7802
|
12
|
+
- :name: ABC
|
13
|
+
:score: 6976
|
14
|
+
- :name: ABC
|
15
|
+
:score: 6718
|
16
|
+
- :name: ABC
|
17
|
+
:score: 6325
|
18
|
+
- :name: ABC
|
19
|
+
:score: 5632
|
20
|
+
- :name: ABC
|
21
|
+
:score: 4199
|
data/lib/chingu.rb
CHANGED
@@ -26,8 +26,7 @@ require 'rubygems' unless RUBY_VERSION =~ /1\.9/
|
|
26
26
|
require 'gosu'
|
27
27
|
require File.join(CHINGU_ROOT,"chingu","require_all") # Thanks to http://github.com/tarcieri/require_all !
|
28
28
|
require_all "#{CHINGU_ROOT}/chingu"
|
29
|
-
#autoload :OpenStruct, "ostruct"
|
30
29
|
|
31
30
|
module Chingu
|
32
|
-
VERSION = "0.5.8.
|
31
|
+
VERSION = "0.5.8.2"
|
33
32
|
end
|
data/lib/chingu/animation.rb
CHANGED
@@ -10,7 +10,7 @@ module Chingu
|
|
10
10
|
# Is autodetection of width / height possible?
|
11
11
|
#
|
12
12
|
class Animation
|
13
|
-
attr_accessor :frames, :delay
|
13
|
+
attr_accessor :frames, :delay, :step
|
14
14
|
|
15
15
|
#
|
16
16
|
# Create a new Animation.
|
@@ -22,9 +22,10 @@ module Chingu
|
|
22
22
|
# - height: width of each frame in the tileanimation
|
23
23
|
# - size: [x,y] specify width/height with 1 argument (an array)
|
24
24
|
# - delay: milliseconds between each frame
|
25
|
+
# - step: [steps] move animation forward [steps] frames each time we call #next
|
25
26
|
#
|
26
27
|
def initialize(options)
|
27
|
-
options = {:loop => true, :bounce => false, :width => 32, :height => 32, :index => 0, :delay => 100}.merge(options)
|
28
|
+
options = {:step => 1, :loop => true, :bounce => false, :width => 32, :height => 32, :index => 0, :delay => 100}.merge(options)
|
28
29
|
|
29
30
|
@loop = options[:loop]
|
30
31
|
@bounce = options[:bounce]
|
@@ -33,6 +34,7 @@ module Chingu
|
|
33
34
|
@width = options[:width]
|
34
35
|
@index = options[:index]
|
35
36
|
@delay = options[:delay]
|
37
|
+
@step = options[:step] || 1
|
36
38
|
@dt = 0
|
37
39
|
|
38
40
|
if options[:size]
|
@@ -44,7 +46,6 @@ module Chingu
|
|
44
46
|
|
45
47
|
@frame_actions = []
|
46
48
|
@frames = Gosu::Image.load_tiles($window, @file, @width, @height, true)
|
47
|
-
@step = 1
|
48
49
|
end
|
49
50
|
|
50
51
|
#
|
data/lib/chingu/assets.rb
CHANGED
@@ -9,7 +9,7 @@ module Chingu
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def image_path(file)
|
12
|
-
File.join(ROOT, "
|
12
|
+
File.join(ROOT, "images", file)
|
13
13
|
end
|
14
14
|
|
15
15
|
class Asset
|
@@ -21,6 +21,9 @@ module Chingu
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
#
|
25
|
+
# Extend GOSU's core classes with NamedResource
|
26
|
+
#
|
24
27
|
module Gosu
|
25
28
|
class Image
|
26
29
|
include Chingu::NamedResource
|
@@ -45,20 +48,5 @@ module Gosu
|
|
45
48
|
(path = find_file(name)) ? Gosu::Sample.new($window, path) : nil
|
46
49
|
end
|
47
50
|
end
|
48
|
-
Sound = Sample
|
49
|
-
|
50
|
-
class Tile
|
51
|
-
include Chingu::NamedResource
|
52
|
-
|
53
|
-
def self.autoload(name)
|
54
|
-
(path = find_file(name)) ? Gosu::Image.load_tiles($window, path, 32, 32, true) : nil
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
class CutTiles
|
59
|
-
def self.[](name, width, height)
|
60
|
-
@@tiles = Hash.new unless defined?(@@tiles)
|
61
|
-
@@tiles[name] ||= Gosu::Image.load_tiles($window, name, width, height, true)
|
62
|
-
end
|
63
|
-
end
|
51
|
+
Sound = Sample # Gosu uses Sample, but Sound makes sense too.
|
64
52
|
end
|
@@ -62,9 +62,9 @@ module Chingu
|
|
62
62
|
# Use create() instead of new() if you want to keep track of your objects through
|
63
63
|
# Chingus "game_objects" which is available in all game states and the main window.
|
64
64
|
#
|
65
|
-
def self.create(options = {})
|
66
|
-
|
67
|
-
|
65
|
+
#def self.create(options = {})
|
66
|
+
def self.create(*options)
|
67
|
+
instance = self.new(*options)
|
68
68
|
|
69
69
|
#
|
70
70
|
# Add to parents list of game objects
|
@@ -0,0 +1,117 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Chingu -- OpenGL accelerated 2D game framework for Ruby
|
4
|
+
# Copyright (C) 2009 ippa / ippa@rubylicio.us
|
5
|
+
#
|
6
|
+
# This library is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
8
|
+
# License as published by the Free Software Foundation; either
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
17
|
+
# License along with this library; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
+
#
|
20
|
+
#++
|
21
|
+
|
22
|
+
module Chingu
|
23
|
+
#
|
24
|
+
# Highscore-class
|
25
|
+
#
|
26
|
+
# - Keeps a local YAML file with highscores, default highscores.yml in root game dir.
|
27
|
+
# - Add, delete, clear highscores
|
28
|
+
# - Iterate through highscores with simple Highscore#each
|
29
|
+
#
|
30
|
+
class HighScoreList
|
31
|
+
attr_reader :file
|
32
|
+
|
33
|
+
#
|
34
|
+
# Create a new high score list with 0 entries
|
35
|
+
#
|
36
|
+
def initialize(options = {})
|
37
|
+
require 'yaml'
|
38
|
+
@file = options[:file] || "high_score_list.yml"
|
39
|
+
@size = options[:size] || 100
|
40
|
+
@sort_on = options[:sort_on] || :score
|
41
|
+
@high_scores = Array.new
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Create a new high score list and try to load content from :file-parameter
|
46
|
+
# If no :file is given, HighScoreList tries to load from file "high_score_list.yml"
|
47
|
+
#
|
48
|
+
def self.load(options = {})
|
49
|
+
high_score_list = HighScoreList.new(options)
|
50
|
+
high_score_list.load
|
51
|
+
return high_score_list
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Add a new high score to list.
|
56
|
+
# 'data' is a hash of key/value-pairs that needs to contain at least the keys :name and :score
|
57
|
+
#
|
58
|
+
def add(data)
|
59
|
+
raise "No :name value in high score!" if data[:name].nil?
|
60
|
+
raise "No :score value in high score!" if data[:score].nil?
|
61
|
+
|
62
|
+
@high_scores.push(data)
|
63
|
+
@high_scores.sort! { |a, b| b[@sort_on] <=> a[@sort_on] }
|
64
|
+
@high_scores = @high_scores[0..@size]
|
65
|
+
end
|
66
|
+
alias << add
|
67
|
+
|
68
|
+
#
|
69
|
+
# Returns the position 'score' would get in among the high scores:
|
70
|
+
# @high_score_list.position_by_score(999999999) # most likely returns 1 for the number one spot
|
71
|
+
# @high_score_list.position_by_score(1) # most likely returns nil since no placement is found (didn't make it to the high scores)
|
72
|
+
#
|
73
|
+
def position_by_score(score)
|
74
|
+
position = 1
|
75
|
+
@high_scores.each do |high_score|
|
76
|
+
return position if score > high_score[:score]
|
77
|
+
position += 1
|
78
|
+
end
|
79
|
+
return nil
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# Direct access to invidual high scores
|
84
|
+
#
|
85
|
+
def [](index)
|
86
|
+
@high_scores[index]
|
87
|
+
end
|
88
|
+
|
89
|
+
#
|
90
|
+
# Iterate through all high scores
|
91
|
+
#
|
92
|
+
def each
|
93
|
+
@high_scores.each { |high_score| yield high_score }
|
94
|
+
end
|
95
|
+
|
96
|
+
def each_with_index
|
97
|
+
@high_scores.each_with_index { |high_score, index| yield high_score, index }
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# Load data from previously specified @file
|
102
|
+
#
|
103
|
+
def load
|
104
|
+
@high_scores = YAML.load_file(@file) if File.exists?(@file)
|
105
|
+
end
|
106
|
+
|
107
|
+
#
|
108
|
+
# Save high score data into previously specified @file
|
109
|
+
#
|
110
|
+
def save
|
111
|
+
File.open(@file, 'w') do |out|
|
112
|
+
YAML.dump(@high_scores, out)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
data/lib/chingu/text.rb
CHANGED
@@ -27,14 +27,14 @@ module Chingu
|
|
27
27
|
# @font.draw("A Text", 200, 50, 55, 2.0)
|
28
28
|
#
|
29
29
|
# Chingu
|
30
|
-
# @text = Chingu::Text.new(
|
30
|
+
# @text = Chingu::Text.new("A Text", :x => 200, :y => 50, :zorder => 55, :factor_x => 2.0)
|
31
31
|
# @text.draw # usually not needed as Text is a GameObject and therefore autodrawn
|
32
32
|
#
|
33
33
|
# @text comes with a number of changable properties, x,y,zorder,angle,factor_x,color,mode etc.
|
34
34
|
#
|
35
35
|
class Text < Chingu::GameObject
|
36
36
|
attr_accessor :text
|
37
|
-
attr_reader :height, :gosu_font
|
37
|
+
attr_reader :height, :gosu_font, :line_spacing, :align, :max_width
|
38
38
|
|
39
39
|
@@size = nil
|
40
40
|
@@font = nil
|
@@ -48,21 +48,47 @@ module Chingu
|
|
48
48
|
|
49
49
|
#
|
50
50
|
# Takes the standard GameObject-hash-arguments but also:
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
51
|
+
# :text - a string of text
|
52
|
+
# :font_name|:font - Name of a system font, or a filename to a TTF file (must contain �/�, does not work on Linux).
|
53
|
+
# :height|:size - Height of the font in pixels.
|
54
|
+
# :line_spacing - Spacing between two lines of text in pixels.
|
55
|
+
# :max_width - Width of the bitmap that will be returned. Text will be split into multiple lines to avoid drawing over the right border. When a single word is too long, it will be truncated.
|
56
|
+
# :align - One of :left, :right, :center or :justify.
|
54
57
|
#
|
55
|
-
|
58
|
+
# if :max_width is given the text is drawn using :line_spacing, :align and :max_width
|
59
|
+
#
|
60
|
+
def initialize(text, options = {})
|
61
|
+
if text.is_a? Hash
|
62
|
+
options = text
|
63
|
+
text = nil
|
64
|
+
end
|
65
|
+
|
56
66
|
super(options)
|
57
|
-
|
67
|
+
|
68
|
+
@text = text || options[:text] || "-No text specified-"
|
58
69
|
@font = options[:font] || @@font || default_font_name()
|
59
|
-
@height = options[:height] || options[:size] || @@size || 15
|
70
|
+
@height = @size = options[:height] || options[:size] || @@size || 15
|
71
|
+
@line_spacing = options[:line_spacing] || 1
|
72
|
+
@align = options[:align] || :left
|
73
|
+
@max_width = options[:max_width]
|
74
|
+
|
75
|
+
self.rotation_center(:top_left)
|
60
76
|
|
61
77
|
@gosu_font = Gosu::Font.new($window, @font, @height)
|
78
|
+
|
79
|
+
create_image unless @image
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# Set a new text, a new image is created.
|
84
|
+
#
|
85
|
+
def text=(text)
|
86
|
+
@text = text
|
87
|
+
create_image
|
62
88
|
end
|
63
89
|
|
64
|
-
def
|
65
|
-
@
|
90
|
+
def size
|
91
|
+
@height
|
66
92
|
end
|
67
93
|
|
68
94
|
#
|
@@ -71,7 +97,18 @@ module Chingu
|
|
71
97
|
def width
|
72
98
|
@gosu_font.text_width(@text, @factor_x)
|
73
99
|
end
|
74
|
-
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
#
|
104
|
+
# Create the actual image from text and parameters supplied.
|
105
|
+
#
|
106
|
+
def create_image
|
107
|
+
if @max_width
|
108
|
+
@image = Gosu::Image.from_text($window, @text, @font, @height, @line_spacing, @max_width, @align)
|
109
|
+
else
|
110
|
+
@image = Gosu::Image.from_text($window, @text, @font, @height)
|
111
|
+
end
|
112
|
+
end
|
75
113
|
end
|
76
|
-
|
77
114
|
end
|
data/lib/chingu/traits/timer.rb
CHANGED
@@ -40,30 +40,31 @@ module Chingu
|
|
40
40
|
# [start_time, end_time (or nil if one-shot), &block]
|
41
41
|
#
|
42
42
|
@_timers = Array.new
|
43
|
+
@_repeating_timers = Array.new
|
43
44
|
super
|
44
45
|
end
|
45
46
|
|
46
47
|
def during(time, &block)
|
47
|
-
ms = milliseconds()
|
48
|
+
ms = Gosu::milliseconds()
|
48
49
|
@_last_timer = [ms, ms + time, block]
|
49
50
|
@_timers << @_last_timer
|
50
51
|
self
|
51
52
|
end
|
52
53
|
|
53
54
|
def after(time, &block)
|
54
|
-
ms = milliseconds()
|
55
|
+
ms = Gosu::milliseconds()
|
55
56
|
@_last_timer = [ms + time, nil, block]
|
56
57
|
@_timers << @_last_timer
|
57
58
|
self
|
58
59
|
end
|
59
60
|
|
60
61
|
def between(start_time, end_time, &block)
|
61
|
-
ms = milliseconds()
|
62
|
+
ms = Gosu::milliseconds()
|
62
63
|
@_last_timer = [ms + start_time, ms + end_time, block]
|
63
64
|
@_timers << @_last_timer
|
64
65
|
self
|
65
66
|
end
|
66
|
-
|
67
|
+
|
67
68
|
def then(&block)
|
68
69
|
# ...use one-shots start_time for our trailing "then".
|
69
70
|
# ...use durable timers end_time for our trailing "then".
|
@@ -71,17 +72,29 @@ module Chingu
|
|
71
72
|
@_timers << [start_time, nil, block]
|
72
73
|
end
|
73
74
|
|
75
|
+
def every(delay, &block)
|
76
|
+
ms = Gosu::milliseconds()
|
77
|
+
@_repeating_timers << [ms + delay, delay, block]
|
78
|
+
end
|
79
|
+
|
74
80
|
def update_trait
|
75
|
-
ms = milliseconds()
|
81
|
+
ms = Gosu::milliseconds()
|
76
82
|
@_timers.each do |start_time, end_time, block|
|
77
|
-
if ms > start_time && (end_time == nil || ms < end_time)
|
78
|
-
|
83
|
+
block.call if ms > start_time && (end_time == nil || ms < end_time)
|
84
|
+
end
|
85
|
+
|
86
|
+
index = 0
|
87
|
+
@_repeating_timers.each do |start_time, delay, block|
|
88
|
+
if ms > start_time
|
89
|
+
block.call
|
90
|
+
@_repeating_timers[index] = [ms + delay, delay, block]
|
79
91
|
end
|
92
|
+
index += 1
|
80
93
|
end
|
81
94
|
|
82
95
|
# Remove one-shot timers (only a start_time, no end_time) and all timers which have expired
|
83
96
|
@_timers.reject! { |start_time, end_time, block| (ms > start_time && end_time == nil) || (end_time != nil && ms > end_time) }
|
84
|
-
|
97
|
+
|
85
98
|
super
|
86
99
|
end
|
87
100
|
|
data/lib/chingu/window.rb
CHANGED
@@ -46,11 +46,10 @@ module Chingu
|
|
46
46
|
$window = super(width, height, fullscreen, update_interval)
|
47
47
|
|
48
48
|
@root = File.dirname(File.expand_path($0))
|
49
|
-
Chingu::Asset.autoload_dirs = [".", File.join(@root, "
|
50
|
-
Gosu::Image.autoload_dirs = [".", File.join(@root, "gfx"), File.join(@root, "media")]
|
51
|
-
Gosu::Sample.autoload_dirs = [".", File.join(@root, "
|
52
|
-
Gosu::
|
53
|
-
Gosu::Song.autoload_dirs = [".", File.join(@root, "sfx"), File.join(@root, "media")]
|
49
|
+
Chingu::Asset.autoload_dirs = [".", File.join(@root, "assets"), File.join(@root, "media")]
|
50
|
+
Gosu::Image.autoload_dirs = [".", File.join(@root, "images"), File.join(@root, "gfx"), File.join(@root, "media")]
|
51
|
+
Gosu::Sample.autoload_dirs = [".", File.join(@root, "sounds"), File.join(@root, "sfx"), File.join(@root, "media")]
|
52
|
+
Gosu::Song.autoload_dirs = [".", File.join(@root, "songs"), File.join(@root, "sounds"), File.join(@root, "sfx"), File.join(@root, "media")]
|
54
53
|
|
55
54
|
@game_objects = GameObjectList.new
|
56
55
|
@input_clients = Array.new
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chingu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.8.
|
4
|
+
version: 0.5.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ippa
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
hxtMlw==
|
31
31
|
-----END CERTIFICATE-----
|
32
32
|
|
33
|
-
date: 2009-10-
|
33
|
+
date: 2009-10-22 00:00:00 +02:00
|
34
34
|
default_executable:
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- examples/example10.rb
|
77
77
|
- examples/example11.rb
|
78
78
|
- examples/example12.rb
|
79
|
+
- examples/example13.rb
|
79
80
|
- examples/example2.rb
|
80
81
|
- examples/example3.rb
|
81
82
|
- examples/example4.rb
|
@@ -85,6 +86,7 @@ files:
|
|
85
86
|
- examples/example8.rb
|
86
87
|
- examples/example9.rb
|
87
88
|
- examples/game1.rb
|
89
|
+
- examples/high_score_list.yml
|
88
90
|
- examples/media/Parallax-scroll-example-layer-0.png
|
89
91
|
- examples/media/Parallax-scroll-example-layer-1.png
|
90
92
|
- examples/media/Parallax-scroll-example-layer-2.png
|
@@ -131,7 +133,7 @@ files:
|
|
131
133
|
- lib/chingu/helpers/input_client.rb
|
132
134
|
- lib/chingu/helpers/input_dispatcher.rb
|
133
135
|
- lib/chingu/helpers/rotation_center.rb
|
134
|
-
- lib/chingu/
|
136
|
+
- lib/chingu/high_score_list.rb
|
135
137
|
- lib/chingu/inflector.rb
|
136
138
|
- lib/chingu/input.rb
|
137
139
|
- lib/chingu/named_resource.rb
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/chingu/high_score.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
#
|
3
|
-
# Chingu -- OpenGL accelerated 2D game framework for Ruby
|
4
|
-
# Copyright (C) 2009 ippa / ippa@rubylicio.us
|
5
|
-
#
|
6
|
-
# This library is free software; you can redistribute it and/or
|
7
|
-
# modify it under the terms of the GNU Lesser General Public
|
8
|
-
# License as published by the Free Software Foundation; either
|
9
|
-
# version 2.1 of the License, or (at your option) any later version.
|
10
|
-
#
|
11
|
-
# This library is distributed in the hope that it will be useful,
|
12
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
-
# Lesser General Public License for more details.
|
15
|
-
#
|
16
|
-
# You should have received a copy of the GNU Lesser General Public
|
17
|
-
# License along with this library; if not, write to the Free Software
|
18
|
-
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
-
#
|
20
|
-
#++
|
21
|
-
|
22
|
-
|
23
|
-
module Chingu
|
24
|
-
|
25
|
-
#
|
26
|
-
# Highscore-class
|
27
|
-
#
|
28
|
-
# - Keeps a local YAML file with highscores, default highscores.yml in root game dir.
|
29
|
-
# - Add, delete, clear highscores
|
30
|
-
# - Iterate through highscores with simple Highscore#each
|
31
|
-
#
|
32
|
-
class HighScore
|
33
|
-
def initialize(options = {})
|
34
|
-
@file = options[:file] || "high_scores.yml"
|
35
|
-
@high_scores = Array.new
|
36
|
-
|
37
|
-
#OpenStruct.new()
|
38
|
-
end
|
39
|
-
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
def add(name, score)
|
44
|
-
|
45
|
-
end
|
46
|
-
alias << add
|
47
|
-
|
48
|
-
def each
|
49
|
-
@highscores.each { |highscore| yield highscore }
|
50
|
-
end
|
51
|
-
|
52
|
-
def save
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.all
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|