Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; рисовка карты блоками из массива изображений
- Procedure DrawMap()
- ; расчет ячеек массива, откуда и докуда будут показаны в главном окне
- MAPLineLast = MAPLineFirst + 17 ; row per page !!!!!!!!!!!!!!!!!!!!!!
- MAPColumnLast = MAPColumnFirst + 20 ; column per page
- ; начало рисовки картинки в редакторе карты
- If StartDrawing(ImageOutput(#MAPCanvImg))
- ; рисует не всю карту, а только то, что будет видно в гаджете
- ; в зависимости от скроллбаров
- For mapx = MAPColumnFirst To MAPColumnLast
- For mapy = MAPLineFirst To MAPLineLast
- ; вычисление координат х у в куда надо рисовать какой-то блок
- x = (mapx - MAPColumnFirst) * 32
- y = (mapy - MAPLineFirst) * 32
- ; тут разделение на случай уже изменения какого-то блока
- ; типа если х у равны координатам куда я нарисовал новый блок в редакторе
- ; то рисовать выбранный. а если не равно - рисовать прочитанный
- ; из файла
- If mapx = NewEarthX And mapy = NewEarthY
- ; DrawImage - рисовать изображение
- ; ImageID - айди изображения
- ; MapIcons() - это массив всех блоков
- ; SelectEarthType - это номер блока, который был выбран для рисования
- DrawImage(ImageID(MapIcons(SelectEarthType)), x, y)
- ; если нам только чтение, то это можно выкинуть.
- ; просто у меня одна процедура рисует при загрузке карты и когда
- ; что-то рисуешь уже на карте
- Else
- ; MAPArray(mapy)\Column(mapx) - в данном случае читается номер блока
- ; из массива, то есть тот что записался в массив при чтении файла
- ; карты.
- DrawImage(ImageID(MAPArray(mapy)\Column(mapx)), x, y)
- EndIf
- Next
- Next
- StopDrawing()
- EndIf
- ; видимо надо запилить перерисовку квадрата экрана на миникарте
- If StartDrawing(ImageOutput(#MAPMiniIMGScreenBorder))
- ; сначала накладываем старое изображение
- DrawImage(ImageID(#MAPMiniIMG), 0, 0)
- ; теперь белые полоски экрана в зависимости от типа карты
- Select MAPType
- Case 33
- lx = (MAPColumnFirst - 1) * 4
- ly = (MAPLineFirst - 1) * 4
- Line(lx, ly, 84, 1, RGB(200, 200, 200)) ; 21 * 4
- Line(lx, ly + 72, 84, 1, RGB(200, 200, 200)) ; 18 * 4
- Line(lx, ly, 1, 72, RGB(200, 200, 200))
- Line(lx + 84, ly, 1, 73, RGB(200, 200, 200)) ; +1, так как внизу недоконца было
- Case 65
- lx = (MAPColumnFirst - 1) * 2
- ly = (MAPLineFirst - 1) * 2
- Line(lx, ly, 42, 1, RGB(200, 200, 200)) ; 21 * 4
- Line(lx, ly + 36, 42, 1, RGB(200, 200, 200)) ; 18 * 4
- Line(lx, ly, 1, 36, RGB(200, 200, 200))
- Line(lx + 42, ly, 1, 37, RGB(200, 200, 200))
- Case 129
- lx = (MAPColumnFirst - 1)
- ly = (MAPLineFirst - 1)
- Line(lx, ly, 21, 1, RGB(200, 200, 200)) ; 21 * 4
- Line(lx, ly + 18, 21, 1, RGB(200, 200, 200)) ; 18 * 4
- Line(lx, ly, 1, 18, RGB(200, 200, 200))
- Line(lx + 21, ly, 1, 19, RGB(200, 200, 200))
- EndSelect
- StopDrawing()
- ; выставление получившегося изображения в гаджет миникарты
- SetGadgetAttribute(#MAPMiniGadget, #PB_Canvas_Image, ImageID(#MAPMiniIMGScreenBorder))
- EndIf
- ; выставление получившегося изображения в главное окно редактора карты
- SetGadgetAttribute(#MAPCanv, #PB_Canvas_Image, ImageID(#MAPCanvImg))
- EndProcedure
- ; процедура получение цвета пикселя для миникарты в зависимости от типа блока
- Procedure.i GetMiniMAPPointColor(value.i)
- Select value
- Case 60 To 67, 80 To 99, 101, 102, 127 To 134, 136 To 138, 140, 144 To 159, 168, 172, 176 To 180, 184, 208, 209
- plotcolor = RGB(200,164,88) ; дефолтный песок, дюны
- Case 68 To 71, 181 To 183, 185 To 196, 200
- plotcolor = RGB(232,128,16) ; мало спайса
- Case 197 To 199, 201 To 207
- plotcolor = RGB(200,56,16) ; много спайса
- Case 100, 124 To 126, 135, 139, 141 To 143, 160 To 167, 169 To 171, 173 To 175
- plotcolor = RGB(128,92,16) ; гора, земля
- EndSelect
- ProcedureReturn plotcolor
- EndProcedure
- ; чтение файла карты
- ; path$ = понятно что путь до файла
- Procedure MAPParse(path$)
- ; обнуление массива
- ReDim MAPArray(0)
- ; выставление скролбаров в начало
- SetGadgetState(#MAPXScroll, 1)
- SetGadgetState(#MAPYScroll, 1)
- ; подготовка сетки массива в зависимости от размера файла
- Select FileSize(path$)
- Case 1024 ; 32x32
- ; форматирование массива 32 на 32 ячейки
- ReDim MAPArray(32)
- For i = 0 To 32
- ReDim MAPArray(i)\Column(32)
- Next
- ; выставление лимитов для скроллбаров
- SetGadgetAttribute(#MAPXScroll, #PB_ScrollBar_Maximum, 32)
- SetGadgetAttribute(#MAPYScroll, #PB_ScrollBar_Maximum, 32)
- ; тип карты для прочих процедур
- MAPType = 33
- Case 4096 ; 64x64
- ReDim MAPArray(64)
- For i = 0 To 64
- ReDim MAPArray(i)\Column(64)
- Next
- SetGadgetAttribute(#MAPXScroll, #PB_ScrollBar_Maximum, 64)
- SetGadgetAttribute(#MAPYScroll, #PB_ScrollBar_Maximum, 64)
- MAPType = 65
- Case 16384 ; 128x128
- ReDim MAPArray(128)
- For i = 0 To 128
- ReDim MAPArray(i)\Column(128)
- Next
- SetGadgetAttribute(#MAPXScroll, #PB_ScrollBar_Maximum, 128)
- SetGadgetAttribute(#MAPYScroll, #PB_ScrollBar_Maximum, 128)
- MAPType = 129
- EndSelect
- ; чтение самого файла карты
- If ReadFile(#MAPFile, path$)
- x = 1
- y = 1
- ; рисовка миникарты и чтение блоков в массив
- If StartDrawing(ImageOutput(#MAPMiniIMG))
- ; крутить в цикле, пока не дойдем до конца файла
- While Eof(#MAPFile) = 0
- ; читаем в массив номер блока из файла
- MAPArray(y)\Column(x) = ReadAsciiCharacter(#MAPFile)
- ; получаем цвет для миникарты
- plotcolor = GetMiniMAPPointColor(MAPArray(y)\Column(x))
- ; в зависимости от размера карты рисуем квадратик 1х1, 2х2 или 4х4
- Select MAPType
- Case 33
- Box((x-1)*4, (y-1)*4, 4, 4, plotcolor)
- Case 65
- Box((x-1)*2, (y-1)*2, 2, 2, plotcolor)
- Case 129
- Plot(x-1, y-1, plotcolor)
- EndSelect
- ; сдвиг реального номера блока на внутренний номер картинки редактора
- MAPArray(y)\Column(x) + #MAPBlock1
- ; сдвигаем координату х
- x + 1
- If x = MAPType
- ; если дошли до конца ширины 32, 64 или 128
- ; в зависимости от типа карты, то сдвигаем по высоте
- ; а саму Х возвращаем в начало
- y + 1
- x = 1
- EndIf
- Wend
- ; остановка рисовки
- StopDrawing()
- ; выставление получившегося изображения на миникарту
- SetGadgetAttribute(#MAPMiniGadget, #PB_Canvas_Image, ImageID(#MAPMiniIMG))
- EndIf
- ; закрыть файл
- CloseFile(#MAPFile)
- ; пометить, что при рисовке карты начиналось с левого верхнего угла
- MAPLineFirst = 1
- MAPColumnFirst = 1
- ; вызов процедуры рисовки карты
- DrawMap()
- EndIf
- EndProcedure
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement