ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Backslider)
Kommentare (0)
****

Weitere
User onlineBenutzer online
Gäste online: 10
Mitglieder online: SteveKr, Wunderlich
Registrierte Mitglieder: 2116
Neustes Mitglied: onkel_keks

Schuss Richtung Maus ungenau. 2D

Neue Antwort erstellen
 

 

Autor Nachricht
 
 
Ramrod
Neuling


Anmeldedatum: 10.05.2012
Beiträge: 3

Antworten mit Zitat
BeitragVerfasst am: 10.05.2012, 14:47    Titel: Schuss Richtung Maus ungenau. 2D

Hi,

ich möchte in einem 2D Spiel Schüsse vom Spieler zur Maus fliegen lassen.

Dazu hol ichmir folgende Daten:

Code:

Vector2 mouse_posi, view_direction; //view_direction ist ein Vektor mit der "Blickrichtung" Also vom Spieler zur Maus
MouseState ms = Mouse.GetState();
mouse_posi.X = ms.X;
mouse_posi.Y = ms.Y;
view_direction.X = mouse_posi.X - sprite_red.Postion.X + 16;   //sprite_red ist der Spieler, +16 damit der Ursprung in der Mitte des Spieler_Sprites liegt und nicht an der oberen linken Ecke.
view_direction.Y = mouse_posi.Y - sprite_red.Postion.Y+16;
view_direction.Normalize(); //Blickrichtung normalisieren um den "Schuss" in die Richtung zu bewegen

double angle = (double)Math.Atan2(view_direction.Y, view_direction.X); // der Winkel zwischen Spieler und Maus
angle += MathHelper.PiOver2; //Rotation addieren um auf Höhe der Maus zu sein
double winkel = MathHelper.ToDegrees((float)(angle)); //Winkel in Grad umrechnen


Nun ist es so, das der Schuss manchmal genau die Spitze des Mauszeigers trifft und manchmal etwas daneben.

Wenn ich mir den Winkel in Grad ausgeben lasse, dann hab ich gerade unter dem Spieler 180°, aber alle anderen Werte sind etwa 10-15° verschoben.

Also gerade rechts vom Spieler ist etwa 79° etc.

Ich bin da jetzt etwas ratlos.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


JeReT
Member


Anmeldedatum: 19.07.2007
Beiträge: 3248
Wohnort: µnchen

Antworten mit Zitat
BeitragVerfasst am: 10.05.2012, 15:34    Titel:

Die berechnung des winkels sieht erst mal richtig aus.

das "+16" ist seeehr unschön. Nimm da lieber eine Variable "Origin", die im Sprite gespeichert ist und auch beim zeichnen als origin verwendet wird.

dann frage ich mich, wozu du denn winkel brauchst. reicht es nicht einen Richtungsvektor (view-direction) zu speichern, den du dann für die bewegung verwendest? oder brauchst du den winkel noch, um dein Sprite zu rotieren?
und wozu rechnest du dann nochmal in Grad um?

Und: hat dein Schuss-Sprite auch seinen origin in der mitte?
_________________
Idea Shapes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger ICQ-Nummer


Ramrod
Neuling


Anmeldedatum: 10.05.2012
Beiträge: 3

Antworten mit Zitat
BeitragVerfasst am: 10.05.2012, 15:49    Titel:

Also erstmal danke für die Antwort.

Hab inzwischen das +16 in Origin umgesetzt.

Den Winkel brauch ich für die Rotation des Sprites, richtig.
Origin des Sprites passt auch.

Als Grundlage muss ja erstmal der richtige Winkel ausgegeben werden, wenn ich die Maus links,rechts,oben und unten vom Spieler halte. Wenn das erstmal stimmt, klappt der Rest auch.

EDIT:

Hab grad mal aus Verzweiflung die MAuskoordinaten ausgeben lassen. Wenn ich ganz links oben an der Ecke bin, dann hat die MAus die Koordinaten 20/1621.
Wie kann denn sowas passieren?

EDIT2:

Problem gelöst:
Da mein Spielfeld in einer picturebox liegt, kann ich die MAuskordinaten nicht über den MouseState lesen.

Lösung:
Code:
public void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            game.mouseX = e.X; //Hier mit public Variablen in der game-Klasse. Kann man schöner machen Smile
            game.mouseY = e.Y;
        }

In der game-Klasse
Code:
 private Vector2 mouseOrigin()
        {
            Vector2 v = new Vector2(mouseX, mouseY)//Wieder die schnelle Version. Aber funktioniert.
            return v;
        }


Jetzt stimmen die Winkelangaben und ich kann die Schüsse direkt platzieren und sie kommen an der Mausspitze an.

Danke für die Hilfe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


PCFreak
Member


Anmeldedatum: 18.04.2012
Beiträge: 26

Antworten mit Zitat
BeitragVerfasst am: 10.05.2012, 16:52    Titel:

Wenn ich das richtig verstanden hab, dann hast du ja XNA in eine Windows Form integriert.
Versuch doch mal:
Code:
Mouse.WindowHandle = HandleDeinerPictureBox;


Hab ich auch bei einigen projekten so gemacht Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Beiträge der letzten Zeit anzeigen:   
 
Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht 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.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de