Roku动画使用动画精灵,如何制作繁琐xml
Roku animation using animated sprites, how to create the tedious xml
我制作了一个简单的 java 脚本代码来创建精灵 sheet xml 用于 roku 中用 brightscript 编写的精灵动画。有没有更简单的方法来传递 sheet 并让它计算出框架的尺寸?那会很酷。
我了解了动画精灵 here。
可以找到代码here。
JS
var generate = function () {
frame_w = parseInt($("#f_w").val());
frame_h = parseInt($("#f_h").val());
sheet_w = parseInt($("#s_w").val());
sheet_h = parseInt($("#s_h").val());
xml = '<BitmapSet>\r\n<Bitmap name="set" filespec="<PLACE YOUR SHEET PATH>">\r\n';
region = 0;
for (y = 0; y < sheet_h; y+=frame_h) {
for (x = 0; x < sheet_w; x+=frame_w) {
xml += '<Region name="r'+region+'" x="'+x+'" y="'+y+'" w="'+frame_w+'" h="'+frame_h+'"/>\r\n';
region++;
}
}
xml += '</Bitmap>\r\n<Animation name="animatedSprite">\r\n';
for (i = 0 ; i < region; i ++) {
xml += '<frame use="set.r'+i+'"/>\r\n';
}
xml += '</Animation>\r\n';
xml += '<ExtraInfo width="'+frame_w+'" height="'+frame_h+'" />\r\n'
xml += "</BitmapSet>";
$("#xml").html(formatXml(xml));
};
function formatXml(xml) {
var formatted = '';
var reg = /(>)(<)(\/*)/g;
xml = xml.replace(reg, '\r\n');
var pad = 0;
jQuery.each(xml.split('\r\n'), function(index, node) {
var indent = 0;
if (node.match( /.+<\/\w[^>]*>$/ )) {
indent = 0;
} else if (node.match( /^<\/\w/ )) {
if (pad != 0) {
pad -= 1;
}
} else if (node.match( /^<\w[^>]*[^\/]>.*$/ )) {
indent = 1;
} else {
indent = 0;
}
var padding = '';
for (var i = 0; i < pad; i++) {
padding += ' ';
}
formatted += padding + node + '\r\n';
pad += indent;
});
return formatted;
}
如果这对你有帮助,那么亲爱的,我想我会分享。
编码愉快:)
实际上,您不必为 sprite 动画使用 XML 文件。请注意必须设置框架的尺寸。
按照下面的示例,加载 128x128 尺寸和 12 帧的精灵:
compositor = CreateObject("roCompositor")
compositor.SetDrawTo(screen, &h80)
compositor.NewAnimatedSprite(576, 296, GetLoadingSpriteRegions())
Function GetLoadingSpriteRegions() as Object
arr = []
bitmap=createobject("robitmap","pkg:/images/loader_sprite.png")
for i=0 to 1408 step 128
region=createobject("roRegion",bitmap,i,0,128,128) 'frame is created here
arr.Push(region)
next
return arr
End Function
我制作了一个简单的 java 脚本代码来创建精灵 sheet xml 用于 roku 中用 brightscript 编写的精灵动画。有没有更简单的方法来传递 sheet 并让它计算出框架的尺寸?那会很酷。
我了解了动画精灵 here。
可以找到代码here。
JS
var generate = function () {
frame_w = parseInt($("#f_w").val());
frame_h = parseInt($("#f_h").val());
sheet_w = parseInt($("#s_w").val());
sheet_h = parseInt($("#s_h").val());
xml = '<BitmapSet>\r\n<Bitmap name="set" filespec="<PLACE YOUR SHEET PATH>">\r\n';
region = 0;
for (y = 0; y < sheet_h; y+=frame_h) {
for (x = 0; x < sheet_w; x+=frame_w) {
xml += '<Region name="r'+region+'" x="'+x+'" y="'+y+'" w="'+frame_w+'" h="'+frame_h+'"/>\r\n';
region++;
}
}
xml += '</Bitmap>\r\n<Animation name="animatedSprite">\r\n';
for (i = 0 ; i < region; i ++) {
xml += '<frame use="set.r'+i+'"/>\r\n';
}
xml += '</Animation>\r\n';
xml += '<ExtraInfo width="'+frame_w+'" height="'+frame_h+'" />\r\n'
xml += "</BitmapSet>";
$("#xml").html(formatXml(xml));
};
function formatXml(xml) {
var formatted = '';
var reg = /(>)(<)(\/*)/g;
xml = xml.replace(reg, '\r\n');
var pad = 0;
jQuery.each(xml.split('\r\n'), function(index, node) {
var indent = 0;
if (node.match( /.+<\/\w[^>]*>$/ )) {
indent = 0;
} else if (node.match( /^<\/\w/ )) {
if (pad != 0) {
pad -= 1;
}
} else if (node.match( /^<\w[^>]*[^\/]>.*$/ )) {
indent = 1;
} else {
indent = 0;
}
var padding = '';
for (var i = 0; i < pad; i++) {
padding += ' ';
}
formatted += padding + node + '\r\n';
pad += indent;
});
return formatted;
}
如果这对你有帮助,那么亲爱的,我想我会分享。
编码愉快:)
实际上,您不必为 sprite 动画使用 XML 文件。请注意必须设置框架的尺寸。
按照下面的示例,加载 128x128 尺寸和 12 帧的精灵:
compositor = CreateObject("roCompositor")
compositor.SetDrawTo(screen, &h80)
compositor.NewAnimatedSprite(576, 296, GetLoadingSpriteRegions())
Function GetLoadingSpriteRegions() as Object
arr = []
bitmap=createobject("robitmap","pkg:/images/loader_sprite.png")
for i=0 to 1408 step 128
region=createobject("roRegion",bitmap,i,0,128,128) 'frame is created here
arr.Push(region)
next
return arr
End Function