Einzelnen Beitrag anzeigen

mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

Collisionserknnung:problem

  Alt 1. Jan 2005, 12:08
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;
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat