程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi開發DirectX控件

用Delphi開發DirectX控件

編輯:Delphi

用Delphi開發DirectX控件
整理編輯:China ASP

  Microsoft推出的DirectX使我們在Windows9x下開發游戲軟件便利了許多。一般在介紹DirectX 的資料裡都講的是如何用VC++來開發,其實inprise公司的語言也可以用來開發基於DirectX的游戲軟件。我們這裡用的是DirectX控件,它有Delphi3和Delphi4不同的版本。在
http://www.ingjapan.ne.jp/hori/ 處你可以download,是由一個日本人寫的,而且,這套控件是完全免費的,你可以自由使用。在這套控件裡有DirectX的各種范例程序,我們今天來討論一下其中基於DirectX的網絡通信程序如何開發。

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

  下面我們具體分析一下一個chat聊天程序的構造。運行samples etworkchat.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);
  var
     i: 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
          Application.ShowMainForm := False;
          Application.HandleException(E);
          Application.Terminate;
        end;
   end;

   //顯示有關信息在窗口的caption
   MainForm.Caption := Format(%s : %s, [DXPlay1.ProviderName, DXPlay1.SessionName]);
  end;

  //當有消息發送時
  procedure TMainForm.DXPlay1Message(Sender: TObject; Player: TDXPlayPlayer; Data: Pointer;DataSize: Integer);
  var
     s: 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);
  var
   Msg: ^TDXChatMessage;
   MsgSize: Integer;
  begin
     MsgSize := SizeOf(TDXChatMessage)+Length(Edit1.Text);
     GetMem(Msg, MsgSize);
     try
        Msg.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語言,相信你一定能寫出一套優秀的游戲軟件(當然擁有設計良好的對戰功能)。

Copyright &copy; 上海聚聲計算機系統工程有限責任公司 1999-2000, All Rights Reserved

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved