PDA

Просмотр полной версии : При создании экземпляра пользовательского класса возникает ошибка


OnEg1n
21.05.2010, 13:01
Здравствуйте!
Помогите в проблеме. Есть два класса первый MyRectangle создает прямоугольник и заставляет его двигаться. Как только прямоугольник доходит границы окна приложения он начинает двигаться в другую сторону.


package main {
import flash.display.*;
import flash.events.*;
import flash.utils.*;

public class MyRectangle extends Sprite{
var Rect:Shape=new Shape();
private var HMove:Boolean=true; //Переменные, которые определяют направление
private var VMove:Boolean=true; //по горизонтали или вертикали
private var speed:Number=10;

public function MyRectangle() {

drawRectangle(0xFF9900);
addChild(Rect);

addEventListener(Event.ENTER_FRAME,frameListener);


function frameListener(e:Event):void{

//Перемещение вправо
if(HMove==true){
trace("X: "+Rect.x);
if(Rect.x<=stage.stageWidth-stage.width){
Rect.x+=speed;
//e.updateAfterEvent();
}else{
HMove=false;
}
}

//Перемещение влево
if(HMove==false){
trace("X: "+Rect.x);
if(Rect.x>stage.x){
Rect.x-=speed;
}else{
HMove=true;
}
}

//Перемещение вверх
if(VMove==true){
trace("Y: "+Rect.y);
if(Rect.y<=stage.stageHeight-stage.height){
Rect.y+=speed;
//e.updateAfterEvent();
}else{
VMove=false;
}
}

//Перемещение вниз
if(VMove==false){
trace("Y: "+Rect.y);
if(Rect.y>stage.x){
Rect.y-=speed;
}else{
VMove=true;
}
}
}

//Ф-ция рисует прямоугольник
function drawRectangle(color:Number):void{
Rect.graphics.lineStyle(1);
Rect.graphics.beginFill(color,1);
Rect.graphics.drawRect(0,0,75,40);

}

}
}
}



Второй класс Brush объявляет переменную figura1.

package main {
import flash.display.*;
import main.MyRectangle;


public class Brush extends Sprite{
public var figura1:MyRectangle;
public function Brush() {
figura1=new MyRectangle();
}
}
}



Когда пытаюсь в переменную записать экземпляр класса MyRectangle, происходит ошибка

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Function/<anonymous>()
Помогите разобраться где я не прав.

enepx
21.05.2010, 13:21
вроде так
var Rect:Shape=new Shape();
нельзя писать. Попробуйте написать в конструкторе.

OnEg1n
21.05.2010, 13:45
Не возникнет ли проблем потом когда будет вызываться функция drawRectangle()?

Wolsh
21.05.2010, 14:01
1. Зря Вы запихали все функции в конструктор. Вложенные функции - зло.
2. Зачем вообще создавать новый Шейп где-то кроме drawRectangle() ? Держите связанный код вместе, зачем его раскидывать по всему классу.
3. Имена переменных пишутся с маленькой буквы. С большой - только названия классов и интерфейсов (ну и конструкторов соответственно)

OnEg1n
21.05.2010, 14:34
1. Зря Вы запихали все функции в конструктор. Вложенные функции - зло.
2. Зачем вообще создавать новый Шейп где-то кроме drawRectangle() ? Держите связанный код вместе, зачем его раскидывать по всему классу.
3. Имена переменных пишутся с маленькой буквы. С большой - только названия классов и интерфейсов (ну и конструкторов соответственно)

Спасибо приму к сведению. И все-таки, что скажите об ошибке? Что она означает и что я не так сделал.?

i.o.
21.05.2010, 14:59
поправьте вот так:

public class MyRectangle extends Sprite{
private var Rect:Shape;

......

public function MyRectangle() {

Rect = new Shape();

drawRectangle(0xFF9900);
addChild(Rect);


Возможно заработает

enepx
21.05.2010, 15:00
Спасибо приму к сведению. И все-таки, что скажите об ошибке? Что она означает и что я не так сделал.?
В вашем случае Вы из элементарной задачи сделали мегакод, который не работает. В программировании чем проще, тем лучше.

Сделайте примерно так:

function drawRectangle(color:Number):Shape {
var result:Shape = new Shape();

result.graphics.lineStyle(1);
result.graphics.beginFill(color, 1);
result.graphics.drawRect(0, 0, 75, 40);

return result;
}

var rect:Shape = drawRectangle(0xff0000);
addChild(rect);

OnEg1n
21.05.2010, 15:20
Спасибо, буду пробывать.