详解透明贴图和三元光栅操作

透明贴图,是指贴图时某一部分是完全透明的。

本文介绍多种透明贴图的方案,包括:

  1. 指定透明色贴图(基于 Windows API 函数 TransparentBlt)
  2. 指定透明色贴图(基于直接操作显示缓冲区)
  3. 使用三元光栅操作实现透明贴图
  4. 根据 png 的 alpha 信息实现半透明贴图(基于 Windows API 函数 AlphaBlend)
  5. 根据 png 的 alpha 信息实现半透明贴图(基于直接操作显示缓冲区)

各种方法各有利弊,大家可以根据自己的需求选择。

1. 指定透明色贴图(基于 Windows API 函数 TransparentBlt)

这是最简单的透明贴图方法。

该方法要求图片素材的透明部分为纯色,因此建议使用 gif 或 png 格式的图片素材。如果使用 jpg 格式的图片素材,那么由于 jpg 的有损压缩,会造成边缘颜色有微小差异,与指定的透明色并不完全相

...

制作图片素材的必备知识

平时常用的图片格式有 bmp、jpg(jpeg)、gif、png 等。其中,bmp 是无损压缩,文件体积比较大,通常都会用其他格式来代替 bmp。所以本文着重讲 jpg、gif、png 三种格式。

首先必须要提到的是:修改图片扩展名并不会修改图片格式。图片格式,是图片各像素点的组织方式,不同的格式有不同的文件头和压缩算法等。而扩展名,仅仅是一个格式的标识,方便人们辨识格式。只修改扩展名,会造成图片文件的标识与内容不符,影响图片加载。因此,必须通过绘图软件将图片保存为相应格式。

图片格式的区别

jpg 适合保存照片这类颜色丰富、图案复杂的图像,使用有损压缩。尤其在保存简单颜色的图像时,有损压缩会使颜色边缘出现“不干净”的问题。

gif 适合保存颜色简单、内容简单的图像,使用无损

...

正确实现“按任意键继续”功能

在大家写程序的时候,经常会遇到“按任意键继续”这样的功能。网上能找到的方法主要有两种:
1. 使用 _getch() 语句
2. 使用 system("pause") 语句

现在挨个说说。

_getch()

_getch() 功能是从控制台输入一个字符(控制台不显示该输入),是 conio.h 里面声明的一个函数。
所以 _getch() 很好的实现了“按任意键继续”的功能。

system("pause")

system 的功能是通过控制台执行一个命令,是 stdlib.h 里面声明的一个函数。
该函数需要一个字符串指针参数表示命令。这里,"pause" 就是 system 函数将要执行的命令。

pause 命令的功能,可以在控制台 cmd.exe 下输入 pause /? 查看,可以看到,pause 的功能是:暂停并显示信息“Press any key to continue . . .&

...

仍在使用 VC6 的同学注意了!

前言

VC6,全称 Visual C++ 6.0,诞生于 1998 年,恐怕是目前唯一一款寿命超过 20 岁还仍在大量使用的软件。
因为 VC6 真的太好用了!

但 20 多年造成的科技差距是你必须要知道的。如果你还在用 VC6,请务必读一下本文。

VC6 的问题

1. 对新系统支持差,对调试支持不好

新买的电脑都是 Windows 10 操作系统,VC6 在该系统下,勉强可以通过管理员权限进行调试。但是在调试的时候,如果中断调试,将会造成锁定 exe 无法再次编译的问题,必须重启 VC6 才可以解决。

学习编程时,调试是非常重要的步骤,通常调试的时间会超过代码编写时间的两倍以上,可见调试有多么重要。而“中断调试、再次编译”是非常常见的操作步骤,如果对这个步骤的支持有问题,那会直接影响编程的学习。“不会调试,等于不会编程”,这句话一点也不夸张。

如果用 VC6 是因为电脑配置比较低,那么推荐改用 VC2008 Ex

...

使用程序代码输出常见的字体图标(标志图片)

前言

程序中经常会使用一些常规的标志图片,例如,音量开关、各种方向箭头、扑克牌花色、邮件、电话、磁盘、笑脸/哭脸、五星等等。通常做法是,制作好图片,然后在特定的位置将图片显示出来。本文讲述如何通过输出文字的形式将这些常规的标志图片进行输出。

这种以文字方式表示的表示图片,一般称作:字体图标。

使用方法

简单来说:Windows 内置了许多字体图标的字库,只需要设置为相应字体,然后再输出相应字符即可。不过多讲解,看代码吧,以下代码会画出一个电话机:

#include <graphics.h>
#include <conio.h>

int main()
{
	initgraph(640, 480);

	settextstyle(60, 0, L"Wingdings");
	wchar_t c = 0x28;		// 0x28 是电话机在 Wingdings 字体中的对应编码
	outtextxy(0, 0, c);

	_
...

编程一对一授课(XiongFJ 版)

我就是百度贴吧的 fammy043,就是写坦克大战和快打旋风的内个~

欢迎亲们阅读 ~ 写在前言:

编程技术现对于我们来说都已经不陌生。

随着社会发展,计算机教育的普及,许多学生都会较早接触到计算机,计算机编程教育也越来越早龄化。

课堂老师所教的主要是基础理论知识,与实际应用还有不小差距。

所以在这里主要教的是动手写程序,在掌握基本语法逻辑结构之后,通过不停的敲打代码,斟酌逻辑,积累自己的编程经验、技巧。

最后尽量能做到:我想即我能做,则算入门了吧。

楼主一些作品:https://www.codebus.cn/xiongfj/

该授课的极限是亲们能独立写出类似上述楼主的作品 ~

...

轻松学编程,快乐做游戏

零基础C语言入门课程

前言

兴趣是学习的动力!

本课程是帮助想系统学习编程的同学,少走弯路快速入门,掌握基础的编程语言-----C语言。

我们所采用的是和学校完全不同是教学模式,一对一的针对性教学。学习时间更自由,时间更长,内容讲解更详细。

俗话说,师傅领进门,修行在个人。好的老师虽然是很重要的,但是更重要的是自己的努力!这里只接受那些真正想学的人,知识是付费的,希望你能感到物有所值!

老师:醋酸基。

课程安排

第一部分 基础知识   C语言零基础入门课程

一课时:

1,  c语言的开发环境。

2,  c语言的特点和基本结构。

3,  一个简单的c语言程序。

二课时:

1.       基础算法和数据结构

2. 

...

编程私教:实用派的 C/C++ 语言编程教育(我是慢羊羊)

前言

所谓教育,就是教和育。

众所周知,传统教学,是有教无育。在我这里,我也做不到 24 小时盯着学生,所以我也不可能培育好一个人的品性。我能做到的,仅仅是针对不良习惯的劝诫。如果无效,我会停止对该学生的教学。

我的一些示例作品:https://www.codebus.cn/yangw

我的一些文章:https://www.codeabc.cn/yangw

这是时代,由于编程教育的特殊性,导致老师的水平参差不齐,教 Java 的老师都未必能正确念出来 Java 这个单词。希望各位同学能找到自己心仪的老师。

免费辅导内容

我会不定时的在以下几个 QQ 群里游荡:

  • 1059085 (C语言革命0)
  • 8086730 (C语言革命1)
  • 286

...

打开帮助文件 EasyX_Help.chm 后,内容为空白的解决办法

有些同学遇到这样的问题,打开 EasyX 的帮助文档 EasyX_Help.chm 之后,发现所有的内容点击后都是空白的,就像下面这样:

这是由于 Windows 的安全机制造成的,当你从网上直接下载一个 chm 文件,或者用 Windows 资源管理器从压缩包里面解压出来 chm 文件,都会被 Windows 认为目标文件不够安全,然后默认被锁定。

所以,只需要简单解锁就可以了。

这样做:右击 EasyX_Help.chm 文件,在属性页中,会看到底部的“安全”一项,“解除锁定”没有勾选,如下图:

只需要简单的勾选“解除锁定”,然后点击确定,就可以正常浏览 chm 文件了。

为什么屏幕分辨率是 640x480?

常见的屏幕分辨率很奇怪,为什么总用一些不零不整的数字?比如以前最常见的分辨率是 640x480,当初为什么这么设计?

因为这个分辨率运算速度比较快,人也相对比较好记。

大家知道,屏幕上的每一个点,都会对应内存中的一个位置。比如 640x480@256色,表示每个点占用一个字节,整个屏幕有 640x480=300k 个点,占用 300KB 内存。屏幕的每一个像素的保存,在内存中是线性存储结构。在屏幕上的坐标 (x, y) 画一个点,就相当于在对应显存偏移 y * 640 + x 的位置赋值。

PS:在这篇文章中有一段代码,可以实践一下通过内存赋值来直接画点:http://www.easyx.cn/skills/View.aspx?id=55

每绘制一个点,都需要执行一次乘法和一次加法运算。所有的绘图操作都需要调用画点函数,因此提高画点的效率,将会提升所有绘图操作的速度。

现在我们将计算内存偏移量的算法修改一下:

d = y * 640 + x
...