ページ 11

ブロック崩しを直しました

Posted: 2013年3月11日(月) 21:07
by ヨシタケ
ブロック崩しをstaticを使ってそのソースの中でだけ使うように直しました。
関数がかなり多くなったとおもうのですが、大丈夫でしょうか。
ちなみに何度もアドバイス頂いたconstやenumをまだ使っていません。
とりあえず、今はstaticな変数だけ気をつけて直しました。
ここをこう直すともっと見やすくなるというのがあったら教えてください。お願いします。
プログラムは以下のサイトにあります。パスワードは「YT2013」です。

http://www1.axfc.net/uploader/so/2826085

Re: ブロック崩しを直しました

Posted: 2013年3月12日(火) 10:12
by softya(ソフト屋)
前回の私の指摘を繰り返すのも何なので、まず修正点を明記してもらえますか?
「ブロック崩しその2 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=12632#p101329
こちらで書いた私の番号を使ってもらった方が良いと思います。

Re: ブロック崩しを直しました

Posted: 2013年3月12日(火) 13:08
by ヨシタケ
修正点をちゃんと明記していなくて申し訳ございませんでした。
とりあえず、2)のstaticを使ってまとめることばかり考えていたので
ほかの項目は前の書き込みを見て思い出てあまり手をつけていません。

1)player.cppの内容ですが、player.cppにバー、ball.cppにボール,special.cppに必殺技の内容というように分けました。

2)main.hの変数の内容を減らしました。seall[20]はアップしたときにまだmain.hで定義していましたが、
title.cppのFirstIni()でSEをloadするようにしてtitle.cppで定義するように変えます。
なので、main.hは今のところGLOBAL int func_state;とGLOBAL CONFIGPAD configpad;だけになります。

3)例えばspcntはSpUpData内でしか使わないので関数内で定義したいのですが、spcnt = 0;と書いてしまうと
spcnt++が機能しなくなってしまいます。spcntを関数内で定義して、かつ、spcntが機能するようにならないでしょうか。

4)前回、スタート、クリア、ゲームオーバーに内容はそれぞれflagと書いていたのをgamestateという変数1つにまとめました。
今後まとめらるものはまとめていきます。

5)enumはとりあえず、アップしてからgamestate用に

コード:

typedef enum {
	Start,		//スタート
	Standby,	//待機
	Clear,		//クリア
	SClear,		//ステージクリア
	Gameover	//ゲームオーバー
}eState;
というようにしました。constはまだ使っていません。constで定義された値は定数となって、値の変更ができなくなると
いうように理解しているのですが、例えば出現するアイテムの最大数#define ITEMMAX 5
をitem.cpp内にconst int itemmax = 5 というように定義すればいいのでしょうか。
#defineもあまり使わないほうがいいのですか?

Re: ブロック崩しを直しました

Posted: 2013年3月12日(火) 16:25
by softya(ソフト屋)
>アップロードする時は、Debugフォルダやipchフォルダとblocktower.sdfを削除してもらうとかなり軽量になります。
これも気をつけてもらえますか? ダウンロードにかなり時間が掛かります。

3)に関しては前に書いている通り関数内でstatic定義して下さい。

5)#defineは色々と副作用が多いので嫌われる傾向があります。
マクロとして使うのでなければ、避けたほうが良いでしょう。
まぁ、C言語ではよく使われるんですが名前の付け方とか工夫をしないとひどい目に会います。
constは、その危険が少ないので使える時は使っておきべきです。

マジックナンバーに関しては、数値のままだと意味がよく分からないものをマジックナンバーと呼びます。
何箇所も使われていて調整する可能性があるモノもconstにしたほうが良いでしょう。

例えばChangeGameState(3);って他人には意味不明ですよね。それは、一年後に自分で見ても意味不明だと思います。
あとは勘違いとか思い込みが入る余地が増えます。そういうのを避けるためのテクニックです。

6)気になるもの
block1[j].hit.lt.x = block1[j].x - 20; block1[j].hit.lt.y = block1[j].y - 7;
block1[j].hit.rb.x = block1[j].x + 21; block1[j].hit.rb.y = block1[j].y + 7;
block1[j].hit.width = 37; block1[j].hit.height = 14;
コレに似たものがstage.cppのアチコチに散見されます。関数化して機能の明確化・共通化をしたほうが良いと思います。
こういう関数はstatic関数にして下さい。

それと前回に書いた例と同様に共通化できそうな部分が沢山見受けられました。

7)名前からやることが推測できないものがあります。例えば、GameMainDraw();とGameDraw();は何を描画するのか名前から推測出来ません。
GameMain();
ItemMove();
GameMainDraw();
ItemDraw();
PlayerDraw();
GameDraw();
それと各々のUpDataとMoveの呼び出されるタイミングが良く分かりません。呼び出しの階層が深すぎるんだと思います。名前もUpDataに統一したほうが検索するとき見つけやすくなります。
他にも同様の問題があれば整理してみてください。

Re: ブロック崩しを直しました

Posted: 2013年3月12日(火) 17:26
by ターボ
はじめまして、ターボと申します。

技術的なことは私にはわからないのですが、普通にゲーム面白かったです。

私はブロック崩し好きなので、さっきやってみたのですが、かなり楽しめました。

技術的なレスじゃなくて単なる感想ですみません。

これからもがんばってください。

Re: ブロック崩しを直しました

Posted: 2013年3月17日(日) 16:29
by ヨシタケ
感想ありがとうございます。がんばって完成させます。

アドバイスを頂いたので修正しました。

1)一部の変数はenumを使うように変更しました。
しかし、例えばChangeGameStateだとこの関数があるソース内にenumを定義してあるので
ほかのソース内でこの関数が使われている場合ChangeGameState(3);というように中の数字
はそのままにしてあります。ChangeGameStateの関数はballとstageのソースで使われているため
どうすればいいのかよくわかりませんでした。
 また、ボールの壁との判定の位置やバーの移動範囲をconstを使うように変更しました。

2)spcntをstatic int spcnt = 0;として関数void SpUpData(BAR bar)内に定義しました。

3)名前から憶測できない関数があるということでしたので、ItemMove()はItemUpDataに変えました。
また,GameDraw()を消して、GameMainIni,GameMainDraw,GameMainUpDataの中に
それぞれプレイヤー,ステージ,アイテムの初期化,描画,計算をまとめました。ちなみにプレイヤーの関数内にボールと
必殺技の関数が入っています。

以下のサイトにプログラムをアップしました。パスワードは「YT2013」です。

http://www1.axfc.net/uploader/so/2833783

Re: ブロック崩しを直しました

Posted: 2013年3月17日(日) 16:51
by softya(ソフト屋)
enumに関してはヘッダに定義すればどこからでも参照できます。
あとは時間が取れてから回答しますね。

Re: ブロック崩しを直しました

Posted: 2013年3月18日(月) 16:11
by softya(ソフト屋)
大体見ましたが、細かく指摘した部分は結構直りましたね。
大雑把に指摘した部分は、まだまだシェイプアップ可能だと思います(アチコチに有る即値やら共通化出来そうな部分とか)。
あとは、どのレベルまで整理するかですが、ご本人の意識の問題で、こちらから指摘した部分だけ直していても向上は望めないです。
どこまでやるかはよく考えてみてください。

Re: ブロック崩しを直しました

Posted: 2013年3月18日(月) 16:26
by ヨシタケ
わかりました。アドバイスありがとうございます。
ここからは当分自分でやってみます。