|
|
|||||
Получение Спрайта через Stage
Почему не могу получить Trace?
Базовый Класс: package { import flash.display.*; import flash.events.*; import flash.events.KeyboardEvent; import flash.text.TextField; import flash.text.engine.TextBlock; import flash.text.engine.TextElement; import flash.ui.*; import flash.utils.*; import mx.core.*; public class Game1 extends Sprite { import flash.net.*; import flash.utils.*; public var spr1:Sprite = new Sprite; public var spr2:Sprite = new Sprite; public var wall1:Shape = new Shape; public var wall2:Shape = new Shape; public var wall3:Shape = new Shape; public var dnco:Shape = new Shape; public var rico:Shape = new Shape; public var leco:Shape = new Shape; public var upco:Shape = new Shape; public var jump:Boolean = false; public var jmpc:Number = 0; public var col:Collision = new Collision(); public var verwall:Array = []; public var keyri:uint = 39; public var recive:String = ""; public var keyle:uint = 37; public var connect:Socket = new Socket(); public var keypri:Boolean = false; public var keyple:Boolean = false; public function Game1() { spr1.graphics.beginFill(0x666666, 1); spr1.graphics.drawRect(-300, 0, 1600,1400); spr1.graphics.endFill(); addChild(spr1); spr1.name="spr1"; spr2.width=30; spr2.height=50; spr2.graphics.beginFill(0x0099ff, 1); spr2.graphics.drawRect(0, 0,30 ,50); spr2.graphics.endFill(); spr2.x=30; spr2.width=30; spr2.height=50 spr2.y=250; wall1.graphics.beginFill(0x222222, 1); wall1.graphics.drawRoundRect(-300, 0,1800 ,1600,2,2); wall1.graphics.endFill(); wall1.x=0; wall1.y=350; wall1.width=600; wall1.height=50; addChild(wall1); dnco.graphics.beginFill(0x222222, 1); dnco.graphics.drawRoundRect(5, 45,25 ,10, 2, 2); dnco.graphics.endFill(); dnco.x=5; dnco.y=0; dnco.width=20; dnco.height=5; upco.graphics.beginFill(0x222222, 1); upco.graphics.drawRoundRect(0, 0,1800 ,1600, 2, 2); upco.graphics.endFill(); upco.x=5; upco.y=0; upco.width=20; upco.height=5; leco.graphics.beginFill(0x222222, 1); leco.graphics.drawRoundRect(0, 5,5 ,40, 2, 2); leco.graphics.endFill(); leco.x=0; leco.y=5; leco.width=5; leco.height=40; rico.graphics.beginFill(0x222222, 1); rico.graphics.drawRoundRect(0, 0,1800 ,1600, 2, 2); rico.graphics.endFill(); rico.x=25; rico.y=5; rico.width=5; rico.height=40; spr2.addChild(leco); spr2.addChild(rico); spr2.addChild(upco); spr2.addChild(dnco); spr1.addChild(spr2); spr2.name="spr2"; wall1.name="wall1"; dnco.name="dnco"; rico.name="rico"; leco.name="leco"; upco.name="upco"; stage.addEventListener(KeyboardEvent.KEY_DOWN, onkey); stage.addEventListener(KeyboardEvent.KEY_UP, onup); stage.addEventListener(Event.ENTER_FRAME, frasher); start(); } public function start():void { var col:Collision = new Collision(); jmpc=spr1.y-40; col.level.push(wall1); } public function jumpanim():void { if((jump == true) && (col.coldn == true)) { (jmpc=(spr1.y-40)); } if((jump == true) && (jmpc>spr2.y) && (col.coldn == true)) { jump=false; } } public function onup(event:KeyboardEvent):void { if(event.keyCode == keyri) { keypri = false; } if(event.keyCode == keyle) { keyple = false; } } public function onkey(event:KeyboardEvent):void { if((event.keyCode == Keyboard.RIGHT) && (spr2.x <= 594) && (col.colri == false)) { (spr2.x=(spr2.x+5)); keypri=true; } if((event.keyCode == Keyboard.LEFT) && (spr2.x >= 0) && (col.colle == false)) { (spr2.x=(spr2.x-5)); keyple=true; } if((event.keyCode == Keyboard.UP) && (jump == false) && (col.coldn == true) && (col.colup == false)) { jump=true; jumpanim(); } } public function frasher(event:Event):void { if((spr2.x > 0) && (col.coldn == false) && (jump == false)) { spr2.y=(spr2.y + 4); } if((keypri == true) && (spr2.x >= 0) && (spr2.x <= 620) && (col.colri == false)) { (spr2.x=(spr2.x+5)); } if((keyple == true) && (spr2.x >= 0) && (spr2.x <= 620) && (col.colle == false)) { (spr2.x=(spr2.x-5)); } if((jump == true) && (spr2.y<jmpc)) { jump = false; } else if(jump == true) { (spr2.y=(spr2.y-8)); } if(col.colle == true) { jump=false; keypri=false; keyple=false; while(col.colle == false) { spr2.x=(spr2.x+4); } } if(col.colri == true) { jump=false; keypri=false; keyple=false; while(col.colri == false) { spr2.x=(spr2.x-4); } } } } } package { import flash.display.*; import flash.events.*; import flash.events.Event; import flash.events.IEventDispatcher; import flash.events.KeyboardEvent; import flash.ui.*; public dynamic class Collision extends Sprite { public var main:Game1; public var i:int = 0; public var level:Array = []; public var coldn:Boolean = false; public var colup:Boolean = false; public var colri:Boolean = false; public var colle:Boolean = false; public function Collision() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.addEventListener(Event.ENTER_FRAME, collis); } public function collis(event:Event):void { trace(stage.getChildAt(2) as String); }
__________________
...Nothing can't be coded... |
|
|||||
Регистрация: Jan 2009
Сообщений: 1,651
|
потому что у тебя в stage ровно один мувик - Game1. А всякие wall и spr1 добавляются в него. И вообще, ловить мувики вот таким образом, через getChildAt, getChildByName - это плохой код. Плохо читаемый, тяжело искать ошибки. В ООП так не делают. Если у тебя объект Game1 плотно взаимодействует с collision - то прямо передай ему ссылку на Game1, или данные, которые ему нужны.
Вообще, судя по названию "Collision" - у тебя там обработка коллизий происходит. Я бы ее не отделял от игрового класса, это не логично. Ну или сделал бы полностью статический класс, или даже просто отдельную функцию в пакете, если код класса начинает превращаться в простыню и мне хочется разбить класс на несколько файлов.
__________________
мой пустой блог |
|
|||||
игровой класс и так огромный уже =( хотел на классы разделить , если в один класс засунуть это - то работает. Посоветуй как разделить , в Игровом классе есть ещё loop функция, она плотно взаимодействует с Collision... так что если вызывать на прямую то loop который обновляется 60 раз в секунду по enterFrame выведет цикличную рекурсию и Stack Owerflow
Добавлено через 25 минут iflamberg , а что вы имели в виду под Цитата:
__________________
...Nothing can't be coded... |
|
|||||
Регистрация: Jan 2009
Сообщений: 1,651
|
Ну так на объекты не абы как разделяют. У тебя в collision, я так понимаю, обработка столкновений, а в loop, скорее всего, основной игровой цикл, вся логика. Логично было бы все таки их оствить вместе. Вместо этого наружу, в отдельный класс, можно было бы выделить контроллер клавиатуры, карту и ее генератор(если у тебя случайным образом карта генерируется), вот эту твою простыню
spr1.graphics.beginFill(0x666666, 1); spr1.graphics.drawRect(-300, 0, 1600,1400); spr1.graphics.endFill(); addChild(spr1); spr1.name="spr1"; spr2.width=30; spr2.height=50; spr2.graphics.beginFill(0x0099ff, 1); spr2.graphics.drawRect(0, 0,30 ,50); spr2.graphics.endFill(); spr2.x=30; spr2.width=30; spr2.height=50 spr2.y=250; А вообще ООП - не панацея. Я,например, считаю, что если по смыслу объект не разделим, и над всем его кодом работает один человек, значит быть простыне, благо инспекторы классов и автокоплит делают работу с ними почти комфортной.
__________________
мой пустой блог |
|
|||||
а зачем import mx.core.* ?
__________________
adobe AS3 manual |
|
|||||
Тут не только карта создаётся , ещё фон и спрайт игрока =) Вот в чём беда, loop это цикл с анимацией движения и гравитацией , ты прав , по логике это и вправду корректно не делится ,я могу только вынести создание карты и обращаться из главного класса к нему, но разве это панацея? А простыня приличная уже , могу полную версию показать. К слову контролёр клавиатуры плотно с главным loop взаимодействует, потому и прошу помощи я сам не могу сделать логику ООП и жду хотя - бы какой то простейшей конструкции чтобы это разделить , работаю в Flash Builder там не особо удобно выходит таки.. Если я вам уже надоел - извиняюсь.
Добавлено через 34 секунды strangedk здесь не полный скрипт , тут для конкретного вопроса...
__________________
...Nothing can't be coded... |
|
|||||
Регистрация: Jan 2009
Сообщений: 1,651
|
Ну я не знаю. У меня вот,скажем, и по 70 килобайтов файлы классов получались, и меньше его ну никак не сделать, там логика передвижений, столкновений, сортировки спрайтов по глубине в изометрии, зачем это разносить?
Но это не твой случай, fd96. Тут можно разнести. Но тут такое дело... эту работу можешь выполнить ты и только ты. Никто не захочет в твоих простынях копаться, это не спросили-ответил вариант, это надо делать вдумчиво. Пока же у тебя я не вижу понимания самого ООП. Вот скажем, можно ли выделить проверку столкновений в отдельный класс Collision? Да почему бы нет. Пусть будет такой себе класс, который для объекта проверит его столкновения с другим объектом и изменит состояния своих переменных colup, coldown и т.д. Но тогда он не должен искать объекты на сцене через stage.getChild. Передай ему те объекты, с которыми ему взаимодействовать. Через конструктор, вызов функции, вызов статической функции, еще как нибудь. Или скажем контроллер клавиатуры. Как он работает? Как он должен взаимодействовать с основным классом и объектами на сцене? Нужен ли он вообще? Ну, в принципе, нужен. Зачем хранить в основном классе, какие клавиши нажаты, какие нет? Зачем держать слушатели клавиатуры в основном классе? loop плотно работает с клавиатурой? Ну и отлично. Главный класс может держать ссылку на контроллер клавиатуры, loop по ссылке обращается к контроллеру клавиатуры и узнает какие клавиши зажаты, куда двигать персонажа. Или, наоборот, контроллер клавиатуры может держать у себя ссылку на главный класс и по нажатию кнопки, вызывать функцию главного класса, заставляя его выполнять какие-то действия. Например, по нажатию ESC, вызываем game.pause(). Понимаешь? Какие-то такие должны быть размышления.
__________________
мой пустой блог |
|
|||||
Спасибо, навёли меня на мысли , я изначально неверно строил логику функций, передвижения у меня задействованы не в loop, при нажатии кнопки идёт выполнение условия и взаимодействие со спрайтом, то есть класс с движением будет обращаться и к Game1 и к Collision. И если вызывать их друг из друга то будет рекурсия и stack owerflow, а статичными их сделать не выйдет потому, что они меняют значения в процессе выполнения. Использовать для каждого мизерного движения Синглтоны - тоже плохая идея. Мне посоветовали сделать интерфес с переменными и везде их подставлять из интерфейса , так возможно будет лучше?
__________________
...Nothing can't be coded... |
|
|||||
Я понимаю, что будет печально сначала, но вдруг получится...
__________________
...Nothing can't be coded... |
Часовой пояс GMT +4, время: 18:25. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|