Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] kamera, kolizja

Ostatnio zmodyfikowano 2020-03-28 01:40
Autor Wiadomość
pekfos
» 2020-03-27 20:32:20
Pekfos, nie działa ten skrócony kod.
U mnie działa. Szczegóły?

Pozycja gracza jest dowolna, może stać tylko na jednym polu, a może na czterech.
To doprecyzuj jak ma działać gracz i jak ma działać kolidujący kafel. Jeśli cały kwadrat gracza/kafla ma być kolidujący, to masz po prostu problem sprawdzenia, czy 2 prostokąty na siebie nachodzą. sf::Rect<> ma nawet do tego gotową metodę.

Tylko wtedy chyba muszę zrobić mnóstwo spritów, nie? (nie wiem jak mógłbym wykorzystać tabllice dwuwymiarową - wstyd się przyznać)
Tu masz przykładowy kod który robi dokładnie to, co chcesz (czy nie daję tego linka już ze 3 raz..?)
https://www.sfml-dev.org​/tutorials/2.5​/graphics-vertex-array.php
P-176551
R0ut4
Temat założony przez niniejszego użytkownika
» 2020-03-27 20:36:21
Nieeeee, to dopiero pierwszy raz :)

Znalazłem, chodzi ci o to: (plus klase Tilesmap)
C/C++
const int level[] =
{
    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0,
    1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
    0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0,
    0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0,
    0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0,
    2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1,
    0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1,
};
Ale problem jest jeden... Nie rozumiem o co chodzi :/

1. Fragment kodu z kamerą
C/C++
int main()
{
    sf::RenderWindow aplikacja( sf::VideoMode( 840, 720 ), "Ogrod" );
    aplikacja.setFramerateLimit( 60 );
    Stan stan = Menu;
    sf::View camera;
    camera.setSize( 300, 300 );
   
    Gracz player;
    player.setOrigin( 25, 25 );
    Game game;
    game.setOrigin( 500, 500 );
    game.setPosition( 420, 360 );
   
    camera.setCenter( player.getPosition() );
   
    sf::Texture tekstura_menu;
    tekstura_menu.loadFromFile( "Menu.png" );

2. Gracz to będzie najbardziej ograniczony prostokąt tak jak fragment mapy, ale np. płotek nie jest cały kaflem.
P-176552
pekfos
» 2020-03-27 20:39:42
Ale problem jest jeden... Nie rozumiem o co chodzi :/
To poświęć na to więcej niż minutę. Numer w tablicy odpowiada fragmentowi tekstury do wyświetlenia na danej pozycji. Obliczenia są w przykładowym kodzie, wystarczy przeanalizować i może trochę sobie pomóc kartką i długopisem.

1. Nie oczekujesz czasem, że coś się samo zrobi? Zobacz w ich kodzie co się dzieje ze zmienną sf::View. I kiedy.
P-176553
R0ut4
Temat założony przez niniejszego użytkownika
» 2020-03-27 20:42:13
To prześwietle jeszcze raz klase Tilesmap i main, a jak nic nie uda mi się ogarnąć to napisze znowu xd

(Wraz z pierwszym moim postem na forum otworzyłem program "Specjalna pomoc użytkownikowi R0ut4" XD )
P-176554
RazzorFlame
» 2020-03-27 21:03:22
RazzorFlame (czemu nie krótszy nick xd)
 bo taki wymyśliłem dobre 10 lat temu, teraz bym wybrał inny.

Na razie się nie przejmuj ilością spritów, będziesz o tym myślał później. Najpierw ma działać.
Zresztą... na początek możesz zrobić tak:

C/C++
const float TileSize = 40.f;

int mapTiles[ 5 ][ 5 ] = {
    { 0, 0, 0, 0, 0 },
    { 0, 1, 1, 1, 0 },
    { 0, 1, 1, 1, 0 },
    { 0, 1, 1, 1, 0 },
    { 0, 0, 0, 0, 0 }
};

sf::Texture grassTexture, dirtTexture;
// tutaj sobie wczytujesz tekstury

sf::Sprite grassSprite, dirtTexture;
grassSprite.setTexture( grassTexture );
dirtSprite.setTexture( dirtTexture );

for( int row = 0; row < 5; ++row )
{
    for( int col = 0; col < 5; ++col )
    {
        if( mapTiles[ row ][ col ] == 0 )
        {
            grassSprite.setPosition( col * TileSize, row * TileSize );
            window.draw( grassSprite );
        }
        else
        {
            dirtSprite.setPosition( col * TileSize, row * TileSize );
            window.draw( dirtSprite );
        }
    }
}

Potem się zastanowisz jak to ulepszyć.
P-176555
R0ut4
Temat założony przez niniejszego użytkownika
» 2020-03-27 21:24:32
Mam parę pytań jeśli można :/

1. row i col to to samo co jest [5][5] przy mapTiles?
2.
const float TileSize = 40.f;
 co to jest? Rozmiar kafla?
3. przy pierwszym if'ie jeśli rwo LUB col czy row & col jest równe 0 to narysuj trawę?
4. jeśli jest różne od zera to rysuj ziemię, to wiem

Pytanie ogólne, Jak to działa??
P-176556
pekfos
» 2020-03-27 21:28:28
Brzmi trochę jakbyś nie wiedział jak działają tablice(?) » Kurs C++ » Poziom 2Tablice jednowymiarowe lekcja
P-176557
R0ut4
Temat założony przez niniejszego użytkownika
» 2020-03-27 21:38:43
Tablice to można się odnieść do danej informacji która jest przypisywana do jednego miejsca w tablicy, jak jest tablica jednowymiarowa o wartości 5, to można w niej zapisać 5 informacji, jednak odlicza się od 0 do 4, więc wiem jak działają tablicę. Ale w tym kodzie to jest dla mnie trochę bardzo kłopotliwe

Edit: Jakbym chciał dodać kolejny "rodzaj kafla" to wystarczy że dodam kolejnego if'a i odnieść się do niego, że jeśli row Lub col czy row & col jest równe 2 to wtedy wstawia ten nowy kafel?

Edit 2: Spróbowałem zrobić kolizje i nie wyszło:
ster.cpp
C/C++
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include "sterowanie.hpp"
#include "gracz.hpp"

void Ruch_postaci( Gracz & hero, sf::Sprite & B )
{
    if( hero.getPosition().x == B.getPosition().x && hero.getPosition().y == B.getPosition().y )
    {
        hero.setPosition( 0, 0 );
    }
    else
    {
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) )
        {
            hero.move( 0, - 5 );
        }
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) )
        {
            hero.move( 0, 5 );
        }
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) )
        {
            hero.move( - 5, 0 );
        }
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) )
        {
            hero.move( 5, 0 );
        }
    }
}
fragment main.cpp
C/C++
const float TileSize = 100.f;
int mapTiles[ 5 ][ 5 ] =
{
    { 0, 0, 0, 0, 1 },
    { 1, 1, 1, 0, 1 },
    { 1, 0, 1, 0, 1 },
    { 1, 0, 1, 1, 1 },
    { 1, 0, 0, 0, 0 }
};
sf::Texture grasstext, betotext;
grasstext.loadFromFile( "grass.png" );
betotext.loadFromFile( "beton.png" );
sf::Sprite grass( grasstext );
sf::Sprite beton( betotext );
for( int row = 0; row < 5; row++ )
{
    for( int col = 0; col < 5; col++ )
    {
        if( mapTiles[ row ][ col ] == 0 )
        {
            grass.setPosition( col * TileSize, row * TileSize );
            aplikacja.draw( grass );
        }
        else
        {
            beton.setPosition( col * TileSize, row * TileSize );
            aplikacja.draw( beton );
        }
    }
}
///////////////////////////////////////////
case Gra:
Ruch_postaci( player, beton );
break;
/////////////////////////////////////////////
case Gra:
///aplikacja.draw (game);
//aplikacja.setView (camera);
for( int row = 0; row < 5; row++ )
{
    for( int col = 0; col < 5; col++ )
    {
        if( mapTiles[ row ][ col ] == 0 )
        {
            grass.setPosition( col * TileSize, row * TileSize );
            aplikacja.draw( grass );
        }
        else
        {
            beton.setPosition( col * TileSize, row * TileSize );
            aplikacja.draw( beton );
        }
    }
}
aplikacja.draw( player );
break;
P-176558
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona