Avatar billede thomas_nj Nybegynder
07. december 2003 - 22:12 Der er 24 kommentarer og
1 løsning

Dele konsolvindue op i 2

Hej

  Jeg leger lidt med et tekstrollespil og vil derfor gerne dele et konsolvindue op i 2(har forsøgt at tegne det (de behøves ikke blive skilt af en linie men de må gerne).
_______
|_____|
|    |
|_____|

  Det øverste skal bruges som en slags statusbar og det andet(store) område skal bruges til selve spillet. Derfor vil det være smart hvis man kan opdatere dem uafhængigt af hinanden.
  Er der en eller anden måde man kan gøre dette på (vil være glad for et lille kodeeksempel. Arbejder med dev-cpp på windows.
Avatar billede thomas_nj Nybegynder
07. december 2003 - 22:13 #1
_______
|_____|
|    |
|_____|
Avatar billede arne_v Ekspert
07. december 2003 - 22:15 #2
Du har to muligheder så vidt jeg kan se:

1)

Lave dig et bibliotek med nogen basale funktioner lav vindue, skriv
i bestemt position i vindue og den slags.

Og så bruge det.

2)

Finde noget færdigt.

En curses implementation var nærliggende.
Avatar billede thomas_nj Nybegynder
07. december 2003 - 22:37 #3
Kan godt lide løsning 1 da meningen med spillet er at prøve at arbejde lidt frit med sproget, men har ikke den store ide om hvordan man bygger sådan noget op.
Avatar billede thomas_nj Nybegynder
07. december 2003 - 22:39 #4
Kan godt bygge det op som et vindue med samme udseende man så opdaterer men........det vil være federe at lave det som 2 men så styrer hver for sig
Avatar billede thomas_nj Nybegynder
07. december 2003 - 22:41 #5
Et hurtigt kodeeksempel på hvordan min ide til en opgygning kan være:


#include <iostream>
#include <cstdlib>

using namespace std;


int main()
{
    cout<<"Money:  10.00 kr."<<endl;
    cout<<endl;
    cout<<"_________________________________________________________________"<<endl;
    cout<<endl;
    cout<<endl;
    cout<<"Game"<<endl;
    system("pause");
    return 0;
}
Avatar billede arne_v Ekspert
07. december 2003 - 22:42 #6
Du skal have lavet dig en low level funktion:
  xwrite(int x, int y, char *txt, int forcol, int backcol);
eller noget ligende.

Så laver du en nydelig C++ klasse som repræsenterer det synlige display
og en anden klasse der repræsenterer et vindue på det display.

Det er lavet mange gange !
Avatar billede arne_v Ekspert
07. december 2003 - 22:43 #7
cout tror jeg ikke duer.
Avatar billede arne_v Ekspert
07. december 2003 - 22:45 #8
Du skal nok have fat på Win32 API:

GetStdHandle
SetConsoleCursorPosition
WriteConsole

etc.
Avatar billede thomas_nj Nybegynder
07. december 2003 - 22:45 #9
Kan regne ud hvor du vil hen med x og y og txt men hvad mener du med forcol, backcol ??
Avatar billede athlon-pascal Juniormester
07. december 2003 - 22:46 #10
Foregroundcolor, Backgroundcolor, vel...
Avatar billede arne_v Ekspert
07. december 2003 - 22:46 #11
Jeps !
Avatar billede arne_v Ekspert
07. december 2003 - 22:51 #12
High level klasserne har så:

setforcol(int col);
setbackcol(int col);
write(int x, int y, char *txt);
line(int x1, int x2, int y1, int y2);
box(int x1, int x2, int y1, int y2);

display klassen regner i absolutte positioner på skærmen.

vindue klassen regner i relative positioner indenfor vinduet.

Der skal så lidt input på også.

1000 linier C++ så kan det faktisk begynde at se rigtigt godt ud.
Avatar billede arne_v Ekspert
07. december 2003 - 22:52 #13
Sådan noget lavede jeg for 15 år siden.

OK - i FORTRAN på VMS platform, men ...
Avatar billede thomas_nj Nybegynder
07. december 2003 - 22:53 #14
Nogen der kender den fornemmelse af at man er på vej ud hvor det bliver svært at bunde :)
Avatar billede arne_v Ekspert
07. december 2003 - 22:58 #15
Start fra bunden af.

Lav xwrite og test den i et lilel program.

Så laver du display klassen (absolutte koordinater i 24 x 80) og
tester den.

Og til sidst bygger du så vindues klasserne (hvor kooridnater er relative
i forhold til hvor vinduet er vist på displayet) og tester det.

Gradvis build op.
Avatar billede arne_v Ekspert
07. december 2003 - 23:00 #16
Lav vindues klasserne udfra at de ikke må overlappe.

Så kan du hvis du finder behov for det til sidst ændre dem til at
kunne ligge oven på og fjernes igen (og dte bagved så kommer til syne
igen).
Avatar billede thomas_nj Nybegynder
07. december 2003 - 23:00 #17
>>arne_v. Er detteher noget en nybegynder kan "knække halsen" på så at sige? (har leget meget lidt med win32)
Avatar billede arne_v Ekspert
07. december 2003 - 23:03 #18
kendskab til C/C++ syntax
+ lidt forståelse for programmering
+ em hel del timer
= godt resultat
Avatar billede arne_v Ekspert
07. december 2003 - 23:04 #19
Det vigtigste er at starte fornuftigt fra bunden af og ikke starte med
det mest indviklede.

Win32 API er ikke vigtigt - du skal kun bruge 4-8 funktioner ialt.
Avatar billede thomas_nj Nybegynder
07. december 2003 - 23:05 #20
lige en ting der undrer mig ved din xwrite. Hvorfor bruge int og ikke char til farver? int forcol, int backcol...
Med dem mener du der ikke de 2 farver man "mixer" for at få bagrundsfarven?
Avatar billede arne_v Ekspert
07. december 2003 - 23:07 #21
Jeg mente en konstant for rød, en for blå, en for grøn etc..
Jeg fandt det mest naturligt med int. Du kan også bruge enum. De metoder
jeg skitserede skal ikke tages så bogstavelige. Der er sikkert nogen
af dem detr skal have ændret lidt i argument listerne.
Avatar billede arne_v Ekspert
07. december 2003 - 23:08 #22
Jeg har det her eksempel liggende som illusterer console IO (relevant)
og tråde (sikkert ikke relevant):

#include <time.h>
#include <stdlib.h>
#include <string.h>

#include <windows.h>

CRITICAL_SECTION cs;
HANDLE console;

void gotoxy(int x,int y)
{
  COORD pos;
  pos.X = x;
  pos.Y = y;
  SetConsoleCursorPosition(console, pos);
}

void loop1()
{
  char c[] = { '|', '/', '-', '\\', '|', '/', '-', '\\' };
  int i = 0;
  while(true)
  {
      EnterCriticalSection(&cs); 
      gotoxy(40,10);
      DWORD dummy;
      WriteConsole(console, &c[i % 8], 1, &dummy, NULL);
      LeaveCriticalSection(&cs); 
      Sleep(1000);
      i++;
  }
}

void loop2()
{
  while(true)
  {
      EnterCriticalSection(&cs); 
      gotoxy(30,1);
      time_t t = time(NULL);
      DWORD dummy;
      char *s = ctime(&t);
      WriteConsole(console, s, strlen(s), &dummy, NULL);
      LeaveCriticalSection(&cs); 
      Sleep(1000);
  }
}

DWORD __stdcall loop1dispatch(void *p)
{
  loop1();
  return 0;
}

DWORD __stdcall loop2dispatch(void *p)
{
  loop2();
  return 0;
}

void threadloop1()
{
  DWORD id;
  CreateThread(NULL,0,loop1dispatch,NULL,0,&id);
}

void threadloop2()
{
  DWORD id;
  CreateThread(NULL,0,loop2dispatch,NULL,0,&id);
}

int main()
{
  system("CLS");
  console = GetStdHandle(STD_OUTPUT_HANDLE);
  InitializeCriticalSection(&cs); 
  threadloop2();
  loop1();
  return 0;
}
Avatar billede thomas_nj Nybegynder
07. december 2003 - 23:27 #23
Den rammer lige det jeg skal bruge. Tak for det arne gider du lægge et svar (går i seng nu så accepterer nok først i morgen)
Avatar billede arne_v Ekspert
08. december 2003 - 06:41 #24
svar
Avatar billede thomas_nj Nybegynder
08. december 2003 - 23:08 #25
havde næsten glemt dig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester