C# Spiel programmieren mit Kinect

Oje, das wird schwer, aber ich versuch mal eine grobe Skizze auf Paint. Du hast doch das Bild gemeint und nicht die Koordinaten, oder?
"Teil 1" stellt das Bild da, wie es am Panel bei mir gerade aussieht (die Buttons hab ich leider vergessen). Am Anfang von Spiel sind die vier Blöcke aber unsichtbar.
"Teil 2" stellt das Bild da, nachdem die Blöcke in den Rahmen geschoben wurden.
Ich hoffe, du kannst daraus schlau werden. Ich bin zusammen mit einem Klassenkameraden stundenlang davor gesessen und hab rumprobiert, aber jedesmal kam eine Fehlermeldung weil was nicht passte. Es ist nämlich eine Gruppenarbeit, deshalb ist es besonders wichtig, dass wir am Ende irgendein Resultat haben. Es muss ja nicht einmal perfekt sein, nur die Hauptdinge müssen dabei sein - eben das "reinschieben" der Blöcke in den Rahmen.
Wenn du eine Lösung wie man das ohne Koordinaten anstellen kann, haben solltest, nur her damit:rolleyes:
 

Anhänge

  • teil 1.png
    teil 1.png
    611 Bytes · Aufrufe: 13
  • teil 2.png
    teil 2.png
    2,7 KB · Aufrufe: 17
Da du dir die Koordinaten so vielleicht besser vorstellen kannst:
Hier kommt nochmal Bild 2 mit denen. Jetzt nachdem meine Skizze wieder 2 Wochen her ist, versteh ich es leider auch nicht mehr ganz:(
 

Anhänge

  • teil 2.png
    teil 2.png
    3,3 KB · Aufrufe: 15
Okay, langsam glaube ich zu verstehen, was du vorhast.
Lass mich zusammenfassen:
  1. Es entstehen anfangs an zufälliger Position Blöcke. Dies ist von dir bereits implementiert.
  2. Der Benutzer soll die Blöcke zu einem Rechteck zusammenbauen.
  3. Die Blöcke können nicht gedreht werden.
  4. Der Benutzer kann dazu die Blöcke frei bewegen. Dies ist von dir bereits implementiert.
  5. Du hast Schwierigkeiten bei der Kollisionsüberprüfung. Das heißt, du weißt nicht, wie du verhindern sollst, dass ein Block in einen anderen Block hineingeschoben werden soll?
Du kennst doch alle Eck-Koordinaten aller Blöcke, nicht wahr?
Dadurch ergeben sich für die Koordinaten des Blocks, den der Benutzer gerade bewegt, ungültige Bereiche.
Kannst du nicht einfach nach dem Ende einer jeden Bewegung prüfen, ob der Block in so einen ungültigen Bereich bewegt wurde? Wenn ja, dann einfach Block an vorherige Position zurück setzen.

Wie bekomme ich das alles in eine if-Funktion und wo muss ich etwas hinschreiben?
Die Frage verstehe ich nicht. Was meinst du mit damit?
 
Zuletzt bearbeitet:
1.)1 bis 5 stimmt im Großen und Ganzen. Nur ist es gedacht, dass die vier Blöcke an vier bestimmten Stellen (untereinander zufällig, welcher wo sein soll) auftauchen (sollen!?)
An der Stelle weiß ich grad nicht, ob ich es schon habe, oder nicht.

2.)Deine Idee klingt gut, aber zuerst muss ich mal festlegen, dass die Blöcke, wenn man sie an einer bestimmten Stelle hingegeben hat, einrasten. - Deshalb "einrasten" weil man mit der Kinect ja nicht so genau arbeiten kann. Ungenauigkeiten sollen entfernt werden ---

3.)Wenn nämlich ein Teil nur ein paar Pixel vom Zielort entfernt ist, soll es diesen einnehmen. Das ist mein größtes Problem momentan.
Hier brauch ich unbedingt (möglichst schnell) Hilfe, weil ich nicht weiß, wie ich das formulieren soll. Das ist diese Sache mit der "if-Funktion", wie ich das ausgedrückt habe.
Wenn ein Block ein paar Pixel vom Zielort entfernt ist, soll er einrasten, wenn nicht, passiert nichts.
Siehe oben: Das soll da drin stehen.

4.)Dein 5. ist natürlich auch ein Problem. Dabei hab ich auch als größte Schwierigkeit noch immer, wie eigentlich überall, wie ich das mit den Koordinaten formuliere.

P.S.:Ich hoffe, meine Antwort ist verständlicher als die vorige und auch übersichtlicher... Danke für deinen Versuch mir zu helfen:D
 
Nur ist es gedacht, dass die vier Blöcke an vier bestimmten Stellen (untereinander zufällig, welcher wo sein soll) auftauchen (sollen!?)
Was jetzt? an bestimmten Stellen oder zufällig?

zuerst muss ich mal festlegen, dass die Blöcke, wenn man sie an einer bestimmten Stelle hingegeben hat, einrasten. - Deshalb "einrasten" weil man mit der Kinect ja nicht so genau arbeiten kann. Ungenauigkeiten sollen entfernt werden
Was genau ist denn dein Problem "mit den Koordinaten"? "Das mit den Koordinaten" ist keine Aussage! Weißt du, wie man den Abstand zwischen zwei Punkten berechnet? Wenn nicht, siehe: Euklidischer Abstand bzw. anschaulicher hier: Euklidische Norm in 2D.
Sobald der Abstand zwischen Block und Zielposition kleiner als ein Schwellwert ist, beispielsweise 5, dann setzt du die Blockposition auf die Zielposition. Und schon ist der Block eingerastet.

Hier brauch ich unbedingt (möglichst schnell) Hilfe
Ich bin jetzt erst mal eine Woche im Urlaub.
 
Zuletzt bearbeitet:
Was jetzt? an bestimmten Stellen oder zufällig?
Es gibt vier bestimmte Stellen an denen die Blöcke sein können. Wo welcher Block ist, ist nicht festgelegt.


Was GENAU ist denn dein Problem "mit den Koordinaten"? Weißt du, wie man den Abstand zwischen zwei Punkten berechnet? Wenn nicht, siehe: Euklidischer Abstand.


Ich weiß zwar , wie man den Abstand zwischen 2 Punkten berechnet, (zumindest in der Mathematik)aber ich weiß nicht, wie man das bei Visual C# anschreiben soll.


Sobald der Abstand zwischen Block und Zielposition kleiner als ein Schwellwert ist, beispielsweise 5, dann setzt du die Blockposition auf die Zielposition. Und schon ist der Block eingerastet.
Ich bin jetzt erst mal eine Woche im Urlaub.
Das klingt ja eigentlich ganz gut, aber WIE kann ich das programmieren?
Das du jetzt im Urlaub bist, ist zwar wirklich Pech für mich, aber ich wünsch dir trotzdem mal viel Spaß.:rolleyes:;-)
 
Schau dir mal folgenden Code an, vielleicht gibt der dir eine Idee, wie du es umsetzen kannst.
Erstelle dazu ein neues C#-Windows-Forms-Projekt, nenne das Projekt "TutHelpEinrasten" und ersetze den Inhalt der Datei Form1.cs
durch diesen Code:
C#:
using System.Drawing;
using System.Windows.Forms;

namespace TutHelpEinrasten
{
    public partial class Form1 : Form
    {
        private Rectangle Hindernis = new Rectangle(100, 100, 100, 50);
        private Size GrößeDesBewegtenRechtecks = new Size(25, 25);
        private Point PositionDesBewegtenRechtecks = new Point(0, 0);

        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.FillRectangle(Brushes.Red, Hindernis);
            Rectangle temp = new Rectangle(PositionDesBewegtenRechtecks, GrößeDesBewegtenRechtecks);
            e.Graphics.FillRectangle(Brushes.Green, temp);
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            // Position des Maiszeigers im Fenster-Koordinatensystem:
            Point Maus = this.PointToClient(Control.MousePosition);

            // neues Rechteck erstellen; dieses stellt die neue Position des bewegten Rechecks dar:
            Rectangle neu = new Rectangle(Maus, GrößeDesBewegtenRechtecks);

            // Prüfen, ob Rechtecke kollidieren würden
            if (!Hindernis.IntersectsWith(neu))
            {
                PositionDesBewegtenRechtecks = Maus;
            }

            // Fenster mitteilen, dass es sich neu zeichnen soll
            this.Invalidate();
        }
    }
}
Er gibt ein Beispiel für die Kollisionabfrage. Zum Schreiben des Codes für das Andocken hatte ich leider keine Zeit.
 
Zurück