Anfängerprobleme beim ersten Programm

Anfängerfragen zum Programmieren mit PureBasic.
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Hallo

ich habe einen Weg gefunden.
Meine Waitstring() sieht jetzt folgendermassen aus:

Code: Alles auswählen

Procedure WAITSTRING()
quit=0:taste=0  
Repeat
  taste=0
  Event = WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      If EventGadget()=#cv001
        If EventType() = #PB_EventType_KeyUp       
          taste=((GetGadgetAttribute(#cv001,#PB_Canvas_Key)))  
          modif=((GetGadgetAttribute(#cv001,#PB_Canvas_Modifiers)))  
;         Debug Str((GetGadgetAttribute(#cv001,#PB_Canvas_Key)))+"."+Str(modif) 
        EndIf
        modif=modif*1000  
        taste=taste+modif  
      EndIf
;    Case #WM_KEYUP
;      taste=EventwParam()& $FFFF
    Case #PB_Event_CloseWindow
      quit=1:gg(1)=10
  EndSelect
If Taste>0 : quit=1 : EndIf
Until quit=1
ProcedureReturn taste 
auf diese Weise kann ich jetzt erkennen, ob shift gedrückt wurde oder nicht.
ich bastele weiter.
Wenn Ihr einen besseren, schnelleren, schöneren, eleganteren weg der
Tastatursteuerung kennt, lasst es mich wissen.

Bis dahin
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Hallo,

es funktioniert zwar jetzt, verstanden habe ich aber etwas noch nicht.
<shift><F> ergibt 1070
<ctrl ><F> ergibt 4070
<shift><ctrl ><F> ergibt 5070
<alt><F> ergibt 18 ?????
<shift><alt><F> ergibt 18 ??????
<ctrl ><alt><F> ergibt 6070
<shift><ctrl><alt><F> ergibt 7070

da ich immer mit 1000 multipliziert habe bedeutet das,
modifier shift = 1
modifier ctrl = 4 => shift ctrl = 5

ctrl alt = 6 => alt müsste eigentlich 2 sein aber alt alleine gibt gar nichts zurück
Kann das jemand erklären ?
Danke im Voraus
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Anfängerprobleme beim ersten Programm

Beitrag von Bisonte »

Irgendwie blicke ich da grad nicht durch.

Dein WaitKey() soll auf EINEN Tastendruck warten, soweit so gut....
Ich nahm an, das dein WaitString() solange Tastenanschläge sammeln soll, bis man Enter/Return drückt, sehe ich das so richtig ?

Wenn dem so ist, brauchst du keinerlei Sondertasten von wegen Shift oder ALT auslesen.
Du musst nur alle Tastenanschläge die ein druckbares Zeichen haben in einem String sammeln.
und nach Druck auf Enter wird der String zurückgegeben... Sehe ich das so richtig, das dies dein Plan ist ?

So in etwa (ganz banal hingeprügelt) :

Code: Alles auswählen

Procedure CanvasString()
  Static a$
  
  Old$ = a$
  
  If EventType() = #PB_EventType_Input
    a$ + Chr(GetGadgetAttribute(EventGadget(), #PB_Canvas_Input ))
  EndIf
  If EventType() = #PB_EventType_KeyUp
    If GetGadgetAttribute(EventGadget(), #PB_Canvas_Key) = #PB_Shortcut_Return
      Debug a$
      a$ = ""
    EndIf
    If GetGadgetAttribute(EventGadget(), #PB_Canvas_Key) = #PB_Shortcut_Back
      a$ = Left(a$, Len(a$) - 1)
    EndIf
  EndIf
  
  If Old$ <> a$
    If StartDrawing(CanvasOutput(EventGadget()))
      Box(0, 0, 640, 480, 0)
      DrawText(10, 10, a$, #White)
      StopDrawing()
    EndIf
    
  EndIf

EndProcedure

OpenWindow(0, 0, 0, 640, 480, "TestWin", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

CanvasGadget(0, 0, 0, 640, 480, #PB_Canvas_Keyboard)
BindGadgetEvent(0, @CanvasString())
SetActiveGadget(0)

Repeat
  Event = WaitWindowEvent()
  
Until Event = #PB_Event_CloseWindow
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,
ich schrieb in meinen letzten Posts ja schon, daß ich es jetz einigermaßen am Laufen habe.
Ich bin zwar nach wie vor ein wenig Verwundert über die Art und Weise der Tastatursteuerung,
aber dazu bin ja hier, um das zu Lernen.
anbei jetzt eine lauffähige Version des Spieles.
Ist zwar noch nicht ganz fertig und auch noch nicht so schön wie unter DarkBasic, aber dafür,
dass ich PureBasic letzten Mittwoch zum ersten Mal gesehen habe, finde ich das schon gut.
Als Hintergrundbild, welches geladen wird, kannst Du irgendein schönes jpg mit 1024 *768 nehmen
Da Du ja in PureBasic gut zuhause zu sein scheinst, kannst Du -wenn Du willst-, ja 'mal drüberschauen
was Du besser oder anders machen wuerdest.

Bis dahin viele Grüße

EDIT:
p.s.: Sorry ich bin gar nicht auf Deinen letzte Post eingegangen
Nein, ich will immer nur genau einen Tastendruck auslesen und auswerten.
z.B. shift links, das habe ich ja jetzt geschafft
shift alt ctrl pause ist zwar abgefahren, muss auch nicht sein, aber auslesen müsste man das doch können

EDIT-EDIT
Durch Deinen Post habe ich auch jetzt das erste Mal gesehen wie diese komischen PB-key-konstanten
benutzt werden. Wieder was gelernt :wink:

Code: Alles auswählen

; -------------------------------------------------------------
AA-INIT:
;zusätzliche Bibliothek laden
UseJPEGImageDecoder()
;UseJPEGImageEncoder()
; -------------------------------------------------------------
;Prozeduren anmelden
Declare MELDAUTOR()
Declare MELDUNTEN(meldu$)  
Declare MELDULOESCH()
Declare ZE_HIGRU() 
Declare WAITKEY()
Declare WAITSTRING()
Declare INFO_0()
Declare INFO_1(infotafel,infomax)
Declare MEZU(ric,shift)
Declare COZU()

Declare FARBDEF()
Declare BAUSPIEL()
Declare MACHBLOCK()
Declare ZE_ROHBILD()
Declare ZE_BILD()
Declare ZE_ZUGNUM()
Declare ZE_CURSOR()
Declare MAUSWAHL()
Declare ZE_LOESCHCURSOR()
; -------------------------------------------------------------
;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
  #bld10  ;higrublock
  #bld11  ;weissblock
  #bld12  ;grünblock
  #bld13  ;braunblock
  #bld15  ;cursor
EndEnumeration
Enumeration 100; Tasten
  #kb000
  ;#kb001
  ;#kb002
  ;#kb003
  ;#kb004

  
EndEnumeration
Global autor$,titel$
TITEL$="SpaceJump"
;HBILD$="test-pb.jpg"

#xadd =12
#yadd = 2
#klotz=50
Global sp$                  ; Pfadstring
Global Dim bb(18,12)        ; Spielbildarray
Global Dim cc(18,12)        ; Startbildarray
Global Dim gg(40)           ; globale Variablen
Global Dim fa(40)           ; Farbdefinitionen
FARBDEF()

;gg(1)    Endeschalter 0= im Spiel 9= Abbruch durch Escape
;gg(2)    Siegstatus
;gg(3)    Turnus
;ab gg(11) spielspezisfisch
;gg(11)   Schwierigkeitsgrad
;gg(12)   Maxzug
;gg(13)   startx
;gg(14)   starty
;gg(15)   cursorx
;gg(16)   cursory
; -------------------------------------------------------------
;hier wird das Hauptfenster geöffnet
OpenWindow(0,300,100,1024,768,titel$,#PB_Window_SystemMenu |#PB_Window_MinimizeGadget)            
CanvasGadget(#cv001,0,0,1024,768,#PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
AddKeyboardShortcut(0,#PB_Shortcut_All,   #kb000)

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 )
LoadFont(3,"Arial",12,#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:
MACHBLOCK()               ; Spielblöcke erstellen 
ZE_HIGRU()
MELDAUTOR()
MELDUNTEN("Information gewuenscht ? <j> / <n>")  
tas=WAITSTRING()
If tas= 74:INFO_0():EndIf  
If tas=106:INFO_0():EndIf  
MELDULOESCH()
; -------------------------------------------------------------
AG_ANFANG:
ZE_HIGRU()
MELDAUTOR()
MELDUNTEN("Gib den Schwierigkeitsgrad ein 1 bis 9")
tas=0:gg(1)=0:wert=0
tas=Waitstring()
If tas>48 And tas<58:wert=tas-48:EndIf
gg(11)=wert
If gg(11)=0 :gg(11)=4:EndIf
MELDULOESCH()
MELDUNTEN("Schwierigkeitsgrad "+Str(gg(11))+"; Spiel wird erstellt ")
Delay(1200)
MELDULOESCH()
BAUSPIEL()
; --------------------------
AF_WIEDERHOLUNG:
; --------------------------
ZE_ROHBILD()
ZE_BILD()
ZE_ZUGNUM()
ZE_CURSOR()
dipend=0:gg(8)=0
MELDUNTEN("Jetzt geht's los <Taste druecken>")
WAITKEY()
MELDULOESCH()
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; hier beginnt die eigentliche Spielschleife
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AH_HAUPTSPIEL:
; InitKeyboard():InitMouse() 
gg(10)=0
DIPEND=0
Repeat
  taste=0:shift=0:alt=0:ctrl=0:ric=0  
  taste=WAITstring()  
  If taste >1000
    If taste >1000: shift=1:alt=0:ctrl=0:EndIf    
    If taste >4000: shift=0:alt=0:ctrl=1:EndIf
    If taste >5000: shift=1:alt=0:ctrl=1:EndIf
    If taste >6000: shift=0:alt=1:ctrl=1:EndIf  
    If taste >7000: shift=1:alt=1:ctrl=1:EndIf  
    If taste >7000: taste=taste-7000    :EndIf  
    If taste >6000: taste=taste-6000    :EndIf  
    If taste >5000: taste=taste-5000    :EndIf  
    If taste >4000: taste=taste-4000    :EndIf  
    If taste >1000: taste=taste-1000    :EndIf  
  EndIf    
  ; cursor  
  If taste=38:ric=1:EndIf
  If taste=39:ric=2:EndIf
  If taste=40:ric=3:EndIf
  If taste=37:ric=4:EndIf
  If shift=1 :shift=10:EndIf
  ; Nummernblock
  ; ijkl
  If ric>0:MEZU(ric,shift):EndIf 
  If taste=27:gg(1)=9:EndIf
Until gg(1)>0
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Nachspiel = Beendigung des Spieles
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AI_NACHSPIEL:
dipend=gg(1)
Select dipend
  Case 2
    dummy=1
  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 9
    MELDUNTEN("Abbruch - <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  
  If tas=106 : gg(1)=8 : EndIf
  MELDULOESCH()
  If gg(1)=8 : Goto AF_VORSPIEL : EndIf  
EndIf  
ZE_HIGRU()
Delay(1000)
End
; ============================================================
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BA_Procedures:
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MELDAUTOR()
autor$="Diogenes"  
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)
If 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()
EndIf
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:event=0  
Repeat
  Event = WaitWindowEvent()
  If event=#PB_Event_Gadget
    If EventGadget()=#cv001
      ;Debug "Es ist das Canvas"
      If EventType()=#PB_EventType_Input
      ;Debug "Es war das EventType_Input"
      ;Debug "Es war das Zeichen Ascii Code (" + Str(GetGadgetAttribute(#cv001, #PB_Canvas_Input)) + ")"
        quit=1
      EndIf
    EndIf
  EndIf
  If event=#PB_Event_CloseWindow
    quit=1:gg(1)=9
  EndIf 
Until quit=1
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure WAITSTRING()
quit=0:taste=0  
Repeat
  taste=0
  Event = WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      If EventGadget()=#cv001
        If EventType() = #PB_EventType_KeyUp       
          taste=((GetGadgetAttribute(#cv001,#PB_Canvas_Key)))  
          modif=((GetGadgetAttribute(#cv001,#PB_Canvas_Modifiers)))  
        EndIf
        modif=modif*1000  
        taste=taste+modif  
;        Debug Str(taste) 
      EndIf
;    Case #WM_KEYUP
;      taste=EventwParam()& $FFFF
    Case #PB_Event_CloseWindow
      quit=1:gg(1)=9
  EndSelect
If Taste>0 : quit=1 : EndIf
Until quit=1
ProcedureReturn taste 

EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure INFO_0()
infoende=0
infotafel=1
infomax=1
ZE_HIGRU()
MELDAUTOR()
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()
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(3))
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 MAUSWAHL()
  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  
    EndIf  
    If event=#PB_Event_CloseWindow
      gg(1)=9: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()
  Delay(1200)
  MELDULOESCH()
; -------------------------------------------------------------
;Beispiele für das Asulesen der Tastatur; auch Addkeyboardshortcut  
; -------------------------------------------------------------
; von Bisonte
; If EventType() = #PB_EventType_KeyUp
;   PressedKey = GetGadgetAttribute(#cv001, #PB_Canvas_Key)
;   Select PressedKey
;     Case #PB_Shortcut_F1
;       ; Mach was bei F1
;     Case #PB_Shortcut_Escape
;       ; Mach was bei Escape usw...
;   EndSelect
; EndIf
; -------------------------------------------------------------
; #PB_EventType_input liefret nur die druckabern Ascii-Codes
; aber keine Sonderzeichen   
;     If EventType() = #PB_EventType_Input       
;         gg(14)=((GetGadgetAttribute(#cv001,#PB_Canvas_Input)))  
;         gg(10)=1
;     EndIf
; -------------------------------------------------------------
; eventwparam funktioniert prima, soll aber abgeschafft werden
;   If event=#WM_KEYUP
;       gg(14)=EventwParam()& $FFFF
;       gg(10)=1    
;   EndIf    
; -------------------------------------------------------------
; If GetAsyncKeyState_(#VK_RETURN)<>0 And GetFocus_()=GadgetID(#gadnum)
;   ; Do whatever...
; EndIf
; -------------------------------------------------------------
; If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; 
;  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_A, 123)
;  
;   Repeat
;     Event = WaitWindowEvent()
;     If Event = #PB_Event_Menu
;       Select EventMenu()
;         Case 123
;           Debug "Deine Funktion"
;       EndSelect
;     EndIf
;     If Event = #PB_Event_CloseWindow
;       End
;     EndIf
;   ForEver
; EndIf
; -------------------------------------------------------------
  
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure COZU()
  Meldunten("Hier ist Cozu")
  waitkey()
  MELDULOESCH()
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure FARBDEF()
fa( 1)= RGB(185,015,000)      ; rot für meldunten
fa( 2)= RGB(090,100,010)      ; olivgruen f. meldautor
fa( 3)= RGB(030,030,180)      ; mittelblau als Hintergrund f. Meldtast
fa( 4)= RGB(000,000,000)      ; schwarz
fa( 5)= RGB(255,255,255)      ; hellweiss
fa( 6)= RGB(255,255,000)      ; gelb
fa( 7)= RGB(255,000,000)      ; rot
fa( 8)= RGB(080,080,080)      ; grau
fa( 9)= RGB(140,140,140)      ; heller grau
fa(10)= RGB(080,080,080)      ;
fa(11)= RGB(055,010,055)      ; MENU: Hintergrund normal
fa(12)= RGB(077,015,077)      ; MENU: Hintergrund ausgegraut wenn nicht anwählbar
fa(13)= RGB(165,030,165)      ; MENU: Hintergrund highlighted weil gerade aktiv
fa(14)= RGB(080,080,080)      ; MENU: Rahmenfarbe
fa(15)= RGB(160,160,160)      ; MENU: Schriftfarbe normal
fa(16)= RGB(180,110,020)      ; MENU: Schriftfarbe ausgegraut, wenn nicht anwählbar
fa(17)= RGB(060,120,060)      ; MENU: Schriftfarbe highlighted
fa(18)= RGB(200,200,200)      ;
fa(19)= RGB(000,000,240)      ;
fa(20)= RGB(000,000,240)      ;
;  ab hier frei programmierbare Farben für spezifisches Prog
fa(21)= RGB(000,050,000)      ; Hintergrund Spielfeld
fa(22)= RGB(160,160,160)      ; Plaettchen 1
fa(23)= RGB(095,095,095)      ; Plaettchen 1
fa(24)= RGB(000,160,040)      ; Plaettchen 2
fa(25)= RGB(000,095,025)      ; Plaettchen 2
fa(26)= RGB(140,100,000)      ; Plaettchen 3
fa(27)= RGB(085,060,000)      ; Plaettchen 3
fa(28)= RGB(100,020,020)      ; Cursor
fa(29)= RGB(000,220,120)      ;
fa(30)= RGB(255,255,000)      ;
fa(31)= RGB(255,255,000)      ;
fa(32)= RGB(190,190,000)      ;
fa(33)= RGB(220,220,000)      ;
fa(34)= RGB(250,250,000)      ;
fa(35)= RGB(250,250,000)      ;
fa(36)= RGB(250,250,000)      ;
fa(37)= RGB(250,250,000)      ;
fa(38)= RGB(250,250,000)      ;
fa(39)= RGB(250,250,000)      ;
fa(40)= RGB(250,250,000)      ;

  EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure BAUSPIEL()
; Spielelemente einlesen
;  Array ausnullen
 For qx=0 To 18
      For qy=0 To 12
           bb(qx,qy)=0
           cc(qx,qy)=0
      Next qy
 Next qx
;  Pfadstring auf Null setzen
 sp$=""
;  startpunkt festlegen
 sx=Random(6)+8
 sy=Random(6)+2
 sx$=Chr(48+sx)
 sy$=Chr(48+sy)
 sp$=sx$+sy$
;  Anzahl der Zuege festlegen
 aa=gg(11)*8
 maxzug=aa
 If gg(11)<3 : maxzug=aa+3 : EndIf 
 If gg(11)>7 : maxzug=aa-4 : EndIf
 gg(12)=maxzug
;  pfad auswürfeln
 zug=0
 gg(13)=sx       ;  start x
 gg(14)=sy       ;  start y
 gg(15)=sx       ;  cursor x
 gg(16)=sy       ;  cursor y
 bb(sx,sy)=1
 bb(0,0)=1
 quit=0
Repeat
     cux=sx:cuy=sy
     ric=Random(3)+1
     dipfehl=0
     If ric=1 : cuy=cuy-1 : EndIf
     If ric=2 : cux=cux+1 : EndIf
     If ric=3 : cuy=cuy+1 : EndIf 
     If ric=4 : cux=cux-1 : EndIf
     sp=0
     zuf=Random(99)
     If gg(11)<3 And zuf<80 : sp=1 : EndIf
     If gg(11)>3 And zuf<75 : sp=1 : EndIf
     If gg(11)>6 And zuf<70 : sp=1 : EndIf
     If ric=1 And sp=1 : cuy=cuy-1  : EndIf
     If ric=2 And sp=1 : cux=cux+1  : EndIf
     If ric=3 And sp=1 : cuy=cuy+1  : EndIf
     If ric=4 And sp=1 : cux=cux-1  : EndIf
     If cux< 1 : dipfehl=1 : EndIf
     If cux>18 : dipfehl=1 : EndIf
     If cuy< 1 : dipfehl=1 : EndIf
     If cuy>12 : dipfehl=1 : EndIf
     If dipfehl=0 And bb(cux,cuy)=3 : dipfehl=1 : EndIf 
     If dipfehl=0
          zug=zug+1
          sx=cux:sy=cuy
          bb(sx,sy)=bb(sx,sy)+1     
          bb(0,0)=bb(0,0)+1
          If ric=1 And sp=0 : z$="u" : EndIf
          If ric=1 And sp=1 : z$="U" : EndIf
          If ric=2 And sp=0 : z$="r" : EndIf
          If ric=2 And sp=1 : z$="R" : EndIf
          If ric=3 And sp=0 : z$="d" : EndIf
          If ric=3 And sp=1 : z$="D" : EndIf
          If ric=4 And sp=0 : z$="l" : EndIf
          If ric=4 And sp=1 : z$="L" : EndIf
          sp$=sp$+z$ 
     EndIf
     If zug=maxzug : quit=1: EndIf
Until quit=1   
sp$=sp$+"z"
;  startbild für wiederholung abspeichern
For qx=1 To 18
     For qy=1 To 12
          cc(qx,qy)=bb(qx,qy)
     Next qy
Next qx
cc(0,0)=bb(0,0)
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MACHBLOCK()
  ;StartDrawing(CanvasOutput(#cv001))
    ; higrublock 
    CreateImage(#bld10,44,44) 
    StartDrawing(ImageOutput(#bld10))
    FrontColor(fa(21))
    Box(0,0,44,44)
    StopDrawing()
    ; weissblock
    CreateImage(#bld11,44,44) 
    StartDrawing(ImageOutput(#bld11))
    FrontColor(fa(23))
    Box(0,0,44,44)
    StopDrawing()
    ; gruenblock
    CreateImage(#bld12,44,44) 
    StartDrawing(ImageOutput(#bld12))
    FrontColor(fa(25))
    Box(0,0,44,44)
    StopDrawing()
    ;braunblock
    CreateImage(#bld13,44,44) 
    StartDrawing(ImageOutput(#bld13))
    FrontColor(fa(27))
    Box(0,0,44,44)
    StopDrawing()
    ;cursor
    CreateImage(#bld15,22,22) 
    StartDrawing(ImageOutput(#bld15))
    FrontColor(fa(28))
    Box(0,0,22,22)
    StopDrawing()
  ;StopDrawing()
  
  
  
  ; cls
; ;  higru-block
; box 10,10,31,31,fa(21),fa(21),fa(21),fa(21)
; box 31,10,53,31,fa(21),fa(21),fa(21),fa(21)
; box 10,31,31,53,fa(21),fa(21),fa(21),fa(21)
; box 31,31,53,53,fa(21),fa(21),fa(21),fa(21)
; get image 10 ,10,10,53,53        
; ; cls
; ;  weiss-block
; box 10,10,31,31,fa(22),fa(23),fa(23),fa(22)
; box 31,10,53,31,fa(23),fa(22),fa(22),fa(23)
; box 10,31,31,53,fa(23),fa(22),fa(22),fa(23)
; box 31,31,53,53,fa(22),fa(23),fa(23),fa(22)
; get image 11 ,10,10,53,53        
; ; cls
; ;  gruen-block
; box 10,10,31,31,fa(24),fa(25),fa(25),fa(24)
; box 31,10,53,31,fa(25),fa(24),fa(24),fa(25)
; box 10,31,31,53,fa(25),fa(24),fa(24),fa(25)
; box 31,31,53,53,fa(24),fa(25),fa(25),fa(24)
; get image 12 ,10,10,53,53        
; ; cls
; ;  braun-block
; box 10,10,31,31,fa(26),fa(27),fa(27),fa(26)
; box 31,10,53,31,fa(27),fa(26),fa(26),fa(27)
; box 10,31,31,53,fa(27),fa(26),fa(26),fa(27)
; box 31,31,53,53,fa(26),fa(27),fa(27),fa(26)
; get image 13 ,10,10,53,53        
; ; cls
; ;  cursor-block
; box 10,10,31,31,fa(28),fa(28),fa(28),fa(28)
; get image 15,10,10,31,31        
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_ROHBILD()
  ZE_HIGRU()
  MELDAUTOR()
  StartDrawing(CanvasOutput(#cv001))
    FrontColor(fa( 5)):Box(60,50,910,610)
    FrontColor(fa(21)):Box(63,53,904,604)
  StopDrawing()  
  EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_BILD()
StartDrawing(CanvasOutput(#cv001))
For qx=1 To 18
     For qy=1 To 12
          bild=0
          If bb(qx,qy)=1 : bild=#bld11 : EndIf
          If bb(qx,qy)=2 : bild=#bld12 : EndIf
          If bb(qx,qy)=3 : bild=#bld13 : EndIf
          li=#xadd+qx*#klotz+6
          ob=#yadd+qy*#klotz+6     
          If bild>0
              DrawImage(ImageID(bild),li,ob)
          EndIf           
    Next qy
Next qx
StopDrawing()  
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_ZUGNUM()
StartDrawing(CanvasOutput(#cv001))  
FrontColor(fa( 3)):Box (480,736,64,32)
zz$=Str(bb(0,0))
DrawingFont(FontID(2)):DrawingMode(1)
FrontColor(fa(4)):DrawText(490,739,zz$)
FrontColor(fa(6)):DrawText(489,738,zz$)
StopDrawing()
EndProcedure  
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_Cursor()
li=#xadd+gg(15)*#klotz+6
ob=#yadd+gg(16)*#klotz+6     
StartDrawing(CanvasOutput(#cv001))
  DrawImage(ImageID(#bld15),li+11,ob+11)
StopDrawing()  
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure MEZU(ric,shift)
weg=shift+ric
ax=gg(15)
ay=gg(16)
If weg= 1 : nx=ax  :ny=ay-1:EndIf
If weg=11 : nx=ax  :ny=ay-2:EndIf
If weg= 2 : nx=ax+1:ny=ay  :EndIf
If weg=12 : nx=ax+2:ny=ay  :EndIf
If weg= 3 : nx=ax  :ny=ay+1:EndIf
If weg=13 : nx=ax  :ny=ay+2:EndIf
If weg= 4 : nx=ax-1:ny=ay  :EndIf
If weg=14 : nx=ax-2:ny=ay  :EndIf
; Pruefung auf zugmöglichkeit
prf=0
If nx>18 : prf=1:EndIf
If nx< 1 : prf=1:EndIf
If ny>12 : prf=1:EndIf
If ny< 1 : prf=1:EndIf
If prf=0
  If bb(nx,ny)=0
    prf=1
  EndIf  
EndIf

If prf=0 
     bb(ax,ay)=bb(ax,ay)-1
     bb(0,0)=bb(0,0)-1
     ZE_LOESCHCURSOR()
     gg(15)=nx
     gg(16)=ny
     ax=nx:ay=ny
     ZE_CURSOR()
     ZE_ZUGNUM()
EndIf
; pruefung auf Sieg
If bb(0,0)=1 :gg(1)=3:EndIf
  
EndProcedure  
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure ZE_LOESCHCURSOR()
li=#xadd+gg(15)*#klotz+6
ob=#yadd+gg(16)*#klotz+6     
If bb(gg(15),gg(16))=0: bild=#bld10 : EndIf
If bb(gg(15),gg(16))=1: bild=#bld11 : EndIf
If bb(gg(15),gg(16))=2: bild=#bld12 : EndIf
If bb(gg(15),gg(16))=3: bild=#bld13 : EndIf

StartDrawing(CanvasOutput(#cv001))
  DrawImage(ImageID(bild),li,ob)
StopDrawing()  
EndProcedure
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


; -------------------------------------------------------------
ZZ_SONSTIGES:
; -------------------------------------------------------------
;das Hintergrundbild wird in die exe integriert
DataSection
zz_HIGRU:
IncludeBinary "ek-Space.jpg"
EndDataSection
; -------------------------------------------------------------
; -------------------------------------------------------------
DataSection
ZZ_INFO_01:  
Data.s "Ziel des Spieles ist es, die auf dem Bildschirm sichtbaren Plaettchen  "
Data.s "verschwinden zu lassen. Ein weisses Plaettchen verschwindet bei einmaligem "
Data.s "ueberlaufen; ein gruenes muss man zweimal und ein braunes dreimal ueberlaufen."
Data.s "Die Steuerung erfolgt je nach Tastatur und Vorliebe:"
Data.s "Abbruch     => <ESC>"

Data.s "auf dem Ziffernblock der Tastatur"
Data.s "nach oben   =>  ein Feld = <8>     zwei Felder = <shift><8> "
Data.s "nach rechts =>  ein Feld = <6>     zwei Felder = <shift><6> "
Data.s "nach unten  =>  ein Feld = <2>     zwei Felder = <shift><2> "
Data.s "nach links  =>  ein Feld = <4>     zwei Felder = <shift><4> "

Data.s "."
Data.s "mit den Cursortasten, ebenfalls in Verbindung mit der Shift-Taste"
Data.s "."
Data.s "Im Buchstabenfeld der Tastatur:"
Data.s "nach oben   =>  ein Feld = <I>     zwei Felder = <shift><I> "

Data.s "nach rechts =>  ein Feld = <L>     zwei Felder = <shift><L> "
Data.s "nach unten  =>  ein Feld = <K>     zwei Felder = <shift><K> "
Data.s "nach links  =>  ein Feld = <J>     zwei Felder = <shift><J> "
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
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 »

Ohne das jetzt getestet zu haben, wollte ich noch ein paar generelle Dinge zu deinem Code sagen, die mir persönlich nicht so gefallen.
  • Zunächst einmal verstehe ich nicht wieso du die Procedure-Namen alle in Großbuchstaben schreibst und dann auch noch abkürzt. Camelcase würde hier meiner Meinung nach übersichtlicher erscheinen und ein etwas längerer Procedure-Name würde dem Verständnis helfen. Als Beispiel mal 'FARBDEF()': Der Name 'DefineColors()' oder 'DefiniereFarben()' wäre doch viel schöner zu lesen, findest du nicht?
  • Einrückungen. Wieso rückst du den Code innerhalb einer Procedure nicht ein? Das würde auch noch mal ein bisschen mehr Übersicht schaffen, wenn man so durch scrollt.
  • EnableExplicit. Einfach mal in der Hilfe schauen, was das ist und am besten benutzen. Das hilft um Fehler auszumerzen.
  • Wozu sind die ganzen Labels wie 'AF_VORSPIEL', 'AG_ANFANG', 'AF_WIEDERHOLUNG', usw? Du nutzt doch nur einmal Goto. Wenn du ein paar Punkte im Code brauchst, an denen du dich orientieren willst, kannst du auch die Faltmöglichkeit der IDE nutzen:

    Code: Alles auswählen

    ; -------------------------------------------------------------
    ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ;- Vorbereiten des Spieles und des Spielfeldes
    ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ;{ Diesen Code kann man einklappen
    AF_VORSPIEL:
    MACHBLOCK()               ; Spielblöcke erstellen
    ZE_HIGRU()
    MELDAUTOR()
    MELDUNTEN("Information gewuenscht ? <j> / <n>") 
    tas=WAITSTRING()
    If tas= 74:INFO_0():EndIf 
    If tas=106:INFO_0():EndIf 
    MELDULOESCH()
    ;}
  • Du überprüfst zwar an einer Stelle, ob das Image geladen werden kann, tust aber nichts, wenn es nicht geladen werden kann. Da sollte dann eine Fehlermeldung kommt.

    Code: Alles auswählen

    If IsImage(#bld01)
    	GrabImage(#bld01,#bld02, 0, 704, 1024, 32)
    	GrabImage(#bld01,#bld03, 0, 672, 1024, 32)
    Else
    	;TODO Fehlermeldung!
    EndIf
Soviel erst mal von mir. :)
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

@NictheQuick
Hallo,

Das sind alles Angewohnheiten und Faulheit.
Ich bin es von DarkBasic gewöhnt, das der mir in der Seitenleiste auch Sprungmarken anzeigt.
AA_Irgendwas steht damit immer Vorne und gehört zur Startphase des Spiels
BA_Irgendwas kommt dann im Haupteil
CA_Irgendwas ist dann am Schluss
Der ganze Thread geht ja darum, dass ich das Gerüst für alle meine Programme nach PureBasic
portieren will. Dieses Gerüst habe ich mir vor Urzeiten mal ausgedacht, und die Abkürzungen
Farbdef; Mezu,Cozu;Mauswahl;tastwahl usw kenne ich aus dem FF (Mezu = Menschenzug)
(Cozu=Computerzug). Alle Funktionen die etwas auf dem Screen ausgeben fangen mit ZE(ige)_ an

Was ist CamelCase ?
Wo kann ich noch was Falten außer bei den Prozeduren ?
Die Fehlerüberprüfung beim laden der Bilder, mache ich doch bei der Programmentwicklung.
Wenn das Programm fertig ist, funktioniert's auch, zumal ich grundsätzlich bisher immer alles in eine
einzige exe packe. Lediglich bei Score-Dateien oder so mache ich dann auch eine Abfrage
ob sie geladen werden können, wenn nicht, werden sie dann neu angelegt.

Danke für Deine Mitarbeit.

P.S. Deine Signatur ist toll, habe ich jetzt erst gelesen ! :lol:

Edit: ich weiss jetz was CamelCase ist; den Ausdruck hatte ich aber noch nie gehört.
Zuletzt geändert von Diogenes am 09.06.2014 14:59, insgesamt 1-mal geändert.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Anfängerprobleme beim ersten Programm

Beitrag von mk-soft »

Kleiner Tipp

Code: Alles auswählen

;-TOP

;- Init

;- Main

;- Info
;{
; Hier beginnt ein Kommentar
;
;
; Hier endet ein Kommentar
;}

;-BOTTOM
Das mit WaitKey und WaitString muss ich mir noch anschauen.
Purebasic arbeitet sehr OS-Systemnah. Somit ist das Handling von Maus und Tastatur zu DarkBasic unterschiedlich.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

@mk-soft

hey cool. das mit ;{ bis ;}
kannte ich nicht, ist aber super. Danke.
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 »

Das war das, was ich mit den Falten meinte und in meinem Post ebenfalls erwähnt hatte. ;)
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

@NictheQuick
Hallo,
sorry, dass ich mich erst jetzt wieder melde, aber ich hatte in den letzten Tagen noch
etwas anderes zu tun, als Code in den Rechner zu hacken.
Das war das, was ich mit den Falten meinte und in meinem Post ebenfalls erwähnt hatte.
Stimmt, hast Du. Bloss ich war zu doof, um es zu bemerken.
=> ;{ bis ;} habe ich erst beim Post von mk-soft wahrgenommen

viele Grüße
Antworten