SFML - sf::View

Odpowiedz Nowy wątek
2019-03-01 17:17

Rejestracja: 1 rok temu

Ostatnio: 8 miesięcy temu

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

Pozostało 580 znaków

2019-03-01 17:57

Rejestracja: 5 lat temu

Ostatnio: 3 godziny temu

0

Przemieszczanie widoku realizujesz za pomocą sf::View::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.

Nie rozumiem, możesz podać przykładowy kod ? - Harrty_xx 2019-03-03 16:26

Pozostało 580 znaków

2019-03-02 16:48

Rejestracja: 1 rok temu

Ostatnio: 8 miesięcy temu

0

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

Pozostało 580 znaków

2019-03-03 23:12

Rejestracja: 2 lata temu

Ostatnio: 7 miesięcy temu

Lokalizacja: Poznań

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);
}

Pozostało 580 znaków

2019-03-04 04:22

Rejestracja: 5 lat temu

Ostatnio: 3 godziny temu

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.

Pozostało 580 znaków

2019-03-04 08:09

Rejestracja: 2 lata temu

Ostatnio: 7 miesięcy temu

Lokalizacja: Poznań

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.

Pomożesz \/ - Harrty_xx 2019-03-04 19:22

Pozostało 580 znaków

2019-03-04 15:12

Rejestracja: 1 rok temu

Ostatnio: 8 miesięcy temu

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"

edytowany 1x, ostatnio: Harrty_xx, 2019-03-04 15:30

Pozostało 580 znaków

2019-03-04 21:53

Rejestracja: 2 lata temu

Ostatnio: 7 miesięcy temu

Lokalizacja: Poznań

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.

Pokaż pozostałe 3 komentarze
Prosze powiedz czego mam użyć - Harrty_xx 2019-03-06 17:00
Jutro wyśle - Harrty_xx 2019-03-06 20:36
Masz użyć sf:View xdddd - kameleo327 2019-03-06 23:58
Ale czego musze konkretnie użyć, jakich linijek powiesz ??????? - Harrty_xx 2019-03-07 16:37

Pozostało 580 znaków

2019-03-07 17:37

Rejestracja: 1 rok temu

Ostatnio: 8 miesięcy temu

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

edytowany 3x, ostatnio: Harrty_xx, 2019-03-07 17:52
Człowieku wysłałem Ci GOTOWY KOD + link do dokumentacji z tutorialem jak tego używać - kameleo327 2019-03-07 17:38
No wiem, tylko ja potrzebuje żeby kamera szła za obiektem - Harrty_xx 2019-03-07 17:39
Pomożesz ? - Harrty_xx 2019-03-07 17:51
Prosze podaj mi kod na kamere poruszającą się za obiektem (sprajtem) - Harrty_xx 2019-03-07 18:53

Pozostało 580 znaków

2019-03-09 19:39

Rejestracja: 1 rok temu

Ostatnio: 8 miesięcy temu

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ś. ?

edytowany 1x, ostatnio: Harrty_xx, 2019-03-09 19:40

Pozostało 580 znaków

Odpowiedz

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