用Delphi開發DirectX控制項

2021-07-17 00:23:25 字數 3988 閱讀 9535

2000-09-02 00:22

2058人閱讀收藏

舉報 microsoft推出的directx使我們在windows9x下開發遊戲軟體便利了許多。一般在介紹directx 的資料裡都講的是如何用vc++來開發,其實inprise公司的語言也可以用來開發基於directx的遊戲軟體。我們這裡用的是directx控制項,它有delphi3和delphi4不同的版本。在

處你可以download,是由乙個日本人寫的,而且,這套控制項是完全免費的,你可以自由使用。在這套控制項裡有directx的各種範例程式,我們今天來討論一下其中基於directx的網路通訊程式如何開發。

想必大家都看到過那些硝煙紛飛的即時戰略遊戲,這些遊戲中乙個很誘人的買點就是可以幾個人同時加入戰鬥,各自扮演一方高手,殺它個你死我活。那麼這些即時戰略遊戲中的網路對戰部分是怎麼寫的呢?其實在microsoft的directx中專門有一類api就是負責網路通訊的,不管是基於ipx,還是tcp/ip,或者是modem,它都可以圓滿解決。而作為程式設計的我們一般來說不用操心這些連線方式不同而帶來的**的不同,我們可以一視同仁,只要寫一套統一的**就可以了,各種連線方式的細節問題我們就交給directx去處理了。

下面我們具體分析一下乙個chat聊天程式的構造。執行samples/network/chat.dpr,我們就看到了乙個最簡單的聊天程式了。首先程式會讓你選擇連線的方式:ipx連線、internet tcp/ip連線、數據機連線和序列連線;選擇好連線方式後(下面假設你是選擇用tcp/ip方式連線),你可以選擇是建立乙個新遊戲還是進入乙個已經存在的遊戲(當然現在這裡的遊戲就是指乙個聊天程式!);如果你是選擇建立乙個新遊戲,那麼接下來要你輸入遊戲的名字和你的名字,然後聊天就開始了;如果你是選擇加入乙個已經存在的遊戲的話,那麼你可以通過輸入指定的ip位址來連線或者索性讓程式去搜尋有哪些已經存在的遊戲名字。如果你在連線方式中選擇的是數據機連線的話,就稍微複雜一些,需要選擇數據機,並準備撥號和應答等。有沒有發現這些連線的方式和過程和我們通常在遊戲中看到的很相似?由於這些關於連線的對話方塊都是由directx提供的,因而會有一點語言上的問題。如果你安裝的是directx的中文版本的話,那麼你看見的將全部是中文。(順便說一句,這套delphi 控制項所支援的directx必須在5.0版本以上。)

這個程式本身並不複雜,下面是其主要的幾個過程,我們已經加上了較為詳細的注釋:

//增加遊戲者

procedure tmainform.dxplay1addplayer(sender: tobject; player: tdxplayplayer);

begin

memo1.lines.add(format(' %s entered a room.', [player.name]));

end;

//遊戲者離開

procedure tmainform.dxplay1deleteplayer(sender: tobject;player: tdxplayplayer);

begin

memo1.lines.add(format(' %s left a room.', [player.name]));

end;

//directplay開啟

procedure tmainform.dxplay1open(sender: tobject);

vari: integer;

begin

for i:=0 to dxplay1.players.count-1 do

if dxplay1.players[i].remoteplayer then

memo1.lines.add(format(' %s is entering a room.', [dxplay1.players[i].name]));

end;

procedure tmainform.formdestroy(sender: tobject);

begin

dxplay1.close;

end;

//視窗建立執行事件

procedure tmainform.formcreate(sender: tobject);

begin

try//directplay 開啟

dxplay1.open;

except

//防錯處理

on e: exception do

begin

end;

end;

//顯示有關資訊在視窗的caption

mainform.caption := format('%s : %s', [dxplay1.providername, dxplay1.sessionname]);

end;

//當有訊息傳送時

procedure tmainform.dxplay1message(sender: tobject; player: tdxplayplayer; data: pointer;datasize: integer);

vars: string;

begin

case dxplaymessagetype(data) of

dxchat_message:

begin

if tdxchatmessage(data^).len<=0 then

s := ''

else begin

//計算字串長度和內容

setlength(s, tdxchatmessage(data^).len);

strlcopy(pchar(s), @tdxchatmessage(data^).c, length(s));

end;

//顯示收到的訊息

memo1.lines.add(format('%s> %s', [player.name, s]));

end;

end;

end;

//傳送按鈕

procedure tmainform.button1click(sender: tobject);

varmsg: ^tdxchatmessage;

msgsize: integer;

begin

msgsize := sizeof(tdxchatmessage)+length(edit1.text);

getmem(msg, msgsize);

trymsg.dwtype := dxchat_message;

msg.len := length(edit1.text);

strlcopy(@msg^.c, pchar(edit1.text), length(edit1.text));

//傳送訊息到所有的人

dxplay1.sendmessage(dpid_allplayers, msg, msgsize);

//傳送訊息到自己

dxplay1.sendmessage(dxplay1.localplayer.id, msg, msgsize);

edit1.text := '';

finally

freemem(msg);

end;

end;

tdxplay控制項是寫這類程式的關鍵,其屬性、事件和方法並不多。guid屬性用來程式的自我識別,具有相同guid的程式互相之間就能識別,所以你可以看到guid是乙個很長的數字;open方法用來開啟通訊埠,close用來關閉通訊埠;sendmessage方法是用來傳送訊息到所有的遊戲者,當你的程式收到訊息的時候,會產生onmessage 事件。

這個程式的**應該是相當簡練了,但是卻完成了點對點的多點聊天功能。如果你在自己的程式裡約定好一套規則,那麼你的程式也就具備了互相的通訊能力,是不是感覺很簡單?可以說,利用directx來寫這方面的通訊程式是最佳的選擇,你可以對網路的知識完全不懂,因為這一切已經由microsoft花費了大量人力物力進行優化的**來完成了。如果說有什麼缺點,就是要求使用者的電腦上一定要安裝上directx,這在現在win98越來越普及的情況下,並不是一件難事。再說,microsoft的directx也是一套完全免費的軟體。利用directx優秀的效能加上功能強大的 delphi語言,相信你一定能寫出一套優秀的遊戲軟體(當然擁有設計良好的對戰功能)。

用delphi開發activex列印控制項

做web最不好弄的就是列印了,用ie自帶的列印功能不太完美,功能也不強,所以我就將fastreport 4.3報表整合到web中,實現的方法 delphi7的activex fastreport,下面就是實現的操作步驟 第 一 建立active form 第一步完成後,會產生form和tlb的檔案及...

用delphi開發activex列印控制項

做web最不好弄的就是列印了,用ie自帶的列印功能不太完美,功能也不強,所以我就將fastreport 4.3報表整合到web中,實現的方法 delphi7的activex fastreport,下面就是實現的操作步驟 第 一 建立active form 第一步完成後,會產生form和tlb的檔案及...

用Delphi開發簡單ActiveX控制項

1.開啟delphi 2.file new other activex active form img 3.彈出active form wizard視窗,採用預設配置,單擊 ok img 4.出現form設計介面,這裡新增乙個button和乙個edit控制項 img 5.雙擊button,新增事件處...