wip BUTTONS!!!!
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextureAtlas imagePath="button.png">
|
||||
<!-- Created without animate lol i wrote this-->
|
||||
|
||||
<!-- Thanks yosh, and i wrote this script incase anyone ever needs to resize these xmls -->
|
||||
<!-- Here you guys go :D https://try.haxe.org/#7C373001 -lunar -->
|
||||
|
||||
<SubTexture name="normal-topleft" x="0" y="0" width="4" height="4"/>
|
||||
<SubTexture name="normal-top" x="4" y="0" width="8" height="4"/>
|
||||
<SubTexture name="normal-topright" x="12" y="0" width="4" height="4"/>
|
||||
<SubTexture name="normal-middleleft" x="0" y="4" width="4" height="8"/>
|
||||
<SubTexture name="normal-middle" x="4" y="4" width="8" height="8"/>
|
||||
<SubTexture name="normal-middleright" x="12" y="4" width="4" height="8"/>
|
||||
<SubTexture name="normal-bottomleft" x="0" y="12" width="4" height="4"/>
|
||||
<SubTexture name="normal-bottom" x="4" y="12" width="8" height="4"/>
|
||||
<SubTexture name="normal-bottomright" x="12" y="12" width="4" height="4"/>
|
||||
|
||||
<SubTexture name="hover-topleft" x="16" y="0" width="4" height="4"/>
|
||||
<SubTexture name="hover-top" x="20" y="0" width="8" height="4"/>
|
||||
<SubTexture name="hover-topright" x="28" y="0" width="4" height="4"/>
|
||||
<SubTexture name="hover-middleleft" x="16" y="4" width="4" height="8"/>
|
||||
<SubTexture name="hover-middle" x="20" y="4" width="8" height="8"/>
|
||||
<SubTexture name="hover-middleright" x="28" y="4" width="4" height="8"/>
|
||||
<SubTexture name="hover-bottomleft" x="16" y="12" width="4" height="4"/>
|
||||
<SubTexture name="hover-bottom" x="20" y="12" width="8" height="4"/>
|
||||
<SubTexture name="hover-bottomright" x="28" y="12" width="4" height="4"/>
|
||||
|
||||
<SubTexture name="pressed-topleft" x="32" y="0" width="4" height="4"/>
|
||||
<SubTexture name="pressed-top" x="36" y="0" width="8" height="4"/>
|
||||
<SubTexture name="pressed-topright" x="44" y="0" width="4" height="4"/>
|
||||
<SubTexture name="pressed-middleleft" x="32" y="4" width="4" height="8"/>
|
||||
<SubTexture name="pressed-middle" x="36" y="4" width="8" height="8"/>
|
||||
<SubTexture name="pressed-middleright" x="44" y="4" width="4" height="8"/>
|
||||
<SubTexture name="pressed-bottomleft" x="32" y="12" width="4" height="4"/>
|
||||
<SubTexture name="pressed-bottom" x="36" y="12" width="8" height="4"/>
|
||||
<SubTexture name="pressed-bottomright" x="44" y="12" width="4" height="4"/>
|
||||
</TextureAtlas>
|
||||
@@ -2,6 +2,8 @@ package funkin.backend.utils;
|
||||
|
||||
import flixel.util.FlxColor;
|
||||
import openfl.display.BitmapData;
|
||||
import openfl.geom.Point;
|
||||
import openfl.geom.Rectangle;
|
||||
|
||||
class BitmapUtil {
|
||||
/**
|
||||
@@ -66,4 +68,27 @@ class BitmapUtil {
|
||||
}
|
||||
return mostPresentColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new bitmap without any empty transperent space on the edges
|
||||
* @param bitmap The bitmap to be cropped
|
||||
*/
|
||||
public static function crop(bitmap:BitmapData) {
|
||||
var minX:Int = bitmap.width;
|
||||
var minY:Int = bitmap.height;
|
||||
var maxX:Int = 0; var maxY:Int = 0;
|
||||
|
||||
for (y in 0...bitmap.height)
|
||||
for (x in 0...bitmap.width)
|
||||
if (bitmap.getPixel32(x, y) != 0x00000000) {
|
||||
if (x < minX) minX = x;
|
||||
if (y < minY) minY = y;
|
||||
if (x > maxX) maxX = x;
|
||||
if (y > maxY) maxY = y;
|
||||
}
|
||||
|
||||
var croppedBitmap:BitmapData = new BitmapData(maxX-minX+1, maxY-minY+1, true, 0x00000000);
|
||||
croppedBitmap.copyPixels(bitmap, new Rectangle(minX, minY, croppedBitmap.width, croppedBitmap.height), new Point(0,0));
|
||||
return croppedBitmap;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,5 @@
|
||||
package funkin.backend.utils;
|
||||
|
||||
import openfl.geom.Point;
|
||||
import openfl.geom.Rectangle;
|
||||
import openfl.display.BitmapData;
|
||||
import flixel.animation.FlxAnimation;
|
||||
import flixel.input.keyboard.FlxKey;
|
||||
import flixel.sound.FlxSound;
|
||||
@@ -736,29 +733,6 @@ class CoolUtil
|
||||
return array.indexOf(element) != -1;
|
||||
}
|
||||
#end
|
||||
|
||||
/**
|
||||
* Returns a new bitmap without any empty transperent space on the edges
|
||||
* @param bitmap The bitmap to be cropped
|
||||
*/
|
||||
public static function cropBitmap(bitmap:BitmapData) {
|
||||
var minX:Int = bitmap.width;
|
||||
var minY:Int = bitmap.height;
|
||||
var maxX:Int = 0; var maxY:Int = 0;
|
||||
|
||||
for (y in 0...bitmap.height)
|
||||
for (x in 0...bitmap.width)
|
||||
if (bitmap.getPixel32(x, y) != 0x00000000) {
|
||||
if (x < minX) minX = x;
|
||||
if (y < minY) minY = y;
|
||||
if (x > maxX) maxX = x;
|
||||
if (y > maxY) maxY = y;
|
||||
}
|
||||
|
||||
var croppedBitmap:BitmapData = new BitmapData(maxX-minX+1, maxY-minY+1, true, 0x00000000);
|
||||
croppedBitmap.copyPixels(bitmap, new Rectangle(minX, minY, croppedBitmap.width, croppedBitmap.height), new Point(0,0));
|
||||
return croppedBitmap;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,25 +1,109 @@
|
||||
package funkin.editors.character;
|
||||
|
||||
import funkin.backend.utils.XMLUtil.AnimData;
|
||||
import flixel.math.FlxPoint;
|
||||
import flixel.util.FlxColor;
|
||||
|
||||
class CharacterAnimButton extends UIButton {
|
||||
public var anim:String = "";
|
||||
public var anim:String = null;
|
||||
public var data:AnimData = null;
|
||||
public var parent:CharacterAnimsWindow;
|
||||
|
||||
public function new(x:Float,y:Float,anim:String, offset:FlxPoint) {
|
||||
this.anim = anim;
|
||||
super(x,y, ""/*'$anim (${offset.x}, ${offset.y})'*/, function () {
|
||||
public var animationDisplayBG:UISliceSprite;
|
||||
public var nameTextBox:UITextBox;
|
||||
public var animTextBox:UITextBox;
|
||||
public var positionXStepper:UINumericStepper;
|
||||
public var positionYStepper:UINumericStepper;
|
||||
public var fpsStepper:UINumericStepper;
|
||||
public var loopedCheckbox:UICheckbox;
|
||||
public var indicesTextBox:UITextBox;
|
||||
public var XYComma:UIText;
|
||||
|
||||
public var labels:Map<UISprite, UIText> = [];
|
||||
|
||||
public function new(x:Float, y:Float, animData:AnimData, parent:CharacterAnimsWindow) {
|
||||
this.anim = animData.name;
|
||||
this.data = animData;
|
||||
this.parent = parent;
|
||||
super(x,y, '${animData.name} (${animData.x}, ${animData.y})', function () {
|
||||
CharacterEditor.instance.playAnimation(this.anim);
|
||||
}, Std.int(500-16), 100);
|
||||
}, Std.int(500-16-32), 184);
|
||||
|
||||
function addLabelOn(ui:UISprite, text:String, ?size:Int):UIText {
|
||||
var uiText:UIText = new UIText(ui.x, ui.y-18, 0, text, size);
|
||||
members.push(uiText); labels.set(ui, uiText);
|
||||
return uiText;
|
||||
}
|
||||
|
||||
autoAlpha = autoFrames = false;
|
||||
autoAlpha = autoFrames = autoFollow = false;
|
||||
|
||||
frames = Paths.getFrames('editors/ui/inputbox');
|
||||
framesOffset = 9;
|
||||
field.fieldWidth = 0; framesOffset = 9;
|
||||
field.visible = false;
|
||||
|
||||
animationDisplayBG = new UISliceSprite(x+12, y+12+18+12, 128, 128, 'editors/ui/inputbox');
|
||||
members.push(animationDisplayBG);
|
||||
|
||||
nameTextBox = new UITextBox(animationDisplayBG.x+126+16, animationDisplayBG.y, animData.name, 116, 22, false, true);
|
||||
members.push(nameTextBox);
|
||||
addLabelOn(nameTextBox, "Name", 12);
|
||||
|
||||
animTextBox = new UITextBox(nameTextBox.x + 100 + 12, nameTextBox.y, animData.anim, 146, 22, false, true);
|
||||
members.push(animTextBox);
|
||||
addLabelOn(animTextBox, "Animation", 12);
|
||||
|
||||
positionXStepper = new UINumericStepper(animTextBox.x, animTextBox.y+32+18, animData.x, 0.001, 2, null, null, 64, 22, true);
|
||||
members.push(positionXStepper);
|
||||
addLabelOn(positionXStepper, "Position (X,Y)", 12);
|
||||
|
||||
members.push(XYComma = new UIText(positionXStepper.x+104-32+0, positionXStepper.y + 9, 0, ",", 18));
|
||||
|
||||
positionYStepper = new UINumericStepper(positionXStepper.x+104-32+26, positionXStepper.y, animData.y, 0.001, 2, null, null, 64, 22, true);
|
||||
members.push(positionYStepper);
|
||||
|
||||
fpsStepper = new UINumericStepper(animTextBox.x + 200 + 26, animTextBox.y, 0, 0.1, 2, animData.fps, 100, 52, 22, true);
|
||||
members.push(fpsStepper);
|
||||
addLabelOn(fpsStepper, "FPS", 12);
|
||||
|
||||
loopedCheckbox = new UICheckbox(fpsStepper.x + 82 - 32 + 26, fpsStepper.y, "Looping?", animData.loop, 0, true);
|
||||
members.push(loopedCheckbox);
|
||||
addLabelOn(loopedCheckbox, "Looped", 12);
|
||||
|
||||
loopedCheckbox.x += 8; loopedCheckbox.y += 6;
|
||||
|
||||
indicesTextBox = new UITextBox(nameTextBox.x, nameTextBox.y, animData.indices.getDefault([]).join(","), 278, 22, false, true);
|
||||
members.push(indicesTextBox);
|
||||
addLabelOn(indicesTextBox, "Indices (frames)", 12);
|
||||
|
||||
}
|
||||
|
||||
public function updateInfo(anim:String, offset:FlxPoint, ghost:Bool) {
|
||||
this.anim = anim;
|
||||
public override function update(elapsed:Float) {
|
||||
field.follow(this, 20, 12);
|
||||
|
||||
animationDisplayBG.follow(this, 16, 12+18+11);
|
||||
nameTextBox.follow(this, 14+128+16, 12+18+8+14);
|
||||
animTextBox.follow(this, 14+128+12+116+20, 12+18+8+14);
|
||||
|
||||
positionXStepper.follow(this, 14+128+16, 12+18+8+10+24+26);
|
||||
positionYStepper.follow(this, 14+128+16+64-32+28, 12+18+8+10+24+26);
|
||||
XYComma.follow(positionXStepper, 64-24, 6);
|
||||
|
||||
fpsStepper.follow(this, 14+128+16+64-32+28+64-22+20, 12+18+8+10+24+26);
|
||||
loopedCheckbox.follow(this, 14+128+16+64-32+28+64-22+20+52-22+18+8, 12+18+8+10+24+32);
|
||||
|
||||
indicesTextBox.follow(this, 14+128+16, 12+18+8+10+24+26+24+22);
|
||||
|
||||
for (ui => text in labels)
|
||||
text.follow(ui, -(2+(ui is UICheckbox?12:0)), -(18+(ui is UICheckbox?6:0)));
|
||||
|
||||
super.update(elapsed);
|
||||
}
|
||||
|
||||
public override function draw() {
|
||||
super.draw();
|
||||
|
||||
// if (parent.displayAnimsList.contains(anim)) {
|
||||
// parent.displayAnimsList.animation
|
||||
// }
|
||||
}
|
||||
}
|
||||
@@ -1,123 +0,0 @@
|
||||
package funkin.editors.character;
|
||||
|
||||
import flixel.animation.FlxAnimation;
|
||||
import flixel.math.FlxPoint;
|
||||
import funkin.backend.utils.XMLUtil.AnimData;
|
||||
|
||||
class CharacterAnimScreen extends UISubstateWindow {
|
||||
public var animData:AnimData;
|
||||
|
||||
public var nameTextBox:UITextBox;
|
||||
public var animTextBox:UITextBox;
|
||||
public var fpsStepper:UINumericStepper;
|
||||
public var loopedCheckbox:UICheckbox;
|
||||
public var indicesTextBox:UITextBox;
|
||||
public var offsetXStepper:UINumericStepper;
|
||||
public var offsetYStepper:UINumericStepper;
|
||||
|
||||
public var saveButton:UIButton;
|
||||
public var closeButton:UIButton;
|
||||
|
||||
public var onSave:(animData:AnimData) -> Void = null;
|
||||
|
||||
public function new(animData:AnimData, ?onSave:(animData:AnimData) -> Void) {
|
||||
this.animData = animData;
|
||||
this.onSave = onSave;
|
||||
super();
|
||||
}
|
||||
|
||||
public override function create() {
|
||||
var creatingAnim:Bool = animData == null;
|
||||
|
||||
if (creatingAnim)
|
||||
animData = {
|
||||
name: "name",
|
||||
anim: "anim",
|
||||
fps: 24,
|
||||
loop: false,
|
||||
animType: NONE,
|
||||
x: 0,
|
||||
y: 0,
|
||||
indices: []
|
||||
};
|
||||
|
||||
winTitle = creatingAnim ? 'Creating Animation' : 'Animation ${animData.name} properties';
|
||||
winWidth = 690; winHeight = 314;
|
||||
|
||||
super.create();
|
||||
|
||||
function addLabelOn(ui:UISprite, text:String)
|
||||
add(new UIText(ui.x, ui.y - 24, 0, text));
|
||||
|
||||
var title:UIText;
|
||||
add(title = new UIText(windowSpr.x + 20, windowSpr.y + 30 + 16, 0, creatingAnim ? "Create New Animation" : "Edit Animation Properties", 28));
|
||||
|
||||
nameTextBox = new UITextBox(title.x, title.y + title.height + 38, animData.name, 160);
|
||||
add(nameTextBox);
|
||||
addLabelOn(nameTextBox, "Name");
|
||||
|
||||
animTextBox = new UITextBox(nameTextBox.x + 160 + 26, nameTextBox.y, animData.anim, 200);
|
||||
add(animTextBox);
|
||||
addLabelOn(animTextBox, "Animation");
|
||||
|
||||
fpsStepper = new UINumericStepper(animTextBox.x + 200 + 26, animTextBox.y, animData.fps, 0.1, 2, 1, 100, 82);
|
||||
add(fpsStepper);
|
||||
addLabelOn(fpsStepper, "FPS");
|
||||
|
||||
loopedCheckbox = new UICheckbox(fpsStepper.x + 82 - 32 + 26, fpsStepper.y, "Looped", animData.loop);
|
||||
add(loopedCheckbox);
|
||||
addLabelOn(loopedCheckbox, "Looping");
|
||||
loopedCheckbox.x += 8; loopedCheckbox.y += 6;
|
||||
|
||||
indicesTextBox = new UITextBox(nameTextBox.x, nameTextBox.y + 32 + 40, animData.indices.join(", "), 270);
|
||||
add(indicesTextBox);
|
||||
addLabelOn(indicesTextBox, "Indices");
|
||||
|
||||
offsetXStepper = new UINumericStepper(indicesTextBox.x + 270 + 26, indicesTextBox.y, animData.x, 0.001, 2, null, null, 84);
|
||||
add(offsetXStepper);
|
||||
addLabelOn(offsetXStepper, "Offset (X,Y)");
|
||||
|
||||
add(new UIText(offsetXStepper.x + 84 - 32 + 0, offsetXStepper.y + 9, 0, ",", 22));
|
||||
|
||||
offsetYStepper = new UINumericStepper(offsetXStepper.x + 84 - 32 + 26, offsetXStepper.y, animData.y, 0.001, 2, null, null, 84);
|
||||
add(offsetYStepper);
|
||||
|
||||
saveButton = new UIButton(windowSpr.x + windowSpr.bWidth - 20 - 125, windowSpr.y + windowSpr.bHeight - 16 - 32, "Save & Close", function() {
|
||||
saveAnimData();
|
||||
close();
|
||||
}, 125);
|
||||
add(saveButton);
|
||||
|
||||
closeButton = new UIButton(saveButton.x - 20, saveButton.y, creatingAnim ? "Cancel" : "Close", function() {
|
||||
if (creatingAnim && onSave != null) onSave(null);
|
||||
close();
|
||||
}, 125);
|
||||
add(closeButton);
|
||||
closeButton.color = 0xFFFF0000;
|
||||
closeButton.x -= closeButton.bWidth;
|
||||
}
|
||||
|
||||
public function saveAnimData() {
|
||||
for (stepper in [offsetXStepper, offsetYStepper, fpsStepper])
|
||||
@:privateAccess stepper.__onChange(stepper.label.text);
|
||||
|
||||
animData = {
|
||||
name: nameTextBox.label.text,
|
||||
anim: animTextBox.label.text,
|
||||
fps: fpsStepper.value,
|
||||
loop: loopedCheckbox.checked,
|
||||
animType: NONE,
|
||||
x: offsetXStepper.value,
|
||||
y: offsetYStepper.value,
|
||||
indices: []
|
||||
};
|
||||
var indicesSplit = indicesTextBox.label.text.split(",");
|
||||
for(indice in indicesSplit) {
|
||||
var i = Std.parseInt(indice.trim());
|
||||
if (i != null)
|
||||
animData.indices.push(i);
|
||||
}
|
||||
|
||||
if (onSave != null) onSave(animData);
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,27 @@
|
||||
package funkin.editors.character;
|
||||
|
||||
import funkin.game.Character;
|
||||
|
||||
class CharacterAnimsWindow extends UIButtonList<CharacterAnimButton> {
|
||||
public function new(x:Float, y:Float, animations:Array<String>) {
|
||||
super(x, y, Std.int(500-16), 419, "", FlxPoint.get(500-16, 100));
|
||||
public var character:Character;
|
||||
|
||||
public var displayWindowSprite:FlxSprite;
|
||||
public var displayAnimsList:Array<String> = [];
|
||||
|
||||
public function new(x:Float, y:Float, character:Character) {
|
||||
super(x, y, Std.int(500-16), 419, "", FlxPoint.get(Std.int(500-16-32), 184));
|
||||
|
||||
cameraSpacing = 0;
|
||||
frames = Paths.getFrames('editors/ui/inputbox');
|
||||
|
||||
for (anim in animations)
|
||||
add(new CharacterAnimButton(0,0, anim, FlxPoint.get()));
|
||||
displayWindowSprite = new FlxSprite();
|
||||
displayWindowSprite.loadGraphicFromSprite(character);
|
||||
|
||||
displayAnimsList = displayWindowSprite.animation.getNameList();
|
||||
|
||||
for (anim in character.getAnimOrder())
|
||||
add(new CharacterAnimButton(0,0, character.animDatas.get(anim), this));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -32,7 +32,7 @@ class CharacterEditor extends UIState {
|
||||
|
||||
public var cameraHoverDummy:CameraHoverDummy;
|
||||
|
||||
public var characterPropertiresWindow:CharacterPropertiesWindow;
|
||||
public var characterPropertiesWindow:CharacterPropertiesWindow;
|
||||
public var characterAnimsWindow:CharacterAnimsWindow;
|
||||
|
||||
public var charCamera:FlxCamera;
|
||||
@@ -235,21 +235,19 @@ class CharacterEditor extends UIState {
|
||||
uiGroup.cameras = [uiCamera];
|
||||
add(cameraHoverDummy = new CameraHoverDummy(uiGroup, FlxPoint.weak(0, 0)));
|
||||
|
||||
characterPropertiresWindow = new CharacterPropertiesWindow((FlxG.width-500), 23+12+10, character);
|
||||
uiGroup.add(characterPropertiresWindow);
|
||||
characterPropertiesWindow = new CharacterPropertiesWindow((FlxG.width-(532+16)), 23+12+10, character);
|
||||
uiGroup.add(characterPropertiesWindow);
|
||||
|
||||
topMenuSpr = new UITopMenu(topMenu);
|
||||
topMenuSpr.cameras = [uiCamera];
|
||||
|
||||
var animationsLoaded:Array<String> = character.getAnimOrder();
|
||||
|
||||
characterAnimsWindow = new CharacterAnimsWindow(characterPropertiresWindow.x, characterPropertiresWindow.y+224+16, animationsLoaded);
|
||||
characterAnimsWindow = new CharacterAnimsWindow(characterPropertiesWindow.x, characterPropertiesWindow.y+224+16, character);
|
||||
uiGroup.add(characterAnimsWindow);
|
||||
|
||||
add(uiGroup);
|
||||
add(topMenuSpr);
|
||||
|
||||
playAnimation(animationsLoaded[0]);
|
||||
playAnimation(character.getAnimOrder()[0]);
|
||||
_view_focus_character(null);
|
||||
|
||||
|
||||
@@ -375,9 +373,6 @@ class CharacterEditor extends UIState {
|
||||
ghosts.setOffsets(anim, offsets.clone());
|
||||
}
|
||||
|
||||
for (charButton in characterAnimsWindow.buttons.members)
|
||||
charButton.updateInfo(charButton.anim, character.getAnimOffset(charButton.anim), ghosts.animGhosts[charButton.anim].visible);
|
||||
|
||||
changeOffset(character.getAnimName(), FlxPoint.get(0, 0), false); // apply da new offsets
|
||||
}
|
||||
}
|
||||
@@ -419,18 +414,15 @@ class CharacterEditor extends UIState {
|
||||
}
|
||||
|
||||
public function createAnimWithUI() {
|
||||
FlxG.state.openSubState(new CharacterAnimScreen(null, (_) -> {
|
||||
if (_ != null) createAnim(_);
|
||||
}));
|
||||
|
||||
}
|
||||
|
||||
public function editAnimWithUI(name:String) {
|
||||
FlxG.state.openSubState(new CharacterAnimScreen(character.animDatas.get(name), (_) -> {
|
||||
if (_ != null) editAnim(name, _);
|
||||
}));
|
||||
|
||||
}
|
||||
|
||||
public function createAnim(animData:AnimData, animID:Int = -1, addtoUndo:Bool = true) {
|
||||
/*
|
||||
XMLUtil.addAnimToSprite(character, animData);
|
||||
ghosts.createGhost(animData.name);
|
||||
var newButton = new CharacterAnimButton(0, 0, animData.name, FlxPoint.get(animData.x,animData.y));
|
||||
@@ -441,6 +433,7 @@ class CharacterEditor extends UIState {
|
||||
|
||||
if (addtoUndo)
|
||||
undos.addToUndo(CCreateAnim(character.getNameList().length, animData));
|
||||
*/
|
||||
}
|
||||
|
||||
public function editAnim(name:String, animData:AnimData, addtoUndo:Bool = true) {
|
||||
@@ -452,7 +445,6 @@ class CharacterEditor extends UIState {
|
||||
ghosts.removeGhost(name);
|
||||
XMLUtil.addAnimToSprite(character, animData);
|
||||
ghosts.createGhost(animData.name);
|
||||
buttoner.updateInfo(animData.name, character.getAnimOffset(animData.name), ghosts.animGhosts[animData.name].visible);
|
||||
|
||||
if (character.getAnimName() == animData.name) // update anim ifs its currently selected
|
||||
playAnimation(animData.name);
|
||||
@@ -514,7 +506,6 @@ class CharacterEditor extends UIState {
|
||||
var animButton:CharacterAnimButton = null;
|
||||
for (button in characterAnimsWindow.buttons.members)
|
||||
if (button.anim == anim) animButton = button;
|
||||
animButton.updateInfo(anim, character.getAnimOffset(anim), ghost.visible);
|
||||
}
|
||||
|
||||
function _playback_play_anim(_) {
|
||||
@@ -574,9 +565,6 @@ class CharacterEditor extends UIState {
|
||||
if (character.getNameList().length == 0) return;
|
||||
|
||||
character.animOffsets.set(anim, character.getAnimOffset(anim) + change);
|
||||
for (i in characterAnimsWindow.buttons.members)
|
||||
if (i.anim == anim)
|
||||
i.updateInfo(anim, character.getAnimOffset(anim), ghosts.animGhosts[anim].visible);
|
||||
character.frameOffset.set(character.getAnimOffset(anim).x, character.getAnimOffset(anim).y);
|
||||
|
||||
ghosts.updateOffsets(anim, change);
|
||||
@@ -592,13 +580,6 @@ class CharacterEditor extends UIState {
|
||||
for (anim => offsets in character.animOffsets)
|
||||
anim => offsets.clone()
|
||||
];
|
||||
for (anim in character.getNameList()) {
|
||||
character.animOffsets[anim].zero();
|
||||
for (i in characterAnimsWindow.buttons.members)
|
||||
if (i.anim == anim)
|
||||
i.updateInfo(anim, character.getAnimOffset(anim), ghosts.animGhosts[anim].visible);
|
||||
}
|
||||
|
||||
changeOffset(character.getAnimName(), FlxPoint.get(), false);
|
||||
ghosts.clearOffsets();
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ import openfl.geom.Rectangle;
|
||||
import openfl.display.BitmapData;
|
||||
import flixel.util.FlxColor;
|
||||
|
||||
using funkin.backend.utils.BitmapUtil;
|
||||
|
||||
// DONT DELETE I MIGHT USE LATER -lunar
|
||||
class CharacterIconDisplay extends UISprite {
|
||||
public var healthBarBG:FlxSprite;
|
||||
@@ -22,10 +24,13 @@ class CharacterIconDisplay extends UISprite {
|
||||
|
||||
iconBitmap.copyPixels(imageBitmap, new Rectangle(0, 0, 150, 150), new Point(0,0));
|
||||
|
||||
loadGraphic(iconBitmap.cropBitmap());
|
||||
loadGraphic(FlxG.bitmap.add(iconBitmap.crop()));
|
||||
scale.x = scale.y = 40/pixels.height;
|
||||
updateHitbox();
|
||||
|
||||
// bye guys :((
|
||||
imageBitmap.dispose(); iconBitmap.dispose();
|
||||
|
||||
antialiasing = true;
|
||||
|
||||
healthBarBG = new FlxSprite(x+(width/2), y+(height*(2.25/4))+2).makeSolid(barWidth-Std.int(width), 10, 0xFF000000);
|
||||
|
||||
@@ -7,6 +7,7 @@ class UIButton extends UISliceSprite {
|
||||
public var hasBeenPressed = false;
|
||||
|
||||
public var autoFrames:Bool = true;
|
||||
public var autoFollow:Bool = true;
|
||||
|
||||
public override function new(x:Float, y:Float, text:String, callback:Void->Void, w:Int = 120, h:Int = 32) {
|
||||
super(x, y, w, h, 'editors/ui/button');
|
||||
@@ -20,7 +21,7 @@ class UIButton extends UISliceSprite {
|
||||
|
||||
public override function resize(w:Int, h:Int) {
|
||||
super.resize(w, h);
|
||||
if (field != null) field.fieldWidth = w;
|
||||
if (field != null && autoFollow) field.fieldWidth = w;
|
||||
}
|
||||
|
||||
public override function onHovered() {
|
||||
@@ -33,7 +34,7 @@ class UIButton extends UISliceSprite {
|
||||
}
|
||||
|
||||
public override function update(elapsed:Float) {
|
||||
field.follow(this, 0, (bHeight - field.height) / 2);
|
||||
if (autoFollow) field.follow(this, 0, (bHeight - field.height) / 2);
|
||||
if (!hovered && hasBeenPressed && FlxG.mouse.justReleased) hasBeenPressed = false;
|
||||
if (autoAlpha) alpha = field.alpha = selectable ? 1 : 0.4;
|
||||
super.update(elapsed);
|
||||
|
||||
@@ -2,20 +2,22 @@ package funkin.editors.ui;
|
||||
|
||||
class UICheckbox extends UISprite {
|
||||
public var checked:Bool = false;
|
||||
public var small:Bool = false;
|
||||
public var onChecked:Bool->Void = null;
|
||||
|
||||
public var field:UIText;
|
||||
public var check:FlxSprite;
|
||||
|
||||
public function new(x:Float, y:Float, text:String, checked:Bool = false, w:Int = 0) {
|
||||
public function new(x:Float, y:Float, text:String, checked:Bool = false, w:Int = 0, small:Bool = false) {
|
||||
super(x, y);
|
||||
loadGraphic(Paths.image('editors/ui/checkbox'), true, 20, 20);
|
||||
loadGraphic(Paths.image('editors/ui/checkbox${small ? "-small" : ""}'), true, small ? 14 : 20, small ? 14 : 20);
|
||||
for(frame=>name in ["normal", "hover", "pressed", "checkmark"])
|
||||
animation.add(name, [frame], 0, false);
|
||||
|
||||
this.checked = checked;
|
||||
this.small = small;
|
||||
|
||||
field = new UIText(x, y, w, text);
|
||||
field = new UIText(x, y, w, text, small ? 12 : 15);
|
||||
check = new FlxSprite().loadGraphicFromSprite(this);
|
||||
check.animation.play("checkmark");
|
||||
|
||||
@@ -42,7 +44,7 @@ class UICheckbox extends UISprite {
|
||||
|
||||
public inline function updatePositions() {
|
||||
check.follow(this);
|
||||
field.follow(this, 25, 0);
|
||||
field.follow(this, (small ? 14 : 20)+5, 0);
|
||||
}
|
||||
|
||||
public override function draw() {
|
||||
|
||||
@@ -7,8 +7,8 @@ class UINumericStepper extends UITextBox {
|
||||
public var max:Null<Float> = null;
|
||||
public var step:Float = 1;
|
||||
|
||||
public function new(x:Float, y:Float, value:Float = 0, step:Float = 1, precision:Int = 0, ?min:Float, ?max:Float, w:Int = 180, h:Int = 32) {
|
||||
super(x, y, "", w - h, h, false);
|
||||
public function new(x:Float, y:Float, value:Float = 0, step:Float = 1, precision:Int = 0, ?min:Float, ?max:Float, w:Int = 180, h:Int = 32, small:Bool = false) {
|
||||
super(x, y, "", w - h, h, false, small);
|
||||
|
||||
onChange = __onChange;
|
||||
|
||||
|
||||
@@ -17,10 +17,10 @@ class UITextBox extends UISliceSprite implements IUIFocusable {
|
||||
|
||||
var __wasFocused:Bool = false;
|
||||
|
||||
public function new(x:Float, y:Float, text:String = "", width:Int = 320, height:Int = 32, multiline:Bool = false) {
|
||||
super(x, y, width, height, 'editors/ui/inputbox');
|
||||
public function new(x:Float, y:Float, text:String = "", width:Int = 320, height:Int = 32, multiline:Bool = false, small:Bool = false) {
|
||||
super(x, y, width, height, 'editors/ui/inputbox${small ? "-small" : ""}');
|
||||
|
||||
label = new UIText(0, 0, width, text);
|
||||
label = new UIText(0, 0, width, text, small ? 12 : 15);
|
||||
members.push(label);
|
||||
|
||||
caretSpr = new FlxSprite(0, 0);
|
||||
|
||||
Reference in New Issue
Block a user