Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Spiele-/Grafikprogrammierung ::  SFML Problem mit meiner Kamera     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Lowpoly
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.04.2018
Beiträge: 2
Beitrag Lowpoly Mitglied 22:41:51 01.04.2018   Titel:   SFML Problem mit meiner Kamera            Zitieren

Hallo liebes Forum,

Seit einigen Tagen arbeite ich zur übung an einem kleinen Tiledbasierten Spiel.. Bis jetzt lief alles Supi, aber seit gestern hänge ich in meiner Kamera Klasse fest.. Bin am verzweifeln da ich eigentlich weis was das Problem ist aber ich einfach nicht auf die Lösung komme..
Ich hoffe jemand von euch kann mir weiter Helfen <3

Ok zum Problem:

Ich habe eine kleine Kollisionserkennung geschrieben die dazu dient die Kamera am Map ende zu stoppen so das der Spieler ohne die Kamera zum Mapende laufen kann.. Funktioniert einwandfrei aber jetzt kommt meine KameraGeschwindigkeit die bei Tastendruck trotzt Collision die Kamera noch ein paar Pixel weiter schiebt und wenn ich die Taste wieder loslasse springt sie wieder zurück an den Rand wie es auch sein sollte..

Es sind zwar nur ein paar Pixel aber es nervt wenn die Kamera hin und her Springt..

Also meine Frage wie schaffe ich es das die Kamera bei Kollision keinen einfluss auf die KameraGeschwindigkeit hat..

Ich hoffe ihr könnt ungefähr nachvollziehen was ich meine..

Hier die Kamera.h

C++:
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
#pragma once
#ifndef CAMERA_H
#define CAMERA_H

#include<iostream>

#include<SFML/Graphics.hpp>

#include"Player.h"

 
class Camera
{
public:
    friend class Player;
 
    Camera();
    ~Camera();
 
    void Update(Player &player, sf::RenderWindow &window, float deltaTime);
    void Render(sf::RenderWindow &window);
 
private:
    sf::RectangleShape camera;
    sf::View           cameraView;
 
    float cameraSpeed;
};

#endif // !CAMERA_H


Kamera.cpp

C++:
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
#include "include\Camera.h"
 
const float MapWidth = 1024;
const float MapHeight = 1024;
 
Camera::Camera()
    : cameraSpeed(200.f), camera(sf::Vector2f(800, 800)), cameraView(sf::FloatRect(0, 0, 800, 600))
{
    camera.setOrigin(0.f, 0.f);
    camera.setPosition(sf::Vector2f(0.f, 0.f));
}
 
Camera::~Camera()
{
    // Destroy
}
 
void Camera::Update(Player &player, sf::RenderWindow &window, float deltaTime)
{
    /* Holt mir die PlayerPosition */
    sf::Vector2f playerPos = player.GetPos();
 
    /* Bei Kollision Links.. Kamera nimmt die Position vom Fenster */
    if (playerPos.x <= window.getSize().x / 2) {
        camera.setPosition(0.f, camera.getPosition().y);
    }
    /* Bei Kollision Rechts.. Kamera nimmt die Position vom Fenster */
    if (playerPos.x >= MapWidth - window.getSize().x / 2) {
        camera.setPosition(MapWidth - window.getSize().x, camera.getPosition().y);
    }
    /* Bei Kollision Oben.. Kamera nimmt die Position vom Fenster */
    if (playerPos.y <= window.getSize().y / 2) {
        camera.setPosition(camera.getPosition().x, 0.f);
    }
    /* Bei Kollision Unten.. Kamera nimmt die Position vom Fenster */
    if (playerPos.y >= MapHeight - window.getSize().y / 2) {
        camera.setPosition(camera.getPosition().x, MapHeight - window.getSize().y);
    }
 
    /* Kamera Movement */
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
        camera.move(sf::Vector2f(-cameraSpeed*deltaTime, 0.f));
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
        camera.move(sf::Vector2f(cameraSpeed*deltaTime, 0.f));
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
        camera.move(sf::Vector2f(0.f, -cameraSpeed*deltaTime));
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
        camera.move(sf::Vector2f(0.f, cameraSpeed*deltaTime));
    }
 
    // Setze Kamera MittelPunkt
    cameraView.setCenter(sf::Vector2f(camera.getPosition().x + window.getSize().x / 2, camera.getPosition().y + window.getSize().y / 2));
}
 
void Camera::Render(sf::RenderWindow &window)
{
    window.setView(cameraView);
}


Und die in der GameKlasse eingebunde UpdateFunktion

C++:
1
2
3
4
5
6
7
8
void Game::Update()
{
    time = clock.getElapsedTime();
    mCamera->Update(*mPlayer, window, time.asSeconds());
    mPlayer->Update(*this, window, time.asSeconds());
    mMedi->Update(*this, *mPlayer, time.asSeconds());
    clock.restart().asSeconds();
}




Hoffe ihr könnt mir helfen

Mfg .. :)


Zuletzt bearbeitet von Lowpoly am 22:43:47 01.04.2018, insgesamt 2-mal bearbeitet
Jockelx
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.12.2009
Beiträge: 1397
Beitrag Jockelx Mitglied 12:19:06 03.04.2018   Titel:              Zitieren

Hey,

erst den Input verarbeiten und dann die Kollision checken?
So auf den ersten Blick...
Lowpoly
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.04.2018
Beiträge: 2
Beitrag Lowpoly Mitglied 08:46:58 04.04.2018   Titel:              Zitieren

Hi, Nocheinmal :)

Danke für den tipp, bin gerade selber darauf gekommen.. Ich habe die Fps falsch berechnet.. So kam es zu diesem kleinen lag.. Trotzdem vielen Dank :)

Kann geschlossen werden :live:

Mfg
C++ Forum :: Spiele-/Grafikprogrammierung ::  SFML Problem mit meiner Kamera   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.