PDA

Просмотр полной версии : Взаимодействие объектов с разными классами


vivado
06.03.2013, 18:09
Всем привет,
Начал изучать классы. Есть объект "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"

DaFive
06.03.2013, 18:20
Какая строка кода? Где ошибка-то? Откуда берется marker? Ничо непонятно.

vivado
06.03.2013, 18:22
marker - это просто объект с одноименным классом
Задача такая - на сцене объект с классом "Enemy" который должен двигаться между двумя объектами с классом "Marker" туда-сюда.

AlexLucas
06.03.2013, 18:26
Раз у вас marker нигде не инициализируется, видимо это класс, а не объект.

iflamberg
06.03.2013, 18:27
if (this.hitTestObject(marker)){
Вот в том виде, что ты прислал эту строчку, этот код вообще не должен компилироваться. Ты что-то вырезал? Откуда берется marker? На него нет ни переменной в теле функции, ни свойства класса.
__
Аа. Ты туда, вместо ссылки на объект класса, пихаешь ссылку на сам класс. Гыгы, забавно.

vivado
06.03.2013, 18:30
Еслиб это был объект с именем экземпляра "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: дай пять =)

vivado
06.03.2013, 18:43
А если объектов "Enemy" будет несколько и маркеров тоже несколько?
Не могу немного логику понять, мне массив объектов "Enemy" нужно делать + массив объектов "Маркер"
а потом проверять каждый элемент одного массива на коллизию с каждым из элементов другого?

Добавлено через 48 секунд
Чтобы класс Enemy реагировал на объекты Marker, нужно передать ему ссылку на этот самый объект. Передать в конструкторе и хранить в свойстве класса, еще как-нибудь.
Вообще, логичнее было бы даже, чтобы класс сцены хранил в себе все экземпляры Enemy и Marker и проверял их всех на столкновения.
---
2AlexLucas: дай пять =)

А как передать ссылку?
Просто неохота заморачиваться с массивами и циклами

iflamberg
06.03.2013, 18:47
А если объектов "Enemy" будет несколько и маркеров тоже несколько?
Не могу немного логику понять, мне массив объектов "Enemy" нужно делать + массив объектов "Маркер"
а потом проверять каждый элемент одного массива на коллизию с каждым из элементов другого?
Именно так. Прийдется заморачиваться и с массивами и с циклами. Фантастики не будет

vivado
06.03.2013, 18:50
А ежели у меня будет 100 объектов Enemy и 200 объектов Marker и я буду на Enter-frame циклом енту кучу прогонять - скорость FPS упадет в ноль (((
Должен же быть способ проще.

iflamberg
06.03.2013, 18:52
Никакой фантастики. В таком случае делается оптимизация. Хеш-таблица. Карта разбивается на квадраты. Каждый объект принадлежит одному квадрату или несколькми(на стыке). В цикле проверяем на столкновения только с теми объектами, что находятся в одном квадрате.

vivado
07.03.2013, 11:30
А можно простенький пример? В душе не ведаю вообще как это делается
Это по координатам объектов как то нужно проверять или по нахождению в ячейке?