Übersicht
DirectQB Teil 3 - Mouse
und Sound
BSAVE & BLOAD
Tuturial No.1
Wie mach' ich eine
Librarie?
Neuvorstellung von
XBall IV
|
Herzlich willkommen in der dritten Ausgabe
der QBasic-Times.
Dieses Mal, geht es um das einbinden der
Mouse und Sound in DirectQB.
Des weiteren hat Jazzman den ersten Teil
seines sehr informativen BLOAD & BSAVE Tuturials geschrieben.
Und für alle, die gerne selbst eine
Librarie in QBasic erstellen wollen , aber nicht wissen wie das geht,
gibt es Abhilfe. Und nebenbei stelle ich mein Spiel XBall IV vor.
Also, Hals- und Beinbruch!
DirectQB
Teil 3 - Mouse und Sound
Also, wie versprochen, hier ist die Fortsetzung
die DirectQB Tuturials.
Dieses Mal geht es um die wirklich wichtigen
Dinge, die DirectQB zu bieten hat und die in einem gutem Spiel auf keinen
Fall fehlen sollten. Es geht um Mouse und Sound.
Beginnen wir einfach mit der Mouse.
Die Mouse wird automatisch beim Initialisieren
von DirectQB mit gestartet. Es gibt also keinen Befehl der die Mouse
extra startet.
Aber es gibt eine Funktion die erkennt
ob der Computer überhaupt eine Mouse besitzt. Es ist DQbMouseDetected.
Wenn keine Mouse installiert ist liefert diese Funktion den Wert 0 zurück.
Um nun die Mouse sichtbar zu machen, gibt
es den Befehl DQBMouseShow.
Der Mousezeiger erscheint nun und kann
mit der mechanischen Mouse über den Bildschirm bewegt werden.
Aber der Mousezeiger alleine bringt es
noch nicht, da ebenfalls dessen Position auf dem Bildschirm wichtig ist.
Mit den Funktionen DQBMouseX
und DQBMouseY kann man nun diese Position
bestimmen. Um die Mouse wieder zu verdecken gibt es diesen Befehl DQBMouseHide.
Wenn es notwendig ist, die Mouse auf eine
Bestimmt Position zu setzten benutz man am besten den Befehl DQBSetMousePos
X, Y
X und Y sind die jeweiligen X- und Y –
Koordinaten.
Wenn man hingegen der Mouse den Bewegungsbereich
einschränken will setzt man den Befehl DQBsetMouseRange
X1, Y1, X2, Y2
X1 und Y1 sind die Koordinaten der linken
oberen Ecke und X2 und Y2 sind die Koordinaten der rechten unteren Ecke.
Um alle Einstellungen rückgängig
zu machen gibt es den Befehl DQBresetMouse
Hier ein Beispiel:
'$INCLUDE:'DIRECTQB.BI'
' DirectQB wird initialisiert
mit einem ExtraLayer, ohne Sound und EMS
IF DQBinit(1, 0,
0) THEN DQBclose: PRINT DQBerror$: END
' Test ob Mouse da
ist
IF NOT DQBmouseDetected
THEN
' Mouse wurde nicht gefunden
PRINT "Dieses Programm benötig eine Mouse!"
DQBclose
END
END IF
DQBinitVGA
' Setzt alle Werte
zurück
DQBresetMouse
' Setzte neue Reichweite
für Mouse
DQBsetMouseRange
6, 6, 314, 148
DO
' lösche Layer 1
DQBclearLayer 1
DQBbox 1, 5, 5, 315, 149, 32
' Einige Extra Informationen
DQBprint 1, "Taste drücken zum Beenden ", 0, 170, 40
' Mouseinformationen
Info$ = "Mouse ist bei " + str$(DQBmouseX) + "," + str$(DQBmouseY)
Info$ = Info$ + " - Buttons: " + str$(DQBmouseLB) + " " +
str$(DQBmouseRB)
DQBprint 1, Info$, 0, 180, 40
' Verdecke Mouse
DQBmouseHide
' Kopiere Layer 1 auf den Bildschirm
DQBcopyLayer 1, VIDEO
' Zeige Mousezeiger wieder
DQBmouseShow
LOOP WHILE INKEY$ = ""
' Programm beenden
DQBclose
Da der Mousezeiger von DirectQB nicht besonders
gut aus sieht hat man auch die Möglichkeit das Aussehen den Zeigers
zu verändern. Mit dem im DirectQB mitgelieferten DQBTool kann man
selbst Mousezeiger malen.
Und mit diesem kleinen Programm kann man
diesen Mousezeiger in sein Spiel einfügen.
DIM SHARED cursor AS STRING * 64
OPEN "mouse.cur"
FOR BINARY AS #1
IF LOF(1) <>
64 THEN CLOSE #1
GET #1, , cursor:
CLOSE #1
DQBsetmouseshape 0, 0, cursor
DQBsetmouseshape ist der Befehl um den neuen Mousezeiger einzusetzen.
Kommen wir nun zum Sound.
DirectQB bietet eine nicht ganz zu verachtendes
Soundlibrarie, es können bis zu 32 Sound parallel neben einander abgespielt
werden. Die Soundsampels selber, können in den RAM geladen werden
um sie aus diesem dann ab zuspielen. Ein Soundsample darf aber leider immer
nur 64KB groß sein.
Um den RAM, beim Initialisieren der DQB
Librarie, frei und zum Benutzen bereit zu machen, wird der zweite Wert
bei DQBInit eingesetzt. Hier ein Beispiel:
Dummy& =
DQBInit (0, 4, 0)
In diesem Fall wurde von DirectQB kein
Layer aber 4 * 64KB Soundablageplatz – so genannter Slot - bereit gestellt.
In diese Slots können nun Soundsample
gespeichert werden.
Das erfolgt durch die Funktion:
DQBloadSound (Slot,
SoundDatei)
Slot gibt die Nummer des Slots an in der
das Sound gespeichert werden soll. Wenn wie im vorher gehenden Beispiel
4 Slots zur Verfügung gestellt wurden, kann die Slotnummer 1 bis 4
betragen.
SoundDatei ist der Name der WAV-Datei
die geladen werden soll.
Da DQBloadsound eine Funktion ist, liefert
sie natürlich einen Wert zurück..
Wenn der Wert 0 ist, dann ist alles in
Ordnung und die Wav-Datei konnte erfolgreich geladen werden
Wenn der Wert 1 ist, konnte die Wav.Datei
nicht gefunden werden.
Ein Lesefehler wird mit dem Wert 2 gemeldet.
Wenn etwas mit der Datei selbst nicht
in Ordnung ist wird der Wert 3 zurück geliefert.
Wert 4 gibt an das das Soundformat nicht
unterstützt wird und der Wert 5 das die Datei größer ist
als 64KB.
Wenn es die Slotnummer nicht gibt kommt
der Wert 6.
Das wichtigste ist aber nun das Abspielen
des Sound, welches mit dem Befehl DQBplaySound erfolgt.
Vorher muß aber erst der Soundblaster
aktiviert werden.
Die Funktion DQBinstallSB ist dafür
verantwortlich.
Für diese Information werden viele
Informationen benötigt.
DQBinstallSB (Volumentabelle, Stimmen, Frequenz, BaseAddr, IRQ, DMA)
Volummentabelle stellt man erstmal
auf FALSE. Dazu kommen wir später noch.
Stimmen gibt an, wie viele Sounds nebeneinander
abgespielt werden können.
Frequenz ist die Standardfrequenz.
BaseAddr gibt den Port des Soundblasters
an. Nomalerweise ist das H220.
IRQ und DMA stellt man am besten auf AUTO,
dann kann man nichts falsch machen.
Ein Beispiel:
IF DQBinstallSB(FALSE,
2, 22050, &H220, AUTO, AUTO) THEN
' FEHLER
DQBclose
END
END IF
In diesem Beispiel wurden 2 Stimmen aktiviert
und der Soundblaster auf 22050 kHz eigestellt.
22050 kHz ist der höchste Wert mit
der besten Klangqualität. Es geht natürlich auch 11025 kHz odedr
8000 kHz.
DQBinstallSB liefert einen wert der ungleich
0 ist wenn estwas nicht stimmt.
Um nun den Sound abzuspielen benutzt
man:
DQBplaysound Slot,
Stimme, Frequenze, Wiederholung
Slot ist die Slotnummer, also welcher Sound
abgespielt wird.
Stimme ist die Nummer der Stimme, also
die Spur auf der der Sound abgespielt werden soll.
Frequenze ist die Frequenze mit der dieser
Sound abgespielt werden soll.
Wenn man für Wiederholung 0 einsetzt
wird der Sound nur einmal abgespielt.
Wenn man 1 angibt, wird der Sound immer
wiederholt.
Stoppen kann man den Sound dann nur mit
DQBstopVoice Stimme
Wobei Stimme die Nummer der Spur ist welche
gestoppt werden soll.
Um beim Beenden des Programms den Soundblaster
wieder zu deaktivieren
Benutzt man einfach DQBremoveSB
Beispiel:
'$INCLUDE:'DIRECTQB.BI'
IF DQBinit(0, 1, 0) THEN DQBclose: PRINT DQBerror$: END
' Starte Soundblaster
auf 220h als Base Adresse
' finde IRQ und
DMA selbständig. 2 Stimmen werden initialisiert
' Die Samplingrate
ist 22 kHz
IF DQBinstallSB(FALSE,
2, 22050, &H220, AUTO, AUTO) THEN
' Fehler
DQBclose
END
END IF
' Fragt den Benutzer
nach der SoundDatei
INPUT "Welche WAV
soll geladen werden: ", File$
' Lädt Sound
in den Speicher
IF DQBloadSound(1,
File$) THEN DQBclose: PRINT „Fehler beim laden: END
PRINT "Taste drücken zum beenden..."
' Spielt den Sound
1 mit 22kHz auf Spur 2 einmal
DQBplaySound 1,
2, 22050, 0
WHILE INKEY$ = "": WEND
DQBremoveSB
DQBclose
So, das was es für diese Ausgabe.
In der nächsten geht es dann um Sprites.
Soeren
Dressler
BSAVE
& BLOAD <-- Tuturial No.1 -->
Geschrieben von Jazzman - Clocksoft
www.freenet.de/Clocksoft
Clocksoft@freenet.de
In diesem Tuturial möchte ich kurz
geschreiben wie man mit BSAVE und BLOAD umgeht, da
es so viel darüber zu schreiben gibt,
werden wohl noch ein paar Tuturials folgen.
Diese Tuturial ist in mehre Abschnitte
aufgeteilt:
1.) Die Parameter von BSAVE & BLOAD
2.) Erklärung zu BSAVE & BLOAD
3.) Einen Text speichern und wieder laden
4.) Denn ganzen Bildschirm speichern und
wieder laden
1.) Die Parameter von BLOAD & BSAVE
BSAVE dateiname, offset, länge
BLOAD dateiname (,offset)
- dateiname Hier muß der Name
anzugeben, wo die Daten gespeichert bzw. geladen werde
sollen, es gelten Dosregeln für die Namensvergabe.
- offset
Die Anzahl von Bytes von dem Speichersegment, von dem das speichern beginnen
soll.
- länge
Gibt die länge der Datei an, zwischen 0 und 65 353 Bytes.
2.) Erlärung zu BSAVE & BLOAD
Mit BSAVE werden die die Daten nicht einfach
so gespeichert, sondern der Speicherbereich
wird gespeichert, alos 100% Computeroptimiert,
es muß nichts umgewandelt werden, sondern
wird direkt zurück in den Speicher
geschrieben, dadurch werden die gespeicherten Daten
wesentlich BSAVE und BLOAD haben dadurch,
dass sie die Daten einfach wieder in den Speicher
geladen werden müssen den Vorteil,
dass sie sehr schnell sind, das man damit Animationen
ermöglichen kann. Es wird nichts
als Klartext gespeichert, so das niemand die Dateien
einfach lesen kann, kleine Verschlüsselung,
aber ohne na ja.
3.) Einen Text speichern und wieder laden
Damit man Texte speichern kann, muß
man nicht viel machen, den zu speichernden Text
speichert man erst mal als String in eine
Variable, dessen Offset wird mit VARPTR bestimmt,
das Speichersegment der Variable wird
mit VARSEG bestimmt, dass heißt es wird die genaue
Speicherstelle der Variable bestimmt,
die BSAVE dan Speichert um sie beim laden einfach nur
wieder an die entsprechende zu laden.
Hier ein erklärtes Beispiel:
Text$ = "Das ist ein Test" | 'Hier ist unsere Variable |
DEF SEG = VARSEG(Text$) | 'Hier wird das Standartspeichersegment
auf den
'Anfang des Segmentes der Variable gesetzt, dies 'wird mit VARSEG automatisch gemacht. |
BSAVE "TUT1.BSV", VARPTR(Text$), 48 | 'BSAVE speichert jetzt die Variable in
die Datei
'TUT1.BSV, der Offset der Datei wird mit VARPTR 'ermittelt, die Länge der Datei wird auf 48 Bytes 'festgelegt, wenn die Variable zu groß ist stürzt 'QBasic ab, das macht sich bemerkbar wenn der 'anzuzeigende Text falsch ist, bei der nächsten 'Aktion wird QBasic die Fehlermeldung 'INCORRECT SPACE anzeigen und mutwillig beenden |
Text$ = "" | 'Löscht den Inhalt der Variable. |
BLOAD "TUT1.BSV", VARPTR(Text$) | 'Läd die Datei TUT1.BSV und speichert
die Daten in
'der Variable Text$, dessen Speicheroffset mit 'VARPTR bestimmt wird. |
DEF SEG | 'Speichersegment wieder auf den Standart setzen |
PRINT Text$ | 'Zum Testen wird die Variable angezeigt |
4.) Denn ganzen Bildschirm speichern und wieder laden
Dafür giebt es eine sehr einfache
Methode
SCREEN 13 | 'Denn Bildschirm auf SCREEN 13 setzen,
der hat die
'die Auflösung von 320 x 200 Pixeln in 256 Farben. |
FOR x = 1 TO 320
FOR y = 1 TO 200 PSET (x, y), INT(RND * 15) NEXT y NEXT x |
'Hier wird auf den ganzen Bildschirm ein
Zufalls-
'muster erzeugt. |
DEF SEG = &HA000 | 'Hier wird das Speichersegment auf das
des Bild-
'schirms gesetzt, der Hexwert ist mit A000 fest, 'dies ist der Anfang des Bildschirmsegments. |
BSAVE "TUT2.BSV", 0, 64000 | 'Hier wird der gesamte Bildschirm in der
Datei
'TUT1.BSV gespeichert. Es wird der Anfang des Bild- 'schirmsegments und die folgenden 64000 Bytes 'gespeicher. Die 64000 Bytes ergeben sich aus 'Höhe x Breite der Auflösung, hier '320 x 200 = 64000, der Offset ist auf Null gesetzt, 'weil wir ja von anfang an anfangen, wird dieser 'geändert fehlt das entsprechende Stück am Anfang 'des Bildes |
CLS | 'Die Bildinformationen werden gelöscht |
BLOAD "TUT2.BSV" | 'Die ebend gespeicherten Informationen
werden
'wieder geladen |
DEF SEG | 'Speichersegent wieder auf Standart zurücksetzten |
Ich hoffe das euch diese Tuturial weitergeholfen
hat, wenn ich noch Fragen oder Anregungen
habt schreibt mir, ich habe immer ein
offenes Ohr für Fragen.
Jazzman / Clocksoft (f) 2000 Clocksoft@freenet.de
Wie
macht man Librarie in QBasic?
Es kam immer wieder die Frage, wie
man eigentlich selbst eine Librarie erstellt.
Zuerst sollte ich vielleicht erklären,
was überhaupt eine Librarie ist.
Die Librarie, abgekürzt LIB, ist
eine Sammlung von Befehlen also SUBs und Funktionen die extern in QBasic
benutzt werden können.
Um nun eine eigene Librarie zu erstellen,
benötigt man die SUBs und Funktionen , die in der Librarie enthalten
sein sollen.
Diese müssen sich in einer BAS Datei
befinden, die kein Hauptprogramm besitzt sondern nur die SUBs und Funktionen
und deren DECLARE Befehle.
Man klickt nun im Menü auf RUN und
dann auf MAKE LIBRARY.
QBasic will nun wissen wie die Librarie
heißen soll. Man gibt den Namen ein und klickt danach auf MAKE LIBRARY.
QBasic erstellt nun die gewünschte
Librarie, die aber so noch nicht verwendbar ist, da QBasic nur mit QLB
Dateien etwas anfangen kann.
Diese QLB Datei kann man mit dem Programm
LINK.EXE erstellen, welche bei QBasic mit dabei ist.
Man gibt also als DOS-Befehl folgendes
ein.
LINK /QU MEINE.LIB, MEINE.QLB, NUL, QUICKQLB.LIB
MEINE.LIB ist die von QBasic erstellte
LIB-Datei
MEINE.QLB ist die fertige Librarie.
QUICKQLB.LIB ist die Librarie die dein
Compiler benötigt.
(BQLB45.LIB ist es bei QuickBasic4.5 und
QBXQLB.LIB bei PDS oder auch QBASIC7.1)
MEINE.QLB kann zwar nun von QBasic mit
qb /l meine.qlb
gestartet werden, aber QBasic kennt die
deklarierten SUBs und Funktionen noch überhaupt nicht.
Für diesen Zweck benötigt QBasic
eine BI Datei, in welcher der Inhalt des Hauptprogramms, also alle DECLARE
Zeilen stehen.
Die BI Datei wird innerhalb des Programm,
welches mit der Librarie arbeiten soll, mit
‘INCLUDE:‘MEINE.BI‘
eingesetzt.
Ich hoffe diese Erklärung war verständlich.
Also viel Spaß beim Progen!
Soeren
Dressler
Der vierte Teil der Breakoutvariante ist
da.
Aber WAS IST BREAKOUT werden sich die
meisten Fragen.
Ich werde jetzt hier nicht erklären,
was Breakout ist. Aber ich werde ein wenig über mein Spiel XBall
plaudern.
XBall, ist wie schon gesagt, eine Breakoutvariante,
bei der es darum geht, mit einem kleinen Ball die Steine aus dem Spielfeld
zu schlagen. Als einzige Steuermöglichkeit hat der Spieler einen Schläger,
auch Paddel genannt.
Mit
diesem Paddel hindert man den Ball auf dem Boden auf zuschlagen. Denn wenn
das passiert, verliert man diesen Ball und sieht ihn nie wieder. Die Anzahl
der Bälle ist begrenzt. Ich muß also nicht sagen, dass man möglichst
sparsam mit den runden Kugeln umgehen sollte.
Ziel ist es nun, alle grünen Steine
aus dem Spielfeld zu befördern. Dieses Ziel ist aber mit einigen Hindernissen
ausgestattet. Je nach Level, liegen noch andere Steine im Weg. Diese
müssen selbstverständlich vorher abgeschossen werden. Aber genau
diese Steine haben ihre Tücken. Es gibt Seine, aus denen seltsame
Dinge heraus fallen. Wenn man diese Objekte auf fängt, lösen
sie eine Aktion aus. Das Symbol auf den Objekten zeigt vorher an, welche
Eigenschaft diese oder jenes besitzt.
Es kann zum Beispiel einen neuen Ball
herbei zaubern oder einen aus dem Archiv verschwinden lassen. Einige
bringen Punkte mit und wieder andere nehmen diese weg. Es gibt auch welche,
die den Schläger vergrößern oder verkleinern können.
Wie gut man sich anstellt oder wie schlecht,
zeigt die Highscore.
XBall
IV ist eine Freeware. Es kann auf http://qmystic.xxn.de
oder auf http://basic.de.cx down geloadet
werden. Im Paket enthalten, ist das Spiel, einige Levels und ein Editor,
mit welchem man selbst Levels erstellen kann.
Wenn du ein Level selbst gemacht hast,
schick es mir einfach unter soeren01@t-online.de
Ich stelle es dann mit auf die Seite.
Bei Fragen, Problemen oder Vorschlägen,
schreibt mir unter soeren01@t-online.de.
Viel Spaß!
Soeren Dressler
So, das war’s für diese
Ausgabe. Ich hoffe das die QBasic-Times in Zukunft genauso gut ankommt
wie bisher.
Also, wenn ihr etwas habt,
was unbedingt mit in die nächste Ausgabe soll (Werbung für eure
Seite oder Spiel oder Tool oder ein Tuturial ...) , dann schick es
mir einfach.
Bis zum nächsten Mal!