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ć. #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: { 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: { 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: { 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; }
|
|
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. |
|
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 . |
|
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. :) |
|
« 1 » |