# Schüsse in Richtung der Maus



## nicothestudent (30. Jun 2018)

Hallo, 
ich habe einen Shooter programmiert. Nun möchte ich die abgegebene Schüsse in Richtung der Maus abgeben. Allerdings weiß ich nicht ganz recht, wie ich vorgehen soll. Ich habe es mit
MouseInfo.getPointerInfo().getLocation().getY()
gemacht, jedoch funktioniert dies nicht so recht, ganz davon abgesehen, dass hier ja nicht nur das Spielfeld sondern der komplette Screen betrachtet wird. 

Wäre euch sehr dankbar, wenn ihr mir erklären könnt wie ich dort vorgehe, oder jemand sogar ein Beispiel hat.

Mein Bullet Code ist der folgende:


```
public class Bullet extends Entity {


    /**
     * calls Mob
     */
    public int dx ,dy ;
    private boolean left;
    public double damage;
    private String side;


    public Bullet(Texture texture, double x, double y, TileMap tileMap, double damage, String side){
        super(texture, x, y+6, tileMap);
        this.damage = damage;
        this.side = side;
    }

    public void tick() {
        if (dx == 0 && dy == 0){
            dx =+ (int) MouseInfo.getPointerInfo().getLocation().getX();
            dy =+ (int) MouseInfo.getPointerInfo().getLocation().getY();

        }



        move();

    }



    public void render(Graphics2D g, int offsetX, int offsetY) {

            super.render(g, offsetX + dx, offsetY + dy + 6);

    }




    public void move(){
        boolean horiz = tileMap.getBulletCollision(texture.getWidth(), x, y, x+dx, y, false);
        boolean vert = tileMap.getBulletCollision(texture.getWidth(), x, y, x, y + dy, true);
        if(!horiz){
            x += dx;
            y += dy;
        }
        if(!vert){
            y += dy;
            x += dx;
        }
        if(horiz){
            tileMap.removeEntity(this);
        }

        if(vert){
            tileMap.removeEntity(this);
        }
    }




}
```

Wichtig zu wissen ist glaube ich nur, dass dx und dy die jeweilige Richtungsveränderung darstellen. Ist dx = +1 geht er auf der "X-Achse +1" usw..


----------



## mrBrown (30. Jun 2018)

Am einfachsten ist es, beim erzeugen direkt die Zielkoordinaten mitzugeben. Die bekommst du z.B. bei Maus-Klicks über das entsprechende Event.


BTW:


nicothestudent hat gesagt.:


> dx =+ (int) MouseInfo.getPointerInfo().getLocation().getX();


Ist das `=+` beabsichtigt?
Das ist in dem Fall einfach nur ein unäres plus, was bei ints nichts bewirkt...


----------



## nicothestudent (30. Jun 2018)

mrBrown hat gesagt.:


> Am einfachsten ist es, beim erzeugen direkt die Zielkoordinaten mitzugeben. Die bekommst du z.B. bei Maus-Klicks über das entsprechende Event.
> 
> 
> BTW:
> ...




Hatte ich nur um Fälle unterschieden zu können beim bloßen draufgucken.

Ich nur in die Richtung des Coursers schießen und nicht genau zum Courser. Die Geschwindigkeit soll ebendfalls immer gleich sein egal wie weit die Maus entfernt ist. 

Also brauche ich ja wahrscheinlich Vektoren. Wie berechne ich diese jedoch und erhalte diese in Anpassung an die Spielfeld größe?


----------



## mihe7 (30. Jun 2018)

nicothestudent hat gesagt.:


> Ich nur in die Richtung des Coursers schießen und nicht genau zum Courser.


Naja, wenn ich einen Punkt immer weiter in Richtung des Cursors bewege, bin ich irgendwann wo?

Welche Aktion führt eigentlich zum Schuss? Soll sich die Richtung während des "Flugs" in Abhängigkeit der aktuellen Mausposition ändern? Wie wird dx und dy verwendet? Fragen über Fragen.


----------



## nicothestudent (30. Jun 2018)

mihe7 hat gesagt.:


> Naja, wenn ich einen Punkt immer weiter in Richtung des Cursors bewege, bin ich irgendwann wo?
> 
> Welche Aktion führt eigentlich zum Schuss? Soll sich die Richtung während des "Flugs" in Abhängigkeit der aktuellen Mausposition ändern? Wie wird dx und dy verwendet? Fragen über Fragen.



Das betätigen der Leertaste führt zum Schuss.
Wie bereits gesagt dx gibt an um welchen wert sich die X-Position ändert, dy um welchen Wert sich die Y Position ändert.
Die Kugel soll in Richtung des Coursers fliegen, nach Abschuss den Courser aber nicht weiter folgen.


----------



## mihe7 (30. Jun 2018)

Du kennst den Abschusspunkt o, den Punkt des Mauszeigers m, hast also einen Vektor d = m-o=(m.x-o.x, m.y-o.y) und teilst diesen z. B. durch die betragsmäßig größere der beiden Koordinaten (falls ungleich 0), ggf. auch skaliert.

Wenn Du die Bildschirmkoordinate des Mauszeigers verwenden willst, dann kannst Du z. B. mit Component.getLocationOnScreen() die Bildschirmkoordinate des Spielfelds und somit des Abschusspunkts ermitteln.


----------

