ConsoleApplication / wie lese ich die pfleitasten ein?

Hallo Leute bin neu hier und noch nicht so stark in c# aber gebe mein bestes…Habe aus versucht einfachmal ne Spiel zu programmeiren…

Es werden Sterne erzeugt und fliegen im Fenster beliebig herum…

Ich will nun das ganze so umbauen dass wenn mann irgend eine Taste drückt der Stern dagegen abprallt und die richtung ändert…

Hier ne kleines Szenario :wink:

Während das Sternchen fliegt, kannst will ich eine der beiden Tasten drücken \ oder /.

Das gedrückte Zeichen soll an der Stelle gezeichnet werden an der sich das Sternchen gerade befindet.

Dieses Zeichen soll immer sichtbar bleiben. Das Sternchen prallt an diesem Zeichen ab. Wie?

Falls du zu dem Zeitpunkt auf die Leertaste drückst zu welchen das Sternchen gerade an einen der Schrägstriche stoßen würde, ist der Schrägstrich zu entfernen. Das Sternchen prallt dann natürlich nicht mehr ab, sondern
fliegt in seiner Richtung weiter.

kommt von links und geht nach unten weiter
→ * *
*
*
V
kommt von links und geht nach oben weiter
^
*
*
→ * */

Hättest da jmd ne eine Idee wie ich das realisieren kann/könnte? Es lässt mir keine Ruhe…
[CSharp]

using System;
using System.Collections.Generic;
using System.Text;

using System;

using System.Collections.Generic;

using System.Threading;

using System.Text;

using System.Collections;

namespace ConsoleApplication1
{

class Program
{

	static void Main(string[] args)
	{

    	ArrayList Liste = new ArrayList( );

    	//Cusor Position festelgen
    	int mitteX = Console.WindowWidth / 2;
    	int mitteY = Console.WindowHeight / 2;

    	Position starter1 = new Position(mitteX, mitteY, +1, 0);
    	Position starter2 = new Position(mitteX + 10, mitteY - 5, +1, +1);
    	Position starter3 = new Position(mitteX - 10, mitteY + 10, 0, -1);


    	Console.CursorVisible = false;

    	Liste.Add(starter3);
    	Liste.Add(starter2);
    	Liste.Add(starter1);

    	while(true)
    	{
        	foreach(Position p in Liste) { p.Zeichnen( ); }
        	Thread.Sleep(30);
        	foreach(Position p in Liste) { p.FolgeSchritt( ); }

    	}
	}

}

}

public class Position
{
public int posX, posY, richtungX, richtungY;

public Position(int x, int y, int xd, int yd)
{
	posX = x;
	posY = y;
	richtungY = yd;
	richtungX = xd;
}

public void FolgeSchritt( )
{
	// alte Zeichen löschen
	BildAusgabe(" ");

	//Ob cursor Rand stößt ggf Richtung drehen

	if((posY == Console.WindowHeight - 1) || (posY == 0))
	{
    	richtungY *= -1;
	}
	if((posX == Console.WindowWidth - 1) || (posX == 0))
	{
    	richtungX *= -1;
	}
	// Neues Zeichen setzen
	posX += richtungX;
	posY += richtungY;
}

public void Zeichnen( )
{
	BildAusgabe("*");
}

private void BildAusgabe(string a)
{
	Console.CursorLeft = posX;
	Console.CursorTop = posY;
	Console.Write(a);
}

}[/CSharp]

Also wenn ich das richtig verstanden hab willst du im Konsolenfenster eine Art Animation machen?
Mir ist gerade keine Möglichkeit bekannt wie man spezielle Punkte der Ausgabe ändern kann, über externe Libs ist das garantiert möglich.
Aber es ist ja nicht so als würde ich keine Lösung kennen :wink:
Merk dir die Daten die du ausgeben willst, gib sie aus. Wenn du im nächsten Schritt etwas ändern willst gib „\b“ aus das löscht das letzte Zeichen. Damit kannst du jetzt alles oder soweit löschen wie du es willst.
Diese Funktion haben wir im Studium mit Java benutzt, sollte aber auch mit C# gehen.

Nein du hast mich falsch verstanden! Also nehmen wir an es fliegt ein Stern horizontal hin und her… Ich drücke die Pfeiltaste> RECHTS, vor dem Stern wird ne “/” geschrieben… Der Stern prallt gegen den “/” ab und ändert die richtung!

Und dazu müsste ich die Zeichen ablesen können um zu wissen wo ich was schreibe…

Verstehst du mich?

Du musst dir irgendwie Merken was wo ist, zb in nem Array, dann kannst du darauf reagieren.

Ich habe ne ListArray benutzt! Ich will nur wissen wie ich die Pfeiltasten prüfen kann.

if( e.key == …)

{
dann schreibe vor der nächsten position des Sterns einen /, Sternprallt ab und ändert die Richtung
}

Achso dir gehts um das Abfangen der Tasten, da bin ich jetzt überfragt. Aber ich denke mal das es sowas wie nen globalen Keylistener gibt um die Tasten abzufragen. Musst du mal in der MSDN suchen.

Das ist eine Konsolenanwendung, oder? Mit C# hab ich lange nix gemacht und mit der Console-Klasse nie… Hilft Dir Console.read(…) irgendwie weiter?

dazu bräuchte ich ja dann ne Variable! Die würde dann nur zu nem bestimmten Zeit abgefragt werden?

ich könnte doch zb abfragen wenn die taste b gedrückt worden ist dann vor dem Stern ne / zeichen und prallen lassen, position neu berechnen!???

Ne read bringt da nicht viel, weil damit kannst du nur Zeichen einlesen, die Pfeiltasten sind aber kein Zeichen.
Unter Java gibts nen globalen EventListener, ich weiß das man auch in C# alle Tastendrücke von Windows abfangen kann, aber leider nicht wie :smiley:

Nö. Unter Java gibt’s Event Listener am Toolkit. Setzt aber voraus, dass mindestens ein java.awt.Window-Derivat existiert, sichtbar ist und Fokus hat. Ansonsten gibt’s keine Events. Oder hab ich da was verpasst?

Ebenius