Форум: "Потрепаться";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
Внизпростенькая карта Найти похожие ветки
← →
ev (2002-09-27 21:23) [0]Как сделать простенькую карту?
Т.е. надо картинку разделить на зоны (не прямоугольники),
в зоне можно создавать объекты.
Как это реализовать, с обработкой клика на зону и на объект?
← →
ev (2002-09-29 00:19) [1]ау... мастера...
идейку подкинте :)
← →
Rouse_ (2002-09-29 00:24) [2]Попробуй через регионы, код не подскажу, просто первое что пришло в голову, но это идейка...;)
Желаю успехов
← →
Не спится... (2002-09-29 01:46) [3]Можно, действительно, через регионы - тогда см. ф-и
CreatePolygonRgn - создание региона
DeleteObject - уничтожение региона
PtInRegion - проверка попадания точки в регион
RectInRegion - ... прямоугольника
FillRgn - рисование региона.
А вобщем-то, можно и без регионов.
Проверить точку на попадание в полигон можно и так:
function PtInPolygon(P: array of TPoint; N, X, Y: Integer): Boolean;
var
i, j, k, Xi, Yi, Xj, Yj, Count, Intersect: Integer;
t: Double;
function MaxY(i, j: Integer; var k: Integer): Integer;
begin
if P[i].Y > P[j].Y then
begin Result := P[i].Y; k := i; end else
begin Result := P[j].Y; k := j; end;
end;
function MinY(i, j: Integer; var k: Integer): Integer;
begin
if P[i].Y > P[j].Y then
begin Result := P[j].Y; k := j; end else
begin Result := P[i].Y; k := i; end;
end;
begin
Count := N;
Intersect := 0;
for i := 0 to Count - 1 do
begin
j := (i+1)mod Count;
if not( P[i].Y = P[j].Y )and
not( ( Y<P[i].Y )and( Y<P[j].Y ) )and
not( ( Y>P[i].Y )and( Y>P[j].Y ) )then
if MaxY(i, j, k) = Y then begin if P[k].X > X then Inc(Intersect)end else
if not (MinY(i, j, k) = Y) then
begin
t := (Y - P[i].Y )/( P[j].Y - P[i].Y );
if (t>0)and(t<1)and(P[i].X+t*(P[j].X-P[i].X)>X)then Inc(Intersect);
end;
end;
Result := Intersect mod 2 = 1;
end;
Создаёшь классы примерно такого содержания
TFigure = class(TPersistent)
procedure Draw(Canvas: TCanvas); virtual; abstract;
function HitTest(X, Y: Integer): Boolean; virtual; abstract;
end;
TZone = class(TFigure)
private
FColor: TColor;
FPointCount: Integer;
FPolygon: array of TPoint;
FHRegion: HRGN;
// FObjects: TList;
public
procedure Draw(Canvas: TCanvas); override;
//begin
// Canvas.Brush.Color := FColor;
// FillRgn(Canvas.Handle, FHRegion, Canvas.Brush.Handle);
// // или Canvas.Polygon(FPolygon);
//end;
function HitTest(X, Y: Integer): Boolean; override;
//Проверка попадания в зону
//begin
// Result := PtInRegion(FHRegion);
// // или Result := PtInPlygon(FPlygon);
//end;
end;
TMap = class(TFigure)
private
FZones: TList
public
procedure Draw(Canvas: TCanvas); override;
//begin
// for i := 0 to FZones.Count - 1 do
// TZone(FZones[i]).Draw(Canvas);
//end;
procedure HandleMouse(...);
end;
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c