Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C# und .NET ::  Taste gedrückt halten  
Gehen Sie zu Seite Zurück  1, 2, 3  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
D.J.
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.07.2012
Beiträge: 81
Beitrag D.J. Mitglied 15:52:54 11.08.2012   Titel:              Zitieren

Zitat:
Was meinst du damit, dass du es nicht hinbekommst? Was passiert denn? Verschwindet womöglich der Spieler auf der Stelle, weil so viele KeyDown Events innert so kurzer Zeit ausgelöst werden, dass der Spieler in Nullkommanichts ganz wo anders steht?


Nein. Allgemein hat sich mein Spieler einfach nicht bewegt.
D.J.
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.07.2012
Beiträge: 81
Beitrag D.J. Mitglied 17:35:39 11.08.2012   Titel:              Zitieren

Hm. Hab doch noch ein kleines Problem.

Wenn ich die Taste jetzt etwas länger gedrückt halte, dann hört der Spieler nicht mehr auf sie fortzubewegen.
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8176
Beitrag Dravere Moderator 17:39:08 11.08.2012   Titel:              Zitieren

D.J. schrieb:
Zitat:
Was meinst du damit, dass du es nicht hinbekommst? Was passiert denn? Verschwindet womöglich der Spieler auf der Stelle, weil so viele KeyDown Events innert so kurzer Zeit ausgelöst werden, dass der Spieler in Nullkommanichts ganz wo anders steht?

Nein. Allgemein hat sich mein Spieler einfach nicht bewegt.

Hast du vergessen ein Invalidate aufzurufen, damit das OnPaint Event erneut versendet wird?

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
D.J.
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.07.2012
Beiträge: 81
Beitrag D.J. Mitglied 18:44:27 11.08.2012   Titel:              Zitieren

Zitat:
Hast du vergessen ein Invalidate aufzurufen, damit das OnPaint Event erneut versendet wird?


Nein. Ich wusste einfach nicht wirklich wie das in C# funktionier, das man einen Tastendruck einliest und auswertet. Hab das nur so halbrichtig gemacht indem ich mri google als HIlfestellung genommen habe.

Aber jetzt funktionierts ja.
Bis auf das Oben genannte Problem eben.

Zitat:
Wenn ich die Taste jetzt etwas länger gedrückt halte, dann hört der Spieler nicht mehr auf sie fortzubewegen.
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8176
Beitrag Dravere Moderator 21:10:16 11.08.2012   Titel:              Zitieren

Wie hast du es denn jetzt gelöst? Mit der Variante von geeky oder meiner? Kannst du das Problem reproduzieren in einem einfachen Projekt (weniger als 100 Zeilen ;))?

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
D.J.
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.07.2012
Beiträge: 81
Beitrag D.J. Mitglied 23:17:24 11.08.2012   Titel:              Zitieren

So habe ich das jetzt gelöst.. Warum fragst du so dringlich? ;)

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private List<Keys> _pressedKeys = new List<Keys>();
 
 private void Map_KeyDown(object sender, KeyEventArgs e)
        {
            _pressedKeys.Add(e.KeyData);
        }
 
        private void Map_KeyUp(object sender, KeyEventArgs e)
        {
            _pressedKeys.Clear();
        }
 
        private void SpielerTimer_Tick(object sender, EventArgs e)
        {
            // Bewegungen Abhängig von Keys
           
                if (_pressedKeys.Contains(Keys.W))
                {
                    SpielerY -= 10;
                    Spieler.Location = new Point(SpielerX, SpielerY);
                }
 
                if (_pressedKeys.Contains(Keys.S))
                {
                    SpielerY += 10;
                    Spieler.Location = new Point(SpielerX, SpielerY);
                }
 
                if (_pressedKeys.Contains(Keys.A))
                {
                    SpielerX -= 10;
                    Spieler.Location = new Point(SpielerX, SpielerY);
                }
 
                if (_pressedKeys.Contains(Keys.D))
                {
                    SpielerX += 10;
                    Spieler.Location = new Point(SpielerX, SpielerY);
                }          
        }
EXDW
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.08.2005
Beiträge: 4732
Beitrag EXDW Mitglied 08:37:19 13.08.2012   Titel:              Zitieren

Zitat:
Wenn ich die Taste jetzt etwas länger gedrückt halte, dann hört der Spieler nicht mehr auf sie fortzubewegen.

Ist das nicht der Sinn darin? Also die Figur so lange bewegen wie die Taste gedrückt ist wird.

Hast du den Code den du da verwendest überhaupt komplett verstanden? Wenn ja dann findest du das Problem schon noch selber.
Jesus Christus
Unregistrierter




Beitrag Jesus Christus Unregistrierter 08:44:12 13.08.2012   Titel:              Zitieren

C#:
if(!pressedKeys.Contains(e.KeyData))
   _pressedKeys.Add(e.KeyData);
D.J.
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.07.2012
Beiträge: 81
Beitrag D.J. Mitglied 11:56:45 13.08.2012   Titel:              Zitieren

Ich habs ja schon gelöst.
Code:
private void Map_KeyUp(object sender, KeyEventArgs e)
        {
            _pressedKeys.Clear();
        }


War früher:
Code:
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    _pressedKeys.Remove(e.KeyData);
}


Und jetzt funktionierts.
Danke :)
luker
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.07.2007
Beiträge: 38
Beitrag luker Mitglied 14:02:28 14.08.2012   Titel:              Zitieren

Bedeutet aber auch, dass Du nur jeweils eine Taste zuverlässig nutzen kannst. Nix mit gleichzeitig laufen _und_ springen.

Denn beim Loslassen einer Taste löschst Du auch die Information über alle anderen gedrückten Tasten. Verwende lieber die OnKeyDown()-Variante von Jesus Christus (das ist ein Nick, oder?).
c++.de :: C# und .NET ::  Taste gedrückt halten  
Gehen Sie zu Seite Zurück  1, 2, 3  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.