![]() |
Lösung für 2D Brett
Hallo,
so jetzt bin ich soweit, dass ich meine zweite Frage stellen muss, da ich an einer Stelle nicht mehr weiter weis. Ich bin dabei ein Spiel Brett in 2D mit 7*7 Feldern zu erstellen, das ist soweit kein Problem. Für jedes Feld gibt es nun ca. 12 (evtl nen bisschen mehr) verschiedene Grafiken, die unter gewissen Bedingungen auf dem Feld erscheinen können. Nun die Frage wie man das realisiert. Eine Möglichkeit (die ich auch hinkriegen würde) ist auf jedes Feld alle 12 Grafiken zu legen und diese im Laufe des Spiels mit visible := True/false an und auszuschalten. Allerdings ist dieses zum einen recht umständlich und zum anderen hat das ganze eine recht lange Ladezeit, da meines Wissens beim Starten auch die versteckten Grafiken geladen werden. Ich weis nicht ob dieses in irgendeiner Art und weise mit einem Record realisierbar ist, da jedes Feld zusätzlich noch andere Eigenschaften bekommen muss (X-, Y- koordinaten auf dem Brett, und anderes) Vielen Dank schon mal im Voraus KahPee |
Re: Lösungs für 2D Brett
Mein Vorschlag wäre ein Panel, welches eine Größe von 7* Feldhöhe x 7* Feldbreite hat. Auf das Panel-Canvas "kann was" (Wortspiel) gezeichnet werden und so kannst du dann auch die Bilder je nach ihren Bedingungen aufzeichnen.
|
Re: Lösungs für 2D Brett
Mh, ich bin da Anfänger, daher Frage ich nochmal nach was genau du gemeint hast. Sorry, dass ich mich da etwas schwerer tue aber es wäre nett wenn du, dass nochmal ein bisschen genauer erläutern könntest.
Vielen Dank Edit: Gibt es irgendeine create anweisung für Bilder? Dann müsste ich die einzelnen Bilder irgendwo doch nur einmal deklarieren und könnte sie dann wenn "iwas passiert" einfach an bestimmter Stelle erzeugen, dann ist jedes Bild im prinzip nur einmal vorhanden. Ich meine, dass man auf so ein Bild dann ähnlich wie auf eine vorherdefinierte Prozedur zugreifen kann. Gibt es sowas? |
Re: Lösungs für 2D Brett
Ich würde eine Klasse A bauen in der alle Bilder einmalig geladen werden (in eine Liste von TBitmap).
Dann würde ich die Klasse B bauen (evtl. von TImage ableiten), welche ein Feld repräsentiert. Diese Klasse bekommt beim erstellen eine Referenz auf Klasse A, damit es sich von dort per Index das entsprechende Bild holen kann. Und jetzt hat Klasse B eine Methode, welche sagt, dass jetzt Bild Nummer 4 anzuzeigen ist, dann kopiert sie sich eben aus Klasse A bild nummer 4 und fertig. |
Re: Lösungs für 2D Brett
OH, siehe mein Edit oben (da warst du schneller)... genau an soetwas habe ich gedacht. Kannst du mir einmal ein Beispiel geben wie ich in einer Klasse ein Bild definiere?
|
Re: Lösung für 2D Brett
Für ein Bitmap:
Delphi-Quellcode:
(var) Bitmap:TBitmap;
... Bitmap:=Tbitmap.create; Bitmap.Loadfromfile(dateiname); ... Am Ende irgendwann dann Bitmap.free |
Re: Lösung für 2D Brett
Ich gucke mal kurz ob ich die Syntax verstanden habe:
Zitat:
Ist das um das Bild wieder durch einen Platzhalter zu ersetzen? Wie deklariere ich die eigentliche Bildklasse? Reicht das wirklich das einfache: (var) Bitmap:TBitmap;? Die Klasse für das Feld muss im Prinzip ja auch einen Platzhalter enthalten oder? Wie definiere ich soetwas? Wie sähe der Befehl für ein .jpg aus? Sorry für diese Vielen Fragen, ich bin halt noch blutiger Anfänger, ich hoffe, dass ich irgendwann mal in der Lage bin die mir entgegengebrachte Hilfe zurückzuzahlen... mfg Kahpee |
Re: Lösung für 2D Brett
Hallo,
Bitmap.Free benötigst Du, damit der reservierte Speicher wieder freigegeben wird, wenn dein Programm geschlossen wird. Der Befehl lässt sich gut im Ereignis OnClose anwenden. |
Re: Lösung für 2D Brett
Hallo KahPee,
schau mal auf die Seite und lies dir das durch! ich denke da bekommst du auch ne gute Anregeung wie man sowas realisieren kann! ![]() |
Re: Lösung für 2D Brett
TImageList wäre dann noch eine fertige Komponente, die Bilderlisten verwaltet.
|
Re: Lösung für 2D Brett
Diese würde ich aber erst zur Laufzeit erzeugen und dann füllen, denn sonst wird seine *.exe ja unglaublich groß!
Hätte außerdem den Vorteil, dass er einfach die Bilder verändern kann und nicht jedesmal das Programm neu erzeugen müsste! |
Re: Lösung für 2D Brett
@SimStar001:Vielen Dank für den Link, allerdings steht dort zum Thema Grafiken im Sinne von JPG und Bitmap, etc nicht allzu viel. Trotzdem schon mal vielen Dank, das ist ein gute Nachschlagewerk...
@Satty67: Ich werde mir den Befehl mal genauer angucken. Im Prinzip werden am Anfang des Programmes alle 49 Felder einmal mit einer Grafik belegt. Anschließend werden zur Laufzeit die Bilder je nach Ereignis wieder geändert. Mir sind zwar zu dem Thema noch nicht alle Sachen klar aber ich werd mal nach dem Motto "Probieren geht über studieren" anfangen, und falls ich mich festfahre schau ich hier mal wieder rein. Vielen Dank an alle |
Re: Lösung für 2D Brett
Also das ganze kann man mit einem Record machen, du könntest auch eine eigene klasse erstellen, würde ich zum beispiel so machen.
Aber du sgast ja selbst du bist anfänger, dann hat dass für dich denke ich noch keinen sinn. Soll heißen, probier es ruhig so aus wie du es denkst, dass es funktioniert. wenn am ende alles so läuft wie du es dir vorstellst, dann kannst du ja den nächsten schritt gehen und versuchen es anders, vielleicht eleganter und effektiver zu lösen. Schließlich geht ja probieren über studieren! |
Re: Lösung für 2D Brett
Wie das mit Klassen geht wäre schon interessant, da ich in meinem Programm schon einige Klassen schon verwende...
|
Re: Lösung für 2D Brett
So da komm ich dann nochmal: Ich hatte vor die Felder als zweidimensionalen Array einer Klasse zu verarbeiten. Zweidimensionaler Array damit eine Variable für die X und eine für die Y koordinate ist. Wie ordne ich nun jeder Variable aus dem Array eine Bitmap zu?
Im Prinzip habe ich hier das Problem, dass ich pro Feld eine Bitmap mit einem Feld verknüpfen muss, ist das irgendwie möglich. Bei dieser Verknüpfung muss auch irgendwo(?) irgendwie (?) festgelegt werden wo sich das Bild überhaupt befindet.. Wäre super wenn mir da nochmal jemand auf die Sprünge helfen könnte.. Vielen Dank |
Re: Lösung für 2D Brett
Du erstellst am besten ein Array of TBitmap, wo du alle möglichen Bilder hineinlädst.
Und in deinem Spielfeld-Array merkst du dir nur den Index, welches Bild gezeichnet werden soll. |
Re: Lösung für 2D Brett
Ok damit wäre die Zuordnung geklärt..
Wie lege ich dann am Ende fest wo das entsprechende Bild im Programm gezeichnet wird, also die Position? Wie genau ist da dann der Befehl? Das muss ja wahrscheinlich über eine Pixelangabe ausgehend von links oben gehen oder? |
Re: Lösung für 2D Brett
Also ich weiß ja nicht wie deine Arrays aussehen, aber ich würde es so machen , dass du halt wie schon vorher vorgeschlagen ein Array hast, was am besten aus einem record besteht:
z.b. so
Delphi-Quellcode:
somit hättest du ein Array, mit dem Du beliebig viele Images und anderen Kram erzeugen kannst, den du noch so brauchst.
type TMeinBilderRecord = record
Image : TImage; BildIndex : Integer; ... end; var MeinBilderArray : array of TMeinBilderRecord; Somit wäre auch eine Positionierung kein Problem, denn jetzt kannst du jedem Image in deinem Array auch eine Position geben. z.b.
Delphi-Quellcode:
Aber es kommt halt drauf an wie und was du so alles noch damit machen willst.
MeinBilderArray[0].Image.left := 100;
MeinBilderArray[0].Image.top := 100; MeinBilderArray[0].Image.picture.loadfromfile(xyz); // oder halt mit ner Imagelist und dann den Index zuweisen Wie gesagt, wenn du nen Record und array verwendest, kannst du auch irgendwann selbst nach deinen Wünschen bzw. Bedürfnissen ne eigene Klasse basteln. |
Re: Lösung für 2D Brett
Ich habe hier mal beschrieben wie man Bilder in einem Grid (Tabelle) anzeigt:
![]() Vieleicht hilft dir das weiter. |
Re: Lösung für 2D Brett
Riesen Dankeschön, dass sollte mich einen riesigen schritt weiterbringen. Bei deinem record ist mir aufegefallen, dass du "BildIndex" deklariert hast.
Die folgende Frage hat mit Grafiken nichts mehr zu tun aber ich frag mal trotzdem: Bildindex gibt dem Bild ganz klar eine Zuordnung aber wie erzeuge ich nun das Bild mit dem Bildindex=2? Wie ist da der beste Befehl. Im Moment fällt mir das ganze nur mithilfe einer riesigen If, else if- funktion ein. ungefähr so:
Delphi-Quellcode:
if feldarray[1].bildindex=2 then
begin Feldarray[1]:=Tbitmap.create; Feldarray[1].Loadfromfile(BildMitBildindex2); end else if feldarray[1].bildindex=3 then begin Feldarray[1].bild:=Tbitmap.create; Feldarray[1].bild.Loadfromfile(BildMitBildindex3); //und so weiter end; Das ganze dann für jedes Feld... nen bisschen umständlich oder? wie kriege ich hin, dass ich anstatt so für jedes Feld das zu machen einfach nur einmal deklarieren muss und die Prozedur auf jedes Feld anzuwenden ist. Sorry dass ich wahrscheinlich ne richtig blöde frage stelle aber da scheine ich nen Brett vorm Kopf zu haben. Mfg KahPee |
Re: Lösung für 2D Brett
kannst du bitte mal noch deine ganzen variablen posten, damit wir genau wissen wie due deine sachen nun aufgebaut hast, das macht es einfacher, und du bekommst genau den tip den du brauchst!
Danke |
Re: Lösung für 2D Brett
jetzt weiß ich was du meinst:
also ich würde ein array erzeugen, was generell alle bilder enthält: so z.b:
Delphi-Quellcode:
was dein "Problem" mit if else angeht, da kannst du zum beispiel einfach eine case Abfrage erstellen:
var AlleMeineBilder : array [0..xyz] of Bitmap;
// dann beim erzeugen der Form AlleMeineBilder[0].bitmap.assign('Pfad der Datei'); ... // dann kannst du im code deinen Feldern ein Bild aus diesem Array zuweisen, je nach Bedingung die hast.
Delphi-Quellcode:
case feldarray[1].bildindex of
0 : Feldarray[1].Loadfromfile(BildMitBildindex1); 1 : Feldarray[1].Loadfromfile(BildMitBildindex2); ... end; |
Re: Lösung für 2D Brett
Die unten dargestellte Variante ist schon sehr gut, allerdings hat die noch einen Haken: Ich müsste das ganze für jedes der 49 Felder machen. Schöner wäre, wenn sich eine Prozedur entwickeln lässt, die für alle Felder funktioniert. Geht das evtl über ein dynamisches Array? (Feldarray ist übrigens ein zweidimendsionaler Array[x,y])
Die andere Alternative, die weiterhin ne ganze Ecke eintippen erfordert wäre eine Funktion bei der man Variablen für x und y beim Aufrufen der Funktion abfragen müsste, das geht zur Not auch wenn es keine elegantere Variante gibt. ________ abgesehen von der oberen Frage: Funktioniert folgendes?:
Delphi-Quellcode:
am Anfang müssen nämlich alle Felder ein Default-Bild zugewiesen bekommen. Alle bis auf das Feld (4,4) das kriegt eine andere Grafik zugewiesen. Aber im prinzip müsste das so klappen oder?
Feldarray[0..7][0..7].Loadfromfile(BildMitBildindex1);
Feldarray[4][4].Loadfromfile(BildMitBildindex2); Wie kann ich die so erzeugten Grafiken nun noch An- und Ausschalten? Funktioniert das dann auch über: Feldarray[x,y].visible:=true/false? |
Re: Lösung für 2D Brett
Hallo, im Prinzip geht alles.
Du kannst alles auch mit dynamischen arrays machen, aber wenn es bei deinem Programm immer die selbe größe ist wäre es quatsch. Wenn du dein Array am Anfang mit einer Default Bitmap füllen willst, kannst du das ganze ganz einfach über eine Schleife machen. einfach so:
Delphi-Quellcode:
nun möchtest du garantiert wissen wo sich jedes bild befinedet, also di x, y koordinaten haben.
for i := 0 to 6 do
for u := 0 to 6 do Feldarray[i,u].loadfromfile(BildMitBildindexDefault); Aus diesem Grund würde ich dir raten das ganze jetzt entweder in ein Record zu packen und dann ein Array von diesem Record zu erzeugen, oder das ganze als nächster schritt dann in eine eigene Klasse. Für Record würde ichs so machen:
Delphi-Quellcode:
Somit hättest du jetzt den Vorteil dass du ein Array hast, welches zu jedem Bitmap auch noch die Koordinaten beinhaltet und alle anderen Sachen die du dann noch Brauchst.
type TMeinSpielFeld = record
Bild : TBitmap; Left : Integer; Top : Integer; // Du kannst hier noch andere Parameter definieren die du brauchst // Wie zum Beispiel: BildIndex : Integer; end; var MeinSpielFeld : array [0..6,0..6] of TMeinSpielFeld; Jetzt kannst du auch einfach die x ( Left) und y (Top) Koordinaten abfragen:
Delphi-Quellcode:
x := MeinSpielFeld[0,0].Left;
y := MeinSpielFeld[0,0].Top; //usw. Das ganze als nächsten Schritt in eine Klasse zu packen ist aufwendiger, aber am Ende doch noch mehr von Vorteil. Aber das kannst du später alles immernoch machen. Versuch das ganze ruhig ersteinmal so hinzubekommen. |
Re: Lösung für 2D Brett
Nochmal vielen Dank für deine Hilfen, genau so hatte ich mir das inzwischen auch überlegt. Ich glaube, dass ich jetzt die Vorraussetzung für meine Programm zusammen habe. ich werde jetzt mal gucken wie weit ich komme...
mfg Kahpee |
Re: Lösung für 2D Brett
Bitte, bei fragen einfach wieder melden!
|
Re: Lösung für 2D Brett
So jetzt kommt das erste Problem:
ich habe einen Array für die Bilderliste erstellt:
Delphi-Quellcode:
piclist: array[0..11] of Tbitmap;
nun wollte ich jeder Variable von piclist ein Bild zuweisen:
Delphi-Quellcode:
allerdings bekomme ich da immer einen Fehler ausgegeben:
piclist[0].assign(pictures/bildname.bmp);
[Fehler] Unit1.pas(152): Undefinierter Bezeichner: 'pictures' pictures/bildname.bmp ist der Pfad von dem Ort wo die exe das ganze Programm liegt ausgehend. also die exe das Projekt liegt in dem gleichen Ordner wie der Ordner pictures in welchem die Datei Bildname.bmp liegt. was ist falsch? Muss das Bild vorher schon erzeugt werden mit: piclist[0].create? (was in meinem Programm eher hinderlich als hilfreich wäre... mfg Kahpee |
Re: Lösung für 2D Brett
Hallo, also ersteinmal ist der Pfad den du übergibst ein String, d.h. du musst Ihn in Anführungszeichen schreiben.
Delphi-Quellcode:
desweiteren musst du auch einen vollständigen Pfad angeben, bsp:
piclist[0].assign('pictures/bildname.bmp');
Delphi-Quellcode:
piclist[0].assign('C:\pictures\Bildname.bmp');
|
Re: Lösung für 2D Brett
mh das ist ja eigentlich blöd, da so bei dem kopieren des Programms an einen Ort sich der Pfad auf einem anderen PC ja ändert, falls ich das Programm mal weitergeben will.
Außerdem kriege ich jetzt ne Fehlermeldung:
Delphi-Quellcode:
([Fehler] Unit1.pas(153): Inkompatible Typen: 'TPersistent' und 'String')
piclist[0].assign('pictures/bild.bmp');
Nächstes Problem bei der konkreten Zuweisung: ich habe einen Record deklariert in dem dann die Variable Feld.pic: Tbitmap vorkommt. Wie weise ich das nun zu:
Delphi-Quellcode:
funktioniert nicht. ([Fehler] Unit1.pas(171): Inkompatible Typen: 'String' und 'TBitmap')
Feld.pic.Loadfromfile(piclist[0]);
Und auch die Positionsangaben dazu funktionieren nicht:
Delphi-Quellcode:
[Fehler] Unit1.pas(172): Undefinierter Bezeichner: 'top'
Feld.pic.left:=x;
Feld.pic.top:=y; Sorry, dass ich soviel Fragen stelle, ich bin noch in der Lernphase Vielen Dank im voraus Kahpee |
Re: Lösung für 2D Brett
kleinen moment:
also das mit dem pfad ist einfach, das löst du so:
Delphi-Quellcode:
... assign(ExtractFilePath(ParamStr(0)) + '\pictures\Bild.bmp');
|
Re: Lösung für 2D Brett
Lass dir Zeit will niemanden hetzten mache sowieso gleichmal Pause:
wenn man dies hier benutzt: ExtractFilePath(ParamStr(0)) + dann braucht man aber ein Teil des Programms der das ganze installiert oder? gibt es soetwas vorgefertigt? Ansonsten würde ich dran ja nochmal ne weile sitzen :D:D schon mal vielen Dank im vorraus KahPee |
Re: Lösung für 2D Brett
ExtracFilePath(ParamStr(0)) gibt genau den Pfad an, indem sich deine ausführende Exe befindet
Check mal Posteingang |
Re: Lösung für 2D Brett
Könnte das Problem daran liegen, dass ich mit Delphi4 arbeite?
Wüsste jemand wie das da geht? |
Re: Lösung für 2D Brett
So jetzt mal nen Umfangreiches Update zu dem Thema:
Ich habe inzwischen ne ganze Ecke rumgespielt und bin auch schon weitergekommen. Im Moment gibt es allerdings immer noch ein paar Fehler.
Delphi-Quellcode:
Die Zeile bringt beim Kompilieren kein Problem aber wenn das ganze durch das Programm abgespielt wird dann:
piclist[0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\bild1.bmp');
Zitat:
Die Deklarationen (global! nicht lokal)
Delphi-Quellcode:
Die Zusweiung
type
Tpicpos = record top, left: integer; end; Tfield = record //noch andere Variablen pic: Tbitmap; picpos: Tpicpos; end; var piclist: array[0..11] of TBitMap; fields: array[1..7,1..7] of Tfield;
Delphi-Quellcode:
Das ist eigentlich im Moment der Komplette Teil, der die Grafiken betrifft.
piclist[0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\bild1.bmp');
With fields[1,1] do //für Feld(1,1) begin pic:= Tbitmap.create; //fields.pic erzeugen pic.assign(piclist[0]); // oben geladenes Bild zuweisen picpos.top:=21; picpos.left:=212; {Dies sind die beiden Variablen für die Bildposition allerdings gelingt es mit nicht das auch auf das Bild zu beziehen. pic.top / pic.left gibt Fehler aus ([Fehler] Unit1.pas(175): Undefinierter Bezeichner: 'top'). Genauso: pic.picture.top oder pic.picture.bitmap.top} end; _____ noch ein Update: Wenn ich dem:
Delphi-Quellcode:
ein
piclist[0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\bild1.bmp');
Delphi-Quellcode:
voranstelle bekomme ich nicht mehr den AccessViolation Fehler, allerdings wird das Bild dann auch nicht angezeigt. Was ganz einfach daran liegen könnte, dass dem Bild keine Position zugewiesen wird.
piclist[0]:=Tbitmap.create;
Vielen Dank an alle Helfer, ich hoffe, dass sich der Fehler iwie noch finden lässt mfg KahPee |
Re: Lösung für 2D Brett
Das Bitmap existiert doch schon, du musst keine neue Bitmap erzeugen sondern nur das Bild aus der Liste der Feldvariablen zuweisen.
Delphi-Quellcode:
Für was du allerdings picpos benötigst ist mir schleierhaft.
With fields[1,1] do //für Feld(1,1)
begin pic := piclist[0]; // oben geladenes Bild zuweisen picpos.top:=21; picpos.left:=212; end; Die Position auf dem Bildschirm ergibt sich doch aus der Position im Array und der Breite der Bilder + Rand. Das Zeichnen auf dem Bildschirm musst du natürlich selbst vornehmen. Nimm einfach eine TPaintbox und im Ereignis OnPaint zeichnest du alle Felder auf den Canvas diese Komponente. (Hier würde ich auch die Position berechnen.) Das Neuzeichnen nach Änderungen am Array löst man mit Paintbox1.Invalidate aus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 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