Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Внимание! Есть замечания модератора по теме: Учитесь сразу давать нормальное название темам
Старый 21.06.2010, 07:42   #1
xxAlexxx
 
Регистрация: 05.12.2009
Сообщений: 6
Вопрос Delphi. Нужна подсказка по устранению ошибки

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
if i=0 then begin
i:=1;
image3.visible:=true;
button1.caption:='Stop';
timer1.Enabled:=true;   timer2.Enabled:=true;
end

else begin
i:=0;
button1.caption:='Start';
image1.top:=250;
image2.top:=250;
timer1.Enabled:=false; timer2.Enabled:=false;
end;

end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if i=1 then begin
image1.top:=y-50;
image2.top:=y-50; end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;q:=3;w:=3;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
k:=k+1;
label2.Caption:=('прошло '+inttostr(k)+' сек');
v:=v+(k+(sqr(k) div 10));
label4.Caption:=(inttostr(v)+' очк');
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
if (image3.Top+18=panel1.Height) or (image3.Top=0) then q:=-q;
image3.Top:=image3.Top+q;
if ((image3.left=image2.left-8) and ((image3.top>image2.Top) and
(image3.Top+18<image2.top+100))) or ((image3.left=image1.left+8 ) and
((image3.top>image1.Top) and (image3.Top+18<image1.top+100)))
then Begin  Image3.Picture.LoadFromFile('shar2.bmp'); w:=-w;
If abs(k-n)>1 then Image3.Picture.LoadFromFile('shar1.bmp');   end;
Image3.left:=Image3.left+w;  n:=k;


if (image3.left<0) or (image3.left>600) then begin
v:=v-1000;
label4.Caption:=(inttostr(v)+' очк');
k:=0;
i:=0;
image3.visible:=false;
label2.Caption:=('');
button1.caption:='Start';
image3.Top:=246;
image3.Left:=256;
timer1.Enabled:=false;
timer2.Enabled:=false;
end;


end;

end.


Подскажите как сделать так, чтобы после повторного запуска программы кнопкой СТАРТ\СТОП шарик не улетал сквозь барьеры. Как в это таймере заставить его отбиваться после перезапуска?

From artemavd: На нашем форуме принято код оформлять тегом #. И сформулируйте нормально свой вопрос, а то закрою тему в лучшем случае.

Последний раз редактировалось xxAlexxx; 21.06.2010 в 08:39.
xxAlexxx вне форума Ответить с цитированием
Старый 21.06.2010, 08:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты вправду думаешь что пересобирать твой проект по одной только части кода удобно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.06.2010, 08:37   #3
xxAlexxx
 
Регистрация: 05.12.2009
Сообщений: 6
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Image2: TImage;
    Button1: TButton;
    Image3: TImage;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;    i,k,s,q,w,v,n:integer;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
if i=0 then begin
i:=1;
image3.visible:=true;
button1.caption:='Stop';
timer1.Enabled:=true;   timer2.Enabled:=true;
end



else begin
i:=0;
button1.caption:='Start';
image1.top:=250;
image2.top:=250;
timer1.Enabled:=false; timer2.Enabled:=false;
end;

end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if i=1 then begin
image1.top:=y-50;
image2.top:=y-50; end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;q:=3;w:=3;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
k:=k+1;
label2.Caption:=('прошло '+inttostr(k)+' сек');
v:=v+(k+(sqr(k) div 10));
label4.Caption:=(inttostr(v)+' очк');
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
if (image3.Top+18=panel1.Height) or (image3.Top=0) then q:=-q;
image3.Top:=image3.Top+q;
if ((image3.left=image2.left-8) and ((image3.top>image2.Top) and
(image3.Top+18<image2.top+100))) or ((image3.left=image1.left+8 ) and
((image3.top>image1.Top) and (image3.Top+18<image1.top+100)))
then Begin  Image3.Picture.LoadFromFile('shar2.bmp'); w:=-w;
If abs(k-n)>1 then Image3.Picture.LoadFromFile('shar1.bmp');   end;
Image3.left:=Image3.left+w;  n:=k;


if (image3.left<0) or (image3.left>600) then begin
v:=v-1000;
label4.Caption:=(inttostr(v)+' очк');
k:=0;
i:=0;
image3.visible:=false;
label2.Caption:=('');
button1.caption:='Start';
image3.Top:=246;
image3.Left:=256;
timer1.Enabled:=false;
timer2.Enabled:=false;
end;


end;

end.


Вот полный код, отличается лишь описанием компонентов.




object Form1: TForm1
  Left = 192
  Top = 107
  Width = 870
  Height = 640
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 32
    Top = 208
    Width = 36
    Height = 13
    Caption = #1042#1088#1077#1084#1103':'
  end
  object Label2: TLabel
    Left = 32
    Top = 224
    Width = 3
    Height = 13
  end
  object Label3: TLabel
    Left = 32
    Top = 248
    Width = 26
    Height = 13
    Caption = #1057#1095#1105#1090':'
  end
  object Label4: TLabel
    Left = 32
    Top = 264
    Width = 3
    Height = 13
  end
  object Panel1: TPanel
    Left = 144
    Top = 8
    Width = 600
    Height = 600
    TabOrder = 0
    OnMouseMove = Panel1MouseMove
    object Image1: TImage
      Left = 0
      Top = 250
      Width = 9
      Height = 100
      Picture.Data = {...}
      Stretch = True
      Transparent = True
      Visible = False
    end
  end
  object Button1: TButton
    Left = 16
    Top = 88
    Width = 113
    Height = 41
    Caption = 'Start'
    TabOrder = 1
    OnClick = Button1Click
  end
  object Timer1: TTimer
    Enabled = False
    OnTimer = Timer1Timer
    Left = 40
    Top = 32
  end
  object Timer2: TTimer
    Enabled = False
    Interval = 1
    OnTimer = Timer2Timer
    Left = 96
    Top = 24
  end
end
вот файл проги
Вложения
Тип файла: rar 55665566543.rar (189.1 Кб, 6 просмотров)

Последний раз редактировалось artemavd; 23.06.2010 в 03:53.
xxAlexxx вне форума Ответить с цитированием
Старый 21.06.2010, 12:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
{if ((image3.left=image2.left-8) and ((image3.top>image2.Top) and
(image3.Top+18<image2.top+100))) or ((image3.left=image1.left+8 ) and
((image3.top>image1.Top) and (image3.Top+18<image1.top+100)))
Тут у тебя что-то напутано... Измени условия, по-моему они не очень правильные

предлагаю свой вариант:
Код:
procedure TForm1.Timer2Timer(Sender: TObject);
begin

x:=image3.Left+round(5*cos(ang));
y:=image3.top+round(5*sin(ang));

  if ((x+Image3.Width)>=Panel1.Height)
  and(
   (y+Image3.Height<Image2.Top)or(y+Image3.Height>(Image2.Top+Image2.Height))
   )
  then
    halt;

  if (x<0)
  and(
   (y+Image3.Height<Image2.Top)or(y+Image3.Height>(Image2.Top+Image2.Height))
   )
  then
    halt;


if (y>Panel1.Height)or(x>Panel1.Width)or(x<0)or(y<0) then  begin
   ang:=ang+pi/4
end;

image3.Top:=y;
image3.Left:=x;

end;
Мне кажется что так попроще и надежнее
I'm learning to live...

Последний раз редактировалось Stilet; 21.06.2010 в 13:05.
Stilet вне форума Ответить с цитированием
Старый 22.06.2010, 02:21   #5
xxAlexxx
 
Регистрация: 05.12.2009
Сообщений: 6
По умолчанию

так... Спасибо конечно, теперь рестарт работает нормально...Но шарик постоянно умудряется улетать в небытие, хотя коснулся борта барьера (есть смещение по У во время удара). Я не сильно знаком с прерыванием - HALT - скажите плиз как оно тут работает?


А фиксация выхода шарика с поля это: if (y>Panel1.Height)or(x>Panel1.Width) or(x<0)or(y<0) then begin
ang:=ang+pi/4 Вот это? Он от верха все еще способен отстукиваться?

Последний раз редактировалось xxAlexxx; 22.06.2010 в 02:28.
xxAlexxx вне форума Ответить с цитированием
Старый 22.06.2010, 14:56   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я не сильно знаком с прерыванием - HALT - скажите плиз как оно тут работае
Да оно просто завершает программу
Цитата:
Он от верха все еще способен отстукиваться?
Ну я когда проверял, вроде у меня не улетал вверх и вниз...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.06.2010, 03:51   #7
xxAlexxx
 
Регистрация: 05.12.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да оно просто завершает программу

Ну я когда проверял, вроде у меня не улетал вверх и вниз...

Потому что он тупо горизонтально бьется... Как убрать небольшое смещение по У при отбивании?
И куда теперь вставлять смену картинки при ударе, как в оригинале, халт не дает?
xxAlexxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Требуется срочная помощь по устранению ошибки Basset Microsoft Office Access 1 28.10.2008 20:24
Нужна подсказка! (StringGrid) Mr.User Помощь студентам 14 02.12.2007 23:22