kawaii 0.1.0 → 0.1.1

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/.gitignore CHANGED
@@ -1,2 +1,6 @@
1
1
  # don't version gem files
2
2
  /*.gem
3
+
4
+ # don't version gem publish files
5
+ /vendor
6
+ /pkg
data/README.md CHANGED
@@ -1,42 +1,36 @@
1
1
  # Kawaii <3
2
2
 
3
- [Feature list and development progress](https://github.com/eriksk/kawaii/blob/master/backlog.md)
3
+ * [Change log](https://github.com/eriksk/kawaii/blob/master/changelog.md)
4
+ * [Feature list and development progress](https://github.com/eriksk/kawaii/blob/master/backlog.md)
4
5
 
5
6
  ## What is Kawaii?
6
7
  Kawaii is a tiny game library for ruby built on top of gosu. It makes it quick and easy to create 2D games.
7
8
 
8
9
  ## How do I use it?
9
- I will show this soon... in the mean time, this is what I'm aiming for.
10
+ To create a basic kawaii game, just install the gem
11
+
12
+ gem install kawaii
13
+
14
+ And then run the following command
10
15
 
11
- kawaii new MyAwesomeGame 800 600
16
+ kawaii new mysuperawesomefirstgame
12
17
 
13
- This will create a new game named "MyAwesomeGame" with a default resolution set to 800 x 600.
14
- To run the game just run the command:
15
-
16
- ruby my_awesome_game.rb
18
+ This will create a new basic game with a default resolution set to 800 x 600.
17
19
 
18
- This is NOT implemented yet though...
20
+ To change the configuration for the game simply edit the config.yml file that is created along with the game file. The config file itself is rather self-explanatory.
19
21
 
20
22
  ## Why does Kawaii exist?
21
23
  I wanted a way of quickly prototyping games for iPhone and iPad without Objective-C. Being pretty comfy with Ruby, I thought, why not!?
22
24
 
23
25
  ## Will this be distributed as a gem?
24
- Yes, sooner or later.
26
+ It is! Just run this command to install it!
27
+
28
+ gem install kawaii
25
29
 
26
30
  ## What kind of features will it have?
27
- Aside from being totally cute (hence the name) it will have:
28
- * Integrated physics with [chipmunk](https://github.com/beoran/chipmunk)
29
- * Content management
30
- * Sharing sprites with nodes
31
- * Tiling made easy
32
- * Animated sprites
33
- * Node management, a tree of nodes can be easily created and managed.
34
- * Menu system
35
- * Input management
36
- * Helper functions/math
37
- * Lots of tweenings & other juicyness
38
- * Tiled importer (<del>xml</del> & json)
39
- * Imports maps from Tiled and draws them
31
+ A lot! Check out the full list of implemented & to be implemented features
32
+
33
+ [Feature list and development progress](https://github.com/eriksk/kawaii/blob/master/backlog.md)
40
34
 
41
35
  ## Dependencies
42
36
  * [gosu '0.7.43'](https://github.com/jlnr/gosu)
data/backlog.md CHANGED
@@ -1,19 +1,17 @@
1
1
  # Kawaii backlog
2
2
 
3
3
  ## Next up
4
- * Camera
5
- * Animated entities/sprites
6
4
  * Audio
7
5
  * Tweenings & juice
8
- * Make a super cute awesome kawaii logo
9
- * gem commands
10
6
  * Platform example game
7
+ * Create a few video tutorials on how to use Kawaii
11
8
 
12
9
  ## Working on
13
- * <del>Physics integration w/ chipmunk</del> (paused, need more graphics to test)
14
- * Vectors/Math
10
+ * Physics integration with chipmunk
11
+ * Animated entities/sprites
15
12
 
16
13
  ## Completed
14
+ * Make a super cute awesome kawaii logo
17
15
  * Tiled importer
18
16
  * JSON importer
19
17
  * <del>XML importer</del> (removed, don't want more dependencies. Besides, json works just fine)
@@ -22,5 +20,10 @@
22
20
  * Entity management
23
21
  * Content manager
24
22
  * Scene management
23
+ * Default intro and better scene handling
25
24
  * Input
26
- * Tiled maps usage
25
+ * Tiled maps usage
26
+ * gem commands
27
+ * Camera
28
+ * Vectors/Math
29
+ * Config file
@@ -0,0 +1,18 @@
1
+ # Kawaii change log
2
+
3
+ ## 0.1.1
4
+ * New scripts for creating basic game
5
+ * Minor bug fixes
6
+ * Configuration file added when generating game
7
+ * Scene manager now handles the entire flow of games
8
+ * Scene now contains all managers:
9
+ * Node manager
10
+ * Input manager
11
+ * Content manager
12
+ * TmxTileMap
13
+ * TmxTileMaps now automatically load textures based on what's specified in Tiled.
14
+ * Super awesome logo
15
+ * Splash screen (can easily be removed)
16
+
17
+ ## 0.1.0
18
+ * First release
@@ -17,6 +17,8 @@ require_relative 'kawaii/constants'
17
17
  require_relative 'kawaii/scene_manager'
18
18
  require_relative 'kawaii/scene'
19
19
  require_relative 'kawaii/helpers'
20
+ require_relative 'kawaii/camera'
21
+ require_relative 'kawaii/intro'
20
22
 
21
23
  module Kawaii
22
24
  end
@@ -0,0 +1,24 @@
1
+ module Kawaii
2
+ class Camera
3
+
4
+ def initialize game
5
+ @game = game
6
+ @pos = Vector2.new
7
+ @origin = Vector2.new(@game.width / 2, @game.height / 2)
8
+ @destination = Vector2.new
9
+ @speed = 0.05
10
+ end
11
+
12
+ def move x, y
13
+ @destination.x, @destination.y = x - @origin.x, y - @origin.y
14
+ @pos.x = Kawaii::lerp(@pos.x, @destination.x, @speed)
15
+ @pos.y = Kawaii::lerp(@pos.y, @destination.y, @speed)
16
+ end
17
+
18
+ def translate(&block)
19
+ @game.translate(@pos.x, @pos.y) do
20
+ block.call()
21
+ end
22
+ end
23
+ end
24
+ end
@@ -34,53 +34,53 @@ module Kawaii
34
34
 
35
35
  private
36
36
  def self.new_game_template args
37
- width = 800
38
- height = 600
39
- fullscreen = false
40
37
  game_class_name = args.first.capitalize
41
38
  File.open(args.first + ".rb", "w+") do |f|
42
39
  f.write <<-EOF
43
40
  require 'kawaii'
44
41
 
45
- class #{game_class_name} < Kawaii::Game
46
-
47
- WIDTH = #{width}
48
- HEIGHT = #{height}
49
- FULLSCREEN = #{fullscreen}
50
- CONTENT_ROOT = "content"
51
-
52
- def initialize
53
- super WIDTH, HEIGHT, FULLSCREEN, CONTENT_ROOT
54
- load_game
55
- end
56
-
57
- def load_game
58
- # TODO: load code goes here
59
- end
42
+ module #{game_class_name}
43
+ class Game < Kawaii::Game
44
+
45
+ def initialize
46
+ super
47
+ load_game
48
+ end
49
+
50
+ def load_game
51
+ # TODO: create and load a scene
52
+ # example:
53
+ # @scene_manager.on_scene_activated lambda {
54
+ # @scene_manager.push_scene(MySceneClass.new(@scene_manager))
55
+ # }
56
+ end
60
57
 
61
- def input
62
- # TODO: input goes here
63
- if button_down?Gosu::KbEscape
64
- exit
65
- end
66
- end
67
-
68
- def before_update
69
- # TODO: game logic goes here
70
- input
71
- end
72
-
73
- def after_update
74
- # TODO: game logic goes here
75
- end
58
+ def before_update
59
+ # allows the game to exit
60
+ exit() if button_down?(Gosu::KbEscape)
61
+ end
62
+ end
76
63
  end
77
64
 
78
65
  # entry point
79
- game = #{game_class_name}.new
66
+ game = #{game_class_name}::Game.new
80
67
  game.show
81
68
  EOF
82
69
  end
83
70
 
71
+ # write config file
72
+ File.open("config.yml", "w+") do |f|
73
+ f.write <<-EOF
74
+ # kawaii configuration
75
+ resolution:
76
+ width: 800
77
+ height: 600
78
+ fullscreen: false
79
+ content_root: content
80
+ debug: true
81
+ EOF
82
+ end
83
+
84
84
  puts "Successfully created new game '#{game_class_name}'".green
85
85
  puts "Run it with the command: " + "ruby #{args.first}.rb".yellow
86
86
  end
@@ -1,62 +1,46 @@
1
1
  require 'gosu'
2
+ require 'yaml'
2
3
 
3
4
  module Kawaii
4
5
  class Game < Gosu::Window
5
6
 
6
- attr_accessor :width, :height, :fullscreen, :show_fps, :font, :node_manager, :content_manager, :physics_manager
7
-
8
- def initialize width = 800, height = 600, fullscreen = false, content_root = "content", debug = true
9
- super width, height, fullscreen
10
- @width, @height, @fullscreen = width, height, fullscreen
7
+ CONFIG_PATH = File.expand_path(".") +'/config.yml'
8
+ CONFIG = YAML.load_file(CONFIG_PATH) if File.exist?(CONFIG_PATH)
9
+
10
+ attr_accessor :width, :height, :fullscreen, :show_fps, :font, :content_root
11
+
12
+ def initialize
13
+ super CONFIG['resolution']['width'], CONFIG['resolution']['height'], CONFIG['fullscreen']
14
+ @width, @height, @fullscreen = CONFIG['resolution']['width'], CONFIG['resolution']['height'], CONFIG['fullscreen']
15
+ @content_root = CONFIG['content_root']
11
16
 
12
- # managers
13
- @node_manager = Kawaii::NodeManager.new
14
- @content_manager = Kawaii::ContentManager.new(self, content_root)
15
- @audio_manager = Kawaii::AudioManager.new(self)
16
- @input_manager = Kawaii::InputManager.new(self)
17
- @physics_manager = Kawaii::PhysicsManager.new
17
+ @scene_manager = Kawaii::SceneManager.new(self)
18
+ # load intro scene
19
+ @scene_manager.push_scene Kawaii::Intro.new @scene_manager
18
20
 
19
21
  # stats
20
22
  @top_color = Gosu::Color.new(0xFF1EB1FA)
21
23
  @bottom_color = Gosu::Color.new(0xFF1D4DB5)
22
24
  @font = Gosu::Font.new(self, Gosu::default_font_name, 18)
23
- @debug = debug
25
+ @debug = CONFIG['debug']
24
26
 
25
27
  if @debug
26
28
  puts "Game settings:"
27
29
  puts "\tResolution: #{width}:#{height}"
28
30
  puts "\tFullscreen: #{fullscreen}"
29
31
  puts "\tContent root: #{content_root}"
30
- print_stats
31
32
  end
32
33
  end
33
-
34
- def add_child node
35
- @node_manager.nodes.push node
36
- end
37
-
38
- def remove_child node
39
- @node_manager.nodes.delete node
34
+
35
+ def update
36
+ before_update()
37
+ @dt = delta()
38
+ @scene_manager.update @dt
40
39
  end
41
40
 
42
- def print_stats
43
- puts "Statistics:"
44
- puts "Nodes: #{node_manager.count}"
41
+ def before_update
45
42
  end
46
-
47
- def update
48
- if self.class.method_defined? :before_update
49
- before_update
50
- end
51
-
52
- @dt = delta()
53
- @node_manager.update @dt
54
43
 
55
- if self.class.method_defined? :after_update
56
- after_update
57
- end
58
- end
59
-
60
44
  def delta
61
45
  16.0 # TODO: real delta
62
46
  end
@@ -65,12 +49,6 @@ module Kawaii
65
49
  1000.0 / delta
66
50
  end
67
51
 
68
- def before_draw
69
- end
70
-
71
- def after_draw
72
- end
73
-
74
52
  def draw
75
53
  draw_quad(
76
54
  0, 0, @top_color,
@@ -78,12 +56,10 @@ module Kawaii
78
56
  @width, @height, @bottom_color,
79
57
  0, @height, @bottom_color,
80
58
  )
81
- before_draw
82
- @node_manager.draw
59
+ @scene_manager.draw
83
60
  if @debug
84
- @font.draw("FPS: #{get_fps}", 14, 14, 0)
61
+ @font.draw("FPS: #{get_fps}", 14, 14, 0)
85
62
  end
86
- after_draw
87
63
  end
88
64
  end
89
65
  end
@@ -12,6 +12,10 @@ module Kawaii
12
12
  @old_mouse_y = 0.0
13
13
  end
14
14
 
15
+ def bind buttons = []
16
+ @bound_buttons = buttons
17
+ end
18
+
15
19
  def update
16
20
  @buttons.clear
17
21
  @bound_buttons.each do |btn|
@@ -1,4 +1,47 @@
1
1
  module Kawaii
2
- class Intro
2
+ class Intro < Scene
3
+
4
+ def load
5
+ @logo = Gosu::Image.new(game(), File.dirname(__FILE__) + '/logo.png', false)
6
+ @rotation = 0
7
+ @position = Vector2.new(game().width / 2, game().height / 2)
8
+ @scale = 1
9
+ @transition_duration = 2500
10
+ @color = Gosu::Color::WHITE
11
+ @color.alpha = 0
12
+ end
13
+
14
+ def transition_in current, duration
15
+ fake_duration = 750
16
+ dead_zone = 1200
17
+ if current <= fake_duration
18
+ @rotation = Kawaii::clerp(0, (360 * 2) - 145, current / (fake_duration * 0.7))
19
+ @scale = Kawaii::clerp(0.1, 1.0, current / (fake_duration * 0.8))
20
+ elsif current <= dead_zone
21
+ else
22
+ @rotation = Kawaii::clerp(@rotation, 0, (current - dead_zone) / ((duration - dead_zone) * 1.4))
23
+ @scale = Kawaii::clerp(@scale, 0, (current - dead_zone) / ((duration - dead_zone) * 1.4))
24
+ @position.x = Kawaii::clerp(game().width / 2, game().width + 400, (current - dead_zone) / ((duration - dead_zone) * 1.3))
25
+ @position.y += 5
26
+ @color.alpha = Kawaii::clerp(0, 255, (current - dead_zone) / ((duration - dead_zone)))
27
+ end
28
+ end
29
+
30
+ def transition_out current, duration
31
+ end
32
+
33
+ def update dt
34
+ end
35
+
36
+ def draw
37
+ @logo.draw_rot(@position.x, @position.y, 0, @rotation, 0.5, 0.5, @scale, @scale)
38
+
39
+ game.draw_quad(
40
+ 0, 0, @color,
41
+ game.width, 0, @color,
42
+ game.width, game.height, @color,
43
+ 0, game.height, @color,
44
+ )
45
+ end
3
46
  end
4
47
  end
Binary file
@@ -1,9 +1,39 @@
1
1
  module Kawaii
2
2
  class Scene
3
- attr_accessor :name, :scene_manager
3
+ attr_accessor :name, :scene_manager, :transition_duration
4
4
 
5
5
  def initialize scene_manager
6
6
  @scene_manager = scene_manager
7
+
8
+ # managers
9
+ @node_manager = Kawaii::NodeManager.new
10
+ @content = Kawaii::ContentManager.new(scene_manager.game, scene_manager.game.content_root)
11
+ @audio = Kawaii::AudioManager.new(scene_manager.game)
12
+ @input = Kawaii::InputManager.new(scene_manager.game)
13
+ @physics = Kawaii::PhysicsManager.new
14
+
15
+ # cam
16
+ @cam = Kawaii::Camera.new(scene_manager.game)
17
+
18
+ # set default duration
19
+ @transition_duration = SCENE_TRANSITION_DURATION
20
+
21
+ load()
22
+ end
23
+
24
+ def add_child node
25
+ @node_manager.nodes.push node
26
+ end
27
+
28
+ def remove_child node
29
+ @node_manager.nodes.delete node
30
+ end
31
+
32
+ def load
33
+ end
34
+
35
+ def game
36
+ @scene_manager.game
7
37
  end
8
38
 
9
39
  def transition_in current, duration
@@ -13,9 +43,31 @@ module Kawaii
13
43
  end
14
44
 
15
45
  def update dt
46
+ @input.update
47
+ before_update()
48
+ @node_manager.update dt
49
+ after_update()
16
50
  end
17
51
 
18
- def draw
52
+ def before_update
53
+ end
54
+ def after_update
19
55
  end
56
+ def before_draw
57
+ end
58
+ def draw_hud
59
+ end
60
+ def after_draw
61
+ end
62
+
63
+ def draw
64
+ @cam.translate do
65
+ before_draw
66
+ @node_manager.draw
67
+ after_draw
68
+ end
69
+
70
+ draw_hud
71
+ end
20
72
  end
21
73
  end
@@ -1,34 +1,58 @@
1
1
  module Kawaii
2
2
  class SceneManager
3
- attr_accessor :scene
3
+ attr_accessor :game, :scene
4
4
 
5
- def initialize scene = nil
5
+ def initialize game, scene = nil
6
+ @game = game
6
7
  @scene = scene
7
8
  @old_scene = nil
8
9
  @current_transition = 0.0
9
10
  @state = :none
10
11
  @state = :transition if @scene != nil
12
+ @on_scene_activated = []
11
13
  end
12
14
 
15
+ # switches to a new scene and loads it
13
16
  def push_scene scene
14
17
  @old_scene = @scene
15
18
  @scene = scene
19
+ @scene.load
20
+ @current_transition = 0.0
21
+ @state = :transition
22
+ end
23
+
24
+ # removes the current scene
25
+ def pop_scene
26
+ @state = :none
27
+ @old_scene = nil
28
+ @scene = nil
29
+ end
30
+
31
+ def on_scene_activated(lmbda)
32
+ @on_scene_activated << lmbda
16
33
  end
17
34
 
18
35
  def update dt
19
36
  case @state
20
37
  when :none
38
+ @scene.update dt
21
39
  when :transition
22
40
  if @scene != nil
23
- @scene.transition_in @current_transition, SCENE_TRANSITION_DURATION
41
+ @scene.transition_in @current_transition, @scene.transition_duration
24
42
  end
25
43
  if @old_scene != nil
26
- @old_scene.transition_out @current_transition, SCENE_TRANSITION_DURATION
44
+ @old_scene.transition_out @current_transition, @old_scene.transition_duration
27
45
  end
28
46
 
29
47
  @current_transition += dt
30
- if @current_transition > SCENE_TRANSITION_DURATION
48
+ if @current_transition > @scene.transition_duration
31
49
  @state = :transition_done
50
+ @current_transition = 0.0
51
+ @on_scene_activated.each do |l|
52
+ l.call()
53
+ end
54
+ # remove jobs
55
+ @on_scene_activated.clear
32
56
  end
33
57
  when :transition_done
34
58
  @current_transition = 0.0
@@ -8,6 +8,7 @@ module Kawaii
8
8
  def initialize
9
9
  @layers = []
10
10
  @properties = {}
11
+ @tilesets = []
11
12
  end
12
13
 
13
14
  def draw
@@ -20,7 +21,7 @@ module Kawaii
20
21
  if path.end_with? ".json"
21
22
  load_json path
22
23
  @layers.each do |layer|
23
- layer.textures = content_manager.load_tiled_images("gfx/map1.png", 32)
24
+ layer.textures = content_manager.load_tiled_images(@tilesets.first.gsub(/\.\.\//, ""), 32)
24
25
  end
25
26
  else
26
27
  raise UnsupportedFormatError, "only json is supported"
@@ -46,7 +47,7 @@ module Kawaii
46
47
  end
47
48
  end
48
49
 
49
- private
50
+ protected
50
51
  def load_json path
51
52
  File.open(path) do |f|
52
53
  populate JSON.parse(f.read)
@@ -65,6 +66,9 @@ module Kawaii
65
66
  hash['properties'].each do |property|
66
67
  @properties[property['key']] = property['value']
67
68
  end
69
+ hash['tilesets'].each do|tileset|
70
+ @tilesets.push tileset['image']
71
+ end
68
72
  end
69
73
  end
70
74
  end
@@ -1,3 +1,3 @@
1
1
  module Kawaii
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -21,10 +21,13 @@ module Kawaii
21
21
  it "should contain properties" do
22
22
  @tile_map.should respond_to :properties
23
23
  end
24
+ it "should contain tilesets" do
25
+ @tile_map.should respond_to :tilesets
26
+ end
24
27
 
25
28
  describe "#load" do
26
29
  it "should be able to load a tmx.json file" do
27
- @tile_map.load('/Users/ILab/Documents/ruby/kawaii/spec/kawaii/content/maps/test_map.json')
30
+ @tile_map.load('content/maps/test_map.json')
28
31
  @tile_map.width.should == 32
29
32
  @tile_map.height.should == 32
30
33
  @tile_map.layers.size.should be(1)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kawaii
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-07-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: gosu
16
- requirement: &70144030207060 !ruby/object:Gem::Requirement
16
+ requirement: &70350239722340 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.7.43
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70144030207060
24
+ version_requirements: *70350239722340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: chipmunk
27
- requirement: &70144030206460 !ruby/object:Gem::Requirement
27
+ requirement: &70350239721740 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 5.3.4.5
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70144030206460
35
+ version_requirements: *70350239721740
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70144030206060 !ruby/object:Gem::Requirement
38
+ requirement: &70350239721180 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70144030206060
46
+ version_requirements: *70350239721180
47
47
  description: kawaii provides a tiny game library that extends gosu
48
48
  email: erikskoglund88@gmail.com
49
49
  executables:
@@ -64,6 +64,7 @@ files:
64
64
  - Rakefile
65
65
  - backlog.md
66
66
  - bin/kawaii
67
+ - changelog.md
67
68
  - doc/Kawaii.html
68
69
  - doc/Kawaii/Animation.html
69
70
  - doc/Kawaii/AudioManager.html
@@ -101,6 +102,7 @@ files:
101
102
  - lib/kawaii.rb
102
103
  - lib/kawaii/animation.rb
103
104
  - lib/kawaii/audio_manager.rb
105
+ - lib/kawaii/camera.rb
104
106
  - lib/kawaii/command.rb
105
107
  - lib/kawaii/constants.rb
106
108
  - lib/kawaii/content_manager.rb
@@ -110,6 +112,7 @@ files:
110
112
  - lib/kawaii/helpers.rb
111
113
  - lib/kawaii/input_manager.rb
112
114
  - lib/kawaii/intro.rb
115
+ - lib/kawaii/logo.png
113
116
  - lib/kawaii/math.rb
114
117
  - lib/kawaii/node.rb
115
118
  - lib/kawaii/node_manager.rb