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

[SFML 2.0] Snake

Ostatnio zmodyfikowano 2013-04-20 11:16
Autor Wiadomość
Argor
Temat założony przez niniejszego użytkownika
[SFML 2.0] Snake
» 2013-04-20 10:21:51
Witam,
napisałem ostatnio taką prymitywną wersję gry "Snake" przy użyciu biblioteki SFML 2.0. I nie działa, po uruchomieniu wyświetla pierwszy segment i cel, nie wyświetla pozostałych segmentów i nie aktualizuje pozycji wszystkich części, pomimo, że ostatnio wciśnięty klawisz jest aktualizowany. Z tego wnioskuję, że nie działa fragment:
C/C++
for( n = parts - 1; n == 0; n-- )
{
    x[ n + 1 ] = x[ n ];
    y[ n + 1 ] = y[ n ];
}
Oraz:
C/C++
for( i = 2; i == parts; i++ )
{
    snake.setPosition( 50 * x[ i ], 50 * y[ i ] );
    renderWindow.draw( snake );
}
Cały kod:
C/C++
#include <SFML\Graphics.hpp>
#include <iostream>

int main()
{
    int x[ 50 ], y[ 50 ], parts, n, n2, i, d, celx, cely, k;
   
    std::cout << "Wybierz opoznienie: ";
    float TIME_STEP;
    std::cin >> TIME_STEP;
   
    parts = 3;
   
    celx = 3;
    cely = 9;
   
    k = 4;
   
    x[ 0 ] = 8;
    y[ 0 ] = 6;
    x[ 1 ] = 8;
    y[ 1 ] = 6;
    x[ 2 ] = 7;
    y[ 2 ] = 6;
    x[ 3 ] = 6;
    y[ 3 ] = 6;
   
    sf::RenderWindow renderWindow( sf::VideoMode( 800, 600, 32 ), "Snake 2.0" );
   
    sf::Texture texture1;
    texture1.loadFromFile( "snake.png" );
   
    sf::Sprite snake;
    snake.setTexture( texture1 );
   
    sf::Texture texture2;
    texture2.loadFromFile( "snakeh.png" );
   
    sf::Sprite snakeh;
    snakeh.setTexture( texture2 );
   
    sf::Texture texture3;
    texture3.loadFromFile( "cel.png" );
   
    sf::Sprite cel;
    cel.setTexture( texture3 );
   
    sf::Event windowEvent;
   
    sf::Clock loopClock;
   
    float accumulator = 0;
   
    while( renderWindow.isOpen() )
    {
        accumulator += loopClock.restart().asSeconds();
       
        while( renderWindow.pollEvent( windowEvent ) )
        {
            if( windowEvent.type == sf::Event::Closed )
            {
                renderWindow.close();
            }
           
            if( windowEvent.type == sf::Event::KeyPressed && windowEvent.key.code == sf::Keyboard::W )
            {
                k = 1;
            }
           
            if( windowEvent.type == sf::Event::KeyPressed && windowEvent.key.code == sf::Keyboard::S )
            {
                k = 2;
            }
           
            if( windowEvent.type == sf::Event::KeyPressed && windowEvent.key.code == sf::Keyboard::A )
            {
                k = 3;
            }
           
            if( windowEvent.type == sf::Event::KeyPressed && windowEvent.key.code == sf::Keyboard::D )
            {
                k = 4;
            }
           
            if( windowEvent.type == sf::Event::KeyPressed && windowEvent.key.code == sf::Keyboard::Escape )
            {
                renderWindow.close();
            }
        }
       
        if( accumulator > TIME_STEP )
        {
            if( k == 1 )
            {
                y[ 0 ] = y[ 1 ] - 1;
            }
           
            if( k == 2 )
            {
                y[ 0 ] = y[ 1 ] + 1;
            }
           
            if( k == 3 )
            {
                x[ 0 ] = x[ 1 ] - 1;
            }
           
            if( k == 4 )
            {
                x[ 0 ] = x[ 1 ] + 1;
            }
           
            if( x[ 0 ] == 16 )
            {
                x[ 0 ] = 0;
            }
           
            if( x[ 0 ] ==- 1 )
            {
                x[ 0 ] = 15;
            }
           
            if( y[ 0 ] == 12 )
            {
                y[ 0 ] = 0;
            }
           
            if( y[ 0 ] ==- 1 )
            {
                y[ 0 ] = 11;
            }
           
            for( i = 2; i == parts; i++ )
            {
                if( x[ 1 ] == x[ i ] && y[ 1 ] == y[ i ] )
                {
                    renderWindow.close();
                }
            }
           
            if( x[ 0 ] == celx && y[ 0 ] == cely )
            {
                parts++;
                celx = rand() % 16;
                cely = rand() % 12;
                for( n2 = 0; n2 == parts + 1; n2++ )
                {
                    if( celx == x[ n2 ] && cely == y[ n2 ] )
                    {
                        celx = rand() % 16;
                        cely = rand() % 12;
                        n2 = 0;
                    }
                }
            }
           
            for( n = parts - 1; n == 0; n-- )
            {
                x[ n + 1 ] = x[ n ];
                y[ n + 1 ] = y[ n ];
            }
           
            accumulator -= TIME_STEP;
        }
        renderWindow.clear( sf::Color( 0, 0, 0, 255 ) );
       
        snakeh.setPosition( 50 * x[ 1 ], 50 * y[ 1 ] );
        renderWindow.draw( snakeh );
       
        for( i = 2; i == parts; i++ )
        {
            snake.setPosition( 50 * x[ i ], 50 * y[ i ] );
            renderWindow.draw( snake );
        }
       
        cel.setPosition( 50 * celx, 50 * cely );
        renderWindow.draw( cel );
       
        renderWindow.display();
    }
}

[EDIT] Wybaczcie, że tutaj piszę, nie zauważyłem, że powstał dział poświęcony pisaniu gier 2D... Ale na tym forum użytkownik nie ma opcji przeniesienia swojego tematu do innego działu, więc już nic nie naprawię :/
P-80856
pekfos
» 2013-04-20 10:43:35
Zły warunek w pętli.

//edit: temat przeniesiony.
P-80860
Argor
Temat założony przez niniejszego użytkownika
» 2013-04-20 10:48:09
W której pętli? I na czym polega jego niewłaściwość?
Za przeniesienie tematu dziękuję :)
P-80861
pekfos
» 2013-04-20 10:55:36
W tych, które podałeś przed całym kodem. Zły operator.
P-80862
DejaVu
» 2013-04-20 11:08:36
To jest złe:
i == parts
P-80863
Argor
Temat założony przez niniejszego użytkownika
» 2013-04-20 11:16:06
:O Nie rozumiem, jakim sposobem mogłem tego nie zauważyć siedząc nad tym kodem od takiego czasu... Dzięki, już wszystko działa :)
P-80866
« 1 »
  Strona 1 z 1