purebasic.info

PureBasic forum
Текущее время: Вс мар 29, 2020 12:14 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: Вс мар 01, 2020 4:37 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
есть крайне запутанная система с графикой юнитов. это примерно 32х32 картинки, которые нарисованы только в определенных видах. типа тип 1 - 3 вида. мордой вверх, 45 градусов, 90 градусов. видя что тип 1 - система сама потом зеркалит для всех прочих градусов 180, 135, 270. кратно 45. типа тип 2 - мордой вверх, 23, 45, 68, 90 - пять положений. поворот юнита отрисован более плавно. для прочих углов система сама зеркалит нужный угол из существующей графики в нужный угол для рисования... и так далее.

редактор ландшафта я набросал более менее. теперь дошла очередь до рисования юнитов поверх этого ландшафта. сами конфиги юнитов уже сделано - читается и рисуется под нужным углом из массива точек. сами юниты могут иметь 5 вариантов раскраски - по сути три цвета из палитры меняются.

вот собственно вопрос в следующем: как лучше поступить? рисовать каждый юнит из массива точек по нужным координатам и с нужным цветом, либо создавать дичайший массив картинок юнитов на размер юнитов - всего 32 штуки. где внутри ячейки будет еще один массив на 5 ячеек - количества цветов раскраски, и после уже внутри массива из 5 ячеек - массив по 16 картинок (или даже больше) для каждого из возможных углов? то есть как PB проще - drawimage - готовую существующую картинку или каждый раз for x = 1 to 32 for y = 1 to 32 plot next next - то есть каждый раз воссоздавать по новой рисунок юнита под нужным углом? рисовок будет очень много. так как любой чих мышкой, или сдвиг полосок прокруток - нужна перерисовка всего изображения со всеми видимыми в данный момент юнитами на карте.

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

но предполагается что юниты могут быть перерисованы в редакторе. значит для отображения на карте в случае перерисовки нужно будет учитывать, что нужно по новой перерисовать. это раз. два - прозрачность. есть модуль прозрачности, где нужный цвет рисуется прозрачным. с этим проблем нет. проблема если пересоздавать изображение внутри ячейки массива. она, скатина, запоминает прозрачность старого изображения. то есть правильней было бы freeimage и создание по новой, нежели перерисовка содержимого внутри картинки. хотя наверное эту проблему можно решить рисуя не RGB а RGBA с заведомо непрозрачным цветом. однако если рисовать юнит массивом из точек - то эта прозрачность не нужна. просто игнорируем рисовку пикселя с нулевым цветом и никакие танцы с бубном для прозрачности не нужно.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 02, 2020 3:03 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 392
Благодарил (а): 1 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
ох и текста многовасто.
Пойду перечитаю еще раз.

Ты на чем рисовать собрался, в каком окне StartDrawing()? ...спрайтами InitSprite()

какой размер юнита в пикселях,

Что значит 32*32
если я понял то 32 положения одного юнита типа спереди сзаду... и положение головы, рук, ног при ходьбе...
что значит второе 32? вроде указал что будет 5 цветов по форме, а осталное что, я запутался.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 02, 2020 3:39 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
в канвасе рисую.
32х32 пикселя размер изображения юнита.
массив что-то типа такого:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
Strucrure untimgstr2
  images.l[32] ; картинки по 32 градусам положений
EndStructure
 
Strucrure untimgstr
  House.untimgstr2[5] ; 5 расцветок домов.
EndStructure
 
Dim UnitID.untimgstr(32) ; всего 32 вида юнитов
 
 




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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 02, 2020 4:49 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 392
Благодарил (а): 1 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
Так немного яснее.

думаю так
-сделать поле боя
-запомнить картинкой №1(только то что отражается на экране)
-на нем кинуть картинки заводов и прочего, это картинка №2..5...10 и так их несколько
-сверху налаживать юнитов картинки №100-120 или больше по количеству юнитов

когда юнит передвигается достаточно имея старые координаты и размеры этого юнита и по этим местам с таким размером скопировать сюда карту с картинки №1.
потом ложеш юнита в новом положении или направлении на это поле.

Вроде все
ну возможно нужен учет условий того чтобы юниты друг на друга не наежали и на завод тоже.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср мар 04, 2020 6:39 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
пока так и оставил каждый раз рисование точками всего оптом. вроде не заметно, чтоб сильно тормозило. теперь другая проблема :) начал плавать в своем собственном коде... столько наплодил функций и нюансов... вроде бы и начал как бы разрезать проект на составные куски, запихивая в разные файлы, которые могли запускаться отдельно, чтоб все сто тыщь строк не компилировать при правке какого-то отдельного нюанса. но теперь это из спасения - превращается в проклятье :) когда в одном куске нужны куски из других кусков. типа рисование иконок в одном месте, а теперь иконки понадобились в редакторе карт. а это значит надо функции в определенном порядке располагать. потом ограничения по домам - в битве может быть только 4 варианта домов. значит надо в редакторе предусмотреть, чтобы тот цвет дома, который не может участвовать в битве по палитровым ограничениям - был недоступен для выбора. потом далее углы поворота юнитов - от типа спрайта в настройках зависит возможные углы... и таких нюансов тыща :) мозг взрывается.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт мар 06, 2020 12:26 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
плюнул, сделал сразу оптовую рисовку всех юнитов всех домов во всех положениях. старт программы стал медленнее, но зато гарантированно никаких вылетов, что такой картинки не существует.

теперь вопрос другой. есть канвас с такими флагами и обработчик событий к нему:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
 
CanvasGadget(#MAPCanv, x, y, 672, 576, #PB_Canvas_Keyboard | #PB_Canvas_ClipMouse)
 
Case #MAPCanv
            Select EventType()
              Case #PB_EventType_Input ;{ горячие клавиши
                keypressed = GetGadgetAttribute(#MAPCanv, #PB_Canvas_Input)
                Select keypressed
                  Case #PB_Shortcut_Delete
                    Debug "0000000000000"
                   
                EndSelect
 



чо она, скатина, буквы все ловит, а служебные кнопки всякие типа делете и ескейп нет?


костыли типа
code = GetAsyncKeyState_(#VK_RETURN)
If code = -32767
делать не хочется. хотя это в принципе правильнее - так как уже будет независимо от фокуса канваса.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт мар 06, 2020 12:56 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
хотя нашлось :)

Код:
1
2
Case  #PB_EventType_KeyUp
                 keypressed = GetGadgetAttribute(#Canvas, #PB_Canvas_Key)



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт мар 06, 2020 4:32 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
еще чуток поплачу:
у меня канвас, а по бокам скролл бары. типа двигаешь скролл бар - двигается изображение внутри канваса. предполагается если курсор над канвасом и нет селекта юнита или здания - но крутится колесико мышки, то происходит вертикальный скролл. если курсор над нижним скроллбаром - то горизонтальный скролл.

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

у меня есть проверка координат мышки и если они над скролбарами - то рожается соответствующий флаг, что типа если крутит колесико - делать скролл. однако он не работает, если канвас в фокусе и плюс у канваса есть флаг #PB_Canvas_Keyboard

казалось бы - фигня вопрос - берем лепим событие #PB_EventType_MouseLeave, и расфокусим канвас. а вот и хрен там. #PB_EventType_MouseEnter обрабатывается, а #PB_EventType_MouseLeave ноль эмоций. может кто чего дельное посоветует по сему безобразию? код пока не приложу... надо отдельный файл бахнуть именно с этой частью кода. это пока не смогу сделать. а хотя стоять... что-то в голове промелькнуло. надо наверное расфокусить в другом месте - там где у меня отслеживаются координаты движения мышки по всему окну программы, а не только внутри канваса.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт мар 06, 2020 11:50 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
пока все получается. за исключением:
- как можно отключить меню, что показывается путем клика правой кнопкой по гаджету сроллбара? мне оно всю картину портит.
- меню комбобокс гаджета накладывается на канвас. а канвас, как только мышка наводится на него - становится активным. соответственно меню комбобокса закрывается и мышкой там не выбрать какой-то верхний пункт. только стрелочками. как можно отловить момент раскрытия меню комбобокса, и на время работы этого меню отключить канвас. а как меню закрылось - опять включить?

Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 10, 2020 8:56 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
как правильно блокировать событие?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
  Global ScrollBarGadgetID.l
 
  Procedure WinCallback(WindowID, Message, WParam, LParam)
    Result = #PB_ProcessPureBasicEvents
    ;
   
    Select Message
      Case 32
        Select WParam
          Case ScrollBarGadgetID ; it is gadget event
            Select LParam
              Case 33554433
                ;Debug "mousemove"
              Case 33619969
                ;Debug "mouse click"
              Case 33816577
                Debug "right click down?"
                LParam = 0
                Result = 0
                Message = 0
                WParam = 0
              Case 33882113
                Debug "right click up?"
                LParam = 0
                Result = 0
                Message = 0
                WParam = 0
              Default
                Debug "LParam = " + Str(LParam)
            EndSelect
          Default
            ;Debug "WParam = " + Str(WParam) + "; LParam = " + Str(LParam)
        EndSelect
    EndSelect
    ;
    ProcedureReturn Result
  EndProcedure
 
 
  If OpenWindow(0, 200, 200, 200, 50, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
   
    ScrollBarGadget(0, 10, 10, 180, 20, 1, 100, 20)
    ScrollBarGadgetID = GadgetID(0)
   
    SetWindowCallback(@WinCallback())    ; activate the callback
   
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          End
      EndSelect
    ForEver
   
  EndIf



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 10, 2020 9:23 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 968
Благодарил (а): 2 раз.
Поблагодарили: 55 раз.
Пункты репутации: 9
Попробуй при клике правой SetCapture_(hwnd(скролла или его меню?));теперь сообщения от мышки идут в захваченное окно и после при клике левой(выбор по меню) ReleaseCapture_();освобождение от окна для сообщений мыши. :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 10, 2020 9:46 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
мне бы чтоб меню вовсе не появлялось. а сам скрол чтоб работал. просто событие правой кнопкой мышки на скролле - убить к чертовой матери. и именно на скроле, в других местах правая мне нужна.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 10, 2020 10:21 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 968
Благодарил (а): 2 раз.
Поблагодарили: 55 раз.
Пункты репутации: 9
Так? :?:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
 
 
 
 
 
 Global adresobrabothika.i
 Procedure scrollcalbak(hwnd,msg,wparam,lparam);теперь сообщения ScrollBarGadget идут сюда
     If msg<>#WM_RBUTTONUP;меню открывается после отжатия
        ProcedureReturn CallWindowProc_(adresobrabothika, hWnd, Msg, wParam, lParam);сначала прыгнем в родной обработчик
      Else
       ProcedureReturn 0
      EndIf  
EndProcedure  
   
 
  If OpenWindow(0, 200, 200, 200, 50, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
   
    ScrollBarGadget(0, 10, 10, 180, 20, 1, 100, 20)
   adresobrabothika= SetWindowLongPtr_(GadgetID(0),#GWLP_WNDPROC,@scrollcalbak())
   
 
   
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          End
      EndSelect
    ForEver
   
  EndIf
 
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 10, 2020 10:28 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
да, работает как задумано. надо теперь только мне раздуплить как это применить :) у меня и колбак к основному окну, и бинд ивент к скролл бару. плюс теперь это третье :) надо думать.

оказалось и думать не нужно :) система совместима. тупо добавил и старый код никакой править не нужно было. все скролы колесиком мышкой на месте и все работает. довольныыыыййййй :)

вчера записывал итог, что получилось с редактором карт и миссий для сей древней игры:
https://youtu.be/9nwB94BZq6M


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB