Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi mehere Bilder mit einem Array ansprechen (https://www.delphipraxis.net/166876-mehere-bilder-mit-einem-array-ansprechen.html)

Gormek 3. Mär 2012 22:38

Delphi-Version: 7

mehere Bilder mit einem Array ansprechen
 
Hallo liebe Programmiergemeinde.
Bin neu hier und auch relativ neu mit dem Thema Delphi.
Ich habe folgendes Problem:

Ich programmiere gerade Bricks Brake und habe dazu mehrere Bilder erstellt, welche eben zerstört werden müssen. Berührt mein Ball ersteinmal den Rand des images, geht er in die If-Schleife rein, schaut von wo er kommt, in welchem Zustand er ist (damit meine ich die Anzahl, wie oft dieses Image schon getroffen wurde; dabei wird zudem ein neues Bild geladen (eine Mauer die eben etwas mehr kaputt ist)).
Jedoch muss ich ihm bei jedem Bild nun einzeln zuweisen, wie mein ball abprallen, welchen zustand er nehmen (also welches Bild er laden) etc.

Ich habe mit überlegt, dass man alle images in einem array erfassen könnte. Aber funtkioniert das überhaupt?
Also mal stumpf ausgedrückt:

If mein Ball >= irgendein Bild meines arrays [2..6}] then
lade das ein neues Bild aus dem Bild des arrays [2..6], welches oben angesprochen wurde.

Hoffentlich ist das verstänlich geschieben^^.

Danke im vorraus für Antworten.

NickelM 3. Mär 2012 23:10

AW: mehere Bilder mit einem Array ansprechen
 
also irgendwie verstehe ich zugegeben nicht was du machen willst.
Klar ist du hast einen Ball (denke mal auch ein Image) und mehrere Mauern, die verschiede "Zustände" haben können (z.b ganz, kleines Loch,halbkaputt,komplett kaput). So was du machen kannst, ist alle deine Mauern (also die images) in einen array tun. Dann kanst du sie mit einer for-schleife die geht so, durchgehen.
Delphi-Quellcode:
var I : Integer;
for I := 0 to High(arrayname) do
begin
  //Hier deine if-Anweisung (IF ist keine Schleife nur so am rande xD :-D)
end;
So, aber wie überprüfst du die Zustände? Mit einer Variablen (z.b. var Zustand : Integer) oder wie machst du das? wie lädst du dan die neuen Bilder zu den Zuständen? Haben die Dateien von den Bildern speziele Namen? z.b. Zustand1.bmp,Zustand2.bmp,Zustand3.bmp usw.

Du müsstest mal bischen Code zeigen,
Weil sonst kann man dir nicht helfen :-D. Ich weis der erste Beitrag ist der schwerste und mit dem anfangen mit Programmieren auch. :lol:

freeway 4. Mär 2012 05:52

AW: mehere Bilder mit einem Array ansprechen
 
>aber wie überprüfst du die Zustände?
die Zustände der einzelnen Bricks werden in einen array gespeichert

0 = ganz
1 = kleines Loch
2 = halbkaputt
3 = komplett kaputt

mit dieser Info kann man das Bilder array ansprechen

wenn also der Ball einen Brick berührt wird der Zähler im Brick array erhöht,
damit weiss man welcher Brick und welchen Zustand

Popov 4. Mär 2012 08:43

AW: mehere Bilder mit einem Array ansprechen
 
Ich glaube das ist das was du in etwa suchst:

Delphi-Quellcode:
type
  TMeineBalken = record
    Balken: TBitmap;
    x: Integer;
    y: Integer;
    Zustand: Byte;
  end;

const
  Balkenanzahl = 20;

var
  MeineBalken: array[1..Balkenanzahl] of TMeineBalken;

procedure AllesErstellen;
var
  i: Integer;
begin
  for i := 1 to Balkenanzahl do
    MeineBalken[i].Balken := TBitmap.Create;
end;

procedure AllesLoeschen;
var
  i: Integer;
begin
  for i := 1 to Balkenanzahl do
    MeineBalken[i].Balken.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 1 to Balkenanzahl do
  begin
    MeineBalken[i].Balken...
    MeineBalken[i].x...
    MeineBalken[i].y...
    MeineBalken[i].Zustand...
  end;
end;
An dieser Stelle ein Tipp wie du dir unheimlich viel Arbeit sparen kannst. Entweder später im Code oder gleich im Record würde ich den Rect Bereich des Balkens ermitteln. Der Ball hat dann auch einen Rect Bereich. Was du dann einfach nur noch machen mußt ist zu überprüfen ob sich der Rect Bereich des Balls mit einem Rect Bereich eines Balkens überschneitet. Schon hast du einen Treffer.

Sir Rufo 4. Mär 2012 09:19

AW: mehere Bilder mit einem Array ansprechen
 
Mir scheint das Konzept etwas ungeschickt, weil es IMHO nicht notwendig ist für jeden einzelnen "Brick" ein eigenes Bitmap mitzuschleppen.

Es gibt 4 unterschiedliche Bitmaps (ganz, Loch, halb kaputt, kaputt) also benötigt man 4 Bitmaps (meinetwegen in einem Array, obwohl ich eher zu einer TList raten würde).

Jeder "Brick" merkt sich ja auch schon seinen Zustand, also wird beim Zeichnen einfach Zustand und Position ausgelesen und davon abhängig das entsprechende Bitmap aus der Liste an die Position gemalt.

Das ist nicht nur schlanker sondern sorgt auch noch für die Trennung zwischen Logik und Darstellung.

mkinzler 4. Mär 2012 09:24

AW: mehere Bilder mit einem Array ansprechen
 
Zitat:

obwohl ich eher zu einer TList raten würde
Oder einer Imagelist.

Popov 4. Mär 2012 09:50

AW: mehere Bilder mit einem Array ansprechen
 
Liebe Kollegen, eure Vorschläge sind natürlich (wenn es hier eine Steigerungsform gäbe) richtiger. Aber man sollte sich immer bewusst sein wem man einen Tipp gibt. Natürlich könnte man eine Diskussion führen ob es nicht richtiger ist einem gleich richtig das Programmieren beizubringen. Ich stehe aber auf dem Standpunkt, dass einer zuerst das A richtig beherrschen sollte, bevor im als Vorschlag B, C, D, E und F gegeben werden. Was ich damit ausdrücken will: euer Konzepte sind besser, aber werden sie verstanden?

mkinzler 4. Mär 2012 09:55

AW: mehere Bilder mit einem Array ansprechen
 
Das gilt aber nur, wenn A auch sinnvoll ist. Es ist imho in diesem Fall nicht sinnvoll und deshalb wurden bessere Alternativen genannt.
Grundsätzlich hast du aber recht, es ist besser eine verständliche, wenn auch nicht die Beste, Lösung zu nennen, als die "ultimative" welche dann die Meisten nicht meh verstehen.

Sir Rufo 4. Mär 2012 10:09

AW: mehere Bilder mit einem Array ansprechen
 
Zitat:

Zitat von Popov (Beitrag 1154379)
Liebe Kollegen, eure Vorschläge sind natürlich (wenn es hier eine Steigerungsform gäbe) richtiger. Aber man sollte sich immer bewusst sein wem man einen Tipp gibt. Natürlich könnte man eine Diskussion führen ob es nicht richtiger ist einem gleich richtig das Programmieren beizubringen. Ich stehe aber auf dem Standpunkt, dass einer zuerst das A richtig beherrschen sollte, bevor im als Vorschlag B, C, D, E und F gegeben werden. Was ich damit ausdrücken will: euer Konzepte sind besser, aber werden sie verstanden?

Da sich mein Vorschlag aber durchaus mit dem Kenntnisstand - oder dem Kenntnisstand, den der TE erreichen will abbilden lässt, verstehe ich das so jetzt nicht.

Er muss ja lediglich nun 2 Arrays benutzen.

Der Hinweis auf TList war doch nur ein freundlicher Hinweis, dass es da noch etwas gibt, was das Handling vereinfacht.

Popov 4. Mär 2012 10:39

AW: mehere Bilder mit einem Array ansprechen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1154387)
Da sich mein Vorschlag aber durchaus mit dem Kenntnisstand ...

Im Grunde hast du Recht. Jetzt werde ich aber großkotzig und werfe meine pädagogische Tätigkeit in den Korb. Was ich aus Erfahrung weiß ist, dass einfacher und vergleichbar, nicht für jeden gleich einfacher ist. Das Problem ist, und ich bin hier allgemein und beziehe mich nicht jetzt auf den Threadersteller, dass man, wenn man an die Arbeit geht, bereits im Kopf ein Konzept hat. Im Kopf funktioniert alles, es geht nur noch um die Umsetzung. Mit einem neuen Konzept, auch wenn es für dich nur logische Konsequenz, weil einfacher, wirfst du alles über den Haufen. Ich erlebe es ständig, dass ich einem zeige wie es einfacher ist, und kaum drehe ich mich um, wird es wie bisher gemacht. Nicht bei allen. Einige schon, andere nicht.

Was ich inzwischen gelernt habe ist einen vorher zu fragen ob er bereit ist sich einen Vorschlag anzuhören, bevor ich loslege. Wenn ein nein kommt, dann versuche ich es inzwischen auch nicht, sondern wir versuchen das Momentane zu optimieren. Ich glaube das hat auch etwas mit der Einstellung zu tun ob man eine eigene Idee umsetzt oder einer einem eine bessere Idee nennt.

Ok, das war jetzt etwas Off Tipic, aber das war mein Hintergedanke.

Gormek 4. Mär 2012 12:37

AW: mehere Bilder mit einem Array ansprechen
 
Zitat:

Zitat von NickelM (Beitrag 1154350)
Du müsstest mal bischen Code zeigen,
Weil sonst kann man dir nicht helfen :-D. Ich weis der erste Beitrag ist der schwerste und mit dem anfangen mit Programmieren auch. :lol:

jaja das stimmt wohl:stupid:

es sei zu sagen: er arbeitet diese IF-Bedinungen in einem Timer ab.

hier mein code:

-in dem fall kommt mein ball von oben nach unten (die anderen IF-Bedingenen sehen genauso aus, nur dass sie eben die Bedinugnen für rechts, links oder oben sind

-die erste If-Bedingung (jaja keine schleife^^) schaut, ob er sich am Rande des Bricks bzw IM Brick befindet, da mein Ball einen gewissen Speed hat und auch in den Brick eintauchen kann UND ob er überhaupt noch sichtbar ist (denn nach mehrmaligem hiten, soll er ja verschwinden)

-die zweite Bedingung überprüft nun wo genau er sich dort befindet (oben, unten, rechts, links); zudem kann er durch meinen maximalen Speed von 8 nur 8 Pixel eintauchen
-> diese Begrenzung ist nötig, da ja, wissen soll, ob er von oben oder unten kommt bzw rechts oder links;

-die variable "lol" (keine fragen an der stelle^^) wird null gestetzt, damit er die anderen if bedingungen reingeht (von rechts,links,unten)

-in der Bedingung lässt er den Ball in y-Richtung apprallen, setzt den Ball an den Rand des Briks(damit er sozusagen nicht mehr eintaucht)

-broken ist eine spezifische Variable für jedes Brick die mittickt, je nachdem wie kaputt mein Brick ist (hier für das erste Bild)

-dann läd er eines der 3 Bilder (kleines loch, mittleres loch, großes Loch) (der Zustand "Normal" ist bereits in der Formcreate dem Bild zugeordnet worden)

-sollte Briks allerdings in letzten zustand sein (großes loch), soll er unsichtbar werden

nun gehen wir wieder zur ersten bedinung, wo er schaut, ob er den Brick berührt; tut er das nicht so wird lol=0 gesetzt damit der ball sozusagen wieder hitten kann


if (imageBALL.left+imageBALL.Width>=imageBRICK.left) and (ImageBALL.left<=imageBRICK.Left+ImageBRICK.width) and (imageBALL.top+imageBALL.Height>=imageBRICK.top) and (ImageBALL.top<=imageBRICK.top+imageBRICK.Height) and (imageBRICK.Visible=true) then
begin
if (imageBALL.top+imageBALL.height>=imageBRICK.Top) and (imageBALL.Top+imageBALL.Height<=imageBRICK.Top+8) and (lol=0) then
begin //Von Oben
y_bewegung:=y_bewegung*-1;
imageBALL.Top:=imageBRICK.top-imageBALL.Height;
broken-BRICK-NR-1:=broken-BRICK-NR-1+1;

if broken-BRICK-NR-1<=4 then
begin
image2.Picture.LoadFromFile('briks' + inttostr(broken-BRICK-NR-1)+ '.bmp');
end
else
begin
imageBRICK.Visible:=false;
end;
end;
lol:=1;
if (imageBALL.left+imageBALL.Width>=imageBRICK.left) //von rechts
...

else
lol:=0;
end;

Hoffentlich blickt man da druch^^.
Ich muss nun für jeden Brick, dessen zustand und die Ortung des Balles in dem Brick überprüfen.
Meine Frage war also: Kann ich dieses Ortung bzw auch den Zustand zu jedem an jedem Ball verallgemeinern, in dem ich eine "große" bedingung schreibe, in welchem er überprüft:

Bild:array[1..6];
Bild1:=array[1],
Bild2:=array[2],
...

if (imageBALL.left+imageBALL.Width>=imageIRGEINDEIN BILD AUS ARRAY[1..6].left) and
(ImageBALL.left<=imageIRGENDEIN BILD AUS ARRY [1..6].Left+ImageBRICK.width) and
(imageBALL.top+imageBALL.Height>=imageIRGENDEIN BILD AUS ARRY [1..6].top) and
(ImageBALL.top<=imageIRGENDEIN BILD AUS ARRY [1..6].top+imageIRGENDEIN BILD AUS ARRY [1..6].Height) and
(image IRGENDEIN BILD AUS ARRY [1..6].Visible=true)


Ich hoffe, dass ich mich hier grad net zum Deppen mache und bedanke mich schonmal für die zahlreichen Antworten.
Ich werde versuchen ein paar von euren Tipps zu berücksichtigen.

Blup 6. Mär 2012 15:56

AW: mehere Bilder mit einem Array ansprechen
 
Bitte benutz den Delphi-Tag um deinen Code im Beitrag zu formatieren.
Sonst kann man das wirklich nicht lesen.

Im Prinzip könnte das z.B. so funktionieren:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
{...}

  private
    FBrickBilder: array[0..4] of TPicture;

    FBrick: array[1..6] of record
      Image: TImage;
      Broken: Integer;
    end;

    procedure Initialisieren;
    procedure DeInitialisieren;
    procedure SetBroken(AIndex, AValue: Integer);
    procedure CheckBallKollision(AIndex: Integer);
  end;

procedure TForm1.Initialisieren;
var
  i: Integer;
begin
  // ein Bild für jeden Zustand erzeugen und laden
  for i := 0 to 4 do
  begin
    if FBrickBilder[i] = nil then
      FBrickBilder[i] := TPicture.Create;
    FBrickBilder[i].LoadFromFile('briks' + IntToStr(i) + '.bmp');
  end;
  // die Images des Formulars für den indizierten Zugriff im array ablegen
  FBrick[1].Image := image2;
  FBrick[2].Image := image3;
  FBrick[3].Image := image4;
  FBrick[4].Image := image5;
  FBrick[5].Image := image6;
  FBrick[6].Image := image7;
  // Anfangszustand und Bild zuweisen
  for i := 1 to 6 do
    SetBroken(i, 0);
end;

procedure TForm1.DeInitialisieren;
var
  i: Integer;
begin
  // Aufräumen, Speicher der Bilder wieder freigeben
  for i := 0 to 4 do
    FreeAndNil(FBrickBilder[i]);
end;

procedure TForm1.SetBroken(AIndex, AValue: Integer);
begin
  // Zustand und Bild zuweisen
  FBrick[AIndex].Broken := AValue;
  if AValue in (0..4) then
  begin
    FBrick[AIndex].Visible := True;
    FBrick[AIndex].Picure.Assign(FBrickBilder[AValue])
  end
  else
    FBrick[AIndex].Visible := False;
end;

procedure TForm1.CheckBallKollision(AIndex: Integer);
var
  r: TRect;
  x, y: Integer;
begin
  // Brick sichtbar
  if FBrick[AIndex].Image.Visible then
  begin

    // Überschneidung mit Ball
    r := FBrick[AIndex].Image.BoundsRect;
    if IntersectRect(imageBALL.BoundsRect, r) then
    begin
      SetBroken(AIndex, FBrick[AIndex].Broken + 1);

      // von Oben
      y := imageBALL.BoundsRect.Bottom;
      if (y >= r.Top) and (y <= r.Top + 8) then
      begin
        y_bewegung := y_bewegung * -1;
        imageBALL.Top := r.Top - imageBALL.Height;
        Exit; //=>
      end;

      // von Rechts
{...}
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  for i := 1 to 6 do
    CheckBallKollision(i);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 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