Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

Gelöst || Konsolengame beschleunigen?

Diskussion: Gelöst || Konsolengame beschleunigen? im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hey (: Bin neu hier und hab gleich ne Frage q: Also die Programmiersprache ist C++ und ich hab ...

Antwort
Alt 17.04.09, 16:33   #1 (permalink)
 
Registriert seit: 05.04.09
slightlyNERD Leistung: Facit NTK
Likes: 0
Gelöst || Konsolengame beschleunigen?

Anzeige

Hey (:
Bin neu hier und hab gleich ne Frage q:
Also die Programmiersprache ist C++ und ich hab ein pseudo-Konsolengame gemacht, das später evtl. auch noch ausgebaut wird. Wollte eig. nur mal sehen, wie man in C++ i-welche ASCII-Zeichen in nem Char-Array bewegt.

Achja:
Entwicklungsumgebung: Dec-C++ (und der dazugehörige Compiler)
OS: Windows

Also, hier erstmal der Code: (Und habt Nachsicht, ich programmiere erst seid kurzem c++)

C++-Code   

Code:
#include <windows.h>
#include <Winuser.h>
#include <string>
#include <fstream>
#include <iostream> 

using namespace std;

string Ende(){
       system("cls");
       cout << "Gewonnen" << endl;
       system("PAUSE");
       return 0;
       };
       

int main()
{
 //Feldgroesse:
    int y = 20;
    int x = 40;    

    char Feld[y][x];
 //Feld füllen:    
    for (int j=0; j<y; ++j){
             for (int i=0; i<x; ++i){
                   Feld[j][i] = '.';
             }
    }
    
    for (int k=0; k<y; ++k){
        Feld[k][x-1] = '\0';
        }

    //Startposition festlegen
    int Sy = 1;
    int Sx = 1;
    Feld[Sy][Sx] = 'o';
    
    //Ziel festlegen
    Feld[15][30] = 'Z';
    
    
    
    //Feld ausgeben
    for (int z=0; z<y; ++z){
        cout << Feld[z] << endl;
        }
    
    
  while(1)
    {
        //Verhindert CPU Auslastung 5ms sleep
        Sleep(5);

        
        //Tasten einlesen
        
        for(int i = 8; i < 191; i++)
        {
           if(GetAsyncKeyState(i)&1 ==1)
           {
                if (i == 87){
                      //Taste "W" gedrückt
                      
                      if (Sy != 0){
                      if (Feld[Sy-1][Sx] == 'Z'){
                                         Ende();
                                         }
                      Feld[Sy-1][Sx] = 'o';
                      Feld[Sy][Sx] = '.';
                      Sy = Sy -1;
                      
                      //neues Feld ausgeben
                       system("cls");
                       for (int z=0; z<y; ++z){
                          cout << Feld[z] << endl;
                       }
                      }  
                  }
                if (i == 65) {
                      //Taste "A" gedrückt
                      if (Sx != 0){
                      if (Feld[Sy][Sx-1] == 'Z'){
                                         Ende();
                                         }
                      Feld[Sy][Sx-1] = 'o';
                      Feld[Sy][Sx] = '.';
                      Sx = Sx -1;
                      
                      //neues Feld ausgeben
                       system("cls");
                       for (int z=0; z<y; ++z){
                          cout << Feld[z] << endl;
                          }
                       }                      
                      }
                if (i == 83){
                      //Taste "S" gedrückt
                      if(Sy != y-1) {
                      if (Feld[Sy+1][Sx] == 'Z'){
                                         Ende();
                                         }
                      Feld[Sy+1][Sx] = 'o';
                      Feld[Sy][Sx] = '.';
                      Sy = Sy +1;
                      
                      //neues Feld ausgeben
                       system("cls");
                       for (int z=0; z<y; ++z){
                          cout << Feld[z] << endl;
                          }
                       }
                      }
                if (i == 68) {
                      //Taste "D" gedrückt                 
                      if(Sx != x-2){
                      if (Feld[Sy][Sx+1] == 'Z'){
                                         Ende();
                                         }
                      Feld[Sy][Sx+1] = 'o';
                      Feld[Sy][Sx] = '.';
                      Sx = Sx +1;
                      
                      //neues Feld ausgeben
                       system("cls");
                       for (int z=0; z<y; ++z){
                          cout << Feld[z] << endl;
                                     }
                                               }
                       
                       }

           }
           }        
        }
    }


Steuerung ist WASD (:

So: mein Problem ist jetzt, dass ich das Array "Feld" bei jedem Tastendruck komplett erneut ausgeben muss, damit sich das Bild aktualisiert. Aber deswegen is das Spiel auch ziemlich langsam und in der Konsole sieht man oft ein "flackern" (also bei mir auf jedenfall ).
Meine Frage wär jetzt, wie man das ganze beschleunigen könnte, dass man das Array nicht immer neu laden muss.

Wär nett, wenn jmd. Bescheid weiß :P

slightlyNERD (:
slightlyNERD ist offline   Mit Zitat antworten
Alt 17.04.09, 17:32   #2 (permalink)
 
Registriert seit: 12.01.09
lone.wolf Leistung: Z3
lone.wolf eine Nachricht über AIM schicken
Likes: 1
Standard

Ganz einfach -> Vor dem kompilieren atmest du tief Luft ein; dann sagst du gaaanz laut "Hokus Pokus .. widibus" und kompilierst

xD

Ne sorry

ALso ich würd das so machen, dass ich ne extra Matrix anlege, die die alten Eingaben (Chars) beinhaltet. Dann würde ich einfach vor dem Zeichnen prüfen, ob die Stellen mit der Matrix gleich sind -> falls ja, dann nicht schreiben ansonsten ganz normal schreiben
Ich weiß jetzt aber nicht, ob es in C++ GotoXY usw gibt...

MfG
lone.wolf ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 17.04.09, 17:36   #3 (permalink)
 
Benutzerbild von Extinction
 
Registriert seit: 02.01.07
Extinction Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Ich weiß jetzt aber nicht, ob es in C++ GotoXY usw gibt...
Ja, gibt es. Haupttodesursache von Programmierern, da dies oft die Steinigung durch andere Programmierer bewirkt...
Extinction ist offline   Mit Zitat antworten
Alt 17.04.09, 17:37   #4 (permalink)
 
Benutzerbild von bad_alloc
 
Registriert seit: 27.12.07
bad_alloc Leistung: 8086
Likes: 39
Standard

Zitat:
Ich weiß jetzt aber nicht, ob es in C++ GotoXY usw gibt...
gibt es, aber das ist schlechter stil.

@slightlyNERD:
hast du auch alle optimierungen des compilers angeschaltet?
__________________
You shoot yourself in somebody else's foot.|Dann gabs da noch den Mathematiker der P?=NP in O(1) erklärte.
|[A]| = p(·,|[A]|)+1
bad_alloc ist offline   Mit Zitat antworten
Alt 17.04.09, 17:40   #5 (permalink)
Themenstarter
 
Registriert seit: 05.04.09
slightlyNERD Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von Extinction
Zitat:
Ich weiß jetzt aber nicht, ob es in C++ GotoXY usw gibt...
Ja, gibt es. Haupttodesursache von Programmierern, da dies oft die Steinigung durch andere Programmierer bewirkt...
Ja Spitze (:
Also, ich möchte schon noch bisschen leben
Bin doch noch sooo jung

Ja, kay, und wenn ich kein gotoxy verwenden darf/ will?


@bad_alloc:
Jetzt schon (:
Danke, ist schonmal bisschen besser, aber flackert trotzdem noch bisschen (:
slightlyNERD ist offline   Mit Zitat antworten
Alt 17.04.09, 17:55   #6 (permalink)
 
Benutzerbild von bad_alloc
 
Registriert seit: 27.12.07
bad_alloc Leistung: 8086
Likes: 39
Standard

Ich nehme an du willst direkt Zeichen auf der Konsole ersetzten. In C++ geht das meines Wissens nach nicht, da müsstest du bei C# oder VB gucken.
Allerdings gibt es auch spezielle Bibliotheken für "Konsolen - GUIs" für einige Skripsprachen (c't 3/08?). Möglicherweise hat jemand soetwas für C++ portiert.

EDIT: giFT wäre eine Möglichkeit unter Unix, für Windows musst du ggf etwas suchen.
__________________
You shoot yourself in somebody else's foot.|Dann gabs da noch den Mathematiker der P?=NP in O(1) erklärte.
|[A]| = p(·,|[A]|)+1
bad_alloc ist offline   Mit Zitat antworten
Alt 18.04.09, 15:53   #7 (permalink)
 
Registriert seit: 22.10.05
farhaven Leistung: Z3
Likes: 3
Standard

Ich gehe mal davon aus, dass mit GotoXY nicht das aus BASIC bekannte GOTO mit Sprungmarken gemeint ist (das hätte den schlimmsten Tod verdient), sondern eine Routine zum Setzen der Cursorposition (die heisst z.B. in nCurses auch gotoxy(int, int)). Wenn die Windows Kommandozeile VT100 kompatibel ist, kannst du einfach ein
Code:
 printf("%c[%02d;%02df", 0x1b, y, x);
benutzen, um die Position des Cursors zu setzen, y und x sind dabei halt vorzeichenlose Ganzzahlen die die Spalte und Zeile angeben,(1,1) ist dabei oben links.

Der Code stammt aus einem Projekt von mir, dass allerdings in C geschrieben ist, evtl. gibts da für C++ noch schönere Arten, das auszudrücken
farhaven ist offline   Mit Zitat antworten
Alt 18.04.09, 16:02   #8 (permalink)
 
Registriert seit: 08.03.07
loose Leistung: Z3
Likes: 1
Standard

Das setzen der Cursorposition unter Windows geht am einfachsten mit der API Funktion SetConsoleCursorPosition.
Ein Codebeispiel dazu hat Google hier gefunden.
loose ist offline   Mit Zitat antworten
Alt 18.04.09, 19:43   #9 (permalink)
Themenstarter
 
Registriert seit: 05.04.09
slightlyNERD Leistung: Facit NTK
Likes: 0
Standard RE: Konsolengame beschleunigen?

DAAAAAANKE, loose (:
Jetzt klappts prima.

Ich hab jetzt mal den Anfang von "Console Space Invaders" draus gmacht (:

Der Code:

c++-Code   

Code:
#include <windows.h>
#include <Winuser.h>
#include <string>
#include <fstream>
#include <iostream> 
#include <stdio.h>
#include <conio.h>

using namespace std;


void gotoxy( int column, int line )
  {
  COORD coord;
  coord.X = column;
  coord.Y = line;
  SetConsoleCursorPosition(
    GetStdHandle( STD_OUTPUT_HANDLE ),
    coord
    );
  }

int wherex()
  {
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  COORD                      result;
  if (!GetConsoleScreenBufferInfo(
         GetStdHandle( STD_OUTPUT_HANDLE ),
         &csbi
         ))
    return -1;
  return result.X;
  }

int wherey()
  {
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  COORD                      result;
  if (!GetConsoleScreenBufferInfo(
         GetStdHandle( STD_OUTPUT_HANDLE ),
         &csbi
         ))
    return -1;
  return result.Y;
  }


int main()
{
 //Feldgroesse:
    int y = 20;
    int x = 40;    

    char Feld[y][x];
 //Feld füllen:    
    for (int j=0; j<y; ++j){
             for (int i=0; i<x; ++i){
                   Feld[j][i] = ' ';
             }
    }
    
    for (int k=0; k<y; ++k){
        Feld[k][x-1] = '\0';
        }

    //Startposition festlegen
    int Sy = y-1;
    int Sx = x/2-3; 
    
    Feld[Sy][Sx] = '/';
    Feld[Sy][Sx+1] = '%';
    Feld[Sy][Sx+2] = '%';
    Feld[Sy][Sx+3] = '\\';
    Feld[Sy-1][Sx+1] = '|';
    Feld[Sy-1][Sx+2] = '|';
    Feld[Sy-2][Sx+1] = '/';
    Feld[Sy-2][Sx+2] = '\\';
    
  
    
    
    //Feld ausgeben
    for (int z=0; z<y; ++z){
        cout << Feld[z] << endl;
        }
    
    
  while(1)
    {
        //Verhindert CPU Auslastung 5ms sleep
        Sleep(5);

        
        //Tasten einlesen
        
        
        for(int i = 8; i < 191; i++)
        {
           if(GetAsyncKeyState(i)&1 ==1)
           {
                if (i == 65) {
                      //Taste "A" gedrückt
                  if (Sx != 0)
                  {
                      gotoxy(Sx-1,Sy);
                      cout << "/%%\\ ";
                      gotoxy(Sx,Sy-1);
                      cout << "|| ";
                      gotoxy(Sx,Sy-2);
                      cout << "/\\ ";
                      gotoxy(0,y);
                      --Sx;
                  }
                }
                      
                      
                if (i == 68) {
                      //Taste "D" gedrückt                 
                  if(Sx != x-5){
                      gotoxy(Sx,Sy);
                      cout << " /%%\\";
                      gotoxy(Sx+1,Sy-1);
                      cout << " ||";
                      gotoxy(Sx+1,Sy-2);
                      cout << " /\\";
                      gotoxy(0,y);
                      ++Sx;
                        }
                    }

                  if (i == 32) {
                      //Leertaste gedrückt
                      int bx = Sx;
                      int by = Sy;
                      gotoxy(bx+1,by-3);
                      cout << "**";
                      
                      for(int i=4; i<y; ++i)
                      {
                      Sleep(20);
                      gotoxy(bx+1,by-4);
                      cout << "**";
                      gotoxy(bx+1,by-3);
                      cout << "  ";
                      --by;
                      }
                      gotoxy(Sx+1,0);
                      cout << "  ";
                      gotoxy(0,y);
                      //bullet Bullet erstellen und Bullet.shoot mit koordinaten aufrufen!
                      }
                   }
                 }        
    }
}


Find ich bis jetz eig. ganz okay (:

Aaaaaaaber:
Ich kann mich jetzt, während ich schieße, nicht bewegen und nicht nochmal schießen... Is ja auch klar.
Hatte auch schon mal die ganze Tastaturabfrage wieder in die "for-Schleife" kopiert.
Find ich aber doof.
Kann man das nicht i-wie ganz leicht, durchsichtig und auch noch rel. elegant lösen.
Vllt. mit ner Funktion (Tastenabfrage) und dann per Rekursion immer wieder auf sich selbst zugreifend? Nja, weiß nich genau. Aber habt ihr ne Idee, wies möglichst einfach geht?
Danke.

Und noch kurz was: Wo ist eig. der Unterschied zwischen "cout << " "; " und " printf(""); " ?

slightlyNERD
slightlyNERD ist offline   Mit Zitat antworten
Alt 18.04.09, 19:47   #10 (permalink)
 
Registriert seit: 07.03.08
90nop Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Wo ist eig. der Unterschied zwischen "cout << " "; " und " printf(""); " ?
Wo ist der Unterschied zwischen C und C++?
90nop ist offline   Mit Zitat antworten
Alt 18.04.09, 20:20   #11 (permalink)
Themenstarter
 
Registriert seit: 05.04.09
slightlyNERD Leistung: Facit NTK
Likes: 0
Standard

Ah, okay (:
Hab ich mir schon i-wie gedacht.
Aber ich fands immer komisch, dass man, wenn man nach nem c++-code fragt, oft i-was mit "printf" sieht oder in nem c++-board was von printf steht.

Das find ich eh immer blöd, dass das alles vermischt wird. (C/C++)
slightlyNERD ist offline   Mit Zitat antworten
Alt 19.04.09, 15:04   #12 (permalink)
 
Registriert seit: 22.10.05
farhaven Leistung: Z3
Likes: 3
Standard

Naja, C++ ist halt eine Übermenge von C, und da die meisten Leute, die mit C++ rumturnen, vorher C gelernt haben, benutzen sie die Sachen, die sie dort gelernt haben, weiter.
farhaven ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Gelöst || Konsolengame beschleunigen?
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Firefox beschleunigen Mackz Hardware Mods 42 28.07.06 09:38
gelöst k00ky Cryptography & Encryption 5 01.07.06 12:02
d lan [gelöst] [starfoxx] Network · LAN, WAN, Firewalls 7 19.06.06 21:06
den zugriff auf microsoft netzerke beschleunigen #zed_law Network · LAN, WAN, Firewalls 3 01.07.03 20:26
System Start und Runterfahren beschleunigen? gphoenix Windows 4 23.09.02 21:59


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