Jump to content

  •  

Photo

Multiple Layering in ACT Editor how?


  • Please log in to reply
1 reply to this topic

#1 Promeister

Promeister

    Newbie

  • Members
  • Pip
  • 9 posts

Posted 18 December 2016 - 02:55 PM

HI! I was wondering how some .act's have multiple layers but when i tried to customize my own multiple layered .act's, it only saves the first sprite and always gives me warnings that there are multiple layers and it will not show. Can anyone assists me here? THANK YOU!



#2 Reins

Reins

    Advanced Member

  • Members
  • PipPipPip
  • 95 posts

Posted 22 February 2017 - 02:07 PM

run this script on act editor - credits goes to tokei

int count = act.GetAllFrames().Count + 1;
int index = 0;

TaskManager.DisplayTaskC("Rendering frames...", "Please wait...", () => index, count, new Action<Func<bool>>(isCancelling => {
try {
foreach (var action in act) {
foreach (var frame in action) {
if (frame.Layers.Count <= 1) {
index++;
continue;
}
if (isCancelling()) return;

var image = frame.Render(act);
var box = ActImaging.Imaging.GenerateFrameBoundingBox(act, frame);
int relativeIndex = -1;

for (int i = 0; i < act.Sprite.Images.Count; i++) {
if (image.Equals(act.Sprite.Images[i])) {
if (isCancelling()) return;
relativeIndex = act.Sprite.AbsoluteToRelative(i, act.Sprite.Images[i].GrfImageType == GrfImageType.Indexed8 ? 0 : 1);
}
}

if (relativeIndex < 0) {
relativeIndex = act.Sprite.InsertAny(image);
}

int offsetX = (int) ((int) ((box.Max.X - box.Min.X + 1) / 2) + box.Min.X);
int offsetY = (int) ((int) ((box.Max.Y - box.Min.Y + 1) / 2) + box.Min.Y);
var layer = new Layer(relativeIndex, image);

layer.OffsetX = offsetX;
layer.OffsetY = offsetY;

frame.Layers.Clear();
frame.Layers.Add(layer);
index++;
}
}

// Removes unused sprites - old way, older versions have a bug
for (int i = act.Sprite.Images.Count - 1; i >= 0 ; i--) {
if (act.FindUsageOf(i).Count == 0) {
var type = act.Sprite.Images[i].GrfImageType;
var relativeIndex = act.Sprite.AbsoluteToRelative(i, type == GrfImageType.Indexed8 ? 0 : 1);
act.Sprite.Remove(relativeIndex, type);

if (type == GrfImageType.Indexed8) {
act.AllLayers(layer => {
if ((layer.IsIndexed8() && type == GrfImageType.Indexed8) ||
(layer.IsBgra32() && type == GrfImageType.Bgra32)) {
if (layer.SpriteIndex == relativeIndex) {
layer.SpriteIndex = -1;
}
}
});
}

act.Sprite.ShiftIndexesAbove(act, type, -1, relativeIndex);
}
}
}
finally {
index = count;
}
}));






1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users


This topic has been visited by 19 user(s)