Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 00:07

Foren-Übersicht » Sonstiges » Meinungen zu den Projekten
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: @2D Engine, basiert auf Canvas
BeitragVerfasst: Mi Nov 19, 2008 17:30 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Hallo,
ich weiß nicht genau ob es hierfür schon ein Thread gibt, ich habe jetzt keinen gefunden. Daher erstelle ich einfach mal.
Es geht um dieses Projekt von mir:
viewtopic.php?t=7319

Ich habe vor einigen Tagen eine recht einfache Scroll Funktion eingebaut.

Das Problem ist jetzt was ich habe: Ich habe jetzt mehrer Objekte an verschiedenen Orten.
Diese Objekte könnten die Player sein. Die ich gerne auswählen möchte und die Engine soll dort hinscrollen.
Hier sind alle Relevanten stellen aus dem Soruce-Code die das Scrollen betreffen:
Code:
  1.  
  2.  
  3. {Diese Procedure macht es noch nicht 100%ig richtig.
  4. Ich möchte es Eigentlich so, dass das Objekt wo ich hinscrolle evlt. in der Mitte angezeigt wird.
  5. }
  6. procedure TPluto2DEngine.ScrollToObject(aSprite: TPluto2DSprite);
  7. var
  8.   r,r1:Boolean;
  9. begin
  10.   ViewRect:=Rect(0,0,0,0);
  11.   r:=False; r1:=False;
  12.   while not r do begin
  13.     r1:=(ViewRect.Left >= aSprite.Left);
  14.     if not r1 then
  15.       ViewRect.Left:=ViewRect.Left+30
  16.     else begin
  17.       ViewRect.Top:=ViewRect.Top+30;
  18.       r:=(ViewRect.Top >= aSprite.Top)
  19.     end;
  20.   end;
  21. end; // TPluto2DEngine.ScrollToObject
  22.  
  23. {
  24. Hier ein Ausschnitt aus der DrawSprite Methode und ein die Methode SetRect
  25. }
  26.  
  27. procedure TPluto2DSprite.DrawSprite(const event:Boolean = True; const NewDraw:Boolean = True);
  28. var
  29.   x,y,i,c:Integer;
  30. begin
  31.   if isScrolledWindow then begin
  32.     ChangeScrollWindow:=False;
  33.     x:=Left; y:=top;
  34.     ChangeScrollWindow:=True;
  35.     Left:=x-ViewRect.Left;
  36.     Top:=y-ViewRect.Top;
  37.   end;
  38. ...
  39. end;
  40.  
  41. procedure TPluto2DSprite.SetRect(Index: integer; const AValue: integer);
  42. begin
  43.   case index of
  44.     0: begin
  45.       if not ChangeScrollWindow then
  46.         fLeft:=AValue
  47.       else
  48.         fPLeft:=AValue;
  49.     end;
  50.  
  51.     1: begin
  52.       if not ChangeScrollWindow then
  53.         fTop:=AValue
  54.       else
  55.         fPTop:=AValue;
  56.     end;
  57.     2: fWidth:=AValue;
  58.     3: fHeight:=AValue;
  59.   end;
  60. end; // TPluto2DSprite.SetRect
  61.  
  62. {
  63.   Die Methode NewAllDraw regelt das Eigentiche Scrollen
  64. }
  65. procedure TPluto2DEngine.NewAllDraw;
  66. var
  67.   px,py,pw,ph:Integer;
  68.   x,y:Integer;
  69.   sprite:TPluto2DSprite;
  70. begin
  71.   Buffer.Canvas.Draw(0,0,BackupBuffer);
  72.   for y:=0 to SpriteMangerList.Count-1 do begin
  73.     for x:=0 to TPluto2SpriteManger(SpriteMangerList[y]).fItems.Count-1 do begin
  74.       sprite:=TPluto2DSprite(TPluto2SpriteManger(SpriteMangerList[y]).fItems[x]);
  75.       if sprite.Visible then begin
  76.         sprite.ViewRect:=ViewRect;
  77.         sprite.ChangeScrollWindow:=False;
  78.         if (sprite.Left >=ViewRect.Left-100) and
  79.            (sprite.Left <=ViewRect.Left+Buffer.Width+100) and
  80.  
  81.            (sprite.Top >=ViewRect.Top-100) and
  82.            (sprite.Top <=ViewRect.Top+Buffer.Height+100) then
  83.           sprite.DrawSprite(True);
  84.        end;
  85.     end; // for x
  86.   end; // for y
  87.   flip
  88. end;
  89.  
  90. {
  91.   Diese Methode wertet die Tatenevents aus. UNd scrollt.
  92. }
  93. procedure TPLRGame.KeyDown(var Key: Word; Shift: TShiftState);
  94. begin
  95.   inherited KeyDown(Key, Shift);
  96.   case Key of
  97.     VK_RIGHT: begin
  98.       Engine.ViewRect.Left:=Engine.ViewRect.Left+30;
  99.       Engine.NewAllDraw;
  100.     end; // VK_RIGHT
  101.  
  102.     VK_LEFT: begin
  103.       if Engine.ViewRect.Left-30 >= 0 then begin
  104.         Engine.ViewRect.Left:=Engine.ViewRect.Left-30;
  105. //        Engine.NewAllDraw;
  106.         Engine.NewAllDraw;
  107.       end;
  108.     end; // VK_RIGHT
  109.  
  110.     VK_DOWN: begin
  111.       Engine.ViewRect.Top:=Engine.ViewRect.Top+30;
  112.       Engine.NewAllDraw;
  113.     end; // VK_RIGHT
  114.  
  115.     VK_UP: begin
  116.       if Engine.ViewRect.Top-30 >=0 then begin
  117.         Engine.ViewRect.Top:=Engine.ViewRect.Top-30;
  118.         Engine.NewAllDraw;
  119.     //    Engine.NewAllDraw;
  120.       end;
  121.     end; //
  122.  
  123.     VK_1: AktivPlayer:=0;
  124.     VK_2: AktivPlayer:=1;
  125.     VK_3: AktivPlayer:=2;
  126.     VK_4: AktivPlayer:=3;
  127.   end;
  128. end; // TPLRGame.KeyDown
  129.  
  130. {
  131.   Dies ist ein Teil von einer Eigenschaft die in der Engine die Methode ScrollToObjekt aufruft die ich als erste zeige.
  132. }
  133. procedure TPLRGame.SetAktivPlayer(const AValue: Integer);
  134. begin
  135.   if fAktivPlayer=AValue then exit;
  136.   fAktivPlayer:=AValue;
  137.   Engine.ScrollToObject(Player[AValue]);
  138.   engine.NewAllDraw;
  139. end; // TPLRGame.SetAktivPlayer
  140.  
  141.  


Ich hoffe das ich alle stellen erwischt habe. Währe toll wenn ich/wir dieses Problem lösen könnte. Dann könne ich endlich weiter machen.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 20, 2008 10:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Code:
  1. void SetScrollerPath(float AStartX,float AStartY,float AEndX, float AEndY,float Speed=0.5f)
  2. {
  3.  StartX=AStartX;
  4.  StartY=AStartY;
  5.  EndX=AEndX;
  6.  EndY=AEndY;
  7.  CurrentX=StartX;
  8.  CurrentY=StartY;
  9.  float DirX=StartX<EndX?1.0f:-1.0f;//if (StartX<EndX) DirX=1.0f; else DirX=-1.0f;
  10.  float DirY=StartY<EndY?1.0f:-1.0f;
  11.  StepsX=DirX*Speed;
  12.  StepsY=DirY*Speed;
  13. }
  14.  
  15. void UpdateScrollerPosition(float& stepsx,float& stepsy)
  16. {
  17.  currentx=currentx+(stepsx*DeltaTime);
  18.  currenty=currenty+(stepsy*DeltaTime);
  19.  SetScrollposition(currentx+TileOffsetX,currenty+TileOffsetY);
  20.  if (IsPointOutsideRect(startx,starty,endx,endy,currentx,currenty))
  21.  {
  22.    stepsx=0;
  23.    stepsy=0;
  24.  }
  25. }


UpdateScrollerPosition rufst einfach in deiner Schleife auf und die ganzen Variablen kannst ja irgend ein Objekt zuweisen oder halt procedural.
TileOffsetX/Y sind ist der Tileoffset auf dem Bildschirm, also wenn du 12 Tiles horizontal darstellen kannst dann wäre dieser offset 6, damit man eine zentrierte sicht hat.
SetScrollerPath überschreibt die Positionen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 20, 2008 14:59 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Erstmal vielen Dank. Ich werde den Code mal ausprobieren. Aufjedenfall.
(Natürlich werde ich ihn vorher an Pascal anpassen *G*)

Was genau macht "IsPointOutsideRec" Davon lese ich heute zum erstenmal.....

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 20, 2008 16:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich hab gehofft, man erkennt den Sinn anhand des Namens.
Die Funktion musst du auch implementieren und ist nichts anderes als eine Prüfung, ob ein Punkt innerhalb eines Rechteckes liegt oder halt nicht.
Dafür werden Minimum und Maximum gesucht und dann der Punkt gepfrüft.
Code:
  1. bool IsPointInRect(unsigned int P1X, unsigned int P1Y, unsigned int P2X, unsigned int P2Y,unsigned PointX,unsigned PointY)
  2. {
  3.   unsigned int minx=P1X;
  4.   unsigned int miny=P1Y;
  5.   unsigned int maxx=P1X;
  6.   unsigned int maxy=P1Y;
  7.  
  8.   if (P1X<P2X)
  9.     maxx=P2X;
  10.   else
  11.     minx=P2X
  12.  
  13.   if (P1Y<P2Y)
  14.     maxy=P2Y;
  15.   else
  16.     miny=P2Y
  17.  
  18.   if (PointX<minx | PointX>maxx | PointY<miny | PointY>maxy)
  19.     return false;
  20.   else
  21.     return true;
  22. }

So eine Funktion wirst du im 2D Bereich sowieso des öfteren brauchen, von daher solltest du diese schon mal implementieren.
Code:
  1. if (IsPointInRect(startx,starty,endx,endy,currentx,currenty)==false)//ziel überquert, aufgrund von ungenauigkeit von Delta
  2. {
  3.   stepsx=0;
  4.   stepsy=0;//bewegung beenden
  5.   currentx=endx;
  6.   currenty=endy;
  7.   SetScrollposition(currentx+TileOffsetX,currenty+TileOffsetY);//position korrigieren
  8. }

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 20, 2008 17:22 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
ach so. So eine Funktion besitzt schon Lazarus: ptinRect heißt sie.... Ich habe mich nur über den namen gewundert. Da ich damit nicht anfangen konnte....

ich kann leider diese Zeilen Code nicht Deuten:
Code:
  1.  
  2. float DirX=StartX<EndX?1.0f:-1.0f;//if (StartX<EndX) DirX=1.0f; else DirX=-1.0f;
  3.  float DirY=StartY<EndY?1.0f:-1.0f;
  4.  

Bedeutet das Fragezeichen "ungleich" ? und der : geteilt ?
ich würde das evlt. so deuten: if StartX < EndX ....1.0f wobei mir gerade auffällt: was ist mit f gemeint ist ?

So ganz kann ich den Code wie gesagt nicht deuten....

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 20, 2008 18:03 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

Code:
  1.  
  2. if (StartX < EndX) then
  3.   DirX:= 1.0
  4. else
  5.   DirX:= -1.0;
  6.  
  7. if (StartY < EndY) then
  8.   DirY:= 1.0
  9. else
  10. DirY:= -1.0;
  11.  


Das f sagt nur, dass es ein float sein soll und kein double, da 1.0 in C++ ein double wäre.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 20, 2008 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
a<b?a:b heisst nichts anderes als if a<b then a else b, also ein ausdruck gefolgt vom ? ist ein if then und wenn ein : folgt dann kommt danach das else.
if ((a>b) and (not b)) then d:=a else d:=0.0;
d=(a>b)&&(!b)?a:0.0f;
Optimierungsmässig geht bei der Variante auch mehr.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 18:31 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Tut mir leid das ich erst jetzt antworte....
Ich habe die "sachen" mal heute übersetzt nach Pascal, doch leider bekomme ich nicht das gewünschte resultat:
Code:
  1.  
  2. function IsPointOutsideRect(P1X, P1Y, P2X, P2Y:Real; PointX, PointY:Real):Boolean;
  3. var
  4.   minX, minY, maxX, maxY:Real;
  5. begin
  6.   MinX:=P1X; MinY:=P1Y;
  7.   MaxX:=P1X; MaxY:=P1Y;
  8.  
  9.   if (P1X<P2X) then
  10.     maxx:=P2X
  11.   else
  12.     minx:=P2X;
  13.  
  14.   if (P1Y<P2Y) then
  15.     maxy:=P2Y
  16.   else
  17.     miny:=P2Y;
  18.  
  19.   result:=(PointX<minx) and (PointX>maxx) and (PointY<miny) and (PointY>maxy);
  20. end;
  21.  
  22. procedure TPluto2DEngine.SetScrollerPath(AStartX, AStartY, AEndX, AEndY:real; Speed:Real=0.5);
  23. var
  24.   DirX, DirY:Real;
  25. begin
  26.   // ViewRect ist ein TRect und damit arbeite ich in meiner Paint Methode.
  27.   ViewRect:=Rect(Round(AStartX), Round(AStartY), Round(AEndX), Round(AEndY));
  28.   if (aStartX < aEndX) then
  29.     DirX:= 1.0
  30.   else
  31.     DirX:= -1.0;
  32.  
  33.   // Gobal Definiert
  34.   currentX:=AStartX; currentY:=AStartY; endX:=aEndX; endY:=aEndY;
  35.   if (aStartY < aEndY) then
  36.     DirY:= 1.0
  37.   else
  38.     DirY:= -1.0;
  39.  
  40.   // Gobal Definiert
  41.   StepsX:=DirX*Speed;
  42.   StepsY:=DirY*Speed;
  43. end; // SetScrollerPath
  44.  
  45.  
  46. (*DeltaTime habe ich als Proceduren Parameter hinzugefügt. War in deiner Version nicht.*)
  47. procedure TPluto2DEngine.UpdateScrollerPosition(aStepsX, aStepY, DeltaTime:Real);
  48. begin
  49.  currentx:=currentx+(stepsx*DeltaTime);
  50.  currenty:=currenty+(stepsy*DeltaTime);
  51. // SetScrollposition(currentx+TileOffsetX,currenty+TileOffsetY);
  52.  if (IsPointOutsideRect(startx,starty,endx,endy,currentx,currenty)) then begin
  53.    stepsx:=0;
  54.    stepsy:=0;
  55.  end;
  56.  
  57. end;
  58.  
  59. procedure TPluto2DEngine.ScrollToObject(aSprite: TPluto2DSprite);
  60. var
  61.   r,r1:Boolean;
  62. begin
  63. //  ViewRect:=Rect(0,0,0,0);
  64.   r:=False; r1:=False;
  65. //  while not r do begin
  66. (*Mit was für Paramenter wird das aufgerufen ? aSprite.Left orentiert sich an der Linken oberen Ecke*)
  67.     UpdateScrollerPosition(aSprite.Left, Sprite.Top, 1.5);
  68. {    r1:=(ViewRect.Left >= aSprite.Left);
  69.     if not r1 then
  70.       ViewRect.Left:=ViewRect.Left+30
  71.     else begin
  72.       ViewRect.Top:=ViewRect.Top+30;
  73.       r:=(ViewRect.Top >= aSprite.Top)
  74.     end;}
  75. //  end;
  76. end; // TPluto2DEngine.ScrollToObject  
  77.  

Es passiert gar nix... einiges ist mir auch unklar:

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 23:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Hehe du hast da ein kleinen Fehler in der Prüffunktion, du musst die Ausdrücke nicht durch UND verketten sondern durch ODER.
Du Prüfst mit der letzten Zeile, ob dein Punkt kleiner,größer als dein Maximaler und Minimaler ist und wenn eine der Bedingungen zutrifft, dann ist er ausserhalb und wenn keine Zutrifft, dann ist der Punkt Innerhalb des Rechteckes.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 03, 2008 14:48 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Code:
  1. result:=(PointX<minx) and (PointX>maxx) and (PointY<miny) and (PointY>maxy);

ich nehme an du meinst diese Zeile.... Danke für den Hinweis.

edit01: Es passiert trotzdem nichts !

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Sonstiges » Meinungen zu den Projekten


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 21 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 16 Queries | GZIP : On ]