Hallo,
ich habe lauter rechtecke und möchte nun wissen ob mein player(auch ein rechteck) mit einem obj zuammen gestoßen ist oder nicht.
eigetnlich ganzs einfach, problem ist dabei folgendes:
ich habe meine karte auf der sind jetzt z.b. folgende objekte eingetragen:
x: 50
y: 285
w: 20
h: 90
PX:=20
py:=305
pw:=20
ph:=20;
der player macht jetzt immer 20 schritte nach lingx oder rechts.
ich dachte mir jetzt das ich einfach wenn es zu einer collision kommt die entfernung messe(x) und dann vergleiche(mit den player werten) das funktioniert auch soweit nur wenn ich jetzt das obj verschiebe z.b. um paar pixl nach oben so das unter dem objekt der player duchgehen kann gehts nicht mehr. die objekte sind so angeordnet:
Code:
p -----
----------------------
p = player
die lange line ist ein obj un die kleine auch und um die geht es auch die haben im moment alle die gleiche höhe.
meine funktionen sehen so aus:
Delphi-Quellcode:
function TGame.GetPlayerDir(x,y,x1,y1:Integer):Integer;
begin
if obj.player.x <= x then
result:=isLings
else
if obj.player.x >= x1 then
result:=isRechts;
end;
function TGame.GetObj(x,y:Integer):TOBJTyp;
var
i,dir:Integer;
begin
for i:=0 to HIGH(OBJ.Walls) do begin
if (x >= OBJ.Walls[i].x ) and (y >=OBJ.Walls[i].y) and ( x<=OBJ.Walls[i].x+ OBJ.Walls[i].w) and (y <=OBJ.Walls[i].y+ OBJ.Walls[i].h) then begin
dir:=GetPlayerDir(OBJ.Walls[i].x,OBJ.Walls[i].y,OBJ.Walls[i].x+OBJ.Walls[i].w,OBJ.Walls[i].y+OBJ.Walls[i].h);
result.index:=i;
result.typ:=OBJ.Walls[i].typ;
result.f:=True;
if dir = isLings then result.e:=OBJ.Walls[i].x-(obj.player.x+obj.player.w);
if dir = isRechts then result.e:=obj.player.x-(OBJ.Walls[i].x+OBJ.Walls[i].w);
exit;
end;
end;
for i:=0 to HIGH(OBJ.MoveWalls) do begin
if (x >= OBJ.MoveWalls[i].x ) and (y >=OBJ.MoveWalls[i].y) and (x <=OBJ.MoveWalls[i].x+ OBJ.MoveWalls[i].w) and (y <=OBJ.MoveWalls[i].y+ OBJ.MoveWalls[i].h) then begin
result.index:=i;
result.typ:=OBJ.MoveWalls[i].typ;
result.f:=True;
exit;
end;
end;
if (x >= OBJ.player.x ) and (y >=OBJ.player.y) and (x <=OBJ.player.x+ OBJ.player.w) and (y <=OBJ.player.y+ OBJ.player.w) then begin
result.index:=0;
result.typ:=player;
result.f:=False;
exit;
end;
result.index:=None;
result.typ:=None;
result.f:=False;
result.e:=None;
end;
// KeyDown:
if KEYS[VK_LEFT] = True then begin
// Lings ist kein obj
o:=GetObj(px-20,obj.player.y);
if o.typ <> MovePlatte then begin
if o.f = False then
px:=px-20
else
if (GetObj(px+o.e,obj.player.y).f = False) and (o.e <= 20) and (o.e > 0) then
px:=px-o.e;
end
else
px:=px-20;
end;
if KEYS[VK_Right] = True then begin
// Rechts ist kein obj
o:=GetObj(px+40,obj.player.y);
if o.typ <> MovePlatte then begin
if o.f = False then
px:=px+20
else
if (GetObj(px+o.e,obj.player.y).f = False) and (o.e <= 20) and (o.e > 0) then
px:=px+o.e;
end
else
px:=px+20;
end;
if v = True then begin
if (obj.player.isLeiter = True) and (GetObj(px,obj.player.y+20).typ = wall) then begin
obj.player.x:=obj.player.x+px;
obj.player.isNoLeiter:=True
end;
if obj.player.isLeiter = False then begin
obj.player.x:=px;
end;
end;