ゲームプログラミングについて

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

ゲームプログラミングについて

#1

投稿記事 by sr » 15年前

初心者です。使用ソフトはVC++2008 EE
画像と背景を合わせようと思いました。
サイトを参考にしつつ、まずjpgの画像をpngにリネームし
その後に透過させるためにペインターで要らない部分を黒く塗り潰しました。
しかし、実際に合わせてみるとキャラの周りに塗り残しのようなものが出てしまい
困っています。原因、また対処法を教えて欲しいです。

また、簡単なサウンドノベル風?ゲームを作りたいと思っているのですが
画像を表示させて、文字を表示し、エンターで進ませる。
読む込む配列が無くなったら終了。というところまでは出来ました。
次に画像を変えて、また文字を表示させたいのですが、どのような考え方で
繋げればいいのでしょうか?
読み込む配列が無くなったら次の画像を読み込み~ということでしょうか?

プログラムを作ること自体が始めてなので、質問の仕方も問題があるかも知れませんが
出来るだけ詳しく教えて欲しいです。

kazuoni

Re:ゲームプログラミングについて

#2

投稿記事 by kazuoni » 15年前

DXライブラリ使用ですかね?
これを前提に回答してみます。

>jpgの画像をpngにリネーム
は特にする必要がないと思いますが・・・

>実際に合わせてみるとキャラの周りに塗り残し
RGB(0,0,0)で塗りつぶしたところのみ透過されます。(デフォルト)
ペイントでも塗りつぶし機能を使えばそのようなことはないはずなんですが・・・。
キャラの周りがどこなのかわかりませんが、
キャラに沿って黒いということならば、
そこの色がRGB(0,0,0)ではないということです。
面倒ですが、拡大して、1ドットずつ黒で塗りつぶしていってください。

>次に画像を変えて、また文字を表示させたいのですが、どのような考え方で
>繋げればいいのでしょうか?
>読み込む配列が無くなったら次の画像を読み込み~ということでしょうか?

それでいいのではないでしょうか?
配列がなくなるという表現がよくわかりませんが・・・。

ひよこ

Re:ゲームプログラミングについて

#3

投稿記事 by ひよこ » 15年前

おそらく、配列がなくなるっていうのは、読んだ文が終わったらってことではないのですか?
ゲームプログラムの館にサウンドノベルについて書いてあります。
counterみたいな変数を使い1回目のところが終わったら、counterを使って描く画像を読む、
みたいな感じはどうでしょうか?

sr

Re:ゲームプログラミングについて

#4

投稿記事 by sr » 15年前

返答ありがとうございます。
DXライブラリ使用です。

このサイトに
「JPEGにすると真っ黒のピクセルが真っ黒ではなくなるので透過されません。JPEGは使わないようにしましょう。
容量が多くてかまわない場合はbmpで、容量を軽くしたい場合はpng形式の画像にしましょう。」
とあったのでpngにしたのですが・・・。
それと、黒く塗りつぶしたはずの画像を見てみて、透過処理出来ていた部分を白で塗りつぶししてみました。
案の定キャラの周りに塗り残しのようなものがあり、それを消しゴムで消し、塗りつぶしで真っ黒になることを
確認してから保存しました。
しかし、再度画像を開くと、先ほど消しゴムをかけて塗りつぶしたはずのキャラの周りの部分がまた残っていました。
画像保存の際の画質悪化かと思い、bmpにして保存してみましたが結果は変わらず・・・。



ゲームプログラミングの館のサウンドノベル風~・・・
のところからコピーし、LoadGraphScreenで画像を表示したものです。

#include "DxLib.h"

int i=0,j,ch_i=0,counter=0,White;
char Key[256],oldKey[256]={},disp[80]="",ch[5][80]={
"プログラムを習得するには、実際に自分で書いてみることが大事。",
"参考書を読むことも重要だが、数学のように演習を通して、",
"体に身につけるようにしよう。",
"きっと、よりはっきりと、関数の使い方、",
"プログラムの書き方がわかるだろう。"
};


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK ) ;

White=GetColor(255,255,255);

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
       

  LoadGraphScreen (0 , 0 , "char.bmp" , TRUE ) ;


for(j=0;j<256;j++){
if(oldKey[j]==0 && Key[j]==1)
Key[j]=2;
oldKey[j]=Key[j];
}

if(Key[KEY_INPUT_RETURN]==2){ // 前回押されてなくて、今回押されていたら
i=0; // iを初期値に戻し
ch_i++; // 表示する配列を1つずらす
if(ch_i==5) // これ以上表示する配列がなくなったらbreak;
break;
}

// 配列の終端-2以下で、今回コピーするiまでの配列要素のi番目が\0じゃなくカウンターが5の倍数なら
if(i<=80-2 && ch[ch_i]!='\0' && counter%5==0){
i+=2; // 全角文字なので配列要素2つずつカウントアップ
strncpy(disp,ch[ch_i],i);// iバイトまでの配列要素をdisp配列にコピー
disp='\0'; // 終端記号を代入
}

DrawFormatString(10,420,White,"%s",disp);//disp配列の文字データを表示

counter++;
ScreenFlip() ;

}

DxLib_End() ;
return 0 ;
}



これからどのように変えていけばいいか教えて欲しいです。
変数ということは int 変数 = LoadGraphScreen("chara.bmp")
とするのでしょうか?

softya

Re:ゲームプログラミングについて

#5

投稿記事 by softya » 15年前

>「JPEGにすると真っ黒のピクセルが真っ黒ではなくなるので透過されません。JPEGは使わないようにしましょう。
容量が多くてかまわない場合はbmpで、容量を軽くしたい場合はpng形式の画像にしましょう。」
とあったのでpngにしたのですが・・・。」

もう少しプログラムに詳しくなると分かると思いますが、jpgとpngではファイルフォーマットが違います。つまり拡張子だけjpg→pngに変えても中身はjpgファイルのままなので、jpgファイルとして処理されます。jpgは非可逆圧縮で高圧縮されているのでブロック単位で色がある程度変化してしまい黒が黒である保障がされません。

>画像保存の際の画質悪化かと思い、bmpにして保存してみましたが結果は変わらず・・・。
一度jpgにしたものは画像が劣化します。
劣化しないためには必ずbmpやpngだけで処理する必要があります。
bmpにする元がjpgだった場合は、キャラの周りのエッジを完全に黒(0,0,0)にしてbmp保存してください。
常にbmpにしておくのが無難でjpgは使わないようにしましょう。

閉鎖

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