| Autor |
Beitrag |
B4ch1
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 16.04.04 14:53
Hallo,
mein Problem ist folgendes!! Ich soll für die Schule ein Spiel programmieren und wir haben uns für ein Jump'n'run entschieden!! Bisher hat auch soweit alles ganz gut geklappt, wir haben einen Mapeditor programmiert udn können die Figur schon bewegen etc! Das Problem auf das ich nun gestoßen bin ist, dass ich die Maps die ich erstelle nicht im Spiel laden kann! Die Maps erstelle ich mithilfe eines Drawgrids und will sie nun im Spiel direkt auf die Form laden!! Kann mir einer helfen?
Quellcode:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| const gcsp= 31; gcze= 23; gcelmentmenge= 3; type TElemente= (Stein,Leiter,Tuer,leer,item); TElementNamenFeld = Array [TElemente] OF STRING; TMap = Array [0..gcsp,0..gcze] OF TElemente; TMapFile = File OF TMap; TBilderFeld= ARRAY [TElemente] OF TBitMap; const gcElementName : TElementNamenFeld = ('Stein','Leiter','Tür','Leer','Item'); gcmapext = 'jmp'; gcbmpext = 'bmp'; var gvBild: TBilderFeld; gvMap: TMap; gvMapDatei : TMapFile; gvMapDateiName : String; gvaktElement : TElemente;
PROCEDURE TForm1.Button_SpeichernClick(Sender: TObject); BEGIN IF Form1.SaveDialog1.Execute THEN gvmapDateiName := Form1.SaveDialog1.FileName; AssignFile(gvMapDatei,gvMapDateiName); ReWrite(gvMapDatei); Write(gvMapDatei,gvMap); CloseFile(gvMapDatei); END; |
Es wäre echt der Hammer, wenn mir jemand sagen könnte, wie ich das erstellte Level nun wieder laden kann! Ich muss dazu sagen, dass das erstellte Level aus lauter kleinen Rechtecken besteht, die in einem Feld gespeichert werden!!
MfG B4ch!
Moderiert von Peter Lustig (15:53, 16.04.2004): Delphi-Tags hinzugefügt
|
|
JJ
      
Beiträge: 100
Windows XP 64 bit!
delphi 5
|
Verfasst: Fr 16.04.04 21:21
Ne ... keine ahnung ... sorry ...
aber ich wollte dich mal fragen ob du mir vielleicht mal den quellcode schicken kannst...
spghome@gmx.de ... naja ... nur wenn du willst!
_________________ Hallo!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 16.04.04 21:24
Hi!
Es ist ja schon spät, also entschuldige, wenn das eine blöde Antwort ist, aber geht nicht
Delphi-Quelltext 1: 2: 3: 4:
| AssignFile(gvMapDatei,gvMapDateiName); Reset(gvMapDatei); Read(gvMapDatei,gvMap); CloseFile(gvMapDatei); |
Bei Deinem und bei meinem Quellcode fehlen natürlich noch die try-finally-Blöcke.
MfG
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
B4ch1 
Hält's aus hier
Beiträge: 15
|
Verfasst: Sa 17.04.04 10:48
Titel: joa,
also zur ersten Frage, stelle ich mal ne Gegenfrage!!  Wozu brauchste denn meinen Quellcode?
Joa, dis hab ich ja schon probiert!! ;(
Delphi-Quelltext 1: 2: 3: 4:
| AssignFile(gvMapDatei,gvMapDateiName); ReSet(gvMapDatei); Read(gvMapDatei,gvMap); CloseFile(gvMapDatei); |
es tritt ein EXEPTION der KLASSE EInoutERROR auf und zwar an genau dieser Stelle : ReSet(gvMapDatei); : Ich bin jetzt schon am Verzweifeln und weiß nicht was ich machen soll!! Liegt es daran, dass ich gvMapDateiName := 'guteMap' so deklariert habe? Ich komme nicht auf den Fehler und ich probiere jetzt nun schon echt lange rum und habe keine Lust mehr, deshalb dachte ich, frage ich mal ein paar Experten!!
Moderiert von Peter Lustig (15:29, 17.04.2004): Delphi-Tags hinzugefügt
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 17.04.04 12:56
Deutet daraufhin, als ob er die datei nicht öffnen könnte, da sie entweder nicht gefunden wird oder exklusiv geöffnet ist.
|
|
B4ch1 
Hält's aus hier
Beiträge: 15
|
Verfasst: Sa 17.04.04 13:04
Titel: Hmmmm,
die Sache is, dass ich guteMap direkt mit in den Ordner gemacht habe, wo ich sie auch laden lassen will und in ein Drawgrid kann ich auch schon reinladen, nur klappt es nicht auf der Form!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| PROCEDURE TForm1.Button_LadenClick(Sender: TObject); VAR s,z : BYTE; rechteck:TRect; BEGIN IF Form1.OpenDialog1.Execute THEN gvMapDateiName := Form1.OpenDialog1.FileName; AssignFile(gvMapDatei,gvMapDateiName); ReSet(gvMapDatei); Read(gvMapDatei,gvMap); CloseFile(gvMapDatei); FOR s := 0 TO 31 DO BEGIN FOR z := 0 TO 23 DO BEGIN rechteck:=Form1.DrawGrid1.CellRect(s,z); Form1.DrawGrid1.Canvas.Draw(rechteck.Left,rechteck.Top,gvbild[gvMap[s,z]]); END; END; END; |
Das is der Quelltext zum Laden ins Drawgrid, ich komme nur nicht drauf, was ich ändern muss ums auf die Form zu laden!! Ich weiß, dass ich den opendialog weglassen muss und dass ich die s sowie z Schleife weglassen kann, aber wie gesagt der Fehler tritt auf und ich komme nicht weiter!! ;(
Moderiert von Peter Lustig (15:30, 17.04.2004): Delphi-Tags hinzugefügt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 17.04.04 14:38
Hallo, B4ch1!
Bitte benutze demnächst die Delphi-Tags. Durch die Delphi-Tags wird der Code mit Syntax-Highlighting angezeigt und ist somit sehr viel übersichtlicher.
Viele Dank!
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
B4ch1 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 18.04.04 14:48
Titel: OK,
ich schaffe es mittler Weile die Map in ein Drawgrid zu laden, nun müsste ich noch in Erfahrung bringen, wie ich die Map einfach nur auf die Form laden kann? Mit dem folgenden Quelltext kann ich alles in das Drawgrid laden!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| VAR s,z : BYTE; rechteck:TRect; BEGIN gvMapDateiName := 'guteMap'+'.'+gcmapext; AssignFile(gvMapDatei,gvMapDateiName); ReSet(gvMapDatei); Read(gvMapDatei,gvMap); CloseFile(gvMapDatei); FOR s := 0 TO 31 DO BEGIN FOR z := 0 TO 23 DO BEGIN rechteck:=Form1.DrawGrid1.CellRect(s,z); Form1.DrawGrid1.Canvas.Draw(rechteck.Left,rechteck.Top,gvbild[gvMap[s,z]]); END; END; END; |
Was muss ich ändern?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 18.04.04 15:18
Hallo!
Wenn Du den Dateinamen so wählst (also ohne Pfad), wirst Du bald Probleme bekommen. Du solltest Dir für den Pfad mal ParamStr(0) ansehen.
zum Zeichnen auf der Form:
Du kannst auf Form1.Canvas zeichnen, wie Du auf die Canvas des Drawgrids zeichnest. Lediglich das CellRect steht Dir nicht zur Verfügung. Aber es sollte kein Problem sein, aus Kenntnis der Spaltenbreite und Zeilenhöhe und den Schleifenindizes ein entsprechendes Rechteck zu berechnen.
MfG
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
B4ch1 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 18.04.04 15:42
Titel: hmmmmm,
ich will ja nicht unverschämt klingen, aber kannst du mir vielleicht dabei helfen und sagen wie ich ein Rechteck aus den spalten und zweilen ermitteln kann, ich komme garnich mehr klar und ich bin auch bald am Verzweifeln, wenn ich nich mal ein wenig in die richtige Richtung geschubst werde!!  Ich weiß nicht wo ich anfangen soll um das Rechteck zu ermittekln!! ;((
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 18.04.04 15:55
Okay, dann wollen wir mal ein wenig schubsen.
Aaaaaaaalso, Du stellst Dir vor, Du hast ein Gitter mit fester Spaltenbreite b und Zeilenhöhe h. Diese Zellen sprichst Du ja mit Deinen Indizes an. Daher wird jede Zelle durch ein Index-Paar (s, z) identifiziert.
Was Du nun brauchst ist die obere, linke Ecke des Rechtecks (in Form von "left" und "top"), denn Breite und Höhe hast Du ja. Die obere linke Ecke bekommst Du ganz einfach, wenn Du Dir überlegst, wieviele Zeilen über der Zelle und wieviele Spalten links von der Zelle sind. Das geben Dir die Indizes an. Jetzt noch mit der Spaltenbreite bzw. Zeilenhöhe multipliziert und Du hast den "left"- bzw. "top"-Wert.
Genug geschubst? 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
B4ch1 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 18.04.04 16:08
Titel: ok,
OK,
also er läd mir meine Map jetzt auf die Form, aber die Map is sehr klein!!  Was muss ichn da nun machen?
Ich dachte mir so, dass ich 1024 * 768 als Standartauflösung des Spiels nehme.
Nun teile ich ind 32*32 große Vierecke udn auf jedem is ein Bild gespeichert. Er lädt mir die Map aber nicht auf die ganze Form sondern in die linke obere Ecke!! ;(
|
|
B4ch1 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 18.04.04 16:13
Titel: hmmmm,
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| FOR s := 0 TO 31 DO BEGIN FOR z := 0 TO 23 DO BEGIN rechteck.Left:=s-1; rechteck.top:=z-1; Form1.Canvas.Draw(rechteck.Left,rechteck.Top,gvbild[gvMap[s,z]]); END; |
dis is nun meine Schleife und die gesamte Map ist in etwa so groß wie ein Element!! ;(
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 18.04.04 16:32
Das hast Du vergessen:
| Peter Lustig hat folgendes geschrieben: | | Jetzt noch mit der Spaltenbreite bzw. Zeilenhöhe multipliziert |
Nur die Indizes zu nehmen macht ja auch irgendwie keinen Sinn, oder? Die Spaltenbreite und Zeilenhöhe sollte schon irgendwo drin vorkommen. Hatte ich ja auch geschrieben.
Und das -1 würde ich weglassen. Denn die linke, obere Ecke des ersten soll ja bei (0,0) sein und nicht irgendwo im Negativen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
B4ch1 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 18.04.04 16:54
Titel: hehe,
ich könnte mich selber Ohrfeigen!!
Ich habs jetzt soweit hinbekommen, nachdem es dann zwischenzeitlich auch mal Seitenverkehrt war und und und!!
Aber nun gehts und ich Bedanke mich für die Tipps!! Aber fürs Verständnis würde mich jetzt noch interessieren, ob denn jetzt jedes Element der Map einzeln in die Form geladen wurde oder ob die Map als ganzes geladen wurde!! Weil da komme ich meistens nich mit klar, also mit den Prozessen, die man nicht sehen kann!! Will auch nicht weiter stören, aber naja dis wäre noch gut zu wissen!!
MfG Steffen!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 18.04.04 17:05
Hallo!
Geladen werden die Elemente in einem Rutsch. Dann sind sie aber erst einmal nur in dem Array. Die Elemente werden momentan nacheinander gezeichnet. Aber der Gedanke mit dem "als ganzes" ist schon mal nicht schlecht. Wenn die Elemente oft neu gezeichnet werden müssen, wäre es wohl besser, zuerst einmal alles in ein temporäres Bitmap zu zeichnen und dann in einem Rutsch auf die Form zu kopieren.
MfG
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
B4ch1 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 18.04.04 17:14
Titel: hmmmm,
das geht leider nicht!!
Für mich ist es gerade wichtig, dass alle Elemente einzeln auf der Form gespeichert werden, denn es handelt sich um ein Level für ein Jump'n'Run Spiel und die Figur, die gesteuert wird, folgt einer Routine, die Abfragt, ob sich unter ihr ein Stein (das Bild für einen Stein) befindet! Würde ich nu die Map als einzelnes Bild abspeichern, könnte ich diese Abfrage nicht mehr tätigen!!
So!! 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 18.04.04 17:21
So meinte ich das nicht. Ich meinte es so: Du zeichnest erst einmal nicht auf die Form, sondern auf ein temporäres Bitmap:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| FOR s := 0 TO 31 DO BEGIN FOR z := 0 TO 23 DO BEGIN rechteck.Left:=s-1; rechteck.top:=z-1; myBitmap.Canvas.Draw(rechteck.Left,rechteck.Top,gvbild[gvMap[s,z]]); END; |
Und dann kopierst Du den Inhalt des Bitmaps auf die Form. Das Ergebnis ist das selbe wie oben. Nur das es nicht flackert!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
B4ch1 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 18.04.04 17:32
Titel: achso,
naja gut dis is was andres!!
Ich habe mal noch ne Frage, weil dis hat ja nun geklappt!!
Ähm, die Form hat ja nen Timer!! Es muss doch möglich sein, dass man den Timer mit hilfe von Bitmaps auf der Form verdeutlichen kann? Is aber recht umfangreich gelle?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 18.04.04 17:49
Da muss ich jetzt leider auf die Richtlinien verweisen: bei einer neuen Frage bitte einen neuen Thread aufmachen. Kannst ja auf den hier verweisen, aber so bleibt einfach die Ordnung gewahrt! 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|