On 12/12/05, Joe Van Dyk <joevandyk / gmail.com> wrote:
> On 12/12/05, Joe Van Dyk <joevandyk / gmail.com> wrote:
> > (I've already looked at Swig, btw.  I'd like to do this one by hand.)
> >
> > I have the following:
> >
> > typedef struct {
> >   double x;
> >   double y;
> >   double z;
> > } VelocityRecord;
> >
> > typedef struct {
> >   double x;
> >   double y;
> >   double z;
> > } PositionRecord;
> >
> > typedef struct {
> >   int id;
> >   int type;
> >   PositionRecord position;
> >   VelocityRecord velocity;
> > } Player;
> >
> > Player Players[10];
> >
> >
> > The number of Players is fixed ahead of time.  I want to be able to
> > access that data from Ruby.  Ideally, something like:
> >
> > module Simulation
> >     attr_accessor :players  # Other stuff will be here
> >     class Player
> >         class VelocityRecord
> >             attr_accessor :x, :y :z
> >         end
> >         class PositionRecord
> >           attr_accessor :x, :y, :z
> >         end
> >     end
> > end
>
> Hm, on second thought, it's probably a lot easier to do:
>
> class Player
>   attr_reader :x_position, :y_position, :z_position, :x_velocity,
> :y_velocity, :z_velocity
> end
>
> So, maybe something like this?
>
> void Init_Simulation()
> {
>   rb_define_module(mSimulation, "Simulation");
>   rb_define_class_under(cPlayer, "Player");
>
>   rb_define_method(cPlayer, "x_position", get_x_position, 0);
>   rb_define_method(cPlayer, "y_position", get_y_position, 0);
>   rb_define_method(cPlayer, "z_position", get_z_position, 0);
>   rb_define_method(cPlayer, "x_velocity", get_x_velocity, 0);
>   rb_define_method(cPlayer, "y_velocity", get_y_velocity, 0);
>   rb_define_method(cPlayer, "z_velocity", get_z_velocity, 0);
> }

So, I have a bunch of functions that look like this now:

VALUE get_player_x_pos(VALUE self)
{
  Player* p;
  Data_Get_Struct(self, Player, p);
   rb_float_new(p->position.x);
}

That the way to go?