PDA

Просмотр полной версии : Проблема с прорисовкой маски


Dip52
12.11.2013, 16:46
Здравствуйте!

Когда я присваиваю объекту маску во время движения, то часть объекта остаётся в одном месте, потом появляется уже в движущимся объекте.

Как можно это исправить?

crovels.swf

GBee
12.11.2013, 17:18
маску куда добавляете?

Dip52
12.11.2013, 17:50
маску куда добавляете?

Есть класс Кровел. Он привязан к MovieClip объекту. В этом классе есть переменная objectMask. Этой переменной я присваиваю другой объект MovieClip. Потом в классе Кровел пишу: objectMask.mask = this.
Кровел и другой объект MovieClip находятся в одном MovieClip.

samana
12.11.2013, 18:02
Этим кодом вы назначаете объекту objectMask в качестве маски всё содержимое класса Кровел. Так и задумано? А не наоборот ли хотели?

Dip52
12.11.2013, 18:32
Этим кодом вы назначаете объекту objectMask в качестве маски всё содержимое класса Кровел. Так и задумано? А не наоборот ли хотели?

Наоборот не могу.

Dip52
12.11.2013, 21:25
Странно.
Сделал разделение MovieClip круга в кровеле (объекте с двумя линиями) и проблема с маской исчезла (ну почти).
crovels.swf

samana
12.11.2013, 21:28
Скажите, объект objectMask добавлен как ребёнок в классе Кровел?

Dip52
12.11.2013, 21:30
Скажите, объект objectMask добавлен как ребёнок в классе Кровел?

Нет.

package classes
{
import flash.events.Event;
import flash.display.MovieClip;
import classes.fond.Fields;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.Sprite;

public class Crovel extends MovieClip
{
private var randomRotation:Number = 180; //Кровел двигается в ту сторону в которую он повёрнут, поэтому его движение будет меняться через какой-то интервал:
private var timerSetRandomRotation:Timer = new Timer(Settings.ROTATION); //Таймер задающий случайное движение кровелу:
private const SPEED:Number = Settings.SPEED;
public var objectMask:Sprite

public function Crovel(liquid:MovieClip)
{
rotation = randomRotation;
Fields.FIELDFORCROVELS.addChild(this);
objectMask = liquid;
objectMask.visible = false;
Fields.FIELDFORCROVELS.addChild(liquid);
this.addEventListener(Event.ENTER_FRAME,rotationHorns);
timerSetRandomRotation.addEventListener(TimerEvent.TIMER,setRandomRotation);
timerSetRandomRotation.start();
this.addEventListener(Event.ENTER_FRAME,move);
}
//Движение кровела:
private function move(event:Event):void
{
objectMask.x = x;
objectMask.y = y;
var p:Number = Prohibition.prohibition(this);
if(p == Number.MAX_VALUE)
{

}
else
{
rotation = randomRotation = p;
timerSetRandomRotation.reset();
timerSetRandomRotation.start();
}
y -= SPEED * Math.cos(randomRotation * (Math.PI / 180));
x += SPEED * Math.sin(randomRotation * (Math.PI / 180));
}
//Вращение усиков:
private function rotationHorns(event:Event)
{
hornsOne.rotation -= 10;
hornsTwo.rotation += 5;
}
//Установка случайного движения кровелу:
private function setRandomRotation(event:TimerEvent):void
{
var choice:int = Math.random() * 3; //Выбор положительной или отрицательной стороны:
if(choice == 1)
{
randomRotation = Math.random() * -360;
objectMask.mask = this;
objectMask.visible = true;
}
else
{
randomRotation = Math.random() * 360;
objectMask.mask = null;
objectMask.visible = false;
}
rotation = randomRotation;
}
}
}

liquid - это то, что я использую как маску (или в качестве маски).

samana
12.11.2013, 21:39
Но если я правильно понял ваш код, то liquid (он же objectMask ) вы не используете как маску. А используете класс Crovel как маску для liquid (он же objectMask ).
objectMask.mask = this;
Маской для объекта objectMask, служит this. А this - это ссылка на текущий класс, то есть Crovel.

Dip52
12.11.2013, 21:49
Но если я правильно понял ваш код, то liquid (он же objectMask ) вы не используете как маску. А используете класс Crovel как маску для liquid (он же objectMask ).
objectMask.mask = this;
Маской для объекта objectMask, служит this. А this - это ссылка на текущий класс, то есть Crovel.

Изначально я хотел сделать так, чтобы от разноцветной картинки (жидкость) были видны только части Кровела (усы и круг). Когда я сделал маской разноцветную картинку, то ничего не было видно. Когда я сделал маску Кровела, то картинка появилась.

Возникла проблема: Когда появляется маска, то круг кровела почему-то отстаёт во время движения. Я это исправил разделив MovieClip круга.
Раз после разделения всё начало нормально работать, то почему оно работает нормально? Ведь усы же тоже MovieClip. Почему они не отстают?

samana
12.11.2013, 21:59
Ага, я наконец-то понял вашу задумку!

Dip52
12.11.2013, 23:34
Ага, я наконец-то понял вашу задумку!

Я попробовал сделать вращение круга Кровела (так как усы MovieClip и проблем с маской нет, но они в отличие от круга вращаются) и в итоге проблемы с маской исчезли.