![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2011
Сообщений: 40
|
Здравствуйте, уважаемые форумчане, сегодня столкнулся с следующей проблемой: на сцене создается танк и турелька. По замыслу турель должна стрелять по танку и при попадании снаряд должен исчезать(делал через хитТестОбжект), но в итоге снаряд не исчезает, а в ошибках выводится Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
вот код класса турели 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; } } } 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); } } } |
|
|||||
|
- не нравится мне вот это. Чем вас просто this не устроил?
Если мои предположения верны - то ошибка вот тут. Я бы сделал наверное вот так: thisBul = this;//хотя зачем вообще эта переменная я не очень-то понимаю. //*************** this.parent.removeChild(this); Очень редко ![]() Добавлено через 2 минуты А, и еще одно. Созданные в коде классы незачем екстендить от мувиклипа, лучше от спрайта, разница не большая, зато путаницы меньше. Разница между мувиком и спрайтом только в том что там есть кадры а там нету. Но фишка в том что добавлять кадры программно нельзя. Следовательно вы делаете мувик, но пользуетесь им как спрайтом. Красивее и однозначнее было бы екстендить спрайты в коде ![]()
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Регистрация: Mar 2011
Сообщений: 40
|
Попробовал как написано, не помогло, все то же выскакивает.Я правильно понял, ошибка происходит из-за того что на момент выполнения кода
в переменных c и b полностью не определенны все методы??? Если да то как с этим бороться? |
|
|||||
|
Та все-равно ботва.
У тя там в логике провтык. Вот смотри: 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(), а к примеру диспатч событие "пуляВзорвалась", А турель пусть подпишется на события пули, и когда получит от пули маяк - сама удалит ее из своего дисплей-листа. Т.е. чтобы пуля сама себя удалять не пыталась. Как вариант можно оставить эти проверки в турели, но тогда тебе нужен массив активных пуль. И каждый кадр проганять по этому массиву проверку на хиттест. Короче, вариантов море, но ты выбрал неправильный)) Думай дальше ![]()
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Название темы не отражает сути вопроса.
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 11:39. |
|
|
« Предыдущая тема | Следующая тема » |
|
|