主题:[求助]关于图象的
angwuy
[专家分:2280] 发布于 2006-11-02 12:09:00
我在编图象程序时每过一段时间就要刷屏,刷屏时屏幕闪的很厉害,这个有什么解决办法?
回复列表 (共32个回复)
11 楼
maxumi [专家分:2200] 发布于 2006-11-03 10:49:00
给你两个建议:
1. poi文件不要一个一个读......
2. 把那乌龟改成平滑走路吧......- -|||||
12 楼
angwuy [专家分:2280] 发布于 2006-11-03 17:15:00
CMP.TPU
MOUSE.TPU
SHOW256.TPU
SHOW320.TPU
SVGA16.TPU
SVGA256.TPU
TXT.TPU
VGA256.TPU
的说明文档是哪个文件?我找不到
13 楼
angwuy [专家分:2280] 发布于 2006-11-07 10:07:00
能不能帮忙把显示256bmp图片的那个程序做成单元?
14 楼
maxumi [专家分:2200] 发布于 2006-11-07 10:49:00
我有这种东西, 发给你了
bmptocel.pas的用法: 运行, 输入BMP文件名(BMP必须为24位真彩色, 如果不是, 请用"画图"将其保存为24位真彩色文件), 然后就会生成一个.cel文件.(图片最大320x200, 长宽都不能超, 转换时间可能有点长)
loalib.pas是一个图形单元(我写游戏都用它), 请将你的程序作如下修改:
1. 扔掉那个垃圾graph单元, 换成loalib单元.
2. 在程序开始处加2句:
set13h; {这是初始化图形模式}
setpal; {这是初始化调色板}
3. 在程序末尾处加1句:
settext; {这是初始化文本模式}
4. 定义这样一个类型:
type
bmp:array[0..cc]of word;{这里的cc按这样计算: cc=(图片高度*图片宽度)/2+1, 四舍五入}
pbmp:^bmp;
5. 定义一个存储图象的指针:
var
ss:pbmp;
6. 在程序开始处再加1句:
new(ss); {为图象申请存储空间}
7. 读入图片:
loadcel('abc', ss) {将abc.cel读入ss中, abc.cel文件由bmptocel.pas转换而来}
8. 显示图象的方法:
putimg(ss, 50, 100, 0); {将图片ss显示于(50, 100), 后面那个0你可以看看代码有什么作用}
9. 在程序末尾处再加1句:
dispose(ss); {释放图象的存储空间}
这样就OK了.
这个单元还有其他东西:
pset过程:画点
point函数:取屏幕上某点的颜色值.
getimg过程:将屏幕上某块图象提取出来
line过程:画线
box过程:画矩形(可填充或不填充)
cls过程:清屏(图形模式)
transput过程:半透明显示, 那个trans参数是透明度
15 楼
angwuy [专家分:2280] 发布于 2006-11-07 13:29:00
谢谢,但如果用loalib单元,怎么才能输出一段英文?
16 楼
maxumi [专家分:2200] 发布于 2006-11-07 13:53:00
我回去研究一下再发给你
17 楼
maxumi [专家分:2200] 发布于 2006-11-07 15:03:00
OK.
Loalib v1.03版正式更新, 已发到你的油箱.
请将hzk16.fnt和asc16.fnt放到Pascal所在文件夹下.
新增过程:
showstr(x, y, color, st);
x, y为坐标(注意: 是图形模式的坐标!)
color是颜色
st是要显示的字符串.
此过程[color=red]支持中文[/color].
PS:你的那个chinese单元并不支持中文, 你的机器之所以能显示中文是因为你的机器上有汉字系统......
18 楼
maxumi [专家分:2200] 发布于 2006-11-07 16:03:00
顺便讲一下透明显示技术
比如你做的那个超级马里奥, 很显然, 如果你给屏幕加个背景, 那么马里奥的周围就会有一块黑色区域把背景覆盖掉, 这时就需要透明显示技术.
首先准备2个BMP文件, 像这样:
s1.bmp: 这个图象的背景为纯黑色
[IMG]http://i87.photobucket.com/albums/k144/maxumi/s1.jpg[/IMG]
s1x.bmp 这个图象的内容部分为纯黑色, 背景为纯白色
[IMG]http://i87.photobucket.com/albums/k144/maxumi/s1x.jpg[/IMG]
我们这样做(假设图片都已经准备好, 存放在s1和s1x两个指针变量中):
putimg(s1x, 0, 0, imgand); {imgand在loalib中已经定义好}
这个指令的效果是: 将s1x各点与当前背景各点做AND运算并显示在屏幕上.
s1x的内容部分为纯黑, 纯黑的颜色代码为0, 0=00000000(2进制), 0 and 任何数 = 0, 所以屏幕的对应部分就变黑了.
s1x的背景部分为纯白, 纯白的颜色代码为255, 255=11111111(2进制), 1 and 任何数 都不变, 所以屏幕的对应部分不变.
总之, 这个指令的效果是"在屏幕上挖个黑洞".
然后:
putimg(s1, 0, 0, imgor); {imgor在loalib中已经定义好}
这个指令的效果是: 将s1各点与当前背景各点做OR运算并显示在屏幕上.
s1的背景部分为纯黑, 纯黑的颜色代码为0, 0=00000000(2进制), 0 OR 任何数 都不变, 所以屏幕的对应部分不变.
至于s1x的内容部分, 由于背景为纯黑, 纯黑的颜色代码为0, 0 OR 任何数 都不变, 所以屏幕的对应部分就显示出内容了.
总之, 这个指令的效果是"在屏幕上显示马里奥".
透明显示技术其实就是这样
以上
19 楼
angwuy [专家分:2280] 发布于 2006-11-07 16:07:00
太感谢了
20 楼
maxumi [专家分:2200] 发布于 2006-11-07 16:12:00
不用客气, 如果你做了游戏, 注明你用了我的loalib就好了......XD
我来回复