Войти
ПрограммированиеФорумОбщее

рисование ui

Страницы: 1 2 Следующая »
#0
11:52, 9 сен. 2010

здравствуйте

нет, здесь не будет просьб рассказать о рисовании менюшек в directx, вводе и выложить примеры кода))))))
все это есть, поэтому вопрос другой и посложнее(для меня)

итак, сам вопрос:

у меня есть ui, пробинденый через tolua++ и нужно дать возможность его нарисовать в скрипте (гибкость, блин)))). Ограничения - нельзя рисовать каждый кадр в скрипте. Какие есть варианты:
1. Делать прорисовку каждого элемента в HTARGET, дав пользователю функции PrintText,DrawLine,DrawTexture(например) и перерисовывать когда скажет пользователь
+: пользователь все рисует сам
-: много жрет памяти (каждый таргет(на каждый элемент) 2048x2048px)
так сделано сейчас

2. рисовать все элементы на один таргет, потом его выводить
+: скорость прорисовки, простота для пользователя, память опять же
-: очень часто будет рендериться в текстуру весь ui, а не один элемент

3. строить элементы из каких-то блоков, которые можно менять и которые будут рисоваться
+: смена блока будет происходить быстрее, чем рендер в текстуру
-: менее интуитивно

какой вариант предпочтительнее(или может есть еще какие варианты?)

заранее спасибо за ответы


#1
11:55, 9 сен. 2010

Можешь записывть все комманды рисования в список и потом выводить эту графику в цикле рендеринга.

#2
12:28, 9 сен. 2010

каждую операцию рисования оберни в обект и в скрипте эти объекты создавай а потом на границе кадра рисовать иерархию объектов. такой вариант например в WPF.
получается вместо вызова метода drawLine
нужно создать объект new DrawLine()

#3
12:31, 9 сен. 2010

my.name
> нужно создать объект new DrawLine()
До такого уровня лучше не надо. Память будет нерационально использоваться. Лучше сразу полигоны хранить.

#4
13:10, 9 сен. 2010

X512,my.name
спасибо за идеи, мне команды в голову не пришли, честно говоря в голову не пришли)
если объединить все вами сказанное, можно предложить такой вариант:
как в OpenGl командами в какой то объект заносятся настройки

render:SetImage(img)
render:SetImageRect(ix1,iy1,ix2,iy2)
render:SetRect(x1,y1,x2,y2)
а затем "отрисовывается"
render:Render()
при этом создается спрайт с текущими настройками и добавляется в лист отрисовки
правда от DrawLine придется отказаться или хранить его действительно в объекте (но линии особо не нужны, это для примера)
также шрифт:
можно сделать
render:SetFont(font)
render:Print(x,y,'Test')
а вот Print придется хранить в виде объекта, так что от объектов не убежать
буду рад услышать ваши комментарии, но сама конструкция если и не является идеальной, то очень даже стройная
#5
14:40, 9 сен. 2010

sergiokey
можно поинтересоваться, в какой такой системе GUI отрисовывается скриптами? какбе вообще зачем сдался data-driven, если на него по факту переложена вся функциональность, хотя бы часть которой должен выполнять c++?

если уж так сильно хочется, используйте какой-нибудь язык для вёрстки: html, css, интерфейсы часто делают на flash.

#6
15:00, 9 сен. 2010

Suslik
>какбе вообще зачем сдался data-driven, если на него по факту переложена вся функциональность, хотя бы часть которой должен выполнять c++?
data-driven удобен тем, что можно проектировать не отходя от кассы, а проблемы с производительность решаются "запеканием" в с++ код хорошо реализованных элементов.

#7
15:09, 9 сен. 2010

Adler
Data-driven в моём понимании нужен, когда:
- над проектом работают существенно больше одного человека, при этом те, кто работают над GUI далеки от профессии программирования.
- требуется иметь возможность изменять что-то ценой минимальных временных затрат

если автор перекладывает на GUI рендеринг, то первый пункт сам собой отпадывает, ибо непрограммисты не смогут освоить эти скрипты. если необходимость вызвана причинами из второго пункта, то я не могу представить себе ситуацию, где был бы так необходим кастомный рендеринг. в смысле не т.н. "скины", а именно векторно отрисовывающий себя через скрипты GUI.

плюс если "скин" реализуется через плагин(нескриптово), то могут использоваться достаточно тяжёлые функции, advanced фичи графического ускорения. скрипты сильно ограничивают эти возможности пока не понятно что давая взамен.

и о проблемах производительности я пока даже не заикался.

#8
15:19, 9 сен. 2010

Suslik
она как бы не отрисовывается) она показывает что рисовать, чтобы не нужно было все класть в c++(который в результате изменяться не должен)

вот как все работает:
это откуда забирается ui

<ui>
  <uiparent type="uiex.Screen" name="start">
    <properties>
    </properties>
    <uiitems>
      <uichild type="uiex.Button" name="StartGame">
        <properties>
          <property name="X" type="float" value="100"/>
          <property name="Y" type="float" value="100"/>
          <property name="Width" type="float" value="200"/>
          <property name="Height" type="float" value="40"/>
        </properties>
      </uichild>
    </uiitems>
  </uiparent>
</ui>

вот класс uiex.Screen:

uiex.Screen = ui.InheritScreen()

function uiex.Screen:Draw(render)
  render:SetFont(font)
  render:Print(0,0,'Test')
end

function uiex.Screen:OnKey(key,press)
  return false
end

function uiex.Screen:OnMouseKey(key,press,x,y)
  return false
end

function uiex.Screen:OnMouseMove(x,y)
  return false
end

function uiex.Screen:OnMouseWheel(wheel,x,y)
  return false
end

function uiex.Screen:OnShow()
end

function uiex.Screen:OnHide()
end

а для верстки... ну это еще надо цеплять к проекту...
как с css нарисовать в dx кнопку с текстурой и уголками из другой текстурой
тем более это описывается не объект, а класс, а в объекте все устанавливается через property

может подскажешь, что делать если у контрола меняется какое то свойство (пользователем) и нужно перерисовать уже по другому, как это реализовать через css?
тем более я еще думаю, как лучше сделать)
но система должна быть гибкой)))

Adler
+1

#9
15:24, 9 сен. 2010

sergiokey
какбе не я первый это придумал.. http://www.gamedev.ru/community/gamedev_lecture/articles/?id=18

#10
15:27, 9 сен. 2010

Suslik
> над проектом работают существенно больше одного человека, при этом те, кто
> работают над GUI далеки от профессии программирования
пишу что-то типа love, только высокоуровневый

в коде зашит только следующие базовый классы: Control, Window, Screen
остальные реализуются подключением написанных библиотек (only lua) - Button, Edit, etc...
вплоть до нестандартных - например круговых меню

#11
15:29, 9 сен. 2010

sergiokey
не, ребят, дело ваше. просто по-моему логично, реализуя нечто, представить, зачем оно вам. попробуй задать себе вопрос: зачем мы это положили на скрипты? оно нам действительно надо? это риторический вопрос, я удаляюсь из темы, желаю вам счастья и не жду ответа.

#12
15:35, 9 сен. 2010

Suslik
> используйте какой-нибудь язык для вёрстки
верстка идет на уровне (x,y,width,height)
нужно отрисовать контрол в зависимости от пропертей, о которых я даже и не знаю), которые реализует только писатель библиотеки (тоже на lua)

#13
15:37, 9 сен. 2010

Suslik
> и о проблемах производительности я пока даже не заикался.
Таких проблем не будет. Все векторные данные хранятся в C++ и рендерятся там же.

Suslik
> зачем мы это положили на скрипты?
Более жёсткий вопрос: зачем скрипты вообще нужны? Если они нужны только для описывания чего-нибудь, то тут скрипты не нужны, тут больше подходит XML.

#14
15:44, 9 сен. 2010

my.name
>такой вариант например в WPF.
>получается вместо вызова метода drawLine
>нужно создать объект new DrawLine()
чета ты перепутал помойму, нет там такого

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.