Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

18.12.2012, 10:13

Naja wenn es dir erklärt wurde und du es verstanden hast, dann wüsstest du ja was du zu tun hättest;) Von daher scheint es da ja doch noch Verständnisprobleme zu geben. Bei deinem Code ist ja im Prinzip nichts von dem umgesetzt.
Oft ist es nützlich, wenn man seine Grundlagen dazu schreibt. Dazu wäre vielleicht wichtig zu wissen wie deine mathematischen Vorkenntnisse sind (zum Beispiel Mathe LK Klasse 12, oder Klasse 7 Matheunterricht. absoluter Programmierneuling, oder jahrelange Erfahrung mit diversen Sprachen). Ich vermute mal, dass du mit manchen Schreibweisen und Begriffen hier vielleicht nicht sonderlich viel anfangen konntest.
Dieses Problem lässt sich an sich mit Vektorrechnung ganz einfach lösen. Wenn du davon noch nichts gehört haben solltest, oder es zwar gehört hast, aber nicht viel darüber weißt, dann frag mal Onkel Google. Da findest du einiges zu Vektoren etc.
Zuerst berechnest du den Richtungsvektor von deinem Start- zu deinem Endpunkt. Das geht bei der Vektorrechnung sehr sehr einfach. Im Prinzip rechnest du dabei Endpunkt-Startpunkt. Wie das bei der Vektorrechnung genau funktioniert weißt du vielleicht schon, oder Google sagt es dir ganz fix. Jetzt hast du das Problem, dass der erhaltene Vektor erst mal irgendeine Länge hat. Da du dich aber mit einer bestimmten Geschwindigkeit bewegen möchtest, sollte der Vektor auch genau die Länge der Geschwindigkeit haben. Willst du dich also 5.3 Einheiten Bewegen, so sollte der Vektor auch die Länge 5.3 haben. Solche Probleme lassen sich, wie du vielleicht auch schon weißt mit dem Dreisatz super lösen. Du bringst zuerst die Länge des Vektors auf die Länge 1 (dies nennt sich normalisieren) und danach, multiplizierst du den Vektor mit der Länge. Wie man einen Vektor normalisiert wurde oben schon mal geschrieben. Dabei sind diese Worte aber glaube ich nicht so genau gefallen. Aber da hilft dir auch erst mal Google. Im Prinzip hast du mit diesem Vektor nun ausgerechnet um wie viel du deine X und Y Koordinate jeden Frame anpasst.
Dabei hat BlueCobold grad einen Hinweis auf die Zeit gegeben. Diese Bewegung hier ist Frame Abhängig. Die Geschwindigkeiten hängen von den Frames pro Sekunde ab. Wenn du eine Grafik jeden Frame um 5 Pixel bewegen würdest und deine Anwendung einmal mit 60 Frames pro Sekunde läuft und einmal mit 80, dann bewegen sich die Grafiken unterschiedlich schnell. Leuchtet denke ich ein. Nun jetzt kann man die Anzahl der Frames pro Sekunde einfach begrenzen. Das wäre dann ein Hack auf die schnelle, der aber auch zu Problemen führen kann. An sich ist das aber ein Problem, welches das Thema hier sprengen würde. Dazu gibt es hier im Forum mehrere Threads und Google dürfte auch voll mit Informationen sein.
Dann versuch das ganze erst mal umzusetzen. Wenn es dabei Probleme gibt, solltest du wie gesagt mal Google bemühen. Einiges dürfte sich vermutlich damit schon klären. Wenn Google dir nicht hilft, weil du die gefundenen Sachen vielleicht nicht verstehst (so ging es mir zur Schulzeit auch oft), dann machst du hier einen Thread mit dem Thema auf und fragst noch mal genau nach. Wie gesagt ist es manchmal Hilfreich zu wissen welches Hintergrundwissen du vielleicht schon hast. Erklär am besten was du weißt und verstehst und was nicht.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

12

18.12.2012, 15:09

Danke erstmal für den ausführlichen Text.

Ich dachte so: Ich habe über den Satz des Pythagoras die Länge der Strecke ausgerechnet.
Jetzt brauch ich den Richtungsvector der sich ja so berechnet:
AB = (x2 - x1)
(y2 - y1)

Nun muss ich die ausgerechnete Länge dem Richtungsvector entlang.

In Java bin ich kein Neuling mehr (benutzte aber eine Engine, diese ist leider schlecht bis garnicht dokumentiert..ich kämpfe mich mehr oder minder durch), doch ich habe solche Themen wie Vecotorberechungen leider noch nicht in Mathe gehabt, deswegen war ich gestern noch bei jemandem, der mir das erklärt hat.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
            for (int i=0; i < distanz; i++)
            {
                float r = (float) (i / (distanz-1));
              
                float x = getWaffe().getX() + r * (targetX - getWaffe().getX());
                float y = getWaffe().getY() + r * (targetY - getWaffe().getY());
             
                getWaffe().setX(x);
                getWaffe().setY(y);
            }


Diesen Code habe ich nun in der mitgelieferten update() Methode des AnimatedSprit. - Dauerschleife
Das Problem ist nur, dass man die Bewegung des Hammer noch nicht sieht, aber er erscheint wenigstens schonmal an der richtigen Stelle.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

18.12.2012, 15:19

Du weißt schon, dass eine Schleife "sofort" ausgeführt wird, richtig? Du erinnerst Dich eventuell auch, dass ich das Wort "Zeit" schon erwähnt habe.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

14

18.12.2012, 15:20

Ist ja alles kein Problem. Dachte mir schon, dass du Vektorrechnung möglicherweise nicht kennst. Aber so lernst du was neues dazu;)
Du kennst die Länge des Richtungsvektors und du kennst die Länge die der Richtungsvektor eigentlich haben soll( die Geschwindigkeit). Also benutz doch einfach den Dreisatz. Dafür bringst du den Vektor erst auf Länge1 (Stichwort normalisieren). Du teilst den Vektor einfach durch seine Länge. Danach hast du einen normierten Vektor der Länge 1. Jetzt willst du ihn aber auf die Länge der Geschwindigkeit bringen. Also multiplizierst du den Vektor einfach mit der Geschwindigkeit. Jetzt kannst du in Update einfach den Vektor auf dei Position addieiren und dein Objekt bewegt sich mit deiner vorher gewählten Geschwindigkeit in Richtung des Vektors.
Was du da grad machst kann ich auf die schnelle nicht erkennen. Eine Schleife brauchst du in deiner Update Methode dafür auch nicht. Bin grad bei der Arbeit und hab gleich noch Uni. Heut abend guck ich mir deinen Code noch mal genauer an. Falls es nicht schon jemadn vor mir macht.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

18.12.2012, 15:28

Lass ihn selber denken. Offenbar hat er das alles noch nicht ganz verstanden, wie seine Schleife zeigt. Nur Code vorgekaut bekommen ist für niemanden gut. Weder für ihn, noch für uns (weil er dann weiterhin hier fragt und hofft, dass es ihm jemand schreibt).
Wenn er programmieren will und Spaß dabei sucht, dann soll er auch die "kniffeligen" Sachen selbst machen, denn sonst wäre es unlogisch programmieren zu wollen. Programmieren heißt Probleme selbst lösen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

18.12.2012, 16:17

Hab meinen Beitrag aktuell auch geschrieben, bevor ich deine Antwort gesehen hatte. Ja ist richtig, ich habe schon sehr viele Informationen dazu gegeben. Wollte ihm damit den Einstige in die Vektorrechnung allerdings ein wenig erleichtern. Bin kein Pädagoge;) Naja aber an sich stimme ich dir da schon zu.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

17

14.01.2013, 14:59

Ich habe mal wieder etwas Zeit gefunden und hab nun auch etwas hinbekommen:

Das Problem momentan ist nur, dass der geworfene Gegenstand sich schneller bewegt, desto weiter die Wurfdistanz ist.

C-/C++-Quelltext

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
    float alpha;
    float fx;
    float fy;
    int throwposition;
      
    public void condition()
    {   
        // Wurf
        if(throwing)
        {
            // Position auf dem Richtungsvektor
            alpha = (float) (throwposition/(distance-1));
              
            // Richtungsvektor
            fx = Main.getThorshammer().getX() + alpha * (targetX - Main.getThorshammer().getX());
            fy = Main.getThorshammer().getY() + alpha * (targetY - Main.getThorshammer().getY());
             
            // Koordinaten setzten
            Main.getThorshammer().setX(fx);
            Main.getThorshammer().setY(fy);
                
            // Wurfgeschwindigkeut
            throwposition += throwspeed;
        
            // Abbruchbedingung, wenn der Hammer die Distanz zurückgelegt hat
            if(alpha>=1)
            {
                // Wurf auf false setzten
                throwing = false;
                
                // Wurfposition wieder zurücksetzen
                throwposition = 0;
            }
        }
}

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

18

14.01.2013, 18:15

Du musst doch einfach nur die Richtung bestimmen und dann das Objekt entlang dieser Richtung bewegen. Dabei musst du natürlich nur so weit bewegen wie es gewünscht ist. Wenn du die Richtung normalisierst, kannst du die Richtung mit der Geschwindigkeit multiplizieren um einen Vektor mit passender Länge zu bekommen.

C#-Quelltext

1
2
3
4
5
6
7
8
9
// Diese drei Werte müssen natürlich irgendwie gegeben sein
Vektor ziel;
Vektor start;
float speed;

Vektor direction = ziel - start;
direction = direction.normalize(); // hier wird normalisiert. Die Länge wird also auf 1 gebracht. Wie das funktioniert zeigt dir ein Mathebuch, Google, oder eine Frage in diesem Forum

Vektor position = start + direction * speed * time;


Die Variable speed wäre hier die Geschwindigkeit in Einheiten pro Sekunde. Das wurde aber im Prinzip vorher schon so geschrieben. Den Typ Vektor wird es bei dir vermutlich so nicht geben. Genau wie die Funktion normalize(). Das musst du natürlich an deinen Code anpassen. Die meisten Klassen für Vektoren werden wohl eine Funktion zum normalisieren besitzen. Ansonsten kann man das aber auch simpel selbst schreiben.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

19

16.01.2013, 18:47

Dankeschön, klappt nun einwandfrei :)

Werbeanzeige