文字列の出力についてです。

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

文字列の出力についてです。

#1

投稿記事 by 水無月空 » 14年前

DXライブラリを使って、タイピングゲームのようなものを作ろうと思っています。
とりあえず、入力が正しいときに、文字を表示するところから始めたのですが、DrawFormatString関数でそのつど出力すると、文字列がずれてしまいます。
何かいい方法はないでしょうか。
以下、プログラムコードです。

コード:

#include "DxLib.h"

void Type_sora(){
	char type[20] = "sora";
	int White = GetColor(255, 255, 255);

	DrawFormatString(10, 10, White, "次の文字列を打ってください");
	DrawFormatString(10, 30, White, type);

	while(1){
		if(CheckHitKey(KEY_INPUT_S) == 1){
			DrawFormatString(10, 50, White, "s");
			break;
		}
	}
	
	while(1){
		if(CheckHitKey(KEY_INPUT_O) == 1){
			DrawFormatString(20, 50, White, "o");
			break;
		}
	}
	
	while(1){
		if(CheckHitKey(KEY_INPUT_R) == 1){
			DrawFormatString(30, 50, White, "r");
			break;
		}
	}
	
	while(1){
		if(CheckHitKey(KEY_INPUT_A) == 1){
			DrawFormatString(40, 50, White, "a");
			break;
		}
	}
}
C言語はなんとかポインタまでは理解できているレベルで、C++はまだ学んでいません。
DXライブラリも新・ゲームプログラミングの館で学び始めたばかりです。
よろしくお願いします。

non
記事: 1097
登録日時: 15年前

Re: 文字列の出力についてです。

#2

投稿記事 by non » 14年前

WinMainのプログラムも、全部載せてもらわないと、現象を再現できません。
DXライブラリの作り方として、まずいことだけはわかります。
ProcessMessage()を定期的に呼び出せないプログラムはDXライブラリではマズイです。

C言語の勉強として取り掛かるなら、DXライブラリを使わずに作ることをお勧めします。
non

水無月空

Re: 文字列の出力についてです。

#3

投稿記事 by 水無月空 » 14年前

すみません。WinMain関数です。

コード:

#include "DxLib.h"
#include "sora.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init();

	Type_sora();

	while(1){
		ProcessMessage();
		if(CheckHitKey(KEY_INPUT_ESCAPE) == 1){
			break;
		}
	}

	DxLib_End();
	return 0;
}
C言語では

コード:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

#define WNUM 9

main()
{
	char type[WNUM][20]={"jihad","sora","sky","french","dog","cat","can","tomato","typing"},typing[20],c;
	int i,j,rnd;

	for(i=0; i<10; i++){
		srand((unsigned)time(NULL));
		rnd = (int)rand() % WNUM;
		printf("%s\n",type[rnd]);
		printf("この文字列を打ってください。\n");
		for(j=0; j<20 && type[rnd][j]!='\0'; j++){
			c=getch();
			typing[j]=c;
			if(typing[j]==type[rnd][j])
				continue;
			else{
				printf("\a");
				c=getch();
				typing[j]=c;
				while(typing[j]!=type[rnd][j]){
					printf("\a");
					c=getch();
					typing[j]=c;
				}
			}
		}
	}
	return 0;
}
このように作ってみることができたので、コマンドプロンプトではなく、画面に出力できないかと、DXライブラリに挑戦してみたわけです。
出直したほうがいいでしょうか。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 文字列の出力についてです。

#4

投稿記事 by beatle » 14年前

「文字列がずれてしまいます。」の意味が分かった気がします。
DrawFormatString関数で文字列を描画する際の各文字の横幅が10ピクセルではないために、
1文字毎に10ピクセルずつずらして描画すると、少しずつずれていってしまう、ということですね。
"sora"を最初に表示するときに、4文字をまとめて描画するのではなくて、ちゃんと1文字ずつ
描画してあげれば、ずれていかないでしょう。

ちゃんとしたゲームにしたいなら、ゲームループの基本にのっとった形にしたほうがいいと思います。
nonさんが仰るように。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 文字列の出力についてです。

#5

投稿記事 by softya(ソフト屋) » 14年前

水無月空 さんが書きました:このように作ってみることができたので、コマンドプロンプトではなく、画面に出力できないかと、DXライブラリに挑戦してみたわけです。
出直したほうがいいでしょうか。
少なくとも「新・ゲームプログラミングの館」をちゃんと理解した上で書かれたほうが良いと思います。

まず、下記のルールの理解と対処法を学びましょう。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/h_11.html
で、上記以上に問題点を抱えています。
DrawFormatString()とprintf()を同等の関数だと思っていると大きな間違いとなります。
printf()は任意のタイミングで画面に反映されますがDXライブラリの場合はScreenFlip();まで画面には反映されませんので、画面に反映したい場合はScreenFlip();を呼び出す必要があります。これが重要な違いです。
なので無闇にwhile(1)をしてはいけません。

(1)ProcessMessage();
(2)ClearDrawScreen();
(3)計算・描画処理
(4)ScreenFlip();

これを1セットとして秒間60回で呼び出されるのを保つようにしくて下さい。
ScreenFlip();は1/60FPSに自動調整してくれますので早い分にはどれだけ早くても構いません。
つまり、計算・描画処理は16.6666‥ms以内に終わる必要がありwhileループなどをしてはいけないって事です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

水無月空

Re: 文字列の出力についてです。

#6

投稿記事 by 水無月空 » 14年前

ありがとうございます。
「新・ゲームプログラミングの館」を理解してから、再度挑戦してみます。

閉鎖

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