SFML community forums

Help => Graphics => Topic started by: codyjae on June 25, 2014, 09:47:00 pm

Title: deleting a class made up of SFML images
Post by: codyjae on June 25, 2014, 09:47:00 pm
Hey, new to SFML but not to C/C++. 
So here is my issue, I created a linked list (manualy) to test what i could do right off the bat.  Originally it was a program to produce various circle shapes that bounce off the walls, basically an infinite amount of balls.  Now I made a function to start deleting them to go back to having 0 circles bumping around.  I used a pointer to iterate through the chain of them (the chain was also used to see where each was and to move them slightly everytime before a new window was rendered).  Then the last one in the chain was set to be deleted.  This caused a seg fault, so i ended up just removing the item from the chain and ignoring it for the rest of its existence.  And that is how i deleted it. 

I recently created a Galaga-like game using a self-made bullets class containing a circle shape for each.  Now to stop that initial problem i put them into a deque (using push_front()).  Now same issue arrised when i tried to erase them from the deque as they exited the window.  Although its small, I do feel like there are an endless amount of bullets/balls floating around outside the window as i cannot delete them.  Is there a solution to this? or is RAII going to make it irrelevant

Thanks ahead of time
Title: Re: deleting a class made up of SFML images
Post by: Nexus on June 25, 2014, 10:46:38 pm
In general, don't handcraft solutions if the existing alternative (here the STL) does its job well. Use containers and iterators from the standard library. And yes, avoid new/delete and use RAII.

Furthermore, your problem description is very vague and not really related to SFML...
Title: Re: deleting a class made up of SFML images
Post by: codyjae on June 26, 2014, 09:58:05 pm
Thank you, and i apologize for the vagueness.

How, though, do you use RAII?  I have more or less made a small scale version of what i was hoping to do, and it gets laggy very fast with all the circles going around, even though only a few of them are actually relevant.  being able to kill off the ones not being used would be awesome, but i have no idea how.  I can attach my .cpp file (very simple to read as most of my code is in functions on .h).
 
int main(int argc, char* argv[])
{
        int enemycount;
        std::cout << "How many enemies?" << std::endl;
        std::cin >> enemycount;
        user player_user;
        sf::RenderWindow window(sf::VideoMode(800,600,10), "Shooter Jaynt");
        window.setVerticalSyncEnabled(true);
        window.setMouseCursorVisible(false);
        player_user.reloadtime = 1;
        player_user.alive = 1;
        std::vector <ai*> enemy; //contains all enemies (circles that shoot small circles)
        for(int i = 0; i < enemycount; i++)
        {
                ai* tmp;
                tmp = new ai(400,(rand() % 80));
                enemy.push_back(tmp);
        }
        while(window.isOpen())
        {      
                for(int i = 0; i < enemycount; i++)
                {
                        //this checks for collisions, causes a great deal of lag but i have no idea any other way of doing it
                        for(int p = 0; p < player_user.bullets_active.size(); p++)
                        {
                                if(player_user.bullets_active[p].bullet.getGlobalBounds().intersects(enemy[i]->player.getGlobalBounds())){
                                        enemy[i]->alive = 0;
                                        enemy[i]->player.move(700,-20);
                                        player_user.bullets_active[p].alive = 0;
                                        player_user.bullets_active[p].bullet.move(700,-20);
                                }
                        }


                        enemy[i]->reloadtimef();
                        enemy[i]->shoot_bullets(player_user);
                        enemy[i]->move_bullets();
                        enemy[i]->move_player();
                        enemy[i]->move_target(player_user);
                }

                player_user.reloadtimef();
                player_user.check_for_shoot();
                player_user.checkforexit(window);
                player_user.move_bullets(window);
                player_user.move_target_right(window);
                player_user.move_target_left(window);
                player_user.move_player_right(window);
                player_user.move_player_left(window);

                window.clear(sf::Color(10,10,10));
               
                //display enemy bullets
                for(int i = 0; i < enemycount; i++){
                        if(enemy[i]->alive == 1){
                        enemy[i]->displaybullets(window);
                        window.draw(enemy[i]->player);
                        }
                }
                player_user.displaybullets(window);

                window.draw(player_user.player);
                window.draw(player_user.target);
                window.display();

        }
        return 0;
}

I guess another thing, is there a smarter way of doing this?  Again new to SFML and this forum so feel free to yell at me if i post something overly ignorant

Thanks ahead of time

Title: Re: deleting a class made up of SFML images
Post by: Nexus on June 26, 2014, 11:16:31 pm
How, though, do you use RAII?
Maybe you should read about the general concept on Wikipedia (https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization) in order to fully understand it. I've also written an article (http://www.bromeon.ch/articles/raii.html) that reflects my personal opinion.

Concerning your code, you should replace std::vector<ai*> with std::vector<ai>. Then you could use iterators or the range-based for loop for iterations -- don't use indices. And why are you using numbers for the boolean variable alive? The literals true and false exist for good reasons.

To remove outdated elements, the erase-remove idiom (https://en.wikipedia.org/wiki/Erase-remove_idiom) comes in often handy.