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

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

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

Регистрация: 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) нормально, а если оставить, то кораблик перестаёт двигаться и лезет эта ошибка
Код AS3:
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;
		}
	}
}
Код AS3:
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 {
 
		}
 
	}
 
}
Код AS3:
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;
			}
		}
        }
}
Добавлено через 1 минуту
тут немного больше переменных, код не полный, боюсь если начну сильнее править, допущу ошибку

Старый 19.12.2014, 16:29
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 2  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Подпишитесь в конструкторах, в которых обращаетесь ко stage на событие ADDED_TO_STAGE.

Старый 19.12.2014, 17:03
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 3  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Gerbert ну у меня только в main нет, добавил, но ничего не изменилось или я не туда пишу?

Код AS3:
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;
		}
	}
}

Старый 19.12.2014, 17:05
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 4  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
В конструкторе класса Control_bullet_cl вы обращаетесь к stage.

Старый 19.12.2014, 17:07
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 5  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Чего нет? Чего у Вас точно нет, так это подписок на добавление на сцену.
К сцене Вы обращаетесь из конструктора, но её ещё нет, вот и ошибка.
Вот для примера, Вы подписываете сцену, которой ещё возможно нет.
Код AS3:
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);
		}

Старый 19.12.2014, 19:44
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 6  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
понял, что бы подписать, нужно сделать так? (нет возможности сразу проверить)

Код AS3:
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 {
 
		}
	}
}

Старый 19.12.2014, 20:03
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 7  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
neonoviiwolf как бы так, да. НО - vector_bullet_cl и gl_ship_cl должны так же иметь такую фишку, если идет обращение к стейдж
__________________
Марк Tween

Старый 20.12.2014, 15:10
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 8  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
спасибо, буду знать, адоб ругался на такую запись, если нет импорта Sprite, да и пока я траекторией снарядов не занялся, всё работало без ADDED_TO_STAGE, хоть и было обращение, теперь буду знать

Добавлено через 19 часов 1 минуту
Короче совсем не помогает, только ошибок больше стало
Плиз объясните, как правильно писать.
Есть обращение к stage, но функция подписана на энтер_фрейм уже? Дальше, мне для каждой функции, которая обращается в одном классе к stage, нужно подписывать на события? дальше, есть функция, она подписана на энтер_фрейм, в ней вызывается функция, в которой есть обращение к stage, что делать?


ещё вопрос, если я в один класс импортирую друго, создавая переменную, то создаётся ссылка или копия?
а то я уже начал путаться
Код AS3:
package {
 
import package_cl.gl_ship_cl;
 
     public class main extends MovieClip {
           private var gl_ship: gl_ship_cl = new gl_ship_cl ();
     }
}
просто у меня есть класс "1", который изменяется классом "2" в процессе выполнения, а класс "3" использует класс "1" и вызывает при необходимости функцию класса "2", что бы изменить класс "1"


Последний раз редактировалось neonoviiwolf; 20.12.2014 в 15:39.
Старый 20.12.2014, 16:16
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 9  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Объекты присваиваются по ссылкам. По "копиям" простые типы - number, string, boolean.

И ещё раз - подписываться на добавление на сцену нужно так, где вы к сцене обращаетесь
в конструкторе.

Старый 20.12.2014, 16:27
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 10  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Цитата:
По "копиям" простые типы - number, string, boolean.
По значению.

@ТС, учитесь пользоваться дебагером, и тогда такие вопросы у вас возникать не будут.
__________________
местонахождение

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

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

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


 


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


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