AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

screen scrolling (jump n run)

Ein Thema von superjojo · begonnen am 10. Jan 2014 · letzter Beitrag vom 11. Jan 2014
Antwort Antwort
superjojo

Registriert seit: 10. Jan 2014
16 Beiträge
 
#1

screen scrolling (jump n run)

  Alt 10. Jan 2014, 16:11
Hallo

Ich bastel gerade an einem kleinen jump n run game.
Doch nun stellt sich mir folgendes Problem:

Wie bekomme ich das am einfachsten hin, dass man sich in einer map bewegen kann, die größer als der Bildschirm ist. Also das wenn man an den rechten Rand kommt sich die Map nach rechts bewegt usw.

Schön wäre es, wenn ich in die ganze map noch Objekte einfach reinziehen könnte (so, wie man ein Objekt aufs formular zieht)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.146 Beiträge
 
Delphi 12 Athens
 
#2

AW: screen scrolling (jump n run)

  Alt 10. Jan 2014, 16:24
Nja, abgesehn davon, daß es so arschlangsam wird ...

TScrollBox auf die Form und da viele TImages rein.
Und dann die Scrollbox via Befehl scrollen (ScrollBy usw.) oder bei einem Image ScrollIntoView (oder so).




Besser die Bilder intern verwalten (TPicture, TBitmap oder so)
Und die Ausgabe beim Verschieben und im OnPaint selber an der gewünschten Position auf eine TPaintBox zeichnen (da brauchen auch nur die an die PaintBox geschickt zu werden, welche auch im sichtbaren Bereich liegen)

Noch besser: eine Grafik-Engine (siehe nächste Antwort)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Jan 2014 um 17:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#3

AW: screen scrolling (jump n run)

  Alt 10. Jan 2014, 16:27
Ich kann mir vorstellen, dass das ziemlich lahm wird und/oder flackert wie die Sau. Vielleicht sollte man eher auf eine GameEngine wie Andorra 2D oder Irrlicht oder was es sonst noch so gibt zurückgreifen, dann kann man auch Hardwarebeschleunigung und solche Gimmicks nutzen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Alt 10. Jan 2014, 19:10     Erstellt von Smut
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: screen scrolling (jump n run)

  Alt 10. Jan 2014, 20:13
Für ein einfaches 2D-Spiel muss man nicht unbedingt gleich eine Spiele-Engine auspacken. Für den Anfang reicht auch Canvas. Wenn es flackert, baut man einfach einen Offscreen-Buffer ein.

Im Grunde hat himitsu das Konzept schon erklärt: Statt auf grafische Komponenten zu setzen, die du zur Designzeit in das Formular ziehst, übernimm das Zeichnen selbst.

Objektorientiert kann man das prima umsetzen. Hier ein grobes Gerüst:
Delphi-Quellcode:
type
  TSprite = class
    FPosition: TPoint;
    FBitmap: TBitmap;
    procedure Paint(Canvas: TCanvas; Offset: TPoint);
  end;

var
  Sprites: array of TSprite;
  Camera: TPoint;

implementation

procedure TSprite.Paint(Canvas: TCanvas; Offset: TPoint);
var
  ScreenPosition: TPoint;
begin
  ScreenPosition.X := FPosition.X - Offset.X;
  ScreenPosition.Y := FPosition.Y - Offset.Y;

  Canvas.Draw(FBitmap, ScreenPosition.X, ScreenPosition.Y);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(Sprites, 2);
  with Sprites[0] do
  begin
    FPosition := Point(0, 0);
    FBitmap := TBitmap.Create;
    FBitmap.LoadFromFile('player.bmp');
  end;
  with Sprites[1] do
  begin
    FPosition := Point(20, 0);
    FBitmap := TBitmap.Create;
    FBitmap.LoadFromFile('enemy.bmp');
  end;
end;

procedure TForm1.Timer1Time(Sender: TObject);
var
  i: integer;
begin
  for i := low(Sprites) to high(Sprites) do
    Sprites[i].Paint(Canvas, Camera);
end;
Wenn die Kamera nach rechts scrollen soll, dann erhöhst du einfach Camera.X.

Das tolle an obigem Ansatz ist, dass man dank Polymorphie auch die komplette Spiellogik selbst wunderbar in die Sprites stecken kann. Das geht z.B. indem man eine abstrakte Basis-Klasse einführt und dann für verschiedene Objekttypen konkrete Klassen ableitet:

Delphi-Quellcode:
type
  // ist jetzt abstract
  TSprite = class
    procedure Paint(Canvas: TCanvas; Offset: TPoint); virtual; abstract;
    procedure Move; virtual; abstract;
  end;

  TPlayer = class(TSprite)
    { hier Variablen für Position, Bitmap, usw... }

    procedure Paint(Canvas: TCanvas; Offset: TPoint); override;
    procedure Move; override;
  end;

  TEnemy = class(TSprite)
    { hier Variablen für Position, Bitmap, usw... }

    procedure Paint(Canvas: TCanvas; Offset: TPoint); override;
    procedure Move; override;
  end;


implementation


procedure TPlayer.Paint(Canvas: TCanvas; Offset: TPoint);
begin
  { hier Spieler zeichnen }
end;

procedure TPlayer.Move;
begin
  { hier Spieler ein Stück bewegen }
end;

procedure TEnemy.Paint(Canvas: TCanvas; Offset: TPoint);
begin
  { hier Gegner zeichnen }
end;

procedure TEnemy.Move;
begin
  { hier Gegner ein Stück bewegen (KI) }
end;
Einen Leveleditor musst du dir dann allerdings selbst programmieren, wenn du deine Levels grafisch designen willst... ist aber machbar
  Mit Zitat antworten Zitat
superjojo

Registriert seit: 10. Jan 2014
16 Beiträge
 
#5

AW: screen scrolling (jump n run)

  Alt 11. Jan 2014, 16:29
Vielen Dank erstmal für die vielen , teils aufwändigen Antworten!

Ich habe mich mal für die billige Variante mit der scrollbox entschieden (da mir einen Einarbeitung in andorra2d nach kurzem Probieren zu schwierig war)

Das läuft auch einigermaßen ruckelfrei mit der scrollbox, nur wie kann ich die Position der scrollbox abfragen?

scrollbox1.VertScrollBar.Position liefert immer 0.


Der Zweck des Ganzen ist, dass der Character nicht links und rechts aus dem Level rauslaufen kann, da die scrollbox ja automatisch weiterscrollt, auch wenn keine objekte mehr kommen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.146 Beiträge
 
Delphi 12 Athens
 
#6

AW: screen scrolling (jump n run)

  Alt 11. Jan 2014, 16:46
Du hast doch sowieso eine Kollisionskontrolle eingebaut ... einfach ringsum um das Level eine Mauer bauen.

Oder du merkst dir in einer Variable wie groß das Level ist ... du weißt jwa, beim Befüllen wo die letzen Elemente im Level liegen.
Man kann auch alle Controls in der ScrollBox durchlaufen und sich die kleinsten und größten Positionen auslesen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz