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
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
#include
using namespace boost::python;
struct qr_scene_node_w : qr_scene_node, wrapper
{
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
{
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")
.def(init())
.def_readwrite("X", &vector2d_i::X)
.def_readwrite("Y", &vector2d_i::Y);
class_("vector2d_f")
.def(init())
.def_readwrite("X", &vector2d_f::X)
.def_readwrite("Y", &vector2d_f::Y);
class_("qr_resource_manager");
class_("qr_renderer")
.def(init())
.def("get_resource_manager", &qr_renderer::get_resource_manager,
return_value_policy())
.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());
class_("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())
.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())
.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",
no_init)
.def("on_event", &qr_event_receiver_w::on_event);
class_ >("qr_quad")
.def(init());
}
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
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig