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

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

1

14.07.2011, 13:38

SFML in winkelrichtung bewegen

Hallo, leute

Ich möchte ein Object bei mir im falle der Player(Spaceship) in eine winkelrichtung bewegen.
Ich habe sehr viel gegoogelt, die meisten Resultate waren das der Player sich in einem kreis beweg, wegen Sin und Cos.
Ich selber weiss das man mit einer While bzw einem Timer weiss nicht mehr genau wie das war denn perfekten Kreis daraus bilden kann.
doch ich suche jetzt endlich die berechnung in die richtung und will kein kreis machen.

im moment habe ich dies.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
            float speed = 0.89;
            float angel = sPlayer.GetRotation() *  PI / 180;
            float vx = cos(sPlayer.GetRotation()*PI180)*speed;
            float vy = sin(sPlayer.GetRotation()*PI180)*speed;
            float x = sPlayer.GetPosition().x + vx;
            float y = sPlayer.GetPosition().y + vy;
            cout << "vx // vy: " << vx << " // " << vy << endl;

            sPlayer.SetX(x);
            sPlayer.SetY(y);


Debug ist im Anhang, einfach mal dann Taste "W" und "D" gleichzeitig drücken.

Dnke schonmal im voraus.
LG,
Jason.
»AyJay« hat folgende Datei angehängt:
  • Debug.rar (183,85 kB - 140 mal heruntergeladen - zuletzt: 07.04.2024, 17:54)

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

14.07.2011, 15:45

Ein Winkel hat keine Richtung.
[hint]Aber wenn Du keinen Kreis willst, dann solltest Du vielleicht den Winkel nicht ändern, sondern nur den Radius.[/hint]
[error]Dein Programm benötigt im Übrigen die MSVCP100D.dll [hint]und vermutlich noch weitere[/hint] und ohne die läuft es nicht.[/error]
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]

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

3

14.07.2011, 15:54

Was mir nur fehlt ist die berechnung von der neuen x y position was ich nicht hinbekomme :S
kleinen Anreiz wenigsten wie das richtig funktioniert ? bei mir funktionierts ohne poroblem als solo EXE :S ?
Hmmmhm

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

14.07.2011, 15:57

Im Code-Ausschnitt allein sehe ich jetzt keinen Fehler. Aber da ich auch die Anwendung nicht starten kann, kann ich schlecht vermuten, was eventuell woanders schief läuft.

Edit:
Spannend finde ich übrigens diese Diskrepanz:

Player.GetPosition().x;
Player.SetX ( x );
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]

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

5

14.07.2011, 15:59

Kurz gesagt der player bewegt sich nur in kreis und rotiert gleichzeigt um die eigene gesetze "Center/Origin" achse :S

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

14.07.2011, 16:01

Edit sieht oben. Liegt es eventuell daran?
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]

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

7

14.07.2011, 16:07

X und Y sind ja die alte position + die veränderung berechnet durch denn winkel und geschwichkeit etc. doch irgendwas leuft da schief
kann ja alles mal posten wird zwar bischen komisch aussehen aber naja ;D

main.cpp

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <iostream>
#include <SFML\System.hpp>
#include <SFML\Graphics.hpp>
#include <string>
#include <sstream>
#include <time.h>
#include <cmath>
#include <math.h>
#include <stdio.h>
#include "ammo.h"

using namespace std;

#define PI  3.14159265358979323846f
#define PI180   0.01745329251994329576f
sf::RenderWindow App(sf::VideoMode(800, 600, 32), "Space-Shooter");
sf::View Camera;

Ammo *Object=NULL;
int iAmmo = 5;
int AmmoC = 0;
float speed = 0.89;
float friction = 0.89;

std::string time_t_to_string(time_t t)
{
    std::stringstream sstr;
    sstr << t;
    return sstr.str();
}

    int GetFreeAmmo(){
        int FreeAmmo = -1;
        for(int i = 0;i <= iAmmo;i++){
            if(FreeAmmo > -1){
                /*if(Object[i].inUse == false){
                    FreeAmmo = i;
                }*/
                FreeAmmo = 1;
            }
        }
        return FreeAmmo;
    }

int main(int argc, char **argv)
{
    Camera.SetCenter(App.GetDefaultView().GetCenter());

    sf::Image iPlayer_n;
    iPlayer_n.LoadFromFile("ship-not-m.png");
    iPlayer_n.SetSmooth(false);
    iPlayer_n.CreateMaskFromColor(sf::Color(255,0,255,255));

    sf::Sprite sPlayer(iPlayer_n);
    sPlayer.SetCenter(19.5, 21.5);
    sPlayer.SetPosition(400, 300);

    Object = new Ammo[iAmmo];

    while (App.IsOpened())
    {
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if (Event.Type == sf::Event::Closed){
                App.Close();
            }
            if (Event.Type == sf::Event::KeyPressed)
            {

                if (Event.Key.Code == sf::Key::Escape){
                    App.Close();
                }
                if (Event.Key.Code == sf::Key::F1)
                {
                    sf::Image Screen = App.Capture();
                    time_t seconds;
                    time(&seconds);
                    Screen.SaveToFile("screenshot_" + time_t_to_string(seconds) + ".jpg");
                }
            }
        }
        float ElapsedTime = App.GetFrameTime();
        
        if (App.GetInput().IsMouseButtonDown(sf::Mouse::Left)){
            time_t the_time;
            int x;
            the_time = time(0);
            x = static_cast<int> (the_time);
            Object[0].Create(sPlayer.GetPosition().x,sPlayer.GetPosition().y,x,sPlayer.GetRotation());
        }
        if (App.GetInput().IsKeyDown(sf::Key::A)){ sPlayer.SetRotation(sPlayer.GetRotation() - 1); }
        if (App.GetInput().IsKeyDown(sf::Key::D)){ sPlayer.SetRotation(sPlayer.GetRotation() + 1); }
        if (App.GetInput().IsKeyDown(sf::Key::W)){
            float angel = sPlayer.GetRotation() *  PI / 180;
            float vx = cos(sPlayer.GetRotation()*PI180)*speed;
            float vy = sin(sPlayer.GetRotation()*PI180)*speed;
            float x = sPlayer.GetPosition().x + vx;
            float y = sPlayer.GetPosition().y + vy;
            //cout << "vx // vy: " << vx << " // " << vy << endl;

            sPlayer.SetX(x);
            sPlayer.SetY(y);
        }
        if (App.GetInput().IsKeyDown(sf::Key::S)){
        
        }

        App.Clear(sf::Color(255, 255, 255));
        App.SetView(Camera);

        App.Draw(sPlayer);

        for(int i = 0;i <= iAmmo;i++){
            if(Object[i].inUse == true){
                App.Draw(Object[i].sAmmo);
                cout << "timestamp: " << Object[i].TimeStamp << endl;
            }
        }

        App.Display();

    }

    return EXIT_SUCCESS;
}

ammo.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <SFML/Graphics.hpp>
 
class Ammo
{
public:
    sf::Image iAmmo;
    sf::Sprite sAmmo;
    bool inUse;
    int TimeStamp;
 
public:
    ~Ammo(void);
 
    void Create(float,float,int,int);
    void Update(float,int);
    void Delete();
    
};

ammo.ccp

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
#include <SFML/Graphics.hpp>
#include "ammo.h"

Ammo::~Ammo(void)
{
    inUse = false;
}

void Ammo::Create(float X,float Y, int tStamp, int rRotation)
{
    TimeStamp = tStamp;
    inUse = true;
    iAmmo.LoadFromFile("ammo.png");
    iAmmo.CreateMaskFromColor(sf::Color(255,0,255));
    iAmmo.SetSmooth(false);
    sAmmo.SetImage(iAmmo);
    sAmmo.SetPosition(X,Y);
    sAmmo.SetRotation(rRotation);
}

void Ammo::Update(float Speed, int Angel){
    //Aktuelle Position + Velocity Positionen(Mit Angel und Speed Berechen)
    //Neue Position zusetzen
}

void Ammo::Delete(){
    inUse = false;
}

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

14.07.2011, 16:09

Du scheinst das Objekt falsch zu drehen.
Wofür berechnest du angle, wenn du sie dann doch nicht nutzt? Der Fehler könnte in der Konstante? PI180 liegen.
Die Geschwindigkeit scheint etwas niedrig(was bedeutet 0,89? Pixel pro Frame, Sekunde, Millisekunde???)
Schau dir mal die Movemethode von Sprite an.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

9

14.07.2011, 16:13

Ja die Movemethode kenne ich. doch ist die berechnung jetz richtig falsch wo liegt driekt der fehler ?
hatte voher auch Angel benutzt gehabt doch hat auch nicht funktioniert.

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

14.07.2011, 16:15

Ich bin immernoch erstaunt, wieso du einmal GetPosition().x aufrufen musst, aber NUR SetX() !?
Sicher, dass da die richtigen Variablen verändert werden und nicht eventuell die verkehrten (Offsets, Center, whatever)?
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]

Werbeanzeige