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

[C++] Poruszający się ciągle obiekt

Ostatnio zmodyfikowano 2017-04-02 22:52
Autor Wiadomość
selveee
Temat założony przez niniejszego użytkownika
[C++] Poruszający się ciągle obiekt
» 2017-04-02 20:24:12
Dobry wieczór, otrzymałem jako "pracę domową" zrobienie lub też jak kto woli dokończenie gry (coś daleko pokrewne ze space wars) - dostałem także ograniczenie a raczej przykaz: Nie mogę wyrzucić switcha który sprawdza czy wciśnięta została strzałka w prawo, lewo lub spacja (sterowanie, spacja -> strzał). W innym projekcie o tej samej tematyce zrobiłem to nie korzystając ze switcha i nie był to zbytnio duży problem, na switchu niestety ale program czeka na wczytanie znaku z klawiatury i nie rysuje mi obiektu tak jak chcę.

Dokładniej chodzi o to, aby przy górnej krawędzi ramki tudzież pola do gry poruszał się obiekt powiedzmy "ooooo" i tak ciągle od lewej do prawej - zmianę kierunku już sobie opracuję, ale przy użyciu switcha niestety program narysuje obiekt "ooooo" i niestety ale czeka aż kliknę w klawiaturę, po wciśnięciu jednego z trzech ww. klawiszy element przesuwa się prawo, dopiero wtedy :/.

Próbowałem już wielu rzeczy, od wciskania w każde możliwe miejsca breaków, contiue, ifów i niestety z tym samym efektem :/. Jakieś pomysły jak można osiągnąć pożądany efekt?

Kodzik mało estetyczny ale jest już wymęczony :P, wiem - da się to napisać prościej, krócej ale takie mam ograniczenie i na tym muszę polegać.

C/C++
#include <iostream>
#include <conio.h>
#include "windows.h"

using namespace std;

void gotoxy( int x, int y )

{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
   
}


int main( int argc, char ** argv )
{
   
   
    int x = 3;
    int y = 3;
    int xp = 3;
    int kx = 1, ky = 1, kxp = 1;
    int punkty = 0;
    char aa, ee = 'q';
    int xpoc = 0, ypoc = 18, ppoc = 0;
    int xx = 35;
    aa = 218;
    gotoxy( 1, 1 );
    cout << aa;
    aa = 217;
    gotoxy( 70, 22 );
    cout << aa;
    aa = 191;
    gotoxy( 70, 1 );
    cout << aa;
    aa = 192;
    gotoxy( 1, 22 );
    cout << aa;
   
    aa = 196;
   
   
    for( int i = 2; i < 70; i++ )
    {
        gotoxy( i, 1 );
        cout << aa;
        gotoxy( i, 22 );
        cout << aa << endl;
    }
    aa = 179;
   
    for( int i = 2; i < 22; i++ )
    {
        gotoxy( 1, i );
        cout << aa;
        gotoxy( 70, i );
        cout << aa << endl;
    }
   
   
    gotoxy( xx, 20 );
    cout << "[  ] ";
    gotoxy( xx + 1, 19 );
    cout << "||";
   
   
   
    bool koniec = false;
    while( koniec == false )
    {
        gotoxy( x, y );
        cout << "ooooo";
        Sleep( 50 );
        gotoxy( x, y );
        cout << "ooooo";
        x++;
       
        char znak = _getch();
        switch( znak )
        {
        case 75: //strzalka w lewo
            {
                if( xx > 2 )
                {
                    gotoxy( xx, 20 );
                    cout << "[  ]";
                    gotoxy( xx + 1, 19 );
                    cout << "||";
                    xx = xx - 1;
                    gotoxy( xx + 1, 20 );
                    cout << "     ";
                    gotoxy( xx + 1, 19 );
                    cout << "   ";
                    gotoxy( xx, 20 );
                    cout << "[  ]";
                    gotoxy( xx + 1, 19 );
                    cout << "||";
                }
                else;
               
                znak = 0;
            }
            break;
        case 77: //strzalka w prawo
            {
                if( xx < 66 )
                {
                    gotoxy( xx, 20 );
                    cout << "[  ]";
                    gotoxy( xx + 1, 19 );
                    cout << "||";
                    xx = xx + 1;
                    gotoxy( xx - 1, 20 );
                    cout << "     ";
                    gotoxy( xx - 1, 19 );
                    cout << "   ";
                    gotoxy( xx, 20 );
                    cout << "[  ]";
                    gotoxy( xx + 1, 19 );
                    cout << "||";
                }
                else;
               
                znak = 0;
            }
            break;
        case 32: //SPACJA
            {
                ppoc = 1;
                while( ppoc == 1 )
                {
                    if( ppoc == 1 )
                    {
                        if( xpoc == 0 )
                             xpoc = xx;
                       
                        ypoc--;
                    }
                    if( ppoc == 1 )
                    {
                        gotoxy( xpoc + 1, ypoc );
                        cout << "O" << endl;
                    }
                    Sleep( 20 );
                    if( ppoc == 1 )
                    {
                        gotoxy( xpoc + 1, ypoc );
                        cout << " ";
                    }
                    if( ypoc == 2 )
                    {
                        gotoxy( xpoc, ypoc );
                        cout << "  ";
                        ppoc = 0;
                        xpoc = 0;
                        ypoc = 18;
                    }
                }
                znak = 0;
            }
            break;
           
        }
    }
    Sleep( 5000 );
    return 0;
   
}
P-159721
karambaHZP
» 2017-04-02 21:28:16
Odrysowywanie obiektu daj w jednym wątku, a sterowanie w drugim.
Elementem wspólnym obu wątków niech będzie
znak
 ,
czyli wątek sterowania zmienia
znak
, a wątek rysownia odczytuje i oblicza nowe miejsce do odrysowania obiektu.
P-159735
Bielan
» 2017-04-02 22:47:18

Odrysowywanie obiektu daj w jednym wątku, a sterowanie w drugim.

Nie ma aż takiej potrzeby. Wystarczy wykorzystać mechanizmy nieblokujące do odczyty znaków lub sprawdzania czy są jakieś dane do odczytania z buforu.

@selveee,
Poczytaj o
kbhit
.

P-159743
selveee
Temat założony przez niniejszego użytkownika
» 2017-04-02 22:52:24
@Bielan

Już problemik rozwiązany, nie wiem czemu post się nie dodał - oczywiście _kbhit() użyty + cały mechanizm sterowania wbity w pętlę while. :)
P-159744
« 1 »
  Strona 1 z 1