Smiley bewegen
-
Hi Leute,
ich habe mich mal etwas mit der Funktion gotoxy() beschäftigt und habe mir gedacht, dass ich es mal versuchen könnte einen Smiley in der Konsole bewegen zu lassen. Wenn ich zum Beispiel die linke Pfeiltaste drücke, soll sich der Smiley auch nach links bewegen, aber ich weiß nicht wie ich das machen kann. Wie könnte ich das anstellen? Ich wäre euch dankbar.
MfG René
-
Hi,
ich hätte da vielleicht eine Idee. Ich weiß aber nicht, ob sie funktioniert.
Ich füge zuerst ein Stück Code an, den man für deine Zwecke noch modifizieren müsste.#include <conio.h> #include <iostream> using namespace std; int GetKey () { int Key = getch (); if (Key == 0 || Key == 224) { Key = 256 + getch (); } return Key; } int main () { int Key = 0; while (Key != 27) // solange nicht Escape gedrückt wurde { Key = GetKey (); switch (Key) { case 328: // Pfeiltaste nach oben { cout << "Up!" << endl; } break; case 336: // Pfeiltaste nach unten { cout << "Down!" << endl; } break; case 333: // Pfeiltaste nach rechts { cout << "Right!" << endl; } break; case 331: // Pfeiltaste nach links { cout << "Left!" << endl; } break; default: // Taste (noch) nicht definiert { cout << " >>>" << Key << endl; } } } return 0; }
Du müsstest anstatt oben, unten, links oder rechts zu schreiben deine Position des Smileys verändern. Dies geht eventuell mit der Datei conioex, welche ich im folgenden anhänge. In ihr gibt es Funktionen um den aktuellen Cursorpunkt zu bestimmen. Dieser muss dann je nach eingabe verändert werden. Dann muss über die gotoxy() der neue Cursorpunkt dem Compiler genannt werden.
// ########################################################################### // Datei: conioex.hpp // ########################################################################### // Autor: Patrick Ullmann // Erstellt: 27.06.2005 // Änderungen: 27.06.2005 (Patrick) Datei erstellt // ########################################################################### // Beschreibung: Portierung der <conio.h> für den VC++ #if (_MSC_VER > 1000) #pragma once #endif // VC++ Include Guard #if !defined(__conioex_h__) #define __conioex_h__ // I N C L U D E S ########################################################### // Allgemeine conio inkludieren #include <conio.h> // D E F I N I T I O N E N ################################################### // Nur für Non-Borland Compiler benötigen wir folgende Implementierung #if !defined(__BORLANDC__) // Nur Win32-Konsolen werden unterstützt #if !defined(_WIN32) || (defined(_MSC_VER) && !defined(_CONSOLE)) #error Only Win32-Console-Targets supported #endif // Farben definieren wenn nötig #if !defined(__COLORS) #define __COLORS // Die Farben enum COLORS { // Dunkle Farben BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, // Helle Farben LIGHTGRAY, DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE }; #endif // Cursortypen für _setcursortype() const unsigned long _NOCURSOR = 0; const unsigned long _SOLIDCURSOR = 1; const unsigned long _NORMALCURSOR = 2; // Makro für die Erstellung von Textattributen #if !defined(BUILD_TEXTATTR) #define BUILD_TEXTATTR(f, b) static_cast<int>((((b) & 15) << 4) | ((f) & 15)) #endif // Leert den Inhalt des Bildschirms und setzt den Cursor auf 1x1 void __cdecl clrscr (void); // Leert die Aktuelle Zeile, Cursor wird nicht verschoben void __cdecl clreol (void); // Setzt den Cursor an die Position X und Y void __cdecl gotoxy (int x, int y); // Gibt die aktuelle X-Position des Cursors wieder int __cdecl wherex (void); // Gibt die aktuelle Y-Position des Cursors wieder int __cdecl wherey (void); // Fügt eine neue Zeile hinzu. void __cdecl insline (void); // Löscht eine Zeile void __cdecl delline (void); // Setzt eine Textfarbe void __cdecl textcolor (int color); // Setzt eine Hintergrundfarbe für den Text void __cdecl textbackground (int color); // Setzt ein Attribut für den Text void __cdecl textattr (int attr); // Aktiviert helle Farben void __cdecl highvideo (void); // Deaktiviert helle Farben void __cdecl lowvideo (void); // Verändert den Cursortyp void __cdecl _setcursortype (unsigned long cur_t); #endif #endif
Und nun die zugehörige cpp.Datei
// ########################################################################### // Datei: conioex.cpp // ########################################################################### // Autor: Patrick Ullmann // Erstellt: 27.06.2005 // Änderungen: 27.06.2005 (Patrick) Datei erstellt // ########################################################################### // Beschreibung: Portierung der <conio.h> für den VC++ // I N C L U D E S ########################################################### // Nur für Non-Borland Compiler gilt diese Implementierung #if !defined(__BORLANDC__) #include <windows.h> #include "conioex.hpp" // F U N K T I O N E N ####################################################### // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Leert den Inhalt des Bildschirms und setzt den Cursor auf 1x1 // /////////////////////////////////////////////////////////////////////////// void __cdecl clrscr (void) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; HANDLE out; unsigned long written; COORD coord; // Informationen holen if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!::GetConsoleScreenBufferInfo(out, &info)) return; // Cursor verschieben coord.X = 0; coord.Y = 0; // Konsole manipulieren ::FillConsoleOutputAttribute (out, info.wAttributes, info.dwSize.X*info.dwSize.Y, coord, &written); ::FillConsoleOutputCharacter (out, TEXT(' '), info.dwSize.X*info.dwSize.Y, coord, &written); // Cursorposition setzen ::SetConsoleCursorPosition (out, coord); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Leert die Aktuelle Zeile, Cursor wird nicht verschoben // /////////////////////////////////////////////////////////////////////////// void __cdecl clreol (void) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; HANDLE out; unsigned long written; // Informationen holen if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!::GetConsoleScreenBufferInfo(out, &info)) return; // Konsole manipulieren ::FillConsoleOutputAttribute (out, info.wAttributes, (info.dwSize.X - info.dwCursorPosition.X), info.dwCursorPosition, &written); ::FillConsoleOutputCharacter (out, TEXT(' '), (info.dwSize.X - info.dwCursorPosition.X), info.dwCursorPosition, &written); // Cursor setzen ::SetConsoleCursorPosition (out, info.dwCursorPosition); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Setzt den Cursor an die Position X und Y // /////////////////////////////////////////////////////////////////////////// void __cdecl gotoxy(int x, int y) { // Sicherheitsabfrage if(HIWORD(x) || HIWORD(y)) return; // Hilfsstruktur COORD coord; // Cursor verschieben coord.X = LOWORD(x - 1); coord.Y = LOWORD(y - 1); // Cursor setzen ::SetConsoleCursorPosition (::GetStdHandle(STD_OUTPUT_HANDLE), coord); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Gibt die aktuelle X-Position des Cursors wieder // /////////////////////////////////////////////////////////////////////////// int __cdecl wherex(void) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; // Informationen holen if (!::GetConsoleScreenBufferInfo(::GetStdHandle(STD_OUTPUT_HANDLE),&info)) return 0; // Position zurück geben return (info.dwCursorPosition.X + 1); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Gibt die aktuelle Y-Position des Cursors wieder // /////////////////////////////////////////////////////////////////////////// int __cdecl wherey(void) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; // Informationen holen if (!::GetConsoleScreenBufferInfo(::GetStdHandle(STD_OUTPUT_HANDLE),&info)) return 0; // Position zurück geben return (info.dwCursorPosition.Y + 1); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Fügt eine neue Zeile hinzu. // /////////////////////////////////////////////////////////////////////////// void __cdecl insline(void) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; SMALL_RECT rect; CHAR_INFO char_info; HANDLE out; COORD coord; // Informationen holen if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!::GetConsoleScreenBufferInfo(out, &info)) return; // Unicode oder nicht? #if defined(UNICODE) char_info.Char.UnicodeChar = L' '; #else char_info.Char.AsciiChar = ' '; #endif // Attribute sichern char_info.Attributes = info.wAttributes; // Rechteck ausrechnen rect.Left = 0; rect.Top = LOWORD(info.dwCursorPosition.Y); rect.Right = LOWORD(info.dwSize.X - 1); rect.Bottom = LOWORD(info.dwSize.Y - 1); // Position setzen coord.X = 0; coord.Y = LOWORD(info.dwCursorPosition.Y + 1); // Konsole manipulieren ::ScrollConsoleScreenBuffer (out, &rect, NULL, coord, &char_info); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Löscht eine Zeile // /////////////////////////////////////////////////////////////////////////// void __cdecl delline(void) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; SMALL_RECT rect; CHAR_INFO char_info; HANDLE out; COORD coord; // Informationen holen if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!::GetConsoleScreenBufferInfo(out, &info)) return; // Unicode oder nicht? #if defined(UNICODE) char_info.Char.UnicodeChar = L' '; #else char_info.Char.AsciiChar = ' '; #endif // Attribute sichern char_info.Attributes = info.wAttributes; // Rechteck ausrechnen rect.Left = 0; rect.Top = LOWORD(info.dwCursorPosition.Y + 1); rect.Right = LOWORD(info.dwSize.X - 1); rect.Bottom = LOWORD(info.dwSize.Y - 1); // Position setzen coord.X = 0; coord.Y = LOWORD(info.dwCursorPosition.Y); // Konsole manipulieren ::ScrollConsoleScreenBuffer (out, &rect, NULL, coord, &char_info); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Setzt eine Textfarbe // /////////////////////////////////////////////////////////////////////////// void __cdecl textcolor (int color) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; HANDLE out; // Informationen holen if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!::GetConsoleScreenBufferInfo(out, &info)) return; // Konsole manipulieren ::SetConsoleTextAttribute (out, static_cast<unsigned short>((info.wAttributes & ~0x0F) | static_cast<unsigned short>(color & 0x0F))); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Setzt eine Hintergrundfarbe für den Text // /////////////////////////////////////////////////////////////////////////// void __cdecl textbackground (int color) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; HANDLE out; // Informationen holen if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!::GetConsoleScreenBufferInfo(out, &info)) return; // Konsole manipulieren ::SetConsoleTextAttribute (out, static_cast<unsigned short>((info.wAttributes & ~0xF0) | static_cast<unsigned short>((color & 0x0F) << 4))); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Setzt ein Attribut für den Text // /////////////////////////////////////////////////////////////////////////// void __cdecl textattr (int attr) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; HANDLE out; // Informationen holen if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!::GetConsoleScreenBufferInfo(out, &info)) return; // Konsole manipulieren ::SetConsoleTextAttribute (out, static_cast<unsigned short>((info.wAttributes & ~0xFF) | static_cast<unsigned short>(attr & 0xFF))); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Aktiviert helle Farben // /////////////////////////////////////////////////////////////////////////// void __cdecl highvideo (void) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; HANDLE out; // Informationen holen if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!::GetConsoleScreenBufferInfo(out, &info)) return; // Konsole manipulieren ::SetConsoleTextAttribute (out, static_cast<unsigned short>(info.wAttributes | FOREGROUND_INTENSITY)); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Deaktiviert helle Farben // /////////////////////////////////////////////////////////////////////////// void __cdecl lowvideo (void) { // Hilfsvariablen /- strukturen CONSOLE_SCREEN_BUFFER_INFO info; HANDLE out; // Informationen holen if ((out = ::GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; if (!::GetConsoleScreenBufferInfo(out, &info)) return; // Konsole manipulieren ::SetConsoleTextAttribute (out, static_cast<unsigned short>(info.wAttributes | ~FOREGROUND_INTENSITY)); } // /////////////////////////////////////////////////////////////////////////// // PUBLIC // // Verändert den Cursortyp // /////////////////////////////////////////////////////////////////////////// void __cdecl _setcursortype (unsigned long type) { // Hilfsstruktur CONSOLE_CURSOR_INFO info; // Größe verändern if ((type == _NOCURSOR) || (type == _NORMALCURSOR)) info.dwSize = 25; else if (type == _SOLIDCURSOR) info.dwSize = 100; else return; // Cursor sichtbar? info.bVisible = (type == _NOCURSOR) ? false : true; // Konsole manipulieren ::SetConsoleCursorInfo (::GetStdHandle(STD_OUTPUT_HANDLE), &info); } #endif
Ich hoffe es funktioniert !!!
-
Probiers mal mit Ansi-Sequenzen.
Schau am besten in dem thread farbige shell nach unten da steht wie das mit dem cusor funktioniert
-
Das kannst du machen, ist aber kein Standard C++. Schau bei den Konsolen, da wurde das schon zigmal beantwortet.
Bye, TGGC (Das Jahr des Helden)
-
Storm.Xapek.de schrieb:
Probiers mal mit Ansi-Sequenzen.
Schau am besten in dem thread farbige shell nach unten da steht wie das mit dem cusor funktionierthallo.. beachte bitte, dass die ansi sequencen ab größer win98 nicht mehr funktionieren unter windows.
informier dich bitte auch im konsolenfaq.so long
-
unter linux ist das gang und gebe, völlig normal.
Warum sind eigentlich alle immer so auf windows bedacht?
-
Storm.Xapek.de schrieb:
unter linux ist das gang und gebe, völlig normal.
Warum sind eigentlich alle immer so auf windows bedacht?Weil Windows besser ist als Linux.
-
LOL zum letzten Beitrag!
-
Mit windows zu arbeiten, ist so als würde mal täglich "Bild" lesen.
-
Storm.Xapek.de schrieb:
unter linux ist das gang und gebe, völlig normal.
Warum sind eigentlich alle immer so auf windows bedacht?wenn du zu linux was sagst, schreib es in den unterbereich linux hier im forum.
wenn zu windows-winapi, dann in diesen bereich.
wenn zu dos-win32 konsole, dann in diesen bereich.und wenn zu standard c++, lass alles rund um farbe, positionierung, oder sonstige betriebssystemspezifische dinge: WEG.
c++ standard gilt für überall. hier geht es rein um die sprache.dafür ist die unterteilung da.. jahrelang dran gefeilt *g
und akzeptiere, dass die win32 konsole ab win2000 keine ansi sequenzen mehr hat. leider.
grüße
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
@ spacegaier
Danke für dein Script. Ich habe es etwas verändert und nun funktioniert es. Danke dir.
MfG René