Delphi实现碰撞球体完整实例代码
本文以实例描述了用Delphi实现撞击球效果的方法,类似弹球效果。点击“开始”按钮,窗体中的一个绿色小球将不断地左右撞击运动,并且其大小不停地变化。点击“停止”按钮,小球停止运动。用鼠标拖动右下方的调节控件,可以调整小球运动的速度。
这里我们主要是使用Timer控件、Panel控件、TrackBar控件、SpinEdit控件、Shape控件和Button控件来实现。重点是Delphi的Timer控件。在运行程序时,该控件不可见,也不能直接对它进行操作。Timer控件每隔一定时间就会自动触发OnTimer()事件。本例就是利用它来触发小球运动事件的。
设计思路:该程序要解决的主要问题是如何控制小球运动以及运动过程中,小球的速度和大小。利用Timer控件的OnTimer()事件来控制小球的运动;利用TrackBar控件和SpinEdit控件来调节小球运动的速度。小球是由Shape控件生成的。
一.新建工程:
(1)启动Delphi6.0程序。选择“文件”菜单下的“新建”命令,从弹出的子菜单中选择Application选项,则出现新建工程的Form1窗口。
(2)选择“文件”菜单下的“工程另存为”命令,弹出SaveUnit1As对话框。在“保存在”列表框中选择需要存放该窗口文件所在的目录名;在“文件名”编辑框中填写文件名,这里填写“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控件,在ObjectInspecter面板中设置其Interval属性为1,Name属性为“Timer1”。
(4)选择“附加”页上的Shape选项,在窗体中Panel1上添加一个Shape控件,在“属性”面板中设置其ShowHint属性为“True”,Hint属性为“运动球体”,设置其Brush.Color属性为ClLime,设置其Shape属性为“slCircle”。
(5)选择“标准”页上的Button选项,在窗体中添加三个Button控件,调整其合适的大小和位置。在“属性”面板中设置其Caption属性分别为“开始”、“停止”和“退出”。
(6)选择Win32页上的TrackBar选项,在窗体中添加TrackBar控件,调整其合适的大小和位置。在“属性”面板上设置其合适的属性。
(7)选择Samples上的SpinEdit选项,在窗体中添加SpinEdit控件,调整其合适的大小和位置。在“属性”面板上设置其合适的属性。
三.代码分析:
(1)为了实现小球来回移动的功能,需要设置一个全局变量,即整数I,I的初始值为1。当I=1时,小球向左移动,撞到面板的左壁时,I值变为2,此时小球向右运动,撞到面板右壁时,I值又变为1。这样通过I值的变化,就实现了小球的来回运动。这部分代码在OnTimer事件中:
procedureTForm1.Timer1Timer(Sender:TObject); begin Timer1.interval:=trackbar1.position;//设置Timer控件的触发时间间隔 ifi=1then//小球向左运动 begin ifshape1.left>0then begin shape1.left:=shape1.left-10;//使小球的位置发生变化 shape1.Width:=(shape1.Width+1)mod70;//使小球所在矩形宽度发生变化 shape1.Height:=(shape1.Height+1)mod70;//使小球所在矩形高度发生变化 end else i:=2;//小球向右运动 end; ifi=2then begin ifshape1.left<(panel1.Width-shape1.Width-5)then begin shape1.left:=shape1.left+10;//使小球的位置发生变化 shape1.Width:=(shape1.Width+1)mod70;//使小球所在矩形宽度发生变化 shape1.Height:=(shape1.Height+1)mod70;//使小球所在矩形高度发生变化 end else i:=1; end; end;
(2)“开始”和“停止”按钮控制小球是否运动,其实就是控制Timer是否工作:
procedureTForm1.Button1Click(Sender:TObject); begin Timer1.interval:=trackbar1.position;//设置Timer控件的触发时间间隔 Timer1.Enabled:=true;//小球开始运动 end; procedureTForm1.Button2Click(Sender:TObject); begin Timer1.Enabled:=False;//小球停止运动 end;
(3)TrackBar和SpinEdit两个控件控制小球运动的速度,相应代码如下:
procedureTForm1.SpinEdit1Change(Sender:TObject); begin trackbar1.position:=spinEdit1.Value;//改变运动速度 end; procedureTForm1.TrackBar1Change(Sender:TObject); begin spinEdit1.value:=trackbar1.Position;//将Trackbar值的变化通知SpinEdit控件 end;
四.Delphi弹球的完整代码如下:
unitUnit1; interface uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs, ExtCtrls,ComCtrls,StdCtrls,Spin; type TForm1=class(TForm) Panel1:TPanel; Button1:TButton; Button2:TButton; TrackBar1:TTrackBar; Timer1:TTimer; Shape1:TShape; SpinEdit1:TSpinEdit; Button3:TButton; procedureTimer1Timer(Sender:TObject); procedureButton1Click(Sender:TObject); procedureButton2Click(Sender:TObject); procedureSpinEdit1Change(Sender:TObject); procedureTrackBar1Change(Sender:TObject); procedureButton3Click(Sender:TObject); private {Privatedeclarations} public {Publicdeclarations} end; var Form1:TForm1; i:integer; implementation {$R*.DFM} procedureTForm1.Timer1Timer(Sender:TObject); begin Timer1.interval:=trackbar1.position;//设置Timer控件的触发时间间隔 ifi=1then//小球向左运动 begin ifshape1.left>0then begin shape1.left:=shape1.left-10;//使小球的位置发生变化 shape1.Width:=(shape1.Width+1)mod70;//使小球所在矩形宽度发生变化 shape1.Height:=(shape1.Height+1)mod70;//使小球所在矩形高度发生变化 end else i:=2;//小球向右运动 end; ifi=2then begin ifshape1.left<(panel1.Width-shape1.Width-5)then begin shape1.left:=shape1.left+10;//使小球的位置发生变化 shape1.Width:=(shape1.Width+1)mod70;//使小球所在矩形宽度发生变化 shape1.Height:=(shape1.Height+1)mod70;//使小球所在矩形高度发生变化 end else i:=1; end; end; procedureTForm1.Button1Click(Sender:TObject); begin Timer1.interval:=trackbar1.position;//设置Timer控件的触发时间间隔 Timer1.Enabled:=true;//小球开始运动 end; procedureTForm1.Button2Click(Sender:TObject); begin Timer1.Enabled:=False;//小球停止运动 end; procedureTForm1.SpinEdit1Change(Sender:TObject); begin trackbar1.position:=spinEdit1.Value;//改变运动速度 end; procedureTForm1.TrackBar1Change(Sender:TObject); begin spinEdit1.value:=trackbar1.Position;//将Trackbar值的变化通知SpinEdit控件 end; procedureTForm1.Button3Click(Sender:TObject); begin close;//退出 end; initialization i:=1; end.