Map aufbauen.
Übersicht

NtotheSBetreff: Map aufbauen. |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Guten Abend, meine lieben "blitzforum"-mitmenschen.
Lange habe ich gedacht - "Wie schaft man eine Landschaft mit Kollisionsabfrage". Die Antwort liegt wohl irgendwo in den "Dim"-feldern verborgen, laut robs-tut. Und hier ist der Knochen begraben, es gibt NUR Robs-TuT....zweifelhaft ist dieser "Rob" ein "begabter" Bliz-Programmierer...doch für Anfänger ist dieser Tut wirklich sehr schwer zu verstehen. Deswegen wende ich mich an euch - Kann hier jemand eine ganz einfache Theorie aufstellen wie es am einfachsten zu realisieren ist. Ich erwarte und will auch keinen fertigen code...aber verweise auf Blitzbasic-Befehle werden mir genau so wenig helfen, wenn man nicht wenigstens einen kleinen ansatz hat für den anfang. Ich bedanke mich schon mal jetzt. |
||
dont_know_to_use |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm, beziehst du dich denn auf 2 oder 3 dimensionale Landschaften? | ||
NtotheS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich beziehe mich auf eine 2D landschaft mittels "tileset?". | ||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Als erstes brauchst Du ein Array (dim![]() Dabei stehen die einzelnen Werte die größer 0 sind für eine Grafik aus dem Tileset (ob die jetzt aus einem AnimImage kommen oder auch in ein Array geladen sind ist erstmal egal). Zum anzeigen der Map auf dem Bildschirm bieten sich verschachtelte For-Schleifen an: BlitzBasic: [AUSKLAPPEN] For y=0 To mapheight Im Beispiel habe ich die Tiles einzeln in ein Array geladen, bleibt aber Dir überlassen. Weiter gehts mit der Kollision: BlitzBasic: [AUSKLAPPEN] up=map((player_x+16)/32,player_y/32) Ich gehe dabei davon aus das die Tiles 32x32 Pixel groß, ebenso wie die Spielfigur. Für links und rechts kannst Du es Dir dann selbst umdenken. Wenns erstmal verstanden ist, ist es nur noch ums tippen ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
hazumu-kun |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alle Felder der Map bekommen zusätzlich zur Information welches Tile gezeichnet werden soll einen "Modus". Wie z.B. "Wand".
Dein Code verarbeitet dann diesen Modus in der Kollisionsabfrage. Beim Modus "Boden" kann man drübergehen, der Modus "Wand" würde deine Spielfigur aber stoppen. Programmiertechnisch kann du dazu ein Dreidimensionales Dim nehmen. Code: [AUSKLAPPEN] Dim (x,y,v)
2 Dimensionen für die jeweilige Position. Die 3te wählt dann den zu behandelnden Wert aus: Tile(unter v=0 gespeichert) oder Modus(v=1) mfg hazu |
||
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann -> nicht omnipotent |
NtotheS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bei dem Beispiel würde ich es so machen: Dim (2,2,1?) For y=0 To 2 For x=0 To 2 If map(x,y)>0 Then DrawImage tile(map(x,y)),x*32,y*32 Next Next Wär das den "logisch" okay? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde sagen, wenn man mit LoadAnimImage![]() BlitzBasic: [AUSKLAPPEN] DrawImage(TileSet, x*32, y*32, map(x,y,0)) TileSet ist das Bild, das in 32px Schritten die Tiles enthält, aus "map" liest man den richtigen Frame aus. Und die dritte Dimension darfst du auch nicht unterschlagen, wenn du eine benutzt. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
NtotheS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also.
tileset = LoadAnimImage("tileset.bmp",32,32,0,4) Damit lese ich die "tilemap" ein. Dann definiere zweidimensionales "Dim"- Feld. Dim map (5,20) - Soweit ich es beurteilen kann soll das hier die x und die y darstellen. Dann gebe ich der tilemap eine bedeutung, indem ich die Zahlen ablesen kann von dem Bild und so die grafische Landschaft nach meinen belieben zu erstellen. Data 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 Data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2 Data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2 Data 2,0,3,3,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2 Data 2,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2 Data 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2 Verstehe ich leider nicht ![]() For y = 0 To 20 For x = 0 To 20 Read map(x,y) Next Next - Ist den mein Verständnis überhaupt richtig oder ist schon der Kern falsch? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sieht doch gut aus.
Read ![]() ![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
NtotheS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Soo, guten Morgen ![]() Code: [AUSKLAPPEN] Graphics 800,800,0,2 bild = LoadAnimImage("tileset.bmp",32,32,0,4) char = LoadAnimImage ("char.png",32,32,0,12) ;Koordinaten der Figur px = 7 py = 7 ;Damit die Figur angezeigt wird move = 1 Dim map(15,15) Data 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 Data 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 For y = 0 To 14 For x = 0 To 14 Read map(x,y) Next Next While Not KeyDown(1) SetBuffer BackBuffer() Cls For y = 0 To 14 For x = 0 To 14 DrawBlock bild, x*32,y*32,map(x,y) Next Next ;Unten If KeyDown(208) Then If map(px,py+1) < 2 Then py = py + 1 Schritt=Schritt+1 If (Schritt<0) Or (Schritt>2) Then Schritt=0 move = 1 EndIf EndIf EndIf ;Oben If KeyDown(200) Then If map(px,py-1) < 2 Then py = py - 1 Schritt=Schritt+1 If (Schritt<9) Or (Schritt>11) Then Schritt=9 move = 1 EndIf EndIf EndIf ;Links If KeyDown(203) Then If map(px-1,py) < 2 Then px = px - 1 Schritt=Schritt+1 If (Schritt<3) Or (Schritt>5) Then Schritt=3 move = 1 EndIf EndIf EndIf ;Rechts If KeyDown(205) Then If map(px+1,py) < 2 Then px = px + 1 Schritt=Schritt+1 If (Schritt<6) Or (Schritt>8) Then Schritt=6 move = 1 EndIf EndIf EndIf If move = 1 Then x = px * 32: y = py * 32:DrawImage char,x,y,Schritt Flip Wend End Hmm hat einer einen kleinen tipp warum der Bildschirm schwarz wird wenn ich den Timer reinsetze? ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ohne zu wissen wie Du 'den Timer reinsetzt' nicht wirklich, fürchte ich.
Ich weiss ja nicht ob es durchs Einfügen hier ist, aber uneingerückter Code ist fürchterlich zu lesen. Du solltest Dir das Einrücken also dringend angewöhnen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
NtotheS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Gut also eindrücken ist eine sache.
Nein ich habe es noch nicht eingefügt, da ich immer das selbe ergebniss kriege..egal wo ich es hintue. ![]() bzw: Jetzt geht die Figur zwar langsamer, doch sie "stock" praktisch.. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie meinst du, sollte man dir helfen, wenn wir von dir nicht den Fehlerhaften Code bekommen? Raten? Kristallkugel?
Poste den fehlerhaften Code! |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
NtotheS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der Code ist doch schon da oben gepostet worde!
Ich weiß nur nicht wohin ich die "Zeitberechnung" reinsetzen soll. Hier der Code nochmal: Code: [AUSKLAPPEN] Graphics 480,520,0,2
AppTitle "Night - The Game Alpha-Version0.2" bild = LoadAnimImage("map.png",32,32,0,40) char = LoadAnimImage ("char.png",32,32,0,12) font = LoadFont("Arial",15,1) SetFont font ;Koordinaten der Figur px = 7 py = 7 ;Damit die Figur angezeigt wird move = 1 Dim map(15,15) Data 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 Data 15,1,2,0,0,0,0,0,0,0,0,19,17,18,15 Data 15,13,14,0,0,0,0,0,0,0,0,31,29,30,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,5,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,0,0,0,0,0,0,0,0,0,0,0,0,0,15 Data 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 For y = 0 To 14 For x = 0 To 14 Read map(x,y) Next Next While Not KeyDown(1) SetBuffer BackBuffer() If Zeit<MilliSecs() Zeit=MilliSecs() + 60 Cls For y = 0 To 14 For x = 0 To 14 DrawBlock bild, x*32,y*32,map(x,y) Next Next If map(px,py) = 1 Or map(px,py) = 2 Or map(px,py) = 13 Or map(px,py) = 14 Color 255,0,0 Text 1,500, "Drücke die Leertaste um Blumen zu pflanzen" EndIf Print px Print py ;Unten If KeyDown(208) Then If map(px,py+1) < 15 Then py = py + 1 Schritt=Schritt+1 If (Schritt<0) Or (Schritt>2) Then Schritt=0 move = 1 EndIf EndIf EndIf ;Oben If KeyDown(200) Then If map(px,py-1) < 15 Then py = py - 1 Schritt=Schritt+1 If (Schritt<9) Or (Schritt>11) Then Schritt=9 move = 1 EndIf EndIf EndIf ;Links If KeyDown(203) Then If map(px-1,py) < 15 Then px = px - 1 Schritt=Schritt+1 If (Schritt<3) Or (Schritt>5) Then Schritt=3 move = 1 EndIf EndIf EndIf ;Rechts If KeyDown(205) Then If map(px+1,py) < 15 Then px = px + 1 Schritt=Schritt+1 If (Schritt<6) Or (Schritt>8) Then Schritt=6 move = 1 EndIf EndIf EndIf ;Zaun zu Blumen umwandeln If KeyDown(57) Then If map(px,py) = 1 Or map(px,py) = 2 Or map(px,py) = 13 Or map(px,py) = 14 Then For y = 0 To 14 For x = 0 To 14 If map(x,y) = 1 Or map(x,y) = 2 Or map(x,y) = 13 Or map(x,y) = 14 Then map(x,y) = 4 End If Next Next EndIf EndIf If move = 1 Then x = px * 32: y = py * 32:DrawImage char,x,y,Schritt EndIf Flip Wend FreeFont font End |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, und ohne genau die Zeilen zur "Zeitberechnung" die du weg lässt, kann dir Niemand sagen, was du falsch machst.
Was du hier brauchst, ist ein Timer den du mit CreateTimer ![]() ![]() Anstatt mit 60 Hz Zeichnest du den Bildschirm alle 60ms (~17 Hz) neu. SetBuffer BackBuffer() kannst du vor die Schleife verschieben. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
NtotheS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Achso. Ja danke ich sehe schon das er wesentlich flüssiger läuft.
Warum dan das mit MilliSecs, bleib wohl ein Rätsel des Jahres ![]() |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Timer mit Millisecs() habe schon ihre Bedeutung in Spielen:
Etwa da, wo es darum geht Spiefiguren zu bewegen oder Aktionen auszulösen. BlitzBasic: [AUSKLAPPEN] Repeat Aber Mal-Routinen gehören so gut wie nie in solche IF...MILLISECS()-Abschnitte |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group