Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
FreePascal / Lazarus
|
Rechtecke überlagern sich beim zufälligen erstellen ?
29. Jan 2006, 15:53
Hallo,
ich habe es mit meinem eignen code nicht und mit einem code aus disem forum auch nicht hinbekommen.
Ich möchte gerne das meine bilder zufällig auf ein TBitMap verteielt werden und dabei ist zu berücksichtigen:
Es darf kein andres Objekt auf der Position sein
Und es darf nicht auserhalb des angeben Rechteckes sein.
ich habe hier die proceduren und funktionen die dafür verantwortlich sind rein kopiert:
Delphi-Quellcode:
// Diese hier habe ich aus dem forum
function RectIntersect(A, B: TRect; Offset: Integer): Boolean;
begin
result := not((A.Right + Offset <= B.Left) or
(A.Bottom + Offset <= B.Top) or
(A.Top - Offset >= B.Bottom) or
(A.Left - Offset >= B.Right));
end;
// -----------------------
function TForm1.Kollision(rect:TRect):Boolean;
var
i:Integer;
r1:TRect;
begin
result:=False;
for i := 0 to High(Items) do begin
r1.Left:=Items[i].x; r1.Top:=Items[i].y;
r1.Right:=Items[i].w; r1.Bottom:=Items[i].h;
if RectIntersect(r1,rect, 100) then begin
result:=True;
// break;
end;
end;
end;
// hier kommt die anwendung
function TForm1.Zufall(px,py,w,h,index:Integer):TPoint;
var
x,y,z:Integer;
i,r:Boolean;
begin
x:=px; y:=py; z:=0;
// px:=px*w; py:=py*h;
i:=CheckCollision(px,py,w,h,index);//CheckCollision(x*w,y*h,w,h,index);
Label3.Caption:=BoolToStr(i,True);
if (i = False) or (x < 0) or (y <0) or (x > 640) or (y >240) then begin
repeat
x:=random(640-w);
y:=random(280-h);
inc(z);
r:=CheckCollision(x,y,w,h,index);
until (r = False) or (z = 5);
end;
ListBox1.Items.Add(IntToStr(Index)+ '\'+ IntToStr(x) + '\' + IntToStr(y));
result.X:=x;
result.Y:=y;
end;
// und hier noch mal meine eigne:
function TForm1.GetItemIndex(px,py,pw,ph,Index:Integer):Integer;
var
i:Integer;
t:Integer;
g:TRect;
begin
ListBox2.items.Clear;
t:=-1;
Label1.Caption:='';
for i:=0 to HIGH(Items) do begin
with Items[i] do begin
ListBox2.Items.Add(IntTostr(x) + '\' + IntToStr(y));
if (typ <> 4) and (typ <> 1) and (PlayerIndex <> i) then begin
// if PtInRect(Rect(x,y,w,h),Point(px,py)) = True then begin
if IntersectRect(g,rect(x,y,w,h),rect(px,py,pw,ph)) = True then begin
Label1.Caption:=InttoStr(x)+'\'+IntToStr(y) + '\'+ IntToStr(Random(4));
// if (px >=x) and ( py>=y) and (px <=x+pw) and (py <=y+ph)then begin
// if (x >=px) and (y >=py) and (x <=px+pw) and (y <=py+ph) and (PlayerIndex <> i) then begin
t:=i;
break;
end;
end;
end;
end;
result:=t;
end;
das problem dabei ist bei diesem code überlagen sich teilweise die Grafiken übereinander und ich weiß einfach nicht warum. Habe hier im forum gesucht letzte woche saß ich stunden vor diesem Problem, habe aber leider keine lösung gefunden !
Michael Springwald MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
|