Anfängerprobleme beim ersten Programm

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Anfängerprobleme beim ersten Programm

Beitrag von Bisonte »

Da hast du die Hilfe nicht ganz richtig interpretiert...

Das #PB_Canvas_Input ist ein Attribut, das man erst aus dem CanvasGadget auslesen muss.

Also dein Code

Code: Alles auswählen

If EventType()=#PB_EventType_Input       
        Meldunten(Str(#PB_Canvas_Input)  )
muss so aussehen...

Code: Alles auswählen

If EventType()=#PB_EventType_Input       
        Meldunten(Chr(GetGadgetAttribute(#cv001,#PB_Canvas_Input) ) )  
Dann klappt es mit den Tasten.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

@Bisonte

Hallo

Danke danke danke
Du bist genial
das ist jetzt genau so wie ich es wollte.
Da kann ich mir dann eine Tastaturabfrage draus basteln.

Zwar wird bei den definierten Shortcuts gar nichts ausgegeben,
aber dann lass ich die addshortcuts einfach weg und werte die Tastatur dann aus.
danke
ich melde mich wieder
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Anfängerprobleme beim ersten Programm

Beitrag von NicTheQuick »

Im Übrigen hat ein 'Delay(500)' ganz sicher nichts in einer Ereignisschleife zu suchen. Die Ereignisschleife muss immer laufen, denn Ereignisse kommen auch dann in der Schleife an, wenn man nur mal die Maus über das Fenster bewegt oder manuell etwas im Fenster oder an einem Gadget geändert hat. Was du da tust ist alter QuickBasic-Programmierstil. :mrgreen:
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Anfängerprobleme beim ersten Programm

Beitrag von Bisonte »

Das mit dem Delay ist wohl der Versuch, das Zeichen was ausgegeben wird, ein wenig länger stehenzulassen, damit man es überhaupt sieht ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Hallo,

@NictheQuick

der delay soll da auch nur dafür sorgen, dass ich die Zeit habe,
die Zahl zu lesen, weil ich ja noch dabei bin, die Tastaturabfrage
zu entwickeln.
Das waren noch Zeiten!!
Quick-Basic, Turbo-Basic, Power-Basic, Ascii-Grafiken.
Lang ist's her.

@alle anderen

ich habe jetzt das Programm noch einmal überarbeitet.
Der Vorschlag von bisone war ja toll, aber damit konnte ich ja nicht
die Sondertasten abfangen. (Esc,li,re,ob,un,enter,shift usw.)
Ich habe es also doch noch 'mal mit eventwparam versucht.
Im Folgenden findet Ihr das Ergebnis - hier speziell in der
Prozedur WAITSTRING()
Jetzt läuft's schon fast so, wie ich es von DarkBasicProf. gewöhnt bin.
Frage: Ist das denn angekündigt, das eventwparam nicht weiter unterstützt
wird ?
Frage: Weiss jemand, wie eventparam durchnumeriert ist ?
zum Teil sind das ascii-codes, wie bei den normalen Buchstaben
escape=27; enter=13 sind auch ascii;
li=37;re=39;ob=38; un=40 das ist weder ascii- noch scan-codes.
F1=112; F2=113; shift=16; ctrl=17 hat auch nichts mit ascii oder
scan-code zu tun.

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()
; -------------------------------------------------------------
;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 100
  #cv001
  #bld01
  #bld02
  #bld03
  #kb001
  #kb002
  #kb003
  #kb004
  #kb005
  #kb006
  #kb007
EndEnumeration


Global Dim gg(40)    
;-----
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,   #kb001)
AddKeyboardShortcut(0,#PB_Shortcut_Escape,#kb002)   ;27
AddKeyboardShortcut(0,#PB_Shortcut_Left  ,#kb003)   ;37
AddKeyboardShortcut(0,#PB_Shortcut_Up    ,#kb004)   ;38  
AddKeyboardShortcut(0,#PB_Shortcut_Right ,#kb005)   ;39
AddKeyboardShortcut(0,#PB_Shortcut_Down  ,#kb006)   ;40
AddKeyboardShortcut(0,#PB_Shortcut_Return,#kb007)   ;13
; 
;
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 #bld01 
  GrabImage(#bld01,#bld02, 0, 704, 1024, 32)
  GrabImage(#bld01,#bld03, 0, 672, 1024, 32)
EndIf
; -------------------------------------------------------------
;InitKeyboard()
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 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>")  
taste=WAITSTRING()
MELDULOESCH()
Delay (1200)

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
  EndIf 
Until quit>0
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure WAITSTRING()
quit=0:taste=0  
Repeat
  Event = WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      dummy=1
    Case #WM_KEYUP
      taste=EventwParam()& $FFFF
    Case #PB_Event_CloseWindow
      quit=1
  EndSelect
  If taste>0
     MELDUNTEN(Str(Taste)) 
     Delay(500)
     MELDUNTEN(".")
     If taste=27
       quit=1
     EndIf
     taste=0 
   EndIf 
Until quit=1
ProcedureReturn taste 

EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; -------------------------------------------------------------
;das Hintergrundbild wird in die exe integriert
DataSection
  zz_HIGRU:
  IncludeBinary "test-pb.jpg"
EndDataSection
; -------------------------------------------------------------


End
; =============================================================

Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Anfängerprobleme beim ersten Programm

Beitrag von Bisonte »

EventW + LParam() ist schon länger berühmt für das "baldige" aus.

Im allgemeinen gilt :

Nicht dokumentiertes kann bei der nächsten Version von PB kommentarlos verschwinden.
Also gar nicht erst benutzen !

Kommen wir zu deinem Code ;)

Die PB Objektverwaltung ... Es sind verschiedene Objekte. Gadgets, Bilder, Windows usw. Jedes dieser Objekte hat eine EIGENE
Verwaltung.
Das heisst, es kann ein Bild mit Nr. 2 geben ein Fenster mit Nr. 2 und auch ein Gadget, Font oder sonstwas...
Desweiteren ist es unklug die Enumeration für diese Objekte mit einer hohen Nummer zu beginnen (in deinem Falle 100),
da PB die vorherigen 100 (von 0-99) schonmal im Speicher reserviert.

Also deine Enumeration sollte lieber so aussehen :

Code: Alles auswählen

Enumeration ; Windows
  #win001 ; Wäre 0
EndEnumeration
Enumeration ; Gadgets (Ohne Angabe einer Zahl beginnt es mit 0)
  #cv001 ; Wäre 0
EndEnumeration
Enumeration ; Bilder
  #bld01 ; Wäre 0
  #bld02 ; Wäre 1
  #bld03 ; Wäre 2
EndEnumeration
Enumeration 100; Die EventMenu Einträge für die ShortCuts (Die Ausnahme ;) )
  #kb001 ; Wäre 100
  #kb002
  #kb003
  #kb004
  #kb005
  #kb006
  #kb007 ; Wäre 106
EndEnumeration
Weiter unten steht bei dir die Abfrage :

Code: Alles auswählen

;bilder erstellen für meldunten und meldtast
If #bld01
Das ist falsch. #bld01 ist eine Konstante, der Wert kann sich gar nicht ändern. Da du ja wissen willst ob das Bild korrekt initialisiert ist
muss es heissen:

Code: Alles auswählen

If IsImage(#bld01)
Und wenn ich schon dabei bin... Wenn eine Funktion einen Wert zurückgibt, sollte man diese auch auswerten.
In deinem Fall spreche ich da auf die ganzen "StartDrawing()" Dinger an...
Sollte am besten so aussehen :

Code: Alles auswählen

If StartDrawing(CanvasOutput(#cv001)) ; Hier wird geprüft ob das Zeichnen überhaupt klappen kann!
  ; Zeichne dies und jenes
  StopDrawing()
EndIf
Das kann dir in (vor allem grösseren) Codes enorm die Fehlersuche erleichtern.

Was Du jetzt mit den Tasten machst geht mit Sicherheit auch PB Konform, allerdings muss man dazu wissen, was du genau vorhast, bzw. auf
welche Tasten du da reagieren möchtest und was dann passieren soll...

(P.S.: Irrtümer meinerseits nicht ausgeschlossen ;) )
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

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
; =============================================================
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Anfängerprobleme beim ersten Programm

Beitrag von Kiffi »

Diogenes hat geschrieben: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
Du kannst es auch in eine Zeile schreiben (Mit Doppelpunkt getrennt):

Code: Alles auswählen

If a$="quatsch" : b$="Unsinn" : EndIf
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Anfängerprobleme beim ersten Programm

Beitrag von Danilo »

Code: Alles auswählen

Macro Then(_statement_)
    : _statement_ : EndIf
EndMacro

If a$="quatsch" Then( b$="Unsinn" )
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Hallo,

@Danilo @Kiffi
Danke für eure Tips; ich benutze zunächst einmal die Einzeilenversion von
Kiffi. Auf die Idee bin ich gar nicht gekommen.

@alle

Ich habe weiter an meinem Problem gearbeitet und die Version von Bisonte
; If EventType() = #PB_EventType_Input
; gg(14)=((GetGadgetAttribute(#cv001,#PB_Canvas_Input)))
noch 'mal aufgegriffen. Die lieferte ja schön alle druckbaren Zeichen zurück, aber
die Sonderzeichen blieben aussen vor.
Nach Studium der Hilfe und einigem Probieren, habe ich jetzt glaube ich eine
für mich akzeptable Lösung gefunden.
Statt #PB_EventType_Input benutze ich #PB_EventType_KeyDown
Damit wird zumindest ein Großteil der Sonderzeichen zurückgeliefert; allerdings mit
einer sehr befremdlichen Nummerierung.
esc => 27 = ascii
F1 => 112 = kein scanCode kein ascii
F2 bis F9 => weiter bis 120
F10 => funktioniert nicht!!
F11 => 122
F12 => 123
Druck => funktioniert nicht
Rollen => 145
Pause => 19
^ => 220
1 => 49 =ascii
alle druckbaren Tasten entsprechen den ascii-codes
backspace => 8
Tab => funktioniert nicht
Feststellen =>20
shift =>16
ctrl => 17
alt => funktioniert nicht
space => 32 = ascii
enter => 13 = ascii
left => 37
re => 39
dn => 40
up => 38
die Verteilung der Nummern ist anscheinend frei gewählt.
Nichtsdestotrotz, wenn man das weiss kann man sie ja abfangen und darauf reagieren.

ich füge noch einmal meine geänderte MEZU() an.
Nochmal danke an Bisonte, der mir diesen Weg aufgezeigt hat.

Mein Gerüst steht jetzt glaube ich.
Ich werde jetzt mal versuchen eines meiner Spiele da einzuhängen.
Ich melde mich wieder.
Spätestens, wenn es um WindowedScreen und Sprites geht.


Code: Alles auswählen

; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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_EventType_KeyDown
        gg(14)=((GetGadgetAttribute(#cv001,#PB_Canvas_Key)))  
        gg(10)=1
      EndIf  
;     If EventType() = #PB_EventType_Input       
;         gg(14)=((GetGadgetAttribute(#cv001,#PB_Canvas_Input)))  
;         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)))
Delay(1200)
MELDULOESCH()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Antworten