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

所属分类: 软件编程 / Delphi 阅读数: 181
收藏 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的朋友可以参考下。
收藏 0 赞 0 分享

Delphi书籍15本网盘下载地址整理

由Delphi园地整理的Delphi书籍15本常用的参考书籍,需要的朋友可以下载了。
收藏 0 赞 0 分享

wordpress主题支持自定义菜单及修改css样式实现方法

使用wordpress过程中会遇到主题支持自定义菜单以及修改css样式问题,本文将介绍详细解决方法,需要朋友可以参考下
收藏 0 赞 0 分享

delphi xe 可用的MD5算法

delphi xe 可用的MD5算法,需要的朋友可以参考一下
收藏 0 赞 0 分享

Delphi隐藏TPageControl的标签实例介绍

件是一组页面集,用于构造一个多页对话框,它显示多个交互页(TTabSheet 对象),接下来为大家介绍下Delphi隐藏TPageControl的标签方法
收藏 0 赞 0 分享

delphi中exit,abort,break,continue的区别介绍

本文详细介绍下delphi中表示跳出的有break,continue, exit,abort, halt, runerror的区别,感兴趣的朋友可以参考下哈,希望对你学习跳出有所帮助
收藏 0 赞 0 分享

delphi设置开机自动启动函数具体实现

有些程序要设置为开机启动,所以自己写了个函数方便以后使用,实现比较简单,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

delphi简单判断程序30秒没有键盘和鼠标动作示例

本文为大家详细介绍下delphi判断程序30秒没有键盘和鼠标动作,这里给timer设置了1000ms)的参数,表示30秒的间隔,具体实现如下,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

delphi程序全屏显示无标题栏覆盖整个屏幕(适合屏保)

delphi 简单实现程序全屏显示无标题栏,覆盖整个屏幕,这个在做工控机或屏保时有用的,具体代码如下,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

delphi发送消息控制滚动条使用示例

本文为大家详细介绍下delphi实现发送消息控制滚动条,主要函数及用法如下,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享
查看更多