|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
нулевая ссылка на объект
помогите, никак не могу найти причину проблемы, пишет что
TypeError: Error #1009: Cannot access a property or method of a null object reference. at package_cl::gl_ship_cl/fn_stage_x_y_ship() at package_cl::gl_ship_cl/fn_control_ship() если из класс main удалить, то всё control_bullet = new Control_bullet_cl (gl_ship) нормально, а если оставить, то кораблик перестаёт двигаться и лезет эта ошибка package { import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.events.Event; import flash.display.MovieClip; import package_cl.str_daub_cl; import package_cl.gl_ship_cl; import package_cl.bullet_cl; import package_cl.vector_bullet_cl; import package_cl.Control_bullet_cl; public class main extends MovieClip { public var str_daub: str_daub_cl = new str_daub_cl(); private var gl_ship: gl_ship_cl; public var bullet: bullet_cl = new bullet_cl(); public var vector_bullet: vector_bullet_cl = new vector_bullet_cl(); private var control_bullet: Control_bullet_cl; public function main() { this.addChild(str_daub); str_daub.str_daub_Array[3].addEventListener(MouseEvent.CLICK, fn_click_btn); } public function fn_click_btn(e: MouseEvent): void { str_daub.str_daub_Array[3].removeEventListener(MouseEvent.CLICK, fn_click_btn); this.removeChild(str_daub); gl_ship = new gl_ship_cl(); this.addChild(gl_ship); control_bullet = new Control_bullet_cl (gl_ship); //вот от этой строки проблемы stage.focus = stage; } } } package package_cl { import flash.events.KeyboardEvent; import package_cl.gl_ship_cl; import package_cl.vector_bullet_cl; import flash.display.Sprite; public class Control_bullet_cl extends Sprite{ private var vr_bullet: vector_bullet_cl = new vector_bullet_cl(); private var gl_ship: gl_ship_cl = new gl_ship_cl(); public function Control_bullet_cl(gl_ship) { // constructor code stage.addEventListener(KeyboardEvent.KEY_DOWN, fn_fire_down); stage.addEventListener(KeyboardEvent.KEY_UP, fn_fire_up); } private function fn_fire_down(): void { } private function fn_fire_up(): void { } } } package package_cl { import flash.display.Sprite; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.events.Event; import flash.geom.Point; import package_cl.global_variable_cl; import package_cl.vector_bullet_cl; import package_cl.bullet_cl; public class gl_ship_cl extends gl_ship_mc { private var upPressed: Boolean = false; private var leftPressed: Boolean = false; private var rightPressed: Boolean = false; private var gl_variable: global_variable_cl; private var ver_bullet: vector_bullet_cl; /////////////////////////////// public function gl_ship_cl() { gl_variable = new global_variable_cl(); ver_bullet = new vector_bullet_cl(); x = 800; y = 525; this.addEventListener(Event.ENTER_FRAME, fn_control_ship); private function fn_control_ship(e: Event): void { if (rightPressed) { rotation += gl_variable.rotation_ship; } if (leftPressed) { rotation -= gl_variable.rotation_ship; } if (upPressed) { if (gl_variable.jump_ship <= gl_variable.jump_ship_max) { gl_variable.jump_ship += gl_variable.factor_jump_ship; } vector_Vx_ship = gl_variable.factor_speed_ship * gl_variable.jump_ship * Math.cos(rotation * Math.PI / 180); vector_Vy_ship = gl_variable.factor_speed_ship * gl_variable.jump_ship * Math.sin(rotation * Math.PI / 180); x -= vector_Vx_ship; y -= vector_Vy_ship; } else { if (gl_variable.jump_ship >= 0.2) { vector_Vx_ship = vector_Vx_ship * gl_variable.braking_ship; vector_Vy_ship = vector_Vy_ship * gl_variable.braking_ship; x -= vector_Vx_ship; y -= vector_Vy_ship; gl_variable.jump_ship -= 0.15; } } fn_stage_x_y_ship(); } private function fn_stage_x_y_ship(): void { if (x > stage.stageWidth - 30) { x = 30; } if (x < 30) { x = stage.stageWidth - 30; } if (y > stage.stageHeight - 30) { y = 180; } if (y < 180) { y = stage.stageHeight - 30; } } } } тут немного больше переменных, код не полный, боюсь если начну сильнее править, допущу ошибку |
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
Подпишитесь в конструкторах, в которых обращаетесь ко stage на событие ADDED_TO_STAGE.
|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Gerbert ну у меня только в main нет, добавил, но ничего не изменилось или я не туда пишу?
package { import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.events.Event; import flash.display.MovieClip; import package_cl.str_daub_cl; import package_cl.gl_ship_cl; import package_cl.bullet_cl; import package_cl.vector_bullet_cl; import package_cl.Control_bullet_cl; public class main extends MovieClip { public var str_daub: str_daub_cl = new str_daub_cl(); private var gl_ship: gl_ship_cl; public var bullet: bullet_cl = new bullet_cl(); public var vector_bullet: vector_bullet_cl = new vector_bullet_cl(); private var control_bullet: Control_bullet_cl; public function main() { this.addChild(str_daub); str_daub.str_daub_Array[3].addEventListener(MouseEvent.CLICK, fn_click_btn); this.addEventListener(Event.ADDED_TO_STAGE, fn_click_btn); } public function fn_click_btn(e: MouseEvent): void { str_daub.str_daub_Array[3].removeEventListener(MouseEvent.CLICK, fn_click_btn); this.removeChild(str_daub); gl_ship = new gl_ship_cl(); this.addChild(gl_ship); control_bullet = new Control_bullet_cl (gl_ship); stage.focus = stage; } } } |
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
Чего нет? Чего у Вас точно нет, так это подписок на добавление на сцену.
К сцене Вы обращаетесь из конструктора, но её ещё нет, вот и ошибка. Вот для примера, Вы подписываете сцену, которой ещё возможно нет. |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
понял, что бы подписать, нужно сделать так? (нет возможности сразу проверить)
package package_cl { import flash.events.KeyboardEvent; import package_cl.gl_ship_cl; import package_cl.vector_bullet_cl; import flash.display.Sprite; public class Control_bullet_cl extends Sprite{ private var vr_bullet: vector_bullet_cl = new vector_bullet_cl(); private var gl_ship: gl_ship_cl = new gl_ship_cl(); public function Control_bullet_cl(gl_ship) { this.addEventListener(Event.ADDED_TO_STAGE, fn_stagr); } private function fn_stage (e:Event):void{ stage.addEventListener(KeyboardEvent.KEY_DOWN, fn_fire_down); stage.addEventListener(KeyboardEvent.KEY_UP, fn_fire_up); } private function fn_fire_down(): void { } private function fn_fire_up(): void { } } } |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
спасибо, буду знать, адоб ругался на такую запись, если нет импорта Sprite, да и пока я траекторией снарядов не занялся, всё работало без ADDED_TO_STAGE, хоть и было обращение, теперь буду знать
Добавлено через 19 часов 1 минуту Короче совсем не помогает, только ошибок больше стало Плиз объясните, как правильно писать. Есть обращение к stage, но функция подписана на энтер_фрейм уже? Дальше, мне для каждой функции, которая обращается в одном классе к stage, нужно подписывать на события? дальше, есть функция, она подписана на энтер_фрейм, в ней вызывается функция, в которой есть обращение к stage, что делать? ещё вопрос, если я в один класс импортирую друго, создавая переменную, то создаётся ссылка или копия? а то я уже начал путаться просто у меня есть класс "1", который изменяется классом "2" в процессе выполнения, а класс "3" использует класс "1" и вызывает при необходимости функцию класса "2", что бы изменить класс "1" Последний раз редактировалось neonoviiwolf; 20.12.2014 в 15:39. |
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
Объекты присваиваются по ссылкам. По "копиям" простые типы - number, string, boolean.
И ещё раз - подписываться на добавление на сцену нужно так, где вы к сцене обращаетесь в конструкторе. |
|
|||||
Цитата:
@ТС, учитесь пользоваться дебагером, и тогда такие вопросы у вас возникать не будут.
__________________
местонахождение |
Часовой пояс GMT +4, время: 02:54. |
|
« Предыдущая тема | Следующая тема » |
|
|