(緊急!)画像描画、手順の仕組み
Posted: 2013年7月03日(水) 15:13
こちらの「龍神録」大変参考にさせてもらいながら、自分なりにブロック崩しを作りました。
そこで、ブロック崩しにはもちろん背景やブロック、弾、キャラがいます。
そして、その絵を描いたのは僕ではなく友人です。
学校の作品展覧が近づいており、最終締め切りが明後日です。
僕は、描いてくれた友人のためにも自分の作ったブロック崩し以外にも、描いてくれた絵を閲覧する感じのプログラムを作ろうと思い、ソースを書いてみました(以下コード(わからない部分です))
やりたいことは、
選択画面が開き→方向キーで選択→エンターキーで決定→画像を表示→戻るか終るか、
戻る(右シフトキー)の場合選択画面へ、終わり(左シフトキー)の場合だけ、フェードアウトして終わる。
自信満々に実行したのですが・・・・
コードを見ればわかると思いますが、キー入力は「押されてる状態」と「押されてない状態」しかありません。
ですので、エンターキーを押してる間だけ画像が表示される・・という具合になってしまいます。
僕がしたいのは、エンターキーが押された瞬間、長押ししようがすぐに手を離そうが画像は表示されて次の処理の待機をするようにしたいのです。
おしてる間だけ表示というが嫌なので・・・(おそらくエンターキー以外にも左右シフトキーの時も同じことが起こりそうで・・・(エンターキーで躓いてるのでそこまではわかりませんが・・・))
先頭にも書きましたが、期限が明後日です。(明日はバイトが入ってしまっていてPCに触れる時間が少なく皆様がもう寝ている、もしくはこの掲示板を見ている頻度がものすごく少ない時間での返信になってしまうので)
フォーラムルールを拝見しますと、「どうしても提出期限の関係で答えが欲しい時はその事をしっかり明記の上、回答者さん達の理解を求めるようにしましょう。」とあります。
一応、先頭に書いたことが僕の「回答が欲しい理由」なのですが・・・ダメでしょうか?
お恥ずかしいのですが、ブロック崩しを作ってる時も「デバッグ作業」というのをやったことがなくまったく無知と言っていいです。(書いては実行という感じでした。)
欲を言ってしまうと、この書き方(enumを使った)での回答をお願いしたいです(変数などは勝手に増やしてもらって構いません。)
通学先のPCですので、返信、感謝の意は明日の朝(通学してから)になってしまうご無礼お許しください。
ですが、今夜19時くらいまでならこのプログラミングで通学先に残っていると思います。
*驚いたことにこの内容とかなり類似しているトピックがあったのですが・・・なんか荒れていたので・・・
そこで、ブロック崩しにはもちろん背景やブロック、弾、キャラがいます。
そして、その絵を描いたのは僕ではなく友人です。
学校の作品展覧が近づいており、最終締め切りが明後日です。
僕は、描いてくれた友人のためにも自分の作ったブロック崩し以外にも、描いてくれた絵を閲覧する感じのプログラムを作ろうと思い、ソースを書いてみました(以下コード(わからない部分です))
//-----------------------------------------------
enum window_e
{
SELECT_GRAPH,//グラフの選択(&選択画面)
VIEW_GRAPH,//見る&選択
RETURN_GRAPH,//暗くする
END,//終わり
}:
typedef struct
{
int no;
int flag;
int cnt;
int brt;
enum window_t win;
}graph_t;
//---------------------------------------------------------
graph_e graph;
//----------------
void ini()
{
graph.cnt = 0;//カウント
graph.flag = 0;//描画フラグ
graph.no = 0;//画像番号
graph.brt = 0;//明るさ
graph.win = SELECT_GRAPH;//手順
}
//--------------------------------------------------------------------------
#define MAX_GRAPHS 10//ここはどうでもいいので適当(ていうか、発表する画像の数)
//------------------------------------------------------------------------------------
int img_g[MAX_GRAPHS];//画像
int img_gmini[MAX_GRAPHS];//選択画面用の小さな画像(友人が描いてくれたもの)
int img_i;//アイコン的な画像
//----------------------------------------------------------------------
//描画
void Graph_Draw()
{
SetDrawBlendMode( DX_BLENDMODE_ALPHA , graph.brt ); //明るさ設定
if(graph.flag == 1)//選択画面表示だったら
{
for(int i=0 ; i < MAX_GRAPHS , i++)
{
DrawGraph(** , **+(graph.no*100) , img_gmini[i] , TRUE );//描画
}
DrawGraph(** , **+(graph.no*100) , img_i , TRUE );//アイコン的なもの描画(現在どれが選ばれているかわかるように)
}
if(graph.flag == 2)//描画フラグが立っていたら
{
DrawGraph(** , ** , img_g[graph.no] , TRUE );//描画(選択された番号の画像を表示)
}
SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 255 ); //明るく
}
//------------------------------------------------------------------------------------
int graph_tejun()
{
switch(graph.win)//手順
{
case SELECT_GRAPH://選択
graph.flag = 1;//選択画面の描画
graph.brt = 255;//明るく
if(CheckStatePad(configpad.down) == 1)//下矢印キーが押されて
{
if( graph.no >= MAX_GRAPHS-1 ) //一番下の選択画像まできてたら
{
graph.no = MAX_GRAPHS-1;//そのまま
}
else
graph.no++;//選択番号+1
}
if(CheckStatePad(configpad.up) == 1)//上矢印キーが押されて
{
if( graph.no <= 0 ) //一番上の選択画像まできてたら
{
graph.no = 0;//そのまま
}
else
graph.no--;//選択番号-1
}
// 決定処理
if(CheckStatePad(configpad.kettei) == 1)//エンターが押されたら
{
graph.win = VIEW_GRAPH;//閲覧状態に
graph.cnt = 0;//カウントを0に(後に使うので)
}
break;
case VIEW_GRAPH://閲覧状態
graph.flag = 2;//2は画像表示 1は選択画面表示
if(CheckStatePad(configpad.modoru) == 1)//右シフトキーが押されたら
{
graph.win = SELECT_GRAPH;//もう一度選択画面に
graph.brt = 0;//一度暗くする
}
if(CheckStatePad(configpad.end) == 1)//左シフトキーが押されたら
{
graph.win = RETURN_GRAPH;//消えてく処理へ
graph.cnt = 0;//カウントを0に
}
case RETURN_GRAPH:
graph.cnt;//カウントをとにかく加算
graph.brt = 255 - graph.cnt;//カウント共に暗くしていく(フェードアウト的な感じです)
if(graph.brt <= 0)//完全に暗くなったら(0未満にならないように)
{
graph.brt = 0;//0にする
graph.flag = 0;//描画をやめる
graph.win = END;//終了へ
}
case END://終了
return 1;//終了!(一応エラーがわかるように・・・・・)
break;
}
//(エラー)
return 0;
}
選択画面が開き→方向キーで選択→エンターキーで決定→画像を表示→戻るか終るか、
戻る(右シフトキー)の場合選択画面へ、終わり(左シフトキー)の場合だけ、フェードアウトして終わる。
自信満々に実行したのですが・・・・
コードを見ればわかると思いますが、キー入力は「押されてる状態」と「押されてない状態」しかありません。
ですので、エンターキーを押してる間だけ画像が表示される・・という具合になってしまいます。
僕がしたいのは、エンターキーが押された瞬間、長押ししようがすぐに手を離そうが画像は表示されて次の処理の待機をするようにしたいのです。
おしてる間だけ表示というが嫌なので・・・(おそらくエンターキー以外にも左右シフトキーの時も同じことが起こりそうで・・・(エンターキーで躓いてるのでそこまではわかりませんが・・・))
先頭にも書きましたが、期限が明後日です。(明日はバイトが入ってしまっていてPCに触れる時間が少なく皆様がもう寝ている、もしくはこの掲示板を見ている頻度がものすごく少ない時間での返信になってしまうので)
フォーラムルールを拝見しますと、「どうしても提出期限の関係で答えが欲しい時はその事をしっかり明記の上、回答者さん達の理解を求めるようにしましょう。」とあります。
一応、先頭に書いたことが僕の「回答が欲しい理由」なのですが・・・ダメでしょうか?
お恥ずかしいのですが、ブロック崩しを作ってる時も「デバッグ作業」というのをやったことがなくまったく無知と言っていいです。(書いては実行という感じでした。)
欲を言ってしまうと、この書き方(enumを使った)での回答をお願いしたいです(変数などは勝手に増やしてもらって構いません。)
通学先のPCですので、返信、感謝の意は明日の朝(通学してから)になってしまうご無礼お許しください。
ですが、今夜19時くらいまでならこのプログラミングで通学先に残っていると思います。
*驚いたことにこの内容とかなり類似しているトピックがあったのですが・・・なんか荒れていたので・・・