|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Nov 2007
Сообщений: 1,723
|
Как узнать переменную из другого класса?
В общем.
Есть два класса - Root и Block. В руте я добавляю героя и блоки в список отображения и делаю герою движение. В блоке я хочу проверять каждый блок на столкновение с героем. Вот только хочу узнать как правильно брать переменную из другого класса (того же героя). Раньше статиком пользовался, но понял, что это плохой стиль. Код: package { import flash.display.MovieClip; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.events.Event; public class Root extends MovieClip { var hero:Hero = new Hero(200, 60); public var indexBlock:Number = 0; public var arrayBlock:Array = []; public var speed:int = 5; public var powerGravity = 0; public var jump:Boolean = false; public var powerDown = 0.5; public var widthBlock:int = 30; public function Root():void { addChild(hero); stage.addEventListener(KeyboardEvent.KEY_DOWN, moveHero); addEventListener(Event.ENTER_FRAME, checkHitTest); addEventListener(Event.ENTER_FRAME, addGravity); createWorld(); } public function createWorld():void { for (var i:int = 0; i < 10; i++) { arrayBlock.push(new Block(widthBlock * i, 300)); addChild(arrayBlock[indexBlock]); indexBlock++ } } public function addGravity(e:Event):void { hero.y += powerGravity; powerGravity += powerDown; } public function moveHero(e:KeyboardEvent):void { if (e.keyCode == Keyboard.SPACE && (!jump)) { jump = true; powerGravity -= 7; hero.y -= 3; addEventListener(Event.ENTER_FRAME, addGravity); } if (e.keyCode == Keyboard.RIGHT) { hero.x += speed; } if (e.keyCode == Keyboard.LEFT) { hero.x -= speed; } } } } package { import flash.display.MovieClip; import flash.events.Event; public class Block extends MovieClip { public function Block(xPos:Number, yPos:Number):void { this.x = xPos; this.y = yPos; } public function checkHitTest(e:Event):void { if (hero.hitTestObject(this.wallUp)) { removeEventListener(Event.ENTER_FRAME, addGravity); // как мне здесь вообще удалить листенер из другого класса powerGravity = 0; // как узнать переменную из другого класса hero.y = (this.y - this.height / 2) - (hero.height / 2); jump = false; // и эту тоже как узнать } else { addEventListener(Event.ENTER_FRAME, addGravity); // и это jump = true; // и это } if (hero.hitTestObject(this.wallDown)) { hero.y += 2; powerGravity = 0; // и это } if (hero.hitTestObject(this.wallLeft)) { hero.x = (this.x - (this.width / 2)) - (hero.width / 2); } if (hero.hitTestObject(this.wallRight)) { hero.x = (this.x + (this.width / 2)) + (hero.width / 2); } /* и как вообще узнать героя???*/ } } } |
|
|||||
Если герой только один - то можешь использовать паттерн Singleton. Экземпляр будет уникален, приватен, и доступ к нему может быть осуществлен через статиковскую функцию... Но у тебя что-то... как-то... по-моему, неправильный подход к организации игры вцелом =)
__________________
Стой! Опасная зона! Работа мозга! |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Вроде решили же, что синглтон - антипаттерн.)
Передавай Block`y игрока в конструктор.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
> Вроде решили же, что синглтон - антипаттерн.)
О_о Я, смотрю, много пропустил...
__________________
Стой! Опасная зона! Работа мозга! |
|
|||||
Регистрация: May 2009
Сообщений: 220
|
пробовали сохранять this (т.е. ссылку на экземпляр класса Root) в свойстве экземпляра класса Block?
примерно вот так ... public class Root extends MovieClip { ... arrayBlock.push(new Block(widthBlock * i, 300)); arrayBlock[indexBlock].linkRoot = this; addChild(arrayBlock[indexBlock]); ... =================== //powerGravity = 0; // как узнать переменную из другого класса this.linkRoot.powerGravity = 0; Подробнее об этом можно посмотреть здесь |
|
|||||
Видать объявили лжепаттерном и предали анафеме
__________________
Стой! Опасная зона! Работа мозга! |
|
|||||
Регистрация: Jan 2009
Сообщений: 1,651
|
с пендосской википедии
Цитата:
Цитата:
|
|
|||||
Регистрация: Jul 2009
Сообщений: 25
|
В мейн классе:
stage.addChild(hero); А в другом классе героя можно получить: new hero:Hero = stage.getChildAt(1) as Hero; Конечно это не очень хорошо, т.к если кто-то в мейн классе случайно поменяет местами добавление в список отображение, то это приведёт к не очень приятным последсвиям, поэтому используйте stage.getChildByName(). Последний раз редактировалось ripeLime; 29.07.2009 в 15:08. |
Часовой пояс GMT +4, время: 17:17. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|