導航:首頁 > 源碼編譯 > 源碼編輯器游戲教程新手簡單

源碼編輯器游戲教程新手簡單

發布時間:2022-04-23 02:07:24

源碼編輯器怎麼跳躍

步驟如下

1、在源碼編輯器中選中一個角色。
2、然後在積木腳本中載入「當開始被點擊」的事件。
3、然後載入重復執行的動作。
4、接著載入「下一個動作」的積木塊。
5、載入「等待一秒」的積木塊,同時也可以修改等待的秒數。
6、最後點擊開始運行程序,即可看到角色跳躍。
代碼編輯器一般是帶有語法高亮,關鍵字一看就知道,還有括弧匹配也能通過不同的顏色看出來,對編寫程序很有幫助。有的代碼編輯器還可以集成編譯環境。編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。

❷ 源碼編程器怎麼做賽車游戲

用戶在線3d賽車游戲源碼(基於ogre引擎),支持多種賽車模式,支持單人模式,支持多用戶,支持多賽道,有賽道編輯器,linux系統下打開,直接上圖

❸ 源碼編輯器怎麼做貪吃蛇

首先看你要用的平台。可以用mfc界面,也可以C++黑框控制台。下面針對黑框,我說說思路。首先,黑框可以控制背景顏色,可以將蛇的顏色和背景色區分開,然後每次while循環就更新一下蛇所在的位置,這樣每次更細在視覺上看起來像蛇在動。

❹ 源碼編輯器怎麼旋轉繪制圖形

首先選中畫筆,添加點擊事件,然後通過旋轉積木塊進行設置即可。
打開源碼編輯器,選中畫筆這個角色。從事件盒子中添加當角色被點擊的事件。從動作盒子中添加旋轉積木塊,設置旋轉的度數。
編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高級語言作為輸入,輸出也是高級語言的編譯器。例如: 自動並行化編譯器經常採用一種高級語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。

❺ 新手如何學習編程

熟悉以下關鍵東西,可以邊學邊做,定期訓練,經常思考,長期積累:

1、語法。

2、基礎理論(數學、數據結構、演算法等)。

3、設計方法(編程原則、設計模式、框架設計等)。

4、庫(核心、基礎、UI、擴展、游戲引擎等)。

5、計算機相關(操作系統、網路、圖形學等)。

6、領域知識(游戲設計、網站設計等)。

7、開發工具(編輯器、IDE、自動部署等)。

8、項目管理(進度管理、分工協作、Bug管理、版本控制等)。

最普遍也是最重要的能力:創造力。努力分析並理解好做什麼以及怎麼做。要知道上面那些東西一開始都是不存在的。

具體方法包括:

1、快速閱讀入門教程和書籍,適合學習語言和基礎庫。比如我學Java讀的《Java編程思想》,練習題做過一點,然後學ActionScript就沒讀過書,只讀過Adobe官方文檔《ActionScript 3.0編程》。

2、閱讀庫的文檔、實例、源碼。比如Flash、Flex開發,熟悉官方API很重要,很多細節要具體使用時才注意到,這時候最好做個筆記,雖然我從沒看過我的筆記。

3、做一個自己感興趣或熟悉的小項目,比如我就以黑白棋游戲作為多個語言的試水項目,一樣的邏輯,便於把關注點放在語言特點上。

4、自己動手豐衣足食。廚師有菜譜,程序員可沒菜譜。比如我做游戲,最關鍵的游戲編程知識全部是動手學出來的,很少有專門針對某個業務領域(如游戲)的編程書籍,要麼是入門書,要麼是模式書(如演算法)、理論書(圖形學),很少有書籍教你如何開發一個45度角地圖系統加編輯器的,全靠自己思考,以及看前人的代碼,需要時找些網路資料。關鍵是,可以培養最重要的創造力。

對於演算法和設計模式,可以研讀下,但是關鍵還是靠平時如何使用了。新手勉強不來的。

項目管理方面的,就得靠工作經驗了,多思考多提意見不要只走流程。

❻ 源碼編輯器怎麼讓人物跳起來

可通過六個步驟完成。
1、在源碼編輯器中選中一個角色。2、然後在積木腳本中載入「當開始被點擊」的事件。3、然後載入重復執行的動作。4、接著載入「下一個動作」的積木塊。5、載入「等待一秒」的積木塊,同時也可以修改等待的秒數。6、最後點擊開始運行程序,即可看到角色跳躍。

❼ 怎麼在源碼編輯器里,放置兩個人物讓一個人追一個人跑

首先我們會演示如何一步步寫游戲的主體部分,一開始我們會只有一個猜測的單詞,而且是固定的。
我選了BOTTLE,因為我們要測試對於單詞中有大於等於兩個相同字母的情況是否處理正確了,然後我們會演示如何加入詞庫的處理程序,以便每一輪游戲可以從詞庫中隨機抽取一個單詞,牢記,重要的不是結果,而是我們思考的方法。
我們的main函數將控制游戲的大部分運作,並且調用我們將要寫的不少函數。

❽ 源碼編輯器怎麼做游戲

摘要 https://jingyan..com/article/3065b3b63dfd05fecff8a4d2.html

❾ 怎麼製作游戲修改器,要簡單化

游戲修改器製作-黑客入門

工具:SoftICE、金山游俠2002、VC++7.0、PE查看器、SPY++
測試平台:Window2000 Professional SP2

首先我介紹一下將會用到的工具:
1、 SoftICE(不用多說了吧,我想你應該會用)
2、 金山游俠2002(這個你也應該會用)
3、 VC++7.0(不要求你一定會用,但至少應該會一種編程工具)
4、 PE查看器(你可以隨意找一個,沒有也沒關系,我會教你用SoftICE查看)
5、 SPY++(VC里的一個查看程序信息的工具,你可以和別的,比如Delphi和C++Builder的WinSight32)

然後就是你應該會的知識:
1、 匯編基礎
2、 一些編程基礎,至少應該看懂我介紹的幾個API函數
3、 PE文件結構的基礎,不會也沒關系,我會解釋給你

以上幾點你都具備了的話我們就可以開始了。

我來介紹一下我要教給你的東西。想必大家都玩過PC游吧,那麼也一定用過一些專用的游戲修改器吧,比如暗黑,紅警,大富翁這些經典的游戲都有它們專用的修改器,注意,我說的不是FPE之類的通用修改工具。
你試沒試過用金山游俠修改紅警二的金錢?如果有的話你應該知道每玩一次就要改一次,因為這個游戲是動態分配內存的,每次重新開始都會改變。所以你會選擇到網上去下載一個專用的修改器,那麼你有沒有想過自己做一上呢?想過?那你為什麼不做?什麼不會?那就好辦了,看了這篇教程你就會了:D費話少說,我來講一下原理。
有一些經常修改游的朋友一定會知道,不論游戲中「物品」的內存地址是否是動態的,物品與物品之間相隔的距離都是不變的,我拿「楚留香新傳」為例,我先用金山游俠查找內力值的內存地址,找到的結果是:79F695C,再查找物品「金創葯」的地址是:328D1DC,現在我用79F695C減去328D1DC,得到:4769780,這個數就是內力值與金創葯的偏移值,沒看懂?接著看呀,我還沒說完呢,現在重新再運行游戲,查找內力值的地址,得到:798695C再查找金創葯得到的地址是:321D1DC,兩個值的內存地址都改變了,但是用你內力值的地址減去金創葯的地址得到的結果是什麼?沒錯,還是4769780,也就是說,無論這兩個值的內存地址變成多少,它們之間的距離是永遠不變的,不光是這個游戲,一般的游戲都是,至少我沒見過不是的:D
上面講的東西總結出一個結論,那就是我們只要得到這兩個地址中的任何一個,就可以得到另外一個,只要你知道它們之間的偏移量是多少。
我們第一步要做的就是得到這個地址,但是內存中的地址是動態改變的,得到也沒有用,這里我就教你把它變成靜態的,叫它永遠都不變!我繼續拿「楚留香新傳」為例,如果你有這個游的話就跟我一起做,沒有的也沒關系,只要看懂這幾個步驟就行了。開工!
首先進入游戲,查找內值的地址,得到的是:798695C(不知道為什麼這上游並不是每次重起都改變內存地址),按Ctrl+D打開SoftICE,下命令:BPM 798695C W(寫這個地址時則中斷),回到游戲中,打開人物屬性面板,游戲中斷了,在SofitICE中你會看到這條指令:

0047EB17 MOV EAX [EDX+000003F4] 下命令:D EDX+3F4將看到內力值
0047EB1D PUSH EAX
………………………………
………………………………
從上面可看出0047EB17處的指令是將內力值的指針送到EAX寄存器中,這是一個典型的定址方式,設想一下,我們是到了EDX中的基址,那麼無論什麼時候只要用EDX+3F4就可以輕松的得到內力值的地址,因為000003F4是一個常量,它是不會改變的,改變的只是EDX中的地址,所以只要有辦法得到EDX中的值就什麼都好辦了,你明白了沒有?如果還是不懂,那麼請再看一遍。現在要做的就是如何得到這個值,下面我教給你如何做:
我的辦法就是設計一段代碼,把EDX中的值存放到一個地址中,然後運行這段代碼,再返回遊戲的原有指令繼續執行,什麼?補丁技術?SMC?隨你怎麼說啦,只要運行正常就一切OK啦:D
實際操作:
首先在程序中找一段空白處來存放我們設計的代碼,很簡單,只要懂得一些PE文件結構的朋友都會知道,一般在EXE文件的數據段(.data段)的結尾都會有一段緩沖區,我們可以在這段區域中寫任何東西,當然你也可以用「90大法」找一段空白區,但我還是推薦你用我教給你的方法。上同我提到,如果你沒有PE文件查看工具我可以教你用SoftICE查看,而且很簡單,只要一個命令:MAP32 「模塊名」,看一下我是怎麼做的你就知道了。
Ctrl+D呼收出SoftICE,然後下命令:MAP32 CrhChs,這時你應該看到EXE各個段的信息,我們要注意的只是.data段,既然要找的是數據段的結尾,那麼我們就從下一個段開始向上找,如下:
.data 004FB000
.rsrc 00507000
.data的下一個段是.rsrc段,它是從00507000開始的,也就是說以00507000為基礎向上一個位元組就是數據段的結尾,我所擇從00506950處開始寫代碼,說了這么半天那麼我們的代碼到底是什麼樣子呢?修改後的指令又是什麼樣的呢?別急,請看下面:
修改0047EB17後代碼:
0047EB17 JMP 00506950 //跳到我們的代碼中去執行
0047EB1C NOP //由於這條指令原來的長度是6位元組,而修改後的長度是5個位元組,所以用一個空指令補上
0047EB1D PUSH EAX

//我們的代碼:
00506950 MOV DWORD PTR EAX,[EDX+00003F4] //恢復我們破壞的指令
00506956 MOV DWORD PTR [00506961],EDX //把EDX保存以00506961中去
0050695C JMP 0047EB1D //返回原來的指令去執行

把上面的代碼用SoftICE的A命令寫入,OK!
現在我們試一下運行的效果,你現在用金山游俠搜索一下內力址的地址,什麼又變了?那就地啦,它要是不變我們還用費這么大勁兒嗎?記下這個地址返回到游戲中去,Ctrl+D呼出SoftICE,下命令 D *[00506961]+000003F4,在數據窗口看到什麼了?呵呵,沒錯,看到了你剛才記住的那個地址,裡面的數值正是內力的值,試著改一下,回到游戲中,呵呵,內力值變了吧:D
講到這里,我們的工作已經完成了%90,但別高興的太早,後面的%10要遠比前的%90花的時間長,因為我們要用編程實現這一切,因為你不能每次都像剛才那樣做一次吧!
現在我來說一下編程的步驟:
首先用FindWindow函數得到窗口句柄,然後用GetWindowThreadID函數從窗口句柄得到這個進程的ID,接著用OpenProcess得到進程的讀寫許可權,最後用WriteProcessMemory和ReadProcessMemory讀寫內存,然後。。。。呵呵,你的修改器就做成啦:D
下面是我抄寫以前寫的修改器源程序片斷,第一部分是動態寫入剛才的代碼,第二部分是讀取並修改內力值,由於我沒有時間整理和測試,所以不能保證沒有錯誤,如果大家發現有遺漏的話,可以在QQ上給我留言或寫信給我,代碼如下:
有幾點請大家注意:
1、 寫機器碼時要一個位元組一個位元組的寫
2、 注意要先寫入自己的代碼,然後再修改游中的指令(下面的代碼沒有這樣做,因為不影響,但是你應該注意這個問題)

#define MY_CODE5 0x00
#define MY_CODE6 0x90
//00506950
#define MY2_CODE1 0x8B
#define MY2_CODE2 0x82 //這部分是要寫入的機器碼的常量定義
#define MY2_CODE3 0xF4
#define MY2_CODE4 0x03
#define MY2_CODE5 0x00
#define MY2_CODE6 0x00

#define MY3_CODE1 0x89
#define MY3_CODE2 0x15
#define MY3_CODE3 0x61
#define MY3_CODE4 0x69
#define MY3_CODE5 0x50
#define MY3_CODE6 0x00

#define MY4_CODE1 0xE9
#define MY4_CODE2 0xBC
#define MY4_CODE3 0x81
#define MY4_CODE4 0xF7
#define MY4_CODE5 0xFF
//-----------------------------------------------------------------------------//
DWORD A1 =MY_CODE1;
DWORD A2 =MY_CODE2;
DWORD A3 =MY_CODE3;
DWORD A4 =MY_CODE4;
DWORD A5 =MY_CODE5;
DWORD A6 =MY_CODE6;

DWORD B1 =MY2_CODE1;
DWORD B2 =MY2_CODE2;
DWORD B3 =MY2_CODE3; //這部分是變數的定義
DWORD B4 =MY2_CODE4;
DWORD B5 =MY2_CODE5;
DWORD B6 =MY2_CODE6;

DWORD C1 =MY3_CODE1;
DWORD C2 =MY3_CODE2;
DWORD C3 =MY3_CODE3;
DWORD C4 =MY3_CODE4;
DWORD C5 =MY3_CODE5;
DWORD C6 =MY3_CODE6;

DWORD D1 =MY4_CODE1;
DWORD D2 =MY4_CODE2;
DWORD D3 =MY4_CODE3;
DWORD D4 =MY4_CODE4;
DWORD D5 =MY4_CODE5;
//--------------------------------------------------------------------------//
HWND hWnd =::FindWindow("CRHClass",NULL); //得到窗口句柄
if(hWnd ==FALSE)
MessageBox("游戲沒有運行!");
else
{
GetWindowThreadProcessId(hWnd,&hProcId); // 從窗口句柄得到進程ID
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE,FALSE,hProcId); //打開進程並得到讀與許可權
if(nOK ==NULL)
MessageBox("打開進程時出錯");
else
{
//0047EB17
WriteProcessMemory(nOK,(LPVOID)0x0047EB17,&A1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB18,&A2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB19,&A3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB1A,&A4,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB1B,&A5,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB1C,&A6,1,NULL);
//00506950
WriteProcessMemory(nOK,(LPVOID)0x00506950,&B1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506951,&B2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506952,&B3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506953,&B4,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506954,&B5,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506955,&B6,1,NULL);
//第二句
WriteProcessMemory(nOK,(LPVOID)0x00506956,&C1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506957,&C2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506958,&C3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506959,&C4,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695A,&C5,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695B,&C6,1,NULL);
//最後一句
WriteProcessMemory(nOK,(LPVOID)0x0050695C,&D1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695D,&D2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695E,&D3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695F,&D4,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506960,&D5,1,NULL);

CloseHandle(nOK); //關閉進程句柄
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//讀取並修改內力值
DWORD hProcId;
HWND hWnd =::FindWindow("CRHClass",NULL);
if(hWnd ==FALSE)
MessageBox("No");
else
{
GetWindowThreadProcessId(hWnd,&hProcId);
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE,FALSE,hProcId);
if(nOK ==NULL)
MessageBox("ProcNo!");
else
{
DWORD buf1;
DWORD write;
BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x00506961,(LPVOID)&buf1,4,NULL); //讀取我們保存EDX中的基礎
if(OK ==TRUE)
{
write =buf1+0x000003F4; //得到內力值的地址
DWORD Writeed =0x00; //要修改的數值
BOOL B =WriteProcessMemory(nOK,(LPVOID)write,&Writeed,1,NULL);
if(B==FALSE)
MessageBox("WriteNo");
}
}
CloseHandle(nOK);
}

啊,寫的我手都麻啦,今天就到這里了,才疏學淺難免會有遺漏,請大家指教,如果我不會或不喜歡用VC的話,你可以在QQ上與我交流,我可以教你如何用Delphi、C++Builder、Win32Asm或VC實同上面的功能。
(如轉載本篇文章請不要改動內容及作者!)
作者:CrackYY
Email:[email protected]
OICQ:20651482

2001年,從雲風那兒得知了IDA這種好東東,看到他在解愷撒的游戲資源,覺得好玩,也開始自己解一些東東,當時一口氣解了一些游戲的資源,當然,都不是很復雜的,主要是台灣和日本的
後來在主頁上放過一段時間,記得感興趣的朋友還挺多的,一直沒時間說,現在大概聊一下做法吧:)
工具當然是IDA+SoftIce,要自己寫解壓程序的話,還要有習慣的編輯器,我當然是用VC
其實,資源破解,並不是很復雜,方法大致有3種

1,硬性破解
通過觀察目標文件和反匯編代碼,分析出資源壓縮或者加密的格式,寫程序讀取改文件,並轉換成一種自己可以識別的格式就OK了
這是自己動手解資源時最容易想到的做法
具體來說,也就是通過一些特定函數,譬如 fopen、createFile這樣的文件相關函數,確定游戲的解資源函數,然後就拚命的分析匯編代碼就OK了
我前期大部分資源都是這樣破解的,最好先用UEDIT分析一下實際的文件,有些格式太簡單了,通過文件大小,用看的就可以了
這種方法,我解過的最復雜的就是神奇傳說系列,當時就感覺和GIF比較像,但又不太一樣,因為對壓縮演算法沒研究,所以就沒深究了,不過後來從網上看到文章說,那是一個很通用的壓縮演算法,一些解壓工具就可以可以解開的,◎#¥%……真是不爽(不過還好,我只花了幾個小時就解開那個游戲而已

2,Dump
等圖片載入後,直接從內存中導出
這種做法也很容易想到的,主要難點在於內存中資源的格式問題,可能對3D游戲來說,這種解法比較容易一些,畢竟紋理渲染這些,是顯卡完成的,不是軟體實現的
我了解到的有些人解魔獸的資源就是這樣解開的,hook OpenGL的一些函數
我這樣解過一些游戲的文本(漢化用的文字),賽車游戲的,為了獲取所有游戲文本,特地將那款游戲通關的說

3,直接調用游戲的解碼函數解碼
和第2種做法類似,但是主動調用函數,基本上可以一次將所有資源全部解開,不需要游戲通關
當然,不是讓你調用游戲的解包模塊,畢竟很多游戲都不是dll形式的
只能侵入到游戲進程內部,找一個合適的時機(一般是載入其他文件的時候,中斷跳轉一下,先把我們的事做完),調用內部函數,解開所有的資源
我解過一款游戲就是用這種方法,說起來,那款游戲的資源壓縮率和rar差不多

0. 需求文檔
LZW壓縮演算法是一種新穎的壓縮方法,由Lemple-Ziv-Welch 三人共同創造,用他們的名字命名。它採用了一種先進的串表壓縮,將每個第一次出現的串放在一個串表中,用一個數字來表示串,壓縮文件只存貯數字,則不存貯串,從而使文件的壓縮效率得到較大的提高。奇妙的是,不管是在壓縮還是在解壓縮的過程中都能正確的建立這個串表,壓縮或解壓縮完成後,這個串表又被丟棄。

1. 基本原理
首先建立一個字元串表,把每一個第一次出現的字元串放入串表中,並用一個數字來表示,這個數字與此字元串在串表中的位置有關,並將這個數字存入壓縮文件中,如果這個字元串再次出現時,即可用表示它的數字來代替,並將這個數字存入文件中。壓縮完成後將串表丟棄。如"print" 字元串,如果在壓縮時用266表示,只要再次出現,均用266表示,並將"print"字元串存入串表中,在解碼時遇到數字266,即可從串表中查出266所代表的字元串"print",在解壓縮時,串表可以根據壓縮數據重新生成。

2. 實現方法
A. 初始化串表
在壓縮信息時,首先要建立一個字元串表,用以記錄每個第一次出現的字元串。一個字元串表最少由兩個字元數組構成,一個稱為當前數組,一個稱為前綴數組,因為在文件中每個基本字元串的長度通常為2(但它表示的實際字元串長度可達幾百甚至上千),一個基本字元串由當前字元和它前面的字元(也稱前綴)構成。前綴數組中存入字元串中的首字元,當前數組存放字元串中的尾字元,其存入位置相同,因此只要確定一個下標,就可確定它所存貯的基本字元串,所以在數據壓縮時,用下標代替基本字元串。一般串表大小為4096個位元組(即2 的12次方),這意味著一個串表中最多能存貯4096個基本字元串,在初始化時根據文件中字元數目多少,將串表中起始位置的位元組均賦以數字,通常當前數組中的內容為該元素的序號(即下標),如第一個元素為0,第二個元素為1,第15個元素為14 ,直到下標為字元數目加2的元素為止。如果字元數為256,則要初始化到第258個位元組,該位元組中的數值為257。其中數字256表示清除碼,數字257 為文件結束碼。後面的位元組存放文件中每一個第一次出現的串。同樣也要音樂會 前綴數組初始化,其中各元素的值為任意數,但一般均將其各位置1,即將開始位置的各元素初始化為0XFF,初始化的元素數目與當前數組相同,其後的元素則要存入每一個第一次出現的字元串了。如果加大串表的長度可進一步提高壓縮效率,但會降低解碼速度。

B. 壓縮方法
了解壓縮方法時,先要了解幾個名詞,一是字元流,二是代碼流,三是當前碼,四是當前前綴。字元流是源文件文件中未經壓縮的文件數據;代碼流是壓縮後寫入文件的壓縮文件數據;當前碼是從字元流中剛剛讀入的字元;當前前綴是剛讀入字元前面的字元。
文件在壓縮時,不論文件字元位數是多少,均要將顏色值按位元組的單位放入代碼流中,每個位元組均表示一種顏色。雖然在源文件文件中用一個位元組表示16色、4色、2色時會出現4位或更多位的浪費(因為用一個位元組中的4位就可以表示16色),但用LZW 壓縮法時可回收位元組中的空閑位。在壓縮時,先從字元流中讀取第一個字元作為當前前綴,再取第二個字元作為當前碼,當前前綴與當前碼構成第一個基本字元串(如當前前綴為A,當前碼為B則此字元串即為AB),查串表,此時肯定不會找到同樣字元串,則將此字元串寫入串表,當前前綴寫入前綴數組,當前碼寫入當前數組,並將當前前綴送入代碼流,當前碼放入當前前綴,接著讀取下一個字元,該字元即為當前碼了,此時又形成了一個新的基本字元串 (若當前碼為C,則此基本字元串為BC),查串表,若有此串,則丟棄當前前綴中的值,用該串在串表中的位置代碼(即下標)作為當前前綴,再讀取下一個字元作為當前碼,形成新的基本字元串,直到整個文件壓縮完成。由此可看出,在壓縮時,前綴數組中的值就是代碼流中的字元,大於字元數目的代碼肯定表示一個字元串,而小於或等於字元數目的代碼即為字元本身。

C. 清除碼
事實上壓縮一個文件時,常常要對串表進行多次初始化,往往文件中出現的第一次出現的基本字元串個數會超過4096個,在壓縮過程中只要字元串的長度超過了4096,就要將當前前綴和當前碼輸入代碼流,並向代碼流中加入一個清除碼,初始化串表,繼續按上述方法進行壓縮。

D. 結束碼
當所有壓縮完成後,就向代碼流中輸出一個文件結束碼,其值為字元數加1,在256色文件中,結束碼為257。

E. 位元組空間回收
在文件輸出的代碼流中的數據,除了以數據包的形式存放之外,所有的代碼均按單位存貯,樣就有效的節省了存貯空間。這如同4位彩色(16色)的文件,按位元組存放時,只能利用其中的4位,另外的4位就浪費了,可按位存貯時,每個位元組就可以存放兩個顏色代碼了。事實上在 文件中,使用了一種可變數的存貯方法,由壓縮過程可看出,串表前綴數組中各元素的值頒是有規律的,以256色的文件中,第258-511元素中值的范圍是0-510 ,正好可用9位的二進制數表示,第512-1023元素中值的范圍是0-1022,正好可用10位的二進制數表示,第1024-2047 元素中值的范圍是0-2046,正好用11位的二進制數表示,第2048-4095元素中值的范圍是0-4094,正好用12位的二進制數表示。用可變位數存貯代碼時,基礎位數為文件字元位數加1,隨著代碼數的增加,位數也在加大,直到位數超過為12(此時字元串表中的字元串個數正好為2 的12次方,即4096個)。 其基本方法是:每向代碼流加入一個字元,就要判別此字元所在串在串表中的位置(即下標)是否超過2的當前位數次方,一旦超過,位數加1。如在4位文件中,對於剛開始的代碼按5位存貯,第一個位元組的低5位放第一個代碼,高三位為第二個代碼的低3位,第二個位元組的低2位放第二個代碼的高兩位,依次類推。對於8位(256色)的文件,其基礎位數就為9,一個代碼最小要放在兩個位元組。

F. 壓縮范圍
以下為文件編碼實例,如果留心您會發現這是一種奇妙的編碼方法,同時為什麼在壓縮完成後不再需要串表,而且還在解碼時根據代碼流信息能重新創建串表。
字 符 串: 1,2,1,1,1,1,2,3,4,1,2,3,4,5,9,…
當 前 碼: 2,1,1,1,1,2,3,4,1,2,3,4,5,9,…
當前前綴: 1,2,1,1,260,1,258,3,4,1,258,262,4,5,…
當前數組: 2,1,1, 1, 3,4,1, 4,5,9,…
數組下標: 258,259,260,261,262,263,264,265,266,267,…
代 碼 流: 1,2,1,260,258,3,4,262,4,5,…

3. 測試文檔

說明:
當選擇時請選擇1-3的數據,如果選了其他的數據就出錯了。
4. 使用文檔
在進入程序後,通過選擇是壓縮、解壓縮還是退出程序。
壓縮文件:
1)提示:「Input file name?」 輸入:D:\cc\test.txt
2)提示:「Compressed file name?」 輸入:test.lzw
3)顯示:「Compressing………」 及 「*」表示文件壓縮的進度。
說明:如果輸入的文件不存在,將會重復提示,直到輸入正確文件位置和文件名。生成的test.lzw將會存放在程序所在的根目錄下。
如:程序放在D:\cc\下,則生成文件也在D:\cc\.
解壓縮:
1)提示:「Input file name?」 輸入:test.lzw
2)提示:「Compressed file name?」 輸入:test.txt
3)顯示:「Expand………」 及 「*」表示文件解壓縮的進度。
說明:如果輸入的文件不存在,將會重復提示,直到輸入正確文件位置和文件名。生成的test.lzw將會存放在程序所在的根目錄下。

ANI(APPlicedon Startins Hour Glass)文件是 MS-Windows的動畫游標文件,其文件擴展名為「.ani」。它一般由四部分構成:文字說明區、信息區、時間控制區和數據區,即 ACONLIST塊。anih塊、rate塊和 LIST塊。
以下就是作為例子的文件內容(數據E)及ANI文件標准結構圖(圖):

1. 從(0000-006D)是 Wnd0WS 95& NT ANI文件的文字說明區部分
如你想對你開發的ANI文件提供一點文字說明,並加入你的版權信息,且同時它們又要被ANI文件播放軟體承認時,這是你唯一的選擇。要是你覺得這樣做很麻煩,或者沒什麼好寫時,那你完全可以去掉本塊中的全部內容,並將塊的大小置為0。切記,「塊識別碼
『 ACONLIST』」和標識「塊的大小」這兩部分,共計 12位元組,絕對不能被更改、移動及刪除,否則後果自負。
可能為了讓文字說明信息系統化,在ACONLIST塊內部包容了若乾子塊,本例中用到的兩個分別是:INFOINAM塊(提供本文件的解釋說明)和IART塊(用於插入版本信息)。說實在,諸位可以運用在 AVI文件中插入自定義塊的方法,加入自己的自定義塊,其結果只是ANI播放軟體把它當作一個「JUNK」罷了。
0000-0003:多媒體文件識別碼:RIFF
0004-0007;文件大小( 2052h位元組)-8位元組
0008- 000F: ACONLIST塊識別碼,它是文字說明區開始的標志
0010-0013:ACONLIST塊的大小(5Ah位元組)
0014-001B:INFOINAM塊識別碼,標志文件說明信息子塊的開始
001C- 001F: INFOINAM塊的大小( 20h位元組)
0020-003F :文件說明信息子塊的內容「Application startingHour Glass」
0040-0043:IART塊識別碼,標志版權說明信息於決的開始
0044-0047:IART塊的大小(26h位元組)
0048- 006D:版權說明信息於塊的內容「Microsoft Corporation,Copyright 1995」
2.從(006E-0099)?

閱讀全文

與源碼編輯器游戲教程新手簡單相關的資料

熱點內容
指數函數和對數函數的高精度快速演算法 瀏覽:205
c預編譯干什麼 瀏覽:22
hp網路共享文件夾 瀏覽:363
程序員如何不被廢 瀏覽:806
二進制流轉pdf 瀏覽:916
php判斷爬蟲 瀏覽:571
960除24除4簡便演算法 瀏覽:786
關於解壓英語翻譯 瀏覽:565
python控制鍵盤右鍵 瀏覽:921
php沒有libmysqldll 瀏覽:828
時政新聞app哪個好 瀏覽:906
手機已加密怎麼辦 瀏覽:201
安卓手機截屏怎麼傳到蘋果 瀏覽:529
京管家app哪裡下載 瀏覽:33
文件夾橫向排列的豎向排列 瀏覽:453
51單片機驅動攝像頭模塊 瀏覽:689
政府文件加密沒法轉換 瀏覽:373
android判斷棧頂 瀏覽:331
憑證軟體源碼 瀏覽:860
androidwebview滾動事件 瀏覽:11