Вот диковинка из прошлого!
Я пишу игру ASCII Pong для командной строки (да, старая школа), и я пишу напрямую в видеопамять (доп. 0xB8000000), поэтому я знаю, что рендеринг выполняется быстро (в отличие от gotoxy, а затем рендеринга printf)
Мой код работает нормально, код отлично компилируется под Turbo C ++ V1.01, НО анимация тормозит ... теперь подождите, подождите, есть кавает! Под моим супербыстрым турбонаддувом Dell Core 2 Duo это кажется логичным, однако, когда я держу клавишу на клавиатуре, анимация становится плавной, как нижняя часть только что скомпилированного ребенка.
Я подумал, что, может быть, это произошло из-за того, что я замедлял работу компьютера, перегружая буфер клавиатуры (ну что ж, да ладно ...), но потом я быстро поумнел и попытался скомпилировать для DJGPP и Tiny C Compiler, чтобы проверить, совпадают ли результаты . На Tiny C Compiler я обнаружил, что не могу компилировать "дальние" типы указателей ... все еще запутался в этом, но я смог скомпилировать для DJGPP, и анимация прошла гладко!
Я хочу скомпилировать это и заставить его работать для Turbo C ++, но эта проблема беспокоит меня последние 3 дня и не может быть решена. Кто-нибудь знает, почему постоянные вызовы Turbo C ++ моего метода рендеринга (код ниже) будут задерживаться в командной строке, а DJGPP - нет? Я не знаю, компилирую я как отладку или нет, я даже не знаю, как это проверить. Я преобразовал код в ASM, и я увидел то, что выглядело как отладочные данные в заголовке источника, поэтому я не знаю ...
Будем очень благодарны за любые комментарии и помощь!
Вот краткий пример того, с чем я столкнулся, простой для компиляции, поэтому, пожалуйста, ознакомьтесь с ним:
#include<stdio.h>
#include<conio.h>
#include<dos.h>
#include<time.h>
#define bX 80
#define bY 24
#define halfX bX/2
#define halfY bY/2
#define resolution bX*bY
#define LEFT 1
#define RIGHT 2
void GameLoop();
void render();
void clearBoard();
void printBoard();
void ballLogic();
typedef struct {
int x, y;
}vertex;
vertex vertexWith(int x, int y) {
vertex retVal;
retVal.x = x;
retVal.y = y;
return retVal;
}
vertex vertexFrom(vertex from) {
vertex retVal;
retVal.x = from.x;
retVal.y = from.y;
return retVal;
}
int direction;
char far *Screen_base;
char *board;
vertex ballPos;
void main() {
Screen_base = (char far*)0xB8000000;
ballPos = vertexWith(halfX, halfY);
direction = LEFT;
board = (char *)malloc(resolution*sizeof(char));
GameLoop();
}
void GameLoop() {
char input;
clrscr();
clearBoard();
do {
if(kbhit())
input = getch();
render();
ballLogic();
delay(50);
}while(input != 'p');
clrscr();
}
void render() {
clearBoard();
board[ballPos.y*bX+ballPos.x] = 'X';
printBoard();
}
void clearBoard() {
int d;
for(d=0;d<resolution;d++)
board[d] = ' ';
}
void printBoard() {
int d;
char far *target = Screen_base+d;
for(d=0;d<resolution;d++) {
*target = board[d];
*(target+1) = LIGHTGRAY;
++target;
++target;
}
}
void ballLogic() {
vertex newPos = vertexFrom(ballPos);
if(direction == LEFT)
newPos.x--;
if(direction == RIGHT)
newPos.x++;
if(newPos.x == 0)
direction = RIGHT;
else if(newPos.x == bX)
direction = LEFT;
else
ballPos = vertexFrom(newPos);
}