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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2010, 00:17   #1
Oldcentre
Пользователь
 
Аватар для Oldcentre
 
Регистрация: 16.11.2010
Сообщений: 16
По умолчанию Изменение координат по таймеру [Delphi]

Имеются: круг типа TShape, таймер и форма. Надо, чтобы круг двигался по таймеру и отскакивал от стен.
Мой вариант происходящего (не очень работает):
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if
Ball.left=0
then
Ball.left:=ball.left+2;
if
Ball.top=0
then
ball.Top:=ball.Top+2;
if
Ball.left=320
then
Ball.left:=ball.left+2;
if
Ball.top=320
then
ball.Top:=ball.Top-2;

end;
end.
При таком раскладе круг просто стоит на месте.
Oldcentre вне форума Ответить с цитированием
Старый 20.11.2010, 10:22   #2
Ivan_Susanin
Пользователь
 
Регистрация: 15.04.2007
Сообщений: 20
По умолчанию

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// изменение координат 
ball.left:=ball.left+SpeedX;
ball.top:=ball.top+SpeedY;

// отскок
if Ball.left<=0    then SpeedX:=-SpeedX;
if Ball.top<=0    then SpeedY:=-SpeedY;
if Ball.left=>320 then SpeedX:=-SpeedX;
if Ball.top=>320 then SpeedY:=-SpeedY;

end;
Ivan_Susanin вне форума Ответить с цитированием
Старый 20.11.2010, 10:48   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

to Ivan_Susanin
еще добавить собственно отражение (кроме смены скорости) при выходе за границы
иначе может кратковременно(на один такт) выскочить за пределы области.

Код:
if ball.left>maxleft then 
begin 
  ыpeedx:= - speedx; 
  ball.left:=ball.left - maxleft; 
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 20.11.2010, 13:31   #4
Oldcentre
Пользователь
 
Аватар для Oldcentre
 
Регистрация: 16.11.2010
Сообщений: 16
По умолчанию

Код:
if Ball.left<=0    then SpeedX:=-SpeedX;
Выкидывает ошибку. Где-то надо объявить speedX? И как?
Oldcentre вне форума Ответить с цитированием
Старый 20.11.2010, 14:50   #5
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Ну это же просто приращение в пикселях. Можно поставить единицу - будет плавно летать, можно поставить 10 - будет рывками скакать. Объявить можно глобально, да где угодно вообще:
Код:
var
speedx : integer = 1;
speedy : integer = 1;
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 20.11.2010, 14:51   #6
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от Oldcentre Посмотреть сообщение
Код:
if Ball.left<=0    then SpeedX:=-SpeedX;
Выкидывает ошибку. Где-то надо объявить speedX? И как?
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var speedx,speedy:integer;
begin
speedx:=10;
speedy:=10;
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 20.11.2010, 15:21   #7
Oldcentre
Пользователь
 
Аватар для Oldcentre
 
Регистрация: 16.11.2010
Сообщений: 16
По умолчанию

Теперь его не устраивает MaxLeft.
Я пробовал объявить его как 320, но тогда эффект получается совсем не такой, какой нужно.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var speedx,speedy, maxleft:integer;
begin
speedx:=10;
speedy:=10;
maxleft:=320;
ball.left:=ball.left+Speedx;
ball.top:=ball.top+SpeedY;
if Ball.left<=0  then SpeedX:=-SpeedX;
if Ball.top<=0  then SpeedY:=-SpeedY;
if Ball.left=320 then SpeedX:=-SpeedX;
if Ball.top=320 then SpeedY:=-SpeedY;
if ball.left>maxleft then
begin
  speedx:= - speedx;
  ball.left:=ball.left - maxleft;
end;
end;

end.
Круг доходит до искомой точки, затем резко выбрасывается влево и продолжает тот же путь.
Как грамотно объявить maxleft, чтобы его не переносило резко влево?
Oldcentre вне форума Ответить с цитированием
Старый 20.11.2010, 15:55   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

попробуйте хотя бы раз повторить за комьютером то что вы написали.
breakpoint $ F8
Код:
if Ball.left<=0  then SpeedX:=-SpeedX;
if Ball.top<=0  then SpeedY:=-SpeedY;
if Ball.left=320 then SpeedX:=-SpeedX;
if Ball.top=320 then SpeedY:=-SpeedY;
if ball.left>maxleft{320} then
begin
  speedx:= - speedx;
  ball.left:=ball.left - maxleft;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.11.2010 в 15:58.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
статья - Применение изометрических координат в Delphi Pblog Обсуждение статей 0 23.06.2010 05:13
Срабатывание датчика по таймеру RockForr Общие вопросы Delphi 8 26.05.2009 16:32
COM, TThread, обращение по таймеру Антон Ю.Б. Общие вопросы Delphi 2 17.02.2009 09:23
Автосохранения по таймеру ScreN Общие вопросы Delphi 13 09.01.2009 18:49
создание координат по заданному изображению в Delphi ludmila2008 Компоненты Delphi 3 22.07.2008 11:24