SFML - sf::View

0

Witam.
1.Jak używać sf::View ?
2.Jak zrobić kamerę za pomocą sf::View ?
Chdzi o taką podążającą za obiektem
Np

... 

sf::View kamera;
kamera.setCenter(gracz.getPosition() );
okno.setView(kamera);
... 
Tylko to zniekształca obraz
0

Przemieszczanie widoku realizujesz za pomocą sf::move przy czym będzie to wymagało określenia przesunięcia, jakie wykonał śledzony obiekt.
Samo setView nie powinno zniekształcać obrazu, więc bardziej chodzi tutaj o zastosowanie przez Ciebie domyślnego konstruktora. Konstruktor sf::View() domyślnie określa rozmiar widoku na 1000, 1000 co może wpływać na wyświetlanie Twojej tekstury zniekształconej, jeśli jest innego rozmiaru. Spróbuj pobrać rozmiar tekstury i rozmiar ten podać jako argument widoku.

0

Nie rozumiem, możesz podać przykładowy kod ?

1

Podążanie za myszką ( lub dowolnym innym obiektem ), efekt:

cKamera.h

#pragma once
#include"SFML\Graphics.hpp"

class cKamera
{
private:
	sf::View _kamera;
	sf::Vector2f _kierunekPoruszania;
	sf::Vector2f _przesuniecie;

public:
	cKamera(float ekranX, float ekranY);

	void update();
	void PoruszanieKamery(sf::Vector2f PozycjaCelownika, sf::Vector2f RozmiarEkranu);
	void aktywacjaKamery(sf::RenderWindow &oknoGry);
	sf::Vector2f ZwrocPozycje() { return _kamera.getCenter(); };
	sf::Vector2f ZwrocPrzesuniecie() { return _kamera.getCenter(); };

	~cKamera() = default;
};


cKamera.cpp

#include "cKamera.h"
#include <iostream>

cKamera::cKamera(float ekranX, float ekranY)
{
	_kamera.setSize(ekranX - (ekranX / 5), ekranY - (ekranY / 5));
	_kamera.setCenter(ekranX / 2, ekranY / 2);
}

void cKamera::update()
{
	_kamera.move(_kierunekPoruszania.x, _kierunekPoruszania.y);
}

void cKamera::PoruszanieKamery(sf::Vector2f PozycjaMyszy, sf::Vector2f RozmiarEkranu)
{
	sf::Vector2f PozycjaKamery = _kamera.getCenter();
	sf::Vector2f rozmiarKamery = _kamera.getSize();
	
	sf::Vector2f PozycjaCelownika = PozycjaMyszy;
	//LEWO
	if (PozycjaCelownika.x < rozmiarKamery.x / 2)
		PozycjaMyszy.x = rozmiarKamery.x / 2;
	
	//GORA
	if (PozycjaCelownika.y < rozmiarKamery.y / 2)
		PozycjaMyszy.y = rozmiarKamery.y / 2;

	//PRAWO
	if (PozycjaCelownika.x > RozmiarEkranu.x - rozmiarKamery.x / 2)
		PozycjaMyszy.x = RozmiarEkranu.x - rozmiarKamery.x / 2;

	//DOL
	if (PozycjaCelownika.y > RozmiarEkranu.y - rozmiarKamery.y / 2)
		PozycjaMyszy.y = RozmiarEkranu.y - rozmiarKamery.y / 2;

	_kierunekPoruszania = PozycjaMyszy - PozycjaKamery;
	sf::Vector2f WspolczynnikPredkosci = _kierunekPoruszania;
	_kierunekPoruszania = _kierunekPoruszania / sqrt(pow(_kierunekPoruszania.x, 2) + pow(_kierunekPoruszania.y, 2));
	_przesuniecie = _kierunekPoruszania;

	_kierunekPoruszania.x *= abs(WspolczynnikPredkosci.x / 10);
	_kierunekPoruszania.y *= abs(WspolczynnikPredkosci.y / 10);
}

void cKamera::aktywacjaKamery(sf::RenderWindow &oknoGry)
{
	oknoGry.setView(_kamera);
}
0

@kameleo327: Dałeś rybę, zamiast wędki. Podrzuciłem autorowi link do dokumentacji, gdzie mógł znaleźć próbki gotowego kodu i rozwiązań, mógł znaleźć tutoriale, przykłady... A Ty napisałeś mu cały kod.


Po drugie: kod, który wrzuciłeś nie jest dobrym przykładem czystego kodu.
1. Stosujesz zamiennie język polski z angielskim (samo to, że stosujesz język polski...)
2. Metoda update() nic nie mówi. Jeśli już, to updatePosition, ale najlepiej byłoby ją nazwać po prostu move().
3. Metoda PoruszanieKamery() sugeruje, że gdy ją wywołam kamera zmieni pozycję. Jest to nieprawda, ponieważ muszę jeszcze wywołać update, o czym nie wiem patrząc jedynie na nagłówek.
4. Metody zwracające pozycję i przesunięcie kamery zwracają dokładnie to samo, mimo że pozycja i przesunięcie to dwie różne rzeczy.
5. Kierunek poruszania kamery ciężko jest opisać wektorem. Bo w jakim kierunku porusza się kamera gdy (30, 50)?
6. Niepotrzebnie rozbijasz wektor na osobne składowe: _kamera.move(_kierunekPoruszania.x, _kierunekPoruszania.y); gdy pod ręką masz gotową metodę przyjmującą _kierunekPoruszania jako void move (const Vector2f &offset). Nie patrzysz w dokumentację, ale przynajmniej nie odciągaj od niej autora tematu.
7. Nie wiem dlaczego metoda poruszania kamery za każdym razem musi pobierać rozmiar ekranu, mimo że (jeśli dobrze interpretuję słabo nazwane argumenty) był on podany w konstruktorze. Rozmiar ekranu raczej nie będzie się zmieniał - podawanie go za każdym razem gdy chcę przesunąć kamerę jest redundantne.

0

No i z tym wszystkim się zgodzę, jest to mój stary kod, gdzie jeszcze programowałem po polsku xD
Chciałem po prostu pokazać przykład zastosowania, który jako tako działa.
Myślę, że autor może sukcesywnie czerpać wiedzę bazując na Twoim komentarzu, moim kodzie i przede wszystkim z dokumentacji.

0

Nadal pustka w głowie 😂
Był bym wdzięczny jak byś mi pomógł ze zrobieniem tego w moim kodzie. Pls...

Kod:

#include <SFML/Graphics.hpp>

int main()
{




    sf::Texture tekstura_tlo ;
    tekstura_tlo.loadFromFile("tlo.png");
    sf::Sprite tlo;
    tlo.setTexture(tekstura_tlo);

    sf::Texture tekstura_ludzik ;
    tekstura_ludzik.loadFromFile("ludzik.png");
    sf::Sprite ludzik;
    ludzik.setTexture(tekstura_ludzik);

    sf::Texture tekstura_krzak ;
    tekstura_krzak.loadFromFile("krzak.png");
    sf::Sprite krzak;
    krzak.setTexture(tekstura_krzak);



    sf::Event zdarzenie;



    ludzik.setPosition(0,0);
    krzak.setPosition(250,100);



    sf::RenderWindow okno (sf::VideoMode( 800, 600, 32), "okno");
    while(okno.isOpen())

    {
        while(okno.pollEvent(zdarzenie))
        {
            if(zdarzenie.type == sf::Event::Closed)
                okno.close();

            if(zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::D)
                ludzik.move(5,0);








            if(zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::A)
                ludzik.move(-5,0);





            if(zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::W)
                ludzik.move(0,-5);







            if(zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::S)
                ludzik.move(0,5);









        }
        okno.clear(sf::Color::White);
        okno.draw(tlo);
        okno.draw(krzak);
        ludzik.setScale(3,3);
        krzak.setScale(4,4);
        okno.draw(ludzik);
        okno.display();
    }

    return 0;
}

Ps męcze się z tym 4 dzień
Ps2 kamera ma podążać za ludzikiem "ludzik"

0

Przeanalizuj bardzo dokładnie to: https://www.sfml-dev.org/tutorials/2.5/graphics-view.php
Jeżeli sam to zrobisz, zapamiętasz to, zrozumiesz i nabierzesz większej wprawy w korzystaniu z dokumentacji.
Jeżeli nie dasz rady, STOP. Zagryź zęby weź głęboki wdech i zacznij od początku. Jeżeli to nie pomoże to idź się przejść na spacer i zacznij od początku.
Jeżeli nie dasz rady napisz wiadomość tutaj jeszcze raz i opisz dokładnie czego nie rozumiesz i co sprawia Ci największy problem.

0

*** Ja naprawde nie szukam jakiegoś jelenia *** który mi to zrobi, tylko takiej spoko osoby która pomoże mi w nauce. *** Jeżeli będe miał gotowy kod, to przeanalizuje go linijka po linijce, nawet dziesięć razy, żeby tylko się nauczyć. ***

0

Yyy.
Sory za stracony czas.
Zapomniałem że powiekszałem sprite ( scale ) i mi nie wychodziło.
Jak się odwdzięczyć za stracony czas.
Są tu jakieś like czy coś. ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1