Map aufbauen.

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

NtotheS

Betreff: Map aufbauen.

BeitragSo, Jun 19, 2011 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 19, 2011 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, beziehst du dich denn auf 2 oder 3 dimensionale Landschaften?
 

NtotheS

BeitragSo, Jun 19, 2011 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich beziehe mich auf eine 2D landschaft mittels "tileset?".

Hubsi

BeitragSo, Jun 19, 2011 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Als erstes brauchst Du ein Array (dim) vom Prinzip wie dieses:
user posted image

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
For x=0 To mapwidth
If map(x,y)>0 Then DrawImage tile(map(x,y)),x*32,y*32
Next
Next


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)
down=map((player_x+16)/32,(player_y+32)/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 Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

hazumu-kun

BeitragSo, Jun 19, 2011 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 19, 2011 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image

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?

Xeres

Moderator

BeitragMo, Jun 20, 2011 1:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde sagen, wenn man mit LoadAnimImage arbeitet, sollte es so aussehen:
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

NtotheS

BeitragMo, Jun 20, 2011 3:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad
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?

Xeres

Moderator

BeitragMo, Jun 20, 2011 3:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht doch gut aus.
Read überträgt die Werte aus dem Data block in das Array. Sonst enthält das ja nur 6*21 Nullen (Zählung beginnt ab 0!).
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

NtotheS

BeitragMi, Jun 22, 2011 4:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Soo, guten Morgen Very Happy

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? Very Happy

BladeRunner

Moderator

BeitragMi, Jun 22, 2011 5:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 22, 2011 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Sad

bzw: Jetzt geht die Figur zwar langsamer, doch sie "stock" praktisch..

Xeres

Moderator

BeitragMi, Jun 22, 2011 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

NtotheS

BeitragMi, Jun 22, 2011 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragMi, Jun 22, 2011 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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 erstellst + Flip(0), siehe Hurra, 100 % Auslastung.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

NtotheS

BeitragMi, Jun 22, 2011 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Shocked

Midimaster

BeitragMi, Jun 22, 2011 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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
If GegnerZeit<MilliSecs()
GegnerZeit=MilliSecs() + 500
; was auch immer der Gegner alle 500msec tun soll
EndIf

Cls
DrawHinterGrund
DrawGegner
DrawSpieler
Flip
Until KeyHit(1)


Aber Mal-Routinen gehören so gut wie nie in solche IF...MILLISECS()-Abschnitte

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group