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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2010, 12:44   #11
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

SERG1980, почти то, что нужно. Есть маленький нюанс: Когда квадратик касается кружочка и когда кружочек вписывается в квадрат, то при движении квадрата назад, кружочек не остается, а затирается и исчезает. Как исправить сей нюанс?)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 30.04.2010, 14:05   #12
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

ну если по самому простому то добавте эту строку
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Form1.Image1.Canvas.Ellipse(xe,ye,xe+de,ye+de);
 case key  of
........
SERG1980 вне форума Ответить с цитированием
Старый 30.04.2010, 15:38   #13
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

SERG1980, круто, спасибо за ликвидацию этого нюанса). А вот есть еще несколько вопросов по теме:
1. Как восстановить первоначальные размеры квадратика после того как "покинул" окружность?
Пробовал так:
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 Form1.Image1.Canvas.Ellipse(xe,ye,xe+de,ye+de);
 form1.Image1.Canvas.FillRect(form1.Image1.Canvas.ClipRect);
 Form1.Image1.Canvas.Pen.Color:=clRed;
 Form1.Image1.Canvas.Brush.Style:=bsClear;
 Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);

 case key  of
........
не сработало
2. Почему если квадратик "наползает" на окружность с любой из четырех сторон, то подниматься обратно он может только вверх?
3. Можно ли как-то отследить момент, когда окружность будет вписана в квадратик? Например, пусть квадратик "наткнулся" на первую окружность, в куда-нибудь Label1 занеслось "1". Второй раз квадратик коснулся какой-то другой окружности, то в Label1 занеслось уже "2" и т.д.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 30.04.2010, 21:32   #14
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

К сожалению у меня нет сейчас перед собой ни проекта ни delphi.
По вопросу 3 можно сделать следующее. В проекте есть процедура Podgon (помоему так), так вот в конец этой процедуры можно завести счётчик попаданий в окружность и выводить это значение в лэйбл.
Код:
var p:integer;//глобальная
....
inc(p);
form1.label1.caption:='ляляля '+inttostr(p);
а по астальному надо пошаманить над исходником, которого у меня сейчас нет
SERG1980 вне форума Ответить с цитированием
Старый 01.05.2010, 02:00   #15
RAZOR3
Пользователь
 
Регистрация: 25.04.2010
Сообщений: 38
По умолчанию

по 2 вопросу - все из-за проверки координат при нажатии клавишь
вот так вроде нормально:
Код:
VK_LEFT: begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            xr:=xr-1;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if (xr=xe+de)and((yr+hr>=ye)and(yr<=ye+de)) then Podgon;
           end;
  VK_RIGHT:begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            xr:=xr+1;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if (xr+wr=xe)and((yr+hr>=ye)and(yr<=ye+de)) then Podgon;
           end;
  VK_UP:   begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            yr:=yr-1;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if (yr=ye+de)and((xr+wr>=xe)and(xr<=xe+de)) then Podgon;

           end;
  VK_DOWN: begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            yr:=yr+1;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if (yr+hr=ye)and((xr+wr>=xe)and(xr<=xe+de)) then Podgon;
           end;
  VK_RETURN: Rasstanovka;
RAZOR3 вне форума Ответить с цитированием
Старый 01.05.2010, 16:34   #16
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

RAZOR3, применил то, что Вы посоветовали, но окружность вписывается только когда, квадратик наползает сверху на кружок.
Код:
Код:
  VK_LEFT: begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            xr:=xr-3;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if (xr=xe+de)and((yr+hr>=ye)and(yr<=ye+de)) then Podgon;
           end;
  VK_RIGHT:begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            xr:=xr+3;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if (xr+wr=xe)and((yr+hr>=ye)and(yr<=ye+de)) then Podgon;
           end;
  VK_UP:   begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            yr:=yr-3;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if (yr=ye+de)and((xr+wr>=xe)and(xr<=xe+de)) then Podgon;

           end;
  VK_DOWN: begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            yr:=yr+3;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if (yr+hr=ye)and((xr+wr>=xe)and(xr<=xe+de)) then Podgon;
           end;
  VK_RETURN: Rasstanovka;//нажали Enter
??
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.05.2010, 01:45   #17
RAZOR3
Пользователь
 
Регистрация: 25.04.2010
Сообщений: 38
По умолчанию

может так. конечно вариант не очень
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var colision: boolean;
  begin
 case key  of
  VK_LEFT: begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            xr:=xr-3;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if colision=True then exit;
            if (xr>=xe+de)and((yr+hr>=ye)and(yr<=ye+de)) then begin
            Colision:=true;
            Podgon;
            end;
           end;
  VK_RIGHT:begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            xr:=xr+3;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if colision=True then exit;
            if (xr+wr>=xe)and((yr+hr>=ye)and(yr<=ye+de)) then begin
            Colision:=true;
            Podgon;
            end;
           end;
  VK_UP:   begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            yr:=yr-3;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if colision=True then exit;
            if (yr>=ye+de)and((xr+wr>=xe)and(xr<=xe+de)) then begin
            Colision:=true;
            Podgon;
            end;
           end;
  VK_DOWN: begin
            Form1.Image1.Canvas.Pen.Color:=Image1.Canvas.Pixels[1,1];
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            yr:=yr+3;
            Form1.Image1.Canvas.Pen.Color:=clred;
            Form1.Image1.Canvas.Rectangle(xr,yr,xr+wr,yr+hr);
            if colision=True then exit;
            if (yr+hr>=ye)and((xr+wr>=xe)and(xr<=xe+de)) then begin
            Colision:=true;
            Podgon;
            end;
           end;
  VK_RETURN: Rasstanovka;//íàæàëè Enter
 end;
end;
RAZOR3 вне форума Ответить с цитированием
Старый 03.05.2010, 06:32   #18
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

RAZOR3, применив Ваш код, получил следующее:

Придвижении квадратика сверху вниз, т.е. нажатие VK_DOWN:
квадратик, достигнув кружочка "вписывает" в себя кружок и счетчик увеличивается при каждом последующем нажатии на клавишу VK_DOWN, а квадратик с места не сдвигается, а должен по идее двигаться дальше вниз и восстанавливать свои размеры. Сдвигается квадратик только влево, при нажатии на клавишу VK_LEFT.

Придвижении квадратика сверху вниз, т.е. нажатие VK_RIGHT:
квадратик, достигнув кружочка "вписывает" в себя кружок и счетчик увеличивается при каждом последующем нажатии на клавишу VK_RIGHT, а квадратик с места не сдвигается, а должен по идее двигаться дальше вниз и восстанавливать свои размеры. Сдвигается квадратик только влево, при нажатии на клавишу VK_LEFT.

Придвижении квадратика сверху вниз, т.е. нажатие VK_LEFT:
если квадратик не находится на одной линии с кружочком, то двигается вроде нормарльно, влево. А если квадратик оказывается на одной линии с кружочком, то при нажатии клавиши VK_LEFT, квадратик после первого же нажатия "вписывает" в себя кружок и счетчик увеличивается при каждом последующем нажатии на клавишу VK_RIGHT, а квадратик с места не сдвигается, а должен по идее двигаться дальше вниз и восстанавливать свои размеры. Сдвигается квадратик только влево, при нажатии на клавишу VK_LEFT.

Придвижении квадратика сверху вниз, т.е. нажатие VK_UP:
квадратик, достигнув кружочка "вписывает" в себя кружок и счетчик увеличивается при каждом последующем нажатии на клавишу VK_UP, а квадратик с места не сдвигается, а должен по идее двигаться дальше вниз и восстанавливать свои размеры. Сдвигается квадратик только влево, при нажатии на клавишу VK_LEFT.


Где в коде все это прописывается вообще??
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.05.2010, 08:05   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю свой вариант (из колледжа)
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
   function collis:boolean;
  end;
  const sr=100;
var r:integer;
   sq,circ:TPoint;
  Form1: TForm1;

implementation

{$R *.dfm}
  function TForm1.collis:boolean;
  begin
   if
     (abs(sq.Y-circ.Y)<(sr+r))
     and
     (abs(sq.X-circ.X)<(sr+r))
   then r:=sr else r:=50;
  end;
procedure TForm1.FormPaint(Sender: TObject);
begin
  collis;
  Canvas.Brush.Style:=bsClear;
  Canvas.Rectangle(sq.X-sr,sq.Y-sr,sq.X+100,sq.Y+sr);
  canvas.Ellipse(circ.X-r,circ.y-r,circ.X+r,circ.Y+r);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 case key of
  VK_LEFT:dec(SQ.X,10);
  VK_RIGHT:inc(SQ.X,10);
  VK_UP:dec(SQ.y,10);
  VK_DOWN:inc(SQ.y,10);
 end;
 Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 circ.X:=Width div 2;
 circ.Y:=Height div 2;   r:=50;

end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  SQ.X:=x;sq.Y:=y;  Repaint;
end;

end.
Единственный недочет - круг сдесь образмериваеть нужно тригонометрическими функциями, а не прямоугольными границами из команды Ellipse, тогда будет точнее коллизия вычисляться
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.05.2010, 08:27   #20
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Stilet, возникло несколько вопросов:
1. Где задаются размеры окружности и квадрата?
2. Почему при наведении квадрата на окружность, она не вписывается в него?)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение dampirik Общие вопросы C/C++ 15 10.10.2009 18:47
движение alex(21) Паскаль, Turbo Pascal, PascalABC.NET 9 20.08.2009 00:08
Броуновское движение DEVIL666 Общие вопросы C/C++ 6 21.03.2009 18:17
Движение Mickle Общие вопросы Delphi 5 19.04.2007 23:24