Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nelrim

Frischling

  • »Nelrim« ist der Autor dieses Themas

Beiträge: 33

Beruf: Entwicklungskonstrukteur

  • Private Nachricht senden

1

21.02.2008, 13:11

Farbe in der Konsole und Tastaturabfrage ohne Enter.

Hallo,

auch wenn ich DSL mässig jetzt erstmal abgenabelt bin möchte ich trotzdem weiter programmieren lernen.

ich bastele zur Zeit an einem Kniffel Klon, der auch ganz gute Fortschritte macht.

Schade finde ich zwei Dinge:

In der Konsole kann man wohl nicht "sauber" einfach mal die Textfarbe ändern. (gibts da echt nix?) Hier gibts ja dieses Tutorial:
http://www.scherfgen-software.net/index.…30a376fec6be288

Allerdings gehts in der Diskussion dazu ziemlich wild her (ich hab nur Fragmente von dem verstanden was da eigentlich diskutiert wurde...

Beim Satz des original Autors (Shade)

Zitat

Ich könnte auch in jeder einzelnen Methode überprüfen, ob das Handle gültig ist, damit ja nichts passiet, falls der User vergisst Init aufzurufen.
Tue ich aber nicht, da ich klares denken voraussetze. Wer blind irgendetwas verwendet, von dem er genau nichts weiß, dem kann ich auch nicht helfen...


habe ich mich dann entschieden genau das nicht zu tun und halt (seufz) auf Farbe zu verzichten. Grund: ich habe keine Ahnung wie ich eine Init aufrufe und wozu.


------

Das zweite, das ich etwas unschön finde ist, das in meinem Programm quasi überall eine Eingabe vom Spieler verlangt wird.

(H)auptmenue
(E)xit

Diese muß der Spieler aber jedesmal durch Drücken der Enter Taste bestätigen, was ich doof finde und auch nicht blondinensicher (freundin) ist.

Jetzt hatte ich im internet recherchiert dort habe ich gefunden das man

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#include <conio.h>

void main()
{
...

getch();

}


nehmen solle... daraufhin wurde der, der diese Lösung angeboten hat ziemlich niedergeflamed weil das doch alles so sch... sei und bla und blub und getch nur eine extension des compilers aber nicht c++ sei. Dummerweise hat keiner geschrieben wie es denn besser geht.

Weiss das hier jemand?

Also nochmal zusammengefasst:

1) Farbe in der Konsole?
2) Tastenabfrage ohne Enter drücken zu müssen aber auch ohne

C-/C++-Quelltext

1
<conio.h>+getch();


schonmal lieben Dank für eure Hilfen

Gruß

Nelrim
Auch der längste Weg beginnt mit einem ersten Schritt.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

21.02.2008, 13:23

1. Also was die Farben angeht, habe ich hier mal im Forum was gelesen.
Muss ev. mal noch suchen. Irgendwer hat sogar (glaube ich) mal ein ganzes Set von Fuktionen reingestellt für die Konsole. (Also auch so gotoxy und so..)

2. Also ich habe das mit der Tasteneingabe bei meinem Konsolenspiel so gelöst, dass ich mittels GetAsyncKeyState (..) geschaut habe. Ist hald die schnellste Varianten mal eine Taste abzufragen, ohne gleich die Messages abzufangen. Wenn du da noch eine verzögerung reinbaust reicht das alle mal für dein Spiel.

Nelrim

Frischling

  • »Nelrim« ist der Autor dieses Themas

Beiträge: 33

Beruf: Entwicklungskonstrukteur

  • Private Nachricht senden

3

21.02.2008, 13:28

Zitat von »"drakon"«

1. Also was die Farben angeht, habe ich hier mal im Forum was gelesen.
Muss ev. mal noch suchen. Irgendwer hat sogar (glaube ich) mal ein ganzes Set von Fuktionen reingestellt für die Konsole. (Also auch so gotoxy und so..)

2. Also ich habe das mit der Tasteneingabe bei meinem Konsolenspiel so gelöst, dass ich mittels GetAsyncKeyState (..) geschaut habe. Ist hald die schnellste Varianten mal eine Taste abzufragen, ohne gleich die Messages abzufangen. Wenn du da noch eine verzögerung reinbaust reicht das alle mal für dein Spiel.


Erstmal danke,


wie gesagt ich bin derzeit bissi abgenabelt ich kann also beim programmieren selbst net online sein. Kannst du mir einen code schnippsel geben den ich mal ausprobieren kann?

ist GetAsyncKeyState ein c++ befehl?

und wie macht man eine Verzögerung? ich hab Pause und Wait probiert aber nix erreicht.

Nelrim
Auch der längste Weg beginnt mit einem ersten Schritt.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

21.02.2008, 13:38

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <conio.h>
#include <windows.h>
...

int KeyInput (int SleepTime)
{
    _getch (); //Wartet bis eine Taste gedrückt wurde.


    if (GetAsyncKeyState (VK_UP))     return  1;
    if (GetAsyncKeyState (VK_DOWN))   return  2;
    if (GetAsyncKeyState (VK_LEFT))   return  3;
    if (GetAsyncKeyState (VK_RIGHT))  return  4;
    if (GetAsyncKeyState (VK_RETURN)) return  5;
    if (GetAsyncKeyState (VK_SPACE))  return  6;
    if (GetAsyncKeyState (VK_ESCAPE)) return  7;

    Sleep (SleepTime); //Wartet die übergebenen Milisekunden.

    return 0;
}


Machs doch so. Falls du später mal wirklich noch Konsolenanwendungen programmieren willst, dann kannst du auch bessere Funktionen erstellen, aber wenn du das nur als Mittel zum Zweck brauchst, sehe ich keinen Grund auf Portabilität zu setzen.
Das GetAsyncKeyState ist eine Windows Funtion. Kannst du in dern Plattform SDK nachschauen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

21.02.2008, 14:04

Wegen der Farben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

enum textcolors_e
{
    black,
    dblue,
    dgreen,
    dcyan,
    dred,
    dpurple,
    dgray,
    dwhite,
    gray,
    blue,
    green,
    cyan,
    red,
    purple,
    yellow,
    white
};

void setcolor( int back, int fore )
{
    int setback = 0;
    if ( back & 0x1 ) setback |= BACKGROUND_BLUE;
    if ( back & 0x2 ) setback |= BACKGROUND_GREEN;
    if ( back & 0x4 ) setback |= BACKGROUND_RED;
    if ( back & 0x8 ) setback |= BACKGROUND_INTENSITY;

    int setfore = 0;
    if ( fore & 0x1 ) setfore |= FOREGROUND_BLUE;
    if ( fore & 0x2 ) setfore |= FOREGROUND_GREEN;
    if ( fore & 0x4 ) setfore |= FOREGROUND_RED;
    if ( fore & 0x8 ) setfore |= FOREGROUND_INTENSITY;

    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), setback | setfore );
}


Verwenden kannst du das folgend:

C-/C++-Quelltext

1
2
setcolor( dgreen, yellow);
printf( "foobar" );
@D13_Dreinig

6

21.02.2008, 15:56

Kommt nicht bei 0x1|0x2 dasselbe raus wie bei 0x2|0x1? Wie unterscheidet denn dann die Konsole, welcher Wert für Vorder- und welcher für Hintergrund bestimmt ist?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

21.02.2008, 16:09

Zitat von »"PCShadow"«

Kommt nicht bei 0x1|0x2 dasselbe raus wie bei 0x2|0x1? Wie unterscheidet denn dann die Konsole, welcher Wert für Vorder- und welcher für Hintergrund bestimmt ist?


Was meinst du? Die Werte von BACKGROUND_XYZ und FOREGROUND_XYZ unterscheiden sich, daher weiß die Konsole das. Und genau, die Reihelfolge der geoderten Komponenten ist egal.

Siehe hierzu:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#define FOREGROUND_BLUE      0x0001 // text color contains blue.

#define FOREGROUND_GREEN     0x0002 // text color contains green.

#define FOREGROUND_RED       0x0004 // text color contains red.

#define FOREGROUND_INTENSITY 0x0008 // text color is intensified.

#define BACKGROUND_BLUE      0x0010 // background color contains blue.

#define BACKGROUND_GREEN     0x0020 // background color contains green.

#define BACKGROUND_RED       0x0040 // background color contains red.

#define BACKGROUND_INTENSITY 0x0080 // background color is intensified.
@D13_Dreinig

8

21.02.2008, 21:16

C-/C++-Quelltext

1
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 30);


meiner Meinung eine sehr einfache Möglichkeit. Die letzte Zahl gibt die Hinter und Vordergrundfarbe an.

9

21.02.2008, 21:56

Dann guck mal in der letzten Zeile von David's Funktion ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

10

22.02.2008, 16:21

@David: Uups, zu schnell gelesen

@Deviloper: Davids vorschlag ist aber wesentlich einfacher - bei dir muss man erstmal ausrechnen, welche Farbe welche Zahl ist.

Werbeanzeige