Custom Sprite Framework 自定义精灵框架V2.9 脚本
yunzl 发表于 2020-02-27 01:28:10 660

因为注意到了sprite_add会造成大量的纹理交换问题,所以找到了这个东西,机翻处理一下发上来也许能帮到也有被此困扰的朋友,如果对翻译有什么疑问,请直接查看原文,发现问题请在此贴下跟帖纠错

https://marketplace.yoyogames.com/assets/4543/custom-sprite-framework

https://github.com/GameMakerDiscord/custom-sprite-framework/wiki

https://github.com/GameMakerDiscord/custom-sprite-framework

本文档是针对2.9版本的。

版本2.9有一个重要的更新。 在更新项目之前备份项目。内部算法和外部脚本已被更改,可能会导致意外行为,如果您发现一个 bug,请在市场或 github 上报告。 仔细阅读更改并相应地更新您的实现。我还计划在八月底拿到许可证后,把这个更新到 GMS2。

(并没有)

更新日志

(跳过,想看的去看原文)

内部:

(跳过)

目录

Groups – (组)用于处理内存管理和纹理页面的组

Stream – (流)图像加载

Cache – (缓存)将图像组缓存到缓存中,以便存储和加载速度更快

Handling – (处理)获取或设置单个图像数据的处理函数

Drawing – (绘图)绘制图像的功能

Misc – (杂项)其他函数


Groups

图像组用于存储纹理和图像数据。 图像组使得内存管理变得更加容易,组织事物也变得更加容易。 可以使用图像流(image_stream)或图像缓存(image_cache)函数将图像加载到组中。

概要 描述
name 组的名称
identifier 使用 image_streamadd... 添加到到子画面的子画面标识符

例子

txg_menu = image_group_create( "menu" );
image_stream_start( txg_menu, 1024, 1024, 1, false, true );
    image_stream_add( "button_play", working_directory + "button_play.png", 3, 0.5, 0.5 );
    image_stream_add_sheet( "button_settings", working_directory + "button_settings.png", 3, 2, 0.5, 0.5 );
    image_stream_add_files( "button_exit", working_directory + "button_exit", 3, 0.5, 0.5 );
image_stream_finish( txg_menu );

img_play = image_group_find_image( "button_play" );
img_settings = image_group_find_image( "button_settings" );
img_exit = image_group_find_image( "button_exit" );

Stream

图像流用于从计算机或因特网将图像加载到图像系统中。 图像流允许您同时将图像加载到多个组中。 如果你只是从计算机上加载图像,那么你只需要使用image_stream_start, image_stream_add, image_stream_add_files, image_stream_add_sheet, image_stream_add_3dimage_stream_finish,示例代码:

image_system_init();

image_group_create( "main" );
image_stream_start( "main", 256, 256, 1, true, true );
    image_stream_add( "main", "player", "player.png", 4, 0.5, 1.0 );
    image_stream_add( "main", "baddie", "baddie.png", 4, 0.5, 1.0 );
    image_stream_add( "main", "floor", "floor.png", 1, 0, 0 );
image_stream_finish( "main" );

img_player = image_group_find_image( "main", "player" );
img_baddie = image_group_find_image( "main", "baddie" );
img_floor = image_group_find_image( "main", "floor" );

但是,如果您正在从计算机和互联网上加载图像,或者只是从互联网上加载图像,则需要使用异步“图像加载”事件来加载图像。 要确保所有的图像都已到达,并在需要时重新对它们进行处理,必须使用image_stream_receiveimage_stream_is_received。 示例代码:

CREATE EVENT (创建事件)

image_system_init();

image_group_create( "main" );
image_stream_start( "main", 256, 256, 1, true, true );
    image_stream_add( "main", "player", "player.png", 4, 0.5, 1.0 );
    image_stream_add( "main", "baddie", "baddie.png", 4, 0.5, 1.0 );
    image_stream_add( "main", "floor", "floor.png", 1, 0.0, 0.0 );

IMAGE LOADED EVENT (图像加载事件)

image_stream_receive( "main" );

STEP EVENT (步事件)

// image_stream_finish() 添加到图像加载事件是不安全的
//因为只有当图像从互联网上传来时,才会触发加载图像的事件。
//如果你只是下载图片而不是从电脑上添加图片,它可能会有用。
if( image_stream_is_active( "main" ) ){
    if( image_stream_is_received( "main" ) ){
        image_stream_finish( "main" );
        img_player = image_group_find_image( "main", "player" );
        img_baddie = image_group_find_image( "main", "baddie" );
        img_floor  = image_group_find_image( "main", "floor" );
    }
}

杂项

  • image_stream_is_active(group) - 如果图像流已经启动,则返回 true
  • image_stream_is_received(group) - 如果流已经完成,返回 true。 只有在接收来自互联网的图像时才使用。 需要图像流接收才能工作
  • image_stream_progress(group) - 以0-1之间的值返回流的进度。 需要图像流接收才能工作
  • image_stream_stop(group) - 停止流并清除迄今为止加载的所有数据

image_stream_start(group, tex_page_width, tex_page_height, tex_sep, clamp, removeback)

概要 描述
tex_page_width 组中纹理页面的宽度
tex_page_height 组中纹理页面的高度
sep 纹理页面上不同图像之间的距离
clamp 纹理页面上的子图像最小大小
removeback 指示是否使所有背景颜色(左底像素)透明的像素

返回: 成功时为真,失败时为假

启动图像加载流,您可以将图像添加到流中并立即加载它们,或者使用 Image Loaded 事件加载来自互联网的图像。 使用image_stream_finish加载他们。

clamp选项计算纹理页每个子图像的最小可见大小。 图像来源相应地被固定。

alt

image_stream_add(group,identifier,fname,subimg,xorig,yorig)

概要 描述
identifier 一个键,稍后将用于再次查找图像
fname 图像的文件路径或 url
subimg 子图像的数量
xorig 作为 UV 值的精灵原点。 0.0-左,1.0-右
yorig 作为 UV 值的精灵原点。 0.0-上,1.0-下

返回: 失败返回假,成功返回真

将图像条添加到要加载的流中。 Fname 可以是设备上的 url 或路径。 适用沙箱规则。

image_stream_add_sheet(group,identifier,fname,hor_count,ver_count,xorig,yorig)

概要 描述
identifier 一个键,稍后将用于再次查找图像
fname 图像的文件路径或 url
hor_count 每行中的子图像数
ver_count 每列中子图像的数目
xorig 作为 UV 值的精灵原点。 0.0-左,1.0-右
yorig 作为 UV 值的精灵原点。 0.0-上,1.0-下

返回: 失败返回假,成功返回真

将图像表添加到要加载的流中。 Fname 可以是设备上的 url 或路径。 适用沙箱规则。 这也会在控制台中输出一个警告,以防图像的大小不能正确地除以 hor_count 和 ver_count。

image_stream_add_files(group,identifier,basename,xorig,yorig)

概要 描述
identifier 一个键,稍后将用于再次查找图像
basename 没有指定格式或子图像的精灵文件路径
xorig 作为 UV 值的精灵原点。 0.0-左,1.0-右
yorig 作为 UV 值的精灵原点。 0.0-上,1.0-下

返回: 失败返回假,成功返回真

将图像添加到要加载的流中。 Basename 指向子图像的路径,包括其通用名称,而不使用后面的子图像编号或文件格式。

这个脚本支持.png, .jpg, .jpeg 和 .gif 格式,和所有其他流添加脚本一样。 如果基名是“coin” ,那么流将查找以“coin”开头、后面跟着“_number”任何支持的文件格式的文件。 如果有一个名为“coin_0_strip_0.png”或“coin_strip_0.png”的文件,那么这些将被忽略。 只有“coin_0.png”、“coin_1.jpg”、“coin_2.gif”会添加到这个图像中。

image_stream_add_3d(group,identifier,fname,subimg,xorig,yorig)

概要 描述
identifier 一个键,稍后将用于再次查找图像
fname 图像的文件路径或 url
subimg 子图像的数量
xorig 作为 UV 值的精灵原点。 0.0-左,1.0-右
yorig 作为 UV 值的精灵原点。 0.0-上,1.0-下

返回: 失败返回假,成功返回真

将图像添加到要加载的流中。 Fname 可以是设备上的 url 或路径。适用沙箱规则。

注意: 这将设置图像其所有的子图像为一个单独的纹理,应该只用于3d,需要你使用一个图像的完整纹理时。

image_stream_receive(group)

概要 描述
group 组的名称

返回: 在使用 otuside 作为异步事件时返回 false,否则返回 true。

在“Image loaded(图像加载)”事件中使用。 这将接收属于该组的图像。 如果一个加载失败了,它将被重新运行直到它被接收,因此你应该确保所有的链接预先工作。

注意: 如果你从互联网载入图像,这个功能必须使用,没有这个image_stream_progressimage_stream_is_received将无法正常工作。

image_stream_finish(group)

概要 描述
group 组的名称

返回: N/A

描述

将所有加载的图像排序到纹理中,并使它们可以使用。 如果您正在从互联网加载图像,这将只有在图像流已经完成加载图像的情况下才能工作。 使用image_stream_is_received检查它们是否被加载和image_stream_receive来接收它们。

例子

if( image_stream_is_active( "main" ) ){
    if( image_stream_is_received( "main" ) ){
        image_stream_finish( "main" );

        globalvar img_coin, img_player;
        img_coin = image_group_find_image( "main", "coin" );
        img_player = image_group_find_image( "main", "player" );
    }
}

Cache

图像缓存可用于将图像组存储到缓存中,这些缓存可以保存为单个文件或通过网络函数发送,缓存存储在缓存中。 在大多数情况下,从图像缓存加载图像也会大大提高加载速度。 代码示例:

将组保存为图像缓存。

var _cache = image_cache_create( "main" );
image_cache_save( _cache, working_directory + "main.ic" );
image_cache_delete( _cache );

从图像缓存中加载组。

txg_main = image_group_create( "main" );
var _cache = image_cache_load( working_directory + "main.ic" );
image_cache_unpack( "main", _cache );
image_cache_delete( _cache );

保存的每个图像缓存都附加了一个版本。 图像缓存加载也支持加载旧版本的缓存。 当前缓存版本为1.1。


Handling

  • image_get_number(ind) - 返回图像的子图像的数量
  • image_get_identifier(ind) - 返回图像的标识符
    if( image_get_identifier( image ) == "coin" ){
    score += 4;
    instance_destroy();
    }
  • image_get_width(ind) - 返回图像的宽度
  • image_get_height(ind) - 返回图像的高度
  • image_get_xoffset(ind) - 返回图像的 x 偏移
  • image_get_yoffset(ind) - 返回图像的 y 偏移
  • image_get_bbox_left(ind) - 返回精灵边界框左侧的相对位置。 该值作为基于左上角(0,0)的相对值给出
  • image_get_bbox_top(ind) - 返回精灵边界框顶部的相对位置。 该值作为基于左上角(0,0)的相对值给出
  • image_get_bbox_right(ind) - 返回精灵边界框右侧的相对位置。 该值作为基于左上角(0,0)的相对值给出
  • image_get_bbox_bottom(ind) - 返回精灵边界框底部的相对位置。 该值作为基于左上角(0,0)的相对值给出
  • image_set_bbox(ind,left,top,right,bottom) - 将图像框设置为指定的值
  • image_get_uvs(ind,subimg)返回一个数组,该数组包含纹理页面上的图像子图像的 UV 坐标、[0]左、[1]上、[2]右和[3]底。
    var _uv = image_get_uvs( image );
    sh_params = shader_get_uniform( sh_outline, "UV" );
    shader_set( sh_outline );
    shader_set_uniform_f_array(sh_params, _uv );
    draw_image( image, 0, x, y );
    shader_reset();
  • image_exists(ind) - 返回图像是否存在
  • image_set_offset(ind,xoff,yoff) - 将图像原点更改为指定的 x 和 y
  • image_get_texturepage(ind,subimg) - 返回图像所在的背景 ID,该 ID 用作文本页面
  • image_get_texture(ind,subimg)返回图像纹理的特殊指针。 这个值可以用在其他绘图函数中,特别是一般的3D 和一些2D 基元函数,以及着色器函数。

注意: 由于 GM 的限制,这将返回特定子图像的全部纹理,如果使用图像流添加3 d,它将只返回特定子图像的纹理。 您可以使用 image get uvs 来查找子图像在纹理上的坐标。

var _tex;
_tex = image_get_texture( img_wall, 0 );
draw_primitive_begin_texture( pr_trianglestrip, _tex );
draw_vertex_texture( 0, 0, 0, 0 );
draw_vertex_texture( 480, 0, 1, 0 ); draw_vertex_texture( 480, 640, 1, 1 );
draw_vertex_texture( 0, 640, 0, 1 );
draw_primitive_end();
  • image_save(ind,subimg,fname) - 将图像的特定子图像(帧)保存为 .Png 格式图像文件
  • image_save_strip(ind,fname) - 将图像保存为 .Png 格式图像文件

Drawing

所有的绘图函数都等价于 GM 的精灵绘图函数。 除非另有说明,否则使用相同的Gamemaker的精灵的功能。

  • draw_image(ind,subimg,x,y)
  • draw_image_ext(ind,subimg,x,y,xscale,yscale,rot,colour,alpha)
  • draw_image_general(ind,subimg,left,top,width,height,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha)
  • draw_image_part(ind,subimg,left,top,width,height,x,y)
  • draw_image_part_ext(ind,subimg,left,top,width,height,x,y,xscale,yscale,colour,alpha)
  • draw_image_pos(ind,subimg,x1,y1,x2,y2,x3,y3,x4,y4,alpha) - 这个工作方式与 GM 内置的绘制 sprite_pos 功能有点不同,这将绘制包括隐形区域在内的整个图像,GM 的内置功能将只绘制 alpha>0的区域
  • draw_image_stretched(ind,subimg,x,y,w,h)
  • draw_image_stretched_ext(ind,subimg,x,y,w,h,colour,alpha)
  • draw_image_tiled(ind,subimg,x,y)
  • draw_image_tiled_ext(ind,subimg,x,y,xscale,yscale,colour,alpha)
  • draw_image_tiled_area(image,subimg,x1,y1,x2,y2) - 绘制从x1,y1 到 x2,y2平铺的图像
概要 描述
image 图像的索引
subimg 图像的帧 / 子图像
x1 平铺区域的 x 起始坐标
y1 平铺区域的 y 起始坐标
x2 平铺区域的 x 结束坐标
y2 平铺区域的 y 轴坐标

tiled area

概要 描述
image 图像的索引
subimg 图像的帧 / 子图像
x1 平铺区域的 x 起始坐标
y1 平铺区域的 y 起始坐标
x2 平铺区域的 x 结束坐标
y2 平铺区域的 y 轴坐标
xscale 图像的水平比例(1默认值,2=2倍大)
yscale 图像的垂直比例(1默认值,2=2倍大)
colour 图像的颜色
alpha 图像的透明度

tiled area gif

  • draw_image_pos_ext(image,subimg,x1,y1,x2,y2,x3,y3,x4,y4,rot,col,alpha)
  • draw_image_pos_general(image,subimg,x1,y1,x2,y2,x3,y3,x4,y4,rot,c1,c2,c3,c4,alpha)

Misc

  • image_system_init() - 初始化映像系统,扩展自动调用它。 只有当您使用脚本或想手动重新初始化映像系统时才调用此命令
  • image_system_cleanup() - 从内存中删除所有图像系统数据
最后于 5月前 被LiarOnce编辑 ,原因:
上传的附件:
最新回复 (4)
  • POSI 发表于 2020-02-27 08:08:18
    0 2

    image_group_flush(name) - removes the given groups' texturepages from video memory. Read the documentation of background_flush for reference.

    image_group_flush(name) - 从显存中删除指定组的纹理页。background_flush是GMS1.4的函数,GMS2弃用

    _flush系列函数都是从显存中删除纹理页,被删除的纹理页在下次使用时需要重新载入,通常在新关卡开始时删除之前关卡的纹理页

    该系列函数只能用于windows以外平台,因为directx要求提前载入全部纹理

    clamp选项计算纹理页每个子图像的最小可见大小。 图像来源相应地被固定。

    Image origin is fixed accordingly. 这里的origin可能指图像原点,而不是来源

  • yunzl 发表于 2020-02-28 04:57:11
    0 3
    POSI image_group_flush(name) - removes the given groups' texturepages from video memory. Read the documen ...
    我给你上了权限,你可以编辑这个帖子
  • POSI2 发表于 2020-02-29 09:48:12
    0 4

    removeback 指示是否使所有背景颜色(左底像素)透明的像素

    是否清除背景色(左下像素的颜色)

    将图像条添加到要加载的流中。 Fname 可以是设备上的 url 或路径。 适用沙箱规则。

    将图像条添加到流中以备加载。Fname可以是url或设备上的路径。适用沙箱规则。

    注意: 这将设置图像其所有的子图像为一个单独的纹理,应该只用于3d,需要你使用一个图像的完整纹理时。

    注意:这将使图像的所有子图像设置为一个单独的纹理,用于3D或将整个图像作为纹理时。

    返回: 在使用 otuside 作为异步事件时返回 false,否则返回 true。返回: 在使用 otuside 作为异步事件时返回 false,否则返回 true。

    outside,这里作者可能写错了词

    注意: 由于 GM 的限制,这将返回特定子图像的全部纹理,如果使用图像流添加3 d,它将只返回特定子图像的纹理。 您可以使用 image get uvs 来查找子图像在纹理上的坐标。

    注意: 由于 GM 的限制,这将返回特定子图像的全部纹理,如果使用image_stream_add_3d,它将只返回特定子图像的纹理。 您可以使用 image_get_uvs来查找子图像在纹理上的坐标。

    三张图无法显示,可能需要本地上传一下。

    剩下的没什么大问题了

  • adajohn 发表于 2020-04-26 01:02:39
    0 5
    不知楼主实验没有 ,一运行就报错(错误指向一个函数 draw_background) , 导致整个框架无法使用