|
|
Инвентарь
Материал из Blitz Et Cetera
Здрасьте. Сегодня я расскажу вам, как с помощью Blitz сделать инвентарь для вашей игры:
Инвентари бывают разные :). Мы будем делать один из самых простых, то есть размером n на m, в одну ячейку можно поместить только один предмет.
Для начало создадим файл БлицБейсика под любым именем, а затем создадим в той же директории ним папку и назовем её <Data>, в ней мы будем хранить данные о предметах инвентаря: В принципе, вы можете её и не делать и все картинки оставлять рядом с exe-файлом, но это не красиво. Вообще, по-хорошему, внутри этой папки нужно сделать папку для каждого типа предметов, например, для мечей, щитов, луков, доспехов и т. д. Начнем мы со следующих строчек:
Global DataDir$=SystemProperty$("appdir")+"Data\"
DataDir$=".\Data\"
Здесь мы создадим строковую переменную DataDir$, сделаем её глобальной и присвоим ей значение текущего каталога (то есть путь к нашей программе плюс нашу папку с данными - <Data> ).
Теперь займемся глобальными переменными:
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
|
|