Delphi实现碰撞球体完整实例代码
本文以实例描述了用Delphi实现撞击球效果的方法,类似弹球效果。点击“开始”按钮,窗体中的一个绿色小球将不断地左右撞击运动,并且其大小不停地变化。点击“停止”按钮,小球停止运动。用鼠标拖动右下方的调节控件,可以调整小球运动的速度。 这里我们主要是使用Timer 控件、Panel 控件、TrackBar 控件、SpinEdit 控件、Shape控件和Button 控件来实现。重点是Delphi 的Timer 控件。在运行程序时,该控件不可见,也不能直接对它进行操作。Timer 控件每隔一定时间就会自动触发OnTimer()事件。本例就是利用它来触发小球运动事件的。 设计思路:该程序要解决的主要问题是如何控制小球运动以及运动过程中,小球的速度和大小。利用Timer 控件的OnTimer()事件来控制小球的运动;利用TrackBar 控件和SpinEdit控件来调节小球运动的速度。小球是由Shape 控件生成的。 一.新建工程: (1)启动Delphi 6.0 程序。选择“文件”菜单下的“新建”命令,从弹出的子菜单中选择Application 选项,则出现新建工程的Form1 窗口。 二.部分参数设置: (1)激活Unit1 窗口,在“属性”面板中设置该窗体的Caption 属性为“运动的球体”,Color 属性设置为“clMoneyGreen”。 三.代码分析: (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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |