Seite 1 von 5
Mousebutton loslassen
Verfasst: 20.12.2008 15:32
von Mok
Hi!
Ich hab mich überwunden, und mich selber dazu gebracht einen kleinen 2D-Shooter zu basteln (man schießt net auf Leute, sondern auf Zielscheiben

)
Und immer wenn man den linken Button drückt, soll ein Schusssound abgespielt werden, aber wenn ich den Button nicht loslasse, spielt es den Sound dauernd, dabei soll der Sound erst wieder gespielt werden, wenn man den Button nochmal drückt (also dazwischen losgelassen hat).
Ich habs schon mit ReleaseMouse() probert, das hat aber nix mit loslassen zu tun, sondern damit, dass man die Maus in der Applikation freigibt oder sperrt.
Hilfe und Danke im vorraus,
Mok
edit
Ich hab jetzt v4.30, nicht mehr 3.90, stellt euch vor!
das
Verfasst: 20.12.2008 15:35
von Kaeru Gaman
ermn...
er schießt doch auch nicht dauernd, oder?
warum setzt du den PlaySound befehl nicht genau dort hin, wo du den Schuss startest?
du musst ja für den schuss ein Listenelement erzeugen und auf die Playerkoordinaten setzen.
genau in der subbedingung kannst du doch auch den sound auslösen.
Verfasst: 20.12.2008 15:41
von THEEX
Wenn jetzt noch etwas Code in Deinem Betrag stehen würde, könnte man vielleicht sagen, woran es liegt...
Verfasst: 20.12.2008 15:42
von Mok
Kaeru Gaman hat geschrieben:ermn...
er schießt doch auch nicht dauernd, oder?
warum setzt du den PlaySound befehl nicht genau dort hin, wo du den Schuss startest?
du musst ja für den schuss ein Listenelement erzeugen und auf die Playerkoordinaten setzen.
genau in der subbedingung kannst du doch auch den sound auslösen.

Hier mal das Codeschnippsel (noch nicht sehr ausgebaut)
Code: Alles auswählen
[...]
MouseLocate(640/2, 480/2)
Repeat
DisplaySprite(013,0,0)
ExamineMouse()
ExamineKeyboard()
MouseX = MouseX()
MouseY = MouseY()
TransparentSpriteColor(014,RGB(255,0,255))
DisplayTransparentSprite(014,MouseX-37,MouseY-37)
If MouseButton(#PB_MouseButton_Left)
PlaySound(050)
;Hier muss irgendwas deaktiviert werden!
EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Und eigentlich hast du recht, sollte er nicht die ganze Zeit schießen (sozusagen "virtuelle Muni verpulvern"), aber ich hab keine Ahnung wie das geht! Ich hab mal in grauer Vorzeit ein Tut gelesen, wo erklärt war, wie das geht (war so ein Fassschießprogramm), aber das ist schon einige Jährechen her...

Verfasst: 20.12.2008 15:45
von Kaeru Gaman
hatte oben erst dazugeschrieben:
--------------------------------------------------------------------------------
PS:
falls du generell ein problem damit hast, kann ich dir auch ein beispiel schrauben.
wenn er pro maus-down nur einmal schießen soll, muss man das flaggen,
wenn er in zeitabständen schießen soll, muss man das countern.
--------------------------------------------------------------------------------
aber die frage ist damit wohl beantwortet....
okay... ich kann dir fürs flaggen und fürs countern mal kurze schnippets schreiben.
zusätzlich schreibst DU am besten mal ne kleine Demo, die man paste-run in die IDE setzen kann,
da kann man dann besser ergänzen.
Verfasst: 20.12.2008 15:50
von Mok
Kaeru Gaman hat geschrieben:hatte oben erst dazugeschrieben:
--------------------------------------------------------------------------------
PS:
falls du generell ein problem damit hast, kann ich dir auch ein beispiel schrauben.
wenn er pro maus-down nur einmal schießen soll, muss man das flaggen,
wenn er in zeitabständen schießen soll, muss man das countern.
--------------------------------------------------------------------------------
aber die frage ist damit wohl beantwortet....
okay... ich kann dir fürs flaggen und fürs countern mal kurze schnippets schreiben.
zusätzlich schreibst DU am besten mal ne kleine Demo, die man paste-run in die IDE setzen kann,
da kann man dann besser ergänzen.
Hier mal ganz ungeschminkt (leidre auch ohne Ressourcen)
Code: Alles auswählen
;############################
;## AIMER - VERSION 1.00 ##
;## (C) 2008/2009 ##
;############################
;-Initialisierung:
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
MessageBox_(#Null,"Eine oder mehrere Libraries für das Programm"+Chr(13)+"Aimer v1.00 konnten nicht initialisiert werden!"+Chr(13)+"Neuinstallation des Programmes könnte das Problem beheben.","Fehler beim Initialisieren",#MB_OK | #MB_ICONSTOP) ;lol
End
EndIf
Global rand_backgrnd
Global MouseX, MouseY
;-Test:
OpenScreen(640,480,32,"Aimer v1.00")
rand_backgrnd = Random(3)
rand_backgrnd = rand_backgrnd + 1
LoadSprite(013,"data\gfx\bckgrnd"+Str(rand_backgrnd)+".bmp",0)
LoadSprite(014,"data\gfx\crosshair.bmp",0)
LoadSound(050,"data\sfx\gunshot.wav")
LoadSound(051,"data\sfx\gunslide.wav")
DisplaySprite(013,0,0)
PlaySound(051)
FlipBuffers()
MouseLocate(640/2, 480/2)
Repeat
DisplaySprite(013,0,0)
ExamineMouse()
ExamineKeyboard()
MouseX = MouseX()
MouseY = MouseY()
TransparentSpriteColor(014,RGB(255,0,255))
DisplayTransparentSprite(014,MouseX-37,MouseY-37)
If MouseButton(#PB_MouseButton_Left)
PlaySound(050)
EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Verfasst: 20.12.2008 15:55
von Kaeru Gaman
naja... kann man grad ganix mit anfangen.
naja egal, dann halt nicht.
also, hier ist erstmal das construct fürs flaggen:
Code: Alles auswählen
#NoAction = 0
#Released = 1
#Clicked = 2
#Dragged = 3
Define MLB.l ; Mouse Left Button
; .......
If MouseButton(#PB_MouseButton_Left)
If MLB & 2
MLB = #Dragged
Else
MLB = #Clicked
EndIf
Else
If MLB & 2
MLB = #Released
Else
MLB = #NoAction
EndIf
EndIf
der obere part gehört in den Codekopf, der untere in die Hauptschleife.
danach kannst du MLB nach dem "echten" Mausbuttonstatus fragen.
für den rechten Button kannst du das genauso aufziehen.
Verfasst: 20.12.2008 15:58
von Mok
Kaeru Gaman hat geschrieben:
Code: Alles auswählen
#NoAction = 0
#Released = 1
#Clicked = 2
#Dragged = 3
Define MLB.l ; Mouse Left Button
; .......
If MouseButton(#PB_MouseButton_Left)
If MLB
MLB = #Dragged
Else
MLB = #Clicked
EndIf
Else
If MLB
MLB = #Released
Else
MLB = #NoAction
EndIf
EndIf
der obere part gehört in den Codekopf, der untere in die Hauptschleife.
danach kannst du MLB nach dem "echten" Mausbuttonstatus fragen.
für den rechten Button kannst du das genauso aufziehen.
Damit kann jetzt ich nix anfangen... Ich werds heute Abend ausprobieren, aber ich hab ein zusätzliches Problem: man soll nur 10x schießen können, danach hört man einen Reloadsound (hab ich - CS sei dank), und währenddessen soll man nicht schießen können.
Mensch, ich hab ganz schön die Übung verloren, ich dachte ehrlichgesagt nicht, dass mir 2 so kleine Probleme den Fuß stellen können...
Verfasst: 20.12.2008 16:18
von kswb73
Was du brauchst ist eine Variable in der gespeichert ist, wie lange die Maus schon gedrückt ist. Immer dann wenn die Maustaste gedrückt ist, erhöst du den Wert um eins. Ist die Maustaste nicht gedrückt setzt du die Variable auf 0. Ist die Variable dann 1 heißt das die Maus wurde gerade eben gedrückt.
Wenn du es noch ermöglichen willst beim längeren gedrückthalten mehrmals zu schießen, kannst du die Variable auch auf 1 setzen (0 hießt ja sie wäre garnicht gedrückt) wenn sie größer als die Nachladezeit ist.
Hier mal ein Beispiel wie das aussehen könnte:
Code: Alles auswählen
If MouseButton(1)
MouseLeft+1
If MouseLeft>Realoadtime ;kannste du auch weglassen,
MouseLeft=1; wenn du nicht willst das man beim gedrückthalten
EndIf;mehr als einmals schießen kann
Else
MouseLeft=0
EndIf
If MouseLeft=1
Schies()
EndIf
Zum Punkto Nachladen, du brauchst auch hier eine Variable. In dieser speicherst du die Anzahl der verbleibenden Schüsse. Dann musst du nur noch vorm schießen überprüfen ob noch Schüsse vorhanden sind. Beim Nachladen würd ich eine dritte Variabel nehmen und in dieser die verbleibenen Zeit speichern. Entweder mit ElapsedMilliseconds() oder pro durchlauf um ein erhöhen/senken (Vorsicht: Stottert der Computer ist der Sound zuschnell fertig, dafür brauchen die Nachladezeit immer genau die richtige Spielzeit). Ist dann fertig Nachgeladen packst du wieder zehn Schüsse ins Magazin.
@Kaeru Gaman
so geht es natürlich auch. Kommt eben auf den Zweck an.
Verfasst: 20.12.2008 16:22
von Kaeru Gaman
@Mok
schau noch mal hin... du hast zu früh "zitat" geklickt, ich hab noch was geändert.
übrigens ist es unnötig komplette postigs zu zitieren. hast du doch früher auch nicht gemacht.
> man soll nur 10x schießen können, danach hört man einen Reloadsound (hab ich - CS sei dank), und währenddessen soll man nicht schießen können.
sowas würde ich mit zwei countern machen.
die sache mit dem counter demostrier ich dir später mal, ich muss jetz erstmal zum Obi...
kswb73 hat geschrieben:@Kaeru Gaman
so geht es natürlich auch. Kommt eben auf den Zweck an.
natürlich kann man das sehr spezifisch lösen, so wie bei dir.
meins ist einfach ein beispiel, wie man mit der verwendung von Flags die vier möglichen zustände sauber prüfen kann.