[C++-sig] Derived classes problem
hessiess at hessiess.com
hessiess at hessiess.com
Fri May 29 18:56:37 CEST 2009
I am trying to create a python wrapper for the quad-ren graphics
engine, which relies heavily on derived classes. The problem is
that I cannot create derived classes in python and pass them
to the C++ objects without getting the following error:
Traceback (most recent call last):
File "test.py", line 79, in <module>
quad3.set_event_receiver(event)
Boost.Python.ArgumentError: Python argument types in
qr_scene_node.set_event_receiver(qr_quad, ev_receiver)
did not match C++ signature:
set_event_receiver(qr_scene_node {lvalue}, qr_event_receiver*)
====================================================================
C++
====================================================================
#include <boost/python.hpp>
#include <quad-ren/quad-ren.h>
using namespace boost::python;
struct qr_scene_node_w : qr_scene_node, wrapper<qr_scene_node>
{
void on_register()
{
this->get_override("on_register")();
}
void on_render()
{
this->get_override("on_render")();
}
void on_drop()
{
this->get_override("on_drop")();
}
};
struct qr_event_receiver_w : qr_event_receiver, wrapper<qr_event_receiver>
{
bool on_event(qr_event *event, qr_scene_node *node, float time_delta)
{
this->get_override("on_event")();
}
};
BOOST_PYTHON_MODULE(qrpy)
{
class_<vector2d_i>("vector2d_i")
.def(init<float, float>())
.def_readwrite("X", &vector2d_i::X)
.def_readwrite("Y", &vector2d_i::Y);
class_<vector2d_f>("vector2d_f")
.def(init<float, float>())
.def_readwrite("X", &vector2d_f::X)
.def_readwrite("Y", &vector2d_f::Y);
class_<qr_resource_manager>("qr_resource_manager");
class_<qr_renderer>("qr_renderer")
.def(init<vector2d_i, float, bool, vector2d_i>())
.def("get_resource_manager", &qr_renderer::get_resource_manager,
return_value_policy<reference_existing_object>())
.def("run", &qr_renderer::run)
.def("drop", &qr_renderer::drop)
.def("set_total_layers", &qr_renderer::set_total_layers)
.def("set_window_title", &qr_renderer::set_window_title)
.def("get_time_delta", &qr_renderer::get_time_delta)
.def("get_ticks", &qr_renderer::get_ticks)
.def("get_fps", &qr_renderer::get_fps)
.def("set_camera_location", &qr_renderer::set_camera_location)
.def("get_camera_location", &qr_renderer::get_camera_location)
.def("get_pix_size", &qr_renderer::get_pix_size)
.def("set_bg_sprite", &qr_renderer::set_bg_sprite)
.def("get_bg_sprite", &qr_renderer::get_bg_sprite,
return_value_policy<reference_existing_object>());
class_<qr_scene_node_w, boost::noncopyable>("qr_scene_node", no_init)
.def("register_node", &qr_scene_node_w::register_node)
.def("drop", &qr_scene_node_w::drop)
.def("set_location", &qr_scene_node_w::set_location)
.def("get_location", &qr_scene_node_w::get_location)
.def("set_size", &qr_scene_node_w::set_size)
.def("get_size", &qr_scene_node_w::get_size)
.def("set_rotation", &qr_scene_node_w::set_rotation)
.def("get_rotation", &qr_scene_node_w::get_rotation)
.def("set_layer", &qr_scene_node_w::set_layer)
.def("get_layer", &qr_scene_node_w::get_layer)
.def("set_sprite", &qr_scene_node_w::set_sprite)
.def("get_sprite", &qr_scene_node_w::get_sprite,
return_value_policy<reference_existing_object>())
.def("set_event_receiver", &qr_scene_node_w::set_event_receiver)
.def("get_event_receiver", &qr_scene_node_w::get_event_receiver,
return_value_policy<reference_existing_object>())
.def("set_frame", &qr_scene_node_w::set_frame)
.def("get_frame", &qr_scene_node_w::get_frame)
.def("add_polygon", &qr_scene_node_w::add_polygon)
.def("clear_mesh", &qr_scene_node_w::clear_mesh)
.def("on_register", &qr_scene_node_w::on_register)
.def("on_render", &qr_scene_node_w::on_render)
.def("on_drop", &qr_scene_node_w::on_drop);
class_<qr_event_receiver_w, boost::noncopyable>("qr_event_receiver",
no_init)
.def("on_event", &qr_event_receiver_w::on_event);
class_<qr_quad, bases<qr_scene_node> >("qr_quad")
.def(init<qr_resource_manager* , bool>());
}
====================================================================
Python
====================================================================
import qrpy
false = bool(0)
true = bool(1)
#create renderer + get resource manager
renderer = qrpy.qr_renderer(qrpy.vector2d_i(4, 3),
10, false, qrpy.vector2d_i(0, 0))
res_man = renderer.get_resource_manager()
#event receiver
class ev_receiver(qrpy.qr_event_receiver):
def __init__(self):
return
def on_event(self, event, node, time_delta):
print event
event = ev_receiver()
quad = qrpy.qr_quad(res_man, 0)
quad.set_event_receiver(event) #error
More information about the Cplusplus-sig
mailing list