Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: [решено] python: Существует ли такой приём?  (Прочитано 1504 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн amdlintuxos

  • Автор темы
  • Любитель
  • *
  • Сообщений: 86
    • Просмотр профиля
Идея собственно такая:
Игра(game loop, поэтому и стоит вопрос оптимизации), класс обьёкта включает в себя метод рендера. Кoнструктор класса принимает либо картинку одну либо лист из картинок. Соответственно методы рендера для обоих видов будут различны. Мне бы хотелось чтобы конструктор класса на этапе вызова  каким то образом указывал однозначно что в методе render() будет использован соответствующий метод рендера (либо renderDynamic, когда картинок много или renderStatic, когда картинка одна),

В текущий момент я исползую данную схему (она работает)

class Obj():
    def  __int__(self, Тех):
           if type(Tex).__name__ == 'list':  
              self.anim = True
           else:
             self.anim = False

    def renderStatic(self):
          ....

    def  renderDynamic(self):
          ....

     def render(self):
           if anim == True:
              self.renderDynamic()
           else:
             self.renderStatic()

но хотелось бы получить что то вроде этого(если это конечно возможно)
Note:  в приведённом примере ниже, синтаксис абстрактный, недействительныйпридуманный автором темы

class Obj():
    def  __int__(self, Тех):
           if type(Tex).__name__ == 'list':
              self.r = self.renderDynamic()
           else:
              self.r = self.renderStatic()

    def renderStatic(self):
          ....

    def  renderDynamic(self):
          ....

     def render(self):
            self.r

Конечно вы можите возразить что данная реализация не принесёт ощутимого роста производительности, однако я собираюсь применять этот приём(если он конечно реализуем ;D) и в др. моментах
« Последнее редактирование: 11 Сентября 2010, 22:10:26 от amdlintuxos »
что не збудется - позабудется

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #1 : 07 Сентября 2010, 23:56:35 »
если мне не изменяет память то конструкция
self.r = self.renderDynamic()
присвоит self.r результат функции self.renderDynamic(), а не саму функцию ;)
поэтому лучше флаг, ИМХО

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #2 : 08 Сентября 2010, 00:12:46 »
вместо
if type(Tex).__name__ == 'list':   лучше использовать
if type(Tex) is list:   или лучше
if isinstance(Tex, list):
Пользователь решил продолжить мысль 08 Сентября 2010, 03:15:14:
по идее должно работать так
class Obj():
    def  __init__(self, Тех):
           if isinstance(Tex, list):
              self.render = self.renderDynamic
           else:
              self.render = self.renderStatic

    def renderStatic(self):
          ....

    def  renderDynamic(self):
          ....

Пользователь решил продолжить мысль 08 Сентября 2010, 02:28:44:
Проверил, работает:
class Obj():
    def  __init__(self, Tex):
        if isinstance(Tex, list):
            self.render = self.renderDynamic
        else:
            self.render = self.renderStatic

    def renderStatic(self):
        print ("rednerstatic")

    def  renderDynamic(self):
        print ("rednerdynamic")

a=Obj(None)
#a=Obj(list())
a.render()

Пользователь решил продолжить мысль 08 Сентября 2010, 01:32:54:
и, ради углубления в язык, найди отличия и пойми их:
class Obj():
    def  __init__(self, Tex):
        if isinstance(Tex, list):
            self.render = Obj.renderDynamic
        else:
            self.render = Obj.renderStatic

    def renderStatic(self):
        print ("rednerstatic")

    def  renderDynamic(self):
        print ("rednerdynamic")

a=Obj(None)
a.render(a)

Пользователь решил продолжить мысль 08 Сентября 2010, 00:35:35:
http://diveintopython.org/object_oriented_framework/defining_classes.html
« Последнее редактирование: 08 Сентября 2010, 00:35:35 от blindvic »

Оффлайн amdlintuxos

  • Автор темы
  • Любитель
  • *
  • Сообщений: 86
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #3 : 08 Сентября 2010, 20:12:45 »
if isinstance(Tex, list):
приму к сведененью, спасибо.


Проверил, работает:
class Obj():
    def  __init__(self, Tex):
        if isinstance(Tex, list):
            self.render = self.renderDynamic
        else:
            self.render = self.renderStatic

    def renderStatic(self):
        print ("rednerstatic")

    def  renderDynamic(self):
        print ("rednerdynamic")

a=Obj(None)
#a=Obj(list())
a.render()
blindvic, то что надо! спасибо, правда и тут без проблем не обошлось.
в своёй програмке я часто использую deepcopy(например есть класс шаблонного взрыва или эффекта, и чтоб не создавать каждый раз новый взрыв я использую deepcopy эталонного и меняю ему стартовые координаты). Не уверен, но думаю метод копирования обьекта всегда быстрее его создания с нуля.
Наверное прийдется написать свой метод копирования атрибутов класса, ибо deepcopy не нравится приведённый вами метод(но это не критично, прорвёмся). Еще раз спасибо.

(Нажмите, чтобы показать/скрыть)

ошибка под вторым спойлером
(Нажмите, чтобы показать/скрыть)


Пользователь решил продолжить мысль [time]Wed Sep  8 01:32:54 2010[/time]:
и, ради углубления в язык, найди отличия и пойми их:
http://diveintopython.org/object_oriented_framework/defining_classes.html
Отличия нашёл, понять на данном этапе врядтли смогу, уж сильно я зелёный в программировании, но постараюсь в перспективе.
что не збудется - позабудется

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #4 : 09 Сентября 2010, 00:26:42 »
С deepcopy здесь целая кухня, в которой мне не разобраться:
http://bytes.com/topic/python/answers/41470-deepcopy-chokes-typeerror-dynamically-assigned-instance-method
http://bugs.python.org/issue1515

В общем используй флаг, как сказал Владимир Николаевич:
from copy import deepcopy

class Obj():
    def  __init__(self, Tex):
        self.dynamic = isinstance(Tex, list)

    def render(self):
        if self.dynamic:
            self.renderDynamic(self)
        else :
            self.renderStatic(self)

    def renderStatic(self):
        print ("rednerstatic")

    def renderDynamic(self):
        print ("rednerdynamic")

a=Obj(None)
a=Obj(list())
a.render()
b = deepcopy(a)

Пользователь решил продолжить мысль 09 Сентября 2010, 00:28:59:
Но мне кажется у тебя еще будут проблемы с deepcopy - с ним надо аккуратно - знать что делаешь
« Последнее редактирование: 09 Сентября 2010, 00:28:59 от blindvic »

Оффлайн amdlintuxos

  • Автор темы
  • Любитель
  • *
  • Сообщений: 86
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #5 : 09 Сентября 2010, 18:51:18 »

Пользователь решил продолжить мысль 09 Сентября 2010, 00:28:59:
Но мне кажется у тебя еще будут проблемы с deepcopy - с ним надо аккуратно - знать что делаешь
уже было дело, намучался, пожалуй я лучше облегчу генерацию классовв main loop и избавлюсь от deepcopy(это я уже зделал)
еще раз спасибо
что не збудется - позабудется

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #6 : 10 Сентября 2010, 14:23:58 »
А почему не так тогда? (можешь не отвечать)
from copy import deepcopy

class Obj():
    def  __init__(self, Tex):
        self.Tex = Tex

    def render(self):
        if isinstance(self.Tex, list):
            self.renderDynamic(self)
        else :
            self.renderStatic(self)

    def renderStatic(self):
        print ("rednerstatic")

    def renderDynamic(self):
        print ("rednerdynamic")

Оффлайн amdlintuxos

  • Автор темы
  • Любитель
  • *
  • Сообщений: 86
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #7 : 10 Сентября 2010, 19:24:01 »
В принципе для рендеринга использование флагов в моём случае это нормально(но я всёравно сбежал 8) от флагов где это возможно в рендере, не помешает). Основные надежды данного приёма я возлагаю на проектирование AI в игре. Где будет множество функций-заданий, и в определёный момент будет обрабатываться активная функция, а остальные будут ждать своей очереди.
В данный момент у меня очень много if..elif..elif, что трудно читаемо, ну и я думаю расточительно (например имеем 20 тасков, активный самый последний, перебор elseif 20 раз, обьектов в игре планирую немерянно, просчёт AI ведётся и для фоновых обьектов). Да и с использованием той структуры, что вы посоветовали, код получается читабельнее(по крайней мере для меня)

PS: уже вычистил везде deepcopy, работает без него прекрасно. так что теперь уже никаких помех.
Еще раз спасибо 8)
« Последнее редактирование: 10 Сентября 2010, 19:29:56 от amdlintuxos »
что не збудется - позабудется

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #8 : 10 Сентября 2010, 23:18:31 »
Насчет игр на питоне. Здесь был:
http://wiki.python.org/moin/PythonGames
http://www.pygame.org/news.html
?

Оффлайн amdlintuxos

  • Автор темы
  • Любитель
  • *
  • Сообщений: 86
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #9 : 11 Сентября 2010, 00:13:14 »
Насчет игр на питоне. Здесь был:
http://wiki.python.org/moin/PythonGames
http://www.pygame.org/news.html
?
вторая ссылка это моя библия)  собственно использую pygame+pyopengl.
пощупал pygame(всё гут только рендер показался медленный), в поисках скорости пощупал pyglet(показалось маловато мануалов на нём, а для меня как зеленому это очень важно), в итоге переписал рендер(грозно звучить, там всего пару функций ;D) с pygame на pyopengl. С готовыми движками возиться не стал, очень хотелось немного пощупать фундамент.
Если интересно вот мои наработки http://www.youtube.com/watch?v=9cArzK6GxSY. В ближайшее время собираюсь выложить на http://www.pygame.org/, вот только разберусь как правильно оформить лицензию.


« Последнее редактирование: 11 Сентября 2010, 00:17:36 от amdlintuxos »
что не збудется - позабудется

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #10 : 11 Сентября 2010, 14:44:41 »
Интересно.
Желаю успехов и радости.

Оффлайн amdlintuxos

  • Автор темы
  • Любитель
  • *
  • Сообщений: 86
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #11 : 11 Сентября 2010, 22:09:55 »
спасибо
что не збудется - позабудется

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #12 : 11 Сентября 2010, 22:28:42 »
Если интересно вот мои наработки http://www.youtube.com/watch?v=9cArzK6GxSY.
Вах! Для "зелёного" как вы говорите - просто вах!

А вы исключительно сами пишите? Нигде исходники пощупать нельзя?
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн amdlintuxos

  • Автор темы
  • Любитель
  • *
  • Сообщений: 86
    • Просмотр профиля
Re: python: Существует ли такой приём?
« Ответ #13 : 12 Сентября 2010, 21:29:59 »
Вах! Для "зелёного" как вы говорите - просто вах!
спасибо
А вы исключительно сами пишите? Нигде исходники пощупать нельзя?
Пишу сам, но некоторые файлы я взаимствовал из других проектов (например рендер шрифтов, функции загрузки текстур, и загрузка файлов obj).
Я весь пак собираюсь вот-вот выложить, пока что я вычистил весь non-free контент-картинки.
Теперь осталось правильно оформить лицензию на сами файлы(как я упоминал выше, не все они мои). А код написанный мной, далеко-далеко не оптимальный его еще чесать и чесать, даже комментариев особо нету, хотя имена переменных и функций очень информативны) . Как выложу, дам знать, если интерес еще не угаснет у вас.

что не збудется - позабудется

 

Страница сгенерирована за 0.058 секунд. Запросов: 26.