Журнал о программированнии на языках Blitz3D, BlitzPlus, BlitzMax

Инвентарь

Материал из Blitz Et Cetera

Перейти к: навигация, поиск

Здрасьте. Сегодня я расскажу вам, как с помощью Blitz сделать инвентарь для вашей игры:

Инвентари бывают разные :). Мы будем делать один из самых простых, то есть размером n на m, в одну ячейку можно поместить только один предмет.

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

Global DataDir$=SystemProperty$("appdir")+"Data\"
DataDir$=".\Data\"

Здесь мы создадим строковую переменную DataDir$, сделаем её глобальной и присвоим ей значение текущего каталога (то есть путь к нашей программе плюс нашу папку с данными - <Data> ).

Изображение:Inventory2-Mouse.png Изображение:Inventory2-Item1.png Изображение:Inventory2-Item2.png Изображение:Inventory2-Item3.png Изображение:Inventory2-Item4.png

Теперь займемся глобальными переменными:

Global AplicationWidth,AplicationHeight,KolCell,SizeCellW,SizeCellH,KolCol,KolRow,InventarPozX,InventarPozY,MouseID

Теперь разберем для чего нужна каждая из этих переменных:


  • AplicationWidth, AplicationHeight - в этих переменных хранится значение высоты и ширины экрана, они нам понадобятся для вычисления координат инвентаря при различных разрешения экрана.
  • KolCell - нужно для хранения количества ячеек инвентаря
  • SizeCellW, SizeCellH - служат для хранения информации о размерности ячейки инвентаря (рекомендуется присваивать им значения высоты и ширины картинки объекта который будет в инвентаре)
  • KolCol,KolRow - служит для хранения количества столбцов и строк в инвентаре
  • InventarPozX,InventarPozY - служит для хранения координат начало рисования инвентаря.
  • MouseID - в этой переменной будет храниться ID (идентификатор объекта) предмета, который будет перемещаться с помощью мыши по инвентарю:

Далее мы задаем размерность экрана и указываем графический режим, в котором будем работать:

AplicationWidth=800 ;Ширина Экрана

AplicationHeight=600 ;Высота экрана

Graphics3D AplicationWidth,AplicationHeight, 32,2

SetBuffer BackBuffer()

Ну и наконец, начнем непосредственно описание программы:

MouseID=0  ;Обнуляем переменные

MouseStatus=0 ;Переменная для хранения статуса мыши, служит для определения была ли нажата кнопка мыши...
MouseImage=LoadImage(DataDir$+"Inventory2-Mouse.png") ;Загрузка курсора мыши...

MaskImage MouseImage,0,0,0 ;маска для мыши...

Теперь опишем тип TСell (Клетка), так как инвентарь у нас состоит из клеток, следовательно, логично будет сделать ее описание. Так как у клетки инвентаря множество информации, которую нужно хранить, мы и будем использовать тип. Опишем подробно TСell и все её данные:

Type TCell ; Тип клетки для инвенторя

  Field X ;Координа "Х" клетки
  Field Y ;Координа "У" клетки
  Field Status; Здесь хранится ID объекта, если его нет - значение = 0

End Type

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

KolCol=3               ;Количество столбцов

KolRow=3               ;Количество строк
KolCell=KolCol*KolRow  ;Количество ячеек

SizeCellW=80           ;Ширина ячейки
SizeCellH=80           ;Висота ячейки

InventarPozX=AplicationWidth-(KolCol*SizeCellW) ;Указываем откуда начинать рисовать инвентарь, координата "X"

InventarPozY=0                                  ;Указываем откуда начинать рисовать инвентарь, координата "Y"

Ну и, наконец, создаем массив, состоящий из нашего типа TCell, размерностью KolCell-1 (-1, так как в массивах нумерация начинается с 0, и если мы от KolCell не отнимем -1, то получится массив размерностью 10, а не 9)

Dim Inventar.TCell(KolCell-1)

Теперь приступим к описанию типа предметов инвентаря, я сделал все в одном типе, но это не совсем правильно и не очень красиво, хотя и проще и понятнее :) (Обычно нужно делать с помощью вложенных типов):

Type TObject    ; Тип для описания предметов инвентаря

            Field ID    ;  Идентификатор предмета
            Field Image ;  Переменная для картинки предмета
  Field Name$ ;  Название предмета
  Field Description$ ; Описание объекта
  Field Damage       ; Повреждения наносимые объектом (Только у оружия)
  Field Guard        ; Защита (только у щитов и у брони)

End Type

Далее заполним данные о мечах и щитах (вообще, такие вещи должны храниться в файле):

;------------------------ Мечи----1-99-----------------------

Sword.TObject=New TObject
Sword\Damage=10
Sword\ID=1
Sword\Image=LoadImage(DataDir$+"Inventory2-Item1.png")
MaskImage Sword\Image,255,0,255
Sword\Name$="Меч"
Sword\Description$="Меч был выкован неизвестным кузнецом. В общем, ничего особого он не стоит..."

Sword.TObject=New TObject
Sword\Damage=15
Sword\ID=2
Sword\Image=LoadImage(DataDir$+"Inventory2-Item2.png")
MaskImage Sword\Image,255,0,255
Sword\Name$="Меч-2"
Sword\Description$="Меч-2 был выкован Великим Мастером."
;------------------------ Щиты--100-199-------------------------
Shield.TObject=New TObject
Shield\Guard=3
Shield\ID=100
Shield\Image=LoadImage(DataDir$+"Inventory2-Item3.png")
MaskImage Shield\Image,255,0,255
Shield\Name$="Щит титана"
Shield\Description$="Щит принадлежал одному из титанов, не каждому воину под силу унести его..."

Shield.TObject=New TObject
Shield\Guard=5
Shield\ID=101
Shield\Image=LoadImage(DataDir$+"Inventory2-Item4.png")
MaskImage Shield\Image,255,0,255
Shield\Name$="Щит Дракона"

Shield\Description$="Щит, созданный из драконьей чешуи, один из лучших способов защиты от огня..."

Вы наверное заметили, что у мечей ID начинается с 1 а у щитов - со 100, Это сделано для того, чтобы ID предметов не пересекались, я предположил что в вашей игре больше 99 мечей не будет, если я ошибся, то просто измените начальное значение на тысячу и тогда уж точно ID никогда не пересекутся: Теперь установим шрифт:

FntArial=LoadFont("Arial",14)
SetFont FntArial

И, наконец, вызов первой функции InitInventar(). Процедура заполняет все клетки нулями и рассчитывает их координаты, а вообще здесь можно добавить загрузку данных для инвентаря из файла, чтобы при каждом запуске программы все вещи были на местах. Так как это совсем просто, я не стал писать, оставив вам возможность попрограммировать самим :). Код функций InitInventar() смотрите ниже.

Function InitInventar();Создаем инвентарь

K=0;
 For I=0 To KolRow-1
 For J=0 To KolCol-1
   Inventar.TCell(K)= New TCell
   Inventar.TCell(K)\X=InventarPozX+((SizeCellW-1)*J)
   Inventar.TCell(K)\Y=InventarPozY+((SizeCellH-1)*I)
   Inventar.TCell(K)\Status=0
   K=K+1
 Next
 Next

End Function

Ну и, наконец, мы дожили до основного цикла программы:

While Not KeyHit(1) ;Выход из программы если нажали Esc

SetBuffer BackBuffer()
Cls

    DrawInventar() ;Функция рисования инвентаря
    If KeyHit(2) Then AddElementToInventar(1,1) ;Если нажать на кнопку 1 то в инвентарь добавится меч
    If KeyHit(3) Then AddElementToInventar(2,2) ;Если нажать на кнопку 2 то в инвентарь добавится 2-ой меч
    If KeyHit(4) Then AddElementToInventar(1,100) ;Если нажать на кнопку 3 то в инвентарь добавится Щит титана
    If KeyHit(5) Then AddElementToInventar(2,101) ;Если нажать на кнопку 4 то в инвентарь добавится Щит Дракона

  If MouseDown(2) Then GetInfoInventar() ; По нажатию правой кнопки мыши на объекте, в инвентаре выводится информация об этом предмете

  If MouseDown(1)  Then MoveElementToInventar():MouseStatus=1 ; По нажатию левой - перемещение предмета
  If MouseStatus=2 Then AddElementToInventar(MouseDownInventar(),MouseID):MouseStatus=0 ;Если отпустили мышь с предметом, то он добавляется в инвентарь
  If MouseStatus<>0 Then MouseStatus=2 ; необходимо для того, чтобы отпущенный предмет добавился только один раз

  DrawImage MouseImage,MouseX(),MouseY() ;Рисуем курсор мыши

  Flip;
Wend

End

Теперь разберем все подробнее, начнем с DrawInventar(): это процедура нужна для прорисовки инвентаря, рассмотрим ее подробнее:

Function DrawInventar();Функция рисования инвентаря

 For I=0 To KolCell-1
   Rect(Inventar.TCell(I)\X,Inventar.TCell(I)\Y,SizeCellW,SizeCellH,0); Рисуем квадрат для инвентаря (здесь можно квадрат заменить на картинку)
   DrawElementInventar(Inventar.TCell(I)\Status,I);Функция рисования предметов инвентаря
 Next

End Function

В этой функции используется еще одна функция DrawElementInventar(), она рисует предметы инвентаря, ее код можно посмотреть ниже:

Function DrawElementInventar(ID,Element);Функция рисования предметов инвентаря

  If ID<>0 Then ;Если ячейка не пустая, то
    Temp.TObject=FindObjectInInventar(ID) ;Функция возвращает данные об объекте, который находится в ячейке
    DrawImage Temp\image,Inventar.TCell(Element)\X,Inventar.TCell(Element)\Y ;Рисуем предмет из инвентаря
  EndIf

End Function

В этой функции использовалась функция FindObjectInInventar() она возвращает данные об объекте, который находится в ячейке, код её смотрите ниже:

Function FindObjectInInventar.TObject(ID) ;Функция возвращает данные об объекте, который находится в ячейке.

If (ID>=1) And (ID<=99) Then ;Если ID (идентификатор объекта) попал в интервал от 1 до 99 то это меч
  Sword.TObject = First TObject ; Устанавливаем список мечей на первый меч
    For Sword.TObject= Each TObject ;Перебираем все мечи в поисках нужного
       Temp=Sword\ID ;Присваиваем переменной Temp ID перебираемого объекта
       If Temp =ID Then Return Sword: Exit ; Смотрим: если ID (Temp) = ID искомого предмета, то возвращаем о нем данные и выходим из цикла
    Next
  EndIf
  If (ID>=100) And (ID<=199) Then ;Если ID (идентификатор объекта) попал в интервал от 100 до 199, то это щит
  Shield.TObject = First TObject ;Устанавливаем список щитов на первый щит
    For Shield.TObject= Each TObject;Перебираем все щиты в поисках нужного
       Temp=Shield\ID  ;Присваеваем переменной Temp ID перебираемого объекта
       If Temp =ID Then Return Shield: Exit ;Смотрим, если ID (Temp) = ID искомого предмета, то возвращаем о нем данные и выходим из цикла
    Next
  EndIf
  ; Можно добавить и еще подобные проверки, если у вас больше предметов...

End Function

Далее, рассмотрим следующую строчку из основного цикла программы: If KeyHit(2) Then AddElementToInventar(1,1). Значит, при нажатии на кнопку, в инвентарь добавляется предмет с помощью процедуры AddElementToInventar, давайте рассмотрим её более подробно:

Function AddElementToInventar(Poz,ID); Функция добавляет предмет в инвентарь, Poz-в какую ячейку, ID-какой предмет

    TempEmptyCell=FindEmptyCellInInventar(); Поиск свободной клетки
  If Poz=-1   Then Poz=TempEmptyCell; Если предмет вы бросаете вне клеток инвентаря, то предмет попадет в первую свободную клетку
    Temp=Inventar.TCell(Poz)\Status ;Здесь запоминается идентификатор (ID) предмета в клетке
    If TempEmptyCell>=0 Then ; смотрим, есть ли пустые клетки, если есть, то идем дальше
      If Temp<>0 Then ; Если клетка не пустая, то
        Inventar.TCell(TempEmptyCell)\Status=ID ; присваиваем предмет найденной пустой клетке
        MouseID=0 ; Указываем, что предмет опущен в клетку и мышь пустая
      EndIf
      If Temp=0 Then  ; Если клетка пустая,
        Inventar.TCell(Poz)\Status=ID ;то присваиваем предмет текущей клетке
        MouseID=0 ; Указываем, что предмет опущен в клетку и мышь пустая
      EndIf
    Else Text 10,10,"Инвентарь переполнен"
    EndIf

End Function

В этой функции использовалась функция FindEmptyCellInInventar(), она возвращает номер первой попавшейся свободной ячейки, код её смотрите ниже:

Function FindEmptyCellInInventar();Ищет первую свободную ячейку в инвентаре

  For I=0 To KolCell-1
    If Inventar.TCell(I)\Status=0 Then  Return I:Exit ;Перебираем все клетки в поисках пустой, если нашли, то возвращаем её номер и выходим...
  Next
   Return -1 ;Если нет пустых клеток то, возвращаем -1

End Function

Далее рассмотрим следующую строчку из основного цикла программы: If MouseDown(2) Then GetInfoInventar(). Эта функция по нажатию правой кнопки мыши на объекте в инвентаре выводит информацию об этом предмете, код её смотрите ниже:

Function GetInfoInventar(); По нажатию правой кнопки мыши на объекте, в инвентаре выводится информация об этом предмете

  For I=0 To KolCell-1
    ID=Inventar.TCell(I)\Status ; Перебираем все клетки и смотрим ID объектов клетки
    If (ID<>0) And (MouseOverlap(Inventar.TCell(I)\X,Inventar.TCell(I)\Y,Inventar.TCell(I)\X+SizeCellW,Inventar.TCell(I)\Y+SizeCellH)=True) Then  ; Смотрим: если клетка не пустая и мышь находится над этой клеткой, то
      TempDan.TObject=FindObjectInInventar(ID)         ; Ищем данные об объекте
      Text 0,10, TempDan\Name$    ; Выводим название объекта
      Text 0,30, TempDan\Description$ ;Описание объекта
      If TempDan\ID<=99 Then Text 0,50,"Урон:"+TempDan\Damage ;Если это оружие, значит выводим значение урона
      If TempDan\ID>=100 And TempDan\ID<=199 Then Text 0,50,"Защита:"+TempDan\Guard   ;Если это щит, значит выводим значение защиты
    EndIf
  Next

End Function

В этой функции использовалась функция MouseOverlap(X,Y,X1,Y1), X,Y-начало прямоугольника, X1,Y1-нижняя правая граница прямоугольника, она возвращает номер первой попавшейся свободной ячейки, код её смотрите ниже:

Function MouseOverlap(X,Y,X1,Y1) ; Функция возвращает TRUE, если мышка попадает в квадрат и False, если не попадает

  If (MouseX()>X) And (MouseX()<X1) And  (MouseY()>Y) And (MouseY()<Y1) Then Return True Else  Return False

End Function

Далее расмотрим следующую строчку из основного цикла программы: If MouseDown(1) Then MoveElementToInventar():MouseStatus=1. Если вы нажали левую кнопку мыши на предмете и держите её, то выполняется MoveElementToInventar() (перемещение предмета), код её смотрите ниже:

Function MoveElementToInventar();перемещение предмета

  Poz=MouseDownInventar(); Смотрим, где взяли предмет (в какой ячейке)
  If (Poz>=0) Or (MouseID<>0)Then ;Проверяем, чтобы предмет брался из инвентаря или мышь была не пустая
    If MouseID=0 Then   ID=Inventar.TCell(Poz)\Status ; Если мышь пустая, то берем ID предмета в текущей клетке
    If  ID<>0 Then MouseID=ID: DeleteElementToInventar(Poz) ; Если предмет есть в клетке, то мышь берет его и клетка очищается
    If (MouseID<>0) Then     ; Если мышь не пустая, то
      Temp.TObject=FindObjectInInventar(MouseID) ; ищем данные объекта по ID, который, у нас в мыши
      DrawImage Temp\image,MouseX()-SizeCellW/2,MouseY()-SizeCellH/2 ; Рисуем картинку объекта вместе с мышью...
    EndIf
  EndIf

End Function

В этой функций использовались две функции: DeleteElementToInventar(Poz), Poz - номер клетки, в которой нужно удалить объект, эта функция удаляет из инвентаря предмет в заданной клетке, код её смотрите ниже:

Function DeleteElementToInventar(Poz); Удаление  предмета из инвентаря

   Temp=Inventar.TCell(Poz)\Status ; Сохраняем в переменную значение клетки
   If Temp<>0 Then Inventar.TCell(Poz)\Status=0; Смотрим, если клетка не пустая, то делаем ее пустой

End Function

Следующая функция MouseDownInventar() смотрит, в какой ячейке находится мышь, код её смотрите ниже:

Function MouseDownInventar(); смотрим в какой ячейке находится мышь

  For I=0 To KolCell-1
    If (MouseOverlap(Inventar.TCell(I)\X,Inventar.TCell(I)\Y,Inventar.TCell(I)\X+SizeCellW,Inventar.TCell(I)\Y+SizeCellH)=True) Then; Смотрим где находится мышь и если она попадает в клетку инвентаря, возвращаем его номер и выходим
     Return I:Exit
    EndIf
  Next
  Return -1 ; Если мышь не попадает ни в одну клетку

End Function

Полный код:

Global DataDir$=SystemProperty$("appdir")+"Data\"

DataDir$=".\Data\"

Global AplicationWidth,AplicationHeight,KolCell,SizeCellW,SizeCellH,KolCol,KolRow,InventarPozX,InventarPozY,MouseID

AplicationWidth=800 ;Ширина Экрана
AplicationHeight=600 ;Высота экрана

Graphics3D AplicationWidth,AplicationHeight, 32,2
SetBuffer BackBuffer()

MouseID=0  ;Обнуляем переменные
MouseStatus=0 ;Переменная для хранения статуса мыши, служит для определения была ли нажата кнопка мыши...
MouseImage=LoadImage(DataDir$+"Inventory2-Mouse.png") ;Загрузка курсора мыши...
MaskImage MouseImage,0,0,0 ;маска для мыши...

Type TCell ; Тип клетки для инвенторя
 Field X ;Координа "Х" клетки
 Field Y ;Координа "У" клетки
 Field Status; Здесь хранится ID объекта, если его нет - значение = 0
End Type

KolCol=3               ;Количество столбцов
KolRow=3               ;Количество строк
KolCell=KolCol*KolRow  ;Количество ячеек

SizeCellW=80           ;Ширина ячейки
SizeCellH=80           ;Висота ячейки

InventarPozX=AplicationWidth-(KolCol*SizeCellW) ;Указываем откуда начинать рисовать инвентарь, координата "X"
InventarPozY=0                                  ;Указываем откуда начинать рисовать инвентарь, координата "Y"

Dim Inventar.TCell(KolCell-1)

Type TObject    ; Тип для описания предметов инвентаря
            Field ID    ;  Идентификатор предмета
            Field Image ;  Переменная для картинки предмета
  Field Name$ ;  Название предмета
  Field Description$ ; Описание объекта
  Field Damage       ; Повреждения наносимые объектом (Только у оружия)
  Field Guard        ; Защита (только у щитов и у брони)
End Type

;------------------------ Мечи----1-99-----------------------
Sword.TObject=New TObject
Sword\Damage=10
Sword\ID=1
Sword\Image=LoadImage(DataDir$+"Inventory2-Item1.png")
MaskImage Sword\Image,255,0,255
Sword\Name$="Меч"
Sword\Description$="Меч был выкован неизвестным кузнецом. В общем, ничего особого он не стоит..."

Sword.TObject=New TObject
Sword\Damage=15
Sword\ID=2
Sword\Image=LoadImage(DataDir$+"Inventory2-Item2.png")
MaskImage Sword\Image,255,0,255
Sword\Name$="Меч-2"
Sword\Description$="Меч-2 был выкован Великим Мастером."
;------------------------ Щиты--100-199-------------------------
Shield.TObject=New TObject
Shield\Guard=3
Shield\ID=100
Shield\Image=LoadImage(DataDir$+"Inventory2-Item3.png")
MaskImage Shield\Image,255,0,255
Shield\Name$="Щит титана"
Shield\Description$="Щит принадлежал одному из титанов, не каждому воину под силу унести его..."

Shield.TObject=New TObject
Shield\Guard=5
Shield\ID=101
Shield\Image=LoadImage(DataDir$+"Inventory2-Item4.png")
MaskImage Shield\Image,255,0,255
Shield\Name$="Щит Дракона"
Shield\Description$="Щит, созданный из драконьей чешуи, один из лучших способов защиты от огня..."

FntArial=LoadFont("Arial",14)
SetFont FntArial

InitInventar()

While Not KeyHit(1) ;Выход из программы если нажали Esc
SetBuffer BackBuffer()
Cls

    DrawInventar() ;Функция рисования инвентаря
    If KeyHit(2) Then AddElementToInventar(1,1) ;Если нажать на кнопку 1 то в инвентарь добавится меч
    If KeyHit(3) Then AddElementToInventar(2,2) ;Если нажать на кнопку 2 то в инвентарь добавится 2-ой меч
    If KeyHit(4) Then AddElementToInventar(1,100) ;Если нажать на кнопку 3 то в инвентарь добавится Щит титана
    If KeyHit(5) Then AddElementToInventar(2,101) ;Если нажать на кнопку 4 то в инвентарь добавится Щит Дракона

 If MouseDown(2) Then GetInfoInventar() ; По нажатию правой кнопки мыши на объекте, в инвентаре выводится информация об этом предмете

 If MouseDown(1)  Then MoveElementToInventar():MouseStatus=1 ; По нажатию левой - перемещение предмета
 If MouseStatus=2 Then AddElementToInventar(MouseDownInventar(),MouseID):MouseStatus=0 ;Если отпустили мышь с предметом, то он добавляется в инвентарь
 If MouseStatus<>0 Then MouseStatus=2 ; необходимо для того, чтобы отпущенный предмет добавился только один раз

 DrawImage MouseImage,MouseX(),MouseY() ;Рисуем курсор мыши

 Flip;
Wend

End

Function InitInventar();Создаем инвентарь
K=0;
 For I=0 To KolRow-1
 For J=0 To KolCol-1
   Inventar.TCell(K)= New TCell
   Inventar.TCell(K)\X=InventarPozX+((SizeCellW-1)*J)
   Inventar.TCell(K)\Y=InventarPozY+((SizeCellH-1)*I)
   Inventar.TCell(K)\Status=0
   K=K+1
 Next
 Next
End Function

Function DrawInventar();Функция рисования инвентаря
 For I=0 To KolCell-1
   Rect(Inventar.TCell(I)\X,Inventar.TCell(I)\Y,SizeCellW,SizeCellH,0); Рисуем квадрат для инвентаря (здесь можно квадрат заменить на картинку)
   DrawElementInventar(Inventar.TCell(I)\Status,I);Функция рисования предметов инвентаря
 Next
End Function

Function DrawElementInventar(ID,Element);Функция рисования предметов инвентаря
  If ID<>0 Then ;Если ячейка не пустая, то
    Temp.TObject=FindObjectInInventar(ID) ;Функция возвращает данные об объекте, который находится в ячейке
    DrawImage Temp\image,Inventar.TCell(Element)\X,Inventar.TCell(Element)\Y ;Рисуем предмет из инвентаря
  EndIf
End Function

Function FindObjectInInventar.TObject(ID) ;Функция возвращает данные об объекте, который находится в ячейке.
If (ID>=1) And (ID<=99) Then ;Если ID (идентификатор объекта) попал в интервал от 1 до 99 то это меч
  Sword.TObject = First TObject ; Устанавливаем список мечей на первый меч
   For Sword.TObject= Each TObject ;Перебираем все мечи в поисках нужного
       Temp=Sword\ID ;Присваиваем переменной Temp ID перебираемого объекта
       If Temp =ID Then Return Sword: Exit ; Смотрим: если ID (Temp) = ID искомого предмета, то возвращаем о нем данные и выходим из цикла
    Next
  EndIf
  If (ID>=100) And (ID<=199) Then ;Если ID (идентификатор объекта) попал в интервал от 100 до 199, то это щит
  Shield.TObject = First TObject ;Устанавливаем список щитов на первый щит
   For Shield.TObject= Each TObject;Перебираем все щиты в поисках нужного
       Temp=Shield\ID  ;Присваеваем переменной Temp ID перебираемого объекта
       If Temp =ID Then Return Shield: Exit ;Смотрим, если ID (Temp) = ID искомого предмета, то возвращаем о нем данные и выходим из цикла
    Next
  EndIf
  ; Можно добавить и еще подобные проверки, если у вас больше предметов...
End Function

Function AddElementToInventar(Poz,ID); Функция добавляет предмет в инвентарь, Poz-в какую ячейку, ID-какой предмет
    TempEmptyCell=FindEmptyCellInInventar(); Поиск свободной клетки
  If Poz=-1   Then Poz=TempEmptyCell; Если предмет вы бросаете вне клеток инвентаря, то предмет попадет в первую свободную клетку
    Temp=Inventar.TCell(Poz)\Status ;Здесь запоминается идентификатор (ID) предмета в клетке
    If TempEmptyCell>=0 Then ; смотрим, есть ли пустые клетки, если есть, то идем дальше
      If Temp<>0 Then ; Если клетка не пустая, то
        Inventar.TCell(TempEmptyCell)\Status=ID ; присваиваем предмет найденной пустой клетке
        MouseID=0 ; Указываем, что предмет опущен в клетку и мышь пустая
      EndIf
      If Temp=0 Then  ; Если клетка пустая,
        Inventar.TCell(Poz)\Status=ID ;то присваиваем предмет текущей клетке
        MouseID=0 ; Указываем, что предмет опущен в клетку и мышь пустая
      EndIf
    Else Text 10,10,"Инвентарь переполнен"
    EndIf
End Function

Function FindEmptyCellInInventar();Ищет первую свободную ячейку в инвентаре
  For I=0 To KolCell-1
    If Inventar.TCell(I)\Status=0 Then  Return I:Exit ;Перебираем все клетки в поисках пустой, если нашли, то возвращаем её номер и выходим...
  Next
   Return -1 ;Если нет пустых клеток то, возвращаем -1
End Function

Function GetInfoInventar(); По нажатию правой кнопки мыши на объекте, в инвентаре выводится информация об этом предмете
  For I=0 To KolCell-1
    ID=Inventar.TCell(I)\Status ; Перебираем все клетки и смотрим ID объектов клетки
    If (ID<>0) And (MouseOverlap(Inventar.TCell(I)\X,Inventar.TCell(I)\Y,Inventar.TCell(I)\X+SizeCellW,Inventar.TCell(I)\Y+SizeCellH)=True) Then  ; Смотрим: если клетка не пустая и мышь находится над этой клеткой, то
     TempDan.TObject=FindObjectInInventar(ID)         ; Ищем данные об объекте
     Text 0,10, TempDan\Name$    ; Выводим название объекта
     Text 0,30, TempDan\Description$ ;Описание объекта
     If TempDan\ID<=99 Then Text 0,50,"Урон:"+TempDan\Damage ;Если это оружие, значит выводим значение урона
     If TempDan\ID>=100 And TempDan\ID<=199 Then Text 0,50,"Защита:"+TempDan\Guard   ;Если это щит, значит выводим значение защиты
    EndIf
  Next
End Function

Function MouseOverlap(X,Y,X1,Y1) ; Функция возвращает TRUE, если мышка попадает в квадрат и False, если не попадает
  If (MouseX()>X) And (MouseX()<X1) And  (MouseY()>Y) And (MouseY()<Y1) Then Return True Else  Return False
End Function

Function MoveElementToInventar();перемещение предмета
  Poz=MouseDownInventar(); Смотрим, где взяли предмет (в какой ячейке)
  If (Poz>=0) Or (MouseID<>0)Then ;Проверяем, чтобы предмет брался из инвентаря или мышь была не пустая
    If MouseID=0 Then   ID=Inventar.TCell(Poz)\Status ; Если мышь пустая, то берем ID предмета в текущей клетке
    If  ID<>0 Then MouseID=ID: DeleteElementToInventar(Poz) ; Если предмет есть в клетке, то мышь берет его и клетка очищается
    If (MouseID<>0) Then     ; Если мышь не пустая, то
      Temp.TObject=FindObjectInInventar(MouseID) ; ищем данные объекта по ID, который, у нас в мыши
      DrawImage Temp\image,MouseX()-SizeCellW/2,MouseY()-SizeCellH/2 ; Рисуем картинку объекта вместе с мышью...
    EndIf
  EndIf
End Function

Function DeleteElementToInventar(Poz); Удаление  предмета из инвентаря
   Temp=Inventar.TCell(Poz)\Status ; Сохраняем в переменную значение клетки
   If Temp<>0 Then Inventar.TCell(Poz)\Status=0; Смотрим, если клетка не пустая, то делаем ее пустой
End Function

Function MouseDownInventar(); смотрим в какой ячейке находится мышь
  For I=0 To KolCell-1
    If (MouseOverlap(Inventar.TCell(I)\X,Inventar.TCell(I)\Y,Inventar.TCell(I)\X+SizeCellW,Inventar.TCell(I)\Y+SizeCellH)=True) Then; Смотрим где находится мышь и если она попадает в клетку инвентаря, возвращаем его номер и выходим
     Return I:Exit
    EndIf
  Next
  Return -1 ; Если мышь не попадает ни в одну клетку

End Function

Автор: WaReZ_MEN

Другие

Друзья