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

[SFML] Jak sprawdzić , czy przed sprajtem nie znajduje się inny sprajt

Ostatnio zmodyfikowano 2012-09-19 02:04
Autor Wiadomość
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.
P-65001
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.
P-65006
yoogi
» 2012-09-16 08:32:17
Sprawdź to: http://www.sfml-dev.org/documentation/2.0/classsf_1_1Rect.php
P-65031
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
C/C++
#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
C/C++
#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.
P-65104
hincu
» 2012-09-17 20:46:09
porownuj pozycje obrazkow... to tzw kolizje
P-65108
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ą.
P-65111
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ś:
C/C++
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:
C/C++
AddBlock( 1, 25, 1 );
...
i rysujesz elementy [0-30][0-40]...

Spróbuj rozwiązać to inaczej np:
C/C++
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;
}

// i petla np for rysujesz kazdy element...
P-65112
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)
P-65149
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona