Programming 版 (精华区)
发信人: lansh (沧海一粟), 信区: Programming
标 题: Allegro 游戏程序库 (位图对象)
发信站: 哈工大紫丁香 (2002年09月11日20:04:20 星期三), 站内信件
发信人: cloudwu (云风), 信区: GAME_Designer
标 题: Allegro 游戏程序库 (位图对象)
发信站: BBS 水木清华站 (Sun May 17 09:37:03 1998)
______ ___ ___
/\ _ \ /\_ \ /\_ \
\ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___
\ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\
\ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \
\ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
\/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
/\____/
\_/__/ 3.0 版
一个游戏程序库
By Shawn Hargreaves, 1994/97
云风 译 5/16/1998
http://www.nease.net/~cloudwu
E-mail: cloudwu@nease.net
========================================
============ 位图对象 ============
========================================
一旦你选择了一个图形模式,你就可以经过位图 'screen' 来画些东西显示出来.
所有的 Allegro 图形例程都是向 BITBMP 结构来作画的,
这个结构是一块包含了一个矩形图片的内存, 以
打包字节分配形式 ( 每点 8 位) 储存. 你在系统内存中可以创建和使用位图,
也可以直接写向特别的 'screen' 位图, 这个位图
代表了你的图形卡上的显存.
举个例子, 要向屏幕画一个点,你可以这样写:
putpixel(screen, x, y, color);
或者使用一个双缓冲实现程序:
BITMAP *bmp = create_bitmap(320, 200); // 在系统内存中创建一个位图
clear(bmp); // 将内存位图清空
putpixel(bmp, x, y, color); // 画在内存位图上
blit(bmp, screen, 0, 0, 0, 0, 320, 200); // 将其复制到屏幕上
见下面来了解如何在一个位图中直接控制图象所在的内存.
Allegro 支持几种不同类型的位图:
- 屏幕位图, 代表了硬件显存
最终你必须画在它上面来使得你的图片可以显示.
- 内存位图, 它存在于系统内存中,可以用来
储存图象或者作为双缓冲系统的临时作画的位置.
这些能够由调用 create_bitmap(), load_pcx(), 或是从
grabber 数据文件里载入而得到.
- 子位图. 它共享父位图的存储器空间 (父位图可以是
屏幕, 一个内存位图, 或是另一个子位图), 因此在它们上面作画
也将同时改变它们的父位图. 它们是任何大小并可以定义在父位图上的任何位置,
也可以有它们自己的
剪裁矩形, 因此这是将一个位图分成几个小部分的很有用的途径,
比如, 将一个大的虚拟屏幕分割成两个部分来
实现页切换 (见 examples/ex9.c).
extern BITMAP *screen;
一个位图的全局指针, 大小为 VIRTUAL_W x VIRTUAL_H. 这个由
set_gfx_mode() 创建, 映射到硬件显存上. 只有一部分
大小为 SCREEN_W x SCREEN_H 的位图被显示.
通常这个部分在大的虚拟屏幕的左上角, 因此你如果没有兴趣去做
硬件滚屏或页切换时可以忽略虚拟屏幕的不可显部分.
要移动显示窗口到
屏幕位图的其它部分, 调用 scroll_screen().
初试化时剪裁矩形将限制在物理屏幕的大小,
因此如果你想在大的虚拟屏幕上超出这个矩形的部分作画,
则需要调整剪裁空间.
BITMAP *create_bitmap(int width, int height);
创建一个大小为 width x height 的内存位图, 并且返回指向它的指针.
这个位图将打开剪裁功能, 剪裁矩形
被设置为整个位图. 图象内存不会为你清空,
因此上面可能有写垃圾: 你必须在使用前清空位图.
这个例程总是使用全局的点格式, 由
调用 set_color_depth() 来指定.
BITMAP *create_bitmap_ex(int color_depth, int width, int height);
以指定的颜色深度(8, 15, 16, 24 或 32位每点)来创建位图.
BITMAP *create_sub_bitmap(BITMAP *parent, int x, y, width, height);
创建一个子位图. 即,让一个位图共享另一个
已经存在的位图的空间, 但是可能有不同的大小和剪裁设定.
当在 mode-X 屏幕上创建子位图时, x 坐标必须是
4 的倍数. 子位图的宽度和高度可以扩展到
父位图的右边界和下边界以外 (它们将被剪裁掉),
但是起点必须在父位图的区域.
void destroy_bitmap(BITMAP *bitmap);
当你使用完一个内存位图或子位图后销毁它.
int bitmap_color_depth(BITMAP *bmp);
返回指定位图的颜色深度 (8, 15, 16, 24, 或 32).
int bitmap_mask_color(BITMAP *bmp);
返回指定位图的掩色 (这个色彩值将在画精灵时被忽略).
在 256 色位图里是零,
在真彩位图里是亮粉红 (bright pink).
int is_same_bitmap(BITMAP *bmp1, BITMAP *bmp2);
如果两个位图描述了同样一个绘图表面将返回 TRUE, 即,
指针相等, 或一个是另一个的子位图, 或 它们是
同一位图的子位图.
int is_linear_bitmap(BITMAP *bmp);
当位图是线形位图时返回 TRUE. 即,是一内存位图, 或 13h 模式的屏幕,
或 SVGA 屏幕. 线形位图可以被 _putpixel(),
_getpixel(), bmp_write_line(), 和 bmp_read_line() 函数使用.
int is_planar_bitmap(BITMAP *bmp);
当位图是分屏 (planar) (mode-X 或 Xtended 模式) 屏幕位图时返回 TRUE.
int is_memory_bitmap(BITMAP *bmp);
当位图是内存位图时返回 TRUE, 即, 它是由调用
create_bitmap() 创建或从 grabber 数据文件或 PCX 文件里载入的.
内存位图可以经位图结构中的行指针来直接控制,
比如: bmp->line[y][x] = color.
int is_screen_bitmap(BITMAP *bmp);
如果位图是屏幕位图或是屏幕位图的子位图时返回 TRUE.
int is_sub_bitmap(BITMAP *bmp);
如果位图是子位图则返回 TRUE.
void set_clip(BITMAP *bitmap, int x1, int y1, int x2, int y2);
每个位图有一个伴随的剪裁矩形, 它是一个
能够将图画上去的区域. 在这块空间以外, 什么也画不上去.
参数为剪裁矩形的两个角的坐标:
这些点被包括在内. 比如 set_clip(bitmap, 16, 16, 32, 32) 将
允许画到 (16, 16) 和 (32, 32) 上, 但是不能画到 (15, 15) 和 (33, 33).
如果 x1, y1, x2, 和 y2 都为零, 剪裁就关掉了,
这可以轻微的提高一些绘图操作 (通常只有微不足道的
区别, 然而有点帮助) 但是后果是当你试图
向位图以外的空间作画时, 你的程序会狠惨的死掉.
--
http://www.nease.net/~cloudwu
http://computer.igd.edu.cn/~cloud
E-mail: cloudwu@163.net
--
人生得意需尽欢,莫使金樽空对月。
天生我才必有用,千金散尽还复来。
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: hitsat.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.474毫秒