Просмотр полной версии : Взаимодействие объектов с разными классами
Всем привет,
Начал изучать классы. Есть объект "Enemy" в его классе прописано простейшее движение по X
и есть несколько объектов с классом "Marker" при соприкосновении с которыми "Enemy" Должен менять свою скорость на противоположную.
В классе Enemy пишу
package {
import flash.display.*;
import flash.events.*;
public class Enemy extends MovieClip {
public var EnemySpeed:Number = 3;
public function Enemy() {
stage.addEventListener(Event.ENTER_FRAME, moveEnemy);
}
private function moveEnemy(event:Event) {
//Код для изменения скорости(направления) движения
if (this.hitTestObject(marker)){
EnemySpeed=-EnemySpeed;
}
this.x+=EnemySpeed;
}
}
}
Расставил объекты на сцене, проверяю - Пишет ошибку "Неявное приведение значения типа Class к несоответствующему типу flash.display:DisplayObject"
Какая строка кода? Где ошибка-то? Откуда берется marker? Ничо непонятно.
marker - это просто объект с одноименным классом
Задача такая - на сцене объект с классом "Enemy" который должен двигаться между двумя объектами с классом "Marker" туда-сюда.
AlexLucas
06.03.2013, 18:26
Раз у вас marker нигде не инициализируется, видимо это класс, а не объект.
iflamberg
06.03.2013, 18:27
if (this.hitTestObject(marker)){
Вот в том виде, что ты прислал эту строчку, этот код вообще не должен компилироваться. Ты что-то вырезал? Откуда берется marker? На него нет ни переменной в теле функции, ни свойства класса.
__
Аа. Ты туда, вместо ссылки на объект класса, пихаешь ссылку на сам класс. Гыгы, забавно.
Еслиб это был объект с именем экземпляра "Marker" то код бы сработал. Просто не знаю как инициировать этот класс. Вопрос именно в том, как сделать чтоб "Enemy" реагировал на все объекты с классом "Marker"
AlexLucas
06.03.2013, 18:37
В цикле проматываете через все объекты типа Marker которые находятся на сцене и проверяете коллизию hitTestObject'ом.
А объекты типа Marker лучше инициализировать в контейнере который должен содержать и Enemy и Marker'ы, и проверять коллизию тоже там. В вашем случае это наверное мэйн класс.
iflamberg
06.03.2013, 18:40
Чтобы класс Enemy реагировал на объекты Marker, нужно передать ему ссылку на этот самый объект. Передать в конструкторе и хранить в свойстве класса, еще как-нибудь.
Вообще, логичнее было бы даже, чтобы класс сцены хранил в себе все экземпляры Enemy и Marker и проверял их всех на столкновения.
---
2AlexLucas: дай пять =)
А если объектов "Enemy" будет несколько и маркеров тоже несколько?
Не могу немного логику понять, мне массив объектов "Enemy" нужно делать + массив объектов "Маркер"
а потом проверять каждый элемент одного массива на коллизию с каждым из элементов другого?
Добавлено через 48 секунд
Чтобы класс Enemy реагировал на объекты Marker, нужно передать ему ссылку на этот самый объект. Передать в конструкторе и хранить в свойстве класса, еще как-нибудь.
Вообще, логичнее было бы даже, чтобы класс сцены хранил в себе все экземпляры Enemy и Marker и проверял их всех на столкновения.
---
2AlexLucas: дай пять =)
А как передать ссылку?
Просто неохота заморачиваться с массивами и циклами
iflamberg
06.03.2013, 18:47
А если объектов "Enemy" будет несколько и маркеров тоже несколько?
Не могу немного логику понять, мне массив объектов "Enemy" нужно делать + массив объектов "Маркер"
а потом проверять каждый элемент одного массива на коллизию с каждым из элементов другого?
Именно так. Прийдется заморачиваться и с массивами и с циклами. Фантастики не будет
А ежели у меня будет 100 объектов Enemy и 200 объектов Marker и я буду на Enter-frame циклом енту кучу прогонять - скорость FPS упадет в ноль (((
Должен же быть способ проще.
iflamberg
06.03.2013, 18:52
Никакой фантастики. В таком случае делается оптимизация. Хеш-таблица. Карта разбивается на квадраты. Каждый объект принадлежит одному квадрату или несколькми(на стыке). В цикле проверяем на столкновения только с теми объектами, что находятся в одном квадрате.
А можно простенький пример? В душе не ведаю вообще как это делается
Это по координатам объектов как то нужно проверять или по нахождению в ячейке?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.