CUIゲームでの画面クリアなどに関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
山崎

CUIゲームでの画面クリアなどに関して

#1

投稿記事 by 山崎 » 15年前

いつもお世話になっております、山崎です。

先週から、ライブラリを用いずにコマンドプロンプト上で動くような
簡単なゲームを作ってみようかなと考えております。
画像ファイルを用いずに、文字だけで表現する感じです。

OSはXP、VisualStudio2010を使っています。

画面に描かれたものをすべて消去し、また必要なものを書く、
という処理を毎フレーム行おうと考えています
(フレームという言葉で合っているかどうかわかりませんが)。

まずは1秒間にメインループを実行する回数を揃えていこうと思い、
以下のコードを試しに書いて実行しました。
60回ループし、1回ループを実行するのにかかる平均tick数を表示するだけのプログラムです。
CLOCKS_PER_SECは1000だったので、1tick=1msecだと思います。

DXライブラリのように約60fps、1フレームを約16msecで処理したいと考えています。
実行してみたところ、計測される部分の行数は大したことがないはずなのに、
1回のループに36~45tickもかかってしまいました。

この「メインループで毎回system(“cls”)で画面のクリアを行う」という方式では、
Fps60のゲームを作ることは難しいでしょうか。
または、このようなコマンドプロンプトと文字だけのゲームを作るには
どのような方式(画面のクリアや画面出力に関して)をとるのがよいでしょうか。
よろしければご意見をお聞かせください。
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

#include "Screen.h"

int main()
{
    char KeyCode=' ';
    clock_t StartFrameTime,FrameTime;

    int count=0;
    long total=0;
    int ave=0;

    while(KeyCode!=27)    //エスケープキーが押されるまで繰り返す
    {
        StartFrameTime=clock();
        system("cls");    //画面のクリア
        
        if(kbhit()!=0)
            KeyCode=getch();    //処理を止めずにキー入力を得る
        
        FrameTime=clock()-StartFrameTime;
        total=total+FrameTime;
        printf("ave=%d\n",ave);
        if(count==60)
        {
            ave=total/60;
            count=0;
            total=0;
            
        }
        count++;

        if(FrameTime<16)
            Sleep(16-FrameTime);
    }

    return 0;
}
画像

バグ

Re:CUIゲームでの画面クリアなどに関して

#2

投稿記事 by バグ » 15年前

コンソールアプリで毎フレーム書き換えするのは厳しいでしょうね。
必要な部分だけを書き換えるなど、別の方法を検討した方がいいかと思います。

たいちう

Re:CUIゲームでの画面クリアなどに関して

#3

投稿記事 by たいちう » 15年前

> この「メインループで毎回 system(“cls”)で画面のクリアを行う」という方式では、
> Fps60のゲームを作ることは難しいでしょうか。
> または、このようなコマンドプロンプトと文字だけのゲームを作るには
> どのような方式(画面のクリアや画面出力に関して)をとるのがよいでしょうか。
> よろしければご意見をお聞かせください。

コマンドプロンプトへの出力も結構重いですからね。
そもそも画面をクリアしてから再描画を行うとちらつくと思いますが、
これはかまわないのですか?
あまり見栄えが良くなくてもかまわないならば、
FPSももっと小さくて良いのでは?

> または、このようなコマンドプロンプトと文字だけのゲームを作るには

文字だけとはいえ、きれいに動くゲームを作りたいならば、
普通にウィンドウを作ってTextOutやDrawTextで表示してはいかがかと。

山崎

Re:CUIゲームでの画面クリアなどに関して

#4

投稿記事 by 山崎 » 15年前

バグさん、たいちうさん、ご返信誠にありがとうございます。

やはり、コンソールアプリケーションでそれなりのfpsを出すのは難しいのですね。
DXライブラリを使った場合のようには行かないのですね…いや勉強になりました。

ちらつきの解決については後回しにしようと思っておりました。
なるべくならどうにかしたいですが、
どうにもならないようならちらついても仕方ないかな、と考えてました。

とりあえずコンソールのゲームを作るには、
・fpsは多少低くなっても我慢する
・必要な部分だけ書き換えるようにする
という方式をとろうと思います。

ご意見、ありがとうございました。
もし他の方も何かご意見ございましたら、お聞かせください。

バグ

Re:CUIゲームでの画面クリアなどに関して

#5

投稿記事 by バグ » 15年前

>>ちらつきの解決については後回しにしようと思っておりました。
>>なるべくならどうにかしたいですが、どうにもならないようならちらついても仕方ないかな、と考えてました。

コンソールアプリというのは、左上から右下まで文字が並んでいるだけだと思ってください。(テキストエディタを思い浮かべていただけると分かり易いかもしれません)その文字列の情報は保持されており、常に表示されるため、Windowsアプリの用に毎フレーム書き換える必要がないのです。DXライブラリとは全く考え方が違う物だと認識してください。

そういう訳なので、コンソールアプリで作成するのであれば、『変更のあった箇所の文字だけを書き換える』という方法が最も効率のよい描画方法になる訳です。この方法ならば、全画面の情報を頻繁に書き換えるような事でもしない限りは、ちらつきも気にならないレベルになると思いますよ。

コンソールアプリ大好きで色々実験してますので、何か方法で分からない事があればまた質問してください(^_^;)

http://park.geocities.jp/bugbugbugbug2001/

手前味噌ですが、ここのHPのコンソールアプリ版テトリス(C#版とC++版があります)でしたら、ソース付きで公開してますので、よかったら御覧ください。

たいちう

Re:CUIゲームでの画面クリアなどに関して

#6

投稿記事 by たいちう » 15年前

コンソール用のAPIをまとめてあるサイトを見つけましたので、
一応貼っておきます。

『0からのゲームプログラミング』
http://www.plustarnet.com/aspil/Programming/
http://www.plustarnet.com/aspil/Program ... sole00.htm


バグさん
> コンソールアプリ大好きで色々実験してますので、
> 何か方法で分からない事があればまた質問してください(^_^;)

コマンドプロンプトでも色々できるもんですね。
テキストを吐き出す使い方しかしてきませんでした。
相応のポテンシャルを秘めているものと認識を新たにすることができました。
情報ありがとうございました。

山崎

Re:CUIゲームでの画面クリアなどに関して

#7

投稿記事 by 山崎 » 15年前

バグさん
いろいろアドバイスくださり、本当にありがとうございますっ!
コンソールアプリ大好きとは頼もしい限りです、もしかしたらまたご質問させていただくかもしれません。
その時はどうかご指導よろしくお願いします。
そして紹介いただいたソースなど、是非ともこれから拝見させていただきますね!
お気に入りに登録させていただきますのでっ!

たいちうさん
サイトご紹介くださりありがとうございます。
私もそのサイトを見ながらいろいろチャレンジしているところでした。
まだ完全に目を通したわけではないですので、引き続き参考にしていきたいと思います。

お二方とも、本当にいろいろありがとうございます。

バグ

Re:CUIゲームでの画面クリアなどに関して

#8

投稿記事 by バグ » 15年前

たいちうさんのリンク先の記事を読ませていただきましたが、考える事は皆さん同じなのでしょうか?(苦笑)
私もコンソールに関する機能をまとめたクラスを自作して使っています(^_^;)

かなり似たような内容ですが、アップしてみますね。

閉鎖

“C言語何でも質問掲示板” へ戻る