Entwickler-Ecke

Multimedia / Grafik - Spielfelder darstellen, aber wie !?


Anonymous - Do 06.03.03 15:27
Titel: Spielfelder darstellen, aber wie !?
Moin!

Ich möchte ein Spiel proggen, bei dem ich viele Spielfelder brauche.
Diese wollte ich durch Images darstellen, was natürlich umständlich ist, da ich dann viele Images bräuchte.

Geht das irgendwie anders?
Durch ein Array of Images?
Oder noch anders und besser?

Die Images kann ich nicht zeichnen, da sie nachher "Texturen" haben sollen ...

Thx 4 Help!


Raphael O. - Do 06.03.03 15:30

nimm ein großes image und male da rein...
du kannst acuh kleinere Bilder darin Positionieren ->CopyRect
Was für ein Spiel soll es denn sein??


Anonymous - Do 06.03.03 15:38

Ich wollte meine 2 Jahre alte TurboPascal-Facharbeit aus der 9 in Delphi programmieren. Das war Schiffe versenken.

Mann, hatte ich da ein geiles Intro geproggt! *schwärm*
Hat leider nur nie geklappt, weil mein dummer Lehrer mir nicht erklären konnte wie Arrays funzen. Also hat folglich auch die Facharbeit nicht gefunzt und ich hab nur ne 2- bekommen! *grml*


PS: Kann ich mit CopyRect auch bmp- oder jpg-Dateien ein das Image kopieren?


Anonymous - Do 06.03.03 17:20

Jo, kann man .. jedenfalls mit bmp-Dateien! :wink:

Aber im Spiel müsste man auch auf diese Grafiken, die die einzelnen Spielfelder darstellen, klicken können. Geht das auch, wenn ich sie auf ein großes Imgae zeichne? Klar, mit Mauspositionsabfrage, aber geht adas auch eleganter?


mimi - So 09.03.03 00:29

also du erstllt ein array mit allen Pos denn gibt du an in einer Image komponenten aus.
am besten währe für sowas DelphiX;)


Raphael O. - So 09.03.03 00:34

D0P3 F!$H hat folgendes geschrieben:
Geht das auch, wenn ich sie auf ein großes Imgae zeichne? Klar, mit Mauspositionsabfrage, aber geht adas auch eleganter?

Ich finde das ist zwar nicht sehr elegant, aber du musst andererseits ja auch nur einmal von den Mauskoordinaten in deine Spielfelddaten "umrechnen"...
das geht doch eigentlich noch ganz gut


mimi - So 09.03.03 00:48

kommt darauf an, was du genau machen willst und wie du es machen willst. also ob nur mit delphi oder mit delphix oder oder oder


Anonymous - So 09.03.03 10:17

Also ich kenn nur Delphi. DelphiX ist doch DirectX unter Delphi oder so?

Also auf jeden Fall in Delphi (da kenn ich mich grad noch so aus ^^)!
Ich will ja "Schiffe versenken" proggen. Wen ich dort dann auf ein Spielfeld klicke (angenommen ich machs mit nem Array of TImages), dann muss ich halt errechnen, auf welchem Feld ich bin (das ist nicht llzu schwer, da weiss ich wies geht) und das Bild des entsprechendes Feldes ändern über Array[x, y].Picture.LoadFromFile('Bildname.bmp').


Crosskiller - So 09.03.03 17:03

hi!
also wenn auf einen in delphi bereits integrierten gerätekontext, dann in eine paintbox! (das puffern und flippen nicht vergessen!)
dein spielfeld machst du am besten in einen eigenen typ, der eine matrix beinhaltet wiederum eines typs (z.b. Ttile)

das würde folgendermaßen aussehen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Type Ttile = record
   BildIndex:byte;
   Tag1,Tag2,Tag3,Tag4,Tag5:boolean;
end;

Type Tkarte = record
   Tilematrix:array[0..50] of array[0..50] of Ttile
end;

var karte:Tkarte;


Um speicher zu sparen wird das bild jedes einzelnen tiles natürlich nicht gespeichert, jeder der soetwas macht ist ein verbrecher, weil der den benutzern speicher stiehlt!! :) gespeichert wird NUR der index des bildes in EINEM byte!
gezeichnet wird in einem großen doppelloop einmal für X einmal für Y! ich geh mal aus faulheit von einer nicht-perspektivischen sicht aus. isometrische sicht ist mit ein bisschen hirnschmalz aber auch garnicht weit weg davon:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var LoopX,LoopY:integer;
begin
      for loopY := 0 to 50 do
         for LoopX := 0 to 50 do
         begin
         case karte[loopx,loopy].tilematrix.bildindex of
         1: Hauptcanvas.draw(LoopX*BILDBREITE,loopY*BILDHÖHE,Bild1.picture.graphic);
         2: Hauptcanvas.draw(LoopX*BILDBREITE,loopY*BILDHÖHE,Bild2.picture.graphic);
         3: Hauptcanvas.draw(LoopX*BILDBREITE,loopY*BILDHÖHE,Bild3.picture.graphic);
         end;
         end;
end;


ich denke das is leicht zu verstehen, habs jetzt aber hier nur schnell reigepfeffert, weis nicht obs fehlerfrei ist :)

viel glück und plz programmiert sauber und speichersparend!


mimi - So 09.03.03 18:15

OK! schiffe versenken wird nicht so schwer sein
also so würde ich vorgehen:
1. Gitte zeichnen
2. Schiffe zeichnen
3. Ki erstellen
4. Fertig....
mit delphix ist das viel einfacher;)


Anonymous - So 09.03.03 18:15

:shock: :shock: :shock:

Äh, also ich versteh beim ersten Durchlesen nix!
Aber ich werd mal schauen, ob ichs noch schnalle.

Ich hab mal bei mir einen Versuch für das Spielfeld gestartet:


Quelltext
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:
var Feld: TBitmap;

procedure TForm1.FormCreate(Sender: TObject);
var x, y: Integer;
begin
  for x:= 0 to 9 do begin
   for y:= 0 to 9 do begin
    Feld := TBitmap.Create;
    Feld.LoadFromFile('Test.bmp');
    Image1.Canvas.CopyRect(Rect(x * 22, y * 22, x * 22 + 20, y * 22 + 20), Feld.Canvas, Rect(0, 0, 20, 20));
    Feld.Free;
   end;
  end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var FeldX, FeldY: Integer;
begin
  FeldX := X div 22;
  FeldY := Y div 22;
  Feld := TBitmap.Create;
  Feld.LoadFromFile('Test2.bmp');
  Image1.Canvas.CopyRect(Rect(FeldX * 22, FeldY * 22, FeldX * 22 + 20, FeldY * 22 + 20), Feld.Canvas, Rect(0, 0, 20, 20));
  Feld.Free;
end;


Klappt auch so weit und ich versteh das auch! ^^
Also das ist sowas in der Art was wir nie in der Schule lernen werden, was ich aber (selbst beigebracht) verstehe.
Aber das ist wohl nicht sehr speicherfreundlich, woll !? :wink:


mimi - So 09.03.03 18:19

also 1.
du solltes vileicht nicht in den for schleifen.

Quelltext
1:
Feld := TBitmap.Create;                    

schreiben.
auch das Free ist an falscher stelle.
mehr ist mir noch nicht aufgefallen;)
also ich habe da auf meiner seite ein Snake tutor lis es dir doch mal durch....


Anonymous - So 09.03.03 18:40

Hab ich gemacht und die Befehle vor die for-Schleifen gepackt.

Das Tut hab ich mir auchmal angeschaut, aber so ganz versteh ichs noch nicht.


mimi - So 09.03.03 18:50

du musst beide Tutors durchlesen


Anonymous - So 09.03.03 19:15

:oops: Natürlich übersehen das 2. Tut, aber mit DelphiX wollte ich das eh nicht machen, da ich das Prog auch in der Schule testen wollte und dort können/dürfen wir nichts installieren.


Crosskiller - Di 11.03.03 19:02

jo, wie willst du jetzt aber deine map speichern, dopefish?
- eben genau dazu brauchst du die matrix die ich oben deklariert hatte. aja: Tbitmap.create /.free /.loadfromfile ausserhalb der schleife, und in einen try finally block.

die ganze schleife in einen timer oder einen gameloop-thread erstellen (...oder OnIdle) und bei click nur den wert des tiles in der matrix änder, das zeichnen übernimmt dann der loop.


Anonymous - Di 11.03.03 19:39

Wie meine Map speichern? :?

Ich wollte nix speichern.
Die Felder, auf denen die Schiffe stehen, wollte ich in einem Array speichern lassen.

Aber könntest du mal genauer und ausführlicher (4 Dummies) erklären, was du meinst. Ich hab keine Ahnung wovon du sprichst. :oops:


mimi - Di 11.03.03 21:20

ich glaube er meint sowas:

Quelltext
1:
karte:array[0..MapX,0..MapY] of TKarte                    

;)
habt ihr kein DirecX bei euch in der schule ?
kann ich mir nicht vorstellen, DX 5 bzw 7 habt ihr sichelich;)
mit Puren delphi ist das schon etwas schwera....


Crosskiller - Di 11.03.03 23:27

Zitat:
mit Puren delphi ist das schon etwas schwera....

so ein quatsch :?


mimi - Di 11.03.03 23:50

nein kein quatsch, es ist mit puren delphi schwere als in DX, aber wenn man es einmal kann dann kann man es ;)


Anonymous - Mi 12.03.03 07:41

Ich gehe mal schwer davon aus, dass wir DX in der Schule haben werden, aber um damit in Delphi arbeiten zu können, muss ich doch eine Komponente installieren, richtig? Und das dürfen/können wir in der Schule nicht.

Was ist denn TKarte?
Ein eigener Type?
Von was denn?


Luncustaf - Mi 12.03.03 09:22

Crosskiller hat folgendes geschrieben:

das würde folgendermaßen aussehen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Type Ttile = record
   BildIndex:byte;
   Tag1,Tag2,Tag3,Tag4,Tag5:boolean;
end;

Type Tkarte = record
   Tilematrix:array[0..50] of array[0..50] of Ttile
end;

var karte:Tkarte;

viel glück und plz programmiert sauber und speichersparend!


hier wird der type Tkarte erzeugt - das meint er damit. nehme ich zumindest mal an ich hab da auch keinen peil von :)
aber sofern ich das richtig verstanden habe meint er das damit.


gr€€tz


mimi - Mi 12.03.03 17:01

@Luncustaf
genau, das meine ich damit;)

ihr dürft keine komponenten in der schule installieren ?


Anonymous - Mi 12.03.03 17:38

Nein, dürfen wir nicht und das ginge (legal und einfach) schon mal nicht, da die Partition C für Installationen gesperrt ist. :(


mimi - Mi 12.03.03 18:01

und wenn du es auf D oder E installierst ?
oder direcX von cd aus installierst ?
naja, dann musst du wol leider mit puren delphi arbeiten, aber fragt doch mal nach ob du DelphiX installieren darf bzw benutzen darf;)


Anonymous - Mi 12.03.03 18:18

Muss das denn nicht ins Delphi-Verzeichnis kopiert werden?
Und Ausnahemn gibt es nicht!
Von CD klappt nicht, haben wir schon öfters ausprobiert! :twisted:

Und D wird alle 2 Wochen komplett formatiert ...


mimi - Mi 12.03.03 18:32

warum geht das nicht von cd ?
gut, delphi wird eine fehlermeldung rausgeben:
weil die datei schreib geschützt ist, aber sonst müsste das eigentlich funktionieren....

dann musst du das wol mit Puren delphi machen;)


Anonymous - Mi 12.03.03 20:25

Wir haben zwar nicht probiert DelphiX zu installieren, aber andere Progs: ICQ, Kazaa, Winamp ... geht nicht, da Admin-Rechte erforderlich sind oder du kannst sie zwar auf D speichern, aber da einige Progs Dateien auf C ändern/erweitern etc. müssen, klappen sie nicht richtig/gar nicht.


mimi - Mi 12.03.03 20:33

delphiX ist eine komponenten samlung, und da iher delphi prommiert denke ich das delphi schon installiert ist.und so könntes du doch DelphiX über Komponenten\komponente installieren oder soänlich gehen und feritg, wo ist da das problem ??


Anonymous - Mi 12.03.03 21:03

Das Problem ist: Ohne Adminrechte kannst du auf C (Windows2k + Programme wie Delphi ...) nichts installieren, nur auf D, welche alle 2 Wochen formatiert wird.
Da Delphi auf C ist und die Komponenten-Sammlung wohl in eines seiner Unterverzeichnisse installieren will, gibts ein Problem, weil du dort halt nichts installieren kannst.

Die Lehrer geben dir das Admin-Passwort nicht und werden auch für mich keine Ausnahme machen.

Kann man DelphiX doch installieren und versteh ich hier was nicht oder wie? :?


mimi - Mi 12.03.03 21:06

ich glaube du versteht was falsch:
du kannst meines wissen DelphiX von cd installieren problem:
du musst warscheinlich beim jeden Delphi neustart DelphiX neu installieren;)
oder kopiere delphiX doch einfach auf D und installiere ist halt jede 2. woche neu, oder frage deine lehrer ob sie das für dich installieren.
oder du musst halt die bord mittel von Delphi nutzen !!


Anonymous - Mi 12.03.03 21:29

Ich nehme Antwort D ... oder doch den Publikumsjoker?

Nein, ich machs mit den Standard-Delphi-Komponenten ...