Форум программистов, компьютерный форум, киберфорум
Наши страницы
ActionScript
Войти
Регистрация
Восстановить пароль
 
saigor33
0 / 0 / 0
Регистрация: 11.05.2018
Сообщений: 3
#1

Проверка столкновения двух объектов, созданных в разных функциях

11.05.2018, 18:32. Просмотров 113. Ответов 5
Метки нет (Все метки)

Создаю игру. Создал оружие (пулемёт), который при зажатии ЛКМ стреляет, при отжатии перестаёт. Создал рандомное появление монстров. Проблема в следующем: как проверить условие столкновения?
код примерно следующий:

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
stage.addEventListener (Event.ENTER_FRAME, programm);
 
function programm (e:Event)
{   //проверка на зажатие ЛКМ
    stage.addEventListener(MouseEvent.MOUSE_DOWN, mouse_click);
    stage.addEventListener(MouseEvent.MOUSE_UP, mouse_dont_click);
    //функция появления монстра
    inv_monsters();
    //функция осуществления стрельбы
    shooting();
}
 
//появление нового монстра
function inv_monsters ()  
{
    /*
    <Условия добавление монстрика>
    */
        var monster:monster_mc =   new monster_mc(); //создание экземпляра
       //далее код определения положения, скорости и прочей лабуды
      /*
       <Параметры монстра>
       */
        //добавление экземпляра на сцену
    addChild(monster);
    monster.addEventListener (Event.ENTER_FRAME , monster_start)
}
//функция движения монстра
function monster_start(e:Event)
{
    var monster:MovieClip = e.currentTarget as MovieClip;
    //изменение координат
    monster.x += monster.speed_x;
    monster.y += monster.speed_y;
}
 
//функция стрельбы 
    function shooting ()
    {
/*
<условия при которых происходит выстрел>
*/
        var bullet:MovieClip = new bullet_mc(); //создание экземпляра пули
        //далее идут параметры пули (скорость, угол поворота и т.д)
        /*
        <Параметры пули>
        */
        //добавление экземпляра
        addChild(bullet);
        bullet.addEventListener(Event.ENTER_FRAME, bullet_start);
        
    }
//движение пули
    function bullet_start(e:Event)
    {
        var bullet:MovieClip = e.currentTarget as MovieClip;
        //изменение положения
        bullet.y +=  bullet.speed_bullet_y;
        bullet.x +=  bullet.speed_bullet_x;
        //проверка столкновения
        if (bullet.hitTestObject(monster ) && ( bullet.currentFrame==1))
        {
            bullet.gotoAndPlay("boom_start");
            bullet.speed_bullet_y=0;
            bullet.speed_bullet_x = 0;
        }
    }
Объекты monster (с именем класса monster_mc) и bullet (с именем класса bullet_mc) нарисованы и преобразованы в MovieClip.
ActionScript 3
1
2
3
4
5
6
if (bullet.hitTestObject(monster ) && ( bullet.currentFrame==1))
        {
            bullet.gotoAndPlay("boom_start");
            bullet.speed_bullet_y=0;
            bullet.speed_bullet_x = 0;
        }
Эта часть кода работает, только если объект из библиотеки вытащить на сцену и задать ему имя «monster». Работает только для этого конкретного объекта.

Мне кажется, что код просто не видит экземпляры на сцене. Как можно на них сослаться или можно как-то наследовать имя для каждого экземпляра?

Добавлено через 16 часов 56 минут

Сам нашёл решение данной проблемы. Добавил массив, куда закидывал всех созданных монстров, и при проверки условия столкновения перебирал всех монстров.
В коде поменял следующие (выделил цветом)

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
stage.addEventListener (Event.ENTER_FRAME, programm);
 
function programm (e:Event)
{   //проверка на зажатие ЛКМ
    stage.addEventListener(MouseEvent.MOUSE_DOWN, mouse_click);
    stage.addEventListener(MouseEvent.MOUSE_UP, mouse_dont_click);
    //функция появления монстра
    inv_monsters();
    //функция осуществления стрельбы
    shooting();
}
 
//появление нового монстра
function inv_monsters ()  
{
    /*
    <Условия добавление монстрика>
    */
 var monster:monster_mc =   new monster_mc(); //создание экземпляра
//далее код определения положения, скорости и прочей лабуды
/*
<Параметры монстра>
*/
//добавление экземпляра на сцену
    addChild(monster);
        /*******************************************/
        /*ДОБАВЛЕНИЕ КОДА*/
    monster_array.push(monster); //добавление в массив экземпляра
        /*******************************************/
    monster.addEventListener (Event.ENTER_FRAME , monster_start)
}
//функция движения монстра
function monster_start(e:Event)
{
    var monster:MovieClip = e.currentTarget as MovieClip;
    //изменение координат
    monster.x += monster.speed_x;
    monster.y += monster.speed_y;
/*******************************************/
        /*ДОБАВЛЕНИЕ КОДА*/
monster_array.push(monster);//добавление в массив изменённое местоположение
        /*******************************************/
}
 
//функция стрельбы 
    function shooting ()
    {
/*
<условия при которых происходит выстрел>
*/
        var bullet:MovieClip = new bullet_mc(); //создание экземпляра пули
        //далее идут параметры пули (скорость, угол поворота и т.д)
        /*
        <Параметры пули>
        */
        //добавление экземпляра
        addChild(bullet);
        bullet.addEventListener(Event.ENTER_FRAME, bullet_start);
        
    }
//движение пули
    function bullet_start(e:Event)
    {
        var bullet:MovieClip = e.currentTarget as MovieClip;
        //изменение положения
        bullet.y +=  bullet.speed_bullet_y;
        bullet.x +=  bullet.speed_bullet_x;
/*******************************************/
        /*ДОБАВЛЕНИЕ КОДА*/
        //проверка столкновения
            //перебор всех экземпляров монстров
        for (var i:int =0; i<monster_array.length; i++)
        {   //если монстр существует
            if (monster_array[i])
                {   //если монстр столкнулся с пулей и кадр анимации равен 1 
                    if (monster_array[i].hitTestPoint(bullet.x, bullet.y,true)&&( bullet.currentFrame==1))
                    {
                    /*
                    <Запуск анимации и бла бла>
                    */
//далее удаления монстрика со сцены
    //удаление событие ENTER_FRAME
monster_array[i].removeEventListener(Event.ENTER_FRAME, monster_start);
                        //удаление картинки
                                removeChild(monster_array[i]);
                        //удаление информации о экземплеря
                                monster_array[i]=null;
                                }
                            }
/*******************************************/
        }
    }
Изредка выскакивает ошибка «TypeError: Error #1010: Термин не определен и не имеет свойств.». Пока не знаю из-за чего.
Выяснил что ошибка появляется в этих строчках:
ActionScript 3
1
2
3
4
5
monster_array[i].removeEventListener(Event.ENTER_FRAME, monster_start);
//удаление картинки
removeChild(monster_array[i]);
//удаление информации о экземпяре
monster_array[i]=null;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2018, 18:32
Ответы с готовыми решениями:

Проверка столкновения
День добрый!!! недельку назад по немногу начал осваивать as3 и решил написать небольшое...

Регистрация столкновений объектов, созданных addChild
Доброго времени суток. У меня есть два персонажа. Каждый описан в своем классе. Одни вызываются по...

Пересечение объектов в разных классах
Добрый день! Создавая инвентарь, столкнулся с одной проблемой. Но обо всем по порядку. Я создал...

Проверка объектов в радиусе от начального объекта
Здраствуйте!!! Вот у меня на сцене есть объекты MovieClip,так вот, как мне проверить находятся ли...

Проверка столкновения объектов rectangle
Дарова всем! есть 2 ректангла, которые отскакивают от краев экрана, как сделать так чтобы они...

5
Sayanchik777
8 / 8 / 6
Регистрация: 09.05.2015
Сообщений: 427
14.05.2018, 15:36 #2
смотри ролики этого чувака,
0
saigor33
0 / 0 / 0
Регистрация: 11.05.2018
Сообщений: 3
14.05.2018, 18:53  [ТС] #3
Sayanchik777 , я по ним и учился, но у него нету моего вопроса. В любом случае я сам решил свою проблему.
0
Sayanchik777
8 / 8 / 6
Регистрация: 09.05.2015
Сообщений: 427
14.05.2018, 21:18 #4
Цитата Сообщение от saigor33 Посмотреть сообщение
В любом случае я сам решил свою проблему.
Так напиши решение, кому то пригодится
0
saigor33
0 / 0 / 0
Регистрация: 11.05.2018
Сообщений: 3
14.05.2018, 21:23  [ТС] #5
Sayanchik777, написал же.
там в первом сообщение написано "Добавлено через 16 часов 56 минут".Был длинный отступ между сообщениями, но модератор сократил его и не заметно.
0
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,004
Завершенные тесты: 2
17.05.2018, 15:55 #6
Цитата Сообщение от saigor33 Посмотреть сообщение
Пока не знаю из-за чего.
Выяснил что ошибка появляется в этих строчках:
Скорее всего monster_array[i] равен null. Т.е. происходит попытка удалить null, что невозможно.
0
17.05.2018, 15:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2018, 15:55

Проверка столкновения большого количества объектов
...и всё же. Вот на любом сайте, когда описывают и как сделать столкновение объектов, то приводят...

Обращение к методам объектов, созданных в разных потоках
Гуд дэй, комрэйдс! Ай хэв э квэштн фор ю! В общем, у меня есть распоточенное приложение на C#...

Можно ли обеспечить взаимодействие программно созданных объектов и объектов, созданных мастером
Здравствуйте. Изучаю C# и ADO.NET и столкнулся с одной серьезной проблемой, которая мешает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru