habe problem mit Referenzen!
-
hi swordfish,
ist es eigentlich schlimm wenn ich trotzdem "_setcursortype(...), gotoxy(), clrscr() ect." oder machst du das nur fuer dich immer so also ich will die progs eh nur auf windows laufen lassen. das mit dem iostream".h" war tipp fehler war gerade wo anders hast recht wieso muss ich auf einmal int main() schreiben und net wie sonst auch nur main() ??? und das mit den variablen ist des auch so doll von bedeutung wen ich da noch nen "_1" dran schreibe...??? thanx fuer deine hilfe ich hab diemal versucht mit referenzen und arrys zu arbeiten, ist mir das wenigstens etwas gelungen? und das mit dem keyboard hatte ich auch alles erst in einer funktion... hatte aber mal lust es in 2 zu packen xD ... THANXPS: noch eins nun kannsch meine pongs bewegen *freu* aber die begrenzung funktioniert so nicht hmmm.... was is daran falsch?
-
die funktion braucht doch wohl nen rückgabetyp..
-
wie stell ich es an wenn ich zwei tasten gleich zeitig druecke bzw. wenn player1 Q drueckt und dann dreuckt haelt um nach oben zu scrollen aber player2 dann L drueckt weil er nach unten will.... wie stell ich es an das dann beide keys gleichzeitig ausgewertet werden? ohne das der balken von plazer1 stehen bleibt?
-
T0bi schrieb:
ist es eigentlich schlimm wenn ich trotzdem "_setcursortype(...), gotoxy(), clrscr() ect." oder machst du das nur fuer dich immer so [...]
Wenn dein Compilerhersteller (vermute du verwendest einen Borländer!?) diese Funktionen (in der <conio.h>!?) mitliefert ist's schon OK. Aber bei mein Visual Studio gibt's die nicht. Deshalb hab' ich sie zum Testen selbst mit der WinAPI geschrieben.
T0bi schrieb:
[...] also ich will die progs eh nur auf windows laufen lassen.
*lol* ...unter UNIX, Linux, MacOS etc. wird das sowieso nicht laufen.
T0bi schrieb:
wieso muss ich auf einmal int main() schreiben und net wie sonst auch nur main() ???
Was heißt hier auf einmal!?
Guckst du:ISO/IEC 14882:1998 - Programming Languages - C++ schrieb:
3.6 Start and termination
3.6.1 Main function
[...]
2 An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of int, but otherwise it's type is implementation-defined. All implementations shall allow both of the following definitions of main:
int main( ) { /* ... */ }
and
int main( int argc, char* argv[ ] ) { /* ... */ }
[...]
T0bi schrieb:
und das mit den variablen ist des auch so doll von bedeutung wen ich da noch nen "_1" dran schreibe...???
Ne, nur unnütze Schreibarbeit.
T0bi schrieb:
ich hab diemal versucht mit referenzen und arrys zu arbeiten, ist mir das wenigstens etwas gelungen?
Scheint als hättest du den Umgang mit Referenzen Kappiert. Wenn ich mir dann aber:
void balken1(int pos_y_1) { const char Balken1[6][1] = { { 32},{ 219},{ 219},{ 219},{ 219},{ 32} }; for(int y=0;y<5;y++) { for(int x=0;x<1;x++) { gotoxy(x + 2,pos_y_1+ y); putchar( Balken1[y][x] ); } } }
ansehe, weiß ich, dass du das Kapitel über Arrays in einem C/C++ Wälzer deiner Wahl nocheinmal gründlich durchackern solltest.
T0bi schrieb:
und das mit dem keyboard hatte ich auch alles erst in einer funktion... hatte aber mal lust es in 2 zu packen xD
Glaub' ich nicht wirklich.
T0bi schrieb:
wie stell ich es an wenn ich zwei tasten gleich zeitig druecke bzw. wenn player1 Q drueckt und dann dreuckt haelt um nach oben zu scrollen aber player2 dann L drueckt weil er nach unten will.... wie stell ich es an das dann beide keys gleichzeitig ausgewertet werden? ohne das der balken von plazer1 stehen bleibt?
Wie wär's mit:
#include <cstdio> #include <conio.h> #include <windows.h> using namespace std; void balken( const int *pos ); bool keyboard( int *pos ); void show_cursor( bool show ); void gotoxy( int x, int y ); void clrscr( ); void draw_field( int left, int top, int right, int bottom ); void set_console_size( short x, short y ); int main( ) { bool play = true; int pos[ ] = { 10, 10 }; set_console_size( 80, 25 ); show_cursor( false ); draw_field( 0, 0, 78, 24 ); do { balken( pos ); play = keyboard( pos ); Sleep( 25 ); } while( play ); } void balken( const int* pos ) { const char face[ 6 ] = { 32, 219, 219, 219, 219, 32 }; for(int y = 0; y < 6; y++ ) { if( !( ( y == 5 ) && ( pos[ 0 ] == 19 ) ) && !( ( y == 0 ) && ( pos[ 0 ] == 0 ) ) ) { gotoxy( 2, pos[ 0 ] + y ); putchar( face[ y ] ); } if( !( ( y == 5 ) && ( pos[ 1 ] == 19 ) ) && !( ( y == 0 ) && ( pos[ 1 ] == 0 ) ) ) { gotoxy( 76, pos[ 1 ] + y ); putchar( face[ y ] ); } } } bool keyboard( int *pos ) { bool state[ 256 ]; for( int i = 0; i < 256; i++ ) state[ i ] = GetAsyncKeyState( i ) & 0xFFFF; if( state[ 'Q' ] && ( pos[ 0 ] > 0 ) ) --pos[ 0 ]; if( state[ 'A' ] && ( pos[ 0 ] < 19 ) ) ++pos[ 0 ]; if( state[ 'O' ] && ( pos[ 1 ] > 0 ) ) --pos[ 1 ]; if( state[ 'L' ] && ( pos[ 1 ] < 19 ) ) ++pos[ 1 ]; if( state[ 'P' ] ) { gotoxy( 34, 12 ); printf( "[ P A U S E ]" ); while( getch( ) != 0x0D ); gotoxy( 34, 12 ); printf( " " ); } if( state[ VK_ESCAPE ] ) return false; return true; } void draw_field( int left, int top, int right, int bottom ) { for(int y = top; y <= bottom; y++ ) { gotoxy( left, y ); putchar( 186 ); gotoxy( right, y ); putchar( 186 ); } for(int x = left; x <= right; x++ ) { gotoxy( x, top ); putchar( 205 ); gotoxy( x, bottom ); putchar( 205 ); } gotoxy( left, top ); putchar( 201 ); gotoxy( left, bottom ); putchar( 200 ); gotoxy( right, top ); putchar( 187 ); gotoxy( right, bottom ); putchar( 188 ); } void show_cursor( bool show ) { static CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo( GetStdHandle( STD_OUTPUT_HANDLE ), &cci ); cci.bVisible = show; SetConsoleCursorInfo( GetStdHandle( STD_OUTPUT_HANDLE ), &cci ); }; void gotoxy( int x, int y ) { COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), pos ); } void clrscr( ) { void *con_out = GetStdHandle( STD_OUTPUT_HANDLE ); CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo( con_out, &csbi ); COORD pos; memset( &pos, 0, sizeof( COORD ) ); unsigned long chars_written; FillConsoleOutputCharacter( con_out, ' ', csbi.dwSize.X * csbi.dwSize.Y, pos, &chars_written ); SetConsoleCursorPosition( con_out, pos ); } void set_console_size( short x, short y ) { void *cons_out = GetStdHandle( STD_OUTPUT_HANDLE ); COORD max_size = GetLargestConsoleWindowSize( cons_out ); SMALL_RECT size; size.Top = 1; size.Left = 1; size.Right = 1; size.Bottom = 1; SetConsoleWindowInfo( cons_out, 1, &size ); COORD buffer_size; buffer_size.X = 1; buffer_size.Y = 1; SetConsoleScreenBufferSize( cons_out, buffer_size ); buffer_size.X = min( x, max_size.X ); buffer_size.Y = min( y, max_size.Y ); SetConsoleScreenBufferSize( cons_out, buffer_size ); memset( &size, 0, sizeof( SMALL_RECT ) ); size.Right = min( x, max_size.X ) - 1; size.Bottom = min( y, max_size.Y ) - 1; SetConsoleWindowInfo( cons_out, 1, &size ); }
T0bi schrieb:
noch eins nun kannsch meine pongs bewegen *freu* aber die begrenzung funktioniert so nicht hmmm.... was is daran falsch?
Welche Begrenzung meinst du denn?!?
Geheimtipp: deine pos_1_x und pos_2_x Beschreiben das obere Ende deiner Schläger...eloc schrieb:
die funktion braucht doch wohl nen rückgabetyp..
Aha. Wie meinen?
Greetz, Swordfish
BTW: Wie geht's deinem "Racing-Game" oder hast du aufgegeben?
-
Hi SwordFish, wie solls meinen Racing game gehen xD, da du mir ja gleich den kompletten Quelltext geschrieben hast hab ich nen paar funktionen so um geschriben wie bei dir und noch nen bissel geguckt was das so macht und dann gings. hm hab das nun alles nen bissel verbessert bei meinem pong hier, nun binsch wieder auf ein hinderniss gestossen, ich will die ball richtung bestimmen und aendern( auch per referezen, hmpf ja nun klappt des aber net so wie ichs wollte wenn Sie mal schauen moechten gg:
#include <iostream> #include <conio.h> #include <windows.h> #include <stdio.h> using namespace std; int balken1(int pos_y_1); int balken2(int pos_y_2); int ball(int posX, int posY); bool ball_richtung(int &X, int &Y, int &p_X, int &p_Y); void Spielfeld(int left, int top, int right,int bottom); bool Keyboard(int &pos_y1,int &pos_y2); int main() { SetConsoleTitle(" Retr0 P. O. N. G."); system("mode con COLS=80 LINES=25"); _setcursortype(_NOCURSOR); Spielfeld(14,4,67,22); int pos_y_1(11); int pos_y_2(11); int posX(17), posY(12); bool play = true; while(play) { balken1(pos_y_1); balken2(pos_y_2); ball(posX, posY); play = ball_richtung(posX, posY, pos_y_1, pos_y_2); play = Keyboard(pos_y_1, pos_y_2); Sleep(20); } return 0; } void Spielfeld(int left, int top, int right, int bottom) { for(int y = top; y<=bottom;y++) { gotoxy(left, y); putchar(219); gotoxy(right,y); putchar(219); } for(int x = left; x<=right;x++) { gotoxy(x, top); putchar(219); gotoxy(x, bottom); putchar(219); } gotoxy(left, top); putchar(219); gotoxy(left, bottom); putchar(219); gotoxy(right, top); putchar(219); gotoxy(right, bottom); putchar(219); } int balken1(int pos_y_1) { const char Balken1[7] = { 32, 219, 219, 219, 219, 219, 32}; for(int y=0;y<7;y++) { if( !( ( pos_y_1 == 5 ) && ( y == 0 ) ) && !( ( pos_y_1 == 17 ) && ( y == 6 ) ) ) { gotoxy(16,pos_y_1 + y - 1); putchar( Balken1[y] ); } } return 1; } int balken2(int pos_y_2) { const char Balken2[7] = { 32, 219, 219, 219, 219, 219, 32}; for(int y=0;y<7;y++) { if( !( ( pos_y_2 == 5 ) && ( y == 0 ) ) && !( ( pos_y_2 == 17 ) && ( y == 6 ) ) ) { gotoxy(65,pos_y_2 + y - 1); putchar( Balken2[y] ); } } return 2; } int ball(int posX, int posY) { const char Ball[3][3] = { { 32 , 32 , 32 }, { 32 , 15, 32 }, { 32 , 32 , 32 } }; for(int y=0;y<3;y++) { for(int x=0;x<3;x++) { if( !( ( posX == 17 ) && ( x == 0 ) ) && !( ( posX == 64 ) && ( x == 2 ) ) ) { if( !(( posY == 4 ) && ( y == 0)) && !(( posY == 20) && ( y == 2)) ) { gotoxy(posX + x - 1, posY + y); putchar( Ball[x][y]); } } } } return 3; } bool Keyboard(int &pos_y1, int &pos_y2) { int key; if(kbhit()) { key = getch(); } switch(key) { case 'Q': case 'q': if(pos_y1 > 5) pos_y1--; break; case 'A': case 'a': if(pos_y1 < 17) pos_y1++; break; case 'O': case 'o': if(pos_y2 > 5) pos_y2--; break; case 'L': case 'l': if(pos_y2 < 17) pos_y2++; break; case 'P': case 'p': gotoxy( 38, 12 ); printf( "PAUSE" ); do key = getch( ); while( key != 'p' && key != 'P' ); gotoxy( 38, 12 ); printf( " " ); break; case 27: return false; } return true; } bool ball_richtung(int &X, int &Y, int &p_X, int &p_Y) { if( (X <= 16) && (Y == p_Y) ) { X++; } return true; }
soweit klappt alles nur dachte ich eigentlich das der ball nun gerade aus "fliegen" muesste tut er aber nicht.... wie kann ichs anstellen???THANX!
PS.: wo genau in deinem code ist nun das eingebaut was ich in meinen qulltext brauche das man die schläger gleichzeitig bewegen kann, wär cool wenn du mir das mal zeigen koenntest, weil ich habe irgendwo hier im forum gelesen das man ne low-level console bla bla brauch und damit komm ich nun mal gar nicht klar... also waer nett wenn dus mir erklärst wies geht
-
#include <iostream> #include <conio.h> #include <windows.h> // #include <stdio.h> // die heißt in C++ #include <cstdio> using namespace std; /* int balken1(int pos_y_1); int balken2(int pos_y_2); */ void balken( int pos_y1, int pos_y2 ); int ball( int &posX, int &posY ); /* bool ball_richtung(int &X, int &Y, int &p_X, int &p_Y); */ void bewege_ball( int &posX, int &posY ); void Spielfeld(int left, int top, int right,int bottom); bool Keyboard( int &pos_y1, int &pos_y2 ); bool hittest( int posX, int posY, int pos_y1, int pos_y2 ); void gotoxy( int x, int y ) { COORD pos; pos.X = x - 1; pos.Y = y - 1; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), pos ); } int main() { SetConsoleTitle(" Retr0 P. O. N. G."); system("mode con COLS=80 LINES=25"); // _setcursortype(_NOCURSOR); Spielfeld( 14, 4, 67, 22 ); /* int pos_y_1(11); int pos_y_2(11); int posX(17), posY(12); Ich sag's dir jetzt zum 3. (in Worten: dritten) Mal, bei simplen Variablen macht man das so nicht! */ int pos_y1 = 11; int pos_y2 = 11; int posX = 17; int posY = 12; bool play = true; // while( play ) auf eine do-while() Schleife willst du dich // anscheinend immer noch nicht einlassen - obwohl // es für diesen Kontext das einzig logische ist. balken( pos_y1, pos_y2 ); do { /* play = ball_richtung( posX, posY, pos_y1, pos_y2 ); // <- Zuweisung an play bringt in Bezug auf play = Keyboard(pos_y1, pos_y2); // <- diese Zuweisung was? */ play = Keyboard( pos_y1, pos_y2 ); ball( posX, posY ); balken( pos_y1, pos_y2 ); play = hittest( posX, posY, pos_y1, pos_y2 ); Sleep( 50 ); } while( play ); } void Spielfeld(int left, int top, int right, int bottom) { for(int y = top; y<=bottom;y++) { gotoxy(left, y); putchar(219); gotoxy(right,y); putchar(219); } for(int x = left; x<=right;x++) { gotoxy(x, top); putchar(219); gotoxy(x, bottom); putchar(219); } gotoxy(left, top); putchar(219); gotoxy(left, bottom); putchar(219); gotoxy(right, top); putchar(219); gotoxy(right, bottom); putchar(219); } /* int balken1(int pos_y_1) { ... } int balken2(int pos_y_2) { } Wieso ein return-Typ von int? Eine funktion tut's auch (und schneller): */ void balken( int pos_y1, int pos_y2 ) { const char face[ ] = { 32, 219, 219, 219, 219, 219, 32}; for(int y=0;y<7;y++) { if( !( ( pos_y1 == 5 ) && ( y == 0 ) ) && !( ( pos_y1 == 17 ) && ( y == 6 ) ) ) { gotoxy( 16, pos_y1 + y - 1 ); putchar( face[ y ] ); } if( !( ( pos_y2 == 5 ) && ( y == 0 ) ) && !( ( pos_y2 == 17 ) && ( y == 6 ) ) ) { gotoxy( 65, pos_y2 + y - 1 ); putchar( face[ y ] ); } } } /* int ball( int &posX, int &posY ) wofür einen Integer zurückgeben??? */ int ball( int &posX, int &posY ) { /* const char Ball[3][3] = { { 32, 32, 32 }, { 32, 15, 32 }, { 32, 32, 32 } }; for( int y = -1; y < 2; ++y ) { for( int x = -1; x < 2; ++x ) { /* if( !( ( posX == 17 ) && ( x == 0 ) ) && !( ( posX == 64 ) && ( x == 2 ) ) ) { if( !(( posY == 4 ) && ( y == 0)) && !(( posY == 20) && ( y == 2)) ) { schöner: if( !( ( posX == 17 ) && ( x == 0 ) ) && !( ( posX == 64 ) && ( x == 2 ) ) && !( ( posY == 4 ) && ( y == 0 ) ) && !( ( posY == 20 ) && ( y == 2 ) ) ) { gotoxy( posX + x, posY + y ); putchar( Ball[ x + 1 ][ y + 1 ] ); } } } aber viiieeel einfacher: */ gotoxy( posX, posY ); putchar( ' ' ); bewege_ball( posX, posY ); gotoxy( posX, posY ); putchar( 'X' ); /* return 3; wofür?? */ } bool Keyboard(int &pos_y1, int &pos_y2) { /* Moment mal, ich hab' dir aber schon verraten, dass es mit kbhit() und getch() nicht's mit zwei Schlägern wird!? int key; if( kbhit( ) ) { key = getch(); } <------------- und wo ist key initialisiert, wenn !kbhit( ) ? | +-------------------+ | switch( key ) { ... } return true; hier ist die Tastaturabfrage, nach der du gefragt hast: */ bool state[ 256 ]; for( int i = 0; i < 256; i++ ) state[ i ] = ( GetAsyncKeyState( i ) & 0xFFFF ) != 0; if( state[ 'Q' ] && ( pos_y1 > 5 ) ) --pos_y1; if( state[ 'A' ] && ( pos_y1 < 17 ) ) ++pos_y1; if( state[ 'O' ] && ( pos_y2 > 5 ) ) --pos_y2; if( state[ 'L' ] && ( pos_y2 < 17 ) ) ++pos_y2; if( state[ 'P' ] ) { gotoxy( 34, 12 ); printf( "[ P A U S E ]" ); while( getch( ) != 0x0D ); gotoxy( 34, 12 ); printf( " " ); } if( state[ VK_ESCAPE ] ) return false; return true; } /* bool ball_richtung(int &X, int &Y, int &p_X, int &p_Y) { if( (X <= 16) && (Y == p_Y) ) X++; return true; } magst du mir kurz verraten, wie dieses Ding arbeitet / arbeiten soll? */ void bewege_ball( int &posX, int &posY ) { static dx = 1; static dy = 1; if( ( dx == 1 ) && ( posX < 64 ) ) { ++posX; } else if( dx == 1 ) { dx = -1; } if( ( dx == -1 ) && posX > 17 ) { --posX; } else if( dx == -1 ) { ++posX; dx = 1; } if( ( dy == 1 ) && ( posY < 21 ) ) { ++posY; } else if( dy == 1 ) { dy = -1; } if( ( dy == -1 ) && posY > 5 ) { --posY; } else if( dy == -1 ) { ++posY; dy = 1; } } bool hittest( int posX, int posY, int pos_y1, int pos_y2 ) { if( posX == 17 ) { if( ( posY < pos_y1 ) && ( ( pos_y1 + 6 ) < posY ) ) { return false; } } if( posX == 64 ) { if( ( posY < pos_y2 ) || ( ( pos_y2 + 6 ) < posY ) ) { return false; } } return true; }
Könntest du bitte die in meinen Kommentaren gestellten Fragen u. Anmerkungen in deinem nächsten Post behandeln?
Greetz, Swordfish
-
hi swordfish,
hmmm ic hhab gerade ueberhaupt keine ahnung, ok die hatte ich glaube ich noch nie... aber mit ball_richtung, wollte ich die ball pos mit den schläger pos vergleichen und je nach dem wo der ball auf den schlaeger trifft in welche richtung er sich dann bewegen soll, mit return weiss ich nicht wie man das macht, ich weiss nur das ich immer ne warnung bekomme das die funktion was zurückgeben soll also hab ich einfach reurn 1 genommen, und das mit der keyboard abfrage ist schoen und gut das dus mir noch mal hin gepostet hast aber was die macht weiß ich immer noch nicht, hab ich jetzt noch was vergessen?
-
T0bi schrieb:
hmmm ic hhab gerade ueberhaupt keine ahnung, ok die hatte ich glaube ich noch nie...
Du brauchst jetzt aber nicht anfangen dich runter zu machen. Wir haben alle einmal angefangen.
T0bi schrieb:
aber mit ball_richtung, wollte ich die ball pos mit den schläger pos vergleichen und je nach dem wo der ball auf den schlaeger trifft in welche richtung er sich dann bewegen soll
Ich fürchte das ist zu komplex. Da müsstest du außer den Positionen auch noch die Geschwindigkeit des Balles und des bewegten Schlägers berücksichtigen. Ich denke das lohnt sich ohne Grafischer oberfläche nicht. Wäre es ein Kompromiss, den Ball von Wänden und vom Schläger in einem 90°-Winkel abprallen zu lassen?
T0bi schrieb:
mit return weiss ich nicht wie man das macht
Dein größtes Manko ist wohl, dass du dich immer so "schwammig" ausdrückst. Du weißt nicht, wi man was mit return macht?
T0bi schrieb:
ich weiss nur das ich immer ne warnung bekomme das die funktion was zurückgeben soll also hab ich einfach reurn 1 genommen
Hast du eine Funktion, die einen anderen Rückgabetyp als void hat, muss sie etwas zurückgeben. Das machst du mit return.
zB:int main( ) { // sollte das return 0; // nicht dastehen, so bekommst du in diesem Falle aber keinen Error / Warnung, // weil im C++ Standard definiert ist, dass int main( ) } // <== hier 0 (Null) zurückliefert, wenn das return 0; davor fehlen würde. // Hier jedoch int foo( ) { return 42; // _muss_ die Funktion etwas zurückgeben. } // willst du jedoch nichts zurückgeben, so änderst du int foo( ) in void foo( ) { }
Kannst du das nachvollziehen?
T0bi schrieb:
und das mit der keyboard abfrage ist schoen und gut das dus mir noch mal hin gepostet hast aber was die macht weiß ich immer noch nicht
Ich geh's mal Step-by-Step mit dir durch:
Swordfish schrieb:
// wir definieren eine Funktion Keyboard // mit den Parametern // // "Referenz auf int" pos_y1 // // und // // "Referenz auf int" pos_y2 // // welche einen boolean zurückliefert. // // Wird die Taste ESC (VK_ESCAPE) gedrückt, // so liefert Keyboard false, ansonsten true. // bool Keyboard( int &pos_y1, int &pos_y2 ) { // Wir definieren ein Array aus 256 bools "state": bool state[ 256 ]; // in diesem Array speichern wir den Zustand aller Tasten - // und zwar ob gedrückt ( = true ) oder nicht ( = false ) for( int i = 0; i < 256; i++ ) { // short GetAsyncKeyState( int virtual_key_code ); *1) // // liefert den Status der mit virtual_key_code bezeichneten // Taste zurück. MSDN: // If the function succeeds, the return value specifies // whether the key was pressed since the last call to // GetAsyncKeyState, and whether the key is currently // up or down. If the most significant bit is set, the key // is down, and if the least significant bit is set, the key // was pressed after the previous call to GetAsyncKeyState. // However, you should not rely on this last behavior; // Das ist uns jedoch egal. Wir gehen davon aus, das die Taste // gedrückt ist, wenn irgendein Bit der niedrigeren 2 Bytes des // zurückgegebenen shorts gesetzt sind. // Beispiel: // 0000 0000 1000 0001 : Das Ergebnis von GetAsyncKeyState verknüpfen wir // & 0000 0000 1111 1111 : mit einem logischen und mit einem Wert, dessen Bits // --------------------- : der nidrigeren 2 Bytes alle gesetzt sind, und wir // 0000 0000 1000 0001 : <- bekommen. Wenn wir dieses Ergebnis auf die // : ungleichheit gegen 0 Prüfen, bekommen wir bei // 0000 0000 1000 0001 != 0 : true bei gedrückter und false bei nicht gedrückter // : Taste. Dies machen wir jetzt für alle 256 virtual // : Key-Codes *2). state[ i ] = ( GetAsyncKeyState( i ) & 0xFFFF ) != 0; } // an stelle 'Q' ( = 81 ) des Arrays state finden wir den Status der Taste Q. // wenn state[ 'Q' ] true und pos_y1 > 5 ist, können wir pos_y1 dekrementieren. if( state[ 'Q' ] && ( pos_y1 > 5 ) ) --pos_y1; // analog: if( state[ 'A' ] && ( pos_y1 < 17 ) ) ++pos_y1; // analog: if( state[ 'O' ] && ( pos_y2 > 5 ) ) --pos_y2; // analog: if( state[ 'L' ] && ( pos_y2 < 17 ) ) ++pos_y2; // analog: if( state[ 'P' ] ) { gotoxy( 34, 12 ); printf( "[ P A U S E ]" ); while( getch( ) != 0x0D ); gotoxy( 34, 12 ); printf( " " ); } // Hier sezten wir statt eines Characters eine Konstante ein: if( state[ VK_ESCAPE ] ) return false; // Bei gedrückter Escape-Taste geben wir false rurück, return true; // ansonst true. }
*1)
GetAsyncKeyState( )
*2)Virtual Key Codes
Ich hoffe das war ausführlich genug. gib Feedback!
T0bi schrieb:
hab ich jetzt noch was vergessen?
Ja:
Swordfish schrieb:
Könntest du bitte die in meinen Kommentaren gestellten Fragen u. Anmerkungen in deinem nächsten Post behandeln?
Greetz, Swordfish
-
hi swordfish, also am besten ich fang noch mal ganz von vorne an....
-eine referenz kann mit ner variable belegt werden... das macht man um mit dieser referenz eine definierte variable zu aendern, also zum bsp. ich habe meine ypos des schlägers die ist 10 nun kann ich eine referenz auf diese variable packen um diesen wert in einer funktion zu aendern, richtig?-eine int funktion verwende ich dann wenn ich zB werte geaendert habe und die durch return zurück geben moechte, andern falls wenn ich den geaenderten wert nicht zurueck geben will sondern mit dem weiter rumhandtieren moechte also posY soll weiter veraendert werden, benutze ich void. und wenn ich auf ereignisse warte also zB bis etwas nicht so ist wie es sein soll, also ball geht ins aus... benutze ich boolsche ausdruecke(true,flase[1,0])
-das mit der keyboard abfrage, hab ich noch nicht ganz gecheckt glaube ich, also du legst ein array an in dem du 256tasten druecke speichern kannst, oder wie, heisst das den nicht das nach dem 256 tastendruck sense ist?
soweit erst mal zu deinen fragen, und nenfeedback fuer deine beschreibung.... jo ich muss sagen ist wirklich gelungen ich habs noch nicht ganz kappiert da ich mich mit GetAsyncKeyState und virtual_key_code noch nicht beschaeftigt habe werd ich dann aber gleich tuen. solltest lehrer werden oO wenn dus net schon bist *g*.
also ich werde jetzt erst mal noch nen bissel weter dran rum basteln an pong und werd mich dann noch mal melden und du kannst ja dann mal schauen obs ok ist...
vieleicht noch ein anderes anliegen. wenn dus gestattest wuerde ich dir gern nen anderes prog an deine main senden bei dem ich hilfe brauche, ich weiss man sollte erst mal eins fertig machen eh man mit dem naechsten beginnt aber damals wollte mir hier ja nie wirklich wer helfen deshalb hatte ich es in den hintergrund gestellt, hmpf.....
trotzdem erst mal nen DANKE
!!!
-
T0bi schrieb:
- eine Referenz kann mit einer Variable belegt werden. Das macht man um mit dieser referenz eine definierte variable zu ändern, also zB meine pos_y1 des schlägers die ist 10 nun kann ich eine Referenz auf diese variable packen um diesen Wert in einer funktion zu aendern, richtig?
nicht notwendigerweise um den Wert in einer Funktion zu ändern, aber ja, um ihn zu ändern:
#include <iostream> using namespace std; void call_by_value ( int x ) { x = 42; cout << " in call_by_value: x = " << x << endl; } void call_by_reference ( int &x ) { x = 42; cout << " in call_by_reference: x = " << x << endl; } void call_by_reference_pointer ( int *x ) { *x = 42; cout << " in call_by_reference_pointer: *x = " << *x << endl; } int main( ) { int var = 1; cout << "before call_by_value: var = " << var << endl; call_by_value( var ); cout << " after call_by_value: var = " << var << endl << endl; var = 1; cout << "before call_by_reference: var = " << var << endl; call_by_reference( var ); cout << " after call_by_reference: var = " << var << endl << endl; var = 1; cout << "before call_by_reference_pointer: var = " << var << endl; call_by_reference_pointer( &var ); cout << " after call_by_reference_pointer: var = " << var << endl << endl; }
T0bi schrieb:
- Eine int-Funktion verwende ich dann wenn ich zB Werte geändert habe und die durch return zurück geben möchte **1), andernfalls, wenn ich den geänderten Wert nicht zurück geben will sondern mit ihm weiter rumhandtieren möchte [...] benutze ich void **2). Wenn ich auf Ereignisse warte. also zB bis etwas nicht so ist wie es sein soll, also zB ball geht ins aus, benutze ich boolsche Ausdrücke *3) ( true, flase [ 1, 0 ] ).
- Du kannst mit return nur einen Wert eines fundamentalen Typs pro Funktion zurückgeben.
- Denk' nicht so kompliziert. Soll deine Funktion keinen Wert zurückgeben, so sieht sie schlichtweg so aus:
void funktionsname( [ parametertyp parametername [,...] ] ) { }
- Du Verwendest bool'sche Ausdrücke immer dann, wenn es gilt, Bedingungen zu prüfen.
T0bi schrieb:
- Das mit der Keyboardabfrage hab ich noch nicht ganz gecheckt glaube ich. Also du legst ein Array an in dem du 256 Tastendrücke speichern kannst, oder wie? Heisst das den nicht das nach dem 256. Tastendruck sense ist?
Ja, ich lege ein Array für 256 Werte an. Aber nicht einen pro Tastendruck sondern einen pro Taste. Wunder dich bitte nicht, warum du auf deiner Tastatur keine 256 Tasten hast... Windows kennt zB die linke Maustaste auch als Virtual Key, nämlich VK_LBUTTON. Mit:
bool state[ 256 ]; for( int i = 0; i < 256; i++ ) { state[ i ] = ( GetAsyncKeyState( i ) & 0xFFFF ) != 0; // ^ ^ // frage ich | hier jeden der 256 möglichen Tasten ab // und konvertiere den Rückgabewert von GetAsyncKeyState( i ) // nach bool. Führ näheres schaust du bitte in die MSDN. // Ein Link dazu findet sich in meinem letzten Post. }
T0bi schrieb:
solltest lehrer werden oO wenn dus net schon bist *g*.
Ne, nie im Leben.
T0bi schrieb:
also ich werde jetzt erst mal noch nen bissel weter dran rum basteln an pong und werd mich dann noch mal melden und du kannst ja dann mal schauen obs ok ist...
Ok.
T0bi schrieb:
vieleicht noch ein anderes anliegen. wenn dus gestattest wuerde ich dir gern nen anderes prog an deine main senden bei dem ich hilfe brauche [...]
Hast denn meine E-Mail Adresse?
Greetz, Swordfish
-
hi swordfish, jetzt hab ichs kapiert mit den keyboard hehe
nur so ne frage was hast du dann fuer ein beruf IT-Master *g*, ne scherz. also ich habe deine eMail net waer nett wenn du sie mir gibst, thx.
und vieleicht noch was gibts irgendwo nen patch wo ich mein boarland builder 6 auf deutsch patchen kann? also die fehlermeldungen, oder gibts auch die komplette MSDN auf deutch?????
-
T0bi schrieb:
hi swordfish, jetzt hab ichs kapiert mit den keyboard hehe
nur so ne frage was hast du dann fuer ein beruf IT-Master
ja, swordfish gehört schon zu den absoluten krachern hier
-
oO kann man wohl so sagen... wann habt ihr eigentlich so angefangen mit programmieren???
-
T0bi schrieb:
oO kann man wohl so sagen... wann habt ihr eigentlich so angefangen mit programmieren???
uff, lange her. ich bin jetzt 30... vor 12 jahren etwa
-
also mit 18 hm oki ich bin och bald 18 *freu*, wie lange hats den so im schnitt gedauert bis man sich in c++ eingearbeitet hat?
-
T0bi schrieb:
nur so ne frage was hast du dann fuer ein beruf IT-Master *g*, ne scherz.
Ne, im moment warte ich auf den Zivildienst (Österreich)
net schrieb:
T0bi schrieb:
hi swordfish, jetzt hab ichs kapiert mit den keyboard hehe
nur so ne frage was hast du dann fuer ein beruf IT-Master
ja, swordfish gehört schon zu den absoluten krachern hier
Danke für die Blumen.
T0bi schrieb:
und vieleicht noch was gibts irgendwo nen patch wo ich mein boarland builder 6 auf deutsch patchen kann? also die fehlermeldungen
Da bemüh' doch entweder Google oder ein anderes Forum.
Tobi schrieb:
oder gibts auch die komplette MSDN auf deutch?????
Bei meinem Microsoft Visual Studio 2003 .net hab' ich ein Paar deutsche Einträge in meiner lokal installierten MSDN. Wo man die im www findet weiß ich leider nicht.
T0bi schrieb:
wann habt ihr eigentlich so angefangen mit programmieren???
Mit 11 Jahren, bin jetzt 20.
T0bi schrieb:
wie lange hats den so im schnitt gedauert bis man sich in c++ eingearbeitet hat?
Na ja, ich hab zu meinen Anfängerzeiten viel Zeit mit QBasic vergeudet. Das war damals auf einem Intel 80386 SX, 16 MB RAM, 500 MB HDD. Leider hatte ich nur DOS und Windows 3.1 zur verfügung, da ich damals noch nix von Linux wusste. Irgendwann mit 14 oder 15 Jahren hab' ich mit die Borland C/C++ IDE in der Version 3.1 (!!!) geholt und wurde Glücklich.
T0bi schrieb:
wie lange hats den so im schnitt gedauert bis man sich in c++ eingearbeitet hat?
Was verstehst du unter "Einarbeitung"? Der Lernfortschritt ist natürlich für jeden anders, hängt von der vorhandenen Zeit ab und davon, wie sehr man sich bemüht. Ich weiß daß ich, was C++ bis jetzt nur ein bisschen mehr als an der Oberfläche gekratzt habe.
Greetz, Swordfish
PS: reiter.e AT gmx.net
-
hm.. oki so werd dir dann mal mein anderes prog per mail geben und das "fertige" pong.