Advertisement
Guest User

MAP

a guest
Aug 19th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. ; рисовка карты блоками из массива изображений
  3. Procedure DrawMap()
  4.  
  5.   ; расчет ячеек массива, откуда и докуда будут показаны в главном окне
  6.   MAPLineLast   = MAPLineFirst   + 17 ; row per page    !!!!!!!!!!!!!!!!!!!!!!
  7.   MAPColumnLast = MAPColumnFirst + 20 ; column per page
  8.  
  9.   ; начало рисовки картинки в редакторе карты
  10.   If StartDrawing(ImageOutput(#MAPCanvImg))
  11.    
  12.     ; рисует не всю карту, а только то, что будет видно в гаджете
  13.     ; в зависимости от скроллбаров
  14.     For mapx = MAPColumnFirst To MAPColumnLast
  15.       For mapy = MAPLineFirst To MAPLineLast
  16.         ; вычисление координат х у в куда надо рисовать какой-то блок
  17.         x = (mapx - MAPColumnFirst) * 32
  18.         y = (mapy - MAPLineFirst) * 32
  19.         ; тут разделение на случай уже изменения какого-то блока
  20.         ; типа если х у равны координатам куда я нарисовал новый блок в редакторе
  21.         ; то рисовать выбранный. а если не равно - рисовать прочитанный
  22.         ; из файла
  23.         If mapx = NewEarthX And mapy = NewEarthY
  24.           ; DrawImage  - рисовать изображение
  25.           ; ImageID    - айди изображения
  26.           ; MapIcons() - это массив всех блоков
  27.           ; SelectEarthType - это номер блока, который был выбран для рисования
  28.           DrawImage(ImageID(MapIcons(SelectEarthType)), x, y)
  29.           ; если нам только чтение, то это можно выкинуть.
  30.           ; просто у меня одна процедура рисует при загрузке карты и когда
  31.           ; что-то рисуешь уже на карте
  32.         Else
  33.           ; MAPArray(mapy)\Column(mapx) - в данном случае читается номер блока
  34.           ; из массива, то есть тот что записался в массив при чтении файла
  35.           ; карты.
  36.           DrawImage(ImageID(MAPArray(mapy)\Column(mapx)), x, y)
  37.         EndIf
  38.       Next
  39.     Next
  40.    
  41.     StopDrawing()
  42.    
  43.   EndIf
  44.  
  45.   ; видимо надо запилить перерисовку квадрата экрана на миникарте
  46.   If StartDrawing(ImageOutput(#MAPMiniIMGScreenBorder))
  47.    
  48.     ; сначала накладываем старое изображение
  49.     DrawImage(ImageID(#MAPMiniIMG), 0, 0)
  50.    
  51.     ; теперь белые полоски экрана в зависимости от типа карты
  52.     Select MAPType
  53.       Case 33
  54.         lx = (MAPColumnFirst - 1) * 4
  55.         ly = (MAPLineFirst - 1) * 4
  56.         Line(lx, ly, 84, 1, RGB(200, 200, 200))      ; 21 * 4
  57.         Line(lx, ly + 72, 84, 1, RGB(200, 200, 200)) ; 18 * 4
  58.         Line(lx, ly, 1, 72, RGB(200, 200, 200))
  59.         Line(lx + 84, ly, 1, 73, RGB(200, 200, 200)) ; +1, так как внизу недоконца было
  60.        
  61.       Case 65
  62.         lx = (MAPColumnFirst - 1) * 2
  63.         ly = (MAPLineFirst - 1) * 2
  64.         Line(lx, ly, 42, 1, RGB(200, 200, 200))      ; 21 * 4
  65.         Line(lx, ly + 36, 42, 1, RGB(200, 200, 200)) ; 18 * 4
  66.         Line(lx, ly, 1, 36, RGB(200, 200, 200))
  67.         Line(lx + 42, ly, 1, 37, RGB(200, 200, 200))
  68.        
  69.       Case 129
  70.         lx = (MAPColumnFirst - 1)
  71.         ly = (MAPLineFirst - 1)
  72.         Line(lx, ly, 21, 1, RGB(200, 200, 200))      ; 21 * 4
  73.         Line(lx, ly + 18, 21, 1, RGB(200, 200, 200)) ; 18 * 4
  74.         Line(lx, ly, 1, 18, RGB(200, 200, 200))
  75.         Line(lx + 21, ly, 1, 19, RGB(200, 200, 200))
  76.        
  77.     EndSelect
  78.    
  79.     StopDrawing()
  80.    
  81.     ; выставление получившегося изображения в гаджет миникарты
  82.     SetGadgetAttribute(#MAPMiniGadget, #PB_Canvas_Image, ImageID(#MAPMiniIMGScreenBorder))
  83.    
  84.   EndIf  
  85.  
  86.   ; выставление получившегося изображения в главное окно редактора карты
  87.   SetGadgetAttribute(#MAPCanv, #PB_Canvas_Image, ImageID(#MAPCanvImg))
  88.  
  89. EndProcedure
  90.  
  91. ; процедура получение цвета пикселя для миникарты в зависимости от типа блока
  92. Procedure.i GetMiniMAPPointColor(value.i)
  93.  
  94.       Select value
  95.          
  96.         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
  97.           plotcolor = RGB(200,164,88) ; дефолтный песок, дюны
  98.  
  99.         Case 68 To 71, 181 To 183, 185 To 196, 200
  100.           plotcolor = RGB(232,128,16) ; мало спайса          
  101.          
  102.         Case 197 To 199, 201 To 207
  103.           plotcolor = RGB(200,56,16) ; много спайса          
  104.          
  105.         Case 100, 124 To 126, 135, 139, 141 To 143, 160 To 167, 169 To 171, 173 To 175
  106.           plotcolor = RGB(128,92,16) ; гора, земля
  107.          
  108.       EndSelect
  109.  
  110.   ProcedureReturn plotcolor
  111.  
  112. EndProcedure
  113.  
  114. ; чтение файла карты
  115. ; path$ = понятно что путь до файла
  116. Procedure MAPParse(path$)
  117.  
  118.   ; обнуление массива
  119.   ReDim MAPArray(0)
  120.  
  121.   ; выставление скролбаров в начало
  122.   SetGadgetState(#MAPXScroll, 1)
  123.   SetGadgetState(#MAPYScroll, 1)
  124.  
  125.   ; подготовка сетки массива в зависимости от размера файла
  126.   Select FileSize(path$)
  127.     Case  1024 ;  32x32
  128.       ; форматирование массива 32 на 32 ячейки
  129.       ReDim MAPArray(32)
  130.       For i = 0 To 32
  131.         ReDim MAPArray(i)\Column(32)
  132.       Next
  133.       ; выставление лимитов для скроллбаров
  134.       SetGadgetAttribute(#MAPXScroll, #PB_ScrollBar_Maximum, 32)
  135.       SetGadgetAttribute(#MAPYScroll, #PB_ScrollBar_Maximum, 32)
  136.       ; тип карты для прочих процедур
  137.       MAPType = 33
  138.  
  139.     Case  4096 ;  64x64
  140.       ReDim MAPArray(64)
  141.       For i = 0 To 64
  142.         ReDim MAPArray(i)\Column(64)
  143.       Next
  144.       SetGadgetAttribute(#MAPXScroll, #PB_ScrollBar_Maximum, 64)
  145.       SetGadgetAttribute(#MAPYScroll, #PB_ScrollBar_Maximum, 64)
  146.       MAPType = 65
  147.      
  148.     Case 16384 ; 128x128
  149.       ReDim MAPArray(128)
  150.       For i = 0 To 128
  151.         ReDim MAPArray(i)\Column(128)
  152.       Next
  153.       SetGadgetAttribute(#MAPXScroll, #PB_ScrollBar_Maximum, 128)
  154.       SetGadgetAttribute(#MAPYScroll, #PB_ScrollBar_Maximum, 128)
  155.       MAPType = 129
  156.      
  157.      
  158.   EndSelect
  159.  
  160.   ; чтение самого файла карты
  161.   If ReadFile(#MAPFile, path$)
  162.     x   = 1
  163.     y   = 1
  164.    
  165.     ; рисовка миникарты и чтение блоков в массив
  166.     If StartDrawing(ImageOutput(#MAPMiniIMG))
  167.      
  168.       ; крутить в цикле, пока не дойдем до конца файла
  169.       While Eof(#MAPFile) = 0
  170.        
  171.         ; читаем в массив номер блока из файла
  172.         MAPArray(y)\Column(x) = ReadAsciiCharacter(#MAPFile)
  173.        
  174.         ; получаем цвет для миникарты
  175.         plotcolor = GetMiniMAPPointColor(MAPArray(y)\Column(x))
  176.        
  177.         ; в зависимости от размера карты рисуем квадратик 1х1, 2х2 или 4х4
  178.         Select MAPType
  179.           Case 33
  180.             Box((x-1)*4, (y-1)*4, 4, 4, plotcolor)
  181.           Case 65
  182.             Box((x-1)*2, (y-1)*2, 2, 2, plotcolor)
  183.           Case 129
  184.             Plot(x-1, y-1, plotcolor)
  185.         EndSelect
  186.        
  187.         ; сдвиг реального номера блока на внутренний номер картинки редактора
  188.         MAPArray(y)\Column(x) + #MAPBlock1
  189.        
  190.         ; сдвигаем координату х
  191.         x + 1
  192.         If x = MAPType
  193.           ; если дошли до конца ширины 32, 64 или 128
  194.           ; в зависимости от типа карты, то сдвигаем по высоте
  195.           ; а саму Х возвращаем в начало
  196.           y + 1
  197.           x = 1
  198.         EndIf
  199.  
  200.       Wend
  201.      
  202.       ; остановка рисовки
  203.       StopDrawing()
  204.      
  205.       ; выставление получившегося изображения на миникарту
  206.       SetGadgetAttribute(#MAPMiniGadget, #PB_Canvas_Image, ImageID(#MAPMiniIMG))
  207.    
  208.     EndIf
  209.    
  210.     ; закрыть файл
  211.     CloseFile(#MAPFile)
  212.    
  213.     ; пометить, что при рисовке карты начиналось с левого верхнего угла
  214.     MAPLineFirst   = 1
  215.     MAPColumnFirst = 1
  216.    
  217.     ; вызов процедуры рисовки карты    
  218.     DrawMap()
  219.    
  220.   EndIf
  221.  
  222. EndProcedure
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement