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

所属分类: 软件编程 / Delphi 阅读数: 85
收藏 0 赞 0 分享

本文以实例描述了用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前景在何方)

已经钻DELPHI很深了,当然现在DELPHI是过了最辉煌的时代。但为什么要继续下去,而不转向其它的?这是不是死脑筋
收藏 0 赞 0 分享

Delphi 调用外部程序并阻塞到外部程序中

这篇文章主要介绍了Delphi 调用外部程序并阻塞到外部程序中的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

修改 Delphi 10.3.3 IDE 字体和字体大小

Delphi,是Windows平台下著名的快速应用程序开发工具(Rapid Application Development,简称RAD)。这篇文章主要介绍了修改 Delphi 10.3.3 IDE 字体和字体大小,需要的朋友可以参考下
收藏 0 赞 0 分享

解决delphi TAdoQuery组件的close方法导致”列名无效“错误的问题

今天小编就为大家分享一篇解决delphi TAdoQuery组件的close方法导致”列名无效“错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

delphi 字符串处理中的怪异现象与处理方式

今天小编就为大家分享一篇delphi 字符串处理中的怪异现象与处理方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

完美解决Indy 编译提示版本不一致的问题

今天小编就为大家分享一篇完美解决Indy 编译提示版本不一致的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

delphi 正弦曲线图

 在Delphi中没有直接正弦曲线的函数。但是在科学研究中,正弦曲线的应用是非常广泛的,本实例介绍如何绘制正弦曲线。
收藏 0 赞 0 分享

Delphi中判断文件是否为文本文件的函数

在用Delphi 编程处理文本文件的时候,如果要装载的文件比较大,你可能会想在文件装载过程中提供一个装载进度的提示--那么你就必需自己编写直接通过文件打开/读取函数来装载文件内容的函数。
收藏 0 赞 0 分享

c# 多线程编程 入门篇

多线程应该是编程工作者的基础技能, 但这个基础对我来讲的确有点难(起码昨天以前是这样).
收藏 0 赞 0 分享

DELPHI7.0 获取硬盘、CPU、网卡序列号的代码

DELPHI7.0 获取硬盘、CPU、网卡序列号的代码,使用DELPHI编程的朋友可以参考下。
收藏 0 赞 0 分享
查看更多