Статьи

Быстрый совет: пользовательский курсор прицела и звук выстрела

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


Примечание. Несмотря на новую функцию Native Cursor, представленную в FP10.2, этот метод старой школы все еще является действительным способом создания пользовательского курсора. Он имеет преимущество в том, что позволяет вам использовать более крупную графику, плюс он будет работать со старыми версиями Flash Player. Завтра мы рассмотрим родные курсоры в FP10.2 🙂


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


Откройте новый документ Flash и установите следующие свойства

  • Размер документа: 500×400 пикселей
  • Цвет фона: #FFFFFF

Для кнопки «Пуск» я нарисовал скругленный прямоугольник и поместил на него текст со словом «Пуск». Затем я преобразовал кнопку и текст в мувиклип, нарисовав выделение вокруг них и нажав клавишу F8. Я дал кнопке имя startGame , а также использовал startGame качестве имени экземпляра на панели «Свойства». Если панель Свойства не отображается для вас, перейдите в Меню-> Окно-> Свойства или просто нажмите CTRL + F3 .

пользовательский курсор мувиклип as3 flash
пользовательский курсор мувиклип as3 flash

В файлы упражнений включены два изображения: одно — изображение перекрестия, а другое — изображение пулевого отверстия. Я импортировал их по очереди на сцену и преобразовал их в мувиклип, щелкнув по ним и нажав F8. Я дал им имена экземпляров «BulletHole» и «CrossHair», удостоверился, что точки регистрации были установлены в центре в обоих случаях, и использовал одно и то же имя для класса в соединении каждого символа. Ниже приведено изображение того, как я настроил BulletHole; то же самое для CrossHair.

пользовательский курсор мувиклип as3 flash

Для звука я импортировал его в библиотеку, затем щелкнул его правой кнопкой мыши и выбрал «Свойства». Затем я дал ему имя GunShot и установил класс связывания как GunShot.

пользовательский курсор мувиклип as3 flash

Теперь, когда у нас есть все готовые игровые элементы, мы можем погрузиться в код.


Здесь мы настроили наш пакет и основной класс для нашей игры

Сначала мы импортируем некоторые классы, которые нам понадобятся, затем мы устанавливаем наш класс документа . Этот основной класс должен расширять либо MovieClip, либо Sprite; здесь мы расширяем MovieClip. Затем мы объявляем некоторые переменные, которые будем использовать, и кодируем нашу функцию конструктора. Функция конструктора добавляет прослушиватель событий к кнопке, где мы настраиваем остальную часть игры.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package {
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.ui.Mouse;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    public class Main extends MovieClip {
        //The movie clips and Sound in the Library
        var crosshair:CrossHair = new CrossHair();
        var bullethole:BulletHole;
        var gunshot:GunShot = new GunShot();
 
        //Needed for the gunshot sound
        var soundChannel:SoundChannel = new SoundChannel;
         
        //Whether or not the user has clicked 1 time
        var firstShot = true;
    }
 
    public function Main() {
        //Show hand cursor when user mouses over the button
        startGame.buttonMode=true;
        startGame.addEventListener(MouseEvent.CLICK,startTheGame);
    }
}

Функция startTheGame() вызывается, когда пользователь нажимает кнопку. Эта функция удаляет кнопку со сцены, скрывает мышь и добавляет перекрестие на сцену. Затем мы добавляем двух слушателей событий на сцену.

01
02
03
04
05
06
07
08
09
10
11
12
13
private function startTheGame(e:MouseEvent):void{
    //Remove the button from the stage
    removeChild(startGame);
    //Hides the mouse
    Mouse.hide();
    //Adds the crosshair and sets its x and y properties
    //to the mouse’s x and y coordinates
    addChild(crosshair);
    crosshair.x = mouseX;
    crosshair.y = mouseY;
    stage.addEventListener(MouseEvent.MOUSE_MOVE,moveCursor);
    stage.addEventListener(MouseEvent.CLICK,fireShot);
}

Функция moveCursor() вызывается всякий раз, когда пользователь перемещает мышь, из-за прослушивателя событий MOUSE_MOVE, который мы добавили на сцену. В этой функции мы просто mouseX что перекрестие находится в том же положении, что и мышь, используя mouseX и MouseY .

1
2
3
4
5
6
private function moveCursor(e:MouseEvent):void{
    //Makes sure the crosshair x and y is always
    //where the mouse’s x and y is
     crosshair.x = mouseX;
     crosshair.y = mouseY;
}

Функция fireShot() вызывается всякий раз, когда пользователь нажимает на сцену. Сначала мы проверяем, нажал ли пользователь впервые; если это не так, то мы воспроизводим звук выстрела и добавляем bulletHole в ту же позицию на сцене, где пользователь щелкнул, используя e.stageX и e.stageY . Событие содержит информацию о себе — вы можете увидеть, что оно содержит, используя trace(e.toString()) .

Если мы не проверим, было ли это в первый раз, то, когда пользователь впервые нажмет на кнопку «Пуск», он добавит перекрестие и воспроизведет звук выстрела (мы этого не хотим).

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
        private function fireShot(e:MouseEvent):void{
            //If they have clicked once then we do this
            if(firstShot == false){
                //Plays the sound
                soundChannel = gunshot.play();
                //Creates a new bullethole and adds it to the
                //stage at the place where the user clicked
                bullethole = new BulletHole();
                addChild(bullethole);
                bullethole.x = e.stageX;
                bullethole.y = e.stageY;
                //We always want the crosshair on top so we swap the «Depths»
                //of the crosshair and bullet
                swapChildren(bullethole,crosshair);
            }
            firstShot = false;
 
        }
    }//Close the class
 
}//Close the package

Это может послужить основой для многих игр типа «стреляй им». Было бы очень легко вызвать некоторых врагов, а затем выполнить проверку hitTestPoint () с помощью мыши X и Y против экранного объекта противника.

Я надеюсь, вам понравился этот урок. Спасибо за прочтение!