Entwickler-Ecke
Multimedia / Grafik - Im Spiel scrollen (alle grafiken)?
Pyr0cracker - Mi 26.03.03 15:32
Titel: Im Spiel scrollen (alle grafiken)?
Hallo, ich bin dabei ein kleines Spiel(strategie-ähnlich, von oben) zumachen, weiss aber nicht wie ich scrollen kann.
nehme delphix.
kann mir jemand weiterhelfen? vielleicht kennt ihr ja auch ein gutes tutorial.
ciao,
maximus - Mi 26.03.03 17:14
Yo...is kein prob.
Du must einfach alle sprites, der map, in ein übergeordnetes sprite packen. Dann musst du nurnoch das eine sprite bewegen und alle anderen laufen mit.
mimi - Sa 29.03.03 21:17
sprints würde ich nicht nehmen: veraltet und zu langsam.
ich habe mal ein spiel angefagen , das kannst du scrollen und hast vor die eine map und hast ein rader.... wenn du willst kann ich dir es mal senden.
Es ist aber kein "strategie spiel" ......
und wo hast du jetzt dein problem ???
Pyr0cracker - Fr 06.06.03 17:19
Alle Sprites in ein großes... hä?
@mimi: JAA, bitte schicks mir mal ([url=mailto:doriannagel@lycos.de]doriannagel@lycos.de[/url])
Darf ich das mit dem Radar abgucken? (natürlich nicht c&p) :)
Gruß
umpani - Fr 06.06.03 18:32
Wie hast du denn deine Karte aufgebaut?
Wenn du z.B. ein Array, nennen wird es map hast (m : array[1..100,1..100] of irgendwas und der Ausschnitt, der auf dem Bildschirm gezeichnet wird 30 x 30 Karteneinheiten groß ist, kannst du es so machen:
Zeichnen der Karte:
(Postition im Kartenausschnitt (oben, links: integer))
Quelltext
1: 2: 3: 4: 5: 6: 7:
| for x := 1 to 30 do for y := 1 to 30 do begin "zeichenbefehl" map[x+oben, y+links] end;
dxdraw.flip; |
Diese (natürlich mit dem korrektem Zeichenbefehl) Procedure kann dann in eine OnTimer funktion eingebaut werden.
Wenn du jetzt "oben", oder/und "links" veränderst, scrollst du den Bildschirm. Dann mußt du noch entsprechende "Kollisionsabfragen" einbauen.
Pyr0cracker - So 08.06.03 00:15
Hmm, mit Arrays kenne ich mich leider gar nicht aus. :oops:
Aber das mit dem Scrollen versteh ich. Glaub ich ;).
@mimi: Danke! Is ja ne ganze Menge Soßen-code :) aber ich werds mir mal angucken
umpani - So 08.06.03 14:01
Arrays sind ganz einfach.
Arrays sind einfach eine Kette won gleichartigen Variabelen eines jeden Types. Jedes Glied dieser Kette ist von 0 bis x nummriert.
Diese Kette nennt man 1-Dimensionales Array.
Quelltext
1: 2: 3: 4:
| var daten: array[1..200] of integer; ....
daten[0] := 1; {dem Kettenglied Nr. 0 wird ein Wert zugewisen. In dem Fall ein Integerwert, weil das array so definiert worden ist} |
Zweidimensionales Array:
Quelltext
1: 2: 3: 4: 5:
| var daten: array[1..200,1..200] of Integer;
...
daten[0,5] := 1; {dem Kettengewebeglied x=0 und y = 0 (wie bei einer Tabelle) wird ein Integerwert zugeordnet} |
Ich hoffe das ist ein Einstieg für Dich in Arrays.
Gruß Umpani
Elayla - So 08.06.03 14:17
Genau, stell die ein Array wie einen Karteikasten vor in dem Daten gespeichert werden.
Ein zweidimensionales Array kann man gut mit einem Schachbrett vergleichen oder einem Koordinatensystem.
Es gibt eine x-Koordinate A : Array[x..x2,...] of String
und eine y.Koordinate A : Array[...,y..y2] of String
Um auf ein Array zuzugreifen musst du folgendes schreiben:
(Beispiel)
edit1.text:= A[x]; x ist die Position im Array
oder zweidimensional:
edit1.text:= A[x,y];
und schreiben geht so:
A[x]:='text';
oder zweidimensional:
A[x,y]:='text'
Das müsste hoffentlich gereicht haben als Einführung :)
mimi - So 08.06.03 18:05
es gibt zu array auch ein tutrial(was mir bei einem projekt übrings sehr geholfen hat:), obwolh nicht schon mit array umgehen konnte)
ist mein erste versuch gewesen sowas wie scrollen hinzubekommen.
im grunde mache ich dort folgendes:
ich definiere einen 2D array mit einer bestimmten größe
das sicht fehlt ist immer 640 X 480 pixel aber der arrray hatte glaube ich eine größe von 1024 X 764 oder so. und dann musst du nur nuch rechnen und das war das einfachste:)
wenn man einmal rauß hat wie das geht ist der rest einfach
die minkarte funktioniert so:
ich nehme einfach kleiner grafiken und zeichne die karte vom selben array und fertig.
@Pyr0cracker
und hast du den code verstanden ?
edit:
| Zitat: |
Aber das mit dem Scrollen versteh ich. Glaub ich
|
wie das denn wenn du dich nicht mit array auskennst ?
umpani - So 08.06.03 19:36
Habe mir mal deinen Quelltext angeschaut.
Hier habe ich zunächst mal ein paar Anmerkungen allgemeiner Art.
1. Dein Spiel soll doch ein Strategiespiel werden. Da ist es nicht so sinvoll eine Karte zu haben, die sich aus nur einem Bitmap zusammensetzt.
2. Du hast eine Figur (soll man nur eine Figur steuern können?), die man mit der Tastatur steuert. Wenn man die Figur bewegt, bewegt sich eigentlich nur der Hintergrund und die Figur.
Zu 1.
Hier kommt der Array inst Spiel.
Du zwerfledderst dein Hintergrundbild in kleine Quadrate. z.B in 50x50 pix Grösse
Wenn man jetzt der Einfachheit halber davon ausgeht "1" ist Wiesenquadrat und "0" ist strassenquadrat dan wäre das:
1111011111
1111011111
1111011111
1111011111
1111011111
1111011111
eine Strasse durch eine Wiese von Oben nach unten.
"0" und "1" hast du in einer Imagelist (bildliste) bei den Positionen 0 und 1.
Das Karten array ist map: array[1..10,1..6] of integer;
Quelltext
1: 2: 3: 4: 5: 6:
| for x := 1 to 10 do for y := 1 to 6 do begin bildliste.items[map[x,y]].draw(dx.surface,x*50,y*50,0);{*50 wegen der Pixelgröße der Bilder} end; dx.flip; |
mimi - So 08.06.03 20:46
ich denke er hat mein spiel nicht verstanden sonst hätte er das so gemacht:)
ich weiß der qullcode ist nicht umbeding der sauberste :(
Pyr0cracker - Mo 09.06.03 03:43
Hallo, DANKE für die guten Tips.
Ich hab jetzt ein 2 dimensionales Array für eine Karte in meinem Spiel
Quelltext
1: 2:
| var map: array[0..10, 0..10] of integer; |
Ich kann sie auch abfrageen
Quelltext
1: 2: 3: 4: 5:
| for mapx := 0 to 10 do for mapy := 0 to 10 do begin BodenTex.Items[map[mapx,mapy]].draw(dx.surface,mapx*50,mapy*50,0);{*50 wegen der Pixelgröße der Bilder} end; |
Aber wie kann ich diesem Array übersichtlich Werte zuweisen? (in der OH stehts nicht drinn...)
z.B für:
(z.B. 0=boden, 1=wand)
Ich meine...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| map[1,1] := 0; map[1,2] := 0; map[1,3] := 0;
map[2,1] := 1; map[2,2] := 1; map[2,3] := 1;
map[3,1] := 0; map[3,2] := 0; map[3,3] := 0; |
...ist doch ein bisschen umständlich oder?
Gruß
Elayla - Mo 09.06.03 09:32
Machs so, so hab ich es bei mir auch :)
| Zitat: |
Randomize;
For x:=1 To 48 Do
For y:=1 To 36 Do
Begin
Map[x,y]:=random(3)+1;
End;
|
umpani - Mo 09.06.03 10:08
Im prinzip musst du ein zweites Programm schreiben. Einen Map-Editor.
In deinem fall tut es ein 10x10 großes Stringrid.
Ganz einfaches Beispiel.
Erstelle ein Stringgrid 10x10 ohne fixedrows und fixedcols: grid
Erstelle ein eingabefeld: eingabe
Quelltext
1: 2: 3: 4: 5: 6:
| Ereignis inclick bei grid
begin map[grid.row+1,grid.col+1] := strtoint(eingabe.text); {array wird gefüllt} grid.cells[grid.row+1,grid.col+1]:= strtoint(eingabe.text); {grid wird gefüllt} end; |
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Speichern des Arrays procedure save; var dat: file of tmap; {Typ tmap = array[1..10,1..10] of integer;} begin assignfile(dat,'map.dat'); rewrite(dat); write(dat,map); closefile(dat); end; |
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Laden des Arrays procedure save; var dat: file of tmap; {Typ tmap = array[1..10,1..10] of integer;} begin assignfile(dat,'map.dat'); reset(dat); read(dat,map); closefile(dat); end; |
Elayla - Mo 09.06.03 11:00
Hmm stimmt, deins basiert ja nicht auf Zufallszahlen, sry :)
Aya - Mo 09.06.03 12:48
Hi,
| Pyr0cracker hat folgendes geschrieben: |
Aber wie kann ich diesem Array übersichtlich Werte zuweisen? (in der OH stehts nicht drinn...)
z.B für:
(z.B. 0=boden, 1=wand)
Ich meine... Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| map[1,1] := 0; map[1,2] := 0; map[1,3] := 0;
map[2,1] := 1; map[2,2] := 1; map[2,3] := 1;
map[3,1] := 0; map[3,2] := 0; map[3,3] := 0; |
...ist doch ein bisschen umständlich oder?
Gruß |
benutz einfach Constanten ;)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| const TYP_WIESE = 0; TYP_STRASSE = 1; [...] map[1,1] := TYP_WIESE; map[1,2] := TYP_WIESE; map[1,3] := TYP_WIESE;
map[2,1] := TYP_STRASSE; map[2,2] := TYP_STRASSE; map[2,3] := TYP_STRASSE;
map[3,1] := TYP_WIESE; map[3,2] := TYP_WIESE; map[3,3] := TYP_WIESE; |
Au'revoir,
Aya~
mimi - Mo 09.06.03 15:36
nimm ein record und speichere da die werte rein ein level editor brauchst du nicht umbedingt
Elayla - Mo 09.06.03 16:46
Ich hab das als Array gemacht und geht auch alles super, sogar das scrollen.
Aber wenn ich per Mauskoordinaten scrolle baut der jedesmal das Feld komplett neu auf, halt in die jeweilige Richtung verrückt.
Aber das ist recht langsam je kleiner die Felder werden und je mehr ich Anzeige.
Gibts ne Möglichkeit das besser zu machen und gibts ne Möglichkeit trotz 16x12 Fenster (jedes Feld hat 40x40 px) das Scrollen "Stufenlos" zu machen, also das ich nicht jedesmal um 40px "verschieben" muss?
Ein nahezu Stufenloses Scrollen mit 5px (trotz 40x40 Feldern) oder so wär genial :)
(Aber ich denke da brauch ich ne schnellere Bildaufbaumethode, bis jetzt rufe ich jedesmal ne Prozedur auf die DXDraw komplett neu aufbaut)
Hier mal der Link zum Programm wie es bisher ist, aber damit bin ich nicht wirklich zufrieden, sieht halt doof aus beim scrollen :?
http://www.pro3d.de/gonozal/Map-Creator.zip
mimi - Mo 09.06.03 17:04
mit record meinte ich das so:
Delphi-Quelltext
1: 2: 3: 4:
| TMap = record visible, enabled:Bool; Typ, Tex: Integer; end; |
du muss doch nur schauen wo dein player steht und dann die fehlder entwerder +1 vor bzw. in die gewüntsche richtig scollren oder um 40 einheiten vorscrollen und fertig:)
Elayla - Mo 09.06.03 17:49
Isses eigentlich sinnvoll/empfehlenswert den Aufbau der Karte mit in den DXTimer reinzunehmen, also das die Karte immerwieder aufgebaut wird? :roll:
mimi - Mo 09.06.03 18:57
ich weiß nicht was du meinst aber ich würde es so machen:
1. array laden und füllen z.b. in onCreate
2. im dxTimer array auslesen und zeichnen
oder meinst du was andres ?
Elayla - Mo 09.06.03 18:57
Genau, und der Timer läuft aber immer und ewig? :)
mimi - Mo 09.06.03 19:05
jip da sonst das bild nicht neu gezeinet wird und was auch wichtig ist das der timer auf 1 MS steht:)
Elayla - Mo 09.06.03 19:07
Ohh ... ups ^^
(Wieso auf 1ms? :D)
(Ich seh da keinen Unterschied :oops: )
Ich stells gleich mal um *gg*
mimi - Mo 09.06.03 19:10
ich meinte auf 0 ms :)
unterschied:
der timer baut das bild jede ms neu auf stellst du den werte höhrer ein kann es sein das das bild ruckelt oder sowas:)
Elayla - Mo 09.06.03 19:20
Ahso hehe auf 0 hatte ich ihn, gut hab mich schon gewundert :P
mimi - Mo 09.06.03 21:10
aber hast du den unterschied bemerkt von 0 ms und 1000 ms ?
Elayla - Mo 09.06.03 21:56
hehe jo den bemerkt man ^^
umpani - Di 10.06.03 09:49
Ich persönlich bevorzuge immer einen Level-Editor. Besonders, wenn man ein Strategiespiel programmieren will.
Aber nun zu deiner Frage mit dem flüssigen Scrollen - Hast du die noch?
Wenn ja, dann bist du der ntwort näher als du denkst 8)
Erstelle zwei neue variablelen: scrollx und scrolly vom Typ integer.
Wenn du nach rechts scollen willst:
Quelltext
1: 2: 3: 4: 5: 6:
| begin inc(scrollx) if scrollx >= 40 then scrollx := 0;
end; |
in deiner zeichenprocedur musst du dann folgendes ändern:
Quelltext
1:
| BodenTex.Items[map[mapx,mapy]].draw(dx.surface,mapx*50+scrollx,mapy*50+scrolly,0); |
Entsprchend müsstest du aber dann immer ein Feld mehr zeichnen, weil sonst rechts und unten eine Lücke erscheint.
umpani - Di 10.06.03 09:52
Ach ja, und ich bin mal gespannt, was aus deinem Spiel wird. Könnte ja vielversprechend sein. :lol:
Ich programmiere grade eine art Lands of Lore / Eye of the Beholder / Wizadry 7 Clon
mimi - Di 10.06.03 15:32
@umpani
gibt es schon erste test versionen ?
umpani - Di 10.06.03 15:48
Wen du mich meinst, ja, es gibt erste Test Versionen.
Aber wirklich nur Testversionen.
Nur ein großer Raum, zwei Objekte(animiert), noch keine Decke sondern nur boden und Wände.
Ach ja und auch noch keine richtigen Buttons etc. Das kommt alles, wenn ich mit meiner Staatsprüfung durch bin.
Wenn du aber trotzdem schauen wilst:
[url]
http://www.cbs-shop.de/webser/gras2.zip[/url]
(Die "flüssige" gehen wie z.B. in Lands of Lore kann man in den "Optionen" abschalten.
Erwarte nicht zu Viel, bin erste seit 2-3 Wochen dran.
Elayla - Di 10.06.03 16:09
Hmm klingt interessant, ich baus gleich mal ein, in welchen Teil des Programms muss der Part mit Scrollx und Scrolly und viel wichtiger, wie zeichne ich ein Kartenstück mehr als ich sehen kann? :oops:
Ahh schon ok, hab die richtige Stelle, aber das mit dem zusätzlichen "Bildschnipsel" einfügen bekomm ich nicht hin.
Und wenn ich schreibe
(Form1.DXDraw1.Surface,(x-1)*40+scrollx,(y-1)*40+scrolly,0);
dann scrollt der doch immer 40,xx
Und damit isses ja fast noch schlimmer *gg* oder? :roll:
P.S. Dein Spiel is nett bisher :)
umpani - Di 10.06.03 19:06
So,
bevor ich mir hier die Finger Wundschreibe,
habe ich meine Kiste angeschmissen und Dir mal was programmiert:
http://www.cbs-shop.de/webser/scrollhilfe.zip
Im untersten Textfeld kannst du die Scrollgeschwindigkeit angeben (von 0 - 40). Die anderen Textfelder zeigen die Mausposition und die Position im Array
Gruß Umpani :lol:
[/url]
Elayla - Di 10.06.03 19:42
Lol das is super, vielen vielen Dank :D
Ui sehr interessant, muss ich mir gleich mal intensiver anschauen :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!