PDA

Просмотр полной версии : Странности as3. super.x vs this.x


caseyryan
02.10.2015, 07:39
Сегодня наткнулся на одну непонятную штуку
Есть запись

super.x += (_physBody.position.x - super.x) / 3;
super.y += (_physBody.position.y - super.y) / 3;

На этом месте компилятор кидает ошибки
Error #1086: Syntax error: expecting semicolon before plusassign.
Error #1086: Syntax error: expecting semicolon before plusassign.
Если заменить запись на такую

this.x += (_physBody.position.x - super.x) / 3;
this.y += (_physBody.position.y - super.y) / 3;

Ошибка исчезает.
Такая запись

super.x = (_physBody.position.x - super.x) / 3;
super.y = (_physBody.position.y - super.y) / 3;

Тоже не выдает ошибок и нормально компилируется.
Как так? Оо

п.с. все это происходит в наследнике спрайта, и super.x имеет как геттер, так и сеттер. Никаких ошибок и пропущеных точки с запятой или фигурных скобок нет, уже все на сто раз перепроверил. Всё на своих местах

Проблему я решил простым способом
super.x = super.x + (_physBody.position.x - super.x) / 3;
super.y = super.y + (_physBody.position.y - super.y) / 3;
Но меня интересует природа этого бага. Может кто-то сталкивался и докопался до истины?

udaaff
02.10.2015, 10:08
Это древний баг. Приходится обходится без +=, ну или без super.

caseyryan
02.10.2015, 11:11
тут без super никак)

Zebestov
02.10.2015, 11:43
У меня такое было только один раз в жизни, когда я в одном файле два спрайта описывал. Так вот во втором как раз на += и гавкало.

caseyryan
02.10.2015, 11:44
Два спрайта в одном файле? Это как?
Вложенный класс?

Zebestov
02.10.2015, 11:46
Ну да, два класса описывал в одном файле.

caseyryan
02.10.2015, 11:58
У меня там тоже вложенный.. Убрал, но ничего не поменялось

AlexCooper
03.10.2015, 05:12
тут без super никак)
Через геттер для супер пробывали?

caseyryan
03.10.2015, 09:35
Через геттер для супер пробывали?
Зачем мне это? Меня интересовала сама природа этого бага. А как обрулить то я сразу и так знал

Bletraut
03.10.2015, 09:55
тут без super никак)

А если не секрет, то почему никак? Просто интересно где такое может понадобиться.

caseyryan
03.10.2015, 10:39
Потому что там вот так:

override public function set x(value:Number):void {
_physBody.position.x = value;
super.x = value;
}

А чтобы сдвинуть картинку без перемещения физического тела, надо дернуть просто super.x
Картинку там для разных эффектов надо иногда двигать отдельно от физического тела. Например для прыжка или для стабилизации вибраций

Zebestov
03.10.2015, 10:45
А ты геттер тоже переопределил? Ну это так, на уровне шаманства какого-то.

caseyryan
03.10.2015, 11:03
По-моему вполне нормальная практика. Геттер у меня возвращает положение физического тела

Zebestov
03.10.2015, 12:46
Тады ой ©
Странно все это.