Jump to content

  • Log In with Google      Sign In   
  • Create Account


#ActualEdvinas Kilbauskas

Posted 11 August 2013 - 11:48 AM

 

If stdout supports ANSI escape codes (e.g. the terminals on *nix or DOS with ANSI.SYS) you could use the escape codes for even more interesting stuff without moving away from the standard library. Colors everywhere!

 

I've been having so much fun with those lately, they are really easy to use as well. Shame they aren't 100% portable, though. I know there's ncurses (and its Windows counterpart PDCurses) but sometimes you just want colors here and there without engineering a complete user interface solution.

 

Dude, ncurses is as easy as or even easier than standart cout in C++. You don't need to engineer complete UI interface or nothing.

Some guy on youtube was interested in this game, and said I should rewrite it in ncurses, so I began working on it.

Look my simple graphics class, which works very well, you can use it too, if you want to.

// GraphicsSystem.h


#ifndef GRAPHICSSYSTEM_H
#define GRAPHICSSYSTEM_H


class GraphicsSystem
{
private:
    static const int SCREEN_WIDTH = 79;
    static const int SCREEN_HEIGHT = 24;
    char m_frameBuffer[SCREEN_WIDTH][SCREEN_HEIGHT];

    void renderBuffer();
public:
    GraphicsSystem();
    ~GraphicsSystem();

    void clearFramebuffer();
    void renderPixel(int x, int y, char ch);
    void render();
    int getScreenWidth();
    int getScreenHeight();
};

#endif // GRAPHICSSYSTEM_H


//--------------------------------------------------------------
//GraphicsSystem.cpp


#include <curses.h>
#include "GraphicsSystem.h"

GraphicsSystem::GraphicsSystem()
{
	clearFramebuffer();
	initscr();
	cbreak();
	timeout(50);
	keypad(stdscr, TRUE);
}

GraphicsSystem::~GraphicsSystem()
{
    endwin();
}

void GraphicsSystem::render()
{
    wclear(stdscr);
    renderBuffer();
    clearFramebuffer();
    wrefresh(stdscr);
}

int GraphicsSystem::getScreenWidth(){
    return SCREEN_WIDTH;
}

int GraphicsSystem::getScreenHeight(){
    return SCREEN_HEIGHT;
}

void GraphicsSystem::renderPixel(int x, int y, char ch)
{
    m_frameBuffer[x][y] = ch;
}

void GraphicsSystem::renderBuffer()
{
    for(int y = 0; y < SCREEN_HEIGHT; y++)
        for(int x = 0; x < SCREEN_WIDTH; x++)
        {
            mvwaddch(stdscr, y, x, m_frameBuffer[x][y]);
        }
}

void GraphicsSystem::clearFramebuffer()
{
    for(int y = 0; y < SCREEN_HEIGHT; y++)
        for(int x = 0; x < SCREEN_WIDTH; x++)
        {
            m_frameBuffer[x][y] = ' ';
        }
}



And you can draw stuff with ease just like this:

#include <curses.h>
#include <cstdlib>
#include <cmath>
#include "GraphicsSystem.h"

GraphicsSystem graphicsSystem;

int main()
{
    while(true){
        for(int x = 0; x < graphicsSystem.getScreenWidth(); x++)
        {
            for(int y = 0; y < graphicsSystem.getScreenHeight(); y++)
            {
                graphicsSystem.renderPixel(x,y,'x'); // render char 'x', or "pixel" on the screen
            }
        }
        graphicsSystem.render(); //clears screen, and displays all chars
    }
	return 0;
}


#1Edvinas Kilbauskas

Posted 11 August 2013 - 11:46 AM

 

If stdout supports ANSI escape codes (e.g. the terminals on *nix or DOS with ANSI.SYS) you could use the escape codes for even more interesting stuff without moving away from the standard library. Colors everywhere!

 

I've been having so much fun with those lately, they are really easy to use as well. Shame they aren't 100% portable, though. I know there's ncurses (and its Windows counterpart PDCurses) but sometimes you just want colors here and there without engineering a complete user interface solution.

 

Dude, ncurses is as easy as or even easier than standart cout in C++. You don't need to engineer complete UI interface or nothing.

Some guy on youtube was interested in this game, and said I should rewrite it in ncurses, so I began working on it.

Look my simple graphics class, which works very well, you can use it too, if you want to.

// GraphicsSystem.h


#ifndef GRAPHICSSYSTEM_H
#define GRAPHICSSYSTEM_H


class GraphicsSystem
{
private:
    static const int SCREEN_WIDTH = 79;
    static const int SCREEN_HEIGHT = 24;
    char m_frameBuffer[SCREEN_WIDTH][SCREEN_HEIGHT];

    void renderBuffer();
public:
    GraphicsSystem();
    ~GraphicsSystem();

    void clearFramebuffer();
    void renderPixel(int x, int y, char ch);
    void render();
    int getScreenWidth();
    int getScreenHeight();
};

#endif // GRAPHICSSYSTEM_H


//--------------------------------------------------------------
//GraphicsSystem.cpp


#include <curses.h>
#include "GraphicsSystem.h"

GraphicsSystem::GraphicsSystem()
{
	clearFramebuffer();
	initscr();
	cbreak();
	timeout(50);
	keypad(stdscr, TRUE);
}

GraphicsSystem::~GraphicsSystem()
{
    endwin();
}

void GraphicsSystem::render()
{
    wclear(stdscr);
    renderBuffer();
    clearFramebuffer();
    wrefresh(stdscr);
}

int GraphicsSystem::getScreenWidth(){
    return SCREEN_WIDTH;
}

int GraphicsSystem::getScreenHeight(){
    return SCREEN_HEIGHT;
}

void GraphicsSystem::renderPixel(int x, int y, char ch)
{
    m_frameBuffer[x][y] = ch;
}

void GraphicsSystem::renderBuffer()
{
    for(int y = 0; y < SCREEN_HEIGHT; y++)
        for(int x = 0; x < SCREEN_WIDTH; x++)
        {
            mvwaddch(stdscr, y, x, m_frameBuffer[x][y]);
        }
}

void GraphicsSystem::clearFramebuffer()
{
    for(int y = 0; y < SCREEN_HEIGHT; y++)
        for(int x = 0; x < SCREEN_WIDTH; x++)
        {
            m_frameBuffer[x][y] = ' ';
        }
}



And you can draw stuff with ease just like this:

#include <curses.h>
#include <cstdlib>
#include <cmath>
#include "GraphicsSystem.h"

GraphicsSystem graphicsSystem;

int main()
{
        for(int x = 0; x < graphicsSystem.getScreenWidth(); x++)
        {
            for(int y = 0; y < graphicsSystem.getScreenHeight(); y++)
            {
                graphicsSystem.renderPixel(x,y,'x'); // render char 'x', or "pixel" on the screen
            }
        }
        graphicsSystem.render(); //clears screen, and displays all chars
	}
	return 0;
}


PARTNERS