Просмотр полной версии : собственный класс, обращение к объектам главного класса
Делаю аквариум с рыбками. Нарисовал вокруг аквариума область, назвал ее 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 минуты
может что–то надо написать на главном таймлайне?
А где код главного класса?
А где код главного класса?
не думал что понадобится,) вот он
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 и рыбками
А рыбки то где у вас рождаются? Во втором кадре что ли? Создавайте их в 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;
}
Если я конечно вас правильно понял, гыгы. И вообще перепишете все, у вас тут нет острой необходимости в кадрах.
getChildByName('hitTest_mc').x = 100;
то есть нужно их добавлять в коде, так-то они у меня сразу клались на сцену.
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 только-только добрался - изучаю пока что... но логика на то и логика - она справедлива для всего =))
говорит 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);
Нет "главного" класса. Есть тупо набор паттернов. Рекомендую начать с них.
Наверное не стоит париться и делать собственный класс для рыбок, а писать все в одном классе PoulScript, который в моем случае, я считаю, "главный". На самом деле не хотелось плодить код, но решения не нашлось!
Учите язык и ООП вообще. Примерчики по работе с классами поразбирайте, что-ли. Задачка-то элементарная.
Вот учим =) и разбираем, что не получается справшиваем.
Так вот, сделал простоЙ пример, файл 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 --;
}
}
}
Ну вот переменная hitTest_mc:MovieClip видна в конструкторе FishScript. Но в moveFish уже нет. Вот это почему неочевидно? Она там ни входной параметр ни поле класса FishScript. Сделайте в FishScript поле rootHitTest:MovieClip и в конструкторе определите его: rootHitTest = hitTest_mc. Тогда в любом методе класса FishScript будет доступен rootHitTest
Сделайте в 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 --;
}
}
}
Тут и я не досмотрел - FishScript и Fish - разные классы
То есть Fish мы задаем объекту, linkeg как бы в библиотеке, что бы к нему потом обратиться и положить его экземпляр в аквариум. Или этому объекту нужно дать linkeg FishScript?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.