С Новым годом! Форум программистов, компьютерный форум, киберфорум
ActionScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 11.05.2018
Сообщений: 4
AS 3.0

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

11.05.2018, 18:32. Показов 1316. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.05.2018, 18:32
Ответы с готовыми решениями:

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

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

Сцена lose, после столкновения двух объектов
Есть объект, который при косании с другим вызывает сцену lose. Я написал скрипт, но он ничего не делает. Как сделать, чтобы он работал? ...

5
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
14.05.2018, 15:36
смотри ролики этого чувака,
0
0 / 0 / 0
Регистрация: 11.05.2018
Сообщений: 4
14.05.2018, 18:53  [ТС]
Sayanchik777 , я по ним и учился, но у него нету моего вопроса. В любом случае я сам решил свою проблему.
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
14.05.2018, 21:18
Цитата Сообщение от saigor33 Посмотреть сообщение
В любом случае я сам решил свою проблему.
Так напиши решение, кому то пригодится
0
0 / 0 / 0
Регистрация: 11.05.2018
Сообщений: 4
14.05.2018, 21:23  [ТС]
Sayanchik777, написал же.
там в первом сообщение написано "Добавлено через 16 часов 56 минут".Был длинный отступ между сообщениями, но модератор сократил его и не заметно.
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,550
17.05.2018, 15:55
Цитата Сообщение от saigor33 Посмотреть сообщение
Пока не знаю из-за чего.
Выяснил что ошибка появляется в этих строчках:
Скорее всего monster_array[i] равен null. Т.е. происходит попытка удалить null, что невозможно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2018, 15:55
Помогаю со студенческими работами здесь

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

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

Платформер, проверка столкновения двух PictureBox-ов
Здравствуйте, программисты и сисадмины. Пишу платформер с нуля. Управление и гравитация есть, столкновение с поверхностью хочу сделать,...

Почему у двух созданных объектов одинаковые имена
Почему когда я создал 2 объекта и дал им разные имена, в итоге получается что у этих двух объектов одно имя? package helloworld; import...

Столкновения объектов
Выполнить имитационное моделирование. Дана задача, пушка стреляет снаряды, через определенное время, со случайным углом наклона к...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru