SFML Problem mit meiner Kamera



  • 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 ❤

    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

    #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

    #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

    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 .. 🙂



  • Hey,

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



  • 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 👍

    Mfg