purebasic.info

PureBasic forum
Текущее время: Ср авг 15, 2018 10:59 am

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




Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Чт авг 02, 2018 6:21 pm 
Не в сети
профессор

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Чт авг 02, 2018 6:37 pm 
Не в сети
док

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 134
Благодарил (а): 1 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
Я имею введу что в своей проге ты эти куски карты выделяеш и работаеш как с объектами или у тебя список и в нем выбираеш, ну типа blocks, а ниже их part1, part2... - это и есть отдельные фрагменты карты, какой part выбрал тот и подсветился.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Чт авг 02, 2018 6:55 pm 
Не в сети
профессор

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Пт авг 03, 2018 7:36 pm 
Не в сети
док

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

А всегда так :) , координаты мышки не окна, если работаеш в гаджете то координаты именно этого гаджета, поэтому должно быть смещение. Порадую больше, если в гаджете чегото имеет смещение относительно чегото то и это смещение нужно учитывать(а у тебя так).
Суммируеш, а где нужно вычитаеш координаты окна, смещения гаджета(оно неперемещается если ресайз окна неменяеш, если меняеш то вставляеш ту формулу по которой ты вычисляеш начальные координаты гаджета редактора графики) и добавляеш сещение своих полигонов и если надобиться выделеного полигона.
Можно(дальше изврат идет)
в разных сочетания плюсовать и минусовать и выводить разыми цветами гдето сбоку(слева и сверху) черточки которые указывают координаты результата на полигоны, зная какой цвет совпал та формула вычисления и верна, но лучше просто просчитать где суммировать координаты, а где отнимать.


Я так понял цвет указывает на глубин(высоту), а месность 3D.
Я вижу что у тебя почти так и сделано,но может поможет, что ниже.
Есть два окна, слева обычный редактор 2Д редактор который маштабируется и рисовать как в паинтбраше(mspaint.exe) только менять размер кисти соответственно(можно менять размер кисти и розплывчатость- она позволяет делать впадины и горы немного плавней), а после краткой прорисовки нажать кнопарик обновления или по таймеру и отражать справа в окошке в 3Д-е.
В 3Д можно и устроить просмотр полигона всего и выделеного который рисуется например подсветкой какойто, чтоб видно было детище.
После рисования все 2Д конвертируем в тот формат который игрушка (Дюна) понимает.
Или гдето большая загвоздка? Ведь ты там много преобразований какихто делаеш с редактора в структуры и это создает тебе проблемы с маштабированием при прорисовке, если высота рельефа месности указывается цветом, и даже если овет покраски и высота отдельные то можно две 2Д карты делать, на одной цвет гор, леса.., а на другой высоту, в 3Д окне просматриваем результат, а когда нужно с двух 2Д редакторов конвертируем в формат игрушки (Дюна)

Если бы иметь какоето представление как карта прорисовывается, например граници, ведь они не линейные, впрочем ,это тебе лишняя писанина.

Чтобы выбирать полигоны мышкой на 2Д окне, я непомню как делал но прикольно получалось.
Но код и что я там делал непомню. Ну вобщем типа создаю отдельный "экран" , вот хоть убей непомню на основании чего, который неотражается, может это и есть обычная картинка. на ней рисую разными цветами разные узоры(у тебя это полигоны). Каждому полигону part присваиваеш свои цвета и совмещаеш координаты реального рисунка и этого невидимого.
когда наводим мышкой на какойто полигон, читаем цвет невидимой картинки которую мы рисовали, переводим цвет в номер полигона и вуаля выделяем(подсвечиваем) как у тебя на рисунке этот полигон part.Рисование этого невидимого указателя можно автоматизировать, у тебя както выделяются края полигонов part, вот и испоьлзовать их как границу а все что внутри зарисовавыть одним цветом соответственно этому полигону, только не закраской(чегото ненайду где она или у пурика такой нет, у других бейсиках есть точно) .Давно возился с графикой пример долго писать нехочется.
Но нечто подобное есть в хетемеле, может встречал какуюто разноцветную полоску и когда по ней введеш мышку то внизу показывается ссылка в которой быстро меняются числа.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Пт авг 03, 2018 9:03 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11226
Благодарил (а): 4 раз.
Поблагодарили: 424 раз.
balex1978 писал(а):
только не закраской(чегото ненайду где она или у пурика такой нет, у других бейсиках есть точно).
https://www.purebasic.com/documentation ... larea.html

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Пт авг 03, 2018 9:50 pm 
Не в сети
профессор

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

алгоритм родил, только потом увидел твой пост.

конфигурация идет так:
Цитата:
1. координаты на экране
2. смещение по отношению к 1 кусочку
3. смещение по отношению к 2 кусочку
4. смещение по отношению к 3 кусочку


если отображать на главном изображении 320х224, то проблем как бы нет. но получается это я не могу создать такое отдельное маленькое изображение, которое содержало бы в себе только куски региона, а не всю карту. получается я рисую регион на большом изображении, после отслеживаю смещение мышки, применяю это к большому изображению, после это-же смещение применяю к координатам в 1 куске - которые являются как бы стартовыми координатами. это было проще всего. но потооооом... это было нечто :) если менять последний кусочек - то как бы нормально. просчитываешь опять таки сколько пикселов туда или сюда сместилось и эту разницу применяешь к координатам в 4 кусочке. это легко. самая жопа начинается если двигать 3 или 2 кусочек. то есть их смещения изменились, но получается 4 не изменилось. тогда при сдвиге 3 кусочка - 4 уедет не в ту степь. получается мне надо просчитывать так-же и последующий кусочек, компенсируя в нем изменения предыдущего кусочка. благо что только в следующем после изменяемого, а не все изображения в целом. вобщем та еще дичь... я не знаю как это получилось, и как эту часть кода скопировать... я там такой огород нагородил, что сам удивляюсь что это работает :)))

Код:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
          Case #REDMainCanvas       ;{ таскание мышкой по экрану
            Select EventType()
              Case #PB_EventType_MouseMove       ;{ елозивание мышкой
                ; получение координат мышки над канвасом
                mainxgad = GetGadgetAttribute(#REDMainCanvas, #PB_Canvas_MouseX)
                mainygad = GetGadgetAttribute(#REDMainCanvas, #PB_Canvas_MouseY)
               
                ; работает, только если было нажатие до этого
                If redmousepressflag
                   
                    If mainxgad <> oldmainxgad Or mainygad <> oldmainygad
                      ; работает, если было смещение
                     
                      ; нужен просчет координат смещения
                      REDConfigEditRealX - (oldmainxgad - mainxgad)
                      REDConfigEditRealY - (oldmainygad - mainygad)
                     
                      ;If redkusoknum = 1
                        ; то есть первый кусок - всему голова
                        REDConfigEditP\xpos - (oldmainxgad - mainxgad)
                        REDConfigEditP\ypos - (oldmainygad - mainygad)
                        ;SetGadgetItemText(#REDConfigList2, redkusoknum-1, Str(REDConfigEditP\xpos), 1)
                        ;SetGadgetItemText(#REDConfigList2, redkusoknum-1, Str(REDConfigEditP\ypos), 2)
                      ;EndIf
                       
                      REDMapRefresh()
                     
                      oldmainxgad = mainxgad
                      oldmainygad = mainygad
                     
                    EndIf
                 
                 
                EndIf
                ;}
 
              Case #PB_EventType_LeftButtonDown ;{
                ; стартовые координаты
                ; опеределять что именно мы будем таскать мышкой
                blocknum = GetGadgetState(#REDConfigList)
                If blocknum > -1
                  ; блок выделен.
                  ; проверить теперь на кусочек
                  partnum = GetGadgetState(#REDConfigList2)
                  If partnum > -1
                    ; значит таскаем кусочек
                    redmousepressflag = 1
 
                    curx = 0
                    cury = 0
                 
                    mainxgadstartx = GetGadgetAttribute(#REDMainCanvas, #PB_Canvas_MouseX)
                    mainxgadstarty = GetGadgetAttribute(#REDMainCanvas, #PB_Canvas_MouseY)
                 
                    oldmainxgad = mainxgadstartx
                    oldmainygad = mainxgadstarty
                 
                    ; курсор закрытой ладошки
                    SetGadgetAttribute(#REDMainCanvas, #PB_Canvas_CustomCursor, CursorClos)
                 
                  EndIf
                 
                Else
                  redmousepressflag = 0
                  ; стандартный курсор
                  SetGadgetAttribute(#REDMainCanvas, #PB_Canvas_Cursor, #PB_Cursor_Default)
                EndIf
                ;}
               
              Case #PB_EventType_LeftButtonUp ;{                
                If redmousepressflag
                  ; курсор открытой ладошки
                  SetGadgetAttribute(#REDMainCanvas, #PB_Canvas_CustomCursor, CursorOpen)
                 
                  If redkusoknum = 1
                        ; надо бы перерисовать картинку региона с новыми данными
                       
                        If IsImage(#REDMapKuskImg)
                          FreeImage(#REDMapKuskImg)
                        EndIf
                        CreateImage(#REDMapKuskImg, 320, 224, 32, REDBackColor)
                        If StartDrawing(ImageOutput(#REDMapKuskImg))
                 
                          curx = 0
                          cury = 0
                          For prm = 1 To ArraySize(REDConfigList(cnf)\params())-1
                            If prm = redkusoknum
                              ; пропускаем
                              curx + REDConfigEditP\xpos
                              cury + REDConfigEditP\ypos
                              REDConfigEditRealX = curx
                              REDConfigEditRealY = cury
                            Else
                              curx + REDConfigList(cnf)\params(prm)\xpos
                              cury + REDConfigList(cnf)\params(prm)\ypos
       
                              REDDrawPart(cnf, prm, 0, curx, cury)
                            EndIf
                          Next
                 
                          StopDrawing()
                        EndIf
                        SetImageTransparent(#REDMapKuskImg, REDBackColor)
                       
                        REDMapRefresh()
                       
                      EndIf
                 
                  redmousepressflag = 0
                EndIf                
                ;}
               
            EndSelect
            ;}
           
          ;- Save  
          Case #REDSave            ;{ сохранение
            If EventType() = #PB_EventType_LeftClick
              tmp = GetGadgetState(#REDConfigList2)
              If tmp > -1
                tmp + 1
                If tmp = 1
                  ; то есть первый - главный кусок.
                  ; координаты как есть
                  REDConfigList(cnf)\params(tmp)\xpos = REDConfigEditRealX
                  REDConfigList(cnf)\params(tmp)\ypos = REDConfigEditRealY
                  SetGadgetItemText(#REDConfigList2, tmp-1, Str(REDConfigEditRealX), 1)
                  SetGadgetItemText(#REDConfigList2, tmp-1, Str(REDConfigEditRealY), 2)
                Else
                  ; тут надо смещение, а не реальные координаты
                  ; и тут надо пересчитывать смещение по сумме до селекта
                  ; и применять это смещение к новому смещению текущего куска
                  ; и плюс еще пересчитывать для следующего после выделенного
                 
                  ; сумма смещений до селектнутого
                  shiftxdo.w = 0
                  shiftydo.w = 0
                  For i = 1 To tmp -1
                    shiftxdo + REDConfigList(cnf)\params(i)\xpos
                    shiftydo + REDConfigList(cnf)\params(i)\ypos
                  Next
                 
                  ; расчет нового смещения селектнутого
                  oldxpos = REDConfigList(cnf)\params(tmp)\xpos
                  oldypos = REDConfigList(cnf)\params(tmp)\ypos
                  REDConfigList(cnf)\params(tmp)\xpos = REDConfigEditRealX - shiftxdo
                  REDConfigList(cnf)\params(tmp)\ypos = REDConfigEditRealY - shiftydo
                  SetGadgetItemText(#REDConfigList2, tmp-1, Str(REDConfigList(cnf)\params(tmp)\xpos), 1)
                  SetGadgetItemText(#REDConfigList2, tmp-1, Str(REDConfigList(cnf)\params(tmp)\ypos), 2)
                 
                  ; проверка на последний итем в массиве
                  ; то есть если изменяемый это последний - игнор
                  ; если не последний, значит последующий тоже пересчитать
                  If CountGadgetItems(#REDConfigList2) > tmp
                    ; значит пересчет в этой ячейке
                    REDConfigList(cnf)\params(tmp+1)\xpos + (oldxpos - REDConfigList(cnf)\params(tmp)\xpos)
                    REDConfigList(cnf)\params(tmp+1)\ypos + (oldypos - REDConfigList(cnf)\params(tmp)\ypos)
                    SetGadgetItemText(#REDConfigList2, tmp, Str(REDConfigList(cnf)\params(tmp+1)\xpos), 1)
                    SetGadgetItemText(#REDConfigList2, tmp, Str(REDConfigList(cnf)\params(tmp+1)\ypos), 2)
                  EndIf
                 
                EndIf
                ;Debug Str(REDConfigEditRealX) + " : " + Str(REDConfigEditRealY)
              EndIf
            EndIf
            ;}



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

что касается заливки цветом на изображении - она будет. и FillArea тут не подойдет :) подойдет как раз та моя схема с массивом КоординатаХ()КоординатаУ() = номер цвета. проблема в том, что FillArea зальет новым цветом весь цвет, который по её мнению одинаковый с тем, над которым ты кликнул. но это несколько неверно, так как у меня используется номер цвета в палитре, а не сам номер цвета на изображении. получается если в палитре было 2 одинаковых цвета, скажем номер 3 и номер 5, и на изображении они, так уж вышло граничат между собой - то FillArea зальет и 3 и 5 номера цветов одним и тем-же цветом и при пересчете из изображения в память - 5 номер заменится на 3. ежели та моя порнографическая схема КоординатаХ()КоординатаУ() будет использована, а к ней горе-процедура для заливки цвета:

Код:
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
; заливка цвета в массив
Procedure FillAreaArrayGFX(x.a, y.a, newcolor.a, oldcolor.l=-1)
 
  xmax = ArraySize(ColorCoordSoloImg())
  ymax = ArraySize(ColorCoordSoloImg(0)\Y())
 
  If oldcolor = -1
    oldcolor = ColorCoordSoloImg(x)\Y(y)
  EndIf
 
  If ColorCoordSoloImg(x)\Y(y) = oldcolor
    ColorCoordSoloImg(x)\Y(y) = newcolor
    ; рекурсия
    If y-1 > -1
      If ColorCoordSoloImg(x)\Y(y-1) = oldcolor
        FillAreaArrayGFX(x, y-1, newcolor, oldcolor)
      EndIf
    EndIf
    If y+1 <= ymax
      If ColorCoordSoloImg(x)\Y(y+1) = oldcolor
        FillAreaArrayGFX(x, y+1, newcolor, oldcolor)
      EndIf
    EndIf
    If x-1 > -1
      If ColorCoordSoloImg(x-1)\Y(y) = oldcolor
        FillAreaArrayGFX(x-1, y, newcolor, oldcolor)
      EndIf
    EndIf
    If x+1 <= xmax
      If ColorCoordSoloImg(x+1)\Y(y) = oldcolor
        FillAreaArrayGFX(x+1, y, newcolor, oldcolor)
      EndIf
    EndIf
  EndIf  
 
EndProcedure



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


Последний раз редактировалось SereZa Ср авг 08, 2018 6:51 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Сб авг 04, 2018 6:46 pm 
Не в сети
профессор

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

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

Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Пн авг 06, 2018 5:38 pm 
Не в сети
док

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

К стати получится если нет дыр в каре точнее границе, вот пример с справки как это делать:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
If OpenWindow(0, 0, 0, 300, 300, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 300, 300) And StartDrawing(ImageOutput(0))
        Box(0, 0, 300, 300, RGB(255, 255, 255))
        Circle(150, 150, 125 ,$00FF00)
        Circle(150, 150, 120 ,$FF0000)
        LineXY(30, 150, 270, 150, $FFFFFF)
        FillArea(150, 155, -1, $0000FF) ; Замените -1 на $ 00FF00 и сравните результат.
        StopDrawing()
        ImageGadget(0, 0, 0, 300, 300, ImageID(0))
    EndIf
   
    Repeat
        Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf


Вото тот минут 1 в FillArea(150, 155, -1, $0000FF) и запрещает зарисовывать все подряд, зарисует только тот на который попал с начала.
вот более наглядный с рандомными шариками
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
If OpenWindow(0, 0, 0, 300, 300, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 300, 300) And StartDrawing(ImageOutput(0))
        Box(0, 0, 300, 300, RGB(255, 255, 255))
        For i=0 To 30 :Circle(Random(250)+30,Random(250)+30 ,Random(30), Random($FFFFFF)):Next
        Box(130, 130, 40, 40, RGB(255, 255, 255))
            FillArea(150, 155, -1, $0000FF) ; Замените -1 на $FFFFFF и сравните результат.
        StopDrawing()
        ImageGadget(0, 0, 0, 300, 300, ImageID(0))
    EndIf
   
    Repeat
        Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf
 


Пробовал прогу нередактирует пикселы, а выбор(из менюшки) и перемещение(мышкой) както забавно получается.
Когда выбирается первый кусочек из площадки то перемещается все.

По FillArea, я имел введу не для рисования видимой части, а для выборки но на моем примере, а не твоей проге уже готовой. А для твоей проги пример привел.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Пн авг 06, 2018 6:41 pm 
Не в сети
профессор

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Пн авг 06, 2018 7:33 pm 
Не в сети
док

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

С палитрой немного непонял, скольких бит цвет, и как всязана высота на 3Д карте с цветом, линейно или через таблици или я неверно понял, кароче как высота(и глубина) задается? Ну и как поверхность раскрашивается, для него отдельная текстура или все из того что в редакторе.

Непонял зачем перемещать фрагменты- ПАРТ и его кусочков, или это для примера манипуляции(это я об проге в архиве)?

вот пример выбора фрагментов ПАРТ о той методике, что я говорил.
справа есть некая маска, черным у тебя граници каждой ПАРТ, я использовал тольк два ПАРТа чтоб незаморачивать тебе мозги и себе тоже :lol:
С этой картинки, что справа(ее в твоей проге ненужно отражать на экаран, я отразил чтобы было видно о чем речь идет) берется цвет можно тупо прономеровать по порядку как ПАРТ но при этом небудет видно различий для глаза в цвете, цвет указывает на номер фрагмента который декодируем в номер ПАРТ(тебе сделать подсвечивание рамки почти как ты это делаеш при выборе ПАРТ, нажатием мышки делать выбор и подсвечиваеш как у тебя это сделано)
Ну а если перемещать(непойму смысла зачем это делаеш) то запоминать координаты для каждого ПАРТ и подПАРТ
Собственно код
Код:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
smX=35; смещение главного окна(у тебя это выбора полигона)
smY=15
ImageX=300; эт размер картинки(у тебя окна выбора полигона)
ImageY=300
If OpenWindow(0, 0, 0, 700, 500, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; рисуем то что должно былть в редакторе, горы, моря,леса...
    If CreateImage(0, ImageX, ImageY) And StartDrawing(ImageOutput(0))
        ;это вместо оригинала на котором рисуеш
        Box(0, 0, 300, 300, RGB(255, 255, 255))
        Ellipse(150, 150, 100, 50 , 0):        Ellipse(200, 150, 50, 100 , 0)
        Ellipse(150, 150, 98, 48 , RGB(100,200,100)):Ellipse(200, 150, 48, 98 , RGB(100,200,100))
        For i=0 To 25000
            x=Random(200)+50: y=Random(200)+50
            c2=Random(100)+50
            If Point(x, y)=RGB(100,200,100)
                Box(x, y,2,2 , RGB(c2,c2,0))
            EndIf
        Next
       
        StopDrawing()
        ImageGadget(0, 0+smX, 0+smY, 300, 300, ImageID(0))
    EndIf
   
;тут рисуем только ПАРТ- цвета и граници для закраски(я вижу что у тебя граница черным и белым обрисована в редакторе)
    ;эту часть можно неотражать, она задает цвет по котором определяется номер ПАРТ
    ;вот тут и нужно указать и граници(для закраски филареа) и покрасить своим каждый ПАРТ
    If CreateImage(2, ImageX, ImageY) And StartDrawing(ImageOutput(2))
        Box(0, 0, 300, 300, RGB(255, 255, 255))
        Ellipse(150, 150, 100, 50 , 10);RGB(100,200,100))
        Ellipse(200, 150, 50, 100 , 10);RGB(100,200,100))
        Ellipse(150, 150, 98, 48 , RGB(100,200,100))
        Ellipse(200, 150, 48, 98 , RGB(100,200,100))
        StopDrawing()
ImageGadget(2, 380, 50, 300, 300, ImageID(2)); это можно закоментировать чтоб неотражалось
    EndIf
   
TextGadget(3, 0, 350, 300, 50, Str(x)+"*"+Str(y) )
 
    Repeat
        Event = WaitWindowEvent()
        x = WindowMouseX(0)
        y = WindowMouseY(0)
 
        StartDrawing(ImageOutput(2)); на этом изображении считываем "номер" полигона ПАРТ по цвету
        If x>=0+smX And x<=ImageX-1+smX;-1 нужна потому что пикселей всего 300, а графически начинается не с нля а с еденици, это чтобы Point неслетала
            If y>=0+smY And y<=ImageY-1+smY
                c=1
                ;Debug Str(x)+"*"+Str(y)+" "+Str(x-smX)+"*"+Str(y-smY)
                c=Point(x-smX, y-smY)
            Else
                c=0
            EndIf
        Else
            c=0
        EndIf
; далее какаято таблица где указаны номера полигонов и цветов у меня тут всего три поэтму изврата небудет и прогу понять проще
        Select c
            Case RGB(255, 255, 255); поле 1
                a$="part1  БЕЛОЕ поле"
            Case 10;-граница
                a$="part2b -ГРАНИЦА"
            Case RGB(100,200,100); поле 2
                  a$="part2  ЗЕЛЕНЬ"
            Case 0;-граница
                a$="ЗАГРАНИЦА"
        EndSelect
        StopDrawing()
        SetGadgetText(3, " мышка="+Str(x)+"*"+Str(y)+Chr(10)+"полигон="+a$+Chr(10)+"color=" +c)
       
    Until Event = #PB_Event_CloseWindow
EndIf
 


Думаю несложно понять.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Пн авг 06, 2018 8:07 pm 
Не в сети
док

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 134
Благодарил (а): 1 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
Чего означает spr4*2? Ты им задаеш маштаб в редакторе что над ним?

Если да,то может редактировать фрагмент в памяти ,а на экране в редакторе показывать только кусочек и в окне выбора ПАРТ, что слева прорисовывать уменьшеный вариант, там гдето есть изменение размера картинки, чтоб уменьшить и увеличить.

1 Короче есть файл1(скорее отдельный ПАРТ), его редактируеш.
2 делаем копию CopyImage и уменьшаем ResizeImage в файл2 его и отражаем в окне выбора ПАРТ
3 создаем файл3, копированием из файл1 только фрагмент который редактируем кажется этим GrabImage(эту непроверял, мож другую надо), потом увеличиваем ResizeImage файл3 и отражаем в редакторе, показав скролл. Теперь все что в редакторе редактируется его координаты(с учетом смещения координат редаткора и относительно файл1(главного)) делятся на коэфициент увеличения. Но всё координаты должны совпасть с исходным файл1, чтобы юзер нажал мишкой на увеличеном изображении (а мы отняли смещение и остаток поделили на каэф. увеличения) и пиксель нужного цвета по правильным координатам поставить на файл1, после чего сделать вышеперечисленые операции для того чтобы обновить на экране картинку с новыми пикселями.
по GrabImage есть примерчик, но неразбирал как работает, картинка должна быть шириной не более 200 пикселей по горизонтали так как перекрывает кнопку. И незабуть установить путь к картинке, формат БМП
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
If OpenWindow(0, 0, 0, 426, 128, "GrabImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ImageGadget(0, 0, 0, 128, 128, LoadImage(0, "...тут свой пулть к картинке\chauchau.bmp"))
    ButtonGadget(1, 138, 50, 150, 30, "Обрезка изо. ->>")
    ImageGadget(2, 298, 0, 128, 128, 0)
    Repeat
        Event = WaitWindowEvent()          
        If Event = #PB_Event_Gadget  
            Select EventGadget()
                Case 1
                    f = GrabImage(0, #PB_Any, 0, 0, 128, 64); Обрезка изображения
                    Debug f
                    SetGadgetState(2, ImageID(f))          ; Просмотр
            EndSelect
        EndIf
    Until Event = #PB_Event_CloseWindow
EndIf

К слову для отмены достаточно сохранять только файл1, а с палитрой я пока непонял как она устроена и как влияет на 3Д карту

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Пн авг 06, 2018 9:54 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1682
Откуда: Алматы
Благодарил (а): 14 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
да нет никакого 3д. это 2д графика. цветов 15 штук и 16 это прозрачный. соответственно нет никакой глубины и чего-там еще. обычные 2д картинки. 2д картинки, нарисованные в изометрии - как бы в глубь экрана.

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

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

а так-же нужная будет продвинутая система импорта изображения, чтобы изображение перегонялось в эти 15 цветов. эээ... каво 15! меньше! :) 9 цветов. первый и последний не изменяемые - первый прозрачный, последний черные. а все что между ними может меняться. другое дело что карта нужна как бы изометричная. порезанная на "страны" и с худо бедно видимым рельефом горных вершин :) то есть такую большую страну импортируешь, а программа сама потом разрежит на кусочки от 1х1 до 4х4 кубика по 8х8 пикселей, и расположит их в нужных координатах, чтоб игра потом могла построить это изображение.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Вт авг 07, 2018 2:59 am 
Не в сети
профессор

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Вт авг 07, 2018 12:36 pm 
Не в сети
док

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

Немогу понять как можно играть на одной ПАРТ у которой всего 64*64 пикселей и то это максимум(по крайней мере читал что выбирает юзер такое поле и на нем играет).
Слишком мелкая карта.
Граници в ПАРТ1Б и других ПАРТ с буквенным индексом-"Б" для игрушки нужны или для твоей проги. Файл region_parts.asm нужен для твоей проги или для игрушки.

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

Я так понял передвижение кусков(фрагментов и всего ПАРТ) нужно для создания новой карты, которая будет рисоваться дальше только немного скоректировав.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CompareMemory
СообщениеДобавлено: Вт авг 07, 2018 1:54 pm 
Не в сети
профессор

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

Изображение


что касается графики Б - когда диалог происходит - регионы отображены с 1 по 10. когда ты уже прошел брифинг и регионы начинают падать вниз - прорисовываются эти Б, то есть с 11 по 20 - дополнительные изображения, которые как бы придают эффект объемности регионам, подрисовывают к краям эффект высоты, пласта земли так сказать. на втором скрине видно, что под регионами коричневая широкая полоса. вот это Б часть графики для каждого региона.

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



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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3, 4  След.

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


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

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


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

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