Hallo,
@Bisonte
wie ich in meinem Eingangspost erwähnte, wird das, was ich hier gerade
versuche zu entwickeln das Gerüst für meine Spielprogramme. Da ich mittlerweile
pensioniert bin, bin ich nicht mehr schnell genug für Ego-Shooter. Also muss ich
mir meine Spiele selber schreiben, da es ja kaum noch was ohne Action gibt.
Außer Civilization. und da spiele ich immer noch am liebsten die Version III.
Die neueren Versionen gefallen mir nicht so gut. Also schreibe ich Kartenspiele und Brettspiele
für mich mit Compi als Gegner. (MauMau; 1000 km; Sudoku; Sokoban; Schiffe Versenken usw.
ein Civilization für Arme habe ich auch schon geschrieben).
Dazu brauche ich das Gerüst, welches immer gleich ist.
Definitionen - Vorbereitung - Hauptspiel -Nachspiel.
Aus dem Hauptspiel wird dann gesprungen zum Menschenzug (MEZU) und Computerzug (COZU)
Beim Menschenzug brauche ich dann natürlich immer das Abfangen der Schnittstellen Maus,Tastatur,Monitor und Windows.
Und das versuche ich gerade in PB zu lernen.
Ich habe Deine Ratschläge beherzigt und die Enumerationen angepasst.
Lediglich die Tastaturabfrage verstehe ich hier überhaupt nicht. Kann man nicht einfach
irgendwie den ScanCode der Tasten abfragen ?
Das war ja das, was mit eventparamw schon ganz gut geklappt hat.
Die Add_keyboard_shortcuts finde ich sehr mühsam und außerdem bekomme ich sie noch nicht
abgefragt. In der Hilfe steht zwar die Syntax, aber nciht wie ich sie aufrufe und verwerte.
Noch 'ne Frage. Muss if wirklich immer 3-zeilig sein?
Geht nicht ein einfaches ==> if a$="quatsch" then b$="Unsinn"
---------------
if a$="quatsch"
b$="Unsinn"
endif
-------------
finde ich viel unübersichtllicher
Ich habe den Code weiter ausgebaut und jetzt auch den Hilfebildschirm eingebaut.
Grösstes Problem für mich ist noch die Tastaturabfrage.
Danke für die Hilfe im voraus
Code: Alles auswählen
;-------------------------------------------------------------
AA-INIT:
;-------------------------------------------------------------
;zusätzliche Bibliothek laden
UseJPEGImageDecoder()
;UseJPEGImageEncoder()
; -------------------------------------------------------------
;Prozeduren anmelden
Declare MELDAUTOR(titel$,autor$)
Declare MELDUNTEN(meldu$)
Declare MELDULOESCH()
Declare ZE_HIGRU()
Declare WAITKEY()
Declare WAITSTRING()
Declare INFO_0()
Declare INFO_1(infotafel,infomax)
Declare MEZU()
Declare COZU()
; -------------------------------------------------------------
;testen ob das Fenster ordnungsgemaess geöffnet werden kann
;wird nur bei screen benötigt; screen benutzt man wenn man sprites nutzt
;If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
; MessageRequester("Error", "Can't open the sprite system", 0)
; End
;EndIf
; -------------------------------------------------------------
;Variablendeklarationen
Enumeration ; Fenster
#cv001
EndEnumeration
Enumeration ; bilder
#bld01
#bld02
#bld03
EndEnumeration
Enumeration 100; Tasten
#kb000
#kb001
#kb002
#kb003
#kb004
#kb005
#kb006
#kb007
#kb008
#kb009
; #kb010
; #kb011
; #kb012
EndEnumeration
Global Dim gg(40)
Global autor$,titel$
;-----
AUTOR$="(c) Diogenes"
TITEL$="Test-PureBAsic"
HBILD$="test-pb.jpg"
; -------------------------------------------------------------
;hier wird das Hauptfenster geöffnet
OpenWindow(0,300,100,1024,768,titel$, #PB_Window_SystemMenu)
CanvasGadget(#cv001,0,0,1024,768,#PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
AddKeyboardShortcut(0,#PB_Shortcut_All, #kb000)
AddKeyboardShortcut(0,#PB_Shortcut_Escape,#kb001)
AddKeyboardShortcut(0,#PB_Shortcut_Up, #kb002)
AddKeyboardShortcut(0,#PB_Shortcut_Right, #kb003)
AddKeyboardShortcut(0,#PB_Shortcut_Down, #kb004)
AddKeyboardShortcut(0,#PB_Shortcut_Left, #kb005)
AddKeyboardShortcut(0,#PB_Shortcut_Tab, #kb006)
AddKeyboardShortcut(0,#PB_Shortcut_Return,#kb007)
AddKeyboardShortcut(0,#PB_Shortcut_Space, #kb008)
AddKeyboardShortcut(0,#PB_Shortcut_J, #kb009)
SetActiveGadget(#cv001) ;wichtig: Tastatur funktioniert sonst nicht
; -------------------------------------------------------------
;hier werden die Schriften vorgeladen, damit sie im Programm zur Verfügung stehen
LoadFont(1,"Arial",32)
LoadFont(2,"Bookman Old Style",18,#PB_Font_Bold )
; -------------------------------------------------------------
;jetzt soll das Hintergrundbild geladen werden
;hier wird das Bild aus der EXE ausgelesen, in die es integriert ist
CatchImage(#bld01,?zz_Higru)
;hier wird das Bild von der HDD geladen
;#bld01=LoadImage(#PB_Any,HBILD$)
;----
;bilder erstellen für meldunten und meldtast
If IsImage(#bld01)
GrabImage(#bld01,#bld02, 0, 704, 1024, 32)
GrabImage(#bld01,#bld03, 0, 672, 1024, 32)
EndIf
; -------------------------------------------------------------
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Vorbereiten des Spieles und des Spielfeldes
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AF_VORSPIEL:
;
ZE_HIGRU()
StartDrawing(CanvasOutput(#cv001))
;StartDrawing(WindowOutput(0))
DrawingFont(FontID(1))
DrawingMode(1)
FrontColor(RGB(255,255,200)):
DrawText(10,10,"Das ist ein tolles fenster ")
StopDrawing()
MELDAUTOR(titel$,autor$)
MELDUNTEN("Information gewuenscht ? <j> / <n>")
tas=WAITSTRING()
If tas=74
INFO_0()
EndIf
MELDULOESCH()
gg(3)=1
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; hier beginnt die eigentliche Spielschleife
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AH_HAUPTSPIEL:
InitKeyboard():InitMouse()
gg(10)=0
DIPEND=0
Repeat
If gg(3)=1
COZU()
EndIf
If gg(3)=2
MEZU()
EndIf
gg(3)=(gg(3)-1)*(-1)+2
Until gg(1)>0
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Nachspiel = Beendigung des Spieles
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AI_NACHSPIEL:
dipend=gg(1)
Select dipend
Case 9
MELDUNTEN("Abbruch - <Taste druecken>")
Case 3
MELDUNTEN("Geschafft - Glueckwunsch <Taste druecken>")
Case 4
MELDUNTEN("Du hast gewonnen - Glueckwunsch <Taste druecken>")
Case 5
MELDUNTEN("Ich habe gewonnen <Taste druecken>")
Case 10
dummy=1
EndSelect
If dipend<10
WAITKEY()
MELDUNTEN("Neustart ? (J/N)")
tas=WAITSTRING()
gg(1)=0
If tas=74
gg(1)=8
EndIf
MELDULOESCH()
If gg(1)=8
Goto AF_VORSPIEL
EndIf
EndIf
ZE_HIGRU()
Delay(1000)
End
; =============================================================
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BA_Procedures:
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MELDAUTOR(titel$,autor$)
StartDrawing(CanvasOutput(#cv001))
;StartDrawing(WindowOutput(0))
fa1=RGB(0,0,0):fa2=RGB(90,100,10):fa3=RGB(255,255,0)
FrontColor(fa1):Box (0,736,1024,32)
FrontColor(fa2):Box (1,737,1023,30)
DrawingFont(FontID(2)):DrawingMode(1)
DrawText(11,739,titel$,fa1):DrawText(809,739,autor$,fa1)
DrawText(10,738,titel$,fa3):DrawText(808,738,autor$,fa3)
StopDrawing()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MELDUNTEN(meldu$)
fa1=RGB( 0, 0, 0)
fa2=RGB(185,015, 0)
fa3=RGB(255,255, 0)
StartDrawing(CanvasOutput(#cv001))
;StartDrawing(WindowOutput(0))
FrontColor(fa1):Box (0,704,1024, 32)
FrontColor(fa2):Box (1,705,1022, 30)
DrawingFont(FontID(2)):DrawingMode(1)
DrawText(101,707,meldu$,fa1)
DrawText(100,706,meldu$,fa3)
StopDrawing()
EndProcedure
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MELDULOESCH()
StartDrawing(CanvasOutput(#cv001))
;StartDrawing(WindowOutput(0))
DrawImage(ImageID(#bld02),0,704)
StopDrawing()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_HIGRU()
StartDrawing(CanvasOutput(#cv001))
;StartDrawing(WindowOutput(0))
DrawImage(ImageID(#bld01),0,0)
StopDrawing()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure WAITKEY()
quit=0
Repeat
Event = WaitWindowEvent()
If event=#PB_Event_Gadget
If EventGadget()=#cv001
If EventType()=#PB_EventType_Input
quit=1
EndIf
EndIf
EndIf
If event=#PB_Event_CloseWindow
quit=1:gg(1)=10
EndIf
Until quit>0
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure WAITSTRING()
quit=0:taste=0
Repeat
taste=0
Event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
dummy=1
Case #WM_KEYUP
taste=EventwParam()& $FFFF
Case #PB_Event_CloseWindow
quit=1:gg(1)=10
EndSelect
If taste>0
; MELDUNTEN(Str(Taste))
; Delay(500)
; MELDUNTEN(".")
quit=1
; If taste=27
; quit=1
; EndIf
; taste=0
EndIf
Until quit=1
ProcedureReturn taste
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure INFO_0()
infoende=0
infotafel=1
infomax=2
ZE_HIGRU()
MELDAUTOR(titel$,autor$)
Repeat
INFO_1(infotafel,infomax)
tas=WAITSTRING()
Select tas
Case 27
infoende=1
Case 37
infotafel=infotafel-1
Case 39
infotafel=infotafel+1
EndSelect
If infotafel=0
infotafel=infomax
EndIf
If infotafel>infomax
infotafel=1
EndIf
Until infoende=1
ZE_HIGRU()
MELDAUTOR(titel$,autor$)
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure INFO_1(infotafel,infomax)
If infotafel=1
Restore ZZ_INFO_01
EndIf
If infotafel=2
Restore ZZ_INFO_02
EndIf
StartDrawing(CanvasOutput(#cv001))
FrontColor(RGB(80,80,80))
Box (0,0,1023,736)
StopDrawing()
If infomax=1
MELDUNTEN("Zum Beenden: <esc> druecken")
EndIf
If infomax>1
MELDUNTEN("Beenden <esc> ; Blaettern <re> <li>")
EndIf
StartDrawing(CanvasOutput(#cv001))
DrawingFont(FontID(2))
DrawingMode(1)
FrontColor(RGB(255,255,200)):
For q =1 To 26
Read.s info$
dx=25:dy=q*20+40
DrawText(dx,dy,info$)
Next q
StopDrawing()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MEZU()
gg(10)=0
gg(11)=0
gg(12)=0
gg(13)=0
gg(14)=0
Repeat
event=WaitWindowEvent()
If Event=#PB_Event_Gadget And EventGadget() = #cv001
If EventType() = #PB_EventType_LeftButtonDown
gg(13)=1:gg(10)=1
gg(11)=GetGadgetAttribute(#cv001,#PB_Canvas_MouseX)
gg(12)=GetGadgetAttribute(#cv001,#PB_Canvas_MouseY)
EndIf
If EventType() = #PB_EventType_RightButtonDown
gg(13)=2:gg(10)=1
gg(11)=GetGadgetAttribute(#cv001,#PB_Canvas_MouseX)
gg(12)=GetGadgetAttribute(#cv001,#PB_Canvas_MouseY)
EndIf
If EventType()=#PB_Shortcut_Escape
gg(1)=9:gg(10)=1
EndIf
If EventType()=#PB_Shortcut_Up
gg(14)=1:gg(10)=1
EndIf
If EventType()=#PB_Shortcut_Right
gg(14)=2:gg(10)=1
EndIf
If EventType()=#PB_Shortcut_Down
gg(14)=3:gg(10)=1
EndIf
If EventType()=#PB_Shortcut_Left
gg(14)=4:gg(10)=1
EndIf
EndIf
; If event=#WM_KEYUP
; gg(14)=EventwParam()& $FFFF
; gg(10)=1
; EndIf
If event=#PB_Event_CloseWindow
gg(1)=10:gg(10)=1
EndIf
If gg(14)=27
gg( 1)=9
gg(10)=1
EndIf
Delay(50)
Until gg(10)>0
Meldunten("Hier ist Mezu:"+Str(gg(11))+"."+Str(gg(12))+"."+Str(gg(13))+"."+Str(gg(14)))
waitkey()
MELDULOESCH()
EndProcedure
;--------------------------------------------------------------
; so sieht meine Hauptschleife in Darkbasicpro aus
;Bei diesem Programm handelt es ich um ein Kartenspiel,so
; dass die beiden Betiligten Compi und Mensch immer nacheinander dran sind
;daher liegt die Schleife für Maus und Tastatur in Mezu
;bei einem Actionspiel, wie Pacman o.ä. liegt die Abfrageprozedur in
; in der Hauptschleife,weil hier Compi unabhängig von Mensch agiert.
; in den Routinen Mauswahl und Tastwahl wird anhand der Cursorposition
;bestimmt, welche Karte ausgewählt wurde
;Pure Basic ist zwar wohl mächtiger aber erheblich umständlicher
;do
; mwahl=0:twahl=0
; click=mouseclick()
; key=scancode()
; If key<>0 then mwahl=TASTWAHL(key)
; If click>0 then mwahl=MAUSWAHL()
; If mwahl= 1 then MEZU_2(mwahl) rem nur Kartenauswahl
; If mwahl= 2 then MEZU_2(mwahl) rem nur Kartenauswahl
; If mwahl= 3 then MEZU_2(mwahl) rem nur Kartenauswahl
; If mwahl= 4 then MEZU_2(mwahl) rem nur Kartenauswahl
; If mwahl= 5 then MEZU_2(mwahl) rem nur Kartenauswahl
; If mwahl= 6 then MEZU_2(mwahl) rem nur Kartenauswahl
; If mwahl= 7 then MEZU_2(mwahl) rem nur Kartenauswahl
; If mwahl= 8 then MEZU_3() rem Karte ziehen
; If mwahl= 9 then MEZU_4() rem Karte spielen
; If mwahl=10 then MEZU_5() rem Karte abwerfen
; If escapekey() then MEZU_1() rem Spielabbruch
; If gg(1)>1 then exit rem Satzende
; If sp(2,39)=1 then exit rem zugende
; loop
;----------------------------------------------------------------
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure COZU()
Meldunten("Hier ist Cozu")
waitkey()
MELDULOESCH()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; -------------------------------------------------------------
ZZ_SONSTIGES:
; -------------------------------------------------------------
;das Hintergrundbild wird in die exe integriert
DataSection
zz_HIGRU:
IncludeBinary "test-pb.jpg"
EndDataSection
; -------------------------------------------------------------
; -------------------------------------------------------------
DataSection
ZZ_INFO_01:
Data.s "Seite 1."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
EndDataSection
; -------------------------------------------------------------
; -------------------------------------------------------------
DataSection
ZZ_INFO_02:
Data.s "Seite 2."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
Data.s "."
EndDataSection
; -------------------------------------------------------------
End
; =============================================================