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

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

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

Регистрация: Dec 2010
Адрес: арх. обл.
Сообщений: 38
Question код для проверки столкновений бонуса и героя

Здравствуйте! Сделал я код для проверки столкновений бонуса и героя. вот что получилось:
тут появляется бонус:
Код AS3:
package ru.RainbowAdventure
{
 
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.Event;
 
    public class Universe extends Sprite
    {
 
        public static var bon:Boolean = false;
        public static var grid:MovieClip = new MovieClip();
        public static var bonus:MovieClip = new MovieClip();
        public static var wall:MovieClip;
        public static const MAP_WIDTH_MAX:int = 30;
        public static const MAP_HEIGHT_MAX:int = 20;
        public static const MAP_CELL_SIZE:int = 24;
        public static const STATE_CELL_FREE:int = 1;
        public static const STATE_CELL_BUSY:int = 2;
        private var levelLength:Number = 20;
        private var levelVeigth:Number = 30;
 
 
        public function Universe()
        {
            addEventListener(Event.ADDED_TO_STAGE, init);
 
        }
        private function init(event:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            addBonus();
            trace("Univerze initialized...");
 
        }
 
 
        private function addBonus()
        {
            if (bon == false)
            {
                bonus = new Bonus_mc  ;
                bonus.y != grid.y;
                bonus.x != grid.x;
                bonus.x = Math.ceil(Math.random() * 18) * 20 + 10;
                bonus.y = Math.ceil(Math.random() * 18) * 20 + 10;
                bonus.gotoAndStop(1);
                bon = true;
                addChild(bonus);
                trace("Bon =",bon);
 
            }
 
 
 
            trace("Bonus initialized...");
 
        }
 
    }
}
вот тут код для проверки столкновений и удаления бонуса:
Код AS3:
package ru.RainbowAdventure.Characters
{
 
    import flash.display.*;
    import flash.events.*;
    import flash.ui.*;
    import flash.utils.*;
    import flash.text.*;
    import ru.RainbowAdventure.Universe;
 
 
 
 
    public class Hero extends ru.RainbowAdventure.Universe
    {
        public static var grid:MovieClip;
        public static var ball:MovieClip;
        public static var bonuses:MovieClip;
        public static var bon:Boolean;
 
 
        public var container_hero:MovieClip;
        public var p:int;
 
        public function Hero()
        {
            addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(event:Event):void
        {
            grid = Universe.grid;
            bonus = Universe.bonus;
            removeEventListener(Event.ADDED_TO_STAGE, init);
            addHero();
            stage.addEventListener(Event.ENTER_FRAME, stolknovenie);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyControl);
            trace("Hero initialized...");
        }
 
 
            if (bonus.hitTestPoint(ball.x,ball.y,true))
            {
                bon = false;
                removeChild(bonus);
            }
 
 
        }
 
    }
}
при пересечении бонуса и героя появляется вот такая ошибка:
Код:
ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
    at flash.display::DisplayObjectContainer/removeChild()
    at ru.RainbowAdventure.Characters::Hero/stolknovenie()
пытался разобраться но не выходит. и еще иногда бонус появляется на grid хотя прописано,что координаты бонуса не равны координатам грида. помогите пожалуйста


Последний раз редактировалось udaaff; 18.01.2011 в 21:22.
Старый 14.01.2011, 22:13
Боня вне форума Посмотреть профиль Отправить личное сообщение для Боня Найти все сообщения от Боня
  № 2  
Ответить с цитированием
Боня

Регистрация: Mar 2010
Сообщений: 117
Ошибка происходит из-за:
Код AS3:
removeChild(bonus);
Просто кажется нужно написать так:

В функцие добавления бонуса:
Код AS3:
 private function addBonus()
        {
            if (bon == false)
            {
                bonus = new Bonus_mc  ;
                bonus.y != grid.y;
                bonus.x != grid.x;
                bonus.x = Math.ceil(Math.random() * 18) * 20 + 10;
                bonus.y = Math.ceil(Math.random() * 18) * 20 + 10;
                bonus.gotoAndStop(1);
                bon = true;
bonus.name = "bonus";//Добавте вот такую строчку.--------------------------
                addChild(bonus);
                trace("Bon =",bon);
 
            }
 
 
 
            trace("Bonus initialized...");
 
        }
Тем самым мы дали вашему клипу имя. И теперь можно его удалить.
Если ошибка повторится то замените:
Код AS3:
removeChild(bonus);
На:
Код AS3:
removeChild(getChildByName("bonus"));
Добавлено через 4 минуты
Не успел дописать. Если вы будете крипить бонусов больше одного, то имена должны быть разные.
Я делаю так:
Код AS3:
var nd:int = 0;
function addBonus():void
{
    bonus = new Bonus_mc ;
    bonus.y != 100;
    bonus.x != 100;
    bonus.name = "bonus"+nd;//Имя бонуса будет bonus0, следующего bonus1...
    nd++;
    addChild(bonus);
}
А потом по имени обращаемся к элементам и удаляем их.

Добавлено через 46 минут
Время свободное выдалось. По поводу второго вопроса:
Код AS3:
bonus.y != grid.y;
bonus.x != grid.x;
Вообще не видал, что бы так писали. Но рас уж компилятор обработал и допустим всё работает то вот ответ:
Код AS3:
bonus.y = 100;
grid.y = 101;
bonus.x = 100;
grid.x = 101;
Для компьютера координаты не равны, а вот на глаз не скажешь, т.к. разница всего лиш в пиксель. Но в таком случае нужно не так делать, а проверку после random ставить.

Старый 14.01.2011, 23:36
drnet_ua вне форума Посмотреть профиль Отправить личное сообщение для drnet_ua Найти все сообщения от drnet_ua
  № 3  
Ответить с цитированием
drnet_ua
 
Аватар для drnet_ua

Регистрация: Jul 2010
Адрес: 50° 27′ 0″ N, 30° 30′ 0″ E
Сообщений: 256
Записей в блоге: 2
что-то не то помойму....

проверте куда вы бонус добавляете, и откуда вы его удаляете

Добавлено через 2 минуты
вот пример:
Код AS3:
var a:Sprite = new Sprite();
removeChild(a);
Цитата:
[Fault] exception, information=ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
а так все в порядке:

Код AS3:
var a:Sprite = new Sprite();
addChild(a); 
removeChild(a);

Старый 15.01.2011, 02:35
flax4Noob вне форума Посмотреть профиль Отправить личное сообщение для flax4Noob Найти все сообщения от flax4Noob
  № 4  
Ответить с цитированием
flax4Noob
[+1 15.01.11]

Регистрация: Jan 2011
Сообщений: 70
Код AS3:
  bonus.y != grid.y;
  bonus.x != grid.x;
плакал.


мое ИМХО- бонус причалдился к Universe, а удалить ты его пытаешься из Hero. Тебе надо в hero поиметь ссылку на Universe и сделать Universe.removeChild()

trace(bonus.parent) должно спасать. и что-то вроде hasChild было. не помнить ((

Старый 15.01.2011, 21:26
reNiks вне форума Посмотреть профиль Отправить личное сообщение для reNiks Найти все сообщения от reNiks
  № 5  
Ответить с цитированием
reNiks

Регистрация: Dec 2010
Адрес: арх. обл.
Сообщений: 38
хм.сделал как вы все посоветовали, но тут вот в чем проблема: бонус в начале игры создается, затем при контакте с героем удаляется и больше не появляется. попробовал сделать function addBonus() такой: function addBonus(e:Event) но результат тот же(слушателя добавил правильно, он работает). возможно что переменная бон каким-то образом не работает(не сообщается между классами):в классе Юниверзе создается бонус, т.е. бон = тру, а в классе Херо он удаляется,т.е. бон = фолз. как сделать чтоб новый бонус появлялся при удалении предыдущего?
ПЫ.СЫ Возник вопрос не по теме, возможно кто знает. Где можно посмотреть алгоритмы для движения врагов как в пачмане? думал сам но логика не придумывается.

Старый 15.01.2011, 21:42
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 6  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
по-моему лучше сделать функцию удаления внутри самого класса бонуса:
Код AS3:
public function removeMe():void
{
      if (this.parent.contains(this))
                 this.parent.removeChild(this);
}
и вызывать уже ее

Код AS3:
if (bonus.hitTestPoint(ball.x,ball.y,true))
            {
                bon = false;
                bonus.removeMe();
            }

п.с. Такую запись:
Код AS3:
if (bon == false)
можно заменить такой:
Код AS3:
if (!bon)

Старый 16.01.2011, 17:46
reNiks вне форума Посмотреть профиль Отправить личное сообщение для reNiks Найти все сообщения от reNiks
  № 7  
Ответить с цитированием
reNiks

Регистрация: Dec 2010
Адрес: арх. обл.
Сообщений: 38
Извените, но или я чего-то не понял, или вы не прочитали мой предыдущий пост:
Цитата:
Сообщение от reNiks Посмотреть сообщение
хм.сделал как вы все посоветовали, но тут вот в чем проблема: бонус в начале игры создается, затем при контакте с героем удаляется и больше не появляется. попробовал сделать function addBonus() такой: function addBonus(e:Event) но результат тот же(слушателя добавил правильно, он работает). возможно что переменная бон каким-то образом не работает(не сообщается между классами):в классе Юниверзе создается бонус, т.е. бон = тру, а в классе Херо он удаляется,т.е. бон = фолз. как сделать чтоб новый бонус появлялся при удалении предыдущего?

Старый 16.01.2011, 19:56
incvizitor вне форума Посмотреть профиль Отправить личное сообщение для incvizitor Найти все сообщения от incvizitor
  № 8  
Ответить с цитированием
incvizitor
 
Аватар для incvizitor

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
Вообще Hero должен диспатчить событие. "MOVED" или что то в этом роде. А уже Universe проверять что к чему. Просто Ваш Hero может столкнуться и с ямой, и с врагом, и с черной дырой, и с многими прелестями Вашего игрового мира. Вы собираетесь описывать все данные случаи в классе Hero?
__________________
ranga

Старый 16.01.2011, 21:06
flax4Noob вне форума Посмотреть профиль Отправить личное сообщение для flax4Noob Найти все сообщения от flax4Noob
  № 9  
Ответить с цитированием
flax4Noob
[+1 15.01.11]

Регистрация: Jan 2011
Сообщений: 70
Код AS3:
hero.addCollision(new bonusCollision(event.target /* aka bon*/));
я бы так делал примерно. Не претендует, просто идея.

Добавлено через 4 минуты
Цитата:
как сделать чтоб новый бонус появлялся при удалении предыдущего?
вызвать
Код AS3:
addBonus();
там где вы его удаляете.

Старый 18.01.2011, 20:49
reNiks вне форума Посмотреть профиль Отправить личное сообщение для reNiks Найти все сообщения от reNiks
  № 10  
Ответить с цитированием
reNiks

Регистрация: Dec 2010
Адрес: арх. обл.
Сообщений: 38
ой простите за тупой вопрос, но как функцию, созданную в одном массиве, вызвать в другом. посмотрел в поиске но не нашел почему то. Universe(ссылка на класс).addBonus(ссылка на функцию) не работает

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

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

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


 


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


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