PDA

Просмотр полной версии : TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект


Денис Давидоглу
16.05.2015, 22:53
Здравствуйте!
У меня на сцене стоит MovieClip с именем player_mc.
При компиляции у меня выпадает ошибка :

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at org.denis::WolfClass()
at _fla::MainTimeline/frame1()

Код в классе WolfClass

package org.denis
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;

/**
* ...
* @author Denis Davidoglu
*/




public class WolfClass extends Sprite
{

public var uPress:Boolean = false;
public var dPress:Boolean = false;
public var rPress:Boolean = false;
public var lPress:Boolean = false;
public var wSpeed:Number = 5;
private var wolf:MovieClip;

public function WolfClass(player)
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, _keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, _keyUp);
stage.addEventListener(Event.ENTER_FRAME, moveWolf);
wolf = player;
}

public function _keyDown(e:KeyboardEvent)
{
if (e.keyCode == 37) {
lPress = true;
}
if (e.keyCode == 38) {
uPress = true;
}
if (e.keyCode == 39) {
rPress = true;
}
if (e.keyCode == 40) {
dPress = true;
}
}

public function _keyUp(e:KeyboardEvent)
{
if (e.keyCode == 37) {
lPress = false;
}
if (e.keyCode == 38) {
uPress = false;
}
if (e.keyCode == 39) {
rPress = false;
}
if (e.keyCode == 40) {
dPress = false;
}
}


public function moveWolf(e:Event)
{
if (lPress) {
wolf.x -= wSpeed;
}
if (rPress) {
wolf.x += wSpeed;
}
if (uPress) {
wolf.y -= wSpeed;
}
if (dPress) {
wolf.y += wSpeed;
}
}
}

}


В самом флеше :

import org.denis.WolfClass;
stop();

var playerControl:WolfClass = new WolfClass(player_mc);


Помогите пожалуйста! Заранее спасибо! :)

undefined
16.05.2015, 23:54
Хоспади. Народ, неужели IDE не подсвечивает вам строку,где ошмбка выскочила?
по теме: перед обращением к stage. Надо бы на этот стейдж свой playerControl добавить,либо, что проще узнать стейдж у player если он сам туда добавлен. Т.е. заменить все stage в конструкторе на player.stage
p.s: рекомендую почитать про команду trace-сильно упростит отладку в будущем

neonoviiwolf
17.05.2015, 02:41
У вас это не основной класс, хотите получить доступ stage, просто передайте туда его(если класс не добавляется на сцену), так же как player и добавите в началоe

private var wolf:MovieClip;
private var stage:*;

public function WolfClass(player: MovieClip, _stage:*)
{
stage = _stage;
stage.addEventListener(KeyboardEvent.KEY_DOWN, _keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, _keyUp);
stage.addEventListener(Event.ENTER_FRAME, moveWolf);
wolf = player;
}

caseyryan
17.05.2015, 08:57
Сказать, что эта тема уже заезжена - это ничего не сказать)
Чуть ли не каждую неделю уже много лет, создают темы с подобным вопросом.

Просто делаем так:

public function WolfClass(player)
{
wolf = player;
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
stage.addEventListener(KeyboardEvent.KEY_DOWN, _keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, _keyUp);
stage.addEventListener(Event.ENTER_FRAME, moveWolf);
}

Профит

Wolsh
17.05.2015, 15:05
private var stage:*;Это типа "кидай сюда что в голову взбредет"? Зачем учить шиткоду?

caseyryan
17.05.2015, 15:24
Да эта штука даже с объектом Stage работать не будет) Сразу возникнет конфликт определений. У дисплей объекта уже есть свое свойство stage

Денис Давидоглу
17.05.2015, 18:10
Ошибок больше нет но функции moveWolf, _keyUp и _keyDown по чему-то не срабатывают.
Я вписал туда trace и нечего не вывелось.

caseyryan
17.05.2015, 18:19
addChild(playerControl);