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 |
|
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) 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ą 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. |
|
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. |
|
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 ) |
|
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: 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;
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ć. |
|
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?? |
|
pekfos |
» 2020-03-27 21:28:28 |
|
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 #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 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:
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;
|
|
1 « 2 » 3 |