Tile Auswahl

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Seven

Betreff: Tile Auswahl

BeitragDi, Dez 06, 2011 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Tag,
ich habe mir Robs Tutorial angeschaut und ich verstehe da eine Sache nicht. Es geht um folgenden
Code (Kommentare habe ich hierfür entfernt):

BlitzBasic: [AUSKLAPPEN]

Dim map(31,23)
Graphics 1024,768,16,3

Tileset = LoadAnimImage("tileset.bmp",32,32,0,6)
Maus = LoadImage("maus.bmp")
Global x,y,mx,my,mapx,mapy,tile = 1

Repeat
SetBuffer BackBuffer()
If KeyDown(1) Then End

For x = 0 To 31
For y = 0 To 23
DrawImage tileset,x*32,y*32,map(x,y)
DebugLog map(x,y)
Next
Next

If KeyDown(2) Then tile = 1
If KeyDown(3) Then tile = 2
If KeyDown(4) Then tile = 3
If KeyDown(5) Then tile = 4
If KeyDown(6) Then tile = 5
If KeyDown(7) Then tile = 0

mx = MouseX()
my = MouseY()

If MouseDown(1) Then
scroll()
map(mapx,mapy) = tile
End If

If MouseDown(2) Then
scroll()
map(mapx,mapy) = 0
End If

If KeyHit(31) Then save()
If KeyHit(38) Then load()

DrawImage maus,mx,my
Flip
Forever

Function scroll()
mapx = (mx)/32
mapy = (my)/32
End Function

Function save()
karte$ = WriteFile("map1.map")
For x = 0 To 31
For y = 0 To 23
WriteLine(karte$,tile)
WriteInt(karte$,map(x,y))
Next
Next
CloseFile(karte$)
End Function

Function load()
karte$ = ReadFile("map1.map")

For x = 0 To 31
For y = 0 To 23
tile = ReadLine(karte$)
map(x,y) = ReadInt(karte$)
Next
Next
CloseFile(karte$)
End Function


Wo genau steht, dass die Variable Tile die unterschiedlichen Tiles übernimmt. Ich habe ein wenig
daran gebastelt und wenn ich noch eine Graphic laden lasse, dann kann diese als Tile mit einbezogen
werden. Ich verstehe nur, wie gesagt, nicht, wo gesagt wurde, dass das so getan werden soll.

2. Nebenfrage, die mir gerade eingefallen ist; Wieso steht Setbuffer Backbuffer() in der Schleife?

Midimaster

BeitragDi, Dez 06, 2011 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei den Grafiken handelt es sich um sog. TileSets. d.h. dass mehrere Tiles zu einem Bild zusammengefügt sind. Alle Teilbilder sind dabei in einer Reihe nebeneinander. Undmit LoadAnimImage() werden sie gemeinsam geladen werden.

Mit den Tasten <1> bis <6> kannst du in deinem Beispiel dann eine Variable Tile% auf wahlweise 1 bis 5 setzen und so eine Map mit Werten füllen. Aus den Werten wird später der Screen erstellt. Eine 1 bedeutet darin, dass an dieser Stelle das 1. Teil-Tile aus dem Gesamtbild gemalt werden soll.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragDi, Dez 06, 2011 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wieso steht Setbuffer Backbuffer() in der Schleife?
Stimmt, ist ein Fehlerchen. Es reicht das einmal nach Graphics zu setzen.
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)
 

Seven

BeitragDi, Dez 06, 2011 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
@Midimaster
Etwa so weit habe ich es auch verstanden. Tile bekommt einen Wert, dieser wird an die
Array weitergegeben, die Array wird durchgearbeitet und je nach Wert wird eine bestimmte
graphic aus einer Datei gezeichnet.
Ich verstehe aber nicht, wo die Überlieferung stattfindet. Wo wird gesagt, dass z.B.
bei dem Wert 3 in map(3,7) das 3. Teilbild ( bzw. das 4. Ich glaube die 0 wird mitgezählt...)
der Datei genommen wird?

Xeres

Moderator

BeitragDi, Dez 06, 2011 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
LoadAnimImage("tileset.bmp",32,32,0,6)

Bildpfad ist klar, dann folgen Breite und Höhe eines Frames.
0 Bedeutet oben links an zu fangen und nichts zu überspringen.
Insgesamt sollen 6 Frames {0,1,2,3,4,5} ausgelesen werden.

Falls man nur LoadImage verwendet, ist das Bild übrigens Frame 0.

Kannst du auch alles in der Online Hilfe nachschlagen Wink
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)
 

Seven

BeitragDi, Dez 06, 2011 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub ich bin zu undeutlich^^

Die Frames sind mir schon ein Begriff, aber im Programm steht doch nirgendwo etwas
in der Art:

If Tile = 1 Then Frame 0

Gut, Frame ist kein Befehl, aber sowas ähnliches hätte ich erwartet.
Das man die Frames Manuel den verschiedenen Werten der Variable zuweisen muss.
Offenbar muss man das aber nicht tun, oder ich habe etwas übersehen und darauf
bezieht sich meine Frage Smile ( * Weihnachtssmiley benutzt * )

Midimaster

BeitragDi, Dez 06, 2011 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
nein, TILE ist eine Variable die du mit der Tastatur veränderst. Ihr Wert wird dann in MAP() eingetragen.

BlitzBasic: [AUSKLAPPEN]
;1. die Tastatur setzt Tile:
If KeyDown(2) Then tile = 1
....
;2. Tile wander in die Map:
map(mapx,mapy) = tile
.....
;3. Aus dem tileset wird ein bestimmtes Teil gemalt und zwar das was in Map() vermekt ist:
DrawImage tileset,x*32,y*32,map(x,y)


das ganze ist in 3 zeilen verarbeitet!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Di, Dez 06, 2011 20:55, insgesamt einmal bearbeitet

Blitzcraft

BeitragDi, Dez 06, 2011 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
   If KeyDown(2) Then tile = 1
If KeyDown(3) Then tile = 2
If KeyDown(4) Then tile = 3
If KeyDown(5) Then tile = 4
If KeyDown(6) Then tile = 5
If KeyDown(7) Then tile = 0

Hier wird je nach gedrükter Taste ein Wert an tile übergeben.

Code: [AUSKLAPPEN]
If MouseDown(1) Then
   scroll()
   map(mapx,mapy) = tile
End If

Und wenn die Maus gedrückt ist wird dann dieser Wert zu map(mapx,mapy) gegeben. Wink

EDIT: Mist er war schneller Surprised
 

Seven

BeitragDi, Dez 06, 2011 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahhhsoooo, jetzt sehe ich es endlich xD

Danke an alle^^

DrawImage tileset,x*32,y*32,map(x,y)
Bei Drawimage ist es ja möglich als 4. Wert das zu zeichnende Frame zu bestimmen
und darauf habe ich nicht geachtet Rolling Eyes

Das einfachste sieht man immer nicht...

Danke nochmal. ^^

Hubsi

BeitragDi, Dez 06, 2011 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Nebenbei noch, bevor sich das bei Dir festsetzt, Handles sind immer Integer. Siehe dazu Deine Speicher-, bzw. Laderoutine Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Seven

BeitragMi, Dez 07, 2011 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Meinst du wegen ReadLine? Das man das durch ReadInt ersetzten kann?
Danke für die Anmerkung.

Ist zwar nicht mein Code, aber gesehen habe ich es auch nicht Smile

ZEVS

BeitragMi, Dez 07, 2011 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, es geht darum, dass ReadFile/WriteFile immer Integrer-Handles zurückgeben. Wenn du die in einem String speicherst, müssen sie immer wieder hin- und her konvertiert werden. Das ist sinnlos langsam.
BlitzBasic: [AUSKLAPPEN]
	karte% = WriteFile("map1.map")   ;Man beachte das Prozentzeichen

Ansonsten stimmt es: Integrer brauchen (prinzipiell) weniger Speicherplatz als Zeilen und können besser als Zahlen eingelesen werden. Dafür machen sie die Datei mit normalen Texteditoren unlesbar.

ZEVS
 

Seven

BeitragMi, Dez 07, 2011 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahso, dass war gemeint.

Gut, daran werde ich denken, danke Smile
 

Seven

BeitragSo, Dez 18, 2011 1:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Da fällt mir noch was ein:
Nehmen wir mal an, dass das hier der Bildschirm ist:

Code: [AUSKLAPPEN]

+--------------------+
|                    |
|      [Screen]      |
|                    |
|                    |
+--------------------+


Und nun werden die tiles reingezeichnet:

Code: [AUSKLAPPEN]

+--------------------+
|43120312013019393021|
|40593920491292041023|                         
|20002031405675346576|                         
|12305434535763426804|                         
+--------------------+


Dabei liegt der Anfangspunkt oben links in der ersten Zeile, also bei 0|0
und ich will diesen Punkt ändern.

Sagen wir mal meine Tiles haben eine Größe von 32 x 32 und ich will,
dass die Oben 100 Pixel nicht von den Tiles benutzt werden.

Und hier nun mein Wahres Problem: Ich will, dass diese 100 Pixel auch beim
Scrolling frei bleiben.

Das ganze hat einfach den Sinn, dass ich in diesen 100 Pixel eine Leiste Platzieren will.
Außerdem hatte ich das Problem auch in einem anderen Bereich und dass habe ich
nicht ganz zufrieden stellend gelöst...

Xeres

Moderator

BeitragSo, Dez 18, 2011 1:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also: Du willst nicht den ganzen Bildschirm voll zeichnen? Dann musst du 100px Konstant beim Zeichnen hinzu addieren.
Vielleicht hilft dir auch ViewPort.
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)
 

Seven

BeitragSo, Dez 18, 2011 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
ViewPort ist schon mal nicht übel. Der Befehl ist neu für mich
und ich werde den auch sicher noch anwenden.

Hie würde ich aber eine andere Lösung vorziehen.
100px hinzurechnen funktioniert nicht so wirklich.
Dann wird einfach alles um 100 px nach unten verschoben,
also die erste Zeile bleibt dann wirklich frei, aber wenn ich runter
scrolle, benutzt er die 100 px wieder.

ZEVS

BeitragSo, Dez 18, 2011 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du verhindern möchtest, dass in den oberen 100px irgendwelche Tiles gezeichnet werden, also alle, die darüber gehen, abgeschnitten werden, dann musst du ViewPorts benutzen oder die Zeile übermalen.

ZEVS

Xeres

Moderator

BeitragMo, Dez 19, 2011 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die Zeichenroutine nicht da anfängt, wo du es ihr aufträgst, machst du etwas verkehrt. Wink
Über die Scroll-Variablen findest du raus, welche Tiles gezeichnet werden müssen. Nur die, die wirklich zu sehen sind, werden auch gezeichnet. Wenn du dann noch Kartenränder hast (man zeichnet ja immer ganze Tiles) die mit nichts anderem übermalt werden, benutzt du Viewport.
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)
 

Seven

BeitragMo, Dez 19, 2011 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres
Die Zeichenroutine fängt ja da an, wo ich es sage, aber eben nur am Anfang.
Sobald ich runter scrolle, werden die 100 bedeckt, weil die 100 px addiert nur
den ganzen Bereich um 100 px verschieben.

Ein Befehl wie ViewPort kommt der Sache näher, aber ich weiß nicht...
Ist das wirklich der Weg, den man normalerweise nutzen würde?

Ein dropdown menü mit scrolling benötigt doch das selbe Prinzip, nicht wahr?
Würde man da auch mit ViewPort arbeiten?

BladeRunner

Moderator

BeitragMo, Dez 19, 2011 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop. probier es doch einfach mal aus Wink
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

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group