Проверить правильно ли вы наиграли мелодию в игре можно двумя способами, Первый визуальный, во время вашей игры на нотном стане появляются сыгранные ноты и если они совпадают с нотами образца, то вы на верном пути. Второй способ – дождаться результата, который вам выдаст компьютер. Если вы сыграли верно, компьютер сообщит вам об этом.

Вам потребуется добавить дополнительно немного программного кода к каждой клавише рояля:

1
2
3
4
5
6
7
8
9
10
on (release) {
ms2 = getTimer();
d = ms2-ms1;
call("pausa");
m = "c_1";
xp = xp+m;
call("my_music");
sl = sl+1;
call("proverka");
}

Здесь вместе с уже разобранными строками кода (строки 2-4) появились новые. Во-первых, при нажатию на клавишу переменная m принимает имя нажатой клавиши, а переменная xp, хранящая код музыкальной фразы, воспроизводимой вами, добавляет код нажатой клавиши к уже сформированному коду (строка 6). Разумеется, в первом кадре нужно задать ее начальное значение: xp=””, то есть пустота - пустой код.

Во-вторых, при нажатие на каждую клавишу происходит вызов нескольких процедур:

call("pausa") - вызов процедуры, вычисляющей длительность ваших нот. Не смотря на то, что в данном проекте длительности не участвуют в проверке правильно сыгранной мелодии, они нужны для правильного отображения нот на нотном стане.
call("my_music") – вызов процедуры, «рисующей» ваши ноты на нотном стане.
call("proverka") – вызов процедуры, определяющей правильность вашей игры.

Все процедуры по своей сути – это именованные ключевые кадры. При обращении к ним обработчик Flash переходит к соответствующему кадру, выполняет программный код, а после возвращается в ту же точку, откуда процедура была вызвана. Как и в других языках программирования процедуры имеет смысл организовывать там, где многократно выполняется некоторый программный код, решающий некоторую определенную задачу, например проверку вашей игры. Так как во Flash вначале выполняется программный код, а лишь затем перерисовывается экран, нет необходимости в кадрах описывающих процедуры продлять видимые объекты (рисунок 18). На рисунке также показано поле на панели «Свойства» где задается имя кадра.

Создание именованных кадров, в которых располагаются процедуры
Рис. 18. Создание именованных кадров, в которых располагаются процедуры.

В кадре «pausa» необходимо добавить следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
if (d>80 && d<170) {
p_my = "32";
} else if (d>180 && d<320) {
p_my = "16";
} else if (d>380 && d<620) {
p_my = "08";
} else if (d>850 && d<1150) {
p_my = "04";
} else if (d>2800 && d<2200) {
p_my = "02";
} else {
p_my = "01";
}

d – переменная в которой хранится время, в течении которого клавиша рояля была нажата. В зависимости от того, в какой временной диапазон попадает переменная d, определяется длительность ноты и запоминается в переменной p_my. При задании интервалов я исходил из того, что целая нота должна звучать приблизительно 4000 миллисекунд, половинная нота 2000 миллисекунд и т.д. Знак «&&», используемый в условии соответствует логической связке «И».
Кадр и процедура «my_music» в целом повторяет код формирующий нотный стан:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (p_my == "32") {
duplicateMovieClip("n_1-32", "n_1-32"+sl, sl);
name = "n_1-32"+sl;
} else if (p_my == "16") {
duplicateMovieClip("n_1-16", "n_1-16"+sl, sl);
name = "n_1-16"+sl;
}
. . .
} else {
duplicateMovieClip("n_1-1", "n_1-1"+sl, sl);
name = "n_1-1"+sl;
}
duplicateMovieClip("di", "di"+sl, sl+25);
name2 = "di"+sl;
call("nota");
col = new Color(eval(name));
col.setRGB(0xff0000);
col2 = new Color(eval(name2));
col2.setRGB(0xff0000);

Здесь также происходит дублирование символов нот, и изменение их координат. Различие только в том, на какой слой помещаются эти дубликаты. Для этого используется переменная sl, в первом кадре принимающая значение равное 100, а при нажатии на клавишу рояля увеличивающая свое значение на единицу.

За выстраивание нот на нотном стане отвечает процедура «nota», вызываемая из процедуры «my_music» - строка 15. Ее код приведен в главе «Финальный код» описывать его здесь я не вижу смысла. Идеи, заложенные в нем, уже разбирались нами при формировании нот музыкального образца на нотном стане.

В процедуре «my_music» также происходит изменение цвета нот – строки 16-19. Для этого создаются два цветовых объекта для символа ноты и символа диеза. К этим объектам применяется метод .sеtRGB(), изменяющий цвет объекта. Код нового цвета задается для каждой цветовой составляющей в шестнадцатеричном виде.
Последняя процедура «proverka» состоит всего лишь из трех строк.

1
2
3
if (xp == ex) {
result = "У вас получилось!";
}

В условном операторе сравниваются две строковые переменные xp – код формируемый при игре музыканта и ex – код музыкального образца. Если эти переменные совпадают, в динамическом поле result появляется долгожданная надпись «У вас получилось». Разумеется, предварительно это динамическое поле с таким именем вы должны создать.