ich habe die ursache gefunden für das problem leider doch nicht die lösung
und zwar: ich speicher das objekt was unter dem player ist in einem recrod vom typ TObTyp(eigner).
und ich durchlaufe ja in der collisions funktion alle array und sobalt ich eins(ein objekt) gefunden habe höhrt er ja auf zu suchen bzw. meldet collision also habe ich folgende funktion geschrieben:
Delphi-Quellcode:
function TGame.GetObj(x,y,w,h:Integer):TOBJTyp;
var
i,dir:Integer;
o:TOBJTyp;
temp,r1,r2:TRect;
begin
o.index:=None;
o.typ:=None;
o.f:=False;
o.xe:=None;
for i:=0 to HIGH(OBJ.Walls) do begin
r1.Left:=x; r1.Top:=y;
r1.Bottom:=y+h; r1.Right:=x+w;
r2.left:=OBJ.Walls[i].x; r2.top:=OBJ.Walls[i].y;
r2.Bottom:=OBJ.Walls[i].y+OBJ.Walls[i].h; r2.Right:=OBJ.Walls[i].x+OBJ.Walls[i].w;
if IntersectRect(temp,r1,r2) = True 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);
o.index:=i;
o.typ:=wall;
o.f:=True;
if dir = Lings then begin
o.xe:=OBJ.Walls[i].x-(obj.player.x+obj.player.w);
end;
if dir = Rechts then begin
o.xe:=obj.player.x-(OBJ.Walls[i].x+OBJ.Walls[i].w);
end;
o.ye:=OBJ.Walls[i].y-obj.player.y;
end;
end;
for i:=0 to HIGH(OBJ.MoveWalls) do begin
r1.Left:=x; r1.Top:=y;
r1.Bottom:=y+h; r1.Right:=x+w;
r2.left:=OBJ.MoveWalls[i].x; r2.top:=OBJ.MoveWalls[i].y;
r2.Bottom:=OBJ.MoveWalls[i].y+OBJ.MoveWalls[i].h; r2.Right:=OBJ.MoveWalls[i].x+OBJ.MoveWalls[i].w;
if IntersectRect(temp,r1,r2) = True then begin
dir:=GetPlayerDir(OBJ.MoveWalls[i].x,OBJ.MoveWalls[i].y,OBJ.MoveWalls[i].x+OBJ.MoveWalls[i].w,OBJ.MoveWalls[i].y+OBJ.MoveWalls[i].h);
o.index:=i;
o.typ:=MovePlatte;
o.f:=True;
if dir = Lings then begin
o.xe:=(obj.player.x+obj.player.w)-OBJ.MoveWalls[i].x;
end;
if dir = Rechts then begin
o.xe:=(OBJ.MoveWalls[i].x+OBJ.MoveWalls[i].w)-obj.player.x;
end;
o.ye:=OBJ.MoveWalls[i].y-obj.player.y
end;
end;
result:=o;
end;
Ich glaube das diese funktion in diesr forum auch funktioneirt doch leider verwendet ich sie warscheinlich falsch:
Delphi-Quellcode:
py:=obj.player.y;
px:=obj.player.x;
if KEYS[VK_LEFT] = True then begin
// Lings ist kein obj
o:=GetObj(px+20,obj.player.y+20,20,20);
if (o.typ = MovePlatte) or(o.f = False) or ((o.index = obj.player.UnderObj.index) and (obj.player.UnderObj.typ = Wall)) then
px:=px-20
end;
if KEYS[VK_Right] = True then begin
// Rechts ist kein obj
o:=GetObj(px+20,obj.player.y,20,20);
if ((o.typ = none) and (o.f = False)) and ((o.index = obj.player.UnderObj.index) or (o.index = obj.player.UnderObj.index) and (obj.player.UnderObj.typ = Wall)) then
px:=px+20;
end;
die var px ist nur ein tempe variable sie wird später zu gewiesen.
ich möchte einfach das man nur nach linx und rechts gehen kann und wenn dort eine collsions ist sollst nicht weiter gehen ich du kannst auch runter fallen:
Delphi-Quellcode:
obj.player.UnderObj:=GetObj(obj.player.X, obj.player.y,20,20+1);
if obj.player.isLeiter = FALSE then begin
if (obj.player.UnderObj.ye > 1) or (obj.player.UnderObj.f = False) then begin
if obj.player.FTime >= obj.player.FTimeCount then begin
obj.player.FTime:=0;
obj.player.y:=obj.player.y+1;
end
else
inc(obj.player.FTime);
end;
end;
das hat auch noch leider problme(gehört aber zur gleichen frage)