WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Tastaturlenkung

 

HH
Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 22.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2011, 10:17     Titel: Tastaturlenkung
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein rudimentäres Rennspiel programmiert indem ein Punkt eine vorgegebene Strecke abfährt, indem ich schnell Plots übereinander anzeige. Mein nächster Schritt ist jetzt mit Tastendrücken Einluss auf die Fahrtrichtung zu nehmen und das in Echtzeit. Eigentlich bräuchte ich nur Abfragen ob irgendwelche Tasten gedrückt sind, und wenn ja ändere ich dann entsprechende Parameter. Gibt es da eine einfache Lösung für oder muss ich mich da tiefergehend mit GUIs ausseinandersetzen?

Würde mich über eine Antwort freuen!

Gruß
Harry
Private Nachricht senden Benutzer-Profile anzeigen


Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2011, 14:52     Titel:
  Antworten mit Zitat      
Hi,

die KeyPressFcn ist Bestandteil der Figure properties.
Ich denke das könnte Dir weiterhelfen. Schau Dir doch mal das Code-Beispiel in der Dokumentation dazu an.

Grüße
Micha
 
HH
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 22.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2011, 11:33     Titel:
  Antworten mit Zitat      
Hallo,
Ich denke auch, dass ich irgendwie KeyPressFcn nutzen muss, aber ich werde aus der Dokumentation auch nicht so schlau, weil ich ja auch nichts in irgendeiner Figure ändern will sondern einen Parameter (vielleicht bin ich auch nur zu dumm Smile )

Hier mal eine kleine Beispielfunktion zur Verdeutlichung was ich vorhabe:
Code:

a=1;
while (a~=0)    
    %b = Soll dem Wert der Taste entsprechen die ich drücke
    switch b
        case 'z'
            a=2;
        case 'd'
            a=3;
        case 'n'
            a=0;
        otherwise
            a=1;
    end
    plot (a, 'k.')
    pause (0.1)
end
 

Es hängt quasi an der ersten Zeile nach dem while-Befehl.
Danke schonmal,
Gruß
Harry
Private Nachricht senden Benutzer-Profile anzeigen
 
Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2011, 10:27     Titel:
  Antworten mit Zitat      
Hi,

die while-Schleife entspricht also praktisch Deinem laufenden Spiel oder wie?
Und darin willst Du dann verständlicherweise die gedrückten Tasten überprüfen oder?

Ich glaube, dass die Sache mit dem normalen plot-Fenster möglich ist und würde so vorgehen: (hab das aber nie ausprobiert, also keine Garantie auf Funktion)

- Funktion für das Spiel definieren (Hast Du ja schon, muss aber tatsächlich auch eine Funktion sein, so wie in der MATLAB-Doku)
- KeyPressFcn für die Figure anlegen und als Unterfunktion mit ins m-File einbinden
- In der KeyPressFcn Deinen Parameter anlegen/verändern und z.B. mittels globaler Variable an die aufrufende Funktion übergeben. (Rückgabewert für die KeyPressFcn habe ich nicht gesehen)
- Dann musst Du eventuell noch in Deiner aufrufenden Funktion eine kleine Pause einbauen bzw. den Befehl "drawnow" um der KeyPressFcn Zeit für die Abarbeitung zu geben.

So würde ich das mal angehen und hoffen, dass es funktioniert.
Grüße
Micha
 
HH
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 22.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2011, 11:13     Titel:
  Antworten mit Zitat      
Hallo Micha,
vielen Dank für deine Unterstützung, aber ich bin eher Neuling auf dem Gebiet und kann deinen Vorschlag nicht so ganz umsetzen. Meine KeyPressFcn Kenntnisse beschränken sich allerdings auch auf ein Tutorial.

Wär es dir vielleicht möglich mir das an einem kleinen Beispiel zu verdeutlichen? Vor allem die Unterfunktion mit dem KeyPressFcn würde mich interessieren.

Wenns dir zu aufwendig ist versteh ich das auch, aber es wäre nett.
Danke nochmal,
Gruß
Harry
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 07.07.2011, 11:51     Titel:
  Antworten mit Zitat      
Hier ein kleines Bsp. an Hand der Doku zu dem Befehl.

Code:

function figure_keypress
figure('KeyPressFcn',@test);

function test(src,evnt)
if ~isempty(evnt.Character)
    eingabe = evnt.Character
    % oder Eingabe an weitere Funtkion übergeben
else
    % ansonsten
end
 


Wenn du jetzt die Funktion figure_keypress aufrufst, wird eine Figure gestartet...alle Eingaben werden an die Funktion test übergeben. Die Variable evnt.Character enthält den Eingabewert.
Private Nachricht senden Benutzer-Profile anzeigen
 
HH
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 22.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2011, 14:17     Titel:
  Antworten mit Zitat      
Gut das funktioniert nun bedingt!
Ich habe jetzt immerhin ein bisschen verstanden wie das mit "KeyPressFcn" funktioniert.
Es tritt nur ein neues Problem auf:
wenn ich nun meine Funktion aufrufe (siehe oben; ergänzt mit der Zeile b=eingabe; eingabe als globale variable, eine andere Möglichkeit der übergabe habe ich nicht gesehen), wird jedesmal ein neues Figure geöffnet. Außerdem funktioniert dann die Tastenabfrage nicht mehr, da ja ein anderes figure geöffnet ist.

Gruß
Harry
Private Nachricht senden Benutzer-Profile anzeigen
 
Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2011, 14:51     Titel:
  Antworten mit Zitat      
Na also, dann kommst Du der Sache ja näher.

Die Erstellung der figure sollte natürlich nicht in sondern vor Deiner while-Schleife passieren.
Um sicher zu gehen, dass immer in die gleiche figure geplottet wird kannst Du auch beim Erstellen ein handle definieren und dieses beim Plot ansprechen:

Code:

FigHandle = figure('KeyPressFcn',...)
while a~=0
   plot(FigHandle,a,'k')
end
 

Grüße
Micha
 
HH
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 22.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2011, 10:18     Titel:
  Antworten mit Zitat      
Ja klar natürlich, da hätte ich auch selbst drauf kommen können.

So jetzt nur damit ich das richtig verstanden habe:
durch die neue FigHandle-Zeile brauche ich die function figure_keypress ja nicht mehr oder?

Dennoch meckert er jetzt rum:
1.) bezogen auf global eingabe in der Funktion test
The expression to the left of the equals sign is not a valid target for an assignment.

2.) bezogen auf pause in der Hauptfunktion.
??? Error using ==> pause
Error while evaluating figure KeyPressFcn

aber anders bringe ich den wert von eingabe doch nicht in die Hauptfunktion, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2011, 12:21     Titel:
  Antworten mit Zitat      
Hi,

poste doch bitte Deinen Code, dann fällt das Helfen leichter.

Grüße
Micha
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 10.07.2011, 17:55     Titel:
  Antworten mit Zitat      
zum 1.) warum muss das ne global sein? du kanst der funktion evtl. auch nen rückgabewert zuordnen:
Code:


zum 2.) wie schon erwähnt, was ist mit drawnow?
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
HH
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 22.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2011, 10:52     Titel:
  Antworten mit Zitat      
Hallo zusammen!
Irgendwie haben wohl ich oder der Rechner wohl ein Wochenende Pause gebraucht. Ich hab nur ein paar kleine Schönheitskorrekturenvorgenommen um den Code hier zu posten und dann gings.

Hier noch wie gewünscht das Ergebnis:
Tastendruck-Funktion wie oben:
Code:

function test(src,evnt)
global eingabe;
if ~isempty(evnt.Character)
    eingabe= evnt.Character;
    pause(0.01)
end
 


Hauptfunktion:
Code:
function keycontrol

global eingabe;
eingabe='s';
parameter=2;
handle=figure('KeyPressFcn',@test);
while (parameter~=0)
   
    switch(eingabe)
        case 's'
            parameter=2;
        case 'a'
            parameter=1;
        case 'd'
            parameter=3;
        case 'q'
            parameter=0;
    end


    plot (handle, parameter, 'k.')
    axis ([0 2 0 4])
    pause (0.01)
end
 


damit springt der Punkt munter hin und her.

Zu den beiden Anmerkungen noch:
1.) Das mit Rückgabewert hat irgendwie nicht funktioniert, weiß nicht ob das generell nicht geht oder ich nur nicht dazu in der Lage bin.

2.) Dadurch dass es jetzt mit den einfachen Pausen funktioniert hab ich mich nicht näher damit beschäftigt.

Nochmal vielen Dank an euch alle für eure Hilfe.

Gruß
Harry
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.