Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
 
PolKulo
1 / 1 / 0
Регистрация: 18.05.2015
Сообщений: 63
#1

Останавливать программу при соприкосновении двух Image - Delphi

21.05.2015, 11:47. Просмотров 1204. Ответов 25
Метки нет (Все метки)

Как сделать так что бы Image когда дотронится с другой Image программа останавливалось (Flappy bird) птичка с трубой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2015, 11:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Останавливать программу при соприкосновении двух Image (Delphi):

Надо что бы при нажатии на какой либо Image с картинкой, картинка перекидывалась в пусто Image, а Image на который нажали исчезал. - Delphi
Имеется 4 Image в 3 из них находятся картинки, а 4 пустой. Надо что бы при нажатии на какой либо Image с картинкой, картинка перекидывалась...

Ping-Pong. Вывести надпись Game Over при соприкосновении мячика с полем - Delphi
Сделала Игру на Delphi. Но появилась одна загвоздка.Нужно, чтобы при соприкосновении с полем мячика выходила надпись Game Over.Помогите...

Drag and Drop с Image. Растягивает окно при перемещении Image - Delphi
Растягивает окно формы при перемещении Image. Как избавится от такого недуга )

При нажатии на Image построить линию к другому выбранному Image - Delphi
Всем доброго времени суток. Собственно сделано перемещение Image'ов. Нужно сделать следующее: при нажатии на Image1 началась строиться...

Работа с координатами на двух Image - Delphi
Вопрос не столько по программированию, прошу простить. Есть image1 и image2(image2 лежит поверх image1). Оба компонента находятся в...

Останавливать кнопку, движущуюся по таймеру, на определённых позициях - Delphi
Есть кнопка, которая по таймеру нажимает на себя и движется вправо. Мне нужно останавливать её на определённых позициях. Написал так: ...

25
Joey
21.05.2015, 20:39     Останавливать программу при соприкосновении двух Image
  #16

Не по теме:

Ого, NIKOLAYY постарался)) даже поиграть интересно))

0
PolKulo
1 / 1 / 0
Регистрация: 18.05.2015
Сообщений: 63
21.05.2015, 21:03  [ТС] #17
NIKOLAYY, Joey, Спасибо вам огромное))
0
PolKulo
1 / 1 / 0
Регистрация: 18.05.2015
Сообщений: 63
28.05.2015, 19:13  [ТС] #18
Joey, Здравствуйте. Вы помогали мне с игрой Флаппи бёрд. Исходник который скинул Николай. Я в нём разобрался. Переделал немного, убрал всё лишнее для меня. Но столкнулся с проблемой. При нажатии в меню На (new game) птица пропадает. Не могу исправить. Я думою дело в анимации которую делал Николай. Но в переделенном исходнике нет анимации. Можете помочь. Вот архив посмотрите пожалуйста. Заранее спасибо.
0
Вложения
Тип файла: rar Flappy Bird.rar (260.6 Кб, 7 просмотров)
Joey
Модератор
700 / 440 / 117
Регистрация: 05.05.2015
Сообщений: 2,576
Записей в блоге: 1
28.05.2015, 20:37 #19
Так у тебя же по клику на New game стоит код
Delphi
1
Ptisa.Picture := nil;
Удали эту строчку

И в процедуре Timer1Timer у тебя есть такое место:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
if (Components[i] as TImage).Name <> 'Ptisa' then
        if IntersectRect(DestRect, Ptisa.BoundsRect, (Components[i] as
          TImage).BoundsRect) then
        begin
          Ptisa.Picture := nil;
          Ptisa.Width := 24;
          Ptisa.Height := 34;
          Ptisa.Left := Ptisa.Left + 10;
 
          Timer1.Enabled := False;
          Timer2.Enabled := False;
        end;
Здесь тоже убери Ptisa.Picture := nil;

Теперь все работает, и при щелчке на меню New game спокойно запускается новая игра и птичка возвращается на произвольное место. Единственная потеря - птичка не исчезает при столкновении. Если надо, чтобы она исчезала, просто напиши Ptisa.Visible:=false там, где мы удалили Ptisa.Picture:=nil в процедуре Timer1Timer, а в обработчике клика по меню New game вместо удаленной такой же строчки напиши Ptisa.Visible:=true;

Теперь все прекрасно работает, при столкновении птичка пропадает, а при щелчке на New game снова появляется )
Удачи, прикольная игрушка)

Не по теме:

Правда сложная, вот если бы чуть медленнее



Добавлено через 7 минут
На, на всякий случай, если легче, вот весь код

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;
 
type
  TForm1 = class(TForm)
    Fon: TImage;
    Trniz1: TImage;
    Trniz2: TImage;
    Trniz3: TImage;
    Trniz4: TImage;
    Trverh1: TImage;
    Trverh2: TImage;
    Trverh3: TImage;
    Trverh4: TImage;
    Ptisa: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    bord: TImage;
    Label1: TLabel;
    MainMenu1: TMainMenu;
    FlappyBird1: TMenuItem;
    NewGame1: TMenuItem;
    Complexity1: TMenuItem;
    Author1: TMenuItem;
    Howtoplay1: TMenuItem;
    Exit1: TMenuItem;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Label1Click(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure NewGame1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
const
  zazor = 120; //зазор между трубами
  nzaz = 180; //начало зазора (по нижней трубе)
var
  Form1: TForm1;
  DestRect: TRect;
  i, j, n: Integer;
  Ptiniz:boolean;
  Ptish:integer;
  Ptiinc:integer;
implementation
 
{$R *.dfm}
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.DoubleBuffered:=true;
 
  if bord.Left * -1 = Form1.ClientWidth then
  begin
    //кончился бордюр, запустим его сначала
    bord.Left := 0;
  end;
if Trniz1.Left + Trniz1.Width = 0 then
  begin
    Trniz1.Left := Form1.ClientWidth;
    Trniz1.Top := nzaz + Random(200); //150 это от верха начало
 
    Trverh1.Left := Form1.ClientWidth;
    Trverh1.Top := Trniz1.Top - 300 - zazor;
  end;
 
  if Trniz2.Left + Trniz2.Width = 0 then
  begin
    Trniz2.Left := Form1.ClientWidth;
    Trniz2.Top := nzaz + Random(200); //100 это от верха начало
 
    Trverh2.Left := Form1.ClientWidth;
    Trverh2.Top := Trniz2.Top - 300 - zazor;
  end;
 
  if Trniz3.Left + Trniz3.Width = 0 then
  begin
    Trniz3.Left := Form1.ClientWidth;
    Trniz3.Top := nzaz + Random(200); //100 это от верха начало
 
    Trverh3.Left := Form1.ClientWidth;
    Trverh3.Top := Trniz3.Top - 300 - zazor;
  end;
 
  if Trniz4.Left + Trniz4.Width = 0 then
  begin
    Trniz4.Left := Form1.ClientWidth;
    Trniz4.Top := nzaz + Random(200); //100 это от верха начало
 
    Trverh4.Left := Form1.ClientWidth;
    Trverh4.Top := Trniz4.Top - 300 - zazor;
  end;
  for i := 1 to ComponentCount - 1 do
    if Components[i] is TImage then
    begin
//двигаем трубы
      if (Components[i] as TImage).Name <> 'knopka' then
        if (Components[i] as TImage).Name <> 'Ptisa' then
          if (Components[i] as TImage).Name <> 'Fon' then
            (Components[i] as TImage).Left := (Components[i] as TImage).Left -
              2;
 
      ////////////////////////////////////////////
 
      if (Components[i] as TImage).Name <> 'Ptisa' then
        if IntersectRect(DestRect, Ptisa.BoundsRect, (Components[i] as
          TImage).BoundsRect) then
        begin
          //Ptisa.Picture := nil;
          Ptisa.Visible:=false;
          Ptisa.Width := 24;
          Ptisa.Height := 34;
          Ptisa.Left := Ptisa.Left + 10;
 
          Timer1.Enabled := False;
          Timer2.Enabled := False;
        end;
 
    end;
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
//вниз летит
  if Ptiniz = True then
  begin
    Timer2.Interval := 30; //быстрее скорость
    Inc(Ptish);
    Ptisa.Top := Ptisa.Top + Ptish;
end;
 
//вверх летит
  if Ptiniz = False then
  begin
    Timer2.Interval := 10;
    Inc(Ptiinc);
    Ptisa.Top := Ptisa.Top - 4;
 
    if Ptiinc = 10 then
    begin
      Ptiniz := True;
      Ptiinc := 0;
    end;
 
  end;
 
end;
 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 
//вверхняя стрелка
  if (key = VK_UP) or (key = VK_SPACE) then
  begin
    Ptiniz := False; //нажали вверх летим
    Ptish := 0; //счетчик низ на ноль
 
    //нижняя стрелка
  if (key = VK_DOWN) then
    Ptisa.Top := Ptisa.Top + 16;
 
    end;
 
end;
procedure TForm1.Label1Click(Sender: TObject);
begin
Timer1.Enabled := True;
Timer2.Enabled := True;
Label1.visible := False;
end;
 
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;
 
procedure TForm1.NewGame1Click(Sender: TObject);
begin
 
  Timer1.Enabled := True;
  Timer2.Enabled := True;
  Label1.Visible := False;
 
  Trniz1.Left := 484;
  Trniz2.Left := 634;
  Trniz3.Left := 784;
  Trniz4.Left := 934;
 
  Trverh1.Left := 484;
  Trverh2.Left := 634;
  Trverh3.Left := 784;
  Trverh4.Left := 934;
 
  Ptisa.Left := 184;
  Ptisa.Top := 154;
 
  //Ptisa.Picture := nil;
  Ptisa.Visible:=true;
  Ptisa.Width := 34; //ширина
  Ptisa.Height := 24;
 
  bord.Left := 0;
end;
 
end.
1
PolKulo
1 / 1 / 0
Регистрация: 18.05.2015
Сообщений: 63
28.05.2015, 20:43  [ТС] #20
Joey, Спасибо большое! обратно вы выручили)
0
NIKOLAYY
816 / 716 / 160
Регистрация: 22.09.2012
Сообщений: 4,985
28.05.2015, 22:20 #21
PolKulo,
Добавил Рекорд (количество пролетевших труб) и уменьшил скорость самой игры там в исходе коменнтарий расписал.
1
Вложения
Тип файла: rar Flappy Bird.rar (269.2 Кб, 4 просмотров)
PolKulo
1 / 1 / 0
Регистрация: 18.05.2015
Сообщений: 63
05.06.2015, 21:21  [ТС] #22
NIKOLAYY, Здравствуйте Николай. Это я с Флаппи Бёрд . У же готов сдавать работу. Прошу о помощи? В коде в целом я разобрался процедуры опишу, расскажу что да как. Но я не очень понимая пару частей кода. Можете ли вы мне описать их поподробнее что означает каждое слова. Препады очень придираются, боюсь не отвечу. Я скину код. И выделю части которые не понятны. Заранее спасибо за помощь
0
Вложения
Тип файла: rar Flappy Bird.rar (278.8 Кб, 3 просмотров)
NIKOLAYY
816 / 716 / 160
Регистрация: 22.09.2012
Сообщений: 4,985
06.06.2015, 08:34 #23
PolKulo,
Вот за этот кусок кода что ли?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 //вниз летит
  if Ptiniz = True then
  begin
    Timer2.Interval := 30; //быстрее скорость
    Inc(Ptish);
    Ptisa.Top := Ptisa.Top + Ptish;
  end;
 //вверх летит
  if Ptiniz = False then
  begin
    Timer2.Interval := 10;
    Inc(Ptiinc);
    Ptisa.Top := Ptisa.Top - 4;
 
    if Ptiinc = 10 then
    begin
      Ptiniz := True;
      Ptiinc := 0;
    end;
  end;
Я сча непомню я давно же писал этот код, но смысл кода помню, Когда птица летит вниз я делал так что бы не просто вниз летела, а с ускорением. Код то как бы мой на сто процентов но птица летела с ускорением вниз!
Сча если по по деталям его разобрать нужно "шевелить" все переменные спроси лучше у krapotkin или у northener че там значит по деталям этот код то!
1
PolKulo
1 / 1 / 0
Регистрация: 18.05.2015
Сообщений: 63
06.06.2015, 14:05  [ТС] #24
krapotkin, Здравствуйте мне вас посоветовал NIKOLAYY он мне скинул исходник с Flappy Bird но так как он делай игру очень давно (я его попросил поподробнее описать часть кода описать пока не может). Я её передал убрал лишнего. Но часть кода не понимаю . Можете ли вы мне помочь. Заранее спасибо
0
Вложения
Тип файла: rar Курсавая-Flappy Bird.rar (279.4 Кб, 4 просмотров)
Joey
Модератор
700 / 440 / 117
Регистрация: 05.05.2015
Сообщений: 2,576
Записей в блоге: 1
06.06.2015, 14:51 #25
PolKulo, Components[] - это массив, который содержит указатели на ВСЕ компоненты твоего проекта. if (Components[i] as TImage) означает Компонент индекса i, рассматриваемый как объект TImage (так надо, приходится объяснять программе, какого типа компонент). У каждого компонента i, увеличивая i на единицу, проверяем имя. Таким образом мы пробегаемся по всем компонентам программы, и смотрим, если данный компонент не Ptisa и если он TImage, то проверяем intersect - то есть пересечение

Это я, конечно, грубо объяснил, пытался сделать доступнее для новичка
1
NIKOLAYY
816 / 716 / 160
Регистрация: 22.09.2012
Сообщений: 4,985
09.06.2015, 20:43 #26
PolKulo,
Таймер-1 отвечает за движение птицы вверх и вниз она только вертикально может двигаться.
Таймер-2 отвечает за движение труб, они постоянно двигаются влево и только горизонтально.

Птица не летит вперед как ты понял, она стоит на месте а движется сам фон, вернее бордюр и трубы, таким образом кажется что птица летит горизонтально.

Ну там тебе Joey обьяснил правильно за тот кусок кода, и вот в этом месте мы мы проверяем имагу что бы она была не птицей иначе птица так же будет двигаться влево вместе с трубами!
Delphi
1
2
3
  //двигаем трубы
    if (Components[i] as TImage).Name <> 'Ptisa' then
       (Components[i] as TImage).Left := (Components[i] as TImage).Left - 2;
Этот код что выше он немного сложнее он в цикле проверяет все компоненты имаги в которых заложены трубы и двигает их влево. Ну иначе можно переписать этот код на более простой с гораздо более количеством строк типа Image6.Left := Image6.Left -2; но тогда двигать придется каждую имагу-трубу в отдельности!

Ну код ниже я тебе его раскомментировал
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   // От отсюда. Пробавал упростить код своим . Но не очень играбельно станавилось.
   // А в вашем  не очень понимаю   что за что отвечает.
 
 //вниз летит
 //если птица летит вниз, а она постоянно летит вниз если пробел не нажимать
 //то все настройки по полету птицы вверх тут работать не должны стоит флаг Ptiniz = True
  if Ptiniz = True then
  begin
    Timer2.Interval := 30; //быстрее скорость
    Inc(Ptish); //счетчик для ускорения
    Ptisa.Top := Ptisa.Top + Ptish; //летит вниз с ускорением так как счетчик Ptish работает
  end;
  
 //вверх летит
 //если птице разрешено лететь вверх, а оно разрешено если была нажата клавиша пробел
  if Ptiniz = False then
  begin
    Timer2.Interval := 10; //изменяем интервал таймера
    Inc(Ptiinc); //отсчитывает счетчик сколько птице можно подлететь вверх (10 сработок таймера)
    Ptisa.Top := Ptisa.Top - 4; //подлетает вверх
 
 //птице нельзя постоянно лететь вверх после то как ты нажал кнопку пробел
 //она должна немного подлететь и снова падать вниз если таймер тикнул 10 раз то 
 //включам флаг, ну или дирикторию полета птицы на низ! Птица снова летит вниз!
 //переменную счетчик возвращаем в исходное состояние делаем ему ноль Ptiinc := 0
    if Ptiinc = 10 then
    begin
      Ptiniz := True; //прошло 10 сработок таймера, пора птицу опускать вниз 
      Ptiinc := 0; //счетчик на ноль
    end;
  end;
 
  //до сюда
Зря ты там оба таймера ставиш на 1, там ведь все от него завязано по моим подсчетам птица должна подлетать вверх 0,3 секунды затем лететь вниз, а по твоим получается 0,01 сотую она тока вверх подлетает!

Ну или меняй тогда значения счетчков, там где у меня до 10 отсчитывал выше в коде, ты сделай до 100!
Все настройки по интервалу времени таймеров и по разным счетчкам что в программу засунул я подбирал на "глаз".
2
09.06.2015, 20:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2015, 20:43
Привет! Вот еще темы с ответами:

Image 1 под Image 2 и Image 3 как заставить его работать как кнопку? - Delphi
Имеется несколько Image, все они расположены друг на друге, Image используемый как кнопка перестаёт работать когда поверх него расположен...

ListBox, Label, Image составить программу вывода - Delphi
Не понимаю работу с Listboxom, не могу вывести Item (строку), в Label (через caption), и картинку при щелчке мыши каждой строки...

Image мерцает при перетаскивании - Delphi
Подскажите что нужно прописать??? Я сделал что бы image1 можно было перетаскивать, но когда я его перетаскиваю он мерцает как убрать это...

Размещение объектов в пределах формы и отражение двух объектов при соприкосновении - Visual Basic
Помогите с задачей, чтобы круг летал по форме и соприкасаясь с квадратом отталкивался от него. Shape2.Top = Shape2.Top - 50 End If If...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.