вторник, 29 мая 2012 г.

Создание редактора карт. Часть 3 - создаём функцию для управления редактором.

Продолжим нашу серию уроков.

Сейчас начнём создавать функцию, которая позволит нам управлять редактором карт.

Разместите где-нибудь в исходном коде текст:

function controls()


end function


Это будет заготовка для нашей функции.



Как же мы будем управлять редактором? Всё просто. С помощью нажатии определённой комбинации клавиш (в моём простом редакторе - от 0 до 9), "кисти" присвоится особое значение, которое присвоится тайлу, при нажатии на него курсором.

Для этого используем инструкцию:

if keydown(key_X) current_tile = X, где X - номер нажатой клавиши.

Пропишем этот код в функции для всех 10 клавиш.

if keydown(key_0) current_tile = 0
if keydown(key_1) current_tile = 1
...
if keydown(key_9) current_tile = 9

Функция keydown(X) проверяет, нажата ли клавиша Х, если клавиша нажата - возвращает 1.

Также добавим код, который позволит присвоить ячейке массива (тайлу) map[x,y] значение, равное "кисти" при нажатии на тайл.


If (MouseDown(1) And MouseX()>0 And MouseY()>0 And MouseX()<g_screen_width And MouseY()<g_screen_heigth)
map[Int(MouseX()/40),Int(MouseY()/40)]=current_tile
EndIf


В условии проверяется, нажата ли мышь на окне редактора, в котором отрисована сетка. Если да - то элементу массива карты присваивается значение current_tile.
Int(Х) - возвращает целое число от Х. MouseX()/40 - возвращает текущее положение курсора мыши по оси Х, делённое на сорок. То же самое и с MouseY()/40.

Если вам непонятно, как всё это связано между собой, то почитайте вступление, там описан принцип работы карты.

Добавим напоследок код:

If KeyDown(key_s) savemap()


Savemap() - функция, сохраняющая карту в текстовый файл. Её мы создадим позднее.

Весь исходный код функции controls():


Function controls()
If KeyDown(key_0) current_tile = 0
If KeyDown(key_1) current_tile = 1
If KeyDown(key_2) current_tile = 2
If KeyDown(key_3) current_tile = 3
If KeyDown(key_4) current_tile = 4
If KeyDown(key_5) current_tile = 5
If KeyDown(key_6) current_tile = 6
If KeyDown(key_7) current_tile = 7
If KeyDown(key_8) current_tile = 8
If KeyDown(key_9) current_tile = 9
If MouseDown(1) And MouseX()>0 And MouseY()>0 And MouseX()<g_screen_width And MouseY()<g_screen_heigth
map[Int(MouseX()/40),Int(MouseY()/40)]=current_tile
EndIf
If KeyDown(key_s) savemap()
End Function


Вставьте это код, к примеру, после создания функции initmap().


***


2 комментария:

  1. Что за убогий язык Вы используете?
    Быть может, Вас научить писать на c#, java, c++?

    ОтветитьУдалить
    Ответы
    1. Я умею (пусть и не очень хорошо) писать на С++, однако, даже используя простейшие графические движки, код программы на С++ будет гораздо длиннее, да и некоторым программистам (basic,java и др.) код будет непонятен.
      Поэтому я использую синтаксис BlitzMax, но лишь из-за того, что все стандартные функции в нём предельно просты и понятны даже по названию.
      KeyDown - нажатие клавиши.
      PlaySound - воспроизведение звука.
      И так далее.
      Да и код на BlitzMax'е получается "компактнее", но это моё мнение.
      Вообще сперва планировал писать на алгоритмическом языке (ЕСЛИ условие СДЕЛАТЬ то-то), но передумал.

      Удалить