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

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

1

02.01.2011, 17:24

Problem beim bewegen von Objekten

Hallo,
mein neustes Projekt ist es einen einfachen Breakout Klon zu schreiben, allerdings habe ich ein Problem dabei den Schläger zu bewegen.

Hier mal kurz den wichtigen Code:
Game.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
        if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Left))
        {
            float Movement = 300 * g_pFramework->getWindow()->GetFrameTime();
            float CoordinateX = m_Paddle->getCoordinates().x;
            std::cout<<CoordinateX - Movement<<std::endl;
            if((CoordinateX - Movement) <= 20.f)
                m_Paddle->setCoordinates(20.f);
            else
                m_Paddle->setCoordinates(CoordinateX - Movement);
        }

        if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Right))
        {
            float Movement = 300 * g_pFramework->getWindow()->GetFrameTime();
            float CoordinateX = m_Paddle->getCoordinates().x;
            std::cout<<CoordinateX + Movement<<std::endl;
            if((CoordinateX + Movement) >= 400.f)
                m_Paddle->setCoordinates(400.f);
            else
                m_Paddle->setCoordinates(CoordinateX + Movement);
        }

Paddle.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Paddle.hpp"

CPaddle::CPaddle()
{
    m_PaddleShape = sf::Shape::Rectangle(20,560,140,580,sf::Color(0, 255, 0));
    m_Coordinates = sf::Vector2f(20,560);
}

void CPaddle::Render()
{
    g_pFramework->getWindow()->Draw(m_PaddleShape);
}

void CPaddle::setCoordinates(float p_X)
{
    m_PaddleShape.SetPosition(p_X, 560);
    m_Coordinates = m_PaddleShape.GetPosition();
}

Das Problem ist, das sobald ich entweder den linken oder rechten Pfeil drücke, verschwindet der Schläger, der Schläger wird aber am Anfang angezeigt und die Koordinaten passen auch beim drücken der Tasten und verändern sich auch.
Ich weiß echt nicht was das Problem ist.

Falls das noch nicht ausreicht, hier ist mal der gesamte Code:
»ZIR« hat folgende Datei angehängt:
  • Breakout.rar (3,45 kB - 71 mal heruntergeladen - zuletzt: 20.04.2024, 09:23)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

02.01.2011, 17:37

die paddle.hpp fehlt.^^
egal.

C-/C++-Quelltext

1
m_PaddleShape = sf::Shape::Rectangle(20,560,140,580,sf::Color(0, 255, 0));

durch

C-/C++-Quelltext

1
2
m_PaddleShape = sf::Shape::Rectangle(-60,-10,60,10,sf::Color(0, 255, 0));
setPosition(*mittelpunkt des rects*);

bzw.

C-/C++-Quelltext

1
2
m_PaddleShape = sf::Shape::Rectangle(0,0,120,20,sf::Color(0, 255, 0));
setPosition(*linke obere ecke des rects*);

ersetzen.

du hast die linke obere ecke des rects mit 20|560 angeben. damit befindet sich die linke obere ecke auf dem bildschirm immer am positionsvektor+20|560.
die position des shape ist anfangs 0|0.
drückst du nun eine taste wird SetPosition vom shape aufgerufen und die tatsächliche linke obere ecke des rects befindet sich plötzlich an position 20|560+20|560=40|1020

gibst du deiner paddleklasse eine geschwindigkeit, einen maximal- und minimalwert für die position, kannst du ihr per methode z.b. move(LEFT) sagen in welche richtung sie sich bewegen soll. bei echtzeiteingaben sollte man allerdings die hier ganz unten beschriebene methode verwenden.
dann kann deine paddleklasse sogar selbst die eingaben verwalten und deine hauptschleife muss nurnoch update und draw aufrufen. hoffe das war verständlich^^ wenn nicht nochmal bescheid sagen.
"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?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »NachoMan« (02.01.2011, 17:53)


ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

3

02.01.2011, 18:02

Okay, es funktioniert jetzt.
Ich hätte aber noch eine Frage:
Gibt es irgendeine Funktion um die Breite und die Höhe herauszufinden?
Ich habe die Dokumentation schon durchgeschaut, ahbe aber nichts gefunden.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

02.01.2011, 18:12

die breite findest du mitn atemtester heraus und die höhe mitn maßband :D
spass beiseite. welche höhe? die vom screen?

jetzt fällts mir ein. sf::Shape hat keine methode dafür. deswegen fragst du vermutlich auch^^
musst du wohl extra speichern.

edit: du könntest auch selbst eine funktion dafür schreiben. darin kontrollierst du alle positionen der punkte, speicherst ihre extreme und gibst deren differenz zurück. das ist aber aufwendig, langsam und für einen anfänger nicht so einfach umzusetzen. wollte nur nicht behaupten, dass es unmöglich sei^^
"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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (02.01.2011, 18:22)


ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

5

02.01.2011, 18:16

Ah okay.
Gut danke nochmals.

Jaja, lass mal lieber.
Da speicher ich die lieber^^.

€:
Sorry, dass ich euch schon wieder belästige, aber ich habe das nächste Problem.
Die Funktion getCoordinates sieht jetzt so aus:

C-/C++-Quelltext

1
sf::Vector2f getCoordinates(){return m_PaddleShape.GetPosition();}

und ich habe eben noch das gemacht, dass die Klasse den Schläger selebr bewegt.
Nun wollte ichd ie Kollisionserkennung für den Ball und den Schläger schreiben, allerdings geht der Ball direkt durch den Schläger durch und ich weiß nicht wieso:

C-/C++-Quelltext

1
2
3
4
5
6
7
    if ((m_Ball->getCoordinates().x >= m_Paddle->getCoordinates().x) &&
        ((m_Ball->getCoordinates().x + m_Ball->getRadius()) <= (m_Paddle->getCoordinates().x + m_Paddle->getMeasures().x)) &&
        ((m_Ball->getCoordinates().y + m_Ball->getRadius()) >= m_Paddle->getCoordinates().y))
    {
        m_Ball->invertMovement(MOVEMENT_X);
        m_Ball->invertMovement(MOVEMENT_Y);
    }

€2:
Hat sich erledigt, ich habe vergessen, das selbe auch bei dem Ball und dem Spielfeld zu machen.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »ZIR« (03.01.2011, 00:00)


Werbeanzeige