Найти - Пользователи
Полная версия: Расширение встроенного питона с помощью Boost
Начало » Python для экспертов » Расширение встроенного питона с помощью Boost
1 2 3
pasaranax
А как ее вернуть? Все что я вижу в питоне - это класс NPC, а мне нужен определенный экземпляр, при чем питон вызывается из самого этого экземпляра.
Андрей Светлов
class NPC{
public:
void move(int x, int y, int z);
void runAI();
};
...
void NPC::runAI(){
...
dict globals, locals;
locals["self"] = NPC_Class::from_this(this);
exec("self.move(1,2,3)", globals, locals);
}

wolf = NPC();
wolf.runAI();
//и после этого волк перемещается в (1,2,3)
NPC_Class - обертка. class_<NPC> NPC_Class = class<NPC>(“NPC”)….;
from_this - static method, возвращающий обертку из C++ объекта.

Но это - не самый удачный способ.
pasaranax
Не получается вызвать NPC_Class::from_this(this), компилятор говорит, что ‘NPC_Class’ is not a class or namespace.
Андрей Светлов
class_<A> A_class;

BOOST_PYTHON_MODULE("module"){
A_class = class_<A>("A")
.def("setA()", &A::setA);
}
Но, повторяюсь, это - неправильно.
Думайте о том, что пишете еще одну python обертку для GUI библиотеки (Qt или там wxWidgets).
Вы обернете все интересующие классы в Python, добавите им методов/свойств. Потом начнете строить интерфейс на Питоне. И обработчики будете привязывать на нем же - вместо жесткого кодирования on mouse left button click для каждого элемента.

То же самое и для игрушки - только вместо GUI у вас сцена, а в ней объекты. Главный цикл, события - все очень похоже.
pasaranax
Я вроде так и делал.. вот кусок целиком
namespace bp = boost::python;
bp::class_<NPC> NPC_Class;
BOOST_PYTHON_MODULE(NPC){
NPC_Class = bp::class_<NPC>("NPC")
.def("getHP", &NPC::getHP)
.def("setHP", &NPC::setHP);
}

void NPC::initPython(){ // это вызывается в конструкторе
Py_Initialize();
initNPC();
}

void NPC::step(){
try{
bp::dict globals, locals;
locals["self"] = NPC_Class::from_this(this); // NPC.cpp:89: ошибка: ‘NPC_Class’ is not a class or namespace
bp::exec("print 'hello python'\n"
"print self.getHP()\n",
globals, locals);
}
catch(bp::error_already_set const &){
PyErr_Print();
}
}
потом я делаю для теста вот так
NPC npc;
npc.setHP(50);
npc.step();
он должен вывести число 50

Даже если это похой вариант, думаю, со временем я к этому выводу сам приду и что-нибудь придумаю ))
Андрей Светлов
ааа. Так from_this нужно еще самому написать - я имел в виду что-то, что берет С++ указатель и возвращает готовый python объект.
Здесь возникают неприятные проблемы с временем жизни объекта - но в простейшем случае что-то вроде
locals = bp::ptr(this);
должно помочь.
pasaranax
Кое что получилось
NPC* NPC::self(){
return this;
// return bp::ptr(this) // тоже пробовал
}
...
void NPC::step(){
...
locals["self"] = self();
...
}
Если сделать setHP в С++, то в питоне getHP выдает то что надо, а наоборот не работает.
А зачем создавать bp::class_<NPC> NPC_Class?
Андрей Светлов
А вы проверьте - кажется, у вас locals = self(); сделает копирование. NPC_Class - сейчас не нужен.
pasaranax
А как это узнать? Я же вроде ссылку передаю.
В секции BOOST_PYTHON_MODULE(NPC){…} мне не надо добавлять классу NPC мой метод self()?
Андрей Светлов
bp::object NPC::self(){
return bp::ptr(this);
}
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB