![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Sep 2008
Сообщений: 17
|
Доброе время суток!
Пожалуста подскажите новичку в написании классов... Суть проблемы: Решил написать игру типа платформенный скроллер с применением классов и столкнулся с вполне ожиданной проблемой... Класс Героя заранее ничего не знает о своём экземпляре. И при обращении во внуть несуществующего ещё эземпляра класса, с попыткой проиграть вложенную анимацию, (при реакции на нажатие клавиши) флеш ругается на этапе компиляции. Говорит что нет такого свойства. (выделено жирным) я прекрасно понимаю, что так писать нельзя, но в таймлайне таких проблем не было бы. Пожалуйста скажите как записать это выражение правильно именно в классе. вот код класса: чего-то жирность проблемного кода плохо видно, поэтому пишу его отдельно if (Key.isDown(Key.SPACE) && !jump && !shoot) { shoot = true; this.gotoAndStop(1); this.man.body.gotoAndPlay(2); //вот эта строка!!! } class Hero extends MovieClip { //сила гравитации private var grav:Number = 1; //начальная скорость прыжка private var jumpSpeed:Number = -11.9; //шаг по Х private var speedX:Number = 5; //шаг по Y private var speedY:Number = 0; //максимальная скорость падения private var maxSpeedY:Number = 14; //отображает состояние прыжка public var jump:Boolean = false; //отображает состояние удара public var shoot:Boolean = false; //считаем что изначально персонаж стоит на поверхности private var groundY:Number = 300; private var oldX:Number; function Hero() { onEnterFrame = function () { stepHero(); }; } function stepHero() { if (Key.isDown(Key.UP) && !jump && !shoot) { jump = true; speedY = jumpSpeed; } //бъём if (Key.isDown(Key.SPACE) && !jump && !shoot) { shoot = true; this.gotoAndStop(1); this.man.body.gotoAndPlay(2); } if (!shoot) { //смещаемся влево/вправо if (Key.isDown(Key.LEFT)) { this._xscale = -100; this._x -= (jump) ? speedX*.8 : speedX; } else if (Key.isDown(Key.RIGHT)) { this._xscale = 100; this._x += (jump) ? speedX*.8 : speedX; } } //применяем по цепочке: гравитация -> скорость -> _y speedY += grav; speedY = (speedY>maxSpeedY) ? maxSpeedY : speedY; this._y += speedY; if (this._y>groundY) { this._y = groundY; speedY = 0; jump = false; } if (!shoot) { if (jump) { //в позу полёта this.gotoAndStop(3); } else { if (oldX != this._x) { //если позиция по Х изменилась - в позу хотьбы this.gotoAndStop(2); } else { //иначе - по стойке смирно this.gotoAndStop(1); } } } oldX = this._x; } } Последний раз редактировалось Шыша; 21.06.2009 в 21:23. |
|
|||||
|
this в классе себя ведет несколько иначе, чем this в кадрах.
Сделай trace(this), чтобы понять.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Sep 2008
Сообщений: 17
|
Да, я так понял, что this - ссылка на экземпляр класса, поэтому запись типа:
вполне справедлива, зато при обращении внутрь экземпляра типа: уже почему-то не проходит... я пытался делать стринговую переменную, хронящую путь к вложенной анимации... и подставлять её вместо this.man.body, но эффект такой же... Добавлено через 37 минут Всем спасиба, проблема решилась при дописании в код: тему можно закрывать |
|
|||||
|
Ну не знаю, должен такой хак работать - даже mtasc на это не ругается:
(если конечно есть клип с именем "man", а в нем "body" - но компилиться будет в ЛЮБОМ случае) можно еще eval("this.man.body") - но, говорят это работает медленно и вобще не красиво. а this["man"] - скорость та же, что и this.man Цитата:
Если доступ идет в вложенным мувикам идет в нескольких местах - чтобы не описаться создаешь константу и пишешь или один раз записываешь значение this["man"]["body] в поле private var manBody:MovieClip и обращаешься уже к нему. Если уж делать совсем правильно - то аттачить их при создании класса и присваивать его полям. Но это не всегда ведь удобно (Да еще если не здесь - то в id-шнике мувиклипа при аттаче ошибешься, так что - ничего страшного) Последний раз редактировалось expl; 21.06.2009 в 22:51. |
|
|||||
|
Регистрация: Sep 2008
Сообщений: 17
|
Спасибо eval!
Я даже и не знал про такой хак! |
|
|||||
|
.
|
Аха, согласен с iNils
Только так Вы не замараете свое честное имя. Добавлено через 6 минут И как же он себя ведет? =) |
|
|||||
|
Например:
в кадре: выдаст 5. Тоже самое в классе, если t обьявлен вне функции, например, приватной переменной - получу ошибку компилятора/undefined. Это пример не совсем тот, что нужен, но на нем долго ломал голову, в чем же косяк. Пример с this, если вспомню/найду - выложу, но суть примерна та-же
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
>>Это пример не совсем тот
да совсем не тот пример-то: и в классе и в кадре он покажет одно и тоже: локальные переменные, определенные в одной области видимости с анонимной функцией, всегда 'видны' в этой функции |
|
|||||
|
.
|
а по мне так ничем и не отличается применение this в кадрах и в классах. просто нужно запомнить, где заканчивается одна область видимости и начинается другая. а this лишь удобный уточняющий указатель текущей области видимости.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 03:28. |
|
|
« Предыдущая тема | Следующая тема » |
|
|