Problem mit "Spiel" in Console (getch() und system("cls"))
-
Hallo!
Ich habe mir für die Console Tetris programmiert. Das Spielfeld wird dabei von einem 10 x 20 char-array gebildet. Allerdings habe ich 2 Probleme:1. Bei jedem "Frame", also nach jeder Aktion im Spielfeld, wird die Console über system("cls") gecleart und das spielfeld neu ausgegeben. Allerdings bewirkt dies ein unschönes "Flackern". Mir ist klar, dass system-Befehle vermieden werden sollten. Daher habe ich mir die clrsrn funktion selbst geschrieben
void clrscr() { COORD topLeft={0,0}; CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hOut,&csbi); FillConsoleOutputCharacter(hOut,' ',csbi.dwSize.X * csbi.dwSize.Y, topLeft,NULL); SetConsoleCursorPosition(hOut,topLeft); }Allerdings mit selbem Ergebnis. Jetzt weis ich nicht ob das Bildschirm clearen zu langsam ist oder das Ausgeben über cout. Hat jemand eine Idee, wie man das Spiel "Flackerfrei" darstellen kann? Die Lösung muss nicht Plattformunabhängig sein
Ich habe auch gesehen, dass dieses Thema schon ein paar mal hier im Forum behandelt wurde, allerdings ohne Lösung (weil es keine gibt?)Mein zweites Problem:
Am Ende des Programms möchte ich gerne einen Highscore anzeigen lassen. Allerdings wird das Programm "vorzeitig" beendet. Zuerst dachte ich es liegt daran, dass der Eingabepuffer nicht richtig geleert wird. Doch dann habe ich folgendes Minimalbeispiel gemacht und gesehen, dass es an etwas anderem liegen muss.int main() { bool progende=true; for(;;) //Endlosschleife; hier drin befindet sich das "Spiel" { cout<<"FELD AUSGEBEN"<<endl; if(GetAsyncKeyState(VK_DOWN)) //Pfeiltaste unten { //Block schnell nach unten bewegen cout<<"UNTEN"<<endl; } if(GetAsyncKeyState(VK_RIGHT)) //Pfeiltaste rechts { //Block nach rechts verschieben cout<<"RECHTS"<<endl; } if(GetAsyncKeyState(VK_RETURN)) //Enter { //Block drehen cout<<"ENTER"<<endl; } if(GetAsyncKeyState(VK_F12)) //Programm beenden { progende=false; } Sleep(500); if(!progende) break; //Endlosschleife verlassen } Sleep(1000); cout<<endl<<endl<<"ENDE VOM PROGRAMM"; // Diese ausgabe ist nie zu sehen getch(); // cin.clear(); // cin.get(); // }Wenn ich eine Zeit warte, ohne eine Taste zu drücken und dann F12 drücke, erscheint ganz normal die Ausgabe "ENDE VOM PROGRAMM". Wenn ich aber ein paar mal auf die Pfeiltasten und Enter drücke und erst dann F12 drücke, schließt sich meine Console ohne auf einen Tastendruck zu warten oder "ENDE VOM PROGRAMM" auszugeben.
Weis jemand wie ich dieses Problem beheben kann
Danke im voRaus

Edit: Ich habe mich für das C++ forum entschieden, weil ich glaub, dass das 2. Problem trotz der Key-Abfragen über den standard zu lösen sein sollte. Falls ich im falschen Forum bin bitte ich um Verzeihung und Verschiebung

-
hallo ,
i wrote a program in c++ that read a data from a data.txt than send it to an other target,
the problem is that i get always a new data in my txt and i need to read the always the new data than came (ihave RFID System that control the movement of pallet using transponder with ID nummer)
i try to modify my program but i did not get a result
please can someone hepl me
hier is my code
#include <fstream>
#include <string>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys\types.h>
#include <sys\stat.h>
******************************************************************************
*
* readFile
*
*****************************************************************************/static WORD readFile(char *FileName, BYTE *UserData)
{
std::fstream InputFile(FileName, std::ios_base::in );if (InputFile.is_open()) {
std::string Line1;
std::string Line2;
std::string Line3;
std::string Line4;
std::string Line5;
std::string Line6;std::getline(InputFile, Line1);
std::cout << Line1<< std::endl;
std::getline(InputFile, Line2);
std::cout << Line2<< std::endl;
std::getline(InputFile, Line3);
std::cout << Line3<< std::endl;
std::getline(InputFile, Line4);
std::cout << Line4<< std::endl;
std::getline(InputFile, Line5);
std::cout << Line5<< std::endl;
std::getline(InputFile, Line6);
std::cout << Line6<< std::endl;sprintf((char *)UserData, "%s\n%s\n%s\n%s\n%s\n%s\n",
Line1.c_str(),
Line2.c_str(),
Line3.c_str(),
Line4.c_str(),
Line5.c_str(),
Line6.c_str());return(WORD)strlen((char *)UserData);
}return 0;
}ps:my txt contain more than 6 line and i get always new data
i need a hepllllll please
thanks
-
Also das erste kannst du mal mit WriteConsoleOutputCharacter versuchen:
http://msdn.microsoft.com/en-us/library/ms687410(VS.85).aspxAnstatt cout zu nehmen. Das funktioniert schonmal recht gut. Ich habe da mal probiert so etwas, wie Doublebuffering zu versuchen für einen 3D Renderer in der Konsole, allerdings war die Methode für das wechseln des Buffers der echte Kill.
(das ganze Konsolenfenster hat angefangen zu flackern..)Für ein Tetris reicht ja ein geringerer Takt und das sollte kaum noch schlimm aussehen auch ohne Doublebuffering.
Beim zweiten Problem würde ich mal die Eingabe in jedem Frame leeren.
-
Kannst du mir mal ein Beispiel für die SetConsoleTextAttribute Funktion geben? Bin nicht so bewandert in der WinAPI.
Beim zweiten Problem würde ich mal die Eingabe in jedem Frame leeren.
Und wie genau mache ich das
Wenn ich danach bei google suche finde ich nur .clear() für std::cin bzw fflush für FILE (aus C). Ist das wieder eine WinAPI Funktion?
-
Wie kommst du jetzt auf SetConsoleTextAttribute? Die brauchst du, wenn du eine Farbe einstellen möchtest, aber für das schreiben reicht das hier:
BOOL WINAPI WriteConsoleOutputCharacter( __in HANDLE hConsoleOutput, __in LPCTSTR lpCharacter, __in DWORD nLength, __in COORD dwWriteCoord, __out LPDWORD lpNumberOfCharsWritten );Was dann wahrscheinlich in etwa so aussehen kann:
DWORD write_to ( text , short x , short y) { DWORD written = 0; COORD position = {x,y} WriteConsoleOutputCharacter (GetStdHandle (STD_OUTPUT_HANDLE),text,text.size(),position,&written); return written; }
-
Hi!
Nimm WriteConsole bzw. WriteConsoleOutput.
Gruß,
B.B.
-
Nimm am besten gotoXY, setz den Curser und schreib das dann jeweils um, dann muss nicht die ganze Konsole neu geladen werde.
Ich hatte das gleiche Problem, aber jetzt ist es viel schneller und FLACKERFREI!