Давайте разберемся.
Я предполагаю, что это неполные фрагменты вашего фактического кода, поскольку показанный код вызывает draw_rect с @x и @y, установленными на nil, выдавая исключение «неопределенный метод» для nil: nilClass, потому что вы не можете ничего вычесть из ноль.)
Я подозреваю, что вы видите пустое окно, в котором ничего не нарисовано, потому что, как написано, ваш Player.draw никогда не будет вызван.
Почему? Потому что Chingu обеспечивает автоматическое рисование и обновление для всех своих GameObjects, но только если вы используете GameObject.create вместо GameObject.new.
(http://rdoc.info/projects/ippa/chingu)
Чингу::GameObject
Используйте это для всех ваших игровых объектов. Игрок, враги, пули, бонусы, добыча, валяющаяся вокруг. Он очень многоразовый и не содержит никакой игровой логики (это на ваше усмотрение!). Только вещи, чтобы поместить это на экране определенным образом. Если вы используете GameObject.create() вместо new(), Chingu сохранит объект в списке «game_object» для автоматического обновления/отрисовки.
Чингу:: BasicGameObject
Поведение GameObject по сравнению с new() и create() исходит из BasicGameObject.
Так что нам нужно это исправить. Однако...
Теперь, когда Чингу правильно вызывает Player.draw в каждом кадре, мы обнаружили новую проблему: вызов draw_rect не работает! Вот что говорит мне Руби:
в draw_rect': undefined method
x' для [99, 101, 101, 101, 101, 99, 101, 101]: Массив (NoMethodError)
Хммм... Я вижу, что передается в метод draw_rect, интересно, что он ожидает получить? Давайте посмотрим на код.
(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
А, теперь это имеет смысл. draw_rect ожидает, что будет передан объект Rectangle, а не набор координат. Вот:
(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.
Итак, нам просто нужно сначала создать объект Rect, а затем вызвать draw_rect с этим Rect в качестве первого параметра.
Хорошо, давайте сделаем это. Вот рабочий код -
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
Запуск теперь показывает маленький красный прямоугольник на 100 100.
Надеюсь, это поможет.
c~
person
cl3i
schedule
29.07.2010