回 帖 发 新 帖 刷新版面

主题:关于SCREEN 12下的 GET的内容(没完成)

飞鸟提过,所以嘿嘿,闲着没事,粗浅研究一下.

get (x1,y1)-(x2,y2),cube

cube需要是一个定义好的数值型数组

(我不记得字节的什么样的概念了,应该是8位二进制位吧?在这里就这样认为先吧)
1字节=8位二进制

开头两个字节(16位)储存列数 (x2-x1+1)
随后两个字节(16位)储存行数 (y2-y1+1)

什么是先行后列先列后行的不说了,我都搞不清楚,太容易混淆了.

应该说是先行后列吧,

按横向的像素先保存,然后一横一横的顺序储存到数组去

像这样的顺序:
-----→
-----→
-----→
-----→
每8个像素存一个字(两个字节)<32位>
超出8个像素另起一个字,不足8个像素按一个字储存
32位储存8个像素,即一个像素分得4位,32位分成四组,每组8位

00000000 00000100 00000100 00000100  共32位四组二进制数

上面的这个数表示了8个像素,0代表的是空的,没有显示对象
其中第二三四组的第6位都是1,
表示的是第6个像素的颜色是0111
意思也就是把第6个像素的颜色值,分放到这个字的四个组的第6位位置上去了

唉,其实搞了半天,我还是没搞清楚,我把源程序发上来,做的是64位二进制,
你自己慢慢研究吧,我困了.

DECLARE FUNCTION at2$ (c&)
DIM CUBE&(3000)
SCREEN 12
'LINE (1, 1)-(1, 19), 3
LINE (1, 1)-(1, 19), 4
'LINE (5, 1)-(5, 19), 17
'LINE (8, 1)-(5, 19), 5
'LINE (9, 1)-(9, 19), 1

k$ = INPUT$(1)
GET (1, 1)-(9, 19), CUBE&

SCREEN 0
FOR i = 0 TO 38
  IF i MOD 2 = 1 THEN PRINT
  PRINT at2$(CUBE&(i));
NEXT

FUNCTION at2$ (c&)
a1$ = "1"
a0$ = "0"
IF c& < 0 THEN SWAP a1$, a0$
FOR i = 1 TO 32
   IF c& MOD 2 THEN j$ = a1$ + j$ ELSE j$ = a0$ + j$
   c& = c& \ 2
NEXT
at2$ = j$
END FUNCTION

回复列表 (共7个回复)

沙发

大致上明白了,和[url=http://www.programfan.com/club/showbbs.asp?id=71171]屏幕操作语句[/url] 中的PAINT语句在SCREEN 12模式下的 差不多

我也要努力 继续探索

板凳

谢谢,我打印下来了,
不过脑袋退化,想不了太多了

3 楼

'好      汉字提取程序中的汉字
DATA 2000,27E0,2040,F880,4880,48A0,57F0,5080,3080,2880,4A80,8100

DIM a(100) AS LONG
SCREEN 12
a(0) = &HC0010      '12行 16列
i = 1
DO
  READ font$
  font$ = RIGHT$("000" + font$, 4)
  fl$ = LEFT$(font$, 2)
  fh$ = RIGHT$(font$, 2)
  a(2 * i - 1) = VAL("&h" + fh$ + fl$ + fh$ + fl$)
  a(2 * i) = VAL("&h" + fh$ + fl$ + fh$ + fl$)
  i = i + 1
LOOP UNTIL i > 12
PUT (200, 200), a(0)

4 楼

果然好家伙
这也做得出来

不过还是劝飞鸟一句
别老是习惯用DATA
就算用,字符常量最好还是要加上双引号
因为FreeBasic有这个要求,能通用就通用一些总有好处的,不是吗?

而且,你还有一个字符与数值转换的过程
这些过程应该可以省略的,
我自己倒是习惯于利用文件储存数据,
因为没有数据类型的限制,
这两天倒是在考虑不知道好不好把数据资料追加到EXE文件末尾去
用EXE打开自己本身文件读数据不知道会不会有问题.

5 楼

“你还有一个字符与数值转换的过程
  这些过程应该可以省略的,      ”

不知 moz有何高招?

6 楼

DATA 2000,27E0,2040,F880,4880,48A0,57F0,5080,3080,2880,4A80,8100
'[color=FF00FF]在你获得这些数据的时候,直接就用十进制就好了,不要用十六进制了,虽然数值转十六进制比十进制从原理上说是比较快,但这个东西应该是可以忽略的.[/color]
  a(2 * i - 1) = VAL("&h" + fh$ + fl$ + fh$ + fl$)
[color=FF00FF]当你的DATA用了十进制数值,这些转换就要改用数学计算了[/color]

(如果当初获得DATA资料的时候把高低值先行分开当然最好)
  READ font&
  fl&=font&\256
  fh&=font& mod 256
  a(2 * i) =((fh&*256+fl&)*256+fh&)*256+fl&

不好意思看花眼了,原来把它们当作一步计算也可以的
好像听说过什么数学协处理器,是不是数学计算会更快一些?
  read font&
  a(2*i)=(font& mod 256)*16777216 + font&*256 + font&\256

7 楼

当初获得数据时是为 LINE语句 而写成十六进制的,而且用十六进制可以方便的转化为十进制(当然并不必要),更重要的是可以方便的转化为二进制 从而了解显示的字幕

另外就是用十进制表示 会有正数 负数,长度不一,不具可读性

坦白的说 我还是比较在意程序的可读性的,相比较而言十六进制的操作具有更好的可读性

我来回复

您尚未登录,请登录后再回复。点此登录或注册