AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Collisionserknnung:problem
Thema durchsuchen
Ansicht
Themen-Optionen

Collisionserknnung:problem

Ein Thema von mimi · begonnen am 1. Jan 2005 · letzter Beitrag vom 6. Feb 2005
 
mimi

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

Re: Collisionserknnung:problem

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz