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

1

04.01.2007, 22:33

Consolen befehle

Hallo mal so ne Frage zu konsolenprogrammen
gibt es eigentlich eine Befehlsübersicht wo alle Befehle für die konsole stehen wenn ich jetzt ein einfaches Spiele über Konsole programmieren will und eben Texte in anderen Farben oder sowas in der Richtung machen will.
Oder eben Tastatureingaben z.b. mit den Pfeiltasten Zeichen verschieben usw.
Wäre nett wenn ihr da was wüstet.
Danke

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

04.01.2007, 23:02

Ne leider gibts sowas nicht direkt. Ich hab mal gaaanz tief nachgekramt und hab bei mir 2 funktionen gefunden die ich mir mal definiert habe. Wir hatten hier mal sowas, das genau diese Funktionen implementierte, nur leider gibts das nicht mehr.

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
#include <windows.h>

namespace Console
{
    enum CursorType
    {
        SOLID_CURSOR = 100,
        NORMAL_CURSOR = 25,
        SMALL_CURSOR = 5
    };

    void SetCursor(const CursorType cursor, const bool visible = true);
    void GotoXY(const unsigned short x, const unsigned short y);
}

/// Aussehen des Cursors setzen

void Console::SetCursor(CursorType cursor, bool visible)
{
    ::CONSOLE_CURSOR_INFO cur = { static_cast<unsigned long>(cursor), visible };
    ::SetConsoleCursorInfo(::GetStdHandle(STD_OUTPUT_HANDLE), &cur);
}

/// Zur Koordinate x y gehen, ich glaub die fangen aber bei (1, 1) an

void Console::GotoXY(unsigned short x, unsigned short y)
{
    ::COORD pos = { x, y };
    ::SetConsoleCursorPosition(::GetStdHandle(STD_OUTPUT_HANDLE), pos); 
};


weiteres findest du hier: http://msdn2.microsoft.com/fr-fr/library/ms682073.aspx


Mit SetConsoleTextAttribute kannst du die Farbe der Schrift bestimmen. Für den Hintergrund musses auch noch was geben ^^.

3

04.01.2007, 23:14

Dank dir das hilft vorab mal weiter

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

4

04.01.2007, 23:15

Wenn du dann noch welche hast, kannste die mal dann hier reinstellen, vllt bekommen wir ein gutes FAQ hin. ^^ Würde ich begrüßen.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

04.01.2007, 23:46

Ich hab noch nen paar, die ich mir irgendwann ma gecodet hab (schon ne Weile her):

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#pragma once

#include <windows.h>
#include <iostream>

namespace Console
{
    inline void gotoxy( unsigned short x, unsigned short y )
    {
        HANDLE hCon = GetStdHandle( STD_OUTPUT_HANDLE );
        COORD pos;
        pos.X=x;
        pos.Y=y;
        if ( ! SetConsoleCursorPosition( hCon, pos ) )
        {
            // Platz für individuelle Fehlerbehandlung^^

        }
    }

    // Farben gibts hier

    inline void attribute( unsigned short attr = 0 )
    {
        HANDLE hCon = GetStdHandle( STD_OUTPUT_HANDLE );
        if ( ! SetConsoleTextAttribute( hCon, attr ) )
        {
            // Platz für individuelle Fehlerbehandlung^^

        }
    }

    // Cursorgröße, -sichtbarkeit

    inline void cursor( unsigned long size, bool visible = true )
    {
        HANDLE hCon = GetStdHandle( STD_OUTPUT_HANDLE );
        CONSOLE_CURSOR_INFO info;
        if ( size < 1 )
        {
            size = 1;
            visible = false;
        }
        info.bVisible = visible;
        info.dwSize = size;
        if ( ! SetConsoleCursorInfo( hCon, &info ) )
        {
            // Platz für individuelle Fehlerbehandlung^^

        }
    }

    // Hier wird das Konsolenfenster bearbeitet

    inline void displaysize( unsigned short _X, unsigned short _Y )
    {
        HANDLE hCon = GetStdHandle( STD_OUTPUT_HANDLE );
        CONSOLE_SCREEN_BUFFER_INFO info;
        SMALL_RECT change = {0};
        if ( ! GetConsoleScreenBufferInfo( hCon, &info ) )
        {
            // Platz für individuelle Fehlerbehandlung^^

        }
        if ( _X >= info.dwMaximumWindowSize.X )
            change.Right = info.dwMaximumWindowSize.X-1;
        else
            change.Right = _X;
        if ( _Y >= info.dwMaximumWindowSize.Y )
            change.Bottom = info.dwMaximumWindowSize.Y-1;
        else
            change.Bottom = _Y;
        if ( ! SetConsoleWindowInfo( hCon, true, &change ) )
        {
            // Platz für individuelle Fehlerbehandlung^^

        }
    }

    // Jetzt ist der Ausgabebuffer dran

    inline void buffersize( unsigned short _X, unsigned short _Y )
    {
        HANDLE hCon = GetStdHandle( STD_OUTPUT_HANDLE );
        COORD newSize;
        newSize.X = _X;
        newSize.Y = _Y;
        if ( ! SetConsoleScreenBufferSize( hCon, newSize ) )
        {
            // Platz für individuelle Fehlerbehandlung^^

        }
    }

    // Selbsterklärend

    inline void title( const wchar_t* title )
    {
        if ( ! SetConsoleTitleW( title ) )
        {
            // Platz für individuelle Fehlerbehandlung^^

        }
    }

    // So oft neue Zeile, bis der Buffer wieder schön sauber ist

    //FillConsoleOutputCharacter(...) macht leider blöde Effekte bei Hintergrundfarben

    inline void cls(void)
    {
        HANDLE hCon = GetStdHandle( STD_OUTPUT_HANDLE );
        CONSOLE_SCREEN_BUFFER_INFO info;
        if ( ! GetConsoleScreenBufferInfo( hCon, &info ) )
        {
            // Platz für individuelle Fehlerbehandlung^^

        }
        wchar_t* fill = new wchar_t[info.dwSize.Y+1];
        for (int i=0; i<=info.dwSize.Y; ++i)
            fill[i] = L'\n';
        fill[info.dwSize.Y] = 0;
        gotoxy(0, info.dwSize.Y-1);
        std::wcout << fill;
        gotoxy(0, 0);
        delete [] fill;
    }
}

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

6

05.01.2007, 10:11

Jep ab damit ins FAQ. Fragen können weiter hier gepostet werden. Ich hab nur die inlines mal entfernt, da die hier nicht so angebracht sind.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

7

05.01.2007, 12:10

Wie gesagt, das is schon bisschen älter. Da ich das Projektübergreifend genutzt hab und nicht extra ne Lib erstellen wollte hab ich das einfach komplett in eine Headerdatei gepackt - geht nur mit inline, templates oder sonstwie kompliziert^^

// Mit deinen Änderungen is jetzt aber nicht mehr alles sinnvoll. Vor allem die cursor-funktion muss überarbeitet werden.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

8

05.01.2007, 13:30

jep, hab gar nicht gemerkt das du Standard Werte drin hast, habs jetzt mal getrennt und bei Cursortype casts reingemacht.

p.s. seit wann ist Standar - mit T verboten :cry:

9

05.01.2007, 17:26

Hi
hab da noch ne Frage
Ich möchte eine art pacman machen ich habe jetzt die Tastatureingaben also mit den Pfeiltasten bewege ich den cursor in einem spielfeld vo 20*40
das mit lauter punkten versehen ist

..............
..............
..............

so ungefair

wenn ich mit dem cursor darüber fahre löscht er die punkte
soweit so gut wie kann ich jetzt eine art kollision zwischen verschiedenen Zeichen machen und zeichen die sich im spielfeld bewegen mit denen man nicht zusammenstoßen darf
klingt bischen komisch weiß aber nicht wie ich es besser beschreiben soll

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

10

05.01.2007, 17:36

Wenn ich das richtig verstanden habe, willst du also sowas wie "Wände" in dein Spielfeld machen, wo pac nicht dagegenstoßen darf. Das Zeichnen drfe ja kein Problem sein (einfach |) Ecken u.s.w. findest du im ANSI Code.

Ich wüürde dir empfehlen das Spielfeld in einem Array zu speichern das zweidimensional ist. Also sowas: unsigned Spielfeld[10][10].

Dort packst du Zahlen hinein, 0 für die "Punkte", 1 für Wand, 2, für Ecke links, 3 für Frucht (z.B. Kirsche). Wenn pac sich nach rechts bewegen will und dort ist eine Wand, dann vermeidest du es, oder er stirbt, je nachdem.

Werbeanzeige