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

[SFML 2.1] Lag przy kasowaniu i brak kolizji

Ostatnio zmodyfikowano 2014-08-26 12:54
Autor Wiadomość
Jacahehe
Temat założony przez niniejszego użytkownika
[SFML 2.1] Lag przy kasowaniu i brak kolizji
» 2014-08-25 00:09:27
Witam! Mam 2 problemy z koim kodem.
1) kolizja. Robilem wszystko zgodnie z tematem o kolizjach z tego forum, jednak chyba cos przeoczylem, ale nie mam pojecia gdzie, sprawdzalem kod wiele razy i wydaje sie byc ok, ale nie jest.

2) Chyba zle uzywam funkcji erese do vektorka bo gdy sie wykonuje program zacina sie na krotka chwile (zwlaszcza gy jest wiecej obiektow)

Moglby mi ktos pomoc znalezc rozwiazania na te dwa problemy? Oto kod:

fruit.h:
C/C++
#include <iostream>
#include <SFML/Graphics.hpp>

class fruit
{
public:
    int int_fruit_positionX;
    int int_fruit_positionY;
    int int_targetY;
    int int_fruit_speed;
    int int_what_fruit;
   
    sf::Texture texture_fruit;
    sf::Sprite sprite_fruit;
   
   
    void load( std::vector < fruit > & skrzynia, int & i );
    void draw( sf::RenderWindow & window, std::vector < fruit > & skrzynia, int & i );
    void set_position( std::vector < fruit > & skrzynia, int & i );
   
    fruit( sf::Sprite spr, sf::Texture txr, int x = 0, int y = 0, int ty = 0, int s = 0, int w = 0 );
    //fruit::~fruit();
   
};

fruit.cpp:
C/C++
#include <iostream>
#include <SFML/Graphics.hpp>
#include "fruit.h"



void fruit::load( std::vector < fruit > & skrzynia, int & i )
{
    skrzynia[ i ].int_fruit_positionX = /*this->int_fruit_positionX =*/(( std::rand() % 1230 ) + 0 );
    skrzynia[ i ].int_fruit_positionY = 0;
    skrzynia[ i ].int_targetY = 1100;
    skrzynia[ i ].int_fruit_speed = 10;
    skrzynia[ i ].int_what_fruit =(( std::rand() % 3 ) + 1 );
   
    switch( skrzynia[ i ].int_what_fruit )
    {
    case 1:
        skrzynia[ i ].texture_fruit.loadFromFile( "1.png" );
        break;
    case 2:
        skrzynia[ i ].texture_fruit.loadFromFile( "2.png" );
        break;
    case 3:
        skrzynia[ i ].texture_fruit.loadFromFile( "3.png" );
        break;
    }
    skrzynia[ i ].sprite_fruit.setTexture( texture_fruit );
    i++;
}



void fruit::set_position( std::vector < fruit > & skrzynia, int & i )
{
   
    //if (int_fruit_positionY == 500)
    // fruit::~fruit();
}

void fruit::draw( sf::RenderWindow & window, std::vector < fruit > & skrzynia, int & i )
{
   
   
}

fruit::fruit( sf::Sprite spr, sf::Texture txr, int x, int y, int ty, int s, int w )
{
    spr = this->sprite_fruit;
    txr = this->texture_fruit;
    x = this->int_fruit_positionX;
    y = this->int_fruit_positionY;
    ty = this->int_targetY;
    s = this->int_fruit_speed;
    w = this->int_what_fruit;
};

main.cpp:
C/C++
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <string>
#include "fruit.h"

std::vector < fruit > skrzynia;
sf::Vector2i mysz;

int punkty = 0;
int zycia = 3;

class gracz
{
public:
    int x;
    int y;
    sf::Texture grtxr;
    sf::Sprite grspr;
   
    void grwczytaj();
    void wyswietl_i_ruszaj( sf::RenderWindow & window );
};

void gracz::grwczytaj()
{
    grtxr.loadFromFile( "gracz.png" );
    y = 900;
}

void gracz::wyswietl_i_ruszaj( sf::RenderWindow & window )
{
    mysz = sf::Mouse::getPosition( window );
    x = mysz.x;
    grspr.setTexture( grtxr );
    grspr.setPosition( x, y );
    window.draw( grspr );
}


int main()
{
    sf::RenderWindow window( sf::VideoMode( 1280, 1024 ), "Fallen Apple" );
    window.setFramerateLimit( 60 );
    sf::Texture teksturka;
    teksturka.loadFromFile( "1.png" );
    sf::Sprite sprajt;
    sprajt.setTexture( teksturka );
   
    sf::Font font;
    font.loadFromFile( "Arial.ttf" );
   
    sf::Text tzycia;
    char chzycia[ 50 ];
    tzycia.setFont( font );
    tzycia.setPosition( 1100, 50 );
    tzycia.setCharacterSize( 40 );
   
    sf::Text tpkt;
    char chpkt[ 50 ];
    tpkt.setFont( font );
    tpkt.setPosition( 1000, 100 );
    tpkt.setCharacterSize( 40 );
   
    fruit::fruit( sprajt, teksturka, 0, 0, 12, 0, 0 );
   
    srand( time( NULL ) );
    int i = 0;
    //skrzynia.push_back(fruit(sprajt,teksturka,0,0,12,0,0));
   
    gracz gracz1;
    gracz1.grwczytaj();
   
    while( window.isOpen() )
    {
        window.clear();
       
       
       
        gracz1.wyswietl_i_ruszaj( window );
       
        if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
        {
            skrzynia.push_back( fruit( sprajt, teksturka, 0, 0, 12, 0, 0 ) );
            skrzynia[ i ].load( skrzynia, i );
        }
       
        for( int pppp = 0; pppp < skrzynia.size(); pppp++ )
        {
            skrzynia[ pppp ].int_fruit_positionY = skrzynia[ pppp ].int_fruit_positionY + skrzynia[ pppp ].int_fruit_speed;
            skrzynia[ pppp ].sprite_fruit.setTexture( skrzynia[ pppp ].texture_fruit );
            skrzynia[ pppp ].sprite_fruit.setPosition( skrzynia[ pppp ].int_fruit_positionX, skrzynia[ pppp ].int_fruit_positionY );
            window.draw( skrzynia[ pppp ].sprite_fruit );
           
            if(( skrzynia[ pppp ].int_fruit_positionX >=( gracz1.x + 150 ) ) &&
            (( skrzynia[ pppp ].int_fruit_positionX + 50 ) <= gracz1.x ) &&
            ( skrzynia[ pppp ].int_fruit_positionY >=( gracz1.y + 30 ) ) &&
            (( skrzynia[ pppp ].int_fruit_positionY + 50 ) <= gracz1.y ) )
            {
                skrzynia.erase( skrzynia.begin() + pppp );
                i--;
                punkty++;
            } else
            {
               
                if( skrzynia[ pppp ].int_fruit_positionY > skrzynia[ pppp ].int_targetY )
                { zycia--;
                    skrzynia.erase( skrzynia.begin() + pppp );
                    i--; }
            }
        }
       
       
        sprintf( chzycia, "Zycia: %i", zycia );
        tzycia.setString( chzycia );
        window.draw( tzycia );
       
        sprintf( chpkt, "Punkty: %i", punkty );
        tpkt.setString( chpkt );
        window.draw( tpkt );
        window.display();
       
    }
    return 0;
}

Wiem ze kod troche pomieszany, nie zwracalem uwagi na ukladanie go (moj blad, nadrobie jak zacznie dzialac ;) )

Z gory dziekuje :)
P-116030
Jacob99
» 2014-08-25 08:00:54
skrzynia.erase( skrzynia.begin() + pppp )
 to dziwne, że w ogóle to ci się kompiluje, bo nie ma zgodności typów. skrzynia.begin() jest typu std::vector<fruit>::const_iterator, a pppp jest typu int.
P-116035
colorgreen19
» 2014-08-25 11:05:04
@Jacob99 Nie dziwne bo mi np. też sie take rzeczy kompilują. int ppp inkrementuje iterator z początku wektora i ogólnie całość jest typu std::vector<fruit>::const_iterator.

Do tematu, generalnie wektor ma powolny dostęp do elementów w środku, spróbuj zamienić na std::list<fruit> (jak pisałem system cząsteczej to różnice miałem ogromną)
( http://pl.wikibooks.org/wiki/C++/Listy )
P-116039
pekfos
» 2014-08-25 11:28:34
skrzynia.erase( skrzynia.begin() + pppp )
 to dziwne, że w ogóle to ci się kompiluje, bo nie ma zgodności typów.
Bzdury.. Jest zgodność.
P-116041
Monika90
» 2014-08-25 12:05:01
C/C++
fruit::fruit( sf::Sprite spr, sf::Texture txr, int x, int y, int ty, int s, int w )
{
    spr = this->sprite_fruit;
    txr = this->texture_fruit;
    x = this->int_fruit_positionX;
    y = this->int_fruit_positionY;
    ty = this->int_targetY;
    s = this->int_fruit_speed;
    w = this->int_what_fruit;
};
Ten fragment wygląda na pozbawiony sensu, co gorsza ma zbędny średnik.

Problemem jest to, że fruit ma składową typu sf::Texture. Podczas dodawania i usuwania elementów wektora te tekstury będą kopiowane, to jest zapewne kosztowne. Na dodatek sf::Sprite zawiera wskaźnik do tej tekstury, po skopiowaniu ten wskaźnik będzie nieważny.

Do tematu, generalnie wektor ma powolny dostęp do elementów w środku,
chyba żartujesz
P-116044
Jacahehe
Temat założony przez niniejszego użytkownika
» 2014-08-25 13:07:17
Dzieki wielkie, naprawilem błąd z lagiem, załadowałem teksturki na poczatku maina i poprostu je ustawiałem kiedy trzeba:)

Niestety nadal nie moge sobie poradzic z kolizjami...
P-116045
Jacahehe
Temat założony przez niniejszego użytkownika
» 2014-08-26 12:54:13
Ogarnalem kolizje :) Jakby ktos mial z tym problem to niech sobie przeanalizuje ten kod:

C/C++
skrzynia[ pppp ].int_fruit_positionX + 50 >= gracz1.x && skrzynia[ pppp ].int_fruit_positionX + 50 <= gracz1.x + 200 &&
skrzynia[ pppp ].int_fruit_positionY + 50 >= gracz1.y && skrzynia[ pppp ].int_fruit_positionY + 50 <= gracz1.y + 80 )

dodam ze obiekty maja takie rozmiary:
skrzynia 50,50
gracz 150,30


Czyli jezeli sa 2 obiekty np. A i B, ktore maja wartosci x, y, w oraz h to jest tak:

C/C++
A.w >= B.x && A.w <= B.x + b.w && //szerokosc
A.h >= B.y && A.h <= B.y + b.h //wysokosc

Tylko tyle :)

Pozdrawiam :)
P-116115
« 1 »
  Strona 1 z 1