Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 24, 2010 21:33:23

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

А как ее вернуть? Все что я вижу в питоне - это класс NPC, а мне нужен определенный экземпляр, при чем питон вызывается из самого этого экземпляра.



Отредактировано (Фев. 24, 2010 21:36:04)

Офлайн

#2 Фев. 26, 2010 20:08:33

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Расширение встроенного питона с помощью Boost

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++ объекта.

Но это - не самый удачный способ.



Офлайн

#3 Фев. 27, 2010 20:20:32

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

Не получается вызвать NPC_Class::from_this(this), компилятор говорит, что ‘NPC_Class’ is not a class or namespace.



Офлайн

#4 Март 1, 2010 15:54:21

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Расширение встроенного питона с помощью Boost

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 у вас сцена, а в ней объекты. Главный цикл, события - все очень похоже.



Офлайн

#5 Март 1, 2010 16:45:34

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

Я вроде так и делал.. вот кусок целиком

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

Даже если это похой вариант, думаю, со временем я к этому выводу сам приду и что-нибудь придумаю ))



Отредактировано (Март 1, 2010 16:48:02)

Офлайн

#6 Март 1, 2010 19:06:09

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Расширение встроенного питона с помощью Boost

ааа. Так from_this нужно еще самому написать - я имел в виду что-то, что берет С++ указатель и возвращает готовый python объект.
Здесь возникают неприятные проблемы с временем жизни объекта - но в простейшем случае что-то вроде
locals = bp::ptr(this);
должно помочь.



Офлайн

#7 Март 2, 2010 01:14:12

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

Кое что получилось

NPC* NPC::self(){
return this;
// return bp::ptr(this) // тоже пробовал
}
...
void NPC::step(){
...
locals["self"] = self();
...
}
Если сделать setHP в С++, то в питоне getHP выдает то что надо, а наоборот не работает.
А зачем создавать bp::class_<NPC> NPC_Class?



Офлайн

#8 Март 3, 2010 02:20:19

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Расширение встроенного питона с помощью Boost

А вы проверьте - кажется, у вас locals = self(); сделает копирование. NPC_Class - сейчас не нужен.



Офлайн

#9 Март 3, 2010 15:03:33

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширение встроенного питона с помощью Boost

А как это узнать? Я же вроде ссылку передаю.
В секции BOOST_PYTHON_MODULE(NPC){…} мне не надо добавлять классу NPC мой метод self()?



Офлайн

#10 Март 5, 2010 12:30:05

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Расширение встроенного питона с помощью Boost

bp::object NPC::self(){
return bp::ptr(this);
}



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version