二维游戏 编程(2)

图像的混合

  • 每种颜色都由红绿蓝3种基本色彩(三原色)组合而成;

  • 三原色中每一种颜色的亮度用一个8位的二进制数来表示;
  • 半透明图色彩=源图像色彩×(100% -透明度)+背景图像色彩×透明度;
  • Windows API函数:AlphaBlend

动画的实现

  • 所有人物通过一个行走的循环动画实现运动过程
  • 玩家有望能从人物的运动中获得更多的细节(信息)
  • 预设动画(如战斗情节)能提高游戏的画面质量
  • 所有动画是在3dStudio Max中手工设计的

精灵动画(1)

  • 基于精灵的人物表现
  • 鬼怪ghosts,精灵sprites,骑士knights
  • 精灵:前景是图像,背景是透明的
  • 精灵动画:将上一帧中精灵出现的地方用背景填充,并在新的指定地点绘制精灵

精灵动画(2)

  • 将掩码图和背景图案进行按位AND,使得原始图像的对应位置变空。
  • 将原始图像和上一步处理结果按位OR。
  • 这样,原始图像贴到背景上并遮盖背景,其余部分(掩码图中白色部分)没有贴到背景上

精灵动画(3)

英文为sprite animation

  1. 一幅背景图
  2. 一组模板图(mask)
  3. 人物的连续显示方式
  • 双缓冲机制
  • 不要在窗口中直接贴图,避免闪烁
  • 建立一个内存DC,然后把所有的贴图动作都在这个DC上进行,最后把结果显示到操作窗口中。

精灵动画(4)

  1. 对动画序列中的每一帧
  • Load背景图
  • 确定sprite绘画的位置
  • 将某一掩码图与背景图作AND运算
  • 将对应的人物图与背景图作OR运算
  • 更新sprite绘画的位置

碰撞检测

  1. 对运动物体的碰撞判断是许多游戏程序中不可或缺的要素

常见的碰撞检测方法

–区域检测

–碰撞点检测

–颜色检测:较为精确,

–相对耗时

2. 采用某种规则形状逼近物体

3.物体之间的碰撞检测转化为规则形状之间的检测

4.碰撞点检测

  • 本质是区域检测的一种
  • 一般在两个运动物体中的一个物体上设置碰撞点,在另一个物体上设置检测区域,运行时逐个判断碰撞点是否在检测区域中

颜色检测

  • 为树林做一张掩码图,将树林用黑色填充。要产生汽车驶入树林后面的效果,先在背景上贴上汽车的图像,然后在上面用镂空图技术画上树林。然后,判断汽车图像在树林图像上的相对位置,将汽车图像上的点和掩码图上相应位置的点做按位AND操作,检查结果中是否有黑色点(RGB值为0)存在。任何颜色的RGB值与黑色图形进行按位AND运算,将得到黑色。如果存在黑色点,表明有碰撞。

图像操作

  1. 全局操作
  • 对图像上的所有象素作同样的操作–如:傅立叶变换、直方图统计、块拷贝、灰度转换、缩放等

     2. 局部操作

  • 操作只与象素及其周围邻居的值有关
  • 如:滤波、边缘检测等

图像缩放

如何生成一个一半尺寸的图像?

  • 最简单的方法,隔行隔列取

直方图

  1. 表示图像中象素颜色值的分布
  2. 直方图上每一点
  • 横坐标:颜色(亮度)值
  • 纵坐标:图像中具有该颜色(亮度)值的象素的数目

亮度增强

亮度

  • 图像象素颜色平均值
  • 用直方图进行亮度增强
  • 将每一个象素灰度值加上一个常数
  • 得到的直方图是原始直方图向正轴方向的平移

提高对比度

  1. 每一象素点(x,y)上的图像对比度C定义为

  • I(x,y) -该点象素值
  • I -背景亮度平均值
  • Imax -图像灰度最大值
  • 0 –图像灰度最小值
  • 通过直方图提高对比度
  • 将原始图像直方图的取值范围[Xmin,Xmax]通过线性变换扩大至[0,Ymax]

淡入淡出

  1. 最简单的图像特效
  • 图像从一个黑色背景中出现

    2. 令透明度ALPHA从0变到1

  • ALPHA = 0图像为黑色
  • ALPHA = 1原始图像
  • Alpha改变的速度决定了图像的溶解速度

    3. 如果让ALPHA从1变到0,就得到淡出的效果

猜你喜欢

转载自blog.csdn.net/slave_of_life/article/details/130806847