Народ, нужно сделать прогу, которая имитирует стыковку двух космических кораблей. Управление только "Назад-вперед курсором", что как бы больше-меньше подача газа...
Две точечки, одна вот так подлетает к другой... если скорость большая. то должна выскочить ошибка -типа какстрофа... удачно- поздравление.
Если кто подскажет — спаибо! Кто сделает — пузырь выкачу! Спасибо! (Питер)
Здравствуйте, Dinozavric, Вы писали:
D>Народ, нужно сделать прогу, которая имитирует стыковку двух космических кораблей. Управление только "Назад-вперед курсором", что как бы больше-меньше подача газа...
D>Две точечки, одна вот так подлетает к другой... если скорость большая. то должна выскочить ошибка -типа какстрофа... удачно- поздравление.
D>Если кто подскажет — спаибо! Кто сделает — пузырь выкачу! Спасибо! (Питер)
Управление типа "назад-вперед курсом" придется самому делать, а ракеты получай
procedure TForm1.Button1Click(Sender: TObject);
var
myRocket1 : TRect;
myRocket2 : TRect;
bBaBah : boolean;
nSleep : integer;
begin
with myRocket1 do
begin
Left := 50;
Top := 50;
Right := 70;
Bottom := 60;
end;
with myRocket2 do
begin
Left := 150;
Top := 40;
Right := 200;
Bottom := 70;
end;
Canvas.Brush.Color := clRed;
Canvas.Rectangle(myRocket1);
Canvas.Brush.Color := clBlack;
Canvas.Rectangle(myRocket2);
bBaBah := false;
Randomize;
while not bBaBah do
begin
nSleep := Random(499) + 1;
Label1.Caption := 'Current speed is about ' + IntToStr(Round(1000/nSleep)) + ' pixel/sec';
Sleep(nSleep);
Inc(myRocket1.Left);
Inc(myRocket1.Right);
Dec(myRocket2.Left);
Dec(myRocket2.Right);
Form1.Repaint;
Canvas.Brush.Color := clRed;
Canvas.Rectangle(myRocket1);
Canvas.Brush.Color := clBlack;
Canvas.Rectangle(myRocket2);
bBaBah := (myRocket1.Right = myRocket2.Left);
Application.ProcessMessages;
end;
ShowMessage('Ba-bah!!!');
end;
Hello, Dinozavric!
D> А че за приколы такие? Коппирайты вылезают...
Потому и говорил смотри исходники.
D> И как мне её изменить-то?
Разобраться как она работает, это проще чем писать с нуля, не так ли ?
D> После моих ихменений она не запускантся...
Значит не разобрался.
Извини, у меня нет никакого желания, чтобы ты показывал преподу знаний,
каких нет.
А конце концов это и против меня в дальней перспективе сработает.
И так многие считают что Dlephi это такой Visual Basic для дураков :-E
Разберись — и пользуйся.
Хелпы почитай, FAQи.
Друзей прикалывать и с копирайтом можно.
Но хочешь диплом получить — понимай, чт опрога делает.
Она маленькая.
Писал такую на первом курсе на еще досовском Си... Даже вспоминать не хочется, ибо не то что писал с нуля, а делал дословный перевод с досовского же паскаля...
Hello, Satrapp!
S> Управление типа "назад-вперед курсом" придется самому делать
А что тамделать?
Кладем на форму TActionList
Заваодим в нем два действия, вперед/назад.
Ставим им HotKey
И запоминаем последнее нажатие в глобальной переменой.
Твою процедуру. кладем в поток или на таймер, и добавляем в нее проверку на
клавишу — если нажато, то уменьшаем/увеличиваем скорость и очищаем
переменную.
Так работал старый DOSовский Arcanoid 2
--
[tip] Fix for Outlook Express quoting: http://Arioch.nm.ru/FL/Fidolook_SL.png
E-mail is faked because of spam. the_Arioch@NM.falseDomain.ru
Здравствуйте, Dinozavric, Вы писали:
D>Две точечки, одна вот так подлетает к другой... если скорость большая. то должна выскочить ошибка -типа какстрофа... удачно- поздравление.
Гмы... Теперь ясно, чего у нас ничего на Марс сесть не может...
Hello, Dinozavric!
D> Я даже не понимаю, "кладем процедуру"
Просто как предложил Сатрап, ты нажал на кнопку, процедура побежала, и пока
не добежит до конца, форма ни на что не реагирует, включая нажатия на
кнопки.
Из этого дава выхода:
1) положить твою процедуру внутрь OnExecute отдельного потока (TvgThread,
TjvThread) или как мтеод Execute стандартного TThread (статьи по потокам в
Delphi на многих сайтах етсь — Яндекс в помощь).
Когда надо форму обновить, либо используешь tThread.Synchronize, либо (я бы
так делал) делаешь окну PostMessage (myMessage), а в окне его
перехватываешь — это тоже описано в статьях, в хелпе Дельфи, и есть
использовано в VCL, RxLib и т.д. — можно посмаотрет ьи сделать так же.
2) процедуру разбить, чтобы она не циклом бегала, а выполняла один
единственный шаг.
Тогда на форму кидаем TTimer, и из его ЩтУчусгеу вызываем процедуру.
--
[tip] Fix for Outlook Express quoting: http://Arioch.nm.ru/FL/Fidolook_SL.png
E-mail is faked because of spam. the_Arioch@NM.falseDomain.ru
Здравствуйте, Arioch, Вы писали:
A>Hello, Dinozavric!
D>> Я даже не понимаю, "кладем процедуру" A>Просто как предложил Сатрап, ты нажал на кнопку, процедура побежала, и пока A>не добежит до конца, форма ни на что не реагирует, включая нажатия на A>кнопки.
Позволю себе не согласиться с этим утверждением Именно для этих целей там и стоит ProcessMessages...
Если на форму кинуть пару кнопок "+" и "-" и расширить область видимости nSleep (закомментировав дополнительно строчки
Randomize;
...
nSleep := Random(499) + 1;
ну и добавив ненулевую инициализацию nSleep), то в обработчиках этих кнопок можно управлять скоростью... Правда при этом все будет жутко тормозить, но все же... Для учебных целей, имхо, сойдет
Здравствуйте, Dinozavric, Вы писали:
D>Так а как эта прога в ощих чертах выглядит?
В общих чертах так: кидаешь на форму Label и 3 кнопки. Первая отвечает за запуск, вторая — за уменьшение скорости, третья — за увеличение скорости. Вот примерный код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private{ Private declarations }public{ Public declarations }end;
var
Form1: TForm1;
nSleep: integer;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
myRocket1 : TRect;
myRocket2 : TRect;
bBaBah : boolean;
// nSleep : integer;begin
nSleep := 100;
with myRocket1 do
begin
Left := 50;
Top := 50;
Right := 70;
Bottom := 60;
end;
with myRocket2 do
begin
Left := 150;
Top := 40;
Right := 200;
Bottom := 70;
end;
Canvas.Brush.Color := clRed;
Canvas.Rectangle(myRocket1);
Canvas.Brush.Color := clBlack;
Canvas.Rectangle(myRocket2);
bBaBah := false;
// Randomize;while not bBaBah do
begin// nSleep := Random(499) + 1;
Label1.Caption := 'Current speed is about ' + IntToStr(Round(1000/nSleep)) + ' pixel/sec';
Sleep(nSleep);
Inc(myRocket1.Left);
Inc(myRocket1.Right);
Dec(myRocket2.Left);
Dec(myRocket2.Right);
Form1.Repaint;
Canvas.Brush.Color := clRed;
Canvas.Rectangle(myRocket1);
Canvas.Brush.Color := clBlack;
Canvas.Rectangle(myRocket2);
bBaBah := (myRocket1.Right = myRocket2.Left);
Application.ProcessMessages;
end;
ShowMessage('Ba-bah!!!');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
nSleep := nSleep + 50;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if nSleep > 50 then
nSleep := nSleep - 50;
end;
end.
Слушай, а какую версию делфи ставть тогда лучше мне? И ещё, если я это ЕХЕ-шник в делфи открою, там я твоих замечательных жуков на ракету заменить смогу, и хелп написать? Или для этого ПАСовский исходник нужен?
Здравствуйте, Dinozavric, Вы писали:
D>А че за приколы такие? Коппирайты вылезают... И как мне её изменить-то? После моих ихменений она не запускантся... это типа подстава такая?
Возможно, что нет уверенности, что твой пузырь (самолет) настоящий
Hello, Dinozavric!
D> Слушай, а какую версию делфи ставть тогда лучше мне?
По идее, от 5 до 7. Я свою написал.
D> И ещё, если я это ЕХЕ-шник в делфи открою
Я для чего исходники положил?
Еще раз повторяю, обязательно в них разберись, а лучше и переделай под себя.
Считай, что это лицензия.
Чтобы когда пошел сдавать, ты сам уже такую мог написать.
Потому и разные доп. компоненты использую — поработать тебюе придется.
А не захочешь — сам себе Буратино.