PDA

Просмотр полной версии : собственный класс, обращение к объектам главного класса


Dr_Bra
18.08.2010, 18:35
Делаю аквариум с рыбками. Нарисовал вокруг аквариума область, назвал ее hitTest_mc.
Нарисовал рыбку, поменял ее класс в библиотеке на собственный, который должен заставлять рыбку плавать. И если рыбка наплывет на hitTest_mc, она должна развернуться.

hitTest_mc – инстенснэйм экземпляра, который находится на таймлайне.
Как к нему обратиться из моего дополнительного класса рыбки?

package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;

public class FishMove extends MovieClip
{

public function FishMove(hitTest_mc:Sprite):void
{
trace("FishMove class loaded");

this.addEventListener(Event.ENTER_FRAME, moveMyFish);
}

private function moveMyFish(evt:Event):void
{
this.x += 1;
if (this.hitTestObject(hitTest_mc))
{
this.x -= 1;
}

}
}
}


Добавлено через 2 минуты
может что–то надо написать на главном таймлайне?

Bgg
18.08.2010, 18:50
А где код главного класса?

Dr_Bra
18.08.2010, 18:52
А где код главного класса?
не думал что понадобится,) вот он

package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.display.StageScaleMode;
import flash.display.StageAlign;

public class PoulScript extends MovieClip
{
private var _stage;
private var _w:Number;
private var _h:Number;

public function PoulScript():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.showDefaultContextMenu=false;

addStageVar();
}

private function addStageVar():void
{
_stage = stage;
_w = _stage.stageWidth;
_h = _stage.stageHeight;

scene_1_mc.x = _w/2;
scene_1_mc.y = _h/2;

loaderInfo.addEventListener(ProgressEvent.PROGRESS, progressMove);
loaderInfo.addEventListener(Event.COMPLETE, completeProgress);

_stage.addEventListener(Event.RESIZE, scene_1Resize);

scene_1();
}

//------------------------------------------ПРЕЛОАДЕР------------------------------------------//
private function progressMove(event:ProgressEvent):void
{
var loaded:uint = event.bytesLoaded;//сколько загрузилось
var total:uint = event.bytesTotal;//сколько весит всего
var procent:uint = int(loaded / total * 100);//процент загрузки
scene_1_mc.progress_tf.text = int(loaded / total * 100) + '%';
}

private function completeProgress(event:Event):void
{
_stage.removeEventListener(Event.RESIZE, scene_1Resize);
_stage.addEventListener(Event.RESIZE, scene_2Resize);
gotoAndStop(2);
scene_2();
}

//------------------------------------------РЕСАЙЗИМ СЦЕНЫ------------------------------------------//
private function scene_1Resize(evt:Event):void
{
_w = _stage.stageWidth;
_h = _stage.stageHeight;

bg_mc.width = _w;
bg_mc.height = _h;
bg_mc.x = _w/2;
bg_mc.y = _h/2;

scene_1_mc.x = _w/2;
scene_1_mc.y = _h/2;
}

private function scene_2Resize(evt:Event):void
{
_w = _stage.stageWidth;
_h = _stage.stageHeight;

bg2_mc.width = _w;
bg2_mc.height = _h;
bg2_mc.x = _w/2;
bg2_mc.y = _h/2;

scene_2_mc.x = _w/2;
scene_2_mc.y = _h/2;
}

//------------------------------------------СЦЕНЫ------------------------------------------//

//----------------------------1 «ПРЕЛОАДЕР»--------
private function scene_1():void
{
trace("сцена 1");

bg_mc.width = _w;
bg_mc.height = _h;
bg_mc.x = _w/2;
bg_mc.y = _h/2;
}

//----------------------------2 сцена--------
private function scene_2():void
{
trace("сцена 2");

bg2_mc.width = _w;
bg2_mc.height = _h;
bg2_mc.x = _w/2;
bg2_mc.y = _h/2;
}
}
}


Добавлено через 1 минуту
и у нас в сцене 2 появляется аквариум с hitTest_mc и рыбками

Bgg
18.08.2010, 19:25
А рыбки то где у вас рождаются? Во втором кадре что ли? Создавайте их в scene_2().

private function scene_2():void
{
var fish:FishMove = new FishMove(getChildByName("hitTest_mc"));
addChild(fish);

trace("сцена 2");
bg2_mc.width = _w;
bg2_mc.height = _h;
bg2_mc.x = _w/2;
bg2_mc.y = _h/2;
}

Если я конечно вас правильно понял, гыгы. И вообще перепишете все, у вас тут нет острой необходимости в кадрах.

in4core
18.08.2010, 19:26
getChildByName('hitTest_mc').x = 100;

Dr_Bra
18.08.2010, 19:28
то есть нужно их добавлять в коде, так-то они у меня сразу клались на сцену.

Contemplator
18.08.2010, 19:30
Dr_Bra, по части класса FishMove косяк в логике метода moveMyFish
конкретно вот:
this.x += 1;
if (this.hitTestObject(hitTest_mc))
{
this.x -= 1;
}
при столкновении рыба отплывёт на 1рх, после чего продолжит движение по исходному вектору, выглядеть будет так как будто долбится об стенку аквариума =)
введи переменную, отвечающую за смещение, step скажем и обнови метод:
if (this.hitTestObject(hitTest_mc))
{
step *= -1;
// + разворот рыбки
}
this.x += step;


P.S. на верность и правильность моих высказываний не претендую - до AS3 только-только добрался - изучаю пока что... но логика на то и логика - она справедлива для всего =))

Dr_Bra
18.08.2010, 19:34
говорит incorrect number of argument..
в главной класс нужно импортировать ?

import FishMove;


Добавлено через 11 минут


var fish1:FishMove = new FishMove(getChildByName("hitTest_mc"));// ругаетсо
scene_2_mc.aquarium_mc.addChild(fish1);





var fish1:FishMove = new FishMove();//не ругаетсо
scene_2_mc.aquarium_mc.addChild(fish1);

dimarik
18.08.2010, 23:52
Нет "главного" класса. Есть тупо набор паттернов. Рекомендую начать с них.

Dr_Bra
19.08.2010, 11:03
Наверное не стоит париться и делать собственный класс для рыбок, а писать все в одном классе PoulScript, который в моем случае, я считаю, "главный". На самом деле не хотелось плодить код, но решения не нашлось!

-De-
19.08.2010, 11:13
Учите язык и ООП вообще. Примерчики по работе с классами поразбирайте, что-ли. Задачка-то элементарная.

Dr_Bra
19.08.2010, 12:28
Вот учим =) и разбираем, что не получается справшиваем.
Так вот, сделал простоЙ пример, файл FLA в нем пара мувиклипов, один из них аквариум. В аквариум помещаем (пробовал и ручками+указывал инстенс, и программно из главного класса) объект hitTest и fish. НО никак не получается из дополнительного класса обращаться к переменной hitTest. Выкладываю исходники, кому интересно можите посмотреть, может и поможите ) http://***********/18945971 (http://***********/18945971)
а вот просто код классов
главный класс:

package
{
import flash.display.MovieClip;
import FishScript;

public class STC extends MovieClip
{
public var hitTest;
public var fish1:FishScript;

public function STC():void
{
trace("STC класс загрузился!");

hitTest = new HitTest();
aquarium_mc.addChild(hitTest);


fish1 = new Fish(hitTest);
aquarium_mc.addChild(fish1);
}
}
}


дополнительный:

package
{
import flash.display.MovieClip;
import flash.events.Event;

public class FishScript extends MovieClip
{
public function FishScript(hitTest_mc:MovieClip):void
{
trace("FishScript класс загрузился!");

this.addEventListener(Event.ENTER_FRAME, moveFish);
}

private function moveFish(evt:Event):void
{
trace("--");
this.x --;
}
}
}

-De-
19.08.2010, 12:41
Ну вот переменная hitTest_mc:MovieClip видна в конструкторе FishScript. Но в moveFish уже нет. Вот это почему неочевидно? Она там ни входной параметр ни поле класса FishScript. Сделайте в FishScript поле rootHitTest:MovieClip и в конструкторе определите его: rootHitTest = hitTest_mc. Тогда в любом методе класса FishScript будет доступен rootHitTest

Dr_Bra
19.08.2010, 12:54
Сделайте в FishScript поле rootHitTest:MovieClip и в конструкторе определите его: rootHitTest = hitTest_mc. Тогда в любом методе класса FishScript будет доступен rootHitTest
Скорее всего, я не совсем правильно понял, сделал вот так, но все равно говорит что не корректное обращение

package
{
import flash.display.MovieClip;
import FishScript;

public class STC extends MovieClip
{
public var hitTest;
public var fish1:FishScript;

public function STC():void
{
trace("STC класс загрузился!");

hitTest = new HitTest();
aquarium_mc.addChild(hitTest);


fish1 = new Fish(hitTest);
aquarium_mc.addChild(fish1);
}
}
}



package
{
import flash.display.MovieClip;
import flash.events.Event;

public class FishScript extends MovieClip
{
public var rootHitTest:MovieClip;

public function FishScript(hitTest:MovieClip):void
{
trace("FishScript класс загрузился!");

rootHitTest = hitTest;
this.addEventListener(Event.ENTER_FRAME, moveFish);
}

private function moveFish(evt:Event):void
{
trace("--");
this.x --;
}
}
}

-De-
19.08.2010, 13:19
Тут и я не досмотрел - FishScript и Fish - разные классы

Dr_Bra
19.08.2010, 14:58
То есть Fish мы задаем объекту, linkeg как бы в библиотеке, что бы к нему потом обратиться и положить его экземпляр в аквариум. Или этому объекту нужно дать linkeg FishScript?