钿垢莓味濑 發表於 2014-7-17 14:40:11

Delphi实现碰撞球体完整实例代码

<p>本文以实例描述了用Delphi实现撞击球效果的方法,类似弹球效果。点击“开始”按钮,窗体中的一个绿色小球将不断地左右撞击运动,并且其大小不停地变化。点击“停止”按钮,小球停止运动。用鼠标拖动右下方的调节控件,可以调整小球运动的速度。</p>
<p>这里我们主要是使用Timer 控件、Panel 控件、TrackBar 控件、SpinEdit 控件、Shape控件和Button 控件来实现。重点是Delphi 的Timer 控件。在运行程序时,该控件不可见,也不能直接对它进行操作。Timer 控件每隔一定时间就会自动触发OnTimer()事件。本例就是利用它来触发小球运动事件的。</p>
<p>设计思路:该程序要解决的主要问题是如何控制小球运动以及运动过程中,小球的速度和大小。利用Timer 控件的OnTimer()事件来控制小球的运动;利用TrackBar 控件和SpinEdit控件来调节小球运动的速度。小球是由Shape 控件生成的。</p>
<p><strong>一.新建工程:</strong></p>
<p>(1)启动Delphi 6.0 程序。选择“文件”菜单下的“新建”命令,从弹出的子菜单中选择Application 选项,则出现新建工程的Form1 窗口。<br />
(2)选择“文件”菜单下的“工程另存为”命令,弹出Save Unit1 As 对话框。在“保存在”列表框中选择需要存放该窗口文件所在的目录名;在“文件名”编辑框中填写文件名,这里填写“Unit1”,点击“保存”按钮,保存上面的选项。<br />
(3)执行上一步后,将弹出“工程另存为”对话框。在“保存在”列表框中选择需要存放该工程的目录名,最好和第(2)步选取相同的目录;在“文件名”编辑框中填写保存处理该工程的源代码的文件名,这里填写“Project1”,点击“保存”按钮,保存上面的选项。</p>
<p><strong>二.部分参数设置:</strong></p>
<p>(1)激活Unit1 窗口,在“属性”面板中设置该窗体的Caption 属性为“运动的球体”,Color 属性设置为“clMoneyGreen”。<br />
(2)选择“标准”页上的Panel 选项,在窗体中添加Panel 控件,调整其合适的大小和位置,在“属性”面板中设置该控件的Name 属性为“Panel1”,BevelInner 为“bvLowered”,BevelOuter 为“blNone”,BorderStyle 设置为“bsSingle”,Color 属性设置为“clSkyBlue”。<br />
(3)选择“系统”页上的Timer 选项,在窗体中添加一个Timer 控件,在Object Inspecter面板中设置其Interval 属性为1,Name 属性为“Timer1”。<br />
(4)选择“附加”页上的Shape 选项,在窗体中Panel1 上添加一个Shape 控件,在“属性”面板中设置其Show Hint 属性为“True”,Hint 属性为“运动球体”,设置其Brush.Color 属性为ClLime,设置其Shape 属性为“slCircle”。<br />
(5)选择“标准”页上的Button 选项,在窗体中添加三个Button 控件,调整其合适的大小和位置。在“属性”面板中设置其Caption 属性分别为“开始”、“停止”和“退出”。<br />
(6)选择Win 32 页上的TrackBar 选项,在窗体中添加TrackBar 控件,调整其合适的大小和位置。在“属性”面板上设置其合适的属性。<br />
(7)选择Samples 上的SpinEdit 选项,在窗体中添加SpinEdit 控件,调整其合适的大小和位置。在“属性”面板上设置其合适的属性。</p>
<p><strong>三.代码分析:</strong></p>
<p>(1)为了实现小球来回移动的功能,需要设置一个全局变量,即整数I,I 的初始值为1。当I=1 时,小球向左移动,撞到面板的左壁时,I 值变为2,此时小球向右运动,撞到面板右壁时,I 值又变为1。这样通过I 值的变化,就实现了小球的来回运动。这部分代码在OnTimer 事件中:<br />
</p>
<div class="jb51code">
<pre class="brush:delphi;">
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.interval:=trackbar1.position; //设置Timer 控件的触发时间间隔
if i=1 then //小球向左运动
begin
if shape1.left&gt;0 then
begin
shape1.left:=shape1.left-10; //使小球的位置发生变化
shape1.Width:=(shape1.Width+1)mod 70; //使小球所在矩形宽度发生变化
shape1.Height:=(shape1.Height+1)mod 70; //使小球所在矩形高度发生变化
end
else
i:=2; //小球向右运动
end;
if i=2 then
begin
if shape1.left&lt;(panel1.Width-shape1.Width-5) then
begin
shape1.left:=shape1.left+10 ; //使小球的位置发生变化
shape1.Width:=(shape1.Width+1)mod 70;//使小球所在矩形宽度发生变化
shape1.Height:=(shape1.Height+1)mod 70;//使小球所在矩形高度发生变化
end
else
i:=1;
end;
end;</pre>
</div>
<p>(2)“开始”和“停止”按钮控制小球是否运动,其实就是控制Timer 是否工作:<br />
</p>
<div class="jb51code">
<pre class="brush:delphi;">
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.interval:=trackbar1.position; //设置Timer 控件的触发时间间隔
Timer1.Enabled:=true; //小球开始运动
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False; //小球停止运动
end;
</pre>
</div>
<p>(3)TrackBar 和SpinEdit 两个控件控制小球运动的速度,相应代码如下:<br />
</p>
<div class="jb51code">
<pre class="brush:delphi;">
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
trackbar1.position:=spinEdit1.Value; //改变运动速度
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
spinEdit1.value:=trackbar1.Position; //将Trackbar 值的变化通知SpinEdit 控件
end;
</pre>
</div>
<p><strong>四.Delphi弹球的完整代码如下:</strong></p>
<div class="jb51code">
<pre class="brush:delphi;">
unit Unit1;
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;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i:integer;
implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.interval:=trackbar1.position; //设置Timer 控件的触发时间间隔
if i=1 then //小球向左运动
begin
if shape1.left&gt;0 then
begin
shape1.left:=shape1.left-10; //使小球的位置发生变化
shape1.Width:=(shape1.Width+1)mod 70;//使小球所在矩形宽度发生变化
shape1.Height:=(shape1.Height+1)mod 70;//使小球所在矩形高度发生变化
end
else
i:=2; //小球向右运动
end;
if i=2 then
begin
if shape1.left&lt;(panel1.Width-shape1.Width-5) then
begin
shape1.left:=shape1.left+10 ; //使小球的位置发生变化
shape1.Width:=(shape1.Width+1)mod 70; //使小球所在矩形宽度发生变化
shape1.Height:=(shape1.Height+1)mod 70;//使小球所在矩形高度发生变化
end
else
i:=1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.interval:=trackbar1.position; //设置Timer 控件的触发时间间隔
Timer1.Enabled:=true; //小球开始运动
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False; //小球停止运动
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
trackbar1.position:=spinEdit1.Value; //改变运动速度
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
spinEdit1.value:=trackbar1.Position; //将Trackbar 值的变化通知SpinEdit 控件
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close; //退出
end;
initialization
i:=1;
end.
</pre>
</div>
<p></p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Delphi实现图片滚动切换的完整实例代码</li><li>Delphi使用OpenGL2d绘图之画图片Bmp的方法</li><li>Delphi远程连接Mysql的实现方法</li><li>Delphi创建开机启动项的方法示例</li><li>Delphi编程常用快捷键大全</li><li>Delphi实现木马文件传输代码实例</li><li>Delphi实现木马自我拷贝方法</li><li>Delphi实现获取磁盘空间大小的方法</li><li>Delphi之Pascal语言中的关键字及保留字汇总</li><li>Delphi常用关键字用法详解</li><li>delphi实现保存和读取图片的方法</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Delphi实现碰撞球体完整实例代码