平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Delphi实现方法碰撞球体完整实例代码”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
在这个场景下,本文以实例描述了用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);
begin
Timer1.interval:=trackbar1.position; //设置Timer 控件的触发时间间隔
if i=1 then //小球向左运动
begin
if shape1.left>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<(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;
结合项目来看,(2)“开始”和“停止”按钮控制小球是否运动,其实就是控制Timer 是否工作:
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;
实际处理时,(3)TrackBar 和SpinEdit 两个控件控制小球运动的速度,相应代码如下所示:
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
trackbar1.position:=spinEdit1.Value; //改变运动速度
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
spinEdit1.value:=trackbar1.Position; //将Trackbar 值的变化通知SpinEdit 控件
end;
四.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>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<(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.
- Delphi实现图片滚动切换的完整实例代码
- Delphi采用OpenGL2d绘图之画图片Bmp的方法
- Delphi远程连接Mysql的实现方法
- Delphi新建开机启动项的方法示例
- Delphi编程常用快捷键大全
- Delphi实现木马文件传输代码实例
- Delphi实现木马自我拷贝方法
- Delphi实现拿到磁盘空间大小的方法
- Delphi之Pascal语言中的关键字及保留字汇总
- Delphi常用关键字用法详解
- delphi实现保存和读取图片的方法

