Nirvana Studio » QBasic :: 分享知识,传播技术

Archive for the 'QBasic' Category

QBASIC中的活动图像

Posted by ShiningRay on 5th 四月 2006

翻译:ShiningRay   Wiki地址

QBASIC中的活动图像
Mallard著 

[ 注 - 这个指导主要针对EGA图形]
[ 需要VGA图形的信息, 给Mallard发电子邮件: mallard@gcomm.com]
这个指导预期是给精通标准QBasic命令的中级的程序员看的。
从http://www.wp.com/80948/qb取得这篇文章

--------------
[内容目录]
(1)  QBasic能做什么?
(2)  利用DATA来建立图形
(2)  GET和PUT图形
(4)  这是怎样工作的?

--------------
[QBasic能做什么?]

    QBasic不意味着一个好的环境可以适应图形的运用。相反,它意味着初学者
的语言应该是有条理的编程,使用基本的编程手法就够了。无论如何,只要使用
其中一些函数,当我们充分运用它的能力时,就可以达到比较理想的图形品质。
    在这里,最好的屏幕模式是SCREEN 7,320 X 200 16色的屏幕模式。也许这看
上去很简单,但这个模式很快而且有多个复合的“页面”可以用来来消除闪烁。
VGA 图形也能完成,但如果计算机不是很快,就会发生很多闪烁。
    当然,即使没有这篇指导,你也可以用 LINE,CIRCLE和PSET,但这个方法更
快、更好、更专业的。在这篇文章讲的所有方法都是我自创的 ,我一个人研究了
很多年了。

--------------
[使用DATA来建立图形]

    这个方法中使用的图形是我事先用自己写的图形编辑器专门为这篇指导制作
的,但最后还是转变为用DATA语句来读取颜色值。我将开始解释如何使用DATA语
句制作图形。
    首先,你得决定你的图形将有多大。例如,你选择了10x10像素大小的图片。
要做一个图像,先象这样做一个表格:

DATA 00,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,00
    然后,把QB编辑器改为“覆盖”模式(按键盘上的“INSERT”键),将黑色
的色值(现在图片中的颜色是00,是背景色)改成你想要的颜色。颜色表如下:

00-黑   01-深蓝 02-深绿 03-深青 04-深红 05-深紫 06-褐色 07-灰
08-深灰 09-淡蓝 10-淡绿 11-淡青 12-淡红 13-紫红 14-黄   15-亮白

   例如,使用这组DATA语句来建立一个火的图形:

DATA 00,00,00,04,00,00,04,00,00,00
DATA 00,00,04,04,00,04,04,04,00,00
DATA 00,00,04,04,04,04,04,04,00,00
DATA 00,04,04,12,12,04,04,04,00,00
DATA 00,04,04,12,12,04,04,00,00,00
DATA 00,04,04,12,12,04,04,00,00,00
DATA 00,04,12,12,12,04,04,04,00,00
DATA 00,04,12,14,14,12,04,04,00,00
DATA 04,04,12,14,14,14,12,04,00,00
DATA 04,04,12,14,14,14,12,04,00,00
    注意如果没有用下面要讲的方法将这些DATA语句来读入数组的话,接下去就什
么也干不了。在我们继续下一步之前,你试着自己做一些图形,也可以用来试试下
边的方法。

--------------
[GET和PUT图形]

    现在你应该有一组描述图形的DATA语句(他应该看起来像个某种东西)。接下
去干什么呢?用下面的方法来把他们画到屏幕上去,

然后将这幅图片读入数组。确保事先已经调用了SCREEN 7语句。

  xlength = 10                  '可以将10替换成你的图片的长
  ylength = 10                  '可以将10替换成你的图片的宽
  FOR y = 1 to ylength
        FOR x = 1 to xlength
                READ z
                PSET(x, y), z
        NEXT
  NEXT
    屏幕会告诉你你的图像怎样。如果你对他已经满意了,进入下一步。如果不满
意,修改并重新调入图片。
    好的,现在你已经画了一张好看的图片,你得把他放入内存中去,这样程序就
用不着每次都重画了,可以节省很多计算机资源。要这样做,首先用DIM建立一个数
组,然后用GET将这个图形到那个数组中去。像这样:

DIM graphicname(xlength * ylength)
               '给你的图形起一个名字,替换graphicname
GET (0,0)-(xlength, ylength), graphicname
CLS
    OK!你已经将你的图片存入了计算机的内存中了。如果还要看看这个图像,要用
PUT语句,像这样:
PUT (x, y), graphicname    '可以将X和Y替换成你需要的显示图像的位置,
    这部分就是这些了。现在你可以做一些简单的图形了。要知道如何建立一个平滑
的动画的方法的话,继续读下一部分。

--------------
[这是怎样工作的?]

    现在你知道了怎样使用DATA语句建立图形数据、如何读取数据和把他们画到屏幕
上去、如何GET和PUT图形。然而,要建立运动的图像是有一点复杂的,虽然不太难。
    你要做的就是设置你要用的屏幕页号。当你用SCREEN语句时,你可以将图形建立
在一个不同的“页”上,然后将他们复制到屏幕上去,然后用CLS除去所有的图像。
    第一步完了,你的SCREEN 7语句应该变成SCREEN 7,0,1,0.这意味着你的图像都将
绘制在PAGE 1上,而PAGE 0就代表了用户可以看得见的屏幕。当你完成了绘图工作后,
所有的图形还是不会出现在屏幕上,除非用PCOPY 1,0语句才可以显示出来。

    这有一个例子,他可以移动你前面建立的图形横穿屏幕。

SCREEN 7,0,1,0                 '将PAGE 1作为操作页,PAGE 0作为可视页。
....                           '插入建立图形的代码,当然是用了上边方法了。
CLS
WHILE x < 270
PUT (x, 100), graphicname      '- replace graphicname w/ the name of
PCOPY 1,0                      'your graphic
CLS
x = x + 1
WEND
--------------
   上面的代码可以任你修改。如果你需要更多的关于这篇文章里讲述的图形使用技巧
的帮助,请E-MAIL Mallard--mallard@gcomm.com或者访问QBasic主页
http://www.wp.com/80948/qb/
[文档结束]

-------------

Posted in QBasic | No Comments »

在QBASIC中使用BSAVE和BLOAD

Posted by ShiningRay on 5th 四月 2006

翻译:ShiningRay

在QBASIC中使用BSAVE和BLOAD
a tutorial by Mallard
Revision 2 - 7/5/1997

******CODE FROM THIS TUTORIAL IS IN GRAPHICS2.ZIP******
[注意 - 这篇指导假设你已经读过我的第一篇图像指导]
taken from The QBasic Page at http://qbasic.com

------------
[内容目录]
(1) BSAVE和BLOAD是什么?
(2) 在EGA/VGA中制作很棒的图像

------------
[BSAVE和BLOAD是什么?]

    BSAVE和BLOAD是QBasic语言中的两个内部函数,可以用来保存用我在上一讲中
所提到的方法所建立的图形到一个文件中。然后这个文件可以被一个程序迅速调用,
减少了间隔的时间。
    这两个命令吧内存的一部分包存为一个文件 - 他们不仅仅可以用来保存图形。
这篇指导主要针对图形。要将BSAVE和BLOAD指向开始存储的正确的内存地址,你必
需使用DEF SEG语句,像这种形式:

DEF SEG = VARSEG(arrayname(0))

    arrayname是你用GET函数存储的图形数组的名称。当你完成了BSAVE或BLOAD后,
再用DEF SEG命令来将内存指回他原来应该指的地方。
BSAVE是你将在这篇指导中学到的下个指令。它的基本句法是:

BSAVE "graphic.ext", offset, length

    "graphic.ext"是你向储存的图形文件的名称。你可以用任何文件名和扩展名,
为了清楚些,我在我的程序中使用了.GFX的扩展名。
    length是你声明的用GET命令储存图形的数组的大小。确定你得到了准确的数字。
实际的文件会比你在这里指定的大小要大七个字节。
    offset是开始储存的偏移地址。根据这篇指导的目的,offset会一直是零。你
可以巧妙的利用这些命令来在一个文件中储存更多的图形,不过我大概会在另一篇
指导中解释这个。
    现在,继续BLOAD命令。假设你已经建立并用BSAVE保存了一个图形,那么现在
是用BLOAD调入图形的时候了。这实在是简单,真的:

DIM arrayname(length)

SCREEN screenmode

DEF SEG = VARSEG(arrayname(0))
BLOAD "graphic.ext", 0
DEF SEG

PUT (0, 0), arrayname

    当然,你需要粘贴你的arrayname和length到这个程序中,还有这个文件的名称。
我已经通过一个例子来联系这个指导,BSAVE.BAS,在这里面我成功的用BSAVE和
BLOAD储存和调用一个行星图片。在我们继续下一部分之前,看一下他并做些试验。
    确定使用了相同屏幕模式当你用BSAVE或BLOAD操作时。例如,如果你用BSAVE在
模式7中储存的一个图形,你必须在模式7中用BLOAD调入图形。

-----------
[在EGA/VGA中制作很棒的图像]

    你在EGA模式中制作好的图形的最好想法只是用我上次讲的技巧练习一下而已。
VGA模式的图形可以用不同的方法来制作,可以得到更好的结果。
    对于VGA图形,最好在绘图程序中建立子图形(例如,CorelDRAW!或Autodesk
Animator)并且把他们存为.GIF文件。调用.GIF的代码已经附带在这个指导中,用
它在QBasic来调用.GIF文件,然后用GET调入一个数组并用BSAVE存为QBasic的格式。
一个例子已经附带在这个指导中了。

-----------
    上面的代码可以任你修改。如果你需要更多的关于这篇文章里讲述的图形使用
技巧的帮助,请随意E-MAIL Mallard--mallard@gcomm.com或者访问QBasic主页
http://www.wp.com/80948/qb/
[文档结束] 

Posted in QBasic | No Comments »