|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Определение координат клика. Игра "Жизнь".
Как определить координаты клика по TImage ?
Последний раз редактировалось RayOfLight, 30.09.2009 в 22:52. |
#2
|
||||
|
||||
Без события MouseMove никакой клик не обойдется.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Код:
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
|
||||
|
||||
Код:
pt := Image1.ScreenToClient(pt); ...сказал, и загрустил от бесспорной своей правоты |
#5
|
|||
|
|||
Спасибо
Дело в том, что мне надо написать игру "Жизнь" Джона Конвея. Программа работает правильно только первый ход, а дальше идут какие-то ошибки (клетки расставляются не так, элементарный 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
|
||||
|
||||
тот-же
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
|
|||
|
|||
x= Mouse.CursorPos.X-Form1.Left
y=Mouse.CursorPos.Y-Form1.Top |