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

R3sident3vil

Treue Seele

  • »R3sident3vil« ist der Autor dieses Themas

Beiträge: 177

Wohnort: 1010010

Beruf: Selbstständig

  • Private Nachricht senden

1

04.10.2007, 15:49

Kollisionsabfrage in der Konsole ^^

Hallo Leute,

ich denke der Titel dieses Threads weist schon auf alles hin -> ich weiß nicht wie ich eine Kollision in der Konsole abfragen soll. Ich habs mal selbst probiert, aber es funktionierte scheinbar nicht. Bei ist es so, dass der Character der Cursor ist und sich auf einem schon vorhandenen Feld aus Zeichen, das ich mit cout erzeuge, bewegen soll. Der Cursor wird durch das hoch -und runterzählen der Koordinatenvariablen xPos und yPos pro Tastendruck gesteuert. Somit ist Held und Cursor völlig unabhängig voneinander. Damit hab ich das Problem mit dem Flackern behoben, denn Neuzeichen?! -> das ist dämlich und umständlich. So möchte ich mal Fragen, wie ich dem Cursor "beibringen" soll, nicht durch einen "Baum" zu laufen oder ins Abseits?

Ich habs mal mit Bedingungen versucht. Also, die Startkoordinaten sind (13/7) bei mir. Von (2/2) bis (20/2) ist eine Mauer, durch die er nicht gehen soll ;) . Da machte ich die Abfrage:

C-/C++-Quelltext

1
2
if (xPos == 2 && xPos < 20 && yPos == 2) run = false;
//'run' ist eine boolean-variable. Wenn sie true ist, dann ist die Laufschleife im Gange.


Kann mir damit jemand weiterhelfen? Danke im voraus.

MfG M.O.O
Kaum ist Linux wieder da, schon gehts meinem Rechner wunderbar, denn Linux ist die beste Medezin.

Olischewsky Arts

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

04.10.2007, 16:05

DU hast ja dein Feld und du hast die alte Position + die wo du hin willst. Nun solltest bei jedem Feld eindeutig definiert sein, ob es begehbar ist oder nicht. Z.B. könntest du das durch ein bool Array festlegen. Dann solltest du eine Funktion haben die schaut, ob das Feld wo du hingehen willst begehbar ist oder nicht.
Reicht das als Ansatz?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

R3sident3vil

Treue Seele

  • »R3sident3vil« ist der Autor dieses Themas

Beiträge: 177

Wohnort: 1010010

Beruf: Selbstständig

  • Private Nachricht senden

3

04.10.2007, 17:42

Also mir kommt das bekannt vor, das du vorgeschlagen hast, aber ich hatte immer Probleme das umzusetzen ;)
Kaum ist Linux wieder da, schon gehts meinem Rechner wunderbar, denn Linux ist die beste Medezin.

Olischewsky Arts

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

4

04.10.2007, 18:12

Hehe, das erste prog bis jetzt das ich ohne compilerfehler schreiben konnte ^^.

http://nopaste.info/fbe89626cc.html

Hoffe kannst es auf dein prog übertragen. Ist nur ein Beispiel, gibt noch viele andere Wege das zu lösen.

R3sident3vil

Treue Seele

  • »R3sident3vil« ist der Autor dieses Themas

Beiträge: 177

Wohnort: 1010010

Beruf: Selbstständig

  • Private Nachricht senden

5

04.10.2007, 20:30

Hey cool, ich habs bis jetzt fast genauso wie du gemacht, bis auf diese Sache mit dem Tile ;)

Danke :!:

EDIT: worin besteht eigentlich die Kunst, dass es beim Neuzeichnen nicht flackert? :oops:
Kaum ist Linux wieder da, schon gehts meinem Rechner wunderbar, denn Linux ist die beste Medezin.

Olischewsky Arts

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

04.10.2007, 21:22

Puffer verwenden: http://msdn2.microsoft.com/en-us/library/ms687404.aspx
@D13_Dreinig

xCite

Frischling

Beiträge: 77

Wohnort: Deutschland

Beruf: Berufsfachschüler

  • Private Nachricht senden

7

04.10.2007, 22:57

Ich habe es so gelöst:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
char console::read_character (unsigned int x, unsigned int y)
{
    void* output = GetStdHandle (STD_OUTPUT_HANDLE);
    CHAR_INFO buffer[1][1];
    COORD buffer_size = {1, 1};
    COORD buffer_coord = {0, 0};
    SMALL_RECT rect = {x, y, x, y};
    ReadConsoleOutputA (output, (_CHAR_INFO *)buffer, buffer_size, buffer_coord, &rect);

    return buffer[0][0].Char.AsciiChar;
} // Ist übrigens eine statische Funktion ;)


Bei der Abfrage der jeweiligen Pfeiltasten (o.ä.):
(VK_DOWN)

C-/C++-Quelltext

1
2
if (console::read_character (x, y) != ' ')
    y -= 1;
[01.10.2007 - 19:36:05] babelfish: weiss jemand einen Algo um witzige Sprüche zu erkennen? will das einbauen xD
[01.10.2007 - 19:36:07] |bubble|: War diese Frage ernst gemeint?!?

(Insider!) xD

P.S.: goto ruleZ! :D

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

04.10.2007, 23:34

Bissl suboptimal, oder?

Habs mal etwas kommentiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
char console::read_character (unsigned int x, unsigned int y)
{
    void* output = GetStdHandle (STD_OUTPUT_HANDLE); // auslagern

    CHAR_INFO buffer[1][1]; // wofür sowas?

    COORD buffer_size = {1, 1}; // ?????

    COORD buffer_coord = {0, 0}; // Herrje

    SMALL_RECT rect = {x, y, x, y}; // Hä?

    ReadConsoleOutputA (output, (_CHAR_INFO *)buffer, buffer_size, buffer_coord, &rect); // bissl überladen?!


    return buffer[0][0].Char.AsciiChar; // s.o.

} // Ist übrigens eine statische Funktion ;)


Also packen wir alles zusammen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HANDLE handle;

bool ReadChar( SHORT x, SHORT y, char& c )
{
    COORD pos = { x, y };
    DWORD len = 0;

    ReadConsoleOutputCharacter( handle, &c, 1, pos, &len );

    return ( len == 1 );
}

int main()
{
    handle = GetStdHandle( STD_OUTPUT_HANDLE ); 
}
@D13_Dreinig

xCite

Frischling

Beiträge: 77

Wohnort: Deutschland

Beruf: Berufsfachschüler

  • Private Nachricht senden

9

05.10.2007, 13:42

Autsch, hab die Funktion in der MSDN übersehen :oops: Danke für den Hinweis :p
[01.10.2007 - 19:36:05] babelfish: weiss jemand einen Algo um witzige Sprüche zu erkennen? will das einbauen xD
[01.10.2007 - 19:36:07] |bubble|: War diese Frage ernst gemeint?!?

(Insider!) xD

P.S.: goto ruleZ! :D

Werbeanzeige