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

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

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

Регистрация: Mar 2011
Сообщений: 40
Question Не могу понять где ошибка

Здравствуйте, уважаемые форумчане, сегодня столкнулся с следующей проблемой: на сцене создается танк и турелька. По замыслу турель должна стрелять по танку и при попадании снаряд должен исчезать(делал через хитТестОбжект), но в итоге снаряд не исчезает, а в ошибках выводится Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
вот код класса турели

Код AS3:
package 
{
 
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	//import Main;
 
	public class gatlingGun extends MovieClip
	{
		//public var range:Sprite;
		public var _X,_Y:Number;
		private var delay = 10;
		private var begin_rld = 11;
		public var rng = 300;
		public function gatlingGun(X:Number,Y:Number):void
		{
			this.x = X;
			this.y = Y;
		}
		public function aim(b:MovieClip)
		{
			this.rotation = Math.atan2(b.y - this.y,b.x - this.x) / Math.PI * 180;
		}
 
		public function shoot(t:Boolean,mc:MovieClip)
		{
			if (begin_rld <= delay)
			{
				begin_rld++;
			}
			if ((begin_rld>delay)&&(t))
			{
				var b:bullet = new bullet(0,0,0);
				this.barrel1.addChildAt(b,0);
				var c:bullet = new bullet(0,0,0);
				this.barrel2.addChildAt(c,0);
				begin_rld = 0;
			}
			if (! t)
			{
				begin_rld++;
			}
			if (b.hitTestObject(mc))
			{
				b.kill();
			}
			if (b.hitTestObject(mc))
			{
				b.kill();
			}
 
		}
 
		public function inrange(b:MovieClip):Boolean
		{
			var x0 = b.x,y0 = b.y;
			var g=Math.sqrt(Math.pow((this.x-x0),2)+Math.pow((this.y-y0),2));
			if (g < rng)
			{
				return true;
			}
			if (g > rng)
			{
				return false;
			}
			return false;
		}
 
	}
 
}
и класса снаряда
Код AS3:
package {
 
	import flash.display.MovieClip;
	import flash.events.Event;
 
	public class bullet extends MovieClip {
		var X1,Y1,A1:Number;
		var speed;
		var thisBul:MovieClip;
		var thispar:*;
		public function bullet(X:Number,Y:int,A:Number) {
			this.x=X;
			this.y=Y;
			//trace(this.y);
			this.rotation=A;
			this.addEventListener(Event.ADDED,init);
		}
		function init(e:Event):void {
			speed=50;
			thispar= e.currentTarget.parent;
			thisBul = MovieClip(this.parent.getChildByName(this.name));
			addEventListener(Event.ENTER_FRAME, movb);
		}
		function movb(e:Event) {
			A1= (this.rotation)/180*Math.PI; 
			this.x+=Math.cos(A1)*speed;
			this.y+=Math.sin(A1)*speed;
 
		if(this.x<0||this.x>stage.stageWidth||this.y<0||this.y>stage.stageHeight) kill();
		}
		public function kill() {
	    	removeEventListener(Event.ENTER_FRAME, movb); 
			this.parent.removeChild(thisBul);
		}
	}
}
что я не правильно сделал?

Старый 02.05.2011, 17:47
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 2  
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Код AS3:
thisBul = MovieClip(this.parent.getChildByName(this.name));
- не нравится мне вот это. Чем вас просто this не устроил?

Код AS3:
this.parent.removeChild(thisBul);
Если мои предположения верны - то ошибка вот тут.

Я бы сделал наверное вот так:
Код AS3:
thisBul = this;//хотя зачем вообще эта переменная я не очень-то понимаю.
 
//***************
this.parent.removeChild(this);
Ну и собственно говорить паренту удалить себя - не совсем красиво... Надо бы что-то другое придумать. Хотя я сам так иногда делаю Очень редко

Добавлено через 2 минуты
А, и еще одно.

Созданные в коде классы незачем екстендить от мувиклипа, лучше от спрайта, разница не большая, зато путаницы меньше. Разница между мувиком и спрайтом только в том что там есть кадры а там нету. Но фишка в том что добавлять кадры программно нельзя. Следовательно вы делаете мувик, но пользуетесь им как спрайтом. Красивее и однозначнее было бы екстендить спрайты в коде
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 02.05.2011, 19:48
CARVILLE вне форума Посмотреть профиль Отправить личное сообщение для CARVILLE Найти все сообщения от CARVILLE
  № 3  
CARVILLE

Регистрация: Mar 2011
Сообщений: 40
Попробовал как написано, не помогло, все то же выскакивает.Я правильно понял, ошибка происходит из-за того что на момент выполнения кода
Код AS3:
if (b.hitTestObject(mc))
	{  b.kill();}
if (с.hitTestObject(mc))
	{с.kill();}
в переменных c и b полностью не определенны все методы??? Если да то как с этим бороться?

Старый 02.05.2011, 20:09
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 4  
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Та все-равно ботва.

У тя там в логике провтык.

Вот смотри:
Код AS3:
public function shoot(t:Boolean,mc:MovieClip)
		{
...
                        //Не факт что пуля создается, так как условие может и не выполняться
			if ((begin_rld>delay)&&(t))
			{
				var b:bullet = new bullet(0,0,0);
				this.barrel1.addChildAt(b,0);
				var c:bullet = new bullet(0,0,0);
				this.barrel2.addChildAt(c,0);
				begin_rld = 0;
			}
 
...
                        // но даже если она и создастся, то получается что мы ее только что создали 
                        // и сразу пытаемся тестировать на совпадение с целью. 
                        // А судя по коду снаряда - он ведь еще лететь должен.
			if (b.hitTestObject(mc))
			{
				b.kill();
			}
			if (b.hitTestObject(mc))
			{
				b.kill();
			}
 
		}
Добавь пуле параметр "цель" Ну или пачку возможных целей
И там где твоя пуля летит (movb()) - проверяй на хитТест.
т.е. вот эту проверку из функции выстрела перенеси в пулю.
А потом не втупую дергай метод kill(), а к примеру диспатч событие "пуляВзорвалась", А турель пусть подпишется на события пули, и когда получит от пули маяк - сама удалит ее из своего дисплей-листа.
Т.е. чтобы пуля сама себя удалять не пыталась.

Как вариант можно оставить эти проверки в турели, но тогда тебе нужен массив активных пуль. И каждый кадр проганять по этому массиву проверку на хиттест. Короче, вариантов море, но ты выбрал неправильный)) Думай дальше
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 02.05.2011, 20:26
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Название темы не отражает сути вопроса.
__________________
Reality.getBounds(this);

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

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

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


 


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


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