Hilfe mit der Maus

Anfängerfragen zum Programmieren mit PureBasic.
Conshar
Beiträge: 14
Registriert: 13.06.2008 02:16

Hilfe mit der Maus

Beitrag von Conshar »

Guten Abend werte Purebasic Community,

Vor etwa 2 Wochen habe ich mir Purebasic gekauft und freue mich nun ein Teil der tollen Community zu werden :allright:

Ich komme am besten gleich zur Sache, kurz nachdem ich mir Purebasic geholt hatte begann ich sofort nach Lesen vieler Tutorials ein Spiel zu basteln.
Es soll nur ein kleines werden um nebenbei Erfahrungen zu sammeln. Gedacht ist dieses Spiel eher für Kinder unter 8 Jahren(wenn nicht noch niedriger^^)

Nunja, jetzt das folgende Problem, da ich ein ziemlicher Anfänger bin, was Programmieren anbelangt, habe ich natürlich nicht euer Wissen.
Nebenbei gibt es für Purebasic leider nicht viele Tutorials, die einen Anfänger wie mich aufklären können :oops:

Ich habe auch hier im Forum nach Lösungen gesucht, aber es ist ziemlich gross und die vielen Themen haben mich verrwirrt. Deswegen wende ich mich an euch lieber Direkt. <)

Spiel ist in Vollbild.

Ich habe mir auch bereits ein Menü für das Spiel gebastelt(zugegeben etwas von PureArea Beispielen abgeschaut) und es soll natürlich eine Maus enthalten.

Das Problem:
Wenn ich den Befehl verwende

Code: Alles auswählen

 if MouseButton(#PB_mousebutton_left)
Zeigt er zwar nach dem klicken nicht mehr das Menü an sondern das was im Spiel ist, jedoch nur solange ich die Taste auch wirklich gedrückt halte,
sobald ich die Maustaste wieder loslasse kehrt er wieder ins Hauptmenü zurück. Bin nun ziemlich am verzweifeln, versuche es schon seit Tagen
irgendwie zu korrigieren, aber ohne Hilfe schaffe ich es wohl nicht :freak:
Zuletzt geändert von Conshar am 22.06.2008 23:02, insgesamt 2-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

MousePushed(#PB_mouse_left)
:?
den Befehl gibt es garnicht, und die Konstante auch nicht...

was für ein "PureBasic" verwendest du denn?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Conshar
Beiträge: 14
Registriert: 13.06.2008 02:16

Beitrag von Conshar »

Sry, Anfängerfehler, meinte

Code: Alles auswählen

#PB_MouseButton_Left
, bin mir auch nicht sicher wie ich darauf komme :oops:

Ich habs nun geändert ^^"

Ich verwende Purebasic 4.20, die neueste Version
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

MouseButton(#PB_mousebutton_left)
aha, ok... :lol: ich dachte schon "hä?"

also, das liegt nicht am Mousebutton selber, sondern ander struktur deines Programms.

du musst auf den Mausbutton in sofern reagieren, dass du einen anderen Programmteil ablaufen läßt.
du kannst eine Hauptschleife benutzen, und dort mit einem Flag festlegen, ob du grad im Menu bist oder im Game,
oder du verwendest sogar getrennte schleifen, das ist komplett dir überlassen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Conshar
Beiträge: 14
Registriert: 13.06.2008 02:16

Beitrag von Conshar »

Von Flags habe ich leider noch nie etwas gehört :?

Das ist der Code, ziemlich unübersichtlich, ich weis

Code: Alles auswählen

#Fensterbreite               = 800
#Fensterlaenge               = 600
#Farbtiefe                   = 32

Global KranX = 100, KranY = -300

Global Buchstabe1X = 100, Buchstabe1Y = 500
Global Buchstabe2X = 200, Buchstabe2Y = 500
Global Buchstabe3X = 300, Buchstabe3Y = 500
Global Buchstabe4X = 400, Buchstabe4Y = 500
Global Buchstabe5X = 500, Buchstabe5Y = 500
Global Buchstabe6X = 600, Buchstabe6Y = 500

Global BewegBX = 0, BewegBY = 500

Global UB1 = Random(25)
Global UB2 = Random(25)
Global UB3 = Random(25)
Global UB4 = Random(25)
Global UB5 = Random(25)
Global UB6 = Random(25)

Global B1, B2, B3, B4, B5, B6

Global StartX = 300, StartY = 200
Global ExitX = 300, ExitY = 240

Procedure InitBuchstabenDaten()
;Unbelegter Buchstabe 1
Select UB1
Case 50 : B1 = 76  : Case 51 : B1 = 77 : Case 52 : B1 = 78 : Case 53 : B1 = 79 : Case 54 : B1 = 80 
Case 55 : B1 = 81  : Case 56 : B1 = 82 : Case 57 : B1 = 83 : Case 58 : B1 = 84 : Case 59 : B1 = 85
Case 60 : B1 = 86  : Case 61 : B1 = 87 : Case 62 : B1 = 88 : Case 63 : B1 = 89 : Case 64 : B1 = 90
Case 65 : B1 = 91  : Case 66 : B1 = 92 : Case 67 : B1 = 93 : Case 68 : B1 = 94 : Case 69 : B1 = 95
Case 70 : B1 = 96  : Case 71 : B1 = 97 : Case 72 : B1 = 98 : Case 73 : B1 = 99 : Case 74 : B1 = 100
Case 75 : B1 = 101
EndSelect
;Unbelegter Buchstabe 2
Select UB2
Case 50 : B2 = 76  : Case 51 : B2 = 77 : Case 52 : B2 = 78 : Case 53 : B2 = 79 : Case 54 : B2 = 80
Case 55 : B2 = 81  : Case 56 : B2 = 82 : Case 57 : B2 = 83 : Case 58 : B2 = 84 : Case 59 : B2 = 85 
Case 60 : B2 = 86  : Case 61 : B2 = 87 : Case 62 : B2 = 88 : Case 63 : B2 = 89 : Case 64 : B2 = 90
Case 65 : B2 = 91  : Case 66 : B2 = 92 : Case 67 : B2 = 93 : Case 68 : B2 = 94 : Case 69 : B2 = 95
Case 70 : B2 = 96  : Case 71 : B2 = 97 : Case 72 : B2 = 98 : Case 73 : B2 = 99 : Case 74 : B2 = 100
Case 75 : B2 = 101
EndSelect
;Unbelegter Buchstabe 3
Select UB3
Case 50 : B3 = 76  : Case 51 : B3 = 77 : Case 52 : B3 = 78 : Case 53 : B3 = 79 : Case 54 : B3 = 80 
Case 55 : B3 = 81  : Case 56 : B3 = 82 : Case 57 : B3 = 83 : Case 58 : B3 = 84 : Case 59 : B3 = 85
Case 60 : B3 = 86  : Case 61 : B3 = 87 : Case 62 : B3 = 88 : Case 63 : B3 = 89 : Case 64 : B3 = 90
Case 65 : B3 = 91  : Case 66 : B3 = 92 : Case 67 : B3 = 93 : Case 68 : B3 = 94 : Case 69 : B3 = 95
Case 70 : B3 = 96  : Case 71 : B3 = 97 : Case 72 : B3 = 98 : Case 73 : B3 = 99 : Case 74 : B3 = 100
Case 75 : B3 = 101
EndSelect
;Unbelegter Buchstabe 4
Select UB4
Case 50 : B4 = 76  : Case 51 : B4 = 77 : Case 52 : B4 = 78 : Case 53 : B4 = 79 : Case 54 : B4 = 80
Case 55 : B4 = 81  : Case 56 : B4 = 82 : Case 57 : B4 = 83 : Case 58 : B4 = 84 : Case 59 : B4 = 85
Case 60 : B4 = 86  : Case 61 : B4 = 87 : Case 62 : B4 = 88 : Case 63 : B4 = 89 : Case 64 : B4 = 90
Case 65 : B4 = 91  : Case 66 : B4 = 92 : Case 67 : B4 = 93 : Case 68 : B4 = 94 : Case 69 : B4 = 95
Case 70 : B4 = 96  : Case 71 : B4 = 97 : Case 72 : B4 = 98 : Case 73 : B4 = 99 : Case 74 : B4 = 100
Case 75 : B4 = 101
EndSelect
;Unbelegter Buchstabe 5
Select UB5
Case 50 : B5 = 76  : Case 51 : B5 = 77 : Case 52 : B5 = 78 : Case 53 : B5 = 79 : Case 54 : B5 = 80
Case 55 : B5 = 81  : Case 56 : B5 = 82 : Case 57 : B5 = 83 : Case 58 : B5 = 84 : Case 59 : B5 = 85
Case 60 : B5 = 86  : Case 61 : B5 = 87 : Case 62 : B5 = 88 : Case 63 : B5 = 89 : Case 64 : B5 = 90
Case 65 : B5 = 91  : Case 66 : B5 = 92 : Case 67 : B5 = 93 : Case 68 : B5 = 94 : Case 69 : B5 = 95
Case 70 : B5 = 96  : Case 71 : B5 = 97 : Case 72 : B5 = 98 : Case 73 : B5 = 99 : Case 74 : B5 = 100
Case 75 : B5 = 101
EndSelect
;Unbelegter Buchstabe 6
Select UB6
Case 50 : B6 = 76  : Case 51 : B6 = 77 : Case 52 : B6 = 78 : Case 53 : B6 = 79 : Case 54 : B6 = 80
Case 55 : B6 = 81  : Case 56 : B6 = 82 : Case 57 : B6 = 83 : Case 58 : B6 = 84 : Case 59 : B6 = 85
Case 60 : B6 = 86  : Case 61 : B6 = 87 : Case 62 : B6 = 88 : Case 63 : B6 = 89 : Case 64 : B6 = 90
Case 65 : B6 = 91  : Case 66 : B6 = 92 : Case 67 : B6 = 93 : Case 68 : B6 = 94 : Case 69 : B6 = 95
Case 70 : B6 = 96  : Case 71 : B6 = 97 : Case 72 : B6 = 98 : Case 73 : B6 = 99 : Case 74 : B6 = 100
Case 75 : B6 = 101
EndSelect
EndProcedure

Procedure InitScreen()
InitSprite()
InitKeyboard()
InitMouse()
If OpenScreen(#Fensterbreite,#Fensterlaenge,#Farbtiefe,"Alex der Alphamaster") = #False
MessageRequester("Fehler","Konnte das Fenster nicht öffnen",0)
EndIf
FlipBuffers()
MouseLocate(390,290)
EndProcedure

Procedure InitSprites()
;Hintergrund
LoadSprite(100,"Grafik\Hintergrund\Hintergrund.bmp",0)
;Kran
LoadSprite(101,"Grafik\Ingame\Kran\Kran.bmp",0)
;Alphabetfalsch
LoadSprite(103,"Grafik\Ingame\Alphabet\falsch\falsch.bmp",0)
;Gitter
LoadSprite(104,"Grafik\Ingame\Seitliche Bilder\Gitter.bmp",0)
;AnzeigeRF
LoadSprite(105,"Grafik\Ingame\Seitliche Bilder\AnzeigeRF.bmp",0)
;MenuIngame
LoadSprite(106,"Grafik\Ingame\Menu\Menu.bmp",0)
;Balken
LoadSprite(107,"Grafik\Ingame\Menu\Balken.bmp",0)
;Musikanusingame
LoadSprite(108,"Grafik\Ingame\Menu\Musikanaus.bmp",0)
; Unbelegte Buchstaben
For unbelegt = 0 To 25
LoadSprite(unbelegt,"Grafik\Ingame\Alphabet\unbelegt\Buchstabe"+Str(unbelegt)+".bmp",0)
Next
;Belegte Buchstaben
For belegt = 0 To 25
LoadSprite(belegt,"Grafik\Ingame\Alphabet\belegt\Buchstabe"+Str(belegt)+".bmp",0)
Next
;Startbutton
LoadSprite(109,"Grafik\Menu\Buttons\Sample\MenuButton.bmp",0)
;Exitbutton
LoadSprite(110,"Grafik\Menu\Buttons\Sample\MenuButton.bmp",0)
;Mauszeiger
LoadSprite(111,"Grafik\Maus\Mauszeiger.bmp",0)
;Textauswahl(Font)
LoadFont(0,"Arial",18,#PB_Font_Bold)
EndProcedure

Procedure ZeigeIngameSprites(X,Y)
;Sprites
;;Hintergrund
DisplaySprite(100,0,0)
;;Kran
TransparentSpriteColor(101,RGB(255,0,255))
DisplayTransparentSprite(101,KranX,KranY)
;;AnzeigeRF
DisplaySprite(105,700,20)
;:Buchstabe1Unbelegt
DisplaySprite(UB1,Buchstabe1X,Buchstabe1Y)
;:Buchstabe2Unbelegt
DisplaySprite(UB2,Buchstabe2X,Buchstabe2Y)
;:Buchstabe3Unbelegt
DisplaySprite(UB3,Buchstabe3X,Buchstabe3Y)
;:Buchstabe4Unbelegt
DisplaySprite(UB4,Buchstabe4X,Buchstabe4Y)
;:Buchstabe5Unbelegt
DisplaySprite(UB5,Buchstabe5X,Buchstabe5Y)
;:Buchstabe6Unbelegt
DisplaySprite(UB6,Buchstabe6X,Buchstabe6Y)

DisplaySprite(B1,BewegBX,BewegBY)
DisplaySprite(B2,BewegBX,BewegBY)
DisplaySprite(B3,BewegBX,BewegBY)
DisplaySprite(B4,BewegBX,BewegBY)
DisplaySprite(B5,BewegBX,BewegBY)
DisplaySprite(B6,BewegBX,BewegBY)
;;Gitter
TransparentSpriteColor(104,RGB(255,0,255))
DisplayTransparentSprite(104,0,20)

;;Menu
DisplaySprite(106,0,0)
;;Balken
DisplaySprite(107,100,0)
;;Musikanausingame
DisplaySprite(108,700,0)
EndProcedure

Procedure ZeigeMenuSprites(X,Y)

FlipBuffers()
;Hintergrund
DisplaySprite(100,0,0)
;Startbutton
DisplaySprite(109,StartX,StartY)
;Exitbutton
DisplaySprite(110,ExitX,ExitY)
;Mauszeiger
TransparentSpriteColor(111,RGB(255,0,255))
DisplayTransparentSprite(111,MouseX(),MouseY())
EndProcedure

Procedure CheckEingabeTasten()
ExamineKeyboard()
ExamineMouse()

MouseX()
MouseY()


;Tastaturbefehle
If KeyboardPushed(#PB_Key_Left)
KranX - 100
Delay(150)
  If KranX < 100
  KranX = 100
  EndIf
EndIf

If KeyboardPushed(#PB_Key_Right)
KranX + 100
Delay(150)
  If KranX > 600
  KranX = 600
  EndIf
EndIf
;Mausbefehle
;;Start
If MouseX() > 300 And MouseX() + 20 < 500 And MouseY() > 200 And MouseY() + 20 < 230
If MouseButton(#PB_MouseButton_Left)
ZeigeIngameSprites(#Fensterbreite,#Fensterlaenge)
EndIf
StartDrawing(SpriteOutput(109))
DrawingFont(FontID(0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(70,0,"Start",RGB(255,0,0),RGB(255,0,255))
StopDrawing()
Else
StartDrawing(SpriteOutput(109))
DrawingFont(FontID(0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(70,0,"Start",RGB(255,255,255),RGB(255,0,255))
StopDrawing()
EndIf
;;Exit
If MouseX() > 300 And MouseX() +20 < 500 And MouseY() > 240 And MouseY() + 20 < 270
If MouseButton(1)
End
EndIf
StartDrawing(SpriteOutput(110))
DrawingFont(FontID(0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(75,0,"Exit",RGB(255,0,0),RGB(255,0,255))
StopDrawing()
Else
StartDrawing(SpriteOutput(110))
DrawingFont(FontID(0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(75,0,"Exit",RGB(255,255,255),RGB(255,0,255))
StopDrawing()
EndIf
EndProcedure



;-************************Kern************************
InitBuchstabenDaten()
InitScreen()
InitSprites()

Repeat
Delay(1)
ZeigeMenuSprites(#Fensterbreite,#Fensterlaenge)
CheckEingabeTasten()
Until KeyboardPushed(#PB_Key_Escape)


Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Von Flags habe ich leider noch nie etwas gehört

ein Flag ist eine Variable, die einen bestimmten Zustand "mitschreibt", meistens nur An oder Aus.
auch die CPU hat interne Flags.

eigene Flags macht man mit ganz normalen Variablen.

zum beispiel: du nennst eine Variable EXIT.
in deiner Hauptschleife fragst du die ESC-Taste ab, wenn die gedrückt wird, setzt du EXIT auf 1,
wenn einer Im Hauptmenü auf "Verlassen" klickt, setzt du EXIT auf 1,
und deine Hauptschleife endet mit "Until EXIT = 1", wird also beendet,
wenn jemand ESC drückt oder auf "Verlassen" klickt.
EXIT ist ein Flag.

...deinen Code kann ich mir mal angucken, aber da kommen ein dutzend sprites vor, die ich nicht habe, das macht es etwas unlustig...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ok... ist einfacher als ich dachte...

Code: Alles auswählen

If MouseButton(#PB_MouseButton_Left)
ZeigeIngameSprites(#Fensterbreite,#Fensterlaenge)
EndIf 
da ist das problem: ZeigeIngameSprites wird nur ausgeführt, solange du den MouseButton drückst.

mit Flags sähe das ungefähr so aus:

Code: Alles auswählen

If MouseButton(#PB_MouseButton_Left) And Menu = 1
  Menu = 0
EndIf 
If Keyboardpushed(#PB_Key_Escape) And Menu = 0
  Menu = 1
EndIf
die zweite abfrage schalten vom Game zurück ins menu, wenn man ESC drückt.
in deine Hauptschleife muss dann

Code: Alles auswählen

Repeat
  Delay(1)
  If Menu = 1
    ZeigeMenuSprites(#Fensterbreite,#Fensterlaenge)
  Else
    ZeigeIngameSprites(#Fensterbreite,#Fensterlaenge)
  EndIf
  CheckEingabeTasten()
Until KeyboardPushed(#PB_Key_Escape) 
ansonsten seh ich nicht soo viel, weil wie du selber sagtest, grauenvoll formatiert, keine einrückungen, da erkennt man ja ganix.
fast schon ein zufall, dass ich das problem so schnell gefunden hab.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Er meint wohl eher Parameter und nicht Flags.
Es sind nur 2 Proceduren mit parametern vorhanden, wobei die garnicht
benutzt werden! (X und Y)

Code: Alles auswählen

Procedure ZeigeMenuSprites(X, Y)
  
  FlipBuffers()
  ;Hintergrund
  DisplaySprite(100, 0, 0)
  ;Startbutton
  DisplaySprite(109, StartX, StartY)
  ;Exitbutton
  DisplaySprite(110, ExitX, ExitY)
  ;Mauszeiger
  TransparentSpriteColor(111, RGB(255, 0, 255))
  DisplayTransparentSprite(111, MouseX(), MouseY())
EndProcedure
Er sollte vielleicht mal lieber noch ein paar Tutorials mit Grundlagen
abarbeiten, sonst wird das nichts.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ts-soft hat geschrieben:Er meint wohl eher Parameter und nicht Flags.
ich hab mit Flags angefangen, und ich meine auch Flags wenn ich Flags sage, du kennst mich doch. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nachdem ich den code jetzt im editor hab, seh ich auch ein bissel mehr...
z.b. hab ich vorher nicht gesehen, dass die MausButton-Abfrage noch innerhalb eines Koordinatenchecks ist...
(wirklich grausig formatiert, in Zukunft bitte mehr mühe geben)

grundsätzlich solltest du wohl entweder
- in der tastaturabfrage eine grundsätzliche Unterscheidung nach Menu 0/1 machen
oder
- zwei Abfrage-Procs schreiben, eine fürs Menu, eine für Ingame, und die ebenso getrennt aufrufen wie die Darstellung.

grundsätzlich muss dir klar sein,dass dein code im grunde sequenziell abgearbeitet wird,
aber dafür ausgelegt sein muss, 60-100mal pro sekunde die Hauptschleife zu durchlaufen.

wenn du aufgrund eines tastendrucks eine procedure aufrufst,
wird die procedure nur aufgerufen, wenn du die taste drückst.
ganz einfach.

wenn der tastendruck eine Zustandsänderung bedeuten soll,
musst du den Momentanzustand wo mitschreiben,
damit dein programm bei jedem durchlauf weiß, welchen zustand es nun haben soll.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten