用c 写的游戏-金沙1005

用c 写的游戏_c 游戏编程源代码对于2d和3d游戏来说,纹理是一个很重要的东西,它能够将一张图片映射到我们程序中的对象里。而精灵可以看作是包含其他显示对象的容器。在这篇文章中,将会讲解一下内容:读取纹理将纹理绘制在shape中什么是精灵资源管理一、读取纹理纹理是一个非常简单的对象。一个2d纹理本质上是一幅图片,通常存储在gpu中。sfml使用image类处理图片,使用texture…

对于 2d3d 游戏来说,纹理是一个很重要的东西,它能够将一张图片映射到我们程序中的对象里。而精灵可以看作是包含其他显示对象的容器。

在这篇文章中,将会讲解一下内容:

  • 读取纹理
  • 将纹理绘制在shape中
  • 什么是精灵
  • 资源管理

一、读取纹理

纹理是一个非常简单的对象。一个 2d 纹理本质上是一幅图片,通常存储在 gpu 中。sfml 使用 image 类处理图片,使用 texture 类绘制图片。

二、创建 images

在介绍纹理之前,我们先看看如何创建和读取图片。image 类中的很多方法在 texture 都可以使用。例如,我们想要创建一个 50 x 50 且被红色填充的图片。

sf::image image;
image.create(50, 50, sf::color::red);
用c  写的游戏_c  游戏编程源代码

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活clion
datagrip dataspell
dotcover dotmemory
dottrace goland
phpstorm pycharm
resharper reshac
rider rubymine
webstorm 全家桶

create() 方法第一个参数是图片的宽,第二个参数是高,第三个参数是图片的颜色(rgba)

除此之外,我们也可以使用像素数组来创建。数组每个元素是 uint8 类型(一个字节)。一个像素的大小是 4 个字节,表示 rgba。如下面的代码所示:

const unsigned int kwidth = 5, kheight = 5
// 数组大小 kwidth * kheight * 4
sf::uint8 pixels[kwidth * kheight * 4] = { 
   
    255, 255, 255, 255, // 白
    0, 0, 0, 255, // 黑
    255, 0, 0, 255, // 红
    128, 128, 128, 255, // 灰
    
    // ... 其他像素颜色
};
sf::image image;
image.create(kwidth, kheight, pixels);

当然,我们也可以从现有的图片中创建。如下:

sf::image image;
image.loadfromfile("myimage.png");

sfml 能够处理的图片格式包括:bmp, png, tga, gif, psd, hdr, pic 以及 jpg(不包括jpeg)

如果图片不存在, loadfromfile() 会返回 false,导致不必要的 bug。因此上面的代码改为:

sf::image image;
if (!image.loadfromfile("myimage.png")) { 
   
    return -1;
}

这里强烈推荐使用无损格式的图片,比如 png 格式。除非我们不关心图片质量或者内存有限的情况下,对图片恰当的进行压缩。

image 类提供了一些常用的方法,

  • image::getpixel()image::setpixel() 改变图片某个像素
  • image::getpixelptr() 获取所有的图片像素,它返回的事数组的起始地址,数组的定义跟前面我们使用的像素数组一眼。

三、创建 textures

texture 类跟 image 类很多方法都是类似的,例如我们创建一个纹理:

sf::texture texture;
if (texture.loadfromfile("mytexture.png"))
    return -1;

loadfromfile() 还允许我们只截取图片的部分区域,代码如下:

sf::texture texture;
if (texture.loadfromfile("mytexture.png", sf::intrect(0, 0, 32, 32)))
    return -1;

上面的代码截取图片 32*32 大小,原点坐标在图片的左上角。如果需要多次截取图片,我们可以用 image 读取图片一次,然后用这个图片去创建纹理。

sf::image image;
image.create(50, 50, sf::color::red);
sf::texture texture;
texture.loadfromfile(image);

四、将纹理绘制在shape中

前面都是在介绍怎么创建或者读取图片,这里将介绍我们如何将图片显示出来。

texture 是像素的集合,它不能直接绘制到屏幕上,还需要设置它的位置,旋转角度等参数。shape 类能够起到这么一个作用。

sf::texture texture;
texture.loadfromfile("mytexture.png");
sf::rectangleshape rectshape(sf::vector2f(300, 150));
rectshape.settexture(&texture);
while (window.isopen()) { 
   
    window.clear(sf::color::black);
    window.draw(rectshape);
    window.display();
}

上面的代码将 texture 对象放入 rectangleshape 中。texture 对象会适当的缩放自身使之适合 rectangleshape 的大小。例如,我们的 texture 如果是 200 * 200 大小的,** rectangleshape** 是 300 * 150 大小的。那么 ** texture** 将会在 x 方向拉伸显示,而在 y 方向压缩显示。

未设置正确大小

一般来说,我们不希望看到这样的效果。。。

为此,我们需要正确的设置 rectangleshape 的大小,可以使用 texture::getsize() 获取我们 texture 的大小。

因此,代码可以修改为:

sf::vector2u texturesize = texture.getsize();
float rectwidth = static_cast<float>(texturesize.x);
float rectheight = static_cast<float>(texturesize.y);
sf::rectangleshape rectshape(sf::vector2f(rectwidth, rectheight));
rectshape.settexture(&texture);
设置正确大小

除此之外,texture 对象还可以绘制到其他 shape 当中,例如 circleshapeconvexshape

某些时候,一张大图片可能由一张小图片多次出现组成,如下图所示。

用c  写的游戏_c  游戏编程源代码

这时候,我们可以通过 sfml 实现,以减少空间的占用。 texture 中有一个方法叫做 texture::setrepeated(),设置为 true 的时候表示当前 texture 对象是可重复的。

例如我们有一张 128 * 221大小的图片,我们需要在 x 轴上重复 3 次,在 y 轴上重复 2 次。

sf::texture texture;
texture.loadfromfile("rep.png");
texture.setrepeated(true);
sf::rectangleshape rectshape(sf::vector2f(128 * 3, 221 * 2));
rectshape.settexture(&texture);

但是上面这份代码达不到我们需要的效果,它会将原图片单纯的拉伸显示而不是重复显示。这里的解决办法是将这个纹理矩形设置的比原来的要大。

sf::texture texture;
texture.loadfromfile("rep.png");
texture.setrepeated(true);
sf::rectangleshape rectshape(sf::vector2f(128 * 3, 221 * 2));
// 将纹理矩形设置的比原来的要大
rectshape.settexturerect(sf::intrect(0, 0, 128 * 3, 221 * 2));
rectshape.settexture(&texture);

这样就达到了我们需要的效果:

用c  写的游戏_c  游戏编程源代码

下面这个图显示了一个默认的纹理矩形如何映射到一个比它大的显示区域中,以及当纹理矩形设置的比原来的纹理要大的时候又是如何映射的。

用c  写的游戏_c  游戏编程源代码

示例代码在

这部分内容先写到这里,下半部分将介绍精灵的使用?。

js555888金沙老品牌的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/118656.html

(0)

相关推荐

  • datadog「建议收藏」这里写目录标题1.datadog1.1.datadog新特性1.datadog1.1.datadog新特性https://www.datadoghq.com/blog/dash-2021-new-feature-roundup/#infrastructure-and-network-monitoring

  • oracle 创建索引[通俗易懂]oracle创建索引

    2022年12月26日
  • pytorch tensor reshape_pytorch1.reshape(m,n)即:将矩阵变成mxn列矩阵1.1代码:importtorchx=torch.arange(12)#生成一维行向量,从1到11×1.1结果:tensor([0,1,2,3,4,5,6,7,8,9,10,11])1.2代码:x.reshape(3,4)#将矩阵x变成3行4列矩阵1.2结果:tensor([[0,1,2,3],[4,5,6,7]

    2022年12月13日
  • hps_fpga之间的地址映射学习「建议收藏」hps_fpga之间的地址映射学习hps如何对fpga外设进行操作?hardware:在qsys中将外设连接到axibridge上software:映射外设物理地址到到应用程序可以操作的虚拟地址,应用程序通过得到的虚拟地址入口控制外设。为什么要进行地址映射?内存映射就是讲内核空间的一部分区域映射到用户空间,用户对这段内存空间的修改可以反映到内核…

  • esp32开发环境搭建_esp32-wrover视频中介绍了esp8266开发环境建议使用linux环境,因为真的比其windows平台开发工具快很多,很多,很多!

  • 企业数据总线esb_总线服务质量要求esb应该有哪些服务esb实施方式为什么不采用传统架构而是采用esb总线方案esb应该有哪些服务?传输服务安全、可靠的数据传输永久性/非永久性同步/异步仲裁服务路由格式转换事件服务事件发现和发布publish/subscribeesb实施方式esb实施方式包括两种:1)esb调度使用opesb对接各系统数据库同步(opesb为webservice服务

  • python中workbook_python xlwt.workbook方法代碼示例本文整理匯總了python中xlwt.workbook方法的典型用法代碼示例。如果您正苦於以下問題:pythonxlwt.workbook方法的具體用法?pythonxlwt.workbook怎麽用?pythonxlwt.workbook使用的例子?那麽恭喜您,這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在模塊xlwt的用法示例。在下文中一共展示了xlwt.wor…

    2022年12月18日
  • 微服务之消息总线[通俗易懂]简介在上篇文章《微服务之配置中心》中写到,客户端可从服务端获取配置信息,当git仓库中的配置文件修改后,为了让客户端获取最新的配置信息,可以通过执行refresh操作进行手动刷新。但是这样有问题,当客户端很多时(随之系统的不断扩大),如果需要每个客户端都执行一遍,那就蛋疼了,显然这种方案就不适合了。springcloud作为微服务架构的一个综合金沙1005的解决方案,也提供了对应的金沙1005的解决方案springcloudbus,即消息总线。这里要理解一个概念,消息总线。简单理解就是一个消息中心,众多微服务实例可以连接

发表回复

您的电子邮箱地址不会被公开。

联系金沙1005

关注“java架构师必看”公众号

回复4,添加站长微信。

附言:ispacesoft.com网而来。

关注微信
网站地图