過去の異変がここに!
私はコマンド プロンプト用の ASCII Pong ゲームを作成しており (はい、古い学校です)、ビデオ メモリに直接書き込んでいます (Add. 0xB8000000)。
私のコードは正常に動作し、コードは Turbo C++ V1.01 の下で正常にコンパイルされますが、アニメーションが遅れます... ちょっと待ってください。私の超高速ブースト ターボ Dell Core 2 Duo では、これは論理的に思えますが、キーボードのキーを押したままにすると、新しくコンパイルされた赤ちゃんのおしりのようにアニメーションがスムーズになります。
キーボード バッファーをオーバーロードしてコンピューターの速度を落としていたからかもしれないと思ったのですが (本当に? 来てください...)、すぐに頭を切り替えて、DJGPP と Tiny C Compiler をコンパイルして、結果が同じかどうかをテストしてみました。 . Tiny C Compiler では、「far」ポインター型をコンパイルできないことがわかりました...まだ混乱していましたが、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);
}