Hi JP.
Let's figure it out.
I assume these are incomplete snippets of your actual code,
since the code as shown calls draw_rect with @x and @y set to nil,
throwing an 'undefined method '-' for nil:nilClass' exception because
you can't subtract anything from nil.)
I suspect you are seeing a blank window with nothing drawn,
because as written, your Player.draw will never get called.
Why? Because Chingu provides automated drawing and updating for all
its GameObjects, but only if you use GameObject.create instead of
GameObject.new.
(http://rdoc.info/projects/ippa/chingu)
Chingu::GameObject
Use this for all your in game
objects. The player, the enemies, the
bullets, the powerups, the loot
laying around. It’s very reusable and
doesn’t contain any game-logic
(that’s up to you!). Only stuff to put
it on screen a certain way. If you do
GameObject.create() instead of new()
Chingu will keep save the object in
the “game_object”-list for automatic
updates/draws.
Chingu::BasicGameObject
The new() vs create() behavior of
GameObject comes from BasicGameObject.
So we need to fix that. However...
Now that Player.draw is getting properly called every frame
by Chingu, we have find a new problem: the
call to draw_rect doesn't work! This is what Ruby tells me:
in draw_rect': undefined method
x' for [99, 101, 101, 101, 101, 99, 101, 101]:Array (NoMethodError)
Hmmm... I can see what is getting passed into the draw_rect method,
I wonder what it expects to receive? Let's look at the code.
(http://github.com/ippa/chingu/blob/master/lib/chingu/helpers/gfx.rb)
# Draws an unfilled rect in given color
#
def draw_rect(rect, color, zorder)
$window.draw_line(rect.x, rect.y, color, rect.right, rect.y, color, zorder)
$window.draw_line(rect.right, rect.y, color, rect.right, rect.bottom, color, zorder)
$window.draw_line(rect.right, rect.bottom, color, rect.x, rect.bottom, color, zorder)
$window.draw_line(rect.x, rect.bottom, color, rect.x, rect.y, color, zorder)
end
Ah, now it makes sense. draw_rect expects to be passed a Rectangle object, not
a bunch of coordinates. Here it is:
(http://rdoc.info/projects/ippa/chingu)
Chingu::Rect
Constructor Details
- (Rect) initialize(*argv)
Create a new Rect, attempting to extract its own information from the
given arguments.
The arguments must fall into one of these cases:
- 4 integers +(x, y, w, h)+.
- 1 Rect or Array containing 4 integers +([x, y, w, h])+.
- 2 Arrays containing 2 integers each +([x,y], [w,h])+.
- 1 object with a +rect+ attribute which is a valid Rect object.
All rect core attributes (x,y,w,h) must be integers.
So we just need to create a Rect object first, and then call
draw_rect with that Rect as the first parameter.
Okay, let's do that. Here's the working code --
require 'rubygems'
require 'chingu'
class Game < Chingu::Window
def initialize
super
puts "initializing player..."
@player = Player.create
end
end
class Player < Chingu::BasicGameObject
def initialize(options = {})
super
@x = 100
@y = 100
@rect = Chingu::Rect.new(@x, @y, 10, 10)
@c = Gosu::Color.new(0xffff0000)
end
def draw
puts "inside draw"
puts @x, @y
$window.draw_rect(@rect, @c, 1)
end
end
Game.new.show
Running it now shows a small red rectangle at 100,100.
Hope that helps.
c~