本文以實例描述了以Delphi實現撞擊球效果的方法,類似彈珠效果。點擊「開始」按鈕,窗體中的一個綠色小球將不斷地左右撞擊運動,並且其大小不停地變化。點擊「停止」按鈕,小球停止移動。用滑鼠拖曳右下方的調整控件,可以調整小球運動的速度。
這裡我們主要是使用Timer 控制項、Panel 控制項、TrackBar 控制項、SpinEdit 控制項、Shape控制項和Button 控制項來實作。重點是Delphi 的Timer 控制項。在執行程式時,此控制項不可見,也不能直接對它進行操作。 Timer 控制項每隔一定時間就會自動觸發OnTimer()事件。本例就是利用它來觸發小球運動事件的。
設計想法:程式要解決的主要問題是如何控制小球運動以及運動過程中,小球的速度和大小。利用Timer 控制的OnTimer()事件來控制小球的移動;利用TrackBar 控制和SpinEdit控制項來調整小球運動的速度。小球是由Shape 控制項產生的。
一.新建工程:
(1)啟動Delphi 6.0 程式。選擇「檔案」選單下的「新建」指令,從彈出的子選單中選擇Application 選項,則出現新建工程的Form1 視窗。
(2)選擇「檔案」選單下的「工程另存為」指令,彈出Save Unit1 As 對話方塊。在「儲存在」列錶框中選擇需要存放該視窗檔案所在的目錄名;在「檔案名稱」編輯框中填寫檔案名,這裡填寫「Unit1」,點選「儲存」按鈕,儲存上面的選項。
(3)執行上一步後,將彈出「工程另存為」對話框。在「儲存在」列錶框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在「檔案名稱」編輯框中填寫儲存處理該工程的原始程式碼的檔案名,這裡填寫“Project1”,點選“儲存”按鈕,儲存上面的選項。
二.部分參數設定:
(1)啟動Unit1 窗口,在“屬性”面板中設定該窗體的Caption 屬性為“運動的球體”,Color 屬性設定為“clMoneyGreen”。
(2)選擇“標準”頁面上的Panel 選項,在窗體中新增Panel 控件,調整其適當的大小和位置,在“屬性”面板中設定該控件的Name 屬性為“Panel1”,BevelInner 為“bvLowered ”,BevelOuter 為“blNone”,BorderStyle 設定為“bsSingle”,Color 屬性設定為“clSkyBlue”。
(3)選擇「系統」頁面上的Timer 選項,在窗體中新增一個Timer 控件,在Object Inspecter面板中設定其Interval 屬性為1,Name 屬性為「Timer1」。
(4)選擇“附加”頁面上的Shape 選項,在窗體中Panel1 上新增一個Shape 控件,在“屬性”面板中設定其Show Hint 屬性為“True”,Hint 屬性為“運動球體”,設定其Brush.Color 屬性為ClLime,設定其Shape 屬性為「slCircle」。
(5)選擇「標準」頁面上的Button 選項,在窗體中新增三個Button 控件,調整其適當的大小和位置。在「屬性」面板中設定其Caption 屬性分別為「開始」、「停止」和「退出」。
(6)選擇Win 32 頁上的TrackBar 選項,在窗體中新增TrackBar 控件,調整其適當的大小和位置。在「屬性」面板上設定其適當的屬性。
(7)選擇Samples 上的SpinEdit 選項,在窗體中新增SpinEdit 控件,調整其適當的大小和位置。在「屬性」面板上設定其適當的屬性。
三.代碼分析:
(1)為了實現小球來回移動的功能,需要設定一個全域變量,即整數I,I 的初始值為1。當I=1 時,小球向左移動,撞到面板的左壁時,I 值變為2,此時小球向右移動,撞到面板右壁時,I 值又變為1。這樣透過I 值的變化,就實現了小球的來回運動。這部分程式碼在OnTimer 事件中:
procedure TForm1.Timer1Timer(Sender: TObject);beginTimer1.interval:=trackbar1.position; //設定Timer 控制項的觸發時間間隔if i=1 then //小球向左移動beginif shape1.left>0 thenbeginshape1.left: =shape1.left-10; //使小球的位置改變shape1.Width:=(shape1.Width+1)mod 70; //使小球所在矩形寬度改變shape1.Height:=(shape1.Height+1)mod 70; / /使小球所在矩形高度變化endelsei:=2; //小球向右移動end;if i=2 thenbeginif shape1.left<(panel1.Width-shape1.Width-5) thenbeginshape1.left:=shape1.left+10 ; //使小球的位置改變shape1.Width:=(shape1.Width+1)mod 70; //使小球所在矩形寬度改變shape1.Height:=(shape1.Height+1)mod 70;//使小球所在矩形高度變化endelsei:=1;end;end;
(2)「開始」和「停止」按鈕控制小球是否移動,其實就是控制Timer 是否工作:
procedure TForm1.Button1Click(Sender: TObject);beginTimer1.interval:=trackbar1.position; //設定Timer 控制的觸發時間間隔Timer1.Enabled:=true; //小球開始運動end;procedure TForm1.Button2Click(Sender: TObject);beginTimer1.Enabled:=False; //小球停止運動end;
(3)TrackBar 和SpinEdit 兩個控制項控制小球運動的速度,對應程式碼如下:
procedure TForm1.SpinEdit1Change(Sender: TObject);begintrackbar1.position:=spinEdit1.Value; //改變運動速度end;procedure TForm1.TrackBar1Change(Sender: TObject);beginspinEdit1.value:=rackbar1.PCender: TObject);beginspinEdit1.value:=rackbar1.Position 將Trackbarosition;的變更通知SpinEdit 控制項end;
四.Delphi彈珠的完整程式碼如下:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls, ComCtrls, StdCtrls, Spin;typeTForm1 = class(TForm)Panel1: TPanel;Button1: TTrackButton1: TTrack; : TTimer;Shape1: TShape;SpinEdit1: TSpinEdit;Button3: TButton;procedure Timer1Timer(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Spindit1Change(Sender:fid procedure Button3Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;i:integer;implementation{$R * *.DFM}procedure TForm1.Timer1Timer(Sender: TObject);begin.DFM}procedure TForm1.Timer1Timer(Sender: TObject);begin.DFM}procedure TForm1.Timer1Timer(Sender: TObject);begin.DFM1.interval:begin=Timer1. trackbar1.position; //設定Timer 控制項的觸發時間間隔if i=1 then //小球向左移動beginif shape1.left>0 thenbeginshape1.left:=shape1.left-10; //使小球的位置改變shape1.Width:=(shape1.Width+1)mod 70;//使小球所在矩形寬度發生變化shape1.Height:=(shape1.Height+1)mod 70;//使小球所在矩形高度改變endelsei:=2; //小球向右移動end;if i=2 thenbeginif shape1.left<(panel1.Width-shape1.Width-5) thenbeginshape1.left: =shape1.left+10 ; //使小球的位置改變shape1.Width:=(shape1.Width+1)mod 70; //使小球所在矩形寬度發生變化shape1.Height:=(shape1.Height+1)mod 70;//使小球所在矩形高度變化endelsei:=1;end;end;procedure TForm1.Button1Click(Sender : TObject);beginTimer1.interval:=trackbar1.position; //設定Timer 控制項的觸發時間間隔Timer1.Enabled:=true; //小球開始運動end;procedure TForm1.Button2Click(Sender: TObject);beginTimer1.Enabled:=False; //小球停止運動end;procedure TForm1.SpinEdit1Change(Sender: TObject);begintakbar1.position:SpinE1Change(Sender: TObject);begintakbar1.position:=racksdit1. Value; //改變運動速度end;procedure TForm1.TrackBar1Change(Sender: TObject);beginspinEdit1.value:=trackbar1.Position; //將Trackbar 值的變化通知SpinEdit 控制項end;procedure TForm1.Button3Click(Sender: TObject);beginclose; //退出end;initializationi:=1;end.