少し前に頂いたアドバイスに従ってstaticな変数を使ってできるだけ変数をそのソースコード内だけで使うようにまとめて見ました。
ただ、バーの内容とボールの内容をひとつのソースファイルにまとめたのですが、そのソースファイル(player.cpp)
がとても長くなってしまいました。
ファイルは以下のサイトにアップしました。パスワードは「YT2013」です。
http://www1.axfc.net/uploader/so/2815940
さすがにここまで長いと見づらいのではと不安に思ったので書き込ませていただきました。
ブロック崩しその2
Re: ブロック崩しその2
boss.cpp と rank.cpp がないんですね
気になったというか、気づいたところは
player.cpp の 630行目
で、changeobj == 0 のときどちらの条件も通りません
という、こまか~い バグが入り込みそうです。
ほかの箇所ではやっているようですが、 if - else 文を使うといいかもしれません
よみやすいか?というところは、私は、まだこのくらいの量なら読めます。
気になったというか、気づいたところは
player.cpp の 630行目
//バーの長さ変更
if(change ==2){
if(changeobj>0){
if(bar.longth != 4){
if(bar.x > FIELD_MAX_X - 9.5*(bar.longth -1))
bar.x -=9.5;
bar.longth +=changeobj ;
}
}
if(changeobj<0){
if(bar.longth != 0)
bar.longth--;
}
}
という、こまか~い バグが入り込みそうです。
ほかの箇所ではやっているようですが、 if - else 文を使うといいかもしれません
//バーの長さ変更 変更(dic)
if(change ==2){
if(changeobj>0){
if(bar.longth != 4){
if(bar.x > FIELD_MAX_X - 9.5*(bar.longth -1))
bar.x -=9.5;
bar.longth +=changeobj ;
}
}
else{
if(bar.longth != 0)
bar.longth--;
}
}
よみやすいか?というところは、私は、まだこのくらいの量なら読めます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ブロック崩しその2
アップロードする時は、Debugフォルダやipchフォルダとblocktower.sdfを削除してもらうとかなり軽量になります。
気になるところですが、
1)ご自身が言われる通りバーの内容とボールの内容を分けたほうが良いです。
2)main.hのグローバル変数がまだかなり残っています。もっと減らせると思います。あとstruct.hの構造体でグローバル公開しなくて良い物もないか確認して下さい。
使っていないものもあるような。
3)ローカル変数でstaticにして良い変数もかなりあると思います。ファイルスコープからローカルスコープにすることで見かけ上の変数が整理出来ます。
4)プログラムの規模の割に変数が多いという印象があります。全体を見なおして変数を減らす工夫も考えてみて下さい。
5)前回も書きましたが、constやenumも積極的に使いましょう。
「ブロック崩し • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=12591#p101066
6)これも前回書きましたが、同じようなコードが散見されます。一度書いたものは2度描かないを徹底し関数化を心がけて下さい。
徹底すればstaticな関数が絶対発生するはずです。
簡単な例ですが、これが元の処理で
ほとんど同一のようなので、こんな風にしてみるとか。
あるいは、こう書くとか
私は部分的にか見ていないので、全体を見なおせば上のコード自体もっと別の書き方が有るかもしれません。
気になるところですが、
1)ご自身が言われる通りバーの内容とボールの内容を分けたほうが良いです。
2)main.hのグローバル変数がまだかなり残っています。もっと減らせると思います。あとstruct.hの構造体でグローバル公開しなくて良い物もないか確認して下さい。
使っていないものもあるような。
3)ローカル変数でstaticにして良い変数もかなりあると思います。ファイルスコープからローカルスコープにすることで見かけ上の変数が整理出来ます。
4)プログラムの規模の割に変数が多いという印象があります。全体を見なおして変数を減らす工夫も考えてみて下さい。
5)前回も書きましたが、constやenumも積極的に使いましょう。
「ブロック崩し • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=12591#p101066
6)これも前回書きましたが、同じようなコードが散見されます。一度書いたものは2度描かないを徹底し関数化を心がけて下さい。
徹底すればstaticな関数が絶対発生するはずです。
簡単な例ですが、これが元の処理で
for(int i = 0;i<3;i++){
if(sp2pos[i] <5){
sp2hit[i].lt.x = 30+70*sp2pos[i]; sp2hit[i].lt.y =30;
sp2hit[i].rb.x = 90+70*sp2pos[i]; sp2hit[i].rb.y =90;
sp2hit[i].height=60; sp2hit[i].width = 60;
}
if(sp2pos[i] >=5 && sp2pos[i] < 10){
sp2hit[i].lt.x = 30+70*(sp2pos[i] -5); sp2hit[i].lt.y =130;
sp2hit[i].rb.x = 90+70*(sp2pos[i] -5); sp2hit[i].rb.y =190;
sp2hit[i].height=60; sp2hit[i].width = 60;
}
if(sp2pos[i] >= 10){
sp2hit[i].lt.x = 30+70*(sp2pos[i] -10); sp2hit[i].lt.y =230;
sp2hit[i].rb.x = 90+70*(sp2pos[i] -10); sp2hit[i].rb.y =290;
sp2hit[i].height=60; sp2hit[i].width = 60;
}
} for(int i = 0;i<3;i++){
int ofsX=0,ofsY=0;
if(sp2pos[i] >=5 && sp2pos[i] < 10){
ofsX = -5;
ofsY = 100;
}
if(sp2pos[i] >= 10){
ofsX = -10;
ofsY = 200;
}
sp2hit[i].lt.x = 30+70*(sp2pos[i]+ofsX); sp2hit[i].lt.y =ofsY+30;
sp2hit[i].rb.x = 90+70*(sp2pos[i]+ofsX); sp2hit[i].rb.y =ofsY+90;
sp2hit[i].height=60; sp2hit[i].width = 60;
} for(int i = 0;i<3;i++){
int baisu = 0;
if(sp2pos[i] >=5 && sp2pos[i] < 10) {
baisu = 1;
}
if(sp2pos[i] >= 10) {
baisu = 2;
}
sp2hit[i].lt.x = 30+70*(sp2pos[i]+baisu*-5); sp2hit[i].lt.y =baisu*100+30;
sp2hit[i].rb.x = 90+70*(sp2pos[i]+baisu*-5); sp2hit[i].rb.y =baisu*100+90;
sp2hit[i].height=60; sp2hit[i].width = 60;
}by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ブロック崩しその2
ひょっとして、オブジェクト指向を意識してプログラムされてます?
設計さえ見直せば、オブジェクト指向っぽくなるのかなと思いました。
(私なりの思うオブジェクト指向です。プロが使っているものとはかけはなれているかもしれません。)
そう考えると、DxLibは、まったくオブジェクト指向向けではないですね。
私は、やっとWindows95時代ぐらいにやっと到達したのでしょうかね。
設計さえ見直せば、オブジェクト指向っぽくなるのかなと思いました。
(私なりの思うオブジェクト指向です。プロが使っているものとはかけはなれているかもしれません。)
そう考えると、DxLibは、まったくオブジェクト指向向けではないですね。
私は、やっとWindows95時代ぐらいにやっと到達したのでしょうかね。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ブロック崩しその2
DXLIBのフレームワークはオブジェクト指向では出来ていませんが、それをオブジェクト指向で包み込むことは可能ですよ。dic さんが書きました:ひょっとして、オブジェクト指向を意識してプログラムされてます?
設計さえ見直せば、オブジェクト指向っぽくなるのかなと思いました。
(私なりの思うオブジェクト指向です。プロが使っているものとはかけはなれているかもしれません。)
そう考えると、DxLibは、まったくオブジェクト指向向けではないですね。
私は、やっとWindows95時代ぐらいにやっと到達したのでしょうかね。
「龍神録プログラミングの館」の最後の方にある龍神録C++版とか。
http://dixq.net/rp/
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ブロック崩しその2
たしかに、構造体が先にあって(DxLib)オブジェクト指向を扱うのは難しいかもしれないですけど、
オブジェクト指向があって、構造体のライブラリ(DxLib)を扱うのは、できますね。
勉強になりました。
オブジェクト指向があって、構造体のライブラリ(DxLib)を扱うのは、できますね。
勉強になりました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ブロック崩しその2
VisualStudioのMFCや.NetFrameWorkもC言語インターフェイスであるWin32APIをラップしてオブジェクト指向で扱っているわけですから前からごく普通に行われていますよね。dic さんが書きました:たしかに、構造体が先にあって(DxLib)オブジェクト指向を扱うのは難しいかもしれないですけど、
オブジェクト指向があって、構造体のライブラリ(DxLib)を扱うのは、できますね。
勉強になりました。
まぁ、古い新しいとかオブジェクト指向であるとか、うまく付き合っていけば良いので気にしすぎてもしょうが無いと思いますが。
オブジェクト指向にしたからと言っていきなりすごいプログラムが書けるわけでもないので、手続き型だろうとオブジェクト指向だろうと書けるプログラムは本人の能力次第です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。