sinoo Temat założony przez niniejszego użytkownika |
» 2012-09-15 22:29:44 Przecież to oczywiste, że aby sprawdzić mając dwa obiekty, czy jeden nie nachodzi na drugi, należy jedynie sprawdzić ich pozycję! Chodziło mi o to, jak sprawdzić, czy sprajty nie nachodzą na siebie mając ich dość sporą ilość w różnych miejscach niekoniecznie określonych przez programistę. Ostatnio znalazłem ten film na Youtube "C++ Platformer (SFML)". Na filmie twórca pokazuje ciekawą grę platformową. Chodzi mi mniej więcej o coś takiego - mając wiele obiektów można odczytać pozycję każdego z nich i sprawić, że sprajt postaci zatrzyma się przed lub nad jednym z nich. |
|
SeaMonster131 |
» 2012-09-15 23:30:35 Albo zrobił "kolizje na mapie kafelkowej", albo trzyma te obiekty np w vectorze, następnie leci pętlą po tych obiektach, i sprawdza czy pozycja tego obiektu != pozycji gracza. |
|
yoogi |
» 2012-09-16 08:32:17 Sprawdź to: http://www.sfml-dev.org/documentation/2.0/classsf_1_1Rect.php |
|
sinoo Temat założony przez niniejszego użytkownika |
» 2012-09-17 19:50:52 Wpadłem na bardzo prosty i całkiem ciekawy sposób na ogarnięcie wszystkich obiektów i sprawdzenie, czy nie nachodzą na siebie. Mój sposób jest prawdopodobnie podobny do innych i dość prymitywny, ale działa na dodawaniu kolejnych bloków funkcją. Dzięki temu będą mogły być po lepszym dopracowaniu przewijane wraz z mapą, a taka technika pozwoli na tworzenie plików z mapą. Nie obeszło się jednak bez problemów. Mam pewien problem z pętlą, która rysuje wszystkie elementy tablicy. Oto kod: main.cpp #include <iostream> #include "funkcje.h" #include "class.h"
int main() { sf::RenderWindow AppWin( sf::VideoMode( 800, 600, 32 ), "Game Project" ); AppWin.UseVerticalSync( true ); Graphics[ 0 ].LoadFromFile( "block.jpg" ); LoadMap(); while( AppWin.IsOpened() ) { sf::Event Event; while( AppWin.GetEvent( Event ) ) { if( Event.Type == sf::Event::Closed ) AppWin.Close(); } AppWin.Clear( sf::Color( 100, 100, 100, 100 ) ); int x = 0; int y = 0; int ch = 0; do { AppWin.Draw( Block[ x ][ y ] ); x++; if( x == 30 ) { y++; x = 0; } ch++; } while( ch == 1199 ); AppWin.Display(); } return 0; }
funkcje.h #ifndef FUNKCJE_H #define FUNKCJE_H #include <SFML/Graphics.hpp> #include <iostream> #include "class.h"
sf::Image Graphics[ 10 ]; sf::Sprite Block[ 40 ][ 30 ]; int hmObiects = 0;
int AddBlock( int posX, int posY, int ID ) { if( ID == 1 ) { Block[ posX ][ posY ].SetPosition( posX * 20, posY * 20 ); Block[ posX ][ posY ].SetImage( Graphics[ 0 ] ); hmObiects++; } return 0; }
int LoadMap() { AddBlock( 1, 25, 1 ); AddBlock( 2, 25, 1 ); AddBlock( 3, 25, 1 ); AddBlock( 4, 25, 1 ); AddBlock( 5, 25, 1 ); AddBlock( 6, 25, 1 ); AddBlock( 7, 25, 1 ); AddBlock( 8, 25, 1 ); AddBlock( 9, 25, 1 ); AddBlock( 10, 25, 1 ); AddBlock( 11, 25, 1 ); AddBlock( 12, 25, 1 ); AddBlock( 13, 25, 1 ); AddBlock( 14, 25, 1 ); AddBlock( 15, 25, 1 ); AddBlock( 16, 25, 1 ); AddBlock( 17, 25, 1 ); AddBlock( 18, 25, 1 ); AddBlock( 19, 25, 1 ); AddBlock( 20, 25, 1 ); AddBlock( 21, 25, 1 ); AddBlock( 22, 25, 1 ); AddBlock( 10, 22, 1 ); AddBlock( 11, 22, 1 ); AddBlock( 12, 22, 1 ); return 0; }
#endif
Przetestowałem kod na kilka sposobów i wszystko wskazuje na to, że to pętla zawodzi. Próbowałem napisać kilka pętli na kilka różnych sposobów, ale to nie dało oczekiwanego efektu. Liczę na pomoc i mam nadzieję, że nie tylko ja skorzystam z tego tematu na forum. |
|
hincu |
» 2012-09-17 20:46:09 porownuj pozycje obrazkow... to tzw kolizje |
|
sinoo Temat założony przez niniejszego użytkownika |
» 2012-09-17 21:11:00 porownuj pozycje obrazkow... to tzw kolizje
|
To właśnie próbuję zrobić, ale na razie nie dodałem jeszcze sprajta postaci. Jedyne co na razie jest mi potrzebne to poprawna pętla rysująca sprajty w tablicy. Funkcja "AddBlock", "LoadMap" i cała reszta działa poprawnie z wyjątkiem pętli. Sprawdzałem to na podstawie rysowania kilku sprajtów "Block" z tablicy, wstawiając funkcję rysującą poza pętlą. |
|
SeaMonster131 |
» 2012-09-17 21:17:47 Dlaczego trzymasz "bloki" w 2 wymiarowej tablicy? Nie lepiej po prostu w tablicy lub kontenerze? Bo teraz skoro zrobiłeś: Block[ posX ][ posY ].SetPosition( posX * 20, posY * 20 ); Block[ posX ][ posY ].SetImage( Graphics[ 0 ] );
i nadajesz jako posY 25 / 22 a posX 1-22 / 10-12: i rysujesz elementy [0-30][0-40]... Spróbuj rozwiązać to inaczej np: class CBlock { public: sf::Sprite img; int posX, posY; Block( sf::Image im, int pX, int pY ) : posX( px ) , posY( py ) { img.SetImage( im ); } };
vector < CBlock > block;
int AddBlock( int posX, int posY, int ID ) { if( ID == 1 ) block.push_back( CBlock( Graphics[ 0 ], posX * 20, posY * 20 ) ); return 0; }
|
|
sinoo Temat założony przez niniejszego użytkownika |
» 2012-09-18 17:41:22 Wcześniejszy kod przerobiłem trochę używając klasy, którą napisał SeaMonster131, ale mam trochę błędów, których za nic nie mogę naprawić. A oto kompletny nowy kod http://wklej.se/kod_by_sinoo hasło do niego to "abc123" (bez nawiasów). A to log z kompilacji: Compiling... main.cpp d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\funkcje.h(17) : error C2590: 'Block' : only a constructor can have a base/member initializer list d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\funkcje.h(22) : warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\funkcje.h(22) : warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\funkcje.h(26) : error C2143: syntax error : missing ';' before '<' d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\funkcje.h(26) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\funkcje.h(32) : error C2065: 'block' : undeclared identifier d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\funkcje.h(32) : error C2228: left of '.push_back' must have class/struct/union type is ''unknown-type'' d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\main.cpp(24) : error C2065: 'block' : undeclared identifier d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\main.cpp(24) : error C2228: left of '.size' must have class/struct/union type is ''unknown-type'' d:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml project\sfml project\main.cpp(25) : error C2065: 'block' : undeclared identifier Build log was saved at "file://d:\Documents and Settings\SysOp\Moje dokumenty\Visual Studio 2008\Projects\SFML Project\SFML Project\Debug\BuildLog.htm" SFML Project - 8 error(s), 2 warning(s)
|
|
1 « 2 » 3 |