C++ ASCII Art?

Feb 9, 2012 at 1:48am
so im making an intro for an console app for school, and want to show some cool ASCII art effects. Like something like this:
____________________________
!\_________________________/!\
!! !! \
!! !! \
!! !! !
!! !! !
!! !! !
!! !! !
!! !! !
!! !! /
!!_________________________!! /
!/_________________________\!/
__\_________________/__/!_
!_______________________!/ )
________________________ (__
/oooo oooo oooo oooo /! _ )_
/ooooooooooooooooooooooo/ / (_)_(_)
/ooooooooooooooooooooooo/ / (o o)
/C=_____________________/_/ ==\o/==



I want it to go from left to right, almost like it is typing it simultaneiously, im not sure what that effect is called... im sure the sleep function would have to be called, but i dont know how to go about doing it...

thanks!
Feb 9, 2012 at 2:23am
For a more 'manipulation' of the font, color and other stuff, try using the 'windows.h' library and use the functions for manipulate the console attribute. For example:
1
2
3
4
GetConsoleCursorPosition(...)  // get the position X and Y of the cursor
SetConsoleCursorPosition(..)  // set the position X and Y of the cursor
SetConsoleTextAttribute(..)  // set attributes of console text , such as the color, font, dimension, ecc.
ScrollConsoleScreenBuffer(...)  // move a part of the console in a new position 

For more information about this: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx
Feb 9, 2012 at 2:37am
thanks! can you give some examples for the functions? specially SetconsoleSetAttribute
Feb 9, 2012 at 3:07am
Sure. I've used them for a program of Bingo where i print the value in 'red' if extracted , 'white' if none. The protorype of SetConsoleTextAttribute is:
 
BOOL WINAPI SetConsoleTextAttribute( HANDLE hConsoleOutput, WORD wAttributes);

the function return true if succeeds, false in other case. The parameters for use the function are:
- hConsoleOutput, is of type HANDLE and is, in your case, the handle of STDOUT of the console. You can retrieve it by calling the function:
1
2
3
4
HANDLE WINAPI GetStdHandle(DWORD nStdHandle) //you can retrieve the handle of STDIN, STDOUT or STDERR setting the parameter of function to one of these:
                                                                                //STD_OUTPUT_HANDLE for stdout
                                                                                //STD_INPUT_HANDLE  for stdin
                                                                                //STD_ERROR_HANDLE  for stderr 

- wAttributes, is of type WORD and it can be a combination of Foreground and Background colors of the system:
- for the Foreground color there are tree costant values that you can use: FOREGROUND_RED , FOREGROUND_BLUE , FOREGROUND_GREEN , FOREGROUND_INTENSITY. For istance, if you would set the color of the text 'red' and the background 'white':
1
2
HANDLE stdOut=GetStdHandle(STD_OUTPUT_HANDLE);  //retrieve the handle of stdout first
SetConsoleTextAttribute(stdOut,FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY); //use the handle of stdout in the function and the 'OR-ed' constants for the 'red' text (FOREGROUND_RED) plus the background 'white' (BACKGROUND_RED,BACKGROUND_BLUE,BACKGROUND_GREEN, BACKGROUND_INTENSITY) 
Feb 13, 2012 at 4:35pm

So this is just a little badly structured game that demos output.
Not very relative, but you can salvage.
Image is stored in 2d array, if you want to have the 'typing effect' have two for loops output one char at a time then Sleep(5) note Sleep() is a Windows.h func

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204

//just some usefull includes for game components
#include <iostream>
#include <Windows.h>
#include <math.h>
#include <stdio.h>
#include <ctime>
#include <cstdlib>
#include <string.h>//for the memcopy call
#include <fstream>
#include <string>
#include <sstream>
#include <random>
#include <ctime>
using namespace std;

HANDLE handle= GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE  hConsole;


void Printer();
void DoStuff();
int TryX;
int TryY;
const int SizeY=30;
const int SizeX=30;
const COORD Newpos = {0,0};
int MyX=5;
int MyY=5;
int DirX=0;
int DirY=0;
bool Jump=false;
int JumpStage=0;
//global map so data isnt coppied between functions 
int MyMap[SizeY][SizeX]=
{
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,4,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,5,5,0,0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,5,0,0,0,0,0,0,0,4,4,4,4,4,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,4,0,0,3,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,5,5,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,5,5,5,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}



};
int OutputMap[SizeY][SizeX];

//colour, char
int Materials[10][3]=
{
//sky blue
	{177,27},
//person
	{2,189},
//mud
	{177,100},
//stump
	{186,64},
//leaves
	{208,42},
//platform
	{203,120},
};




int main()
{
	while (true)
	{
		//memcopy is a fast way to copy 2d arrays, this line refreshes output to MyMap
		memcpy(OutputMap,MyMap,sizeof(MyMap)); 
		
		DoStuff();
		Printer();
		Sleep(5);
	}
}





void Printer()
{
        //this sets the location for output, note it dosent clear but replaces screen, this is faster
        //than the horrible system ("CLS")
	SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), Newpos );
	for (int ItterY=0;ItterY<SizeY-1;ItterY++)
	{
		for (int ItterX=0;ItterX<SizeX-1;ItterX++)
		{
			SetConsoleTextAttribute( handle, Materials[OutputMap[ItterY][ItterX]][1]);
			cout<< char(Materials[OutputMap[ItterY][ItterX]][0]);
		}
		cout << endl;
	}


}


void DoStuff()
{




	DirX=0;
	DirY=0;
	TryX=0;
	TryY=0;
	
	if (GetAsyncKeyState(VK_LEFT))
	{
		DirX-=1;
		TryX-=1;
		//right
	}
	else if (GetAsyncKeyState(VK_RIGHT))
	{
		TryX+=1;
		DirX+=1;
	}
		//down
	if (GetAsyncKeyState(VK_UP))
	{
		DirY-=1;
		if (OutputMap[MyY+1][MyX]!=0)
		Jump=true;
	}
		//up
	else if (GetAsyncKeyState(VK_DOWN))
		DirY+=1;
	//check on map and on air 




	if ((MyY+TryY<SizeY) && (MyX+TryX<SizeX) && (MyY+TryY>0) &&(MyX+TryX>0)&&(OutputMap[MyY+TryY][MyX+TryX]==0))
	{
		MyX+=TryX;
		MyY+=TryY;
	}
	//gravity

	if (Jump==true)
	{
		JumpStage+=1;
        if(OutputMap[MyY-1][MyX]==0 && MyY>=0)
			MyY-=2;
		else
			Jump=false;

		if (JumpStage==5)
		{
			Jump=false;
			JumpStage=0;
		}
	}




	if (OutputMap[MyY+1][MyX]==0)
		MyY+=1;

	OutputMap[MyY][MyX]=1;
	if (GetAsyncKeyState(32))
		MyMap[MyY+DirY][MyX+DirX]=0;
	else if (GetAsyncKeyState(65))
		if(OutputMap[MyY+1][MyX]!=0)
			MyMap[MyY][MyX]=2;
	cout << OutputMap[MyY+1][MyX];
}


Topic archived. No new replies allowed.