Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.09.2009, 20:17
RayOfLight RayOfLight вне форума
Прохожий
 
Регистрация: 27.09.2009
Сообщения: 11
Репутация: 10
Вопрос Определение координат клика. Игра "Жизнь".

Как определить координаты клика по TImage ?

Последний раз редактировалось RayOfLight, 30.09.2009 в 22:52.
Ответить с цитированием
  #2  
Старый 27.09.2009, 21:16
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Без события MouseMove никакой клик не обойдется.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 27.09.2009, 23:07
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Код:
procedure TForm1.Image1Click(Sender: TObject);
var
  pt: TPoint;
begin
  GetCursorPos(pt);
  pt := ScreenToClient(pt);
  ShowMessage('Coordinates: X=' + IntToStr(pt.X - Image1.Left) +
              ' Y=' + IntToStr(pt.Y - Image1.Top));
end;

Ой!
Код:
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ShowMessage('Coordinates: X=' + IntToStr(X) +
              ' Y=' + IntToStr(Y));
end;

Последний раз редактировалось Nyctos Kasignete, 27.09.2009 в 23:11.
Ответить с цитированием
  #4  
Старый 28.09.2009, 00:08
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

Код:
pt := Image1.ScreenToClient(pt);
Вот так =)
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
  #5  
Старый 30.09.2009, 22:49
RayOfLight RayOfLight вне форума
Прохожий
 
Регистрация: 27.09.2009
Сообщения: 11
Репутация: 10
По умолчанию

Спасибо
Дело в том, что мне надо написать игру "Жизнь" Джона Конвея. Программа работает правильно только первый ход, а дальше идут какие-то ошибки (клетки расставляются не так, элементарный glider не получается).

Может, подскажете мне, что у меня не так? Алгоритм сыроват, правда

Привожу код всей программы:

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Field: TImage;
    Panel1: TPanel;
    StartButton: TButton;
    StopButton: TButton;
    ClearButton: TButton;
    ExitButton: TButton;
    MainTimer: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FieldClick(Sender: TObject);
    procedure ExitButtonClick(Sender: TObject);
    procedure StartButtonClick(Sender: TObject);
    procedure MainTimerTimer(Sender: TObject);
    procedure StopButtonClick(Sender: TObject);
    procedure ClearButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    fa:array[0..11,0..11] of byte;
    fanew:array[0..11,0..11] of byte;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
  var i,j:integer;
begin
  {Рисование клеток}
  for i:=0 to 11 do begin
  for j:=0 to 11 do begin
    fa[i,j]:=0;
    fanew[i,j]:=0;
    Field.Canvas.Rectangle(i*20, j*20, i*20+20, j*20+20);
  end;
  end;
end;

procedure TForm1.FieldClick(Sender: TObject);
  var x, y, z1, z2:integer;
begin
{Определяем координаты курсора над изображением}
x:=Mouse.CursorPos.X;
y:=Mouse.CursorPos.Y;

z1 := trunc((x - Form1.Left - Field.Left) / 20);
z2 := trunc((y - Form1.Top - Field.Top) / 20);

{Закрашиваем клетки}
case fa[z1,z2] of
  1:begin
    fa[z1,z2]:= 0;
    Field.Canvas.Brush.Color := clWhite;
    Field.Canvas.FloodFill(z1*20+1, z2*20+1, clRed, fsSurface);
    Field.Refresh;
  end;

  0: begin
    fa[z1,z2] := 1;
    Field.Canvas.Brush.Color := clRed;
    Field.Canvas.FloodFill(z1*20+1,z2*20+1,clWhite,fsSurface);
    Field.Refresh;
  end;
end;

end;

{Выход}
procedure TForm1.ExitButtonClick(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.StartButtonClick(Sender: TObject);
  var i,j,k:integer;
begin
{Считаем количество поставленных фишек на поле}
{Если на поле нет фишек, выводим сообщение}
{Если фишки расставлены, запускаем таймер}
  k:=0;
  for i:=0 to 11 do for j:=0 to 11 do k := k + fa[i,j];
  if k = 0 then begin
    MessageBox(0,'На поле нет ни одной фишки.','Ошибка!',MB_OK);
  end
  else begin
    MainTimer.Enabled := true;
    StopButton.Enabled := true;
    ClearButton.Enabled := false;
  end;

end;

procedure TForm1.MainTimerTimer(Sender: TObject);
  var i,j,n:integer;
begin

{Проверяем кол-во соседей вокруг каждой клетки и заполняем второй массив}
for i:=1 to 10 do begin
for j:=1 to 10 do begin
  if (fa[i,j]=2) then fa[i,j]:=1;
  n:= fa[i-1,j-1] + fa[i-1,j] + fa[i-1,j+1] + fa[i,j-1] + fa[i,j+1] + fa[i+1,j-1] + fa[i+1,j] + fa[i+1,j+1];
  if (fa[i,j]=1) and ((n<>2) and (n<>3)) then fanew[i,j]:=0;
  if (fa[i,j]=1) and ((n=2) or (n=3)) then fanew[i,j]:=2;
  if (fa[i,j]=0) and (n=3) then fanew[i,j]:=1;
end;
end;

for i:=1 to 10 do begin
for j:=1 to 10 do begin
  fa[i,j] := 0;
end;
end;

Field.Canvas.Brush.Color := clWhite;
for i:= 0 to 11 do begin
for j:= 0 to 11 do begin
  Field.Canvas.FloodFill(i*20+1, j*20+1, clRed, fsSurface);
end;
end;

for i:=1 to 10 do begin
for j:=1 to 10 do begin
  fa[i,j] := fanew[i,j];
  fanew[i,j]:=0;
  case fa[i,j] of
    0: begin
      Field.Refresh;
      end;
    1: begin
      Field.Canvas.Brush.Color := clRed;
      Field.Canvas.FloodFill(i*20+1,j*20+1,clWhite,fsSurface);
      Field.Refresh;
      end;
    2: begin
      Field.Canvas.Brush.Color := clRed;
      Field.Canvas.FloodFill(i*20+1,j*20+1,clWhite,fsSurface);
      Field.Refresh;
      end;
  end;
  
end;
end;

end;

procedure TForm1.StopButtonClick(Sender: TObject);
begin
  MainTimer.Enabled := false;
  StartButton.Enabled := true;
  ClearButton.Enabled := true;
end;

procedure TForm1.ClearButtonClick(Sender: TObject);
  var i,j:byte;
begin
  Field.Canvas.Brush.Color := clWhite;
  for i:= 0 to 11 do begin
  for j:= 0 to 11 do begin
    Field.Canvas.FloodFill(i*20+1, j*20+1, clRed, fsSurface);
    fa[i,j] := 0;
    fanew[i,j] := 0;
  end;
  end;
  Field.Refresh;

end;

end.
Ответить с цитированием
  #6  
Старый 01.10.2009, 18:54
Аватар для -sanya-
-sanya- -sanya- вне форума
Новичок
 
Регистрация: 14.04.2009
Сообщения: 64
Репутация: 20
Подмигивание

тот-же
y:=Mouse.CursorPos.Y; //определяет общее положение курсора

попробуй проще люди тебе выше комманды написали

----------------------------------------------(непра-)
procedure TForm1.FieldClick(Sender: TObject);
var x, y, z1, z2:integer;
begin
----------------------------------------------(вильно)
ты заносишь координаты в переменную y
напрямую коммандой y:=Mouse.CursorPos.Y;//а она узнает общее положение курсора а нам надо кд.курсора у image из-за этого тебе приходится убавлять делить и т.д.
z2 := trunc((y - Form1.Top - Field.Top) / 20);//

а узнавать координаты image нужно в событии mousedown, mouseup, mousemove.
Допустим, в общем var создаем переменные X1 И Y1


var
Form1: TForm1;
x1,y1:integer;


в событии mousedown у image
пишем
x1:=x;
y1:=y;


и все, при клике на image в переменных x1 и y1
появятся точные координаты.

(и ненадо никаких
z2 := trunc((y - Form1.Top - Field.Top) / 20)
__________________

Последний раз редактировалось -sanya-, 01.10.2009 в 19:03.
Ответить с цитированием
  #7  
Старый 15.11.2009, 09:26
gblbl gblbl вне форума
Прохожий
 
Регистрация: 15.11.2009
Сообщения: 1
Репутация: 10
По умолчанию

x= Mouse.CursorPos.X-Form1.Left
y=Mouse.CursorPos.Y-Form1.Top
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter