《译 SFML Essentials 英文版》—— 《第二章》“ Loading and Using Textures ”

目录

前言

Loading textures

Images versus textures

Creating images

Creating textures

Rendering shapes with textures (用textures 渲染形状)

What is a sprite?

Shapes versus sprites

Transformables and drawables

Final facts on sprites

Managing resources

Summary

 


前言


● Textures  对于2D和3D游戏都很重要。 它们允许我们将image 映射到对象上。 在本章中,我们将研究将Textures 加载到内存中并将它们映射到shapes上的方法。 Sprite 类将出现,我们将看到它与Shape类的区别。 最后,我们将看到如何在整个游戏生命周期中保护资源不被破坏。

在本章中,我们将介绍:

  • 加载Textures 
  • 使用Textures  渲染形状
  • 什么是sprite
  • 管理资源

 


Loading textures


● textures 是相当简单的物体。2D textures 本质上是一幅image,通常存储在( GPU ) memorySFML分别提供了一个Image
类和一个 textures 类来处理和渲染 images。

 


Images versus textures


● Images  和 textures 的主要区别在于它们的用途(purpose),分别是操作(manipulation)和渲染。Image类处理图像加载,存储 和 像素操作(manipulation),而Texture类用于渲染。这两个类的行为不同,但它们都不会修改保存的数据(像素数组)。因此,SFML提供了一种简单的创建方法。例如,如果我们想从文件夹中加载Image并对其进行一些修改,那么我们可以从该Image中创建Texture。

但是,如果我们想再次修改 Texture对象,我们必须将其Texture对象下载到Image 中,然后按照我们的要求处理它,然后再将其作为Texture再次上传。 整个过程可能会很昂贵,我们应该避免在代码的关键部分这样做。

 


Creating images


●  我们将讨论Textures 之前 先 讨论一下 如何 创建 和 加载 images , images 类中的很多函数 Textures 类中也有, 以下代码演示了如何创建50 x 50 images 并用红色填充它:

  sf::Image image; //创建一个 Image 对象
    image.create(50, 50, sf::Color::Red); 

Image :: create()函数的前两个参数表示图像的宽度和高度,最后一个参数是图像的颜色填充。 默认情况下,颜色设置为黑色,alpha 值是255。

 

 

● 也可以通过直接传递像素数组来创建 images。 该数组的元素必须是Uint8类型的,Uint8是内存的一个字节。 由于Image :: create()要求颜色采用RGBA格式,因此我们需要确保数组为每种颜色保留4个字节(每个颜色分量1个字节)。每个连续的4字节代表 images网格的一个像素,该像素按行按列排列。以下是如何完成此操作的示例:

 以下是如何完成此操作的示例:

  const unsigned int KWidth = 5, KHeight = 5;
    //Array size = width * height * 4(RGBA)
    sf::Uint8 pixels[KWidth * KHeight * 4] =
    {

        255 ,255,255,255, // White
        0,0,0,255, //Black
        255,0,0,255, // Red
        128,128,128,255, // Gray

        // ....all other pixels
    };
    sf::Image image;
    image.create(KWidth, KHeight, pixels);

上面的代码演示了如何创建images,它的大小为(5 x 5). 注意该数组是不包含sf :: Color类型的元素,而是通过颜色的RGBA 组成的 .  但是,在两种情况下指定颜色的方法是相同的 —— 为四个组件中的每一个传递一个字节(Uint8)。 这意味着每四个字节(4xUint8)代表图像的单个像素。

 

●  images也可以从文件夹中加载,如下所示:

 sf::Image image;
 image.loadFromFile("myImage.png");

上述代码假定系统目录中有一个名为 “ myImage.png ”  的images,如果要使用计算机上已有的images,从文件加载是创建images的有效方法。 SFML支持以下文件格式:bmp,png,tga,gif,psd,hdr,pic 和 jpg(不支持JPEG格式。) 如果我们尝试使用不同的文件格式加载图像,或者给定的文件不存在,Image :: loadFromFile()将返回false并在控制台中输出消息:

Failed to load image "myImage.png". Reason: Unable to open file

●  当images无法加载(出于任何原因)时,我们需要采取行动(通知用户,终止程序等)。 如果未正确加载images,以下代码将退出main()函数。 这是一种安全的方法,可以防止代码中出现任何未知的错误:

     sf::Image image;
    if (!image.loadFromFile("myImage.png"))
    {
        return -1;
    }

如果 Image :: loadFromFile()返回false ,则原来的images保持不变。

注意: 强烈建议我们使用无损文件格式(如PNG)为用户创建高质量的体验。 JPEG等有损格式会降低图像质量,同时提供更好的压缩效果。我们应该在程序比较小时使用 JPEG 格式,或者我们不关心图像的质量。例如,我们还可以选择对具有精心选择的压缩级别的大型图像(如背景)使用jpeg,这将为我们节省大量空间,同时也能保证最小的质量下降。

 

●  Image类提供了非常有用的方法来操作(manipulate )Image。

Image :: getPixel()和Image :: setPixel()等函数允许我们修改每个像素。 如果我们想要从Image中读取所有像素,可以使用 Image :: getPixelPtr()函数,它返回像素数组的的首地址。 此数组的格式与我们在第二个示例中用于创建Image的数组相同。除此之外,Image :: flipHorizontally()和 Image :: flipVertically()通过在特定方向上移动其像素来transform整个Image。最后,我们可以通过调用Image :: saveToFile()并传递文件名将Image保存到文件夹中。 保存Image的支持格式为:bmp,png,tga 和 jpg。

 

现在我们知道如何创建和操作(manipulate )Images,让我们看看如何利用它们创建textures。

 


Creating textures


● Texture类 与Image类的函数有很多都是相同的。 例如,我们可以像处理Image一样从文件夹加载Texture:

 sf::Texture texture;
    if (!texture.loadFromFile("myTexture.png"))
    {
        return -1;
    }

Texture :: loadFromFile() 该函数还有额外的功能。从文件夹中加载Textures 时,我们还可以选择只加载图像的一小部分。Texture :: loadFromFile()中有一个可选参数,它允许我们这样做。 在下面的代码中,我们将只从原始图像中的左上角开始加载一个32 x 32像素的正方形:

  • 13
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SFML(Simple and Fast Multimedia Library)是一个跨平台的多媒体库,用于开发2D游戏和多媒体应用程序。在SFML中,可以使用加载画面来显示在应用程序启动时的加载过程。 要实现加载画面,可以按照以下步骤进行操作: 1. 创建一个窗口:使用`sf::RenderWindow`类创建一个窗口对象,设置窗口的大小和标题。 2. 创建一个加载画面:可以使用`sf::RectangleShape`类或者`sf::Sprite`类来创建一个矩形或者精灵对象作为加载画面。 3. 绘制加载画面:在窗口中使用`draw`函数绘制加载画面。 4. 更新窗口:使用`display`函数更新窗口,使加载画面显示在屏幕上。 5. 加载资源:在加载画面显示的同时,可以在后台加载游戏资源或者其他需要加载的内容。 6. 完成加载:当所有资源加载完成后,可以关闭加载画面并进入游戏主界面。 下面是一个简单的示例代码,演示了如何使用SFML创建一个加载画面: ```cpp #include <SFML/Graphics.hpp> int main() { sf::RenderWindow window(sf::VideoMode(800, 600), "Loading Screen"); // 创建加载画面 sf::RectangleShape loadingScreen(sf::Vector2f(800, 600)); loadingScreen.setFillColor(sf::Color::Black); // 绘制加载画面 window.draw(loadingScreen); window.display(); // 模拟加载过程 // 这里可以添加加载资源的代码 // 完成加载,关闭加载画面 window.close(); return 0; } ``` 这只是一个简单的示例,你可以根据自己的需求进行扩展和修改。例如,可以在加载画面中添加进度条或者动画效果来提升用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值