Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.04.2011, 08:09
Ransy92 вне форума Посмотреть профиль Отправить личное сообщение для Ransy92 Найти все сообщения от Ransy92
  № 1  
Ответить с цитированием
Ransy92

Регистрация: Apr 2011
Сообщений: 19
По умолчанию Добавление элементов в массив и проверка на столкновение

ВОт такая проблема возникла: вначале создается 3 рандомно расположенных объекта level и сразу же добавляются в массив
Код AS3:
for (var i:uint = 0; i < 3; i++)
				{
				level = new Level();
				level.x = Math.random() * 550;
				level.y = Math.random() * 400;
				addChild(level);
				levelArray.push(level);
				}
С этим проблем нет. Есть проблема, что не могу прописать hittest к КАЖДОМУ элементу массива. Хит тест проверяет столкновение объектов level с объектом hero. При компиляции получается, что только один из объектов level может столкнуться с hero, остальные просто проходят "сквозь" него.
Как пишутся хит тесты ко всему массиву?
Могу привести свой неудачный пример, посмотрите, в чем проблема
Код AS3:
private function levelHit():void
		{
			if (! levelArray[i].hitTestPoint (hero.x, hero.y, true))
			{
				hero.y += _vy;
			}
 
			if (_vy > 10)
			{
				_vy = 10;	
			}
 
			for (var i:int = 0; i < levelArray.lenght; i++)
			{
				if (levelArray[i].hitTestPoint(hero.x, hero.y, true))
				{
				hero.y--;
				_vy = 0;
				jumped = false;
				}
			}
		}

Старый 26.04.2011, 09:54
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Проверять на столкновения, нужно так же в цикле, с каждым элементом массива.
Код AS3:
for (var obj:String in levelArray) {
     if  (levelArray[obj].hitTestPoint (hero.x, hero.y, true)) trace("бум");
}
И этот цикл нужно вызывать по ENTER_FRAME либо по таймеру, чтобы проверка происходила постоянно


Последний раз редактировалось goodguy; 26.04.2011 в 09:58.
Старый 26.04.2011, 14:46
Ransy92 вне форума Посмотреть профиль Отправить личное сообщение для Ransy92 Найти все сообщения от Ransy92
  № 3  
Ответить с цитированием
Ransy92

Регистрация: Apr 2011
Сообщений: 19
Спасибо большое, все работает.
Только один вопрос: obj принято в языке считать любой объект?Или это переменная, имя которой мы можем указать сами?

Старый 26.04.2011, 14:55
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 4  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Это переменная (перед ней же стоит ключевое слово var), название которой может быть любым (соответствующим требованиям языка).
Я назвал ее obj потому, что i (используемая в циклах чаще всего) уже используется в функции ниже, просто чтобы не менять весь код

Старый 26.04.2011, 22:41
Ransy92 вне форума Посмотреть профиль Отправить личное сообщение для Ransy92 Найти все сообщения от Ransy92
  № 5  
Ответить с цитированием
Ransy92

Регистрация: Apr 2011
Сообщений: 19
Кстати, возник еще один вопрос: реально ли вообще сделать так, чтобы при движении героя не только двигалась камера, но и генерировались случайно расположенные объекты из массива (напр. чтобы на экране было всегда 3-4 таких объекта)?То есть в принципе я так понял, что нужно просто каждый кадр проверять - находится ли нужное количество объектов на экране и если их меньше, то добавить. Но это все так просто на словах, на деле же я даже камеру не заставлю за героем следовать)))

Старый 27.04.2011, 08:07
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 6  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
на деле же я даже камеру не заставлю за героем следовать)))
Нужно двигать контейнер, в котором находится герой в противоположном направлении, на то же расстояние, которое проходит герой. Ничего сложного.
Цитата:
о есть в принципе я так понял, что нужно просто каждый кадр проверять - находится ли нужное количество объектов на экране и если их меньше, то добавить. Но это все так просто на словах
Я бы применял к объектам проверку координат через localToGlobal() и если они уходят за пределы сцены, менял бы их координаты на любые случайные, находящиеся в пределах сцены

Старый 27.04.2011, 13:40
Ransy92 вне форума Посмотреть профиль Отправить личное сообщение для Ransy92 Найти все сообщения от Ransy92
  № 7  
Ответить с цитированием
Ransy92

Регистрация: Apr 2011
Сообщений: 19
Спасибо за ответ. Я погуглил инфу на тему скроллинга, но там в основном карта - отдельный мувиклип, который просто скроллят...
У меня же нет карты как таковой - мне нужна иллюзия скроллинга что ли....То есть ваш метод с контейнером вроде подходит. Но я не пойму, как его осуществить?Первый раз слышу. Если можно, просто натолкните на мысль, что почитать, а дальше разберусь сам.

Старый 27.04.2011, 16:52
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 8  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Я погуглил инфу на тему скроллинга, но там в основном карта - отдельный мувиклип, который просто скроллят...
У меня же нет карты как таковой
Что мешает создать?
Я бы сделал контейнер (спрайт) и помещал все объекты в него, а не на сцену.

Код AS3:
 
public class SomeClass extends Sprite {
 
         private var camera:Sprite = new Sprite(); // контейнер для объектов
         private var character:SomeCharacter = new SomeCharacter(); // какой-нибудь персонаж
 
         public function SomeClass() {
                if (stage) initialize();
                else this.addEventListener(Event.ADDED_TO_STAGE, initialize);
         }
         private function initialize(e:Event = null):void {
                 this.removeEventListener(Event.ADDED_TO_STAGE, initialize);
                 character.x = stage.stageWidth / 2; // ставлю персонажа в центр экрана
                 character.y = stage.stageHeight / 2;
                 camera.addChild(character); // добавляю персонажа в контейнер
                 stage.addChild(camera); // после чего, добавляю сам контейнер
                 this.addEventListener(Event.ENTER_FRAME, update, false, 0, true);
         }
         private function update(e:Event):void {
               character.x += 2; // двигаю персонаж
               character.y += 2;
               (character.parent as Sprite).x -= character.x; // и контейнер в противоположную сторону
               (character.parent as Sprite).y -= character.y;
         }
 
}
Что-то типа того. Код конечно слишком абстрактный, но
Цитата:
а дальше разберусь сам.

Думаю идея должна быть ясна

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 06:51.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.