Kupiłem książkę Delphi 6 - Ćwiczenia Praktyczne. Jeden z przykładów - gra The ball nie działą poprawnie. Ściągnąłem z helionu kod źródłowy - wszystko działa. Nie wiem co jest nie tak. Proszę o pomoc.
Kod nie poprawny ( ode mnie ):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls;
type
TForm1 = class(TForm)
Ball: TPaintBox;
Line: TPaintBox;
procedure FormPaint(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
Counter : Integer;
public
{ Public declarations }
end;
TBall = class(TThread)
private
Delay : integer;
procedure MoveImage;
protected
procedure Execute; override;
end;
var
Form1: TForm1;
X, Y : Integer;
Engine : TBall;
implementation
{$R *.dfm}
const
VK_LEFT = 37;
VK_RIGHT = 39;
var
LeftPos : Integer = 300;
procedure TBall.Execute;
begin
FreeOnTerminate := true;
while not (Terminated) do
begin
case Form1.Counter of
0..10: Delay := 10;
11..20: Delay := 8;
21..30: Delay := 5;
end;
if Form1.Counter > 31 then Delay := 1;
Sleep(Delay);
Synchronize(MoveImage);
end;
end;
procedure TBall.MoveImage;
begin
with Form1 do
begin
Caption := 'The Ball... :: punktów: ' + inttostr(Counter);
Ball.Left := Ball.Left + X;
Ball.Top := Ball.Top + Y;
if Ball.Left = (Height - 40) then
begin
Ball.Top := 1;
Y := Random(3)+1;
Dec(Counter);
end;
if ((Ball.Top = Line.Top) and (Ball.Left >= Line.Left) and (Ball.Left 31 then Delay := 1;
Sleep(Delay); // odczekaj 10 mils.
Synchronize(MoveImage); // wywolaj procedure
end;
end;
procedure TBall.MoveImage;
begin
with MainForm do
begin
Caption := 'The Ball... :: punktów: ' + IntToStr(Counter); // wyświetl ilość punktów
{ przemiszanie kulki }
Ball.Left := Ball.Left + X; // dodaj nowa wartosc
Ball.Top := Ball.Top + Y;
{ te instrukcje if sprawdzaja, czy pilka nie dotknela scian formy. w takim przypadku
losowane zostaja nowe wartosci X i Y. Jezeli kulka spadnie na sam dol - punkty
zostają odjęte, a kulka przesunięta na samą górę }
if Ball.Left = (Height - 40) then
begin
Ball.Top := 1;
Y := Random(3)+1;
Dec(Counter); // odejmij punkty
end;
{ jeżeli piłka dotknie paska - odbijamy ją i dodajemy punkt }
if ((Ball.Top = Line.Top) and (Ball.Left >= Line.Left) and (Ball.Left