PDA

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


Ransy92
19.04.2011, 19:58
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at JumperGame/enterFrameHandler()[C:\myProjects\Текущая работа\JumperGame\JumperGame.as:82]

Такая проблема. 2 дня бьюсь с ней. Привожу код в 5-м кадре проэкта:

var jumpg:JumperGame = new JumperGame();
parent.addChild(jumpg);

И код JumperGame.as:

package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Stage;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

public class JumperGame extends MovieClip
{
public const GRAVITY:Number = 2;
public const BOUNCE_FACTOR:Number = 0.8;
public const HIT_FORCE:Number = 20;

public var _hero:Hero;
private var _vx:Number;
private var _vy:Number;
public var speed:Number = 1;

var left:Boolean = false;
var up:Boolean = false;
var right:Boolean = false;
var down:Boolean = false;

public function JumperGame():void
{
addEventListener(Event.ADDED_TO_STAGE, startApplication);
}
private function startApplication (e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, startApplication);
_vx = 0;
_vy = 0;

addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down); //движение
stage.addEventListener(KeyboardEvent.KEY_UP, key_up); ///
}



private function key_down(e:KeyboardEvent):void
{
if (e.keyCode == 37)
{
left = true;
}
if (e.keyCode == 38)
{
up = true;
}
if (e.keyCode == 39)
{
right = true;
}

}

private function key_up (e:KeyboardEvent):void
{
if (e.keyCode == 37)
{
left = false;
}
if (e.keyCode == 38)
{
up = false;
}
if (e.keyCode == 39)
{
right = false;
}

}


public function enterFrameHandler (e:Event):void
{
_vy += GRAVITY; //гравитация

_hero.x += _vx; //Движение героя
_hero.y += _vy; //

if (left)
{_hero.x -= speed}
if (right)
{_hero.x += speed}
if (up)
{_hero.y -= speed}

checkBoundaryCollision(); //столкновение
}


private function checkBoundaryCollision():void
{
var left:Number;
var right:Number;
var top:Number;
var bottom:Number;

left = _hero.x - (_hero.width / 2);
right = _hero.x + (_hero.width / 2);
top = _hero.y + (_hero.height / 2);
bottom = _hero.y - (_hero.height / 2);

if (left < 0 && _vx < 0)
{
_hero.x = _hero.width / 2;
_vx *= -1;
}
else if (right > stage.stageWidth && _vx > 0)
{
_hero.x = stage.stageWidth - (_hero.width / 2);
_vx *= -1;
}

if (top < 0 && _vy < 0)
{
_hero.y = _hero.height / 2;
_vy *= -1;
}

else if (bottom > stage.stageHeight && _vy > 0)
{
_hero.y = stage.stageHeight - (_hero.height / 2);
_vy *= -BOUNCE_FACTOR;
_vx *= -BOUNCE_FACTOR;
}
}

private function hit (hitX:Number, hitY:Number):void
{
_vy -= HIT_FORCE;

if (_vy > 0)
{
_vy *= -BOUNCE_FACTOR / 2;
}
if (_vx * hitX > 0)
{
_vx *= -BOUNCE_FACTOR;
}

_vx -= (2 * hitX / _hero.width) * HIT_FORCE;
}
}
}

t4arty
19.04.2011, 20:36
слушайте событие ADD_TO_STAGE

Ransy92
19.04.2011, 20:48
Не понял, конкретнее что сделать/изменить?

DZHETIGAPA
19.04.2011, 20:51
Изменить свой пост до приемлемого вида и слушать событие добавление на сцену, как тебе сказали выше

Ransy92
19.04.2011, 21:21
Конкретного ответа, так понял не дождусь.

Добавлено через 2 минуты
я новичок и понять сообщение "слушай событие" мне сложно, а от "слушать событие добавление на сцену, как тебе сказали выше" понятнее не стало

Psycho Tiger
19.04.2011, 21:38
У нас код принято оформлять тегами [ AS3 ]. А в интернете модно сперва читать (http://flasher.ru/forum/showpost.php?p=582057&postcount=70) фак.
Он ведь совсем недалеко. (http://flasher.ru/forum/showpost.php?p=582067&postcount=71)

Ransy92
19.04.2011, 22:10
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Stage;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

public class JumperGame extends MovieClip
{
public const GRAVITY:Number = 2;
public const BOUNCE_FACTOR:Number = 0.8;
public const HIT_FORCE:Number = 20;

public var _hero:Hero;
private var _vx:Number;
private var _vy:Number;
public var speed:Number = 1;

var left:Boolean = false;
var up:Boolean = false;
var right:Boolean = false;
var down:Boolean = false;

public function JumperGame():void
{
addEventListener(Event.ADDED_TO_STAGE, startApplication);
}
private function startApplication (e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, startApplication);
_vx = 0;
_vy = 0;

addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down); //движение
stage.addEventListener(KeyboardEvent.KEY_UP, key_up); ///
}



private function key_down(e:KeyboardEvent):void
{
if (e.keyCode == 37)
{
left = true;
}
if (e.keyCode == 38)
{
up = true;
}
if (e.keyCode == 39)
{
right = true;
}

}

private function key_up (e:KeyboardEvent):void
{
if (e.keyCode == 37)
{
left = false;
}
if (e.keyCode == 38)
{
up = false;
}
if (e.keyCode == 39)
{
right = false;
}

}


public function enterFrameHandler (e:Event):void
{
_vy += GRAVITY; //гравитация

_hero.x += _vx; //Движение героя
_hero.y += _vy; //

if (left)
{_hero.x -= speed}
if (right)
{_hero.x += speed}
if (up)
{_hero.y -= speed}

checkBoundaryCollision(); //столкновение
}


private function checkBoundaryCollision():void
{
var left:Number;
var right:Number;
var top:Number;
var bottom:Number;

left = _hero.x - (_hero.width / 2);
right = _hero.x + (_hero.width / 2);
top = _hero.y + (_hero.height / 2);
bottom = _hero.y - (_hero.height / 2);

if (left < 0 && _vx < 0)
{
_hero.x = _hero.width / 2;
_vx *= -1;
}
else if (right > stage.stageWidth && _vx > 0)
{
_hero.x = stage.stageWidth - (_hero.width / 2);
_vx *= -1;
}

if (top < 0 && _vy < 0)
{
_hero.y = _hero.height / 2;
_vy *= -1;
}

else if (bottom > stage.stageHeight && _vy > 0)
{
_hero.y = stage.stageHeight - (_hero.height / 2);
_vy *= -BOUNCE_FACTOR;
_vx *= -BOUNCE_FACTOR;
}
}

private function hit (hitX:Number, hitY:Number):void
{
_vy -= HIT_FORCE;

if (_vy > 0)
{
_vy *= -BOUNCE_FACTOR / 2;
}
if (_vx * hitX > 0)
{
_vx *= -BOUNCE_FACTOR;
}

_vx -= (2 * hitX / _hero.width) * HIT_FORCE;
}
}
}

Добавлено через 49 секунд
проблема здесь

public function enterFrameHandler (e:Event):void
{
_vy += GRAVITY; //гравитация

_hero.x += _vx; //Движение героя
_hero.y += _vy; //

if (left)
{_hero.x -= speed}
if (right)
{_hero.x += speed}
if (up)
{_hero.y -= speed}

checkBoundaryCollision(); //столкновение
}

Добавлено через 7 минут
Попробовал варианты, которые предложили мне, но все равно не получилось.
Может, нужно переписать весь код?

DZHETIGAPA
19.04.2011, 22:27
Кто такой у тебя hero? В переменных определен, но нигде не создан. В этом и проблема, так как ты используешь свойства несуществующего объекта.

etc
19.04.2011, 22:29
Ransy92, отредактируйте свой первый пост и оформите там код тегами .

Ransy92
19.04.2011, 22:37
2 DZHETIGAPA
Он уже есть на сцене, Инстанс нэйм _hero.

DZHETIGAPA
20.04.2011, 00:22
потрейси объект hero, существует ли он вообще?

Ошибка полюбому в hero. Ты определил переменную hero класса Hero. А есть ли у тебя такой класс вообще? и раз ты определил переменную класса, то надо создать экземпляр этого класса типа

private var hero:Hero = new Hero()


Добавлено через 2 минуты
Раз _hero есть на сцене, то удали объявление _hero, как переменной в классе. То есть удали эту строчку

public var _hero:Hero;


Либо сделай как я написал выше, либо как написал щас.

Ransy92
20.04.2011, 17:21
оба способа не сработали. Спасибо все равно, буду сам искать, либо тогда уж заново по строчке писать и дебагить постоянно.

Nikem79
17.12.2012, 12:38
Подскажите пожалуйста, пытаюсь добавить несколько кнопок на сцену, но больше одной не получается, выдаёт ошибку

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

Сам код:

DM.stop();


ракета.addEventListener(MouseEvent.CLICK, playF);
//ёлка.addEventListener(MouseEvent.CLICK, stopF);
ёлка.addEventListener(MouseEvent.MOUSE_DOWN, elk);

function playF(Event:MouseEvent):void {
trace ("ракета");
}
function elk(Event:MouseEvent):void {
trace ("ёлка");
}