|
Name: minami ..入門者(2,737ポイント)
Date: 2009/03/27(金) 03:52
No:31281
|
|
Title: 龍神録プログラミングの実行させてみようについて
|
|
龍神録プログラミングの実行させてみようの欄で詰まっています。
#define GLOBAL_INSTANCE
#include "../include/GV.h"
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
//ココ!!
ScreenFlip();
}
DxLib_End();
return 0;
}
ソースをそのまま貼り付けて実行させているのですが、
c:\dxlib_vc\1章\mydat\include\gv.h(1) : fatal error C1083: include ファイルを開けません。'../../../include/DxLib.h': No such file or directory
fps.cpp
c:\dxlib_vc\1章\mydat\include\gv.h(1) : fatal error C1083: include ファイルを開けません。'../../../include/DxLib.h': No such file or directory
ini.cpp
などと出て実行できません。どうすれば実行できるようになるのでしょうか。
環境は
OS : Windows xp home
コンパイラ : VC++ 2008EE
です。DXライブラリなどの設定はうまくいってると思うんですが…
830ポイント を手に入れた。
|
|
|
|
Name: SooA [URL] ..中級者(10,525ポイント)
Date: 2009/03/27(金) 06:24
No:31282
|
|
Title: Re:龍神録プログラミングの実行させてみようについて
|
|
丁度数日前に龍神録プログラミングを拝見させて頂いた所です。
龍神録では "../../../include/DxLib.h" で示すフォルダに
DXライブラリが入っている構成になっています。
一括ダウンロードした場合はこの構成になるので問題ありませんが、
ソースをコピペした場合はフォルダの構成が違ってくるので
GV.h 内の
#include "../../../include/DxLib.h"
を下記に変更しましょう。
#include "DxLib.h"
213ポイント を手に入れた。
|
|
|
|
|
Name: minami ..入門者(2,799ポイント)
Date: 2009/03/27(金) 15:01
No:31299
| 解決!
|
Title: Re:龍神録プログラミングの実行させてみようについて
|
|
返信ありがとうございます。
言われた通りに変更したところ、実行することができました。
適格なアドバイスありがとうございました。
62ポイント を手に入れた。
|
|
|
|
Name: popo ..ぴよぴよ(297ポイント)
Date: 2009/03/27(金) 12:04
No:31287
|
|
Title: 文字列の分割
|
|
ファイルを読み込んで、"="で分割した値(内容)を取得したいのですが、
うまくうごきません。
ファイルの中身は
aaa=123
bbb=456
:
のようになっています。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int i_idx;
FILE *kp_fp_db;
char ch_file[100];
char *cp_t;
char *cp_info[2];
kp_fp_db = fopen("info.txt", "r");
if ( kp_fp_db == NULL ){
return 1;
}
while( fgets(ch_file,100,kp_fp_db) != NULL ){
cp_t = strtok(ch_file, "=");
while( cp_t != NULL ){
cp_info[i_idx] = cp_t;
cp_t = strtok(NULL,"=");
i_idx++;
}
printf("***%s %s\n",cp_info[0],cp_info[1]);
return 0;
}
}
297ポイント を手に入れた。
|
|
|
|
Name: popo ..ぴよぴよ(453ポイント)
Date: 2009/03/27(金) 12:52
No:31290
|
|
Title: Re:文字列の分割
|
|
すみません。
return 0;
がへんなところにはいってました。
fgetsのwhile後です。
>初級者さん
ch_fileの最後の改行コードがおかしなことになっているのかと、
配列の要素を[3]に増やしてみました。
が、
あまりかわりませんでした。
ファイルの内容が1行目はちゃんととれてましたが、2行目以降はおかしかったが、
1行目printf
改行
2行目printf
改行
3行目???なんか文字化け
:
でした。。。
156ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(57,475ポイント)
Date: 2009/03/27(金) 12:58
No:31291
|
|
Title: Re:文字列の分割
|
|
まず、i_idxが初期化していないために初期状態で0であることが保証されていません。
次に、一行分の処理が終わった時にi_idxを0に戻していないのでi_idxは増え続けて範囲外アクセスになります。
コンパイラが何か分かりませんが初期化せずにi_idxを使用しているというワーニングが出ていませんか?
112ポイント を手に入れた。
|
|
|
|
|
Name: popo ..ぴよぴよ(559ポイント)
Date: 2009/03/27(金) 13:05
No:31292
|
|
Title: Re:文字列の分割
|
|
>Mistさん
ありがとうございます。
コンパイラはgccを使っていますが、warningでていました。
i_idxをファイル読込のwhileの先頭で0に初期化しました。
すると、値はちゃんと(?)とれていますが、
***aaa 123
***bbb 456
***ccc 789
:
と改行されてしまいました。
106ポイント を手に入れた。
|
|
|
|
|
Name: popo ..ぴよぴよ(599ポイント)
Date: 2009/03/27(金) 13:08
No:31293
|
|
Title: Re:文字列の分割
|
|
こんな方法よりもっといい方法あるよ。
というご意見もあれば宜しくお願いします。
40ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(57,502ポイント)
Date: 2009/03/27(金) 13:21
No:31294
|
|
Title: Re:文字列の分割
|
|
一行目を読み込むと
ch_file="aaa=123\n"
これをstrtokで処理すると
cp_info[0]="aaa\0123\n"
cp_info[1]="123\n"
となりますから、そう表示されるのはプログラムの通りです。
行末の改行コードを取り去る処理が必要です。
27ポイント を手に入れた。
|
|
|
|
|
Name: popo ..ぴよぴよ(626ポイント)
Date: 2009/03/27(金) 13:33
No:31297
| 解決!
|
Title: Re:文字列の分割
|
|
>Mistさん
ご丁寧にありがとうございます。
strtokの区切り文字を"="と改行コードにしたら、
ちゃんととってこれました。
助かりました。
27ポイント を手に入れた。
|
|
|
|
Name: MNS ..入門者(3,713ポイント)
Date: 2009/03/27(金) 08:23
No:31283
|
|
Title: ポインタのポインタへアクセスする方法
|
|
ポインタのポインタについて質問です。
たとえば、
struct TMP
{
int tmp;
};
という構造体があるとします。
ここに、
TMP *ptmp;
というポインタがあります。
そして、
TMP** Reptmp()
{
return &ptmp;
}
という、ptmpのアドレスを返す関数があるとします。
このとき、Reptmp()がポインタを返す関数なら、
Retmp()->tmp
のようにアクセスすることが出きるのですが、
Reptmpがポインタのポインタであるため、どのようにアクセスすればいいのか分かりません。
どなたか回答お願いします。
284ポイント を手に入れた。
|
|
|
|
Name: Blue ..初心者(8,939ポイント)
Date: 2009/03/27(金) 08:45
No:31284
|
|
Title: Re:ポインタのポインタへアクセスする方法
|
|
TMP** pp = Retmp();
TMP* p = *pp;
int n = p->tmp;
であるから、
int n = (*Retmp())->tmp;
ということになります。
55ポイント を手に入れた。
|
|
|
|
|
Name: MNS ..入門者(3,797ポイント)
Date: 2009/03/27(金) 12:39
No:31289
| 解決!
|
Title: Re:ポインタのポインタへアクセスする方法
|
|
>Blueさん
やり方が悪いのか、なぜか構文エラーになってしまいますね・・。
回答ありがとうございます。
>TOMONORIさん
仰られた方法で出来そうです。
どうもありがとうございました。
84ポイント を手に入れた。
|
|
|
|
Name: 狼太郎 ..ぴよぴよ(178ポイント)
Date: 2009/03/25(水) 16:49
No:31234
|
|
Title: C言語のデバック中に
|
|
はじめまして、狼太郎と申します。
質問なのですが、
このサイトのC言語〜ゲームプログラミング
でプログラムを勉強しています。DXライブラリの設定も終わり、やり始め、
ようやく
〜ゲーム入門編〜までたどりついたのですが
17章の画像を分割して読み込む所で
DxLib_VC2005用.exe の 0x100031e5 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfeeeff52 を読み込み中にアクセス違反が発生しました。
DXライブラリのプログラムをデバックしようとすると一応言うことはききグラフィックも表示されるのですが、一回一回上記のエラーがでてデバックが終了しません。
以前まではこんなことはなかったのですが、それまで正常に動かせていたプログラムも同様のエラーが発生するようになりました。
DXライブラリの再ダウンロードもためして、設定しましたが直りません。
解決策がありましたら教えてください。
178ポイント を手に入れた。
|
|
|
|
Name: lbfuvab ..上級者(19,037ポイント)
Date: 2009/03/25(水) 17:16
No:31235
|
|
Title: Re:C言語のデバック中に
|
|
う〜ん、詳しくないので良く分かりませんが、
@プロジェクトの設定を間違えている
Aソースが間違っている(どうやらこれは無さそうですが・・・)
BPCの不具合
解決策は
@プロジェクトの設定をしっかり見直す。
Aソースで間違っている場所を直す。
BPCを再起動してみる。
でしょうか?
頼りにならなくてすいません。
116ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(72,312ポイント)
Date: 2009/03/25(水) 17:26
No:31236
|
|
Title: Re:C言語のデバック中に
|
|
今まで動いていた(動いていた当時の)プログラムが動かなくなっているのであれば、
読み込む画像ファイルに問題があるかもしれません。
読み込む画像ファイルは正常なものでしょうか?
・読み込む画像ファイルが壊れていないか(画像を開いてきちんと表示されるかどうか)
・読み込む画像ファイルがちゃんとした場所にあるかどうか
・同じサイズの適当なファイルに差し替えてみる
・デバッグ出力ログを見る
それぞれ確かめてみてください。
204ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(20,804ポイント)
Date: 2009/03/25(水) 17:27
No:31237
|
|
Title: Re:C言語のデバック中に
|
|
アクセス違反です。分割読み込みということは配列を使っていると思うので、範囲外にアクセスしていないか確かめてみてください。
53ポイント を手に入れた。
|
|
|
|
|
Name: 狼太郎 ..ぴよぴよ(207ポイント)
Date: 2009/03/25(水) 17:59
No:31238
|
|
Title: Re:C言語のデバック中に
|
|
管理人様の書いたプログラムをコピペしても同様の結果になってしまいます。
29ポイント を手に入れた。
|
|
|
|
|
Name: 狼太郎 ..ぴよぴよ(267ポイント)
Date: 2009/03/25(水) 21:09
No:31243
|
|
Title: Re:C言語のデバック中に
|
|
> RFVibra2.dll!100031e5()
[下のフレームは間違っているか、または見つかりません。RFVibra2.dll に対して読み込まれたシンボルはありません。]
と履歴にあります。
60ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(334,688ポイント)
Date: 2009/03/25(水) 21:38
No:31245
|
|
Title: Re:C言語のデバック中に
|
|
>DXライブラリのプログラムをデバックしようとすると一応言うことはききグラフィック
>も表示されるのですが、一回一回上記のエラーがでてデバックが終了しません
情報が少なすぎて断定はできないのですが、これは起動すれば絵が表示されるけど、
ウインドウを閉じて終了しようとしたときにエラーが出る、ということでしょうか?
もしそうであるなら、ひょっとして USBか何かのゲームパッドが刺さっていませんか?
もし刺さっていたら抜いて試してください。
163ポイント を手に入れた。
|
|
|
|
|
Name: 狼太郎 ..ぴよぴよ(315ポイント)
Date: 2009/03/26(木) 11:48
No:31269
| 解決!
|
Title: Re:C言語のデバック中に
|
|
>>Justyさん
ビンゴでした^^;;
ゲームパッドを抜いたら正常終了できました><
ありがとうございます。!
48ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..かけだし(1,871ポイント)
Date: 2009/03/26(木) 19:11
No:31272
|
|
Title: Re:C言語のデバック中に
|
|
横槍ですいません
この質問を読ませて貰って解決方法はわかったんですけどなんでUSBやらゲームパッドを差してると上記のエラーが出るんでしょうか?
59ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(334,770ポイント)
Date: 2009/03/26(木) 21:46
No:31276
|
|
Title: Re:C言語のデバック中に
|
|
>はわかったんですけどなんでUSBやらゲームパッドを差してると上記のエラーが出るんでしょうか?
以前に似たような質問がありました。
C言語何でも質問掲示板
ttp://www.play21.jp/board/formz.cgi?action=res&resno=26114&page=&lognum=82&id=dixq&rln=26163
今のところ症例が少ないので、原因ははっきりとしてないのですが、
どうも相性が悪い USBゲームパッドがあるみたいで、DxLib_End()の中の
ゲームパッドデバイス解放がらみ(ベンダーから提供されているドライバーの中っぽい)で
落ちているようです。
現状対策としては、関連ドライバを最新にする、そのパッドを使用しないくらいしかないのですが、
最悪 DxLib_End()の構造化例外を拾ってあげればとりあえず落ちなくなる可能性はありますね。
82ポイント を手に入れた。
|
|
|
|
Name: Ma ..入門者(2,544ポイント)
Date: 2009/03/25(水) 06:32
No:31214
|
|
Title: キーボードが反応しなくなる
|
|
・環境です。
C++ で、DXライブラリ 使ってます。
開発環境:BCC Developer
OS:Windows XP SP3
たまに、DXライブラリを使ったゲームをデバグしていると、急にキーボードが反応しなくなることがあるのですが
誰か同じ現象にあったことがある方、または原因が分かる方はいませんか?
キーボードが反応しなくなるのは、DXライブラリを使ったゲーム内のみで、他のタスクでは正常に反応します。
なお、コードやプログラムのミスの可能性はありません。
過去に作ったゲームを起動してみると(加工していない)、反応するべきなのに、キーボードが反応しなくなっています。
つまり、DXライブラリのゲーム、すべてでキーボードが反応しなくなっています。
また、OSを再起動すると回復しています。
同じような経験がある方、いるでしょうか?
2倍のポイントを手に入れた! 478ポイント を手に入れた。
|
|
|
|
Name: BEMANI ..上級者(23,273ポイント)
Date: 2009/03/25(水) 08:38
No:31216
|
|
Title: Re:キーボードが反応しなくなる
|
|
>>Maさん
1:デバッグしている場所でキー更新がされていない
これは単にプログラムのミスですが、その可能性はないそうなので・・・
2:二つ以上の、複数同時押しする場所でキーがきかない
これはキーボード自体が原因です。
あるキー押下情報が複数になると反応しなくなる場合があります。
解決手段は、キーの割り当てを変えるか、キーボードを購入するかです。
3:別のアプリケーションが起動して、そのゲームが非アクティブになった
アクティブ・非アクティブ問わずキー情報を更新しているのであればこれは違うと思います。
キーがきかない原因について、自分ではこれくらいしか言えないです。
申し訳ないです;
「何かした時にキーがきかない」等、より詳しい情報があれば何か解決結びつくかも知れません。
293ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..熟練のプログラマー(49,096ポイント)
Date: 2009/03/25(水) 14:33
No:31220
|
|
Title: Re:キーボードが反応しなくなる
|
|
私は、ウィルスバスターを起動してると、ShiftやCtrl、Altが反応しなくなったという事がありました。
その場合は、ゲームを例外に設定する事でキーボードは使えるようになりましたが、プログラム上で対応する事は出来なさそうでした。
108ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(71,968ポイント)
Date: 2009/03/25(水) 15:02
No:31223
|
|
Title: Re:キーボードが反応しなくなる
|
|
PCを購入した時に標準で付いて来る常駐系ソフトや、後にインストールしたユーティリティ系ソフトによって特定のキー操作が効かなくなる場合があるようです。
ところで、その症状は最近起こったものでしょうか?
もしそうなら、その前後に行なったこと(ソフトをインストールした等)が原因かもしれません。
(キーボードフックが関連しそうです)
私の場合は、あるユーティリティ系ソフトを使っていると、
たまにキー操作がおかしくなったことがありました。
(そのせいでそのソフトはもう使わなくなりましたが)
248ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..入門者(3,010ポイント)
Date: 2009/03/25(水) 21:26
No:31244
|
|
Title: Re:キーボードが反応しなくなる
|
|
皆さん返答ありがとうございます。
ですが、皆さんの回答を読んでみると、DXライブラリを使用したゲーム外でも
キーボードが使えなくなっているようですが、私の場合
DXライブラリを使ったアプリでのみキーボードが反応しなくなっています。
(OSを再起動してみると、再起動前までは反応がなかったゲーム(加工していない)が反応するようになりました。)
>2:二つ以上の、複数同時押しする場所でキーがきかない
キーひとつでも複数でも反応しないです。
>私は、ウィルスバスターを起動してると、ShiftやCtrl、Altが反応しなくなったという事がありました。
私の場合は、すべてのキーでした。><
>後にインストールしたユーティリティ系ソフトによって特定のキー操作が効かなくなる場合があるようです。
たしかに、これがありえるような気がします。
>「何かした時にキーがきかない」等、より詳しい情報があれば何か解決結びつくかも知れません。
もう少し、調査してみたいところなのですが、滅多に起きない症状なので、検証が難しい状況ですorz
ただ、キーの入力情報は
char Buf[ 256 ] ;
GetHitKeyStateAll( Buf ) ;
によって入手しているという事ぐらいでしょうか…
もしかしたら、GetHitKeyStateAll の方に私のPCの何かと相性が悪いのかもしれませんね。
466ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(10,246ポイント)
Date: 2009/03/26(木) 05:33
No:31249
|
|
Title: Re:キーボードが反応しなくなる
|
|
症状を見る限りではオーバーフローを起こしている可能性が
最も高いと思えます。
別の方の作ったプログラムでも再現されるのでしょうか?
まずこの点を確認するのが良いかと思います。
44ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..入門者(3,114ポイント)
Date: 2009/03/26(木) 07:01
No:31250
|
|
Title: Re:キーボードが反応しなくなる
|
|
>別の方の作ったプログラムでも再現されるのでしょうか?
別のプログラム、つまり他のゲームということですよね?
>つまり、DXライブラリのゲーム、すべてでキーボードが反応しなくなっています。
↑他のプログラムでも同じように、反応しません。
104ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(10,312ポイント)
Date: 2009/03/26(木) 07:41
No:31251
|
|
Title: Re:キーボードが反応しなくなる
|
|
> ↑他のプログラムでも同じように、反応しません。
解りづらくてすみません、私が聞きたかったのは
症状が出てからの他のプログラムの動作ではなく、
DXライブラリを使った他の方のプログラム使用中に
同様の症状が発生するのかどうかです。
66ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..入門者(3,274ポイント)
Date: 2009/03/26(木) 07:51
No:31252
|
|
Title: Re:キーボードが反応しなくなる
|
|
>DXライブラリを使った他の方のプログラム使用中に
>同様の症状が発生するのかどうかです。
(以下、私のSooAさんの発言に対しての解釈が合っているか分かりません…)
私の言い方が悪いのでしょうね。すみません。
DXライブラリで作ってあるゲームA、ゲームB、ゲームCがあるとすれば
すべてのゲームA,B,Cにおいて、キーが反応しなくなります。
同時に起動していようが、ひとつずつ起動しようが、すべて反応しません。
という事で合ってますよね?(SooAさんが仰っている事に対しての、私の解釈)
あ、もしかしてゲームAが動作中に、ゲームBを起動して
そのゲームBを起動後に突然症状が発生するかということでしょうか?
そういうことでしたら、その時の状況があまり覚えていないので確かではないですが、
ゲームは一個しか起動していませんでしたし、起動時から、すでにキーボードは反応しなくなっていました。
160ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(57,307ポイント)
Date: 2009/03/26(木) 18:22
No:31271
|
|
Title: Re:キーボードが反応しなくなる
|
|
公開しても差し支えがないならプロジェクト丸ごとをアップされるのがよいのではないでしょうか?
そのプロジェクトでほかの人のPCでも同様の現象が発生するのであれば、プログラムに問題がある可能性が高いですし、発生しないのであればMaさんのPCの問題と切り分け出来るでしょう。
いくつか質問
1.DXライブラリで作っていないDirectXを使用しているソフトでは問題ないのでしょうか?
2.現象が発生するのはデバッグ中だけですか?
EXEを直接起動した場合や、リリースビルドして実行した場合に発生しないのでしょうか?
3.使用しているDXライブラリのバージョンは?
最新でないのなら最新にして見るとか。
4.現象が発生するようになった前にDirectXに絡みそうなところでPCの設定かえたり、何かのソフトをインストール(or 更新)したりしましたか?(覚えてないかもしれませんけど)
254ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..入門者(4,663ポイント)
Date: 2009/03/26(木) 21:04
No:31275
|
|
Title: Re:キーボードが反応しなくなる
|
|
>公開しても差し支えがないならプロジェクト丸ごとをアップされるのがよいのではないでしょうか?
>そのプロジェクトでほかの人のPCでも同様の現象が発生するのであれば、
>プログラムに問題がある可能性が高いですし、発生しないのであればMaさんのPCの問題と切り分け出来るでしょう。
すいません、ちょっと公開しにくいです><
>そのプロジェクトでほかの人のPCでも同様の現象が発生するのであれば
ちょっと、これは難しいと思います。
私のPCでさえ、滅多にキーボードが反応しなくなる事はありません。
本当にまれに起きる症状なので、同様の症状が他のPCで起きるかどうか確認するのは
かなり大変な事になると思います…
私の場合、今回の件を除けば、最後に反応しなかったのは、一ヶ月ぐらい前だったような気がします。
(毎日平均3時間くらい、いじっています)
この一ヶ月前というのも、今回と同様の症状でしたが、OSの再起動で直りました。
もうひとつのPCで、テストプレイした事が6回程度ありますが、この六回では一切問題ありませんでした。
>1.DXライブラリで作っていないDirectXを使用しているソフトでは問題ないのでしょうか?
反応しなくなった時に、DXライブラリ以外のゲームでチェックをしていなかったので、なんともいえないです。
キーボードが反応しなくなった時と限らなければ、まったく問題ないです。
>2.現象が発生するのはデバッグ中だけですか?
> EXEを直接起動した場合や、リリースビルドして実行した場合に発生しないのでしょうか?
EXEを直接起動した場合も、同様に反応しません。リリースビルドも同様です。
>4.現象が発生するようになった前にDirectXに絡みそうなところでPCの設定かえたり、何かのソフトをイン>ストール(or 更新)したりしましたか?(覚えてないかもしれませんけど)
すいません、覚えていないです。
ちょっと今の状況と情報量では、原因の究明や進展は得られにくいと思うので、
また同様の症状が発生した時に、書き込みしようかと思います。(新しいスレになると思いますが)
その時は、OS再起動しないように努めます。
702ポイント を手に入れた。
|
|
|
|
Name: ざこ ..熟練のプログラマー(41,890ポイント)
Date: 2009/03/25(水) 18:56
No:31239
|
|
Title: デバッグ(MFC)
|
|
InitDialogの中身を見たいのですがブレークポイントをつけてデバッグ実行するとプログラムが起動してダイアログ出現後の内容は見れるのですがダイアログ出現前つまりInitDialogの中身を見れません。ステップインすると変な所にいくし、どうすればいいのかわかりません。VC++6.0 MFCです。
125ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(154,377ポイント)
Date: 2009/03/25(水) 20:44
No:31242
|
|
Title: Re:デバッグ(MFC)
|
|
止めたい場所にSleep(1);とか書いて、そこをブレイクポイントに設定するとかはどうですか?
38ポイント を手に入れた。
|
|
|
|
Name: tkmakwins15 ..比類無きプログラマー(95,005ポイント)
Date: 2009/03/26(木) 09:42
No:31257
|
|
Title: VC2005のsprintf
|
|
VC2005で、次のプログラムを実行すると、実行時エラーが起きてしまいます。なぜでしょうか?
//C++としてコンパイルしています。
#include<cstdio>
int main()
{
char buf[1024]={0};
int n=0;
std::sprintf(buf,"%x%n",4892345,&n);
std::printf("%s,%d",buf,n);
}
エラーが起きる最小のプログラムです。エラーメッセージも一応添付しておきます。
180ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(72,410ポイント)
Date: 2009/03/26(木) 10:07
No:31264
|
|
Title: Re:VC2005のsprintf
|
|
MSDN で調べてみると、%nは「ストリームまたはバッファにこれまでに書き込まれた文字数」
とあります。
そしてこれは、セキュリティ上の理由で限定では無効となっていて、
実行時エラー(無効なパラメータ ハンドラ)が発生します。
%nを有効にするには、 _set_printf_count_output(1); を事前に呼び出す必要があります。
98ポイント を手に入れた。
|
|
|
|
Name: wood ..ぴよぴよ(117ポイント)
Date: 2009/03/25(水) 20:22
No:31240
|
|
Title: NPCの当たり判定
|
|
初めまして。
質問なのですが、NPCを実装させたく
ゲームプログラミングの館の24章のプログラムの
can_or_cannot関数を元にNPCキャラクターの当たり判定を
いじれば出来ると思うのですが、具体的にどうすれば良いのかが分かりません;;
分かる方教えていただけないでしょうか?
117ポイント を手に入れた。
|
|
|
|
Name: SooA [URL] ..中級者(10,202ポイント)
Date: 2009/03/26(木) 05:13
No:31248
|
|
Title: Re:NPCの当たり判定
|
|
お早うございます。
> can_or_cannot関数を元にNPCキャラクターの当たり判定を
can_or_cannot はマップ当たり判定用のようですから
NPCデータには向かないと思います。
PCキャラとNPCキャラの表示上の違いを考えてみてください。
PCキャラは ch.x、ch.y、ch.muki、と移動フラグで構成されています。
プレイヤーが操作できるという点以外はNPCキャラの表示も同じで
例えば npc.x、npc.y を用意して、その値が
PCキャラの座標の隣にあり、PCがその方向を向いていれば
そこにNPCが居るという事になります。
NPCを移動させたり沢山配置するのは現段階では難しいので
まずNPC1体分の構造体を作って当たり判定をテストして
みましょう。
197ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(74,891ポイント)
Date: 2009/03/26(木) 08:57
No:31253
|
|
Title: Re:NPCの当たり判定
|
|
以前もこんな質問があった気がして、
自分のPC探索してたら出てきましたw
ちょと前に作って見たやつです。
いわゆるNPCにPCが衝突したら消える
なんてプログラムです。
解析はご自由に^^;
(参考にならないなぁ・・・多分)
SooAさんのおっしゃる雰囲気で作ってあるはずですが^^;
83ポイント を手に入れた。
|
|
|
|
|
Name: wood ..ぴよぴよ(148ポイント)
Date: 2009/03/26(木) 10:26
No:31265
| 解決!
|
Title: Re:NPCの当たり判定
|
|
>>SooAさん、kazuoniさん
本当にありがとうございます!!
出来たっぽいです^^
can_or_cannotの向きの所に無理矢理ねじ込んでやってたのですが
それがいけなかったんですね;;
ありがとうございましたm(_ _)m
31ポイント を手に入れた。
|
|
|
|
Name: Ma ..入門者(3,938ポイント)
Date: 2009/03/26(木) 09:43
No:31258
|
|
Title: ofstream の テキスト を消去する方法
|
|
標準ライブラリにある、 fstream の ofstream において、
グローバル変数に、ofs とあったとします。
ofstream ofs("test.txt");
このように、宣言したofstream を、
ofstream logg( "test.txt",ios::trunc);
とやらずに、test.txt 内の内容を消去する方法はありませんか?
reference を見たのですが、 flush() も clear() もそれらしくはないので、困り果ててます。
ちなみに、ofstream logg( "test.txt",ios::trunc);
では、extern などで、 他の cpp ファイルで呼び出す時に、出力の順番がおかしくなるため、避けています。
もし、ofstream logg( "test.txt",ios::trunc); を避けられないようなら、出力の順番の話を
もう少し詳しく説明してみようと思います。
2倍のポイントを手に入れた! 664ポイント を手に入れた。
|
|
|
|
Name: tkmakwins15 ..比類無きプログラマー(95,060ポイント)
Date: 2009/03/26(木) 09:49
No:31259
|
|
Title: Re:ofstream のtxtの消去する方法
|
|
すでにofstreamで開いたファイルの内容を消したければ、
logg.close();
logg.open("test.txt",ios::trunc);
でいいと思います。
55ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..入門者(3,961ポイント)
Date: 2009/03/26(木) 10:02
No:31262
| 解決!
|
Title: Re:ofstream のtxtの消去する方法
|
|
>>tkmakwins15
上手くできました!
ありがとうございました<(_ _)>
23ポイント を手に入れた。
|
|
|
|
Name: piyo ..かけだし(1,130ポイント)
Date: 2009/03/25(水) 14:08
No:31218
|
|
Title: isdigitの使い方
|
|
はじめまして。
C初心者で特にポインタ関係がいまいち理解できません。。
そのせいもあり、isdigitがうまく動きません。
どこがおかしいのかどなたかご教授お願いします。
以下ソース抜粋です。。
したいことは、引数で取得した値の数値チェックです。
がサブのisdigitでsegmentation faultになります。。
●メイン
int main(int argc, char **argv){
char *c;
int rtn;
rtn=sub(argv,&c);
:
}
●サブ
int sub(char **argv, char **c){
int i;
:
*c=(char *)malloc(sizeof(char)*(strlen(argv[2])+1);
strcpy(*c,argv[2])
for(i=0;i<strlen(*c); i++){
if (isdigit(*c[i]) == 0){
printf("error!\n");
}
}
}
2倍のポイントを手に入れた! 454ポイント を手に入れた。
|
|
|
|
Name: Mist ..熟練のプログラマー(56,764ポイント)
Date: 2009/03/25(水) 14:48
No:31221
|
|
Title: Re:isdigitの使い方
|
|
> strcpy(*c,argv[2])
どういうふうに入力しているのか判りませんけど、argv[1]の間違いじゃないですか?
※ソースを記載する場合は規約に従って字下げしてください。
55ポイント を手に入れた。
|
|
|
|
|
Name: piyo ..かけだし(1,176ポイント)
Date: 2009/03/25(水) 14:53
No:31222
|
|
Title: Re:isdigitの使い方
|
|
>Mistさん
すみません。
入力したときにスペースを入れたつもりだったのですが、
なってませんでした。
argv[2]も[1]の間違いです。
申し訳ありませんでした。。
46ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(9,842ポイント)
Date: 2009/03/25(水) 15:19
No:31225
|
|
Title: Re:isdigitの使い方
|
|
> 入力したときにスペースを入れたつもりだったのですが、
> なってませんでした。
スペース入れてもダメですよ。
規約を読んでください、ソースを投稿する方法が書いてあります。
とりあえず malloc のとこ閉じカッコが足りないねぇ。
54ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(56,851ポイント)
Date: 2009/03/25(水) 15:44
No:31227
|
|
Title: Re:isdigitの使い方
|
|
ヒントを出すと
*c[i]
この書き方ではあなたの期待する通りに動作していません。
そのため、2文字目以降は期待しているところとは違うところを参照しているため正常に動作しません。
87ポイント を手に入れた。
|
|
|
|
|
Name: piyo ..かけだし(1,374ポイント)
Date: 2009/03/25(水) 16:07
No:31230
|
|
Title: Re:isdigitの使い方
|
|
>SooAさん
すみません。それも抜けてました。。
>Mistさん
こちらの拙い質問に、何度も返信ありがとうございます。
実際、for文で文字数分まではまわらないけれども、
何回かは(実際4文字の数字を引数に入力して実行した場合は3回)動いていました。
やっぱりポインタはむずかしいです。。
2倍のポイントを手に入れた! 198ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(136,988ポイント)
Date: 2009/03/25(水) 22:55
No:31246
|
|
Title: Re:isdigitの使い方
|
|
> サブのisdigitでsegmentation faultになります。。
提示されたソースコードはコンパイルが通りません。
コンパイルが通るソースコードを<pre>と</pre>ではさんで
提示してください(<>は半角で)。
64ポイント を手に入れた。
|
|
|
|
|
Name: piyo ..入門者(2,580ポイント)
Date: 2009/03/26(木) 09:17
No:31254
|
|
Title: Re:isdigitの使い方
|
|
>boxさん
見ていただいてありがとうございます。
通らなかったですか。。。自分のソースコードから抜粋しているからかもです。
メインです
#include <stdio.h>
#include <stdlib.h>
extern int sub();
int main(int argc,char **argv)
{
int i_sr;
char *hikisu
i_sr = sub(argc, argv, &hikisu );
if ( i_sr != 0 ){
return 1;
}
return 0;
}
サブです
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <memory.h>
int sub(argc, argv, hikisu)
int argc;
char argv;
char **hikisu;
{
int i;
*hikisu = (char *)malloc(sizeof(char)*(strlen(argv[1])+1));
if ( *hikisu == NULL ){
return 1;
}
strcpy(*hikisu, argv[1]);
for (i=0; i<strlen(*hikisu); i++) {
if ( isdigit(*hikisu[i]) == 0 ){
return 1;
}
}
return 0;
}
subでわざわざ引数を取得(mallocしたりstrcpyしたり)しているのは、
sub以降にも他のサブがあってそこで使用したいからです。
(ソースは抜粋です)
2倍のポイントを手に入れた! 1,206ポイント を手に入れた。
|
|
|
|
|
Name: piyo ..入門者(2,663ポイント)
Date: 2009/03/26(木) 09:31
No:31255
|
|
Title: Re:isdigitの使い方
|
|
>Mistさん
優先順位はいまいち?だったのですが、
*c[i]
を
(*c)[i]
こうするとうまくうごきました。
*とc、cと[i]の結合?優先?が
ちゃんと判断されていなかったということでしょうか。
83ポイント を手に入れた。
|
|
|
|
|
Name: piyo ..入門者(2,721ポイント)
Date: 2009/03/26(木) 09:38
No:31256
| 解決!
|
Title: Re:isdigitの使い方
|
|
みなさまありがとうございました。
結局タイトルの「isdigitの使い方」でもポインタが原因でもなかったですが、
本当にお世話になりました。
これからも宜しくお願いします。
58ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(57,020ポイント)
Date: 2009/03/26(木) 09:50
No:31260
|
|
Title: Re:isdigitの使い方
|
|
その通りです。
*c[i]
こう書いた場合は[]が優先して解決されるので
*(c[i])
と同じです。
実際には違うのですが、c[0][i]と処理したいのにc[i][0]と処理していると考えれば間違いがわかりやすいかと思います。
61ポイント を手に入れた。
|
|
|
|
Name: Flime ..ぴよぴよ(453ポイント)
Date: 2009/03/25(水) 15:11
No:31224
|
|
Title: 構造体を関数へ渡したい
|
|
またまた失礼します。
以下のように、3人分の体重を扱う構造体を、
メイン関数の中で作りましたが…。
void put(■■■){
a[0].weight = 59.3;
a[1].weight = 62.7;
a[2].weight = 81.4;
}
int main(){
int i;
typedef struct {double weight;} person;
person a[3];
put(◆◆◆);
printf("3人の体重は、それぞれ");
for(i=0;i<3;i++)printf(" %d キログラム " , a[i].weight );
printf("です。");
}
■■■の部分と、◆◆◆の部分には、何を書けばいいのでしょうか?
いろいろ試してみましたがどうもうまくいきません。
『 typedef struct {double weight;} person; 』この1行を、
メイン関数とput関数の外へと持っていくしかないのでしょうか?
231ポイント を手に入れた。
|
|
|
|
Name: SooA [URL] ..中級者(10,005ポイント)
Date: 2009/03/25(水) 15:31
No:31226
|
|
Title: Re:構造体を関数へ渡したい
|
|
#include <stdio.h>
typedef struct {
double weight;
} person;
void put( person *a ){
a[0].weight = 59.3;
a[1].weight = 62.7;
a[2].weight = 81.4;
}
int main(){
int i;
person a[3];
put( &a[0] ) ;
printf( "3人の体重は、それぞれ" ) ;
for( i=0; i<3; i++ )
printf( " %.1f キログラム ", a[i].weight );
printf( "です。" );
}
となるかな?
未確認ですので確認してください ^ ^;
ソース修正しました。
163ポイント を手に入れた。
|
|
|
|
|
Name: Flime ..ぴよぴよ(544ポイント)
Date: 2009/03/25(水) 15:59
No:31228
|
|
Title: Re:構造体を関数へ渡したい
|
|
素早い回答ありがとうございます。
%dではなく%lfでしたね(^^;)
やはり構造体をグローバルにするしかないのでしょうか?
なるべくグローバル変数は使いたくないのですが…。
わがままを言って申し訳ありません(><)
91ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(72,108ポイント)
Date: 2009/03/25(水) 16:05
No:31229
|
|
Title: Re:構造体を関数へ渡したい
|
|
> やはり構造体をグローバルにするしかないのでしょうか?
> なるべくグローバル変数は使いたくないのですが…。
構造体の宣言をグローバルにおいても、グローバル変数にはなりません。
ちょうど、 SooA さんのコードになります。
(グローバル変数は一切使っていませんよ)
2倍のポイントを手に入れた! 140ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(20,751ポイント)
Date: 2009/03/25(水) 16:12
No:31231
|
|
Title: Re:構造体を関数へ渡したい
|
|
>%dではなく%lfでしたね(^^;)
%.1fと%lfは違いますよ。
>やはり構造体をグローバルにするしかないのでしょうか?
>なるべくグローバル変数は使いたくないのですが…。
構造体の「宣言」をグローバルにしても「定義」をローカルにすれば「グローバル変数」にはなりません。
ローカル宣言型にしたいということなら、その構造体を使うすべての関数がその型を知っている必要がありますね。
何が言いたいかというと、SooAさんのコードに「グローバル変数」はありません。
189ポイント を手に入れた。
|
|
|
|
|
Name: Flime ..ぴよぴよ(658ポイント)
Date: 2009/03/25(水) 16:18
No:31232
| 解決!
|
Title: Re:構造体を関数へ渡したい
|
|
なるほどなるほど、理解できました。
構造体の宣言をグローバルな場所に書いただけなので、
グローバル変数にはならない、ということですね。
%.1fに関しては、見間違えただけです…ごめんなさい。
お騒がせしました。ありがとうございましたm(_ _)m
114ポイント を手に入れた。
|
|
|
|
Name: ひよこ ..上級者(23,883ポイント)
Date: 2009/03/24(火) 22:40
No:31205
|
|
Title: サンプルプログラムの館の
|
|
今日サンプルプログラムの館へ行ってサンプルプログラムの館の荒らしコメ非表示ツールをどんなものかな?
と思ってダウンロードしに言ったら、
サンプルプログラムの館の荒らしコメ非表示ツールのサンプルの本体のダウンロードのところにZipがありませんでした。
43ポイント を手に入れた。
|
|
|
Name: yussanstar ..ぴよぴよ(428ポイント)
Date: 2009/03/22(日) 00:46
No:31154
|
|
Title: 超基本的なこと
|
|
超基本的なことを訊きます。
パッドってなんですか?キーボードとどう違うんですか?
実は今、龍神録プログラミングの館で勉強しているのですが、
キーコンフィグに対応させてみようのところで行き詰ってしまいました。
「キーボードで入力してもパッドで入力しても対応させたいので、
キーボードの入力状態を、コンフィグで設定したパッド情報にいれて
両方に対応出来るようにしてやります」
という記述です。一体パッドとは何なんでしょう
2倍のポイントを手に入れた! 364ポイント を手に入れた。
|
|
|
|
Name: BEMANI ..上級者(22,980ポイント)
Date: 2009/03/22(日) 00:53
No:31155
|
|
Title: Re:超基本的なこと
|
|
>>yussanstarさん
ジョイパッドのことです。
USBにコントローラあるいはコンバータからゲームのコントローラを繋いだりでき、それを入力装置とします。
キーボードも入力装置ですが、プレステ等のコントローラをPCに繋ぐイメージです。
それで、ゲームを操作しますのでキーボードより慣れてる人は多いのではないかなぁと思います。
実物見た方が解りやすいと思うのでグーグル等で「ジョイパッド」等で検索してみましょう。
90ポイント を手に入れた。
|
|
|
|
Name: hiro ..かけだし(2,205ポイント)
Date: 2009/03/21(土) 17:33
No:31144
|
|
Title: 無題
|
|
構造体のメンバについて質問です。
「シューティングゲームの館」を参考にして、敵ショット構造体を作りました。
//敵ショット
typedef struct{
int flag,pattern,counter,kind;
int up_flag;
double mem_ex,mem_ey,mem_px,mem_py;
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];//[200]
}ENEMY_SHOT_t;
これが、GlobalVariable.h,ExternGV.hに記述してあります。
ですがこれでコンパイルして実行すると、実行直後に
「問題が発生したため、Shot4.exeを終了します。ご不便をおかけして申し訳ありません。・・・」
と表示され、プログラムが終了してしまいます。
しかし、敵ショット構造体を
//敵ショット
typedef struct{
int flag,pattern,counter,kind;
double mem_ex,mem_ey,mem_px,mem_py;
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];//[200]
}ENEMY_SHOT_t;
に変更すると、プログラムは問題なく動作します。
up_flagはプログラム内のどこからもアクセスされていません。(検索で確認済みです)
どうしてこのようなことが起きるのか、はじめに記した構造体を使うにはどうすればよいか教えてください。
環境はOS:Windows XP Home Edition SP2
コンパイラ:Borland C++ Compiler 5.5
です。よろしくお願いします。
2倍のポイントを手に入れた! 1,042ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(334,330ポイント)
Date: 2009/03/21(土) 19:30
No:31149
|
|
Title: Re:無題
|
|
>どうしてこのようなことが起きるのか
確保された領域の外に対して書き込みを行ったとか、プログラムの領域以外のメモリを
実行しようとしたとか。
まずは配列系を見直して、領域外にアクセスしているところがないか、
調べてみてはどうでしょうか。
2倍のポイントを手に入れた! 182ポイント を手に入れた。
|
|
|
|
|
Name: hiro ..かけだし(2,316ポイント)
Date: 2009/03/24(火) 23:08
No:31206
|
|
Title: Re:無題
|
|
配列やポインタ等見直しましたが、これといっておかしなところは見つけられませんでした。
そこでデバッガを使おうとしましたが、Turbo Debugger 5.5は使い方がよくわからなかったので、
Visual C++ 2008 Express Editionをインストールしてコンパイルしたところ、
エラーも出ず動いてしまいました。
・・・一体何があったのでしょうか
やはり根本的な解決にはなっていないと考えるべきですか?
111ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(20,408ポイント)
Date: 2009/03/24(火) 23:54
No:31207
|
|
Title: Re:無題
|
|
実行直後とは具体的に、WinMainに入って直後でしょうか?
例えば、WinMainの一番最初にMessageBoxを呼ぶと、メッセージボックスは表示されますか?
37ポイント を手に入れた。
|
|
|
|
Name: ランナー ..ぴよぴよ(8ポイント)
Date: 2009/03/21(土) 05:25
No:31125
|
|
Title: 無題
|
|
DXライブラリをダウンロードしてどこのプロジェクトからでも利用できるように、ツール→オプション→VC++ディレクトリ→ディレクトリを表示するプロジェクトの欄からインクルードファイルにDXライブラリのプロジェクトに追加すべきファイル_VC用フォルダがある階層のパスを追加し、同様にライブラリファイルにもフォルダパスを追加したのですが、>LINK : fatal error LNK1104: ファイル '..\include\DxLib.lib' を開くことができません。というエラーがでます。リンクできていない理由がわからないので教えてください。
8ポイント を手に入れた。
|
|
|
|
Name: SooA ..中級者(9,599ポイント)
Date: 2009/03/21(土) 06:31
No:31126
|
|
Title: Re:無題
|
|
>VC用フォルダがある階層のパスを追加
下記フォルダがある階層(DxLib_VC)を追加したと読めるので
念のためお聞きしますが、追加したのは
「プロジェクトに追加すべきファイル_VC用」フォルダに
なっていますか?
94ポイント を落としてしまった。
|
|
|
|
|
Name: ランナー ..ぴよぴよ(94ポイント)
Date: 2009/03/21(土) 14:06
No:31130
|
|
Title: Re:無題
|
|
情報不足で申し訳ないです。CドライブのDxLibフォルダ内に入っているので、C:\DxLib_VC\プロジェクトに追加すべきファイル_VC用をインクルードファイルとライブラリファイルに設定しています。
86ポイント を手に入れた。
|
|
|
|
|
Name: ランナー ..ぴよぴよ(0ポイント)
Date: 2009/03/22(日) 13:28
No:31157
|
|
Title: Re:無題
|
|
パス変更後にリビルドは行っていますが同じエラーがでます。そしてまだ実際にどのプロジェクトからでもDXライブラリが利用できるかどうか試している段階なのでここにあるサイトのサンプルプログラムをコピーペーストして実行しているだけなので自作のテストソースはないですね。
103ポイント を落としてしまった。
|
|
|
|
|
Name: ランナー ..ぴよぴよ(88ポイント)
Date: 2009/03/24(火) 03:25
No:31199
|
|
Title: Re:無題
|
|
Dxライブラリの使い方の解説ページのはwin32コンソールアプリケーション→空のプロジェクトにチェックをいれてという手順でプロジェクト生成していたのでその可能性はありますね。確認してみます。
88ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(28,553ポイント)
Date: 2009/03/24(火) 13:23
No:31203
|
|
Title: Re:無題
|
|
>ここにあるサイトのサンプルプログラムをコピーペーストして実行している
原因はこれかな
龍神録プログラミングの館のソースであればincludeフォルダを作ってその中にヘッダやライブラリを入れるように記述してあるのでソースだけコピーしてもエラーになります
84ポイント を手に入れた。
|
|
|
|
Name: dic ..上級者(15,829ポイント)
Date: 2009/03/23(月) 04:32
No:31182
|
|
Title: バックアップソフトを作っているのですが
|
|
バックアップソフトを作っているのですが
FindFirstFile FindNextFile 関数で階層的に指定したフォルダ以下のファイル構造を取得
しようとしています
現在動作テスト中なのですが Cドライブの ProgramFiles フォルダと Windows ファルダの
取得ファイル数、フォルダ数が計算結果と一致しないのです
検証の方法はフォルダを右クリック→プロパティでファイル数、フォルダ数をチェック
その後、自作のファイル構造取得プログラムでメッセージボックスにてファイル数、フォルダ数を
確認しているのですが、どうしても上記の2フォルダのみ異なった値になります
色々、調べたところセキュリティソフトのフォルダにはアクセスできなくなっていてて
それが原因で以下のファイル構造が取得できないのかなと考えています
どうすれば、きちんとファイル構造を取得できるのでしょうか?
また、システムフォルダにはアクセスできないのでしょうか?
270ポイント を手に入れた。
|
|
|
|
Name: Mist ..熟練のプログラマー(56,709ポイント)
Date: 2009/03/23(月) 11:55
No:31184
|
|
Title: Re:バックアップソフトを作っているのですが
|
|
昔作ったソフトで似たようなことをしていたので、ちょっと改造して指定フォルダ以下のフォルダ数とファイル数を求めるプログラムを組んでみました。
システムファイルとか隠しファイルとかも特に問題なくアクセスできています。
私の環境ではProgram Filesではプロパティと同じ結果になりました。
WINDOWSでは、アプリのほうがフォルダ数+2、ファイル数+1と若干誤差がありました。
#include <iostream>
using namespace std;
#include <Windows.h>
#include <shlwapi.h> // PathRemoveFileSpec()
#pragma comment(lib, "shlwapi.lib") // PathRemoveFileSpec()
void FileSearch(
char *ppath,
int *num_dir,
int *num_file
) {
HANDLE hFind;
WIN32_FIND_DATA fd;
/* 最初のファイル検索 */
hFind = FindFirstFile(ppath, &fd);
/* 検索失敗? */
if(hFind == INVALID_HANDLE_VALUE) {
printf("検索失敗\n");
return; /******** エラー終了 ********/
}
PathRemoveFileSpec(ppath);
do {
/* 結果の表示 */
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if ((strcmp(fd.cFileName, ".")) && (strcmp(fd.cFileName, ".."))) {
printf("%08d ディレクトリ名: %s\n", *num_dir, fd.cFileName);
(*num_dir)++;
// ディレクトリ内の探索
char nextpath[MAX_PATH];
sprintf(nextpath, "%s\\%s\\*.*", ppath, fd.cFileName);
FileSearch(nextpath, num_dir, num_file);
}
} else {
printf("%08d ファイル名: %s\n", *num_file, fd.cFileName);
(*num_file)++;
}
} while(FindNextFile(hFind, &fd)); //次のファイルを検索
/* 検索終了 */
FindClose(hFind);
return;
}
int main(int argc, char *argv[])
{
int num_dir = 0;
int num_file = 0;
char path[MAX_PATH];
sprintf(path, "%s\\*.*", argv[1]);
FileSearch(path, &num_dir, &num_file);
printf("dir = %d, file = %d\n", num_dir, num_file);
return 0;
}
676ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(16,790ポイント)
Date: 2009/03/23(月) 20:12
No:31191
|
|
Title: Re:バックアップソフトを作っているのですが
|
|
Mistさん回答ありがとうございます
ちょっと改造して表示したのですが Program Files のファイル数は一致したのですが
C:\Windows フォルダは1〜2個の誤差がでますね
はじめに断っておけばよかったのですが、システムファイルはバックアップする予定でなく
自分の作ったソースコードの自動バックアップ機能が欲しかったのです
なのでこれで良しとしておきます
#include <iostream>
using namespace std;
#include <Windows.h>
#include <shlwapi.h> // PathRemoveFileSpec()
#pragma comment(lib, "shlwapi.lib") // PathRemoveFileSpec()
void FileSearch(
char *ppath,
int *num_dir,
int *num_file
) {
HANDLE hFind;
WIN32_FIND_DATA fd;
/* 最初のファイル検索 */
hFind = FindFirstFile(ppath, &fd);
/* 検索失敗? */
if(hFind == INVALID_HANDLE_VALUE) {
printf("検索失敗\n");
return; /******** エラー終了 ********/
}
PathRemoveFileSpec(ppath);
do {
/* 結果の表示 */
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if ((strcmp(fd.cFileName, ".")) && (strcmp(fd.cFileName, ".."))) {
// printf("%08d ディレクトリ名: %s\n", *num_dir, fd.cFileName);
(*num_dir)++;
// ディレクトリ内の探索
char nextpath[MAX_PATH];
sprintf(nextpath, "%s\\%s\\*.*", ppath, fd.cFileName);
FileSearch(nextpath, num_dir, num_file);
}
} else {
// printf("%08d ファイル名: %s\n", *num_file, fd.cFileName);
(*num_file)++;
}
} while(FindNextFile(hFind, &fd)); //次のファイルを検索
/* 検索終了 */
FindClose(hFind);
return;
}
int main(int argc, char *argv[])
{
int num_dir = 0;
int num_file = 0;
char path[MAX_PATH];
wsprintf( path, "%s\\*", "C:\\WINDOWS" );
// sprintf(path, "%s\\*.*", argv[1]);
FileSearch(path, &num_dir, &num_file);
printf("dir = %d, file = %d\n", num_dir, num_file);
return 0;
}
YuO さん回答ありがとうございます
アクセス権限なども絡んでくるんですね
英語の解説は読めないのでちょっと諦めておきます
わざわざ海外までありがとうございました
961ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(16,828ポイント)
Date: 2009/03/24(火) 06:27
No:31200
|
|
Title: Re:バックアップソフトを作っているのですが
|
|
うまくいかなかったソース載せておきます
環境はVC++6です
2倍のポイントを手に入れた! 38ポイント を手に入れた。
|
|
|
|
Name: lawliet ..ぴよぴよ(301ポイント)
Date: 2009/03/22(日) 17:28
No:31163
|
|
Title: どうか教えてください
|
|
Vsual c++ 2008 をDLし、C言語を勉強しているのですが、
プログラムを組み、ビルドするのですが、必ずビルドエラーが起きてしまいます。
なぜなのか教えていただけないでしょうか。
65ポイント を手に入れた。
|
|
|
|
Name: 朽木 ..中級者(9,880ポイント)
Date: 2009/03/22(日) 18:54
No:31167
|
|
Title: Re:どうか教えてください
|
|
こんにちは。突然ですが、私の事はご存じでしょうか。@@
本当に突然で「はぁ?」と思われた方もいらっしゃるかもしれません。しかし、
私はあなたの事は全く知りません。男かも女かも、どんな人柄なのかも分かりません。
ある日道を歩いていて突然、知らない人に「俺、ゲームクリアできないんだけど。なんで?」と聞かれたら
「はぁ?」と、思うでしょう。今どこ?何ができないの?いや、そもそもそれ何のゲーム?@@??
「ここはインターネットです。マナーを守りましょう。」とよく言われますが、インターネットとそれを構成する
世界は同じ場所にあります。2次元でも4次元でもありません。人が操作して、その結果を返すだけのモノなのです。
そこでやりとりする情報は皆、共有する仕組みによって多くの人に届きます。それは知っている人だけ、とは
限りません。ましてやこんな時代ですから、国外の人も見るかもしれません。そんな人達に自分をどう伝えるのか。
どうすれば分かってくれるのかを考えなければ、どんなに優しい人や詳しい人でも理解できず、
適当(いい加減な意味ではありません)な答えを返すことができないでしょう。
まぁ、ここは日本語のサイトなので英語やスペイン語で質問する必要はないと思いますが。@@;
規約に指定があればそれに従う必要がありますが、この位の情報は載せたほうが良いです。
・何が起きたのか(問題)
・何をしたいのか(目的)
・どういう環境か(Win?Unix?Mac? 32bit?64bit? GCC?VC?MingW? ライブラリ?等々)
・問題について、自分は原因を何だと思っているか、それについて自分の力で調べ、実行してみたか(考察)
・他質問に応じて必要な内容、情報
規約に、必ず明確にしなければならない点が記載されていますので、そちらも見て下さい。
http://dixq.net/board/board.html
「文字が多いのは良くないんじゃないか」「文字が多いと怒られるんじゃないか」と心配する必要はありません。
回答者はより詳細な情報を求めています。なるべく詳しく調べ、よりリアルに状況を感じてもらうように、
複数行にわたって詳細に記述するなどして努力して下さい。
逆にその方が、問題解決や技術の向上に意欲があると認められ、良い印象を受けることがあるのです。@@
875ポイント を手に入れた。
|
|
|
|
|
Name: lawliet ..ぴよぴよ(363ポイント)
Date: 2009/03/23(月) 17:10
No:31190
| 解決!
|
Title: Re:どうか教えてください
|
|
へたくそな文ですいませんでした
不快な思いをさせてしまったでしょうか
今後もお世話になりますので注意します
親切な指摘ありがとうございます
エラーの件は、自分で考え解決することができました
ありがとうございました
62ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..中級者(9,885ポイント)
Date: 2009/03/23(月) 21:27
No:31192
|
|
Title: Re:どうか教えてください
|
|
>エラーの件は、自分で考え解決することができました
なぜ解決したのか、どういう手順で行ったら良かったのか、というのを紹介して頂けないでしょうか。
もし他の人が同じような問題に遭ってしまった時に、それが役に立ちます。@@
5ポイント を手に入れた。
|
|
|
|
Name: yn ..ぴよぴよ(333ポイント)
Date: 2009/03/22(日) 20:39
No:31171
|
|
Title: cygwin の導入方法について
|
|
Windows XP を利用しております。
cygiwin を使って gcc を導入しようと思い、以下のようにしたところうまくいきませんでした。
手順
1.http://cygwin.com/ より setup.exe をダウンロードし、実行。
2.次へを押し続け、ダウンロード元サイトより ftp://ftp.kaist.ac.kr を選択。
3.インストールするパッケージで、gcc-g++、gdb、及びそれらをクリックすると選択されるものを選択
4.インストール完了後、システムのプロパティ>詳細設定>環境変数 にて、
Path を編集(一番最後に ;c:\cygwin\bin を追加)。
コマンドプロンプトを起動し、
gcc --version
と入力→実行して動作確認をしようとしたところ、
'gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と表示されました。
ls などのコマンドは使えるようになっていました。
コマンドプロンプトからgccを使用できるようにするにはどうすればよいのでしょうか。
よろしくお願いします。
333ポイント を手に入れた。
|
|
|
|
Name: yn ..ぴよぴよ(424ポイント)
Date: 2009/03/22(日) 20:42
No:31172
|
|
Title: 補足
|
|
補足です。
同じことを Windows 7 Beta Build 7000 でも試したところ、
同じ状態になりました。
知人にも Windows Vista で同じことをしてもらったところ、
そちらも同じ状態になりました。
よろしくお願いします。
91ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(71,267ポイント)
Date: 2009/03/22(日) 20:49
No:31173
|
|
Title: Re:cygwin の導入方法について
|
|
c:\cygwin\bin の中には、 gcc.exe はありますか?
無いのであれば、正しくインストールされていないのだと思われます。
その場合、別のダウンロード元サイトを選択したり、再インストールするなどをすると改善することがあります。
(gcc-coreをインストールされていない可能性もあります)
113ポイント を手に入れた。
|
|
|
|
|
Name: yn ..ぴよぴよ(503ポイント)
Date: 2009/03/22(日) 20:53
No:31176
|
|
Title: Re:cygwin の導入方法について
|
|
gcc.exe
へのショートカットである
gcc.exe.lnk
はありましたが、gcc.exe 自体はありませんでした。
別のダウンロード元サイトを選択して再インストールしてみます。
79ポイント を手に入れた。
|
|
|
|
|
Name: yn ..ぴよぴよ(609ポイント)
Date: 2009/03/22(日) 21:47
No:31178
|
|
Title: Re:cygwin の導入方法について
|
|
Cドライブのcygwinフォルダを削除し、
ダウンロード元サイトを別のところにして再インストールしてみましたが、
ダメでした。
最初の質問に書いた時と同じ状態になってしまいました。
別のダウンロード元を試す以外に方法はありますでしょうか。
106ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(28,077ポイント)
Date: 2009/03/23(月) 09:40
No:31183
|
|
Title: Re:cygwin の導入方法について
|
|
cygwinのgccの本体はgcc-3.exeになります(gcc4をインストールしたらgcc-4.exeもありますが)
gcc.exe.lnkをたどると最終的にgcc-3.exeにリンクしています
コマンドプロンプトからなら
> gcc-3 --version
で実行すればいいでしょう
コマンドプロンプトではなくcygwin.batからだと
$ gcc --version
で実行できますよ
115ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(28,106ポイント)
Date: 2009/03/23(月) 16:15
No:31189
|
|
Title: Re:cygwin の導入方法について
|
|
以前インストールしたやつを見てみたらgcc-3.exeじゃなくてgcc.exeですね
最近cygwinの仕様が変わったのでしょうか
インストール時に前のバージョン(3.4.4-999ではなく 3.4.4-3)にしたら普通のgcc.exeがインストールされました
29ポイント を手に入れた。
|
|
|
|
Name: Flime ..ぴよぴよ(165ポイント)
Date: 2009/03/23(月) 14:12
No:31186
|
|
Title: mallocとfreeについて
|
|
char ***f;
f=(char ***)malloc(sizeof(char **)*13);
for(i=0;i<13;i++){
f[i]=(char **)malloc(sizeof(char *)*13);
}
for(i=0;i<13;i++){
for(j=0;j<13;j++){
f[i][j]=(char *)malloc(sizeof(char)*3);
}
}
このようにmallocしたメモリをfreeしたいのですが、
for(i=0;i<13;i++){
for(j=0;j<13;j++){
free(f[i][j]);
}
}
for(i=0;i<13;i++){
free(f[i]);
}
free(f);
これで正しいでしょうか?
エラーとかはなにも出ないのですが、正しくできているか不安です。
165ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(71,720ポイント)
Date: 2009/03/23(月) 14:47
No:31187
|
|
Title: Re:mallocとfreeについて
|
|
見たところ、一応正しく確保・開放されているようです。
もし、使用しているコンパイラが VC2005 以降のものであれば、
下記のデバッグ用関数を使用した方法で正しく行なわれているか確認することができます。
#include <crtdbg.h> // _CrtSetDbgFlag を使用するのに必要
int main( void ){
// プログラムの最初にデバッグフラグをセットする
_CrtSetDbgFlag(
_CRTDBG_CHECK_ALWAYS_DF | // メモリ確保時・開放時に整合性を毎回チェック
_CRTDBG_LEAK_CHECK_DF // プログラム終了時に開放されていないメモリをダンプ出力する
);
// 特定の処理
return 0;
}
これでプログラム終了時、出力ウインドウにいつもどおりの出力だったら問題がないことを示します。
何かしら見慣れない出力がされていれば、そのプログラムには問題があることになります。
もし、メモリリークしていれば、その個数分だけダンプ情報が出力されます。
ちなみに、後で realloc でサイズが変更されないのであれば、
一回の malloc で質問にあるコードどおりの3次元文字配列を確保することが出来ます。
開放はその確保した一つだけを free するだけで簡単なのですが、
一括確保したメモリを3次元文字配列に構築するのが少々面倒です。
# あと、 i の for 文は一度回すだけで処理できるはずですよ。
453ポイント を手に入れた。
|
|
|
|
|
Name: Flime ..ぴよぴよ(222ポイント)
Date: 2009/03/23(月) 15:17
No:31188
| 解決!
|
Title: Re:mallocとfreeについて
|
|
そういえば開発環境を何も書きませんでしたね…すいません。
VC2008です。
デバッグ用関数があるなんて知りませんでした。
役立てようと思います。
丁寧にありがとうございました。
iのfor文は盲点でした(^^;)
57ポイント を手に入れた。
|
|
|
|
Name: aiukao ..ぴよぴよ(126ポイント)
Date: 2009/03/22(日) 18:42
No:31165
|
|
Title: 違うcppに書いた関数を読み込んでくれません
|
|
高校3年です。VISTA
このサイトを参考にC++でシューティング作ろうとしています。
龍神録をみてみるとプログラムごとにcppを分けていました。自分は最初一つのcppでやっていたんですがそのときはうまくいったのですが分けてみると、うまく関数を呼ぶことができません。
キーの取得は3章のとおりに書いたらうまく関数を読むことができました。
メッセージボックスを表示してウィンドウサイズかフルスクリーンか選びたいのですが
error C3861: 'messagebox_screen': 識別子が見つかりませんでした
main.cpp
main(){
messagebox_scrren();
}
message.cpp
int messagebox_screen(){ //スクリーンモード選択
int flag;
flag=MessageBox(
NULL ,
TEXT("フルスクリーンモードで起動しますか?") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
}
どうすれば関数を読めるでしょうか?お願いします
126ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(94,139ポイント)
Date: 2009/03/22(日) 18:46
No:31166
|
|
Title: Re:違うcppに書いた関数を読み込んでくれません
|
|
> messagebox_scrren();
つづりが間違っているだけとか?
けれども、エラーメッセージが本当に
> error C3861: 'messagebox_screen': 識別子が見つかりませんでした
であれば違いますね。
たぶん、関数の宣言を忘れているだけかと思います。
64ポイント を落としてしまった。
|
|
|
|
|
Name: aiukao ..ぴよぴよ(620ポイント)
Date: 2009/03/22(日) 19:24
No:31168
|
|
Title: Re:違うcppに書いた関数を読み込んでくれません
|
|
すいません 本当は messagebox0と宣言していまして0じゃ教えてもらうのにわかりにくいと思いmessagebox_screenと表記したためミスをしていました。書き直して書いてみました↓
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
main.cpp
messagebox_screen();
.
.
.
.
たぶん下はあまり関係ないと思っています.
message.cpp
<pre>
int messagebox_screen(){ //スクリーンモード選択
int flag;
flag=MessageBox(
NULL ,
TEXT("フルスクリーンモードで起動しますか?") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
}
です。エラーは error C3861: 'messagebox_screen': 識別子が見つかりませんでした とでます。
本当に申し訳ありません
質問ですが違うcppから関数を呼ぶために何か特別なことは必要でしょうか?
494ポイント を手に入れた。
|
|
|
|
|
Name: aiukao ..ぴよぴよ(784ポイント)
Date: 2009/03/22(日) 19:29
No:31169
|
|
Title: Re:違うcppに書いた関数を読み込んでくれません
|
|
すいません
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
main.cpp
が逆ですね、 正しくは
main.cpp
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
です
もっと確認してから載せたいと思います
164ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(22,715ポイント)
Date: 2009/03/22(日) 20:33
No:31170
|
|
Title: Re:違うcppに書いた関数を読み込んでくれません
|
|
あくまで推測ですが、cppファイルはどこのフォルダに追加されましたか?
龍神録ならmydatフォルダ→sourceフォルダを選択してsourceフォルダの中にファイルを入れてください。
messagebox_screen()がint型で値を返していないのに、そのエラーが出ていないので
voidにすれば問題無いと思います。
そして、他のファイルで宣言した関数を呼び出すためにはそのファイルでは
extern宣言をしなければなりません。
main.cppの上の方に
extern void messagebox_screen();
と書いてみてください。
(message.cpp内のmessagebox_screen()をint型からvoid型に直してくださいね)
extern宣言 と検索すれば多く出てくるかと思います。
龍神録の館5章でもおさらいされています。
いろいろと自分の回答が間違っているかもしれません。orz
2倍のポイントを手に入れた! 486ポイント を手に入れた。
|
|
|
|
|
Name: aiukao ..ぴよぴよ(872ポイント)
Date: 2009/03/22(日) 23:40
No:31181
| 解決!
|
Title: Re:違うcppに書いた関数を読み込んでくれません
|
|
ありがとうございます!!!!
言われて気づきました!!龍神録ではGV.hにまとめていたのを忘れていました
GV.hに書き込んでみたところうまく読みました!ありがとうございました!
88ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(72,111ポイント)
Date: 2009/03/17(火) 19:38
No:30909
|
|
Title: 派生クラス
|
|
お邪魔します。
題名の通り派生クラスがうまくいきません。
うまくいっていないのはbutton→button1の派生です。
エラーを見るクラスbutton自体宣言されていないっと出てきます。
自分では完全に手詰まりになってしまいました。。
どこがいけないのかご教授お願いします。
プロジェクトを丸ごとUPしました。↓
http://www1.axfc.net/uploader/H/
ファイル名:H_72322.zip
Key:kazuoni
あと、初めてC++で組んでいるので、
非効率的なところがほとんどだと思います。
もしよろしければ、派生クラスの回答に加えて、
「ここの記述はこうしたほうがいい(効率的だ)」
「そもそもクラスの使い方が・・・」
などの指摘をお願いできますでしょうか?
C++だとメンバ関数は多用しても、ただの関数ってほとんど使わないのでしょうか?
(すべてクラス化し、メンバ関数とする)
よろしくお願いします。
214ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(72,681ポイント)
Date: 2009/03/17(火) 19:49
No:30914
|
|
Title: Re:派生クラス
|
|
追加
派生クラス含め、コードに解説が全くされてませんでした。。
とりあえず派生クラスだけを。(解説を入れて再度upします。)
buttonが基になるクラスです。
今はbutton1だけですが、今後2,3を増やしていくつもりです。
押されたかどうかの判定をPushButtonで共通化しています。
派生されたクラスでは描写のDrawButton()を各々のメンバ関数として持っています。
ボタンによって描写の仕方をそれぞれ持つっといったところです。
2倍のポイントを手に入れた! 408ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(93,216ポイント)
Date: 2009/03/17(火) 20:02
No:30916
|
|
Title: Re:派生クラス
|
|
ざっと見ただけですが...
button1.cppでbutton1.hしかインクルードしていないからではないでしょうか?
button1.hは、button.hが先にインクルードされていることを前提に設計されているようです。
普通はヘッダファイルをインクルードする順序に依存するような設計はしません。
button1.hをインクルードするときにはbutton.hも必要になるのであれば、button1.hからbutton.hをインクルードするようにしましょう。
110ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(72,487ポイント)
Date: 2009/03/17(火) 20:37
No:30923
|
|
Title: Re:派生クラス
|
|
たかぎさん、ご回答ありがとうございます。
やはり今回のはインクルードの順番が原因でした。。
今回はmain.hですべてのクラスのインターフェース部をインクルードしています。
なので、そのmain.hをすべてインクルードしているから、
全部大丈夫だろうっと思っていました。。
各ファイルで必要なファイルをインクルードしたら解決できました。。
今回の自分のmain.hのように、先にすべてをインクルードしたヘッダーを
インクルードする事を実現することは不可能なんでしょうか?
これが実現できたら、わざわざ先頭でいろいろな記述しなくても
main.hっとかけば済みそうなのですが・・・?
194ポイント を落としてしまった。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(93,352ポイント)
Date: 2009/03/17(火) 22:04
No:30935
|
|
Title: Re:派生クラス
|
|
> 今回の自分のmain.hのように、先にすべてをインクルードしたヘッダーを
> インクルードする事を実現することは不可能なんでしょうか?
> これが実現できたら、わざわざ先頭でいろいろな記述しなくても
> main.hっとかけば済みそうなのですが・・・?
できますが、必要ないものまで全部ヘッダファイルに入れてしまうと、コンパイル時間が長くなります。
それと、分割された個々のヘッダファイルを間違って直接インクルードしてしまうおそれもあるので、あまり良い設計ではありません。
2倍のポイントを手に入れた! 136ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(330,320ポイント)
Date: 2009/03/17(火) 22:07
No:30937
|
|
Title: Re:派生クラス
|
|
>などの指摘をお願いできますでしょうか?
同じくざっと見た感じですが、基本的なところから言いますと
■ Buttonクラスのコンストラクタで渡された char *をそのままメンバにポインタを
コピーして持っている。
危険な兆候です。
これはいつ外部で破棄されるかわからない(たとえばローカル変数のポインタを渡された場合とか)ので
注意が必要です。
生のポインタをコピーするのではなく、(std::stringなどで)中身をコピーして
持ったほうがいいかと思います。
■ Button1クラスの基底 Buttonクラスが仮想デストラクタを持っていない
まぁ、仮想関数がないんで、Button1クラスがアップキャストされることはそうないのかな、
とは思いますが……。
6章:継承
ttp://www5c.biglobe.ne.jp/~ecb/cpp/06_09.html
■ Button::PushButton
引数のポインタ keyinputが(配列などの)一定領域を持ったポインタであることを
想定していますが、この引数では
int a;
button->PushButton(&a);
ができてしまいますし、そもそも引数が NULLの可能性も考慮されていないので危険です。
main.cppでは keyinput.StateKeyboard() を渡しているようで、
であれば keyinputそのものを参照で渡して、そこからアクセスした方が安全です。
# あれ? private継承なのに PushButton()を呼んでる??
■ Buttonコンストラクタでの処理
button_num=s_num は select_num=s_num ですか?
■ __Class_Button / __Class_Button1
予約済み識別子なので、使用は避けた方がいいでしょう。
予約済み識別子 | 移植性のあるCプログラミング
ttp://portable-c.jugem.jp/?eid=10
あ、たかぎさんのページですね (^^
■ button.h / button1.hなどの最終行
ファイルの最後が改行ではないので、未定義です。
翻訳過程 - 標準C++辞典 - livedoor Wiki(ウィキ)
ttp://wiki.livedoor.jp/takagi_nobuhisa/d/%CB%DD%CC%F5%B2%E1%C4%F8
■ main.h / OpenigMenu.hのインクルードガード
ほかのヘッダにはあるのですが、これらのヘッダにはないようです。
必要ないですか?
>今回の自分のmain.hのように、先にすべてをインクルードしたヘッダーを
>インクルードする事を実現することは不可能なんでしょうか?
できるとは思いますが、お勧めはしません。
規模が大きくなると、main.h内でのインクルード順に悩まされることになるかと。
>わざわざ先頭でいろいろな記述しなくてもmain.hっとかけば済みそうなのですが・・・?
1ヘッダにすべてのヘッダをインクルードするやり方は規模がとても小さなときは
それほど悪くはないのですが、規模が大きくなるに連れていろいろ問題も出てくるので、
特別な事情がない限り避け、そのヘッダのコンパイルに必要なヘッダだけを
インクルードするようにした方がいいかと思いますよ。
昔そういう方針のプロジェクトで仕事しましたが、悲惨でした。
中心となる1ヘッダがアプリの基本システムのヘッダをすべてインクルード、
個々のソースはそのヘッダをインクルードしていた為、個々のヘッダ単体をインクルードしただけでは
コンパイルできず、また基本システムのヘッダをちょっとでも変更した瞬間すべてのファイルが
ビルド対象(ほぼフルビルド状態)になり、待つこと30分、ようやくビルドが終わるという……。
>C++だとメンバ関数は多用しても、ただの関数ってほとんど使わないのでしょうか?
そんなことはないです。
既存のライブラリは別にしても、ただ値を渡して結果をもらうだけであれば、
クラスにする必要がないので(大抵、非グローバル名前空間上の)関数にします。
それに、クラスの静的メンバ関数もそれに含めるのであれば、さらに機会は
多くなります。
1,597ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(72,962ポイント)
Date: 2009/03/18(水) 00:25
No:30956
|
|
Title: Re:派生クラス
|
|
たかぎさん、Justyさんご回答ありがとうございます。
インクルードの件は今後も必要な物を随時インクルードっという方針で
やっていきます。
とりあえずJustyさんに指定されたところを修正し、
ボタン表示を作ってみました。
ちょっと表示する部分が汚いですが^^;
もう少しきれいにできますかね。。
少し心配なのが、stringをchar *へキャストするところですが・・・
コンパイルは問題なかったのですが、ちょっと怪しいです。
コード抜粋
Button::Button(char *str,int x1,int y1,int b_num,int s_num)
{
std::string ptr_str=str;
b_string=std::strcpy(new char[ptr_str.size()+1],ptr_str.c_str());
...
あ、UPしたファイルにはデストラクタでdelete[]してません。。
確保したらやはりdelete[]しないとだめですよね^^;
>可能なものはすべて非メンバ、非フレンドにすべきである
これだと自分のコードはとてつもなく反しているような・・・
再度、修正したものをUPしておきます。
http://www1.axfc.net/uploader/H/#recent
ファイル名:H_72351.zip
Key:kazuoni
263ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(93,727ポイント)
Date: 2009/03/18(水) 00:59
No:30957
|
|
Title: Re:派生クラス
|
|
Button関係だけしか見ていませんが...
まず、ButtonとButton1が継承関係になっている必然性がありません。
Button2以降をどうするつもりなのかにもよりますが、普通は描画関数を仮想関数にすると思います。
また、const修飾子をうまく使うようにしてください。
例えば、
Button::Button(char *str,int x1,int y1,int b_num,int s_num)
の部分は、
Button::Button(const char *str,int x1,int y1,int b_num,int s_num)
とした方がよいでしょう。
あるいは、
Button::Button(const std::string& str,int x1,int y1,int b_num,int s_num)
とするかです。
そして、
Button::b_string
は、char*ではなく、std::stringにすべきです。
また、Buttonクラスのデータメンバがprotectedになっているのも気になります。
privateにするか、それができないようであれば、根本的に設計を見直すべきです。
305ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(330,808ポイント)
Date: 2009/03/18(水) 02:24
No:30959
|
|
Title: Re:派生クラス
|
|
あれ? string周りがなんか間違った方向に・・・。
とりあえず、b_stringはたかぎさんの書かれたように std::string型にして
元のデータとは別にクラス内に独立して文字列を持たせた方がいいですね。
■ main.hの color[BLACK] / color[WHITE]
BLACKとか WHITEの数値は現状 Colorクラスに紐付いたものですよね?
であれば、main.hに defineで記述するのではなく、Colorクラスのある
MainClass.hに Colorクラスの定数として持たせた方がいいかと思います。
あと、MOUSE_LEFTなどもそうですが、こういう用途で defineを使うことは
推奨されません。
■ Colorクラス
よく見ると、コンストラクタで4つ GetColor()を呼んでいますね。
一方使われ方を見ると、Button1::DrawButton()ではローカル変数として使っています。
これがグローバル変数で1つしかインスタンスがないのだれば、さほど問題はないのですが、
ローカル変数として何度もコンストラクタが呼ばれるのだとすると、
このクラスの内部の値は環境が変化しない限り必ず同じ値になるはずなので、
毎回 GetColor()で初期化するのはちょっと無駄な気がします。
(GetColor()は内部で使用されているスレッドとの同期をとった上で、
画面深度から求めるので、状況によってはちょっと重い処理となります)
気にならないというのであればいいのですが。
ついでに、operator[]が intではなく int&を返していますが、これは
color[WHITE] = (int)GetColor(0, 0, 0); //黒にする
のようなことを想定しているからですか?
■ たとえば button.h
main.hをインクルードしていますが、必要ですか?
また、KeyInputクラスが引数として使われる為、InputClass.hがインクルードされていますが、
ヘッダの段階では前方参照で済むはずです。
前方宣言
ttp://wisdom.sakura.ne.jp/programming/cpp/cpp23.html
InputClass.hは button.cpp側でインクルードするといいかと思います。
488ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(73,195ポイント)
Date: 2009/03/18(水) 02:39
No:30960
|
|
Title: Re:派生クラス
|
|
たかぎさん、ご回答ありがとうございます。
指摘された点につきましては修正しました。
修正後のButton関連のファイルをまとめてテキストにしてUPします。
>ButtonとButton1が継承関係になっている必然性がありません。
自分もそう思っていました^^;
初めて継承を使ったもので、何が正しいのかも分かりません。。
ただデータメンバは限定公開ではアクセス可能でダメでしたね。。
値を見る為に関数がドバっと増えましたが、
安全性の面ではこちらのが正しいと勝手に思いますw
>Button::b_stringは、char*ではなく、std::stringにすべきです。
これはなぜでしょうか?
文字列操作において、std::stringのがchar *より便利という点からでしょうか?
233ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(73,479ポイント)
Date: 2009/03/18(水) 03:10
No:30962
|
|
Title: Re:派生クラス
|
|
Justyさん、ご回答ありがとうございます。
>MOUSE_LEFTなどもそうですが、こういう用途で defineを使うことは推奨されません。
っということは何かデメリットがあるのでしょうか?
それともdefineの主な用途に今回のような使い方が含まれていないっという意味でしょうか?
>Colorクラス
確かにおっしゃる通りです。。
グローバル変数にしても、コンストラクタをしっかり呼び出し、
宣言以降、アクセスできないようにすればいいんですね。
>operator[]が intではなく int&を返しています
某参考書からそのまま映していたら、&まで映していました。。
必要なかったです。
>インクルード
まだまだ勉強不足です。。
前方宣言はとても使えそうです。
もう少し簡潔にしてきます。
293ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(93,827ポイント)
Date: 2009/03/18(水) 03:39
No:30964
|
|
Title: Re:派生クラス
|
|
> ただデータメンバは限定公開ではアクセス可能でダメでしたね。。
> 値を見る為に関数がドバっと増えましたが、
> 安全性の面ではこちらのが正しいと勝手に思いますw
根本的に何かが違うのですが...
アクセッサを設けるのではなく、DrawButtonの引数として与えるのでは駄目ですか?
DrawButtonは、privateまたはprotectedな仮想関数と、引数を受け取らないpublicなメンバ関数に分離するとよいでしょう。
NVIイディオム(またはNVIパターン)を調べると幸せになれます。
> >Button::b_stringは、char*ではなく、std::stringにすべきです。
> これはなぜでしょうか?
> 文字列操作において、std::stringのがchar *より便利という点からでしょうか?
操作の利便性もありますが、寿命管理だけを考えても、std::stringにするメリットはあります。
100ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(94,055ポイント)
Date: 2009/03/18(水) 03:46
No:30965
|
|
Title: Re:派生クラス
|
|
Button関係の話ばかりですが...
OpeningMenu::Menuの中で毎回Button1のオブジェクトを生成しなおすことに意味はありますか?
OpeningMenuのメンバとしてButton1のオブジェクトを持つ方が直感的かと思います。
button_numとselect_numという変なメンバも不要かと思います。
単に選択されているかどうかを表すbool型のフラグがあれば十分ですよね。
あと、細かい話ですが、PushButtonとかDrawButtonのように、関数名にButtonをつける必要はありません。
228ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(332,380ポイント)
Date: 2009/03/18(水) 22:56
No:31021
|
|
Title: Re:派生クラス
|
|
>>MOUSE_LEFTなどもそうですが、こういう用途で defineを使うことは推奨されません。
>っということは何かデメリットがあるのでしょうか?
一番の問題は defineマクロがプリプロセッサの段階における
ただの文字列置換である、というところです。
翻訳過程 - 標準C++辞典 - livedoor Wiki(ウィキ)
ttp://wiki.livedoor.jp/takagi_nobuhisa/d/%CB%DD%CC%F5%B2%E1%C4%F8
(defineはこのページの 4で処理され、実際のコードの解析は 7で行われる)
どういうことかというと defineを定数値として使っていたとしても、
コンパイラはそれを文字列レベルで置換するので、対象が変数だろうが関数名だろうが、
名前空間を一切考慮することなく置換していきます。
たとえば、
namespace X
{
void Max();
}
struct A
{
static int Max();
};
void test()
{
int Max = 4;
}
のようなコードがあったとします。
これは正当なコードですが、ここで、
#define Max 5
の定義が事前にあったりすると、
namespace X
{
void 5();
}
struct A
{
static int 5();
};
void test()
{
int 5 = 4;
}
のように変換されてから、ソースコードの評価が行われる為、
コンパイルエラーとなります(※)。
ここで、代替手段である const定数を使い
const int Max = 5;
としていれば、コンパイルエラーはおきません。
その他、#undefによって deinfeの内容がコロコロ変わる可能性があることや
マクロの種類によっては副作用を伴ったりしますし、
環境依存な話ではありますが(入力補完などの)IDE・デバッガなどのサポートが
受けにくくなる、というのデメリットもあります。
もちろん、マクロでなくてはできない時……インクルードガードや条件付きコンパイルなどでは
マクロを使うべきですが、代替手段(定数なら constや enum、関数マクロなら inline、
型に依存しないの処理なら template)を使って解決できるなら、何か特別な事情がない限り
マクロを使うよりそちらを使った方が安全です。
※ 実際、最近の VisualStudioでは 一部のシステムヘッダにある min()とか max()のマクロが
標準ライブラリの関数と衝突していたりします。
ttp://support.microsoft.com/kb/143208/ja
ttp://support.microsoft.com/?scid=kb%3Ben-us%3B143208&x=12&y=13
1,572ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(73,806ポイント)
Date: 2009/03/20(金) 22:44
No:31115
|
|
Title: Re:派生クラス
|
|
返事が遅れて大変申し訳ありませんでした。。
>NVIイディオム
いろいろページをみていたら、最終的にたかぎさんのブログへとたどり着きましたw
とりあえずは実装できたつもりですが、
果たしてうまくできているのでしょうか・・・。
あとはb_string(名前はnameに変更しました)や不要メンバ、関数名は
アドバイスしてくしてくださった様に変えました。
(他の関数もこれから変えていくつもりです。)
まだ何かありましたらどんどん指摘してください^^;
>マクロ
とても参考になります。
関数形式マクロでの副作用に加え、確かにJustyさんのおっしゃったような
副作用もありますね。。
詳しい解説ありがとうございます。
全然別の話になってしまうのですが、
いろいろと変更していたらGetColor()が戻り値intではなくDWORDになってしまいました。
このせいか、カラーを初期化する際に、すべて0が格納されてしまいます。
何が原因なのか分かりません。
また新しくプロジェクトをUPしておきます。
ファイル名:H_72560.zip
DLキー:kazuoni
http://www1.axfc.net/uploader/H/so/H_72560
よろしくお願いします。
327ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(18,726ポイント)
Date: 2009/03/20(金) 22:58
No:31117
|
|
Title: Re:派生クラス
|
|
DXライブラリの初期化が完了する以前にGetColor()を呼んでいるからですね。
19ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(333,861ポイント)
Date: 2009/03/21(土) 03:08
No:31123
|
|
Title: Re:派生クラス
|
|
うーん、突っ込みどころが増えたというか、なんというか。
■ インクルード
いらないヘッダのインクルード、ヘッダ単独でコンパイルの通らないヘッダなどがあるようです。
■ Button::Buttonの nameへの代入処理
ローカル変数 ptr_strが代入後未使用です。
nameへの代入方法もおかしくはないですが、こういう場合の初期化としては
普通は +=を使いません。
nameのコンストラクタに strポインタを引き渡した方がいいでしょう。
■ Button::do_Drawの引数 str
クラスオブジェクトを実体を引数にすると、コピーが発生しますし、その関数実行後、
そのコピーのデストラクタが実行されます。
そのクラスオブジェクトのコピー等が仮にコスト的にたいしたことがない場合でも、
特にコピーでなければならない理由がないのであれば参照を、可能なら const参照を
渡した方がいいでしょう。
■ Colorクラス
白色を取得するのに color[color.white()] はちょっと冗長な感じもします。
それに、operator[]による整数ならすべて受け付けるので、安全とは言い難いです。
■ main.hのグローバル変数定義
extern版と非extern版の2つに分けて定義するのは、片方の修正は、もう一方の修正を必要とするので、
将来の修正においてバグの要因ともなりえます。
1つにまとめるか、可能ならグローバル変数のない設計にした方がいいでしょう。
■ OpeningMenuメモリリーク
コンストラクタでの4つの newに対し、デストラクタでは1回のみしかありません。
又、たとえば2つ目の newに失敗した場合1つめの newは誰が deleteするのでしょうか?
他にも、このクラスがコピーされた場合、最終的にコピー元・先のそれぞれでデストラクタが
実行されますが、2つのインスタンスは同じポインタを指しているため、二重解放になる可能性があります。
754ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(74,362ポイント)
Date: 2009/03/21(土) 13:25
No:31129
|
|
Title: Re:派生クラス
|
|
Justyさんご回答ありがとうございます!
>インクルード
再三の注意にもかかわらず、変更できていませんでした。。
大変申し訳ありませんでした。。
再度指摘されたところをすべて変えてみました。
nameの代入処理がポインタを使っていないところが不安ですが・・・。
カラークラスにおいてはグローバル変数としてはやめました。
(初期化のタイミングがネックっと感じたので^^;)
const参照も多用しましたが・・・これで正しいのかどうか疑問です。
そして、ボタンを動的確保していた点ですが、
よくよく考えたら、今は場合によって増えるなんてものではないので、
newそのものをやめました。
ただ、前回のような時の
>クラスがコピーされた場合の二重解放
はもし対策を実装するとすればどのような方法がよいのでしょうか?
再々度UPします。
ファイル名:H_72616.zip
DLキー:kazuoni
http://www1.axfc.net/uploader/H/so/72616
よろしくお願いします。
418ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..上級者(18,650ポイント)
Date: 2009/03/21(土) 15:18
No:31131
|
|
Title: Re:派生クラス
|
|
OpeningMenuのデータメンバが不自然な感じになってますねぇ。
Button1 button0〜button3があるのなら、Button1 *button[4]は不要ですよね。
button0〜3も配列にした方がいいかも。
Color::set()で行ってる処理は、コンストラクタがすべきではないですか?
それからColor::COlorはstaticやconstで修飾してもよさそうですが、その辺りはどうでしょう?
Buttonのコンストラクタですが、ptr_strを介さずに直接nameにstrを代入できます。
ちなみにstrでstd::stringをコンストラクトしてからnameに代入したい場合は name=std::string(str); や name=static_cast<std::string>(str); のように一時変数を使うと行数を抑えられます。
>>クラスがコピーされた場合の二重解放
>はもし対策を実装するとすればどのような方法がよいのでしょうか?
std::auto_ptr(危険な場合があるので注意)やboost::shared_ptr(boostというライブラリが必要)のようなスマートポインタを使うとか。
あるいはディープコピー(新たにメモリを確保して、そこにコピー)するとか。
243ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(74,665ポイント)
Date: 2009/03/21(土) 16:13
No:31133
|
|
Title: Re:派生クラス
|
|
ibisさん、ご回答ありがとうございます!
自分もそう考えてOpeningMenuのデータメンバにbutton[4]を持たせ、
コンストラクタで
OpeningMenu::OpeningMenu():
button[0]("button0",100,100),
button[1]("button1",100,200),
button[2]("button2",100,300),
button[3]("button3",100,400)
とすると
1>error C2059: 構文エラー : '['
1>error C2512: 'Button1' : クラス、構造体、共用体に既定のコンストラクタがありません。
っとなってしまったので、こんな風にしたのですが・・・
どうしたら実現できうでしょうか?
その他のご指摘のあった点は修正しました^^;
カラーのあたりは外部変数としていた時のエラー回避のため
変な構造にしていました。。
>スマートポインタ・ディープコピー
大変参考になります。。一度調べてから、試してみたいと思います。
303ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(334,009ポイント)
Date: 2009/03/21(土) 16:54
No:31140
|
|
Title: Re:派生クラス
|
|
目についたところを列挙していったら結構な数になってしまったので、
こちらで手を入れたコードをそのままアップしてみました。
大筋にはあまり手を入れないようにしましたので、これがベストというわけではありませんが、
ひとまず主立ったおかしな点は解消されているかと思うので、こういう書き方もあるという
例の1つとして参考にしてみてください。
148ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..上級者(18,723ポイント)
Date: 2009/03/21(土) 18:16
No:31147
|
|
Title: Re:派生クラス
|
|
>OpeningMenuのコンストラクタ
多分これでコンパイルは通るかと思います。
OpeningMenu(){
button0 = Button1("button0",100,100);
//以下略
}
73ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(74,848ポイント)
Date: 2009/03/22(日) 21:56
No:31179
|
|
Title: Re:派生クラス
|
|
Justyさん、ibisさんご回答ありがとうございます!
(また返信が遅れて申し訳ありません。。)
>Justyさん
わざわざpdf形式の解説まで作っていただき、本当にありがとうございました。。
pdfってこんな使い方があったんですね^^;
まだすべてを完璧に理解していませんが、
大体の流れを勉強させていただきました。
本当に参考になります。。
もう少しじっくり眺めて、自分のプログラムに生かしていきたいと思います!
今回の件はこれで解決とさせていただきます。
また具体的な質問が出たら新しいトピを立てさせていただきます。
(できるだけ自分で解決するように心がけますが)
回答してくださった皆様、本当にありがとうございました。
またよろしくお願いします!
176ポイント を手に入れた。
|
|
|
|
Name: 山崎 ..初心者(5,956ポイント)
Date: 2009/03/22(日) 16:06
No:31159
|
|
Title: deleteとデストラクタの動きについて
|
|
毎度お世話になっております、山崎です。
タイトルがわかりにくくて申し訳ありませんが、
今回はdelete演算子を使ったときのデストラクタの動きについてお伺いに参りました。
エディタはVCC2008を使っております。
今回お伺いしたいことを抽象的に表すと、このような感じです。
あるクラスAを継承した子クラスA'があります。
A型のポインタaを宣言し、そのポインタaにA'型のインスタンスをnewで作成します。
この後aをdeleteしA'型のインスタンスを解放したとき、
A'のデストラクタがどうしても呼ばれなくて悩んでいるんですが、
もしかしてそういうものなのでしょうか?
Aのデストラクタは呼ばれているようです。
286ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(334,461ポイント)
Date: 2009/03/22(日) 16:22
No:31160
|
|
Title: Re:deleteとデストラクタの動きについて
|
|
多分基底クラス Aのデストラクタが virtualになっていないのが原因かと。
基底クラスには仮想デストラクタをもたせよう 14項 - ひげぽん OSとか作っちゃうかMona-
ttp://d.hatena.ne.jp/higepon/20051110/1131597177
6章:継承
ttp://www5c.biglobe.ne.jp/~ecb/cpp/06_09.html
131ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(136,924ポイント)
Date: 2009/03/22(日) 16:27
No:31161
|
|
Title: Re:deleteとデストラクタの動きについて
|
|
> タイトルがわかりにくくて申し訳ありません
そうお感じになっているのでしたら、
わかりやすいタイトルをお考えになってみては
いかがでしょうか。
> 今回お伺いしたいことを抽象的に表すと、このような感じです。
抽象的にお書きになるよりも、
お聞きになりたい点を具体的に示される方が
回答が付きやすいと思います。
例えば、お書きになったソースコードを提示する、
というような方法があります。
83ポイント を手に入れた。
|
|
|
|
|
Name: 山崎 ..初心者(6,401ポイント)
Date: 2009/03/22(日) 16:46
No:31162
| 解決!
|
Title: Re:deleteとデストラクタの動きについて
|
|
Justyさん
ご返信誠にありがとうございます。
デストラクタにvertualをつけたところ、一発で問題が解決してしまいました。
こんな基本的なことを知らなかったとは、お恥ずかしい限りです。
boxさん
タイトルにつきましては
一体どのようにすればわかりやすくて簡潔かと5分程度悩みましたが、
私のプログラミングの経験ではなかなか簡潔にまとめることができず、
ごちゃごちゃして長いタイトルにするよりはと短くさせていただきました。
コードを提示することも考えたのですが、問題の箇所は複数のファイルにまたがっており
他にもいろんなクラスとかが絡んでいたため、
そのままコードを貼り付けるのでは読むほうも大変なのではと考え抽象的に示しました。
私まだまだプログラミングの経験が浅いためこのような間違いもするかとは思いますが、
どうかそこは優しくご指導していただきたいと思います。
何も考えずテキトーに記事を立てているわけではなく
素人なりにより良い記事にするようにしていることを、どうかご理解頂けたらと思います。
445ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(22,743ポイント)
Date: 2009/03/20(金) 03:14
No:31102
|
|
Title: Re:添付ファイルには有効期限がありますか?
|
|
>>Justyさん
>過去ログに移った瞬間に消されるようですね。
そうなんだ・・・と思い、
以前、自分が上げた画像のあるスレッドを確認してきましたが、その過去ログの画像は残ってました。
そのスレッド内に管理人さんより「過去ログ落ちしてデータ消えないように」という言葉があったので
過去ログに行けば消えるんだと思いますが・・・どうなってるんでしょうね;
94ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(332,944ポイント)
Date: 2009/03/20(金) 10:01
No:31104
|
|
Title: Re:添付ファイルには有効期限がありますか?
|
|
>自分が上げた画像のあるスレッドを確認してきましたが、その過去ログの画像は残ってました
これですね。
普通に添付した画像や zipファイルなどは www.play21.jpにアップされますが、
このファイルは dixq.netにあがっていますので、これは管理人さんが手動で移したんじゃないでしょうか。
195ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(22,682ポイント)
Date: 2009/03/20(金) 22:35
No:31114
|
|
Title: Re:添付ファイルには有効期限がありますか?
|
|
>>Justyさん
あ〜なるほど・・・。
「消えないようにうちのサーバーに移させていただきました」とあったので手動で移したっぽいですね〜。
この時は単に画像を保存でもしたのかな〜と思ってたので;
61ポイント を落としてしまった。
|
|
|
|
|
Name: akio ..ぴよぴよ(590ポイント)
Date: 2009/03/21(土) 03:46
No:31124
|
|
Title: Re:添付ファイルには有効期限がありますか?
|
|
>>Justyさん、BEMANIさん
なるほど、基本的には添付ファイルは消える仕様なんですね。
BEMANIさんの場合が特例だったという事でしょうか。
2倍のポイントを手に入れた! 92ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(334,108ポイント)
Date: 2009/03/21(土) 16:57
No:31141
|
|
Title: Re:添付ファイルには有効期限がありますか?
|
|
>私の絵も残ってますね
あれ? 気のせいでしょうか。
ttp://www.play21.jp/board/formz.cgi?action=res&resno=27232&page=&lognum=87&id=dixq&rln=27962#27598
投稿されたときはもうちょっと大きな絵だったような。
サムネイルしか保存されていない???
99ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(22,890ポイント)
Date: 2009/03/22(日) 00:30
No:31151
|
|
Title: Re:添付ファイルには有効期限がありますか?
|
|
>>akioさん
>BEMANIさんの場合が特例だったという事でしょうか。
別に消えてもいいイラストだと思うんですけどね;
なぜか保存されたみたいですね・・・残っていても問題はないですが。
この辺は管理人さんの返答待ちと言う事になりますね;
>>御津凪さん
>BEMANI さんのイラストはそれが間に合っていて、そのまま載っているのだと思います。
自分のもサムネイルかな〜と思ったのですが、
規約に「画像サムネイルサイズは175*175」って書いてあったので違いますね・・・
あの画像保存したらサイズが300*384みたいでした。
御津凪さんのはサムネイルサイズの175*175でした。(ファイル名がBIMANIだったりmituruだったり間違ってましたけど;
208ポイント を手に入れた。
|
|
|
|
Name: yama ..初心者(6,274ポイント)
Date: 2009/03/21(土) 16:28
No:31134
|
|
Title: C言語とDXライブラリ
|
|
どうでもいいような質問なのですが、最近DXライブラリを始めました、
そしてDXライブラリをしていると、弾幕を作る際はDXライブラリを使
なくてもCだけでも作れるのではないか、とたまに思ってしまいますが、
Cだけでも作ることは可能なのでょうか。
77ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(70,972ポイント)
Date: 2009/03/21(土) 16:43
No:31137
|
|
Title: Re:C言語とDXライブラリ
|
|
「Cだけ」という言葉通りであれば、弾幕を作ることは可能ですが、
その弾幕を表示(出力)する方法はC言語自体にはありません。
標準ライブラリでもコマンドプロンプトやファイル等への出力までです。
最低でも、WinAPI か DirectX ・ OpenGL などのグラフィックス系ライブラリ(API)が
必要になります。
(DXライブラリは DirectX を扱いやすくしているライブラリです)
76ポイント を手に入れた。
|
|
|
|
|
Name: yama ..初心者(6,326ポイント)
Date: 2009/03/21(土) 17:46
No:31146
| 解決!
|
Title: Re:C言語とDXライブラリ
|
|
おぉ。ご丁寧にありがとうございます。
とにかく何でもやっておけば良いというわけですね!
本当にありがとうございました。また勉強始めます!
52ポイント を手に入れた。
|
|
|
|
Name: ろーさん ..ぴよぴよ(466ポイント)
Date: 2009/03/20(金) 21:57
No:31112
|
|
Title: ウィンドウサイズを変更したい
|
|
はじめまして、こんばんわ! ろーさんと申します!
質問の内容はタイトルの通りで「ウィンドウサイズを変更したい」というものです。
ものすごく基本的な内容なのですが、いろいろ試してみたり検索を行って実行してもダメだったので書き込ませていただきました。
やってみたこと
サイズの設定するところがあるハズだからDxLib.hを見に行こう。
DEFAULT_SCREEN_SIZE_X、DEFAULT_SCREEN_SIZE_Yを発見、早速640,480を320,240に変更→実行→変化なし。
もしかしてリビルドかけなければいけなかったのか?
一旦ビルドを全てクリーンしてビルドし直し→実行→変化なし。
じゃあDEFAULT_SCREEN_SIZE_X,Y使っているところを探そう→(検索対象をプロジェクト単位にして)検索→宣言以外見当たらず→何のために使われている?
Windowsプログラム命令で直接にサイズの変更を指示してしまおう。MoveWindowやSetWindowPosの使用を試みる。
メインループに入る前に変更してしまおう→何も起こらず。
もしかしてメインループ内で書いたほうがいいのかな?→実行→指定したサイズになろうとしているが、元の640*480に戻ろうともしている。
じゃあやっぱりウィンドウサイズはあらかじめ設定すべきである。
*.libを覗こうと試みましたが、コードばかりで理解不能。
ここへ訪問、質問の前に同じ質問があったか確認。
DXライブラリ 関数リファレンスページ を紹介する記事がありましたが、
ボクのしたいのは「サイズを指定して変更する」ことなので該当内容なし。
探す手段が見当たらなくなってしまった。
という経緯です。
よろしかったらご回答のほどよろしくお願いいたします。
466ポイント を手に入れた。
|
|
|
|
Name: ろーさん ..ぴよぴよ(491ポイント)
Date: 2009/03/20(金) 22:52
No:31116
| 解決!
|
Title: Re:ウィンドウサイズを変更したい
|
|
しまった、なんという初歩的なミスを……
探していた情報は「ウィンドウ」または「スクリーン」のみで、全体を見ておりませんでした。
ご丁寧に場所までお教えいただき本当にありがとうございます!!
25ポイント を手に入れた。
|
|
|
|
Name: 昴 ..かけだし(1,177ポイント)
Date: 2009/03/19(木) 19:49
No:31082
|
|
Title: 文字列の配列
|
|
こんばんは、いつもお世話になっています。
C言語は初心者で、現在テキストを参考にしながら進めています。
WindowsのVistaを使っております。
char a[12] = "愛している";
このとき、'愛'だけを表示させるにはどうしたら、よいですか?
全角文字は2バイトで表現されるので、printf("%c", a[0]);はおかしいです。
110ポイント を手に入れた。
|
|
|
|
Name: 昴 ..かけだし(1,471ポイント)
Date: 2009/03/19(木) 20:24
No:31085
|
|
Title: Re:文字列の配列
|
|
回答ありがとうございました。
よく、わかりました。
この文字列上にある'愛'と'る'を交換するにはどうしたらよいでしょうか?
文字の表現が1バイトだったら、
例えば、下記のように'a'と'c'を交換すると
char a[4] = "abc";
char temp = a[1];
a[1] = a[2];
a[2] = temp;
となりますよね。
でも、全角文字を扱う場合は半角文字と違って、a[0]='愛'はできないですよね。
2倍のポイントを手に入れた! 294ポイント を手に入れた。
|
|
|
|
|
Name: フリオ ..プログラマー(29,309ポイント)
Date: 2009/03/19(木) 20:36
No:31086
|
|
Title: Re:文字列の配列
|
|
一例です。
#include <stdio.h>
int main(void)
{
char a[] = "愛している", b;
int i;
for(i = 0; a[i]; i += 2) printf("%.2s\n", &a[i]);
b = a[0];
a[0] = a[8];
a[8] = b;
b = a[1];
a[1] = a[9];
a[9] = b;
putchar('\n');
for(i = 0; a[i]; i += 2) printf("%.2s\n", &a[i]);
return 0;
}
151ポイント を落としてしまった。
|
|
|
|
|
Name: SCI ..上級者(18,223ポイント)
Date: 2009/03/19(木) 21:33
No:31088
|
|
Title: Re:文字列の配列
|
|
実装依存ですが、こんなこともできますね。#include <stdio.h>
#include <wchar.h>
int main(void)
{
wchar_t str[] = L"愛している";
wchar_t wc;
setlocale(LC_CTYPE, "");
printf("%lc\n", str[0]);
printf("%ls\n", str);
/* 交換します */
wc = str[0];
str[0] = str[4];
str[4] = wc;
printf("%ls\n", str);
return 0;
}
209ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(8,890ポイント)
Date: 2009/03/19(木) 22:25
No:31091
|
|
Title: Re:文字列の配列
|
|
>char a[12] = "愛している";
>このとき、'愛'だけを表示させるにはどうしたら、よいですか?
とりあえず、'愛'は間違いです。シングルクオート(')は、その文字コードの値にします。
そのため、L'愛'と、ワイド文字表記にした方が良いと思、、、ったんですがcharなんですよね。なんだろう。
次のあるプログラムの実行結果を見てください。 ADDRESS+ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF NCSL
0x00000000 B4 C1 BB FA 00 .. .. .. .. .. .. .. .. .. .. .. ........... 1400 これは、scanf()で「漢字」をEUC-JPで入力し、それを16進数で表したものです。
要は、ABCを表示するときと一緒です。下記は、EUC-JPの場合の配置です。Shift-JISはまた異なります。
EUC-JPでは、0x00 から 0x7F までは1バイト長で表現されます。英数字、半角記号などはここに含まれます。
0x8E が出た場合、次のバイトが 0xA1 から 0xFE の間の値であれば、半角カタカナとなります。
0xA1 から 0xFE の間の値が出た場合、次のバイトが 0xA1 から 0xFE の間の値であれば、2バイト文字となります。
0x8F が出た場合、次と、その次のバイトが 0xA1 から 0xFE の間の値であれば、3バイト文字となります。
って、解決してましたね。@@・・・
文字を置き換える場合、2バイトから1バイト、1バイトから2バイトなど、必要な領域が変化する場合がありますので、
charで実装する場合、文字列置き換え時用の一時領域を確保することが必要になるかも知れません。
592ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(94,203ポイント)
Date: 2009/03/19(木) 22:44
No:31093
|
|
Title: Re:文字列の配列
|
|
> とりあえず、'愛'は間違いです。
間違いかどうかは処理系不明なので何ともいえません。
charが16ビット以上あるかもしれませんので。
Windows用の処理系でそんなのがあるのかどうか知りませんが...
でも、よく考えてみると、
> 全角文字は2バイトで表現されるので
とのことなので、char型には(何ビットであるかは別にして)収まらないということですね。
81ポイント を手に入れた。
|
|
|
|
Name: akiya ..ぴよぴよ(53ポイント)
Date: 2009/03/19(木) 15:32
No:31072
|
|
Title: 自分で画像を作るにはどうしたらいいですか?
|
|
自分でゲームで使える人とか敵の画像や↑みたいな画像を作りたいのですが
どうすればいいかわかりませんorz
中2なんでフリーの
画像を作るソフトなど
作り方を紹介してるサイトをおしえてください
53ポイント を手に入れた。
|
|
|
|
Name: TKOZ ..上級者(20,186ポイント)
Date: 2009/03/19(木) 16:12
No:31073
|
|
Title: Re:自分で画像を作るにはどうしたらいいですか?
|
|
ドット絵なら、Edgeや、GraphicGaleがいいと思います。
(いずれもフリーソフトです)
普通の2D画像なら、PhotoShopか、GIMPがいいと思います。
(PhotoShopは高価ですので、GIMPをお勧めします)
GIMPは無料で使えます。
3DCGを作りたい場合は、いろいろあるのですが、
私は、Shadeを使っています。
(少し高い(2万円程度)ですが、いいソフトです)
CG講座とか、ドット絵講座、3DCG講座で
googleで検索をかければすぐ出てきますよ。
207ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(22,077ポイント)
Date: 2009/03/19(木) 16:13
No:31074
|
|
Title: Re:自分で画像を作るにはどうしたらいいですか?
|
|
>>akiyaさん
どのくらいのクオリティが欲しいのか分からないですが、画像を作るソフトは沢山あります。
フリーでお探しならGIMPというソフトがいいみたいです。(ここの掲示板でGIMPという言葉をよく見掛けます)
サイトはGIMP等で調べると出てくると思うので探してみて下さい。
有料ならSAIというソフトがとても安く、機能も充実しててお勧めです。
といいながら、SAIを使っている訳ではないです;
出来あがった絵や制作過程動画を見ていると機能は充実していると思います。
値段は5000円程だったかな〜と思います。
お金出してもいいならPhotoShopやIllustratorなんかもお勧めです。
(値段は確か8万〜・・・あと、PCのスペックも欲しい所です)
余談ですが、高機能=クオリティの高い絵が描けると言う訳でなく、
また、高額=使いやすいという訳ではないです。
自分はPhotoShopを使っていますが、使い慣れるまで非常に時間がかかりましたし、
たとえフリーでも使い方次第では有料に負けず劣らずの所までのクオリティは出せると思います。
色々覚えることはあると思いますが、まずは頑張ってみて下さい〜。
390ポイント を手に入れた。
|
|
|
|
|
Name: はね ..中級者(9,079ポイント)
Date: 2009/03/19(木) 16:25
No:31075
|
|
Title: Re:自分で画像を作るにはどうしたらいいですか?
|
|
格好良い画像と言うのが具体的にどのようなものかは分かりませんが
私が今まで使用し、使い勝手が良かったものを紹介します。
edge
ドット絵を描くのに便利です。
Platinum
2Dマップを制作しやすいソフト。
マップチップをペタペタ並べる。
並べるだけでも楽しかったり。
photoshop
言わずと知れた有名ソフトです。
非常に幅広く使用できます。
ただ便利ですが高価です。
pixa(だったような。)
私は使ったことありませんがフリーで結構使えるソフトみたいです。
グラフィックはあまりくわしくないですが、これくらいですかね。
278ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(43,954ポイント)
Date: 2009/03/19(木) 16:53
No:31076
|
|
Title: Re:自分で画像を作るにはどうしたらいいですか?
|
|
画像を作るソフトはすでに紹介されていますね^^
私もEdgeとGimpは愛用しています。
ドット絵なら、Edgeが使いやすかったです。
2Dの画像制作となるとphoto shopやGimpあたりのソフトになってきますが、
以前に画像の作り方を検索したところ、
紙に絵を描いてスキャナでパソコンに取り込み、先に挙げたソフトを使って、
色づけ、仕上げをする
というような紹介が多かったです。
単に検索の仕方が悪かったのかもしれませんが。
ドット絵であれば、検索をすればよく引っかかりました。
いきなり2Dや3Dというようなものを描くことは難しいので、
まず比較的簡単なドット絵をされてはどうですか?
(とはいえドット絵も、結構難しいですが^^;)
余談ですが、今はドッター(ドット絵を描く人)が不足しています。
ドット絵を習得していれば、もしかしたら思わぬところで役に立つかもしれませんよ^^
一応参考になりそうなサイトを載せておきます。
ドット絵
ttp://www2.ocn.ne.jp/~ruvi/gallery.html#kyoushitsu
ttp://homepage1.nifty.com/take_hp/lesson2d/lesson2d.html
ttp://elfice.hp.infoseek.co.jp/dot_kouza/dotekouza.htm
Gimpの使い方
ttp://charry.cocolog-nifty.com/blog/2008/03/gimp_e601.html
2倍のポイントを手に入れた! 22ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(22,649ポイント)
Date: 2009/03/20(金) 00:48
No:31097
|
|
Title: Re:自分で画像を作るにはどうしたらいいですか?
|
|
>>akiyaさん
一応こちらのスレッドに関しても一言だけ。
今回の場合は特に話がこじれている訳ではないのでいいかもしれませんが、
質問内容を変更する際は、次のレスで新たに変更する箇所を記載したほうがいいと思います。
自分が書き込んだ時と内容が変わっていましたので・・・。
>ゲームで使える人とか敵の画像
完全にフリーなら、最低限「上に書いてあるような絵を描くソフト+マウス(タブレット)」でいいと思います。
これから絵も描いていくのであれば、ペンタブやスキャナはあってもいいかもしれません。
>>s-rushさん
「CG」という単語を入れてみると、違った結果になったかもしれません。
アナログ作業に慣れている方は、スキャナ大変便利ですよね^^
ドット絵難しいですよね・・・。
自分の作品でもドットを打つ機会があるのですが、いかんせんドットに慣れていないので全然うまくいきません;
2倍のポイントを手に入れた! 572ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(44,726ポイント)
Date: 2009/03/20(金) 13:08
No:31108
|
|
Title: Re:自分で画像を作るにはどうしたらいいですか?
|
|
>>BEMANIさん
>「CG」という単語を入れてみると、違った結果になったかもしれません。
CGとキーワードを増やしてもほとんどがスキャナでしたね^^;
調べた当時はGimpの新バージョンが出たばかりだったので、仕方がないのかもしれませんが。
アナログ作業がだめなので、断念しましたorz
>ドット絵難しいですよね・・・。
ほんとにそうですよね^^;
私もゲームを作っているのですが、オールドット絵なので想像以上に大変な目をしてます。
でも、そのおかげでドット絵の基本的な技術は習得したつもりです(たぶんですが
246ポイント を手に入れた。
|
|
|
|
Name: akiya ..ぴよぴよ(42ポイント)
Date: 2009/03/19(木) 17:52
No:31077
|
|
Title: まず実行させて見ようからわかりません
|
|
ビルドエラーがでてできませんorz
どこがまちがってるかわかりません
Cははじめたばかりですorz
#define GLOBAL_INSTANCE
#include "../include/GV.h"
--main.cpp変更--
#define GLOBAL_INSTANCE
#include "../include/GV.h"
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
//http://dixq.net/g/#41
ScreenFlip();
}
DxLib_End();
return 0;
}
11ポイント を落としてしまった。
|
|
|
|
Name: s-rush ..熟練のプログラマー(44,034ポイント)
Date: 2009/03/19(木) 18:00
No:31079
|
|
Title: Re:まず実行させて見ようからわかりません
|
|
情報があまりにも少なすぎです。
ちゃんと規約を読んでください。
開発環境は何でしょうか?
それとどういうエラーなんでしょうか?
>>まず実行させて見よう
ということはゲームプログラミングの館ですかね
VC++2008 EE DXライブラリしようと仮定して、
ちゃんと設定はされましたか?
80ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(8,298ポイント)
Date: 2009/03/19(木) 18:57
No:31080
|
|
Title: Re:まず実行させて見ようからわかりません
|
|
後から追加する場合はちゃんと返信して下さい。
なんだか私がソース読めてないような感じになってます。
私はまだ高校生なので別にそう思われても構わないんですが、相手によっては大変失礼です。
38ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(8,994ポイント)
Date: 2009/03/19(木) 22:33
No:31092
|
|
Title: Re:まず実行させて見ようからわかりません
|
|
ごめんなさい。「相手によっては」は要らない言葉でした。
なんか、#define GLOBAL_INSTANCE
#include "../include/GV.h"
--main.cpp変更-- が気になっているんですが、ソースに書いてしまっているんでしょうか。
104ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(44,480ポイント)
Date: 2009/03/20(金) 13:01
No:31107
|
|
Title: Re:まず実行させて見ようからわかりません
|
|
朽木さんもおっしゃっていますが、追加したならその旨を書いておいてほしいです。
あとからほかの方が読まれたときに矛盾が生じて混乱しかねないので。
あとソースコードはプレタグを使ってくださいね。
詳しくは規約に書かれてあります。
エラーが分からないので、推測できるものだけ上げておきます。
ソースを見た限りだとDXライブラリを使用されているみたいですね。
そのライブラリを使用するための設定はされましたか?
>>--main.cpp変更--
これも朽木さんがおっしゃっていますが、ソースの中に書かれているのでしょうか?
もしそうであるなら、コメントアウトしておけばエラーは取れます。
(あんまり意味のないコメントになるので、消してしまった方がいいと思いますが)
>>#include "../include/GV.h"
GV.hというファイルを作り、そのファイルをインクルードしているのでしょうか?
(分割ファイルっていうやつです)
もしそうなのであれば、以下のことが考えられます。
・GV.h内でDxLib.hがインクルードされていない(#include "DxLib.h"の記述がされていない)
・GV.hのパスが間違っている
GV.hファイルを作られていないなら、#include "../include/GV.h" の部分を
#include "DxLib.h"と変更してみてください。
446ポイント を手に入れた。
|
|
|
|
Name: Ma ..ぴよぴよ(512ポイント)
Date: 2009/03/18(水) 08:34
No:30972
|
|
Title: 大きいPNGの高速描画のコツ
|
|
連続ですみません。
BCC Developer で、 DXライブラリ を使用している者です。
透明化してあるPNGファイル(350×250)程度の画像を、タイトル画面の背景として二倍に拡大して画面に表示しようとしています。
これを、DrawExtendGraph 関数を使用して実現しましたが、3,4枚ほど描画すると、段々と重くなり
処理が 62.5fps から 40fps まで低下してしまいました。
これを、なんとか 60fps 程度まで上げたいのですが良い方法はありませんか?
*いままでやってみたこと
DrawExtendGraph は処理が重いので、画像サイズを700×500にしてDrawGraph で挑戦。
結果は、少し早くなっただけで、ファイルサイズが4倍になるので、断念。
画像を LoadDivGraph によって、 32×32 に分割して描画する。
結果は、多少高速化したものの、40fps⇒50fps 程度で、効果は微妙。
283ポイント を落としてしまった。
|
|
|
|
Name: fatens ..ぴよぴよ(509ポイント)
Date: 2009/03/18(水) 09:35
No:30976
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
DrawExtendGraph関数を使用してフルカラーの写真(350×250, png, 188kb)を2倍で
1フレームに50回描画してみましたが、FPSの低下はおこりませんでした。
表示する処理の中で、何度も画像をロードしていないかを確認してみてください。
91ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(6,756ポイント)
Date: 2009/03/18(水) 09:44
No:30978
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>FPSの低下はおこりませんでした。
そもそも1フレームに50回と制限してる時点で、処理能力の高い環境では描画分の処理時間が入る程度の余裕ができ、
その分のずれが実際の結果として見えないため、1フレームに1回と制限するのと同じで、
検証とはいえない気がするのですが。
私が間違ってたらごめんなさい(´・ω・`)
142ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..ぴよぴよ(144ポイント)
Date: 2009/03/18(水) 09:48
No:30979
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
すいません、実際には5枚ほどありまして、それらを描画する結果、40fpsに低下しました。
説明不足ですみません。
(毎回ロードはしていません。)
39ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(55,755ポイント)
Date: 2009/03/18(水) 09:53
No:30980
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
処理時間云々はPC(CPU、メモリ、グラボ、OS等々)の影響によるところが大きいですからね。
MaさんがPCのスペックを書いてませんので検証はあまり意味ないかもしれませんね。
Maさんの既に書かれている処理が最良のものだけど、PCの性能不足が原因というのも無いとは言えませんし。
Maさんの環境(PCのスペック等々)と、現象を再現できる最小限のソースがあれば有効な回答を得やすいのではないでしょうか。
104ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..ぴよぴよ(575ポイント)
Date: 2009/03/18(水) 09:58
No:30982
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>朽木さん、Mistさん
3,4枚描画するだけでFPSが低下するとは考えられなかったので上のように書いてしまいました。
処理能力については考えてませんでしたね。
すいません。
66ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..ぴよぴよ(649ポイント)
Date: 2009/03/18(水) 10:08
No:30984
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
環境です。
OS:Windows XP SP3
CPU: AMD Athlon(tm) 4 1.10 Ghz
メモリ: 736MB RAM
カード: Sis 740
5年ぐらい前に、10数万円で買ったものなので、結構スペックは低めです。
(現在作っているゲームでは、12×50 のpngを DrawRotaGraph2 で150枚程度描画しても60fps前後で、処理落ちしません。)
*追記です。
タスクマネージャーより、優先度を通常以上に変更したら 40fps ⇒ 50fps になりました。(ウィンドウモード)
その優先度のままで、フルスクリーンにしてみると、 60fpsまで上昇しました。
優先度を通常にして、最初からフルスクリーンで起動してみると、40 ⇒ 50 fps(ウィンドウ⇒フル)
優先度かえるだけで変化するということは、PCの性能が原因でしょうか・・・
81ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(7,483ポイント)
Date: 2009/03/19(木) 08:26
No:31035
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
優先度を変えると、そのプログラムに割り当てられる時間が多くなります。
そのため、その分処理できる命令数も増えます(全体的に向上するという意味ではありません)から、
フレームレートが改善されることがあります。そのため、「PCの性能が原因ではないか?」という考えは、
自分のプログラムに非が無く、最適化がされ、良質であるという自信がある(笑)時にするべきだと思います。
大抵は、プログラムが無駄な処理をしています。
もちろん、3Dゲームをするのに Pen3 オンボードグラフィック というのは流石に問題があるとは思いますが…@@;
そういえば、描画関係のみしか書かれていなかったので思いつきませんでしたが、
その他の部分で改善できるような点はないでしょうか。例えば、for (int i = 0; strlen("文字列") > i; i++) {
/* 適当な処理 */
} というのは、毎回strlen()を評価するため、その分、1回のループで処理する量が増え、
結果を出すまでの時間が長くなります。また、関数を呼び出すというのは時間が掛かるので、呼び出し時間でも
損をしています。
366ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..ぴよぴよ(990ポイント)
Date: 2009/03/19(木) 10:20
No:31039
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
たしかに、他の部分に原因があるかもしれませんね。
問題の可能性があるコードを部分的に記してみます。
oid drawMenuBG(){
//以下は、それぞれの画像のx座標です。
static double cloud1left = -100;//雲1
static double cloud2left = -190;//雲2
static double cloud1right = 400;//雲3
static double cloud2right = 200;//雲4
static double logoCloud = 0;//ロゴ
static double planeCord = 0;//画像
DrawGraph(0,0,images[6],FALSE);//BG。
//本来は、ここで、↑の変数の値を変える。
//A地点
DrawExtendGraph(logoCloud,50,logoCloud+350*2,50+125*2,images[37],true);
DrawExtendGraph(cloud2left,600-174*2,cloud2left+373*2,600,images[33],true);
DrawExtendGraph(cloud2right,600-181*2,cloud2right+380*2,600,images[35],true);
DrawExtendGraph(cloud1left,600-127*2,cloud1left+400*2,600,images[32],true);
DrawExtendGraph(cloud1right,600-102*2,cloud1right+336*2,600,images[34],true);
//B地点
}
A地点からB地点をコメントアウトすると、60fpsに回復します。
やっぱり、この部分だけをコメントアウトすると処理落ち回避できるので他は問題ないと思います。
ある数字 *2 ってのは、画像のサイズを二倍にするためです。
images[37] は、350×125 44.1KB のPNGファイル。
images[33] は、373×244 77.5 KB の PNGファイル。
images[35] は、380×181 54.9KB のPNGファイル。
images[32] は 400×127 57.1KB のPNGファイル。
images[34] は、336×102 42.0KB のPNGファイル。
画面全体が 800×600なので、縦軸においての描画範囲は、600-(縦幅*2) から 600 となっています。
(画面の下部分にくっついて移動するようにしたいためです。)
*追加情報
DrawExtendGraph を一個ずつコメントアウトしてみると、画像の枚数に比例して処理落ちをしているようです。
341ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(7,728ポイント)
Date: 2009/03/19(木) 11:07
No:31043
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
雲の画像を背景で動かしたい感じでしょうか?動的なもののようなので、全統合して一気に表示っていうのは
ダメみたいですね。
ところで、DrawExtendGraph() の引数に double 幅の値が入っていますね。
「カクカクしたくない」「ゆっくり動かしたい」という場合は、?回に1回表示、とすれば良いだけです。
弾幕のように、高い精度で扱う必要がある事以外は、int 幅での扱いで十分でしょう。
実数型の計算は、整数に比べて、環境によって差はありますが、非常に遅いので注意して下さい。
というか、まさか変数全て double にしているなんて事はないですよね。
小数を必要とする時以外は整数で扱って下さい。いちいちキャストさせるとか無駄すぎます。
245ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(7,747ポイント)
Date: 2009/03/19(木) 11:09
No:31044
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
ごめんなさい。
× ?回に1回表示
○ ?回に1回移動
19ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..かけだし(1,098ポイント)
Date: 2009/03/19(木) 11:11
No:31045
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
すいませんdoubleの乱用には気をつけます。
int に直しましたが、変化はありませんでした。
あと、動的に動かさなかったとしても、処理速度は変わらないみたいですorz
それどころか変数を使わずに、DrawExtendGraphの引数に整数値をいれても遅いままで変化ありませんでした。
108ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(154,191ポイント)
Date: 2009/03/19(木) 11:20
No:31046
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
素朴な疑問なのですが、透過処理をしたPNG画像を描画する際にも、第6引数はTRUEにしないといけないのでしょうか?(^_^;)
よく知らずに書き込んでいるので、そうだったらそれで構わないのですが…
もし、そうでないのならば、既に透過処理されている画像に更に透過処理を行ったうえで、縮尺描画処理を行う
という非常に重い処理を内部で行っている可能性があります。
ついでに、TRUEとtrue、FALSEとfalseはそれぞれ別物です。DXライブラリのフラグ変数は、基本的にWINAPIのBOOL型と同じものなので、TRUEとFALSEで書くべきです。
57ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..かけだし(1,310ポイント)
Date: 2009/03/19(木) 11:25
No:31047
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>ついでに、TRUEとtrue、FALSEとfalseはそれぞれ別物です。
Σ(∵)!!!まじすか!
これから、DXライブラリの関数では大文字で書くようにします。
なお、 true⇒TRUE に直しましたが処理速度には変化ありませんでした。
>もし、そうでないのならば、既に透過処理されている画像に更に透過処理を行ったうえで、縮尺描画処理を行うという非常に重い処理を内部で行っている可能性があります。
FALSEとやると、PNGの透過が無視されてすごいことになりました。
どうやら、TRUEであっているようです。
212ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(7,886ポイント)
Date: 2009/03/19(木) 11:32
No:31048
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>true⇒TRUE に直しましたが処理速度には変化ありませんでした。
そういうことではないかと。扱うビット数が違かったり、それぞれで値が違うんじゃなかったんでしたっけ。
ごめんなさい。忘れました。
あと、一番背面の画像がもし風景(透過部分が無い)の絵なのであれば、は別にFALSEでも良いと思います。
透過しても意味無いですし。
同じように、透過部分が無い絵はなるべくFALSEにするべきです。
139ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(154,257ポイント)
Date: 2009/03/19(木) 11:32
No:31049
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
それだったら、透過処理が有効なPNG画像を使用するメリットはあまりないように思います。
BMP形式に変更すれば、かなり描画速度が上がるんじゃないかと思われますよ(^-^)
66ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(55,868ポイント)
Date: 2009/03/19(木) 11:35
No:31050
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
> 素朴な疑問なのですが、透過処理をしたPNG画像を描画する際にも、第6引数はTRUEにしないといけないのでしょうか?(^_^;)
ずいぶん前のバージョンではPNG画像の場合はフラグ関係無しとなっていましたが、それじゃおかしいだろという指摘があって変更されましたね。
45ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(7,951ポイント)
Date: 2009/03/19(木) 11:35
No:31051
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>BMP形式に変更すれば、かなり描画速度が上がるんじゃないかと思われますよ
あれ、DXライブラリって、読み込んだ画像って圧縮したまま扱うんですか?すごい非効率ですね…@@;;;
全て同じような形式に変換されてから扱われると思ってました。
65ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(55,917ポイント)
Date: 2009/03/19(木) 11:38
No:31052
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
> それだったら、透過処理が有効なPNG画像を使用するメリットはあまりないように思います。
それは違います。
PNG画像のα情報を有効にするか無効にするかの違いだったと思います。
BMPだと指定色しか透過できないから、作る時点での手間とファイルサイズを考えればPNGのメリットはあります。
49ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..かけだし(1,441ポイント)
Date: 2009/03/19(木) 11:40
No:31053
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>あと、一番背面の画像がもし風景(透過部分が無い)の絵なのであれば、は別にFALSEでも良いと思います。
やってますよ。
DrawGraph(0,0,images[6],FALSE);//BG。
すこし、説明不足でしたね。透明部分を持つ画像が、5枚動くこととなり、背景の一枚はjpgです。
つまり、image[6]は 800×600 の jpeg画像です。
>BMP形式に変更すれば、かなり描画速度が上がるんじゃないかと思われますよ(^-^)
ちょっと、ファイルサイズがかさばるので、できれば避けたいです><
131ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(55,983ポイント)
Date: 2009/03/19(木) 11:40
No:31054
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
> あれ、DXライブラリって、読み込んだ画像って圧縮したまま扱うんですか?すごい非効率ですね…@@;;;
そんなことないですよ。
読み込むときの時間は変わりますが描画時は変わらないです。
2倍のポイントを手に入れた! 66ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(154,339ポイント)
Date: 2009/03/19(木) 11:40
No:31055
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
あぁ、なるほど、そういう意味でのフラグでしたか。失礼しました(^_^;)
そうなると、どうして描画にそこまで時間が掛かっているのかが分かりませんね。
プロジェクトごとアップしてもらって、別のPCで試してみる…というくらいしか思いつきません。
82ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(17,661ポイント)
Date: 2009/03/19(木) 11:44
No:31056
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
質問者さんのPCスペックから考えて、さすがにdouble演算やキャストが原因ってことはないでしょう。
DrawRotaGraph2の実験結果から見ても、画像サイズや枚数、実浮動小数点数演算が原因とは考えにくいです。
必要のない部分まで描画していたり、多重のアルファブレンドが多いと重くなりそうな気がしますが、それだけではDrawExtendGraphのときだけ処理落ちすることが説明できませんね・・・
#追記
「画像サイズ」は除外できませんね。上のテストでは小さい画像をたくさん使っているので・・・
98ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..かけだし(1,743ポイント)
Date: 2009/03/19(木) 11:45
No:31057
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>プロジェクトごとアップしてもらって、別のPCで試してみる…というくらいしか思いつきません。
すいません、今のプロジェクトはやはりUPしたくないので、
新しくプロジェクトを作って、同じ状況を作ってみます。
あと、もう一台のPCでも検証してみることにしてみます。
少々お待ちを・・・
2倍のポイントを手に入れた! 302ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(8,046ポイント)
Date: 2009/03/19(木) 11:47
No:31058
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>No:31053(Ma)
あっ、ごめんなさい見逃してました。@@;;;
>No:31054(Mist)
ですよね。
>No:31055(バグ)
最初は助言だけでなんとかなりそうな気もしましたが、、、
まぁ、本人としてはあまり見せたくない部分があるかもしれないので、Helupするかどうかは本人次第です。
追記:
>No:31056(SCI)
いや、それに比べればそうなんですが、気になったので…@@
95ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..かけだし(1,756ポイント)
Date: 2009/03/19(木) 11:50
No:31059
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>DrawExtendGraphのときだけ処理落ちすることが説明できませんね・・・
すいません、もう一度 DrawRotaGraph で実行してみたら、
DrawExtendGraph と同じくらい、処理落ちしていました。
間違った情報申し訳ありません。
先ほどの
DrawExtendGraph(logoCloud,50,logoCloud+350*2,50+125*2,images[37],TRUE);
の代わりに
DrawRotaGraph( logoCloud+175, 50+63, 2, 0, images[37] , TRUE , FALSE ) ;
175は横幅の半分、63は縦幅の約半分というかんじでしたが、
ほぼ同等に処理落ちを確認しました。
13ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(56,033ポイント)
Date: 2009/03/19(木) 11:54
No:31060
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
今回の部分以外では画像の拡大・縮小は使われていないのでしょうか?
グラボのドライバがきちんと対応出来ていないという可能性もなくはないので、最新でないなら最新にしてみるとをお勧めします。
50ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(17,823ポイント)
Date: 2009/03/19(木) 11:56
No:31061
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>Maさん
あぁ、じゃあ画像サイズの問題かも知れませんね。
大量のピクセルを描画するレンダリングは普通に考えて重い処理なので、大量の小さい画像より処理が重くなりそうな気もします。
#テストしていないのでホントはどうか分かりませんが(笑
ついでに、画面からはみ出している部分、たくさん重なっている部分はありませんか?
162ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..ぴよぴよ(385ポイント)
Date: 2009/03/19(木) 12:01
No:31062
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>ついでに、画面からはみ出している部分、たくさん重なっている部分はありませんか?
ありません。
>今回の部分以外では画像の拡大・縮小は使われていないのでしょうか?
使っていますが、その拡大する画像のサイズが20×30 のような小型な画像なので
一切問題なく描画できていました。
使った関数は DrawRotaGraph2 で、1フレームに100枚程度描画しても問題ありませんでした。
>あと、もう一台のPCでも検証してみることにしてみます。
Windows XP
SP3
Intel(R)
Pentium(R) 4 CPU 3.00 GHz
0.99GB RAM
こんな環境で同じように起動してみました。
普通に62.5fps で余裕でした。
明らかに、CPUの性能が違うので当たり前といえば当たり前なのかな?
*追記
>グラボのドライバがきちんと対応出来ていないという可能性もなくはないので、最新でないなら最新にしてみるとをお勧めします。
ドライバは、半年以内に更新したはずなので、大丈夫だと思っていたのですが、更新してみますね。
241ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(8,247ポイント)
Date: 2009/03/19(木) 12:04
No:31063
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
逆に私は小さく分けた方が重くなるのかと思ってました…640x480 -> 描画
640x480 -> 320x240 -> 描画
320x240 -> 描画
320x240 -> 描画
320x240 -> 描画 ->の部分は関数呼び出しになるわけなので、それも無駄ですし…
分割ってSTGとかRPGツクール用の画像を容易に扱うものと思ってました@@;;;
> Pentium(R) 4 CPU 3.00 GHz 普通に62.5fps で余裕
> 明らかに、CPUの性能が違うので当たり前といえば当たり前なのか
Pen3 と i7 を比較するのと同じ考え方ですから、なるべき結果でしょう。
201ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(17,876ポイント)
Date: 2009/03/19(木) 12:10
No:31064
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>朽木さん
大きい画像と小さい画像のどちらが重いかは全くの予想です。
ただ、レンダリングに比べれば関数呼出しのオーバヘッドは無視できるレベルかと。
53ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(61,650ポイント)
Date: 2009/03/19(木) 12:11
No:31065
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
私にはただのPCのスペック不足にしか見えないんですけど・・・。
描画速度は、表示する面積に比例するわけで、枚数とかあまり考える必要がありません。
(PCのスペックにもよりますが2000枚以上とかだと流石に考える必要があります)
例えば、↑で12x50の画像を150枚描画しても処理落ちしないと言っていますが。
12x50x150で書き込んでいるピクセルは90000ピクセルです。
それに対して、
>images[37] は、350×125 44.1KB のPNGファイル。
>images[33] は、373×244 77.5 KB の PNGファイル。
>images[35] は、380×181 54.9KB のPNGファイル。
>images[32] は 400×127 57.1KB のPNGファイル。
>images[34] は、336×102 42.0KB のPNGファイル。
と800x600の背景1枚を描画した際のピクセルは 812364 ピクセルと、実に9倍以上です。
画面に書き込む量を最小限にして、描画するようにしましょう。
379ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(61,838ポイント)
Date: 2009/03/19(木) 12:19
No:31066
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
大きい画像と小さい画像のどちらが速くなるかに関しては、ハードウェアに依存する部分が大きいです。
単なるCPU処理ですと、関数オーバーヘッドの分、小さい画像を複数枚描画するほうが遅くなります。
PSやPSPなんかのゲーム機ですと、VRAMに境界線があり1回の描画でその境界線を跨ぐと描画速度が遅くなります。
例えば32byte単位の境界線があるハードウェアで、256色(1dot/1byte)の64x64の画像を描画する場合は
1回で描画してしまうと、境界線を跨いで遅くなってしまうため、32x64を2回描画したほうが描画速度が向上します。
188ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..ぴよぴよ(490ポイント)
Date: 2009/03/19(木) 12:24
No:31067
| 解決!
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>私にはただのPCのスペック不足にしか見えないんですけど・・・。
そんな気がします・・・
>画面に書き込む量を最小限にして、描画するようにしましょう。
たしかに、雲の枚数を減らす事はできますね。
ですが、タイトル画面ですので、他の部分と同じように描画の面積自体を小さくするのは難しいですね。
(またぴよぴよに…w)
最終的には、
環境が悪い。
また、描画面積を減らすという事で改良ができるということになりますね。
一応解決としておきます。皆様の協力ありがとうございます。<(_ _)>
105ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(61,850ポイント)
Date: 2009/03/19(木) 12:28
No:31068
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
PCスペック的に800x600のゲームに耐えられない気がするのですが
ウインドウサイズを640x480にするのはできないんですか?
12ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(18,014ポイント)
Date: 2009/03/19(木) 12:30
No:31069
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
同じような画像作って実験してみました。
圧縮率が違ったり他の処理が無かったりでなんだかんだ等価なコードではないですが・・・
CPU2GHz、2GBRAM、ノートPCのオンボードで透過グラデーションのPNGを描画しましたが処理落ちはしませんでした。
実験せずに発言してしまったことが恥ずかしい限りですね(笑
138ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..かけだし(1,862ポイント)
Date: 2009/03/19(木) 12:33
No:31070
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>ウインドウサイズを640x480にするのはできないんですか?
たしかに、そのほうがいいかもしれませんね。。。
640×480がどうも小さく感じたので、800×600に変えてしまいました。
これから、ウィンドウサイズを変えると、いろいろと変えたり直したりが面倒ですし、
将来的には、友達などに配布、(ネットも?)という予定なので、
800×600のままにしておきたいところです。
(ほとんど皆、自分より良い環境でしょうしw)
106ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(70,752ポイント)
Date: 2009/03/19(木) 12:42
No:31071
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
全く関係ない話ですが、
> (またぴよぴよに…w)
どうやら名前が全角文字の時と半角文字の時があるようです。
ポイントは別々にカウントされています。
名前はどちらかに統一したほうが良いでしょう。
(ちなみに、現在、全角文字の方がぴよぴよで、半角文字の方がかけだしとなっていますよ)
# そういえば、他にも同じような方がいましたね。
119ポイント を落としてしまった。
|
|
|
|
|
Name: EX ..ぴよぴよ(110ポイント)
Date: 2009/03/19(木) 23:58
No:31095
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
解決とありますが、一応思い当ったことを。
SetUse3DFlag()という関数を使い、フラグをFALSEにしていませんか?
もしそうであれば、フラグをTRUEにするか、
SetScreenMemToVramFlag()関数のフラグをFALSEにしてみてください。
そうでなくても、試しにSetScreenMemToVramFlag()関数のフラグをFALSEにしてみてください。
もしかしたら、DXライブラリのこの関数のリファレンスに書かれていることが原因かもしれません。
110ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(332,749ポイント)
Date: 2009/03/20(金) 02:55
No:31101
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>SetUse3DFlag()という関数を使い、フラグをFALSEにしていませんか?
そういう意味では、その手の「パフォーマンスを落とし互換性をあげる」フラグが
ライブラリ初期化時に自動的に設定されてしまう可能性もありますね。
大抵そういう場合はデバッグ用のログファイルに描画関連の初期化の中で
「〜に失敗しました」とか「ソフトウエアレンダリングモードに変更します」の
メッセージが残っているはずなので、それを確認してみるといいのかもしれません。
150ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..かけだし(2,042ポイント)
Date: 2009/03/20(金) 07:07
No:31103
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>SetUse3DFlag()という関数を使い、フラグをFALSEにしていませんか?
使っていません。
>SetScreenMemToVramFlag()関数のフラグをFALSEにしてみてください。
40fps ⇒ 10fps に落ちました。
>「〜に失敗しました」とか「ソフトウエアレンダリングモードに変更します」
失敗 の文字列はありませんでした。
レンダリング 関連のログもありませんでした。
一応ログを添付しときます。
180ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(333,107ポイント)
Date: 2009/03/20(金) 10:39
No:31105
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>失敗 の文字列はありませんでした。
>レンダリング 関連のログもありませんでした
たしかにないようですね。
ちなみにこのログは SetScreenMemToVramFlag()を使ったときのログですか?
(「3Dグラフィック描画機能は使用しません」という記述があるようだったので)
163ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..かけだし(2,066ポイント)
Date: 2009/03/20(金) 12:20
No:31106
|
|
Title: Re:大きいPNGの高速描画のコツ
|
|
>ちなみにこのログは SetScreenMemToVramFlag()を使ったときのログですか?
たしか、そうだったと思います。
画像を2数を減らして、ウィンドウモードでも 50fps にまで持ちあえげました。
ご協力ありがとうございました。<(_ _)>
〆
24ポイント を手に入れた。
|
|
|
|
Name: 叉奈 ..ぴよぴよ(261ポイント)
Date: 2009/03/18(水) 22:57
No:31022
|
|
Title: タイトル、選択画面がよくわかりません・・・;
|
|
はじめまして、叉奈と申します。
僕は今中三で今年高一になります。まだまだ初心者でわからないことだらけですが、質問させていただきます。
主にタイトル、選択画面の作り方がよくわかりせん。
過去ログも探してみましたが、結局よくわからずじまいに…;
main関数に入れ込んで、function_statusを使って設定、選択画面の基礎を表示することまでは
C言語〜プログラミングの館〜#33,34を見てわかったのですが、
東方のように選択画面(初期メニュー)から選択画面に(キャラクター選択)移行の仕方がよくわかりません。
どなたか赤点続出(勉強しろ)な僕にもわかるように教えていただけませんでしょうか?
261ポイント を手に入れた。
|
|
|
|
Name: 朽木 ..初心者(6,903ポイント)
Date: 2009/03/18(水) 23:10
No:31023
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
こんにちは。
タイトル、選択画面って言っても多くありますが、
while ( device is running )
{
BeginScene
/* 現在の、シーン番号で、分岐 */
switch ( NowSceneNo ) {
case タイトル:
/* タイトル処理 NowSceneNo = SceneTitle() など */
case キャラクターセレクト:
/* キャラクターセレクト処理 NowSceneNo = SceneCSelect() など */
default:
break;
}
EndScene
}
高速化すると、
while ( device is running )
{
BeginScene
NowSceneNo = ( *SceneFunc[NowSceneNo])();
EndScene
}
な感じでしょうか。
60ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(17,242ポイント)
Date: 2009/03/18(水) 23:16
No:31024
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
以前ここで似たような話題が挙がっていましたね。
このときにサンプルを作ったのですが、載せましょうか?
>朽木さん
IDirect3DDevice::BeginScene()・IDirect3DDevice::EndScene()と混同してしまいそうですね(笑
117ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..初心者(7,117ポイント)
Date: 2009/03/18(水) 23:18
No:31025
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
補足。
要は、シーンの移り変わりを一つの変数で管理してしまうのです。
1回の描画ごとにシーンの処理をし、まだそのシーンを続ける場合は自分自身のシーン番号を返し、
シーンを変えたい場合は、対象のシーンの番号を返せば、返り値はNowSceneNoに代入されるので、
実行する関数が変更され、そのままシーンが移行します。
ただ、この場合は、必要最低限という言葉が似合いません。このまま書くには、一度画像をすべてリードしておく
必要があります。
NowSceneNo と BeforeSceneNo と別にしておき、不一致の場合に再読み込みさせるようにすると良いかもしれません。
>No:31024
あああああそうなんですか。すみません分かりにくくて。@@;
214ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(17,298ポイント)
Date: 2009/03/18(水) 23:26
No:31026
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
あ、表示自体は出来ているみたいですね。
とすると、画面から画面へ遷移するときのアクション的な部分でしょうか。
56ポイント を手に入れた。
|
|
|
|
|
Name: 叉奈 ..ぴよぴよ(352ポイント)
Date: 2009/03/18(水) 23:34
No:31027
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
>>朽木様
丁寧な回答ありがとうございます♪
今から…できるかはわかりませんが、色々と試してみます!
>>SCI様
よろしければサンプル載せてください…。
>画面から画面へ遷移するときのアクション的な部分 もわからないんです;
91ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(17,342ポイント)
Date: 2009/03/18(水) 23:58
No:31028
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
少し修正したものを再掲します。選択ボタンを選択するフリをするプログラムです。
決定ボタンを押したときに何番のボタンを選択中かで分岐すれば、とりあえず何かできそうですね。
44ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(42,263ポイント)
Date: 2009/03/18(水) 23:59
No:31029
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
>>画面から画面へ遷移するときのアクション的な部分
私はフェードアウト処理で、ほかの画面に移行させてますよ^^
フェードアウトそのものはそれほど難しくはないと思うので、割とお勧めです。
90ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(17,457ポイント)
Date: 2009/03/19(木) 00:06
No:31030
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
アクション的な部分は、どんな感じかにもよりますが・・・
s-rushさんの言う通り、白や黒、あるいは何か別のものにフェードする処理は良いですね。
表示物に動きをつける場合、敵弾とかと同じ様にボタンの速度・加速度を処理するとそれっぽい動きになるのではないでしょうか。
115ポイント を手に入れた。
|
|
|
|
|
Name: 叉奈 ..ぴよぴよ(441ポイント)
Date: 2009/03/19(木) 00:23
No:31031
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
>>SCI様
わざわざありがとうございます!
頑張っていじくりまわしてみます^^(低レベル発言すいません;
速度・加速度もやってみます!
>>s-rush様
なるほど、フェードアウトですか…。
し、調べてみます!(本当にレベル低くてすみません;
また明日(今日)やってみます^^
89ポイント を手に入れた。
|
|
|
|
|
Name: nayo ..中級者(10,057ポイント)
Date: 2009/03/19(木) 00:43
No:31032
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
龍神録の館にあったボスの移動ルーチンに似た考え方が使えるのではないでしょうか
メニュー選択時に各メニューの移動させたい位置、移動までのカウントをセットしてやるとか
これに回転やアルファブレンドなども設定してやるとある程度のものはできるのではないでしょうか
ただ、メニューを画像で表示している場合に限りますが
特殊なメニューアクションを作るならやはり自作するしかないかと思います
メニューの移動フラグを立てるだけで自動的に計算してくれるような関数やクラスを作っておくと便利かと思います
あくまで個人的な意見ですがメニュー一つでゲームの見栄えがかなり変わってくるので
メニューはゲーム本編並みに大事だと思ってます
レイアウトやメニューのフォント、色などゲーム内容に合わせた雰囲気を出すのに苦労しますね
262ポイント を手に入れた。
|
|
|
|
|
Name: 叉奈 ..ぴよぴよ(583ポイント)
Date: 2009/03/19(木) 20:56
No:31087
|
|
Title: Re:タイトル、選択画面がよくわかりません・・・;
|
|
>>nayo様
なるほどです。挑戦してみます^^
やっぱりメユーは大切ですよね…頑張っていい出来にしたいと思います!
適格な助言ありがとうございます!
2倍のポイントを手に入れた! 142ポイント を手に入れた。
|
|
|
|
Name: s-rush ..熟練のプログラマー(43,545ポイント)
Date: 2009/03/19(木) 09:15
No:31036
|
|
Title: 離散フーリエ変換
|
|
度々すいません。
大学の課題で、画像拡大のプログラムを作っているのですが、行き詰ってしまいました。
画像拡大そのもののプログラムは完成して、あとは画像向上のための処理なのですが、
その準備段階で、行き詰っています。
フーリエ変換を用いて、画像の向上を図るのですが、
ためしに1次元のフーリエ変換のプログラムなんですが、sin波を入れても
出力がすべて0になってしまいます。(±ありますが)
変換の式が間違えているのでしょうか?
申し訳ないですが、アドバイスお願いします。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define PI 3.14159265358979323846
int dft(double *re, double *im, int n)
{
double *t_re, *t_im;
int i, j;
/*メモリ確保*/
t_re = (double *)malloc(sizeof (double) *n);
if(t_re == NULL){
printf("malloc errer1\n");
return -1;
}
t_im = (double *)malloc(sizeof (double) *n);
if(t_im == NULL){
printf("malloc errer2\n");
return -1;
}
for(i=0; i<n; i++)
{
t_re[i] = 0;
t_im[i] = 0;
}
/*フーリエ変換*/
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
t_re[i] += re[i]*cos(2*PI*i*j/n)+im[i]*sin(2*PI*i*j/n);
t_im[i] += -re[i]*sin(2*PI*i*j/n)+im[i]*cos(2*PI*i*j/n);
}
}
for(i=0; i<n; i++)
{
re[i] = t_re[i];
im[i] = t_im[i];
}
/*メモリ解放*/
free(t_re);
free(t_im);
return 0;
}
int main()
{
double re[32], im[32];
int i;
for(i=0; i<32; i++)
{
re[i] = sin(2.0*PI*i/32);
im[i] = 0;
printf("%f\n", re[i]);
}
dft(re, im, 32);
for(i=0; i<32; i++)
{
printf("re=%f im=%f\n", re[i], im[i]);
}
return 0;
}
2倍のポイントを手に入れた! 1,282ポイント を手に入れた。
|
|
|
|
Name: s-rush ..熟練のプログラマー(43,544ポイント)
Date: 2009/03/19(木) 09:18
No:31037
|
|
Title: Re:離散フーリエ変換
|
|
追記です。
環境はVC++2008 EEです。
なぜかM_PIを使おうとすると、定義されていないとエラーが出てしまったので、
#defineでPIを定義しています。
1ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(70,871ポイント)
Date: 2009/03/19(木) 10:15
No:31038
|
|
Title: Re:離散フーリエ変換
|
|
試しにブレイクポイントやステップ実行で計算過程を確認してみてはどうでしょうか?
どこかで計算が狂っているかもしれません。
(フーリエ変換の式を知らない者なので、それしかいえません…)
> なぜかM_PIを使おうとすると、定義されていないとエラーが出てしまったので、
math.h をインクルードする前に _USE_MATH_DEFINES を定義しておくとマクロが定義されますよ。
詳しくは math.h を開いて見てください。
151ポイント を落としてしまった。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(43,859ポイント)
Date: 2009/03/19(木) 10:27
No:31040
|
|
Title: Re:離散フーリエ変換
|
|
>>試しにブレイクポイントやステップ実行で計算過程を確認してみてはどうでしょうか?
一応ブレイクポイントで確認してみたのですが、やはり計算が途中でおかしいようなんです。
といってもほとんどが0になるので、本当にくるっているのかどうか怪しいところなんですが^^;
しかし、いろんなサイトを見回ったり、手計算で何度も計算式を導出したりしているので、
式は間違っていないと思うんです。
他にも、サイトで、フーリエ変換のプログラムを紹介されているところを見つけたので、
そのプログラムでの変換式をコピーして貼り付けたのですが
(変数は自分のプログラムに合わせて変更しました)
出力は変わらずすべてが0でした。
ちなみにそのサイトで紹介されていたプログラムを実行させたところ、
正常に動作してました。
なので、どこに問題があるのかがわからないです。
315ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(17,563ポイント)
Date: 2009/03/19(木) 10:30
No:31041
|
|
Title: Re:離散フーリエ変換
|
|
この部分 t_re[i] += re[j]*cos(2*PI*i*j/n)+im[j]*sin(2*PI*i*j/n);
t_im[i] += -re[j]*sin(2*PI*i*j/n)+im[j]*cos(2*PI*i*j/n); こうじゃないですか?
106ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(43,932ポイント)
Date: 2009/03/19(木) 10:38
No:31042
| 解決!
|
Title: Re:離散フーリエ変換
|
|
iではなくてjでした^^;
SCIさん、どうもありがとうございました。
今度はこのプログラムをもとにして、2次元のフーリエ変換を頑張ります。
73ポイント を手に入れた。
|
|
|
|
Name: 枯れコオロギ ..ぴよぴよ(288ポイント)
Date: 2009/03/19(木) 03:25
No:31033
|
|
Title: 不思議なエラーがありました。
|
|
始めまして、枯れコオロギと申します。
C言語歴2週間程度の初心者ですが、こちらのサイトを参考にアクションゲームを作ろうとしています。
簡単な条件文や関数指定はなんとかなる、といったところです。
主に「ゲームプログラミングの館」の記述を参考にプログラムを組んでいるのですが、あるとき
"サンプルプログラム実行用フォルダ\Debug\DxLib_VC2005用.exe' が読み込めません"
というエラー文が出てビルドに失敗してしまいました。構文エラーなどもなく、それ以前のビルドに
成功したデータに戻しても同じエラーメッセージが出てしまう、という状態になりました。
一度PCを再起動すると今度はエラーが出なくなり、それ以降は問題なく動作しています。
こういったトラブルは良くあることなのでしょうか?
構文エラーは検出されなかったので省略していますが、そちらも記載したほうがいいでしょうか。
288ポイント を手に入れた。
|
|
|
|
Name: 枯れコオロギ ..ぴよぴよ(354ポイント)
Date: 2009/03/19(木) 03:45
No:31034
| 解決!
|
Title: Re:不思議なエラーがありました。
|
|
よく見たら3月15日に同じぬかづけさんが同じ質問をされていました。
なのでこの質問はスルーして下さい。
恥ずかしい不注意でした・・・。
66ポイント を手に入れた。
|
|
|
|
Name: ひよこ ..上級者(18,391ポイント)
Date: 2009/03/02(月) 21:48
No:29810
|
|
Title: 初めて作ったシンプルな自作ゲーム
|
|
今日あるゲームができたのです。シンプル イズ ベストのゲームですが
サンプルプログラムの館に入れてもらえるにはどうすればいいでしょうか?
2倍のポイントを手に入れた! 144ポイント を手に入れた。
|
|
|
|
Name: 脱出の人 ..ぴよぴよ(435ポイント)
Date: 2009/03/02(月) 22:01
No:29813
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
同じく気になりますww
とりあえず斧にUPしてURL張ってみたらどうですか?
個人的な意見ですが。
2倍のポイントを手に入れた! 70ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(67,326ポイント)
Date: 2009/03/02(月) 22:22
No:29818
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
シンプルです。とてもシンプルです。
が、もう少しゲーム性を追加したほうが良いかと。。
追加してほしいなっと思うものを挙げてみます。
・長押しに対応(毎度キーを押すのは大変)
・スコア(ゴールまでの時間とか、経路とかで)
・ゲーム中に終了できるようにする
・いけない箇所を作る。
・到達地点を一定の出現場所ではなく、ランダムにする。
こんな感じですかね^^;
スコアでは経路がなかなか凝った感じがします。
最短距離を求めて、オーバーした分だけ減点。
何歩以上かオーバーしたらゲームオーバーとかでもいいですね。
274ポイント を手に入れた。
|
|
|
|
|
Name: 脱出の人 ..ぴよぴよ(516ポイント)
Date: 2009/03/02(月) 22:29
No:29819
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
まさにシンプル イズ ベストですね。
乱数を使って相手の出る位置をランダムにしたらもっと良くなるかも?
ループを使えばもっと良くなるかも?
と言う初心者の感想ですw
81ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(18,537ポイント)
Date: 2009/03/02(月) 22:56
No:29821
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
アドバイスありがとうございます。
乱数はちょっと難しいですがほかはできるだけがんばりたいと思います。
45ポイント を手に入れた。
|
|
|
|
|
Name: SooA ..入門者(4,374ポイント)
Date: 2009/03/02(月) 23:05
No:29822
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
加えて途中から偽者出現とかあるとゲーム性がUPするかも?
画像を使って少しだけ違う本物と偽者を用意して、
面?が進む毎に増える偽者、迫るリミットタイム!?
とかどうでしょう。
50ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(30,580ポイント)
Date: 2009/03/02(月) 23:39
No:29827
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
ひよこさん
余計なお世話かもしれませんが、枠のDrawLineの整理のついでに乱数を使うようにしたんですが、
改変部分だけアップしましょうか?
64ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(31,059ポイント)
Date: 2009/03/03(火) 01:38
No:29835
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
さすがにおやすみのようなので本来の用件だけ
Danjon関数内でDrawLine文の羅列がありますが、X(Y)が一定間隔で増加してますよね。
その場合、for文を使うと便利です。
int I = 0;
for ( I = 0; I < 608; I += 32 )
{
DrawLine ( I, 0, I, 480, GetColor ( 255, 255, 255 ) );
}
或いは
int I = 0;
for ( I = 0; I < 20; ++ I )
{
DrawLine ( I *32, 0, I *32, 480, GetColor ( 255, 255, 255 ) );
}
このどちらかで19本の縦線が引けます。横線も同じ要領で出来ます。
乱数はそんなに難しくないですよ。
今回の場合、横20マス、縦16マスとして考えればいいんです。
rand ()%20 で0〜19までの値ができます。
この値に一マスの大きさを掛ければ表示したい座標が求まります。
なので( rand () %20 )*32 と書いてやればOkです。
最後に長押し対応は%をうまく使ってやればできると思いますので頑張ってください。
479ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(998,712ポイント)
Date: 2009/03/03(火) 02:32
No:29837
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
プレイさせて頂きました。ありがとうございます。
う〜んと、せっかくでしたらもう少し作りこんでから掲載してみませんか?
「どっかにいく」じゃなくてある規則で追うと相手をある程度追いやれるとか何かもう少しゲーム性が欲しい気がします。
また途中でエスケープを押せばいつでも脱出成功になるのもちょっと気になったり・・。
また、画像や効果音を用意するとグッとクオリティアップすると思います。
2倍のポイントを手に入れた! 238ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(18,668ポイント)
Date: 2009/03/03(火) 14:46
No:29857
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
こんにちは、返事遅くなりました。
いろいろありがとうございました。いろいろ参考になりました。
木霊さん>ありがたく乱数について使わせてもらいます。
Dixqさん>今回はあくまでシンプルに作ってみたので、
次回は効果音用意しておきます。
119ポイント を手に入れた。
|
|
|
|
|
Name: 脱出の人 ..ぴよぴよ(682ポイント)
Date: 2009/03/03(火) 21:40
No:29891
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
初見で
104秒
スコア9531でしたw
右腕つるかと思いましたw
気づいた点?↓
偽者と本物が重なることがありました。
偽者に重なってる間音がずっとなってました。
別に修正しなくてもいいようなことですがw
2倍のポイントを手に入れた! 130ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(18,750ポイント)
Date: 2009/03/03(火) 21:45
No:29892
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
早速プレイしていただきありがとうございます。
脱出の人104秒 スコア9531でしたw >すごくないですか。偽者なくてもそんなに早くできなかったです。
46ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(68,364ポイント)
Date: 2009/03/03(火) 21:45
No:29893
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
おぁ、疲れた。。w
ゲーム性は向上していますが、もう一歩です。
不具合について
・キー入力がおかしい。
っというのも、長押しに対応しているようで、うまくしていません。
4つ(?)ぐらいにしか一気に進みません。
また、一度押したつもりが、ループ毎にインクリメントしているせいか、
一気に進んでしまいます。一度押したら一マス、数十ループで長押し状態にし、一気に移動
っとしたほうが操作しやすいです。
あとはプレーヤー希望です。
・スコアの描写ですが、もろにステージ画面とかぶっています。
ここもステージとスコア描写は分けたほうがよいかと。
・100ステージは結構面倒ですw
もう少し減らすか、レベル別に難易度を変えるとかのが良いかも知れません。
例えば、一気にすべてではなくて、レベルごとに回答を減らすとかですかね。
神経衰弱みたいになってしまいますがw
エンディングが付き、効果音もついたことで、一気にゲーム性が付きました。
この調子で、コンティニュー機能や、一時停止機能など、もっともっとゲーム性を
自分なりにつけていってください^^
難易度が次の目標ですかね^^
428ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(18,785ポイント)
Date: 2009/03/03(火) 21:48
No:29895
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
やっぱり100階は面倒ですか。エンディング画面見るために100階大変でしたね。ご苦労様です。
35ポイント を手に入れた。
|
|
|
|
|
Name: SooA ..入門者(4,527ポイント)
Date: 2009/03/03(火) 22:43
No:29902
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
お疲れ様です。
初回
タイム 191
スコア 883 でした。
残り55階くらいになるまで色の違いに気が付きませんでしたw
自分で言い出しておいてなんという… orz
不具合っぽいので気が付いたのは、
他の方が既に出しているような事ですね。
近場に出現してコンボが決まると気持ちよかったので、
今後はその辺りの演出を攻めてみたらどうかな。
153ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(18,842ポイント)
Date: 2009/03/03(火) 23:23
No:29909
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
近場に出現してコンボが決まると気持ちよかったので>それって連続で階を進むってことですか?
たしかにそれは気持ちいいですね。
57ポイント を手に入れた。
|
|
|
|
|
Name: 烏 ..初心者(7,037ポイント)
Date: 2009/03/04(水) 00:02
No:29915
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
プレイさせていただきました。
シンプルでとても楽しくできました^^
100階は確かに少し多い気がしましたが、その分チャンスが増えた気もしました。
(50階で55秒とかの時とかの場合)
100階あったおかげで100秒以内でいけましたし・・・(50秒の時点で57秒くらいでしたorz)
ちなみに、初回は140秒くらいかかりました。
不具合に関してはもう出されていることでした。
個人的な意見ですが、間違ったところに行ったときのペナルティーが少し軽すぎるような気がしました。
あと、相手が逃げるモードなんてのはどうでしょうか?
あまりいいことが言えなくてすいません。
252ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(31,418ポイント)
Date: 2009/03/04(水) 00:30
No:29922
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
初回で108秒、9124点でした
4秒負けたorz
最初の方は偽物なしで慣れてきた頃に偽物登場、更に進むと偽物増える
って方が単調にならないのでステージが多くても長さを感じさせないと思います。
あと、プレイ中は気にする余裕がなかったんですが、偽物を選んだ時のペナルティはあったほうが
面白くなると思いますよ。
最後にプログラムの事ですが3点ほど気になっているところを。
1・while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 )
がプログラム中に3回書かれています。
内、2つがDanjon関数内にありますが、これらをプログラム中に1回だけで済むようにしてみましょう。
2・DrawLineをfor文で回すと36行だったものが6〜8行に収まります。
プログラムも見やすくなるのでfor文の練習と思ってやってみてください。
3・キー入力ですが1、5、10の時に反応するように一方向につき3つのif文が書かれていますが、
これだと反応回数を増やす度にif文が増えていきます。
これを1、6、11、16、21・・・にして考えてみてください。
「%」は割ったあまりを求める演算子なので上の数列とうまく組み合わせればとりあえず長押しできるようになります。
%の例 10 /3 = 3; 10 %3 = 1;
359ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(149,644ポイント)
Date: 2009/03/04(水) 08:47
No:29932
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
個人的な意見ですが、上下左右でループ移動できるといいかな?と思います。
一番上のマスで上を押すと一番下のマスへ、一番左のマスで左を押すと一番右のマスへ…みたいな感じですね。
91ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(19,847ポイント)
Date: 2009/03/04(水) 15:32
No:29955
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
まずモードを作ろうと思ったらエラーが出て困ってます。どうすればいいでしょうか?
------ ビルド開始: プロジェクト: 脱出, 構成: Debug Win32 ------
コンパイルしています...
脱出.cpp
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(73) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(73) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(73) : error C2146: 構文エラー : ';' が、識別子 'PlayerX' の前に必要です。
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(73) : error C3861: ' if': 識別子が見つかりませんでした
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(169) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(169) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(169) : error C2146: 構文エラー : ';' が、識別子 'PlayerX' の前に必要です。
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(169) : error C3861: ' if': 識別子が見つかりませんでした
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(249) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(249) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(249) : error C2146: 構文エラー : ';' が、識別子 'PlayerX' の前に必要です。
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(249) : error C3861: ' if': 識別子が見つかりませんでした
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(329) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(329) : error C3872: '0x3000': この文字を識別子で使用することはできません
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(329) : error C2146: 構文エラー : ';' が、識別子 'PlayerX' の前に必要です。
c:\documents and settings\デスクトップ\脱出4\脱出\脱出.cpp(329) : error C3861: ' if': 識別子が見つかりませんでした
ビルドログは "file://c:\documents and settings\デスクトップ\脱出4\脱出\Debug\BuildLog.htm" に保存されました。
脱出 - エラー 16、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
1,005ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,001,549ポイント)
Date: 2009/03/04(水) 16:12
No:29959
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
う、、腕が〜!右腕が釣りましたw
>>yuさん
き・・九十六・・。
私は初回ですが、129秒でした。比較になりませんね^^;
>>ひよこさん
GetHitKeyStateAll_2を使っているなら
if( Key[○○] == 1 || Key[○○]> 10 ){
//移動
}
みたいにすれば押しっぱなしの時も一緒に移動出来ますよ。
後、これは以前言ったかもしれませんが、
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 )
こういう処理は一箇所にだけ書いた方が効率的です。
条件分岐させて処理をさせれば一箇所に書いておけば充分対応出来ます。
また、
SetFontSize( 20 ) ;
この関数は毎回呼んではだめです。
今は大丈夫かもしれませんが、いくつか呼ぶとFPSが60保てなくなると思います。
複数の種類やサイズの違うフォントを作りたい時はフォントハンドルを作ってから描画してあげて下さい。
詳しくはリファレンスに書いてあります。
340ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,001,849ポイント)
Date: 2009/03/04(水) 16:23
No:29961
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
上に書いてある事をわかりやすくかくと・・
キーの入力と移動の部分を以下のように書き換えて下さい。
static int count=0;
if( Key[ KEY_INPUT_LEFT]==1 || ( Key[ KEY_INPUT_LEFT]>10) && count%2) x-=32;
if( Key[ KEY_INPUT_RIGHT]==1|| ( Key[ KEY_INPUT_RIGHT]>10) && count%2) x+=32;
if( Key[ KEY_INPUT_UP]==1 || ( Key[ KEY_INPUT_UP]>10) && count%2) y-=30;
if( Key[ KEY_INPUT_DOWN]==1 || ( Key[ KEY_INPUT_DOWN]>10) && count%2) y+=30;
count++;
後、配列要素を1つしか作ってないのに2つめにアクセスしているところがあります。
int Xde[1];
↓
int Xde[2];
このように宣言を変えて下さい。
あと、DrawLineはfor文で書いた方が楽ですよ;
300ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(151,488ポイント)
Date: 2009/03/04(水) 17:20
No:29967
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
操作性がよくなりましたね(^-^)
そのせいか、余裕で100秒を切ってしまうのがなんとも…(苦笑)
でも、こういうシンプルなゲーム大好きです♪(私が作るのもシンプルなものばかりなんで(笑))
92ポイント を手に入れた。
|
|
|
|
|
Name: 脱出の人 ..ぴよぴよ(892ポイント)
Date: 2009/03/04(水) 17:24
No:29968
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
ハード初見で
92秒
スコア5520
でしたw
偽者に引っかかってスコア減りまくったw
偽者にぶつかるとずらされるのは良いと思いました。
(斜めに移動してたら引っかかったw)
一マス移動は良いと思いましたがZXCVの配置は自分的には使いにくかったですね。
どの上とかがどのボタンか分からなくなって結局あんまり使いませんでした。
自分的にはWASDを使った方がやりやすかったと思います。
でも一マス移動と高速移動のボタン違うボタンに変えたのは良いと思いますよ。
なれれば使いやすくなると思いますし。
210ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(19,907ポイント)
Date: 2009/03/04(水) 17:28
No:29969
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
さっそく遊んでくださりありがとうございます。
ループ移動やハードモードの改良などやってみました。
ノーマルとレベルの差を結構つけましたよ。
43ポイント を落としてしまった。
|
|
|
|
|
Name: 木霊 ..プログラマー(32,016ポイント)
Date: 2009/03/05(木) 00:21
No:29999
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
キー判定のところで
if( Key[ KEY_INPUT_RIGHT]%3==1)PlayerX+=32;
if( Key[ KEY_INPUT_RIGHT]%3==6)PlayerX+=32;
if( Key[ KEY_INPUT_RIGHT]%3==11)PlayerX+=32;
if( Key[ KEY_INPUT_RIGHT]%3==16)PlayerX+=32;
if( Key[ KEY_INPUT_RIGHT]%3==21)PlayerX+=32;
とありますが、Key[ KEY_INPUT_RIGHT]%3の結果は0、1、2のどれかにしかなりません。
「%」は余りを求める時に使うので、後ろに付いた数字より大きい値になることはありません。
という事は最初の一つ以外無駄になっています。
先日の例では5で割って余りが1の時に移動していたので11、16という数字を出したのですが・・・
if ( Key [ KEY_INPUT_RIGHT ] %3 == 1 ) { PlayerX += 32; }
こう書くだけで押し続けた時に3フレームに1度(60FPSの環境で1秒に20マス)進むようになります。
(ひよこさんの書いた一番上の部分だけを見やすくしただけです)
これを長押し対応にするには、管理人さんの書かれているようにKey [ KEY_INPUT_RIGHT ]の値が、
10(ある程度の大きさの数)以上であり、同時にKey [ KEY_INPUT_RIGHT ] %2(こちらも適当な数字)が1であればいいわけです。
if ( Key [ KEY_INPUT_RIGHT ] == 1 || ( ( Key [ KEY_INPUT_RIGHT ] -15 ) > 0 && ( Key [ KEY_INPUT_RIGHT ] -15 ) %5 == 1 ) ) { PlayerX += 32; }
前半部分(赤い所)が押した瞬間に、後半部分が15フレーム以上押している時(緑色の所)に
5フレームに1度だけ(青いところ)移動する(if文の判定が真になる)ようにしたものです。
15のところが押しっ放しにした時に動かない時間です。変数に入れておけば変更しやすいです。
(%の数字を大きくした時に判定にムラができるようなのでアレンジしました。すみません。)
また、管理人さんも仰ったように
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 )
は一つだけにしておきましょう。今回の変更では逆に増えてます。
そういえばもう一つ、空白部分が半角スペース、全角スペース、タブの三つが混在してます。
全角スペースは時にエラーが出るので使わないようにした方がいいです。
サンプルへの掲載を目標にしておられるようなので、特にプログラム面をコメントしてみました。
応援してますよ。
598ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,002,530ポイント)
Date: 2009/03/05(木) 00:53
No:30002
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
>>ひよこさん
制作お疲れ様です。
私がこんな偉そうなことをいえる立場ではないですが、
やはりサンプルプログラムとして提示するということは、
みんなこれを参考にして下さいといっているということだと思います。
という事は、ソースコードは解りやすく、適切である必要があり、
もしふさわしくない書き方があるなら適切なものにしておかないといけません。
とりあえず指摘されている所は全て直すようにしてみてください。
また、for文なしで沢山書いている部分をfor文などでまとめ、
意味のない部分を削除し、似たような変数が沢山あるものは配列にし、
書き方を効率化してみてください。
後、関数名がX一文字というのも少し気になります・・。
更に、コードを読んでもらう為には注釈が必要ですので、注釈を適度に入れて下さい。
そして、括弧の対応の仕方に一貫性を持たせ、読みやすくし、字下げも統一して下さい。
>>木霊さん
負の数の剰余が正になることはないので、緑の部分は必要ないかもしれませんね。
(追記:VC++での結果)
405ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..プログラマー(32,057ポイント)
Date: 2009/03/05(木) 01:04
No:30004
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
あれ、そうでしたか・・・自分のにはいつもつけてました。
ご指摘ありがとうございます。
後、遅ればせながらウィザード昇進おめでとうございます。
41ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(19,975ポイント)
Date: 2009/03/05(木) 12:35
No:30042
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
サンプルプログラムに入れるのはハードモードしか入ってないゲームでいいですか?
サンプルならシンプルのほうがいいと思いましたので。
ただいま関数の整理などやっております。
68ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(20,127ポイント)
Date: 2009/03/05(木) 18:39
No:30077
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
それは今までのゲームと違ってきれいに完成したのってのもありますけど
やっぱりこんな初心者がこんなの作れたよ、わたしにもできるかなって考
えてもらえるとうれしいからですね。
2倍のポイントを手に入れた! 34ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(20,236ポイント)
Date: 2009/03/05(木) 18:51
No:30078
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
kazuoniさん>>字下げが今のままでは見づらいです。
どのようにすればいいでしょうか。
kazuoniさん>>あとSTAGE_TEKI()はもっと簡単にできそうですね。
ではどうすればいいでしょうか。自作関数をつかって短縮するといいたいのでしょうか。
109ポイント を手に入れた。
|
|
|
|
|
Name: 脱出の人 ..ぴよぴよ(914ポイント)
Date: 2009/03/05(木) 18:57
No:30079
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
プログラムは見てないんですが、
ゲーム内容的には良いと思いますよ。
22ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(69,835ポイント)
Date: 2009/03/05(木) 19:22
No:30082
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
ちょっと違うスレのコードですか、こんな感じです。
自分のものと比べてみてください。タブが入ってるかいないかですけど^^;
これのほうが{}の対応関係も見やすいと思います。
(決してこれがいい!っと言うわけではないです。)
>もっと簡単に
別に特に重要ってわけではないんですけど、
if(PlayerX==deguchi2X
以下はすべて同じだと思うので、関数化できるかなと。
敵が4→15になったら面倒かつ長いコードになってしまうので。
あと、今のままでもいいのですが、
STAGE_TEKI()のif文は絶対にすべて条件を調べないといけませんか?
敵が重なっているってことがあれば別ですが、すべての敵がバラバラ
っという条件の時は敵あたりの条件にヒットしたら、
それ以外の敵とのあたり判定はしなくてもよいのでは?
まぁ、if....else if....とするだけなんですけど^^;
ただ、これをしてどうこうっということはないですが、
やはり皆さんに見てもらうっということでは、
以前たかぎさんもおっしゃっていましたが、
「コメントを書かないでも理解できるコード」
に近づけるために、やはり簡潔かつ分かりやすく(「簡潔=わかりやすい」ではないですが・・・)
記述するのが良い気がします。
514ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(69,869ポイント)
Date: 2009/03/05(木) 19:23
No:30083
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
↑のファイルをVC++で開いてみてください。
(ここで見る限りには見づらいです^^;)
・・・うまくみれないですかね。
とりあえず言いたかったことは、
if(PlayerX==deguchi4X && PlayerY==deguchi4Y){
PlaySoundMem( Sound , DX_PLAYTYPE_BACK );
Change[0]=Change[1];
score+=320;
PlayerX=PlayerX-32;PlayerY=PlayerY+30;
}
よりは
if(PlayerX==deguchi4X && PlayerY==deguchi4Y){
PlaySoundMem( Sound , DX_PLAYTYPE_BACK );
Change[0]=Change[1];
score+=320;
PlayerX=PlayerX-32;PlayerY=PlayerY+30;
}
のが見やすくないですか?
・・・上手く説明できません。。
34ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(18,109ポイント)
Date: 2009/03/05(木) 19:48
No:30086
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
>>ひよこさん
遊ばさせて頂きました。
気になった所です。
・キー操作
押しっぱなしが利くのはいいのですが、一マスだけ移動しようとすると
ニマス三マスと移動してしまうので、押しっぱなしをあるフレーム以上来たら・・・
という処理に変えてみるといいのではないでしょうか。
(一瞬だけ押せば一マス移動もできなくはないですが、ちょっと疲れます。)
・音
いきなり大きな音が鳴ってびっくりしました。
音量を下げてみるといいかもしれません。(フリーソフトなどで下げる)
・ソースコード
「1」ソースコードが縦一列に並んでいるのは見にくいかと思います。
どのようにするのか分からないのであれば、「インデント」などで調べてみてください。
参考になるサイトはいくらでもありますので、まず真似してみるといいと思います。
「2」同じような変数が連番で定義されているので、配列にしてみては如何でしょうか?
deguchiX[4], deguchiY[4]のように。
「3」同じ処理を関数にまとめるといいと思います。(STAGE_TEKI)
そこまで急いでサンプルに掲載されなければいけないのでしょうか?
「プログラム初心者がこんなの作れました」という気持ちは分からなくはないです。
が、ゲームだけでなく、ソースも参考にされる可能性があるため、
見にくいソースだと参考にならない、出来ないと思います。
588ポイント を落としてしまった。
|
|
|
|
|
Name: ひよこ ..上級者(20,264ポイント)
Date: 2009/03/05(木) 20:20
No:30091
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
BEMANIさん一マスだけ移動しようとすると >>
WASDで1マスだけ動けます。
28ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(18,288ポイント)
Date: 2009/03/05(木) 20:45
No:30092
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
>>ひよこさん
失礼しました。書き方が悪かったです。
「READ ME.txt」にWASDで一マス移動できると、書いてあったのでそれはいいのですが、
移動キーを分けているのはなぜでしょうか?
キャラクター移動を十字キーだけにまとめることは可能だったはずです。
特別な理由がない限り、移動処理(一回だけ押す・押しっぱなし)は
まとめる方がいいのではないかと思います。
179ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(152,335ポイント)
Date: 2009/03/05(木) 21:02
No:30095
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
個人的には別キーも有だと思います。慣れてしまえば押し間違えが少なくて済みますし。
ただ、私が同じ物を作るならば、シフトキーを使うかな?
シフトキーを押したままカーソルキーでスロー移動とか…
このへんは作り手の好みの話になってくるので、こういう意見もある程度に流しておいてください(^_^;)
147ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(20,293ポイント)
Date: 2009/03/05(木) 21:11
No:30096
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
BEMANIさん>>確かにそうですけど技術不足・・・・・・だと。
バグさん>>シフトキーでもいいですね。
29ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(152,381ポイント)
Date: 2009/03/05(木) 23:43
No:30105
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
それをやるなら、『0.5秒以上押されている、もしくは今押された場合に移動させる』としないと、チョン押しでの1マス移動が難しくなりますね(^_^;)
46ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..初心者(5,980ポイント)
Date: 2009/03/07(土) 01:10
No:30186
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
とにかく一行に詰め込みすぎ?な感があります。
参考になるものがあった方が良いと思い
ある程度ソースを変更させてもらいました。
更なる注釈の記入と、今後の参考にしてみてください。
あと、直してませんがファイル名に"ENDINGU"としていますが
正しくはENDINGです。
79ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..初心者(6,114ポイント)
Date: 2009/03/07(土) 01:37
No:30191
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
追記
これも直してませんが、変数名を統一したほうがいいですよ。
人様々ですが、私の場合は
グローバル変数の頭には以下のような小文字を付けます。
b bool
c char
r short
i int
g long
u unsigned
f float
d double
m マクロ
a 配列
p ポインタ
s 文字列
t 構造体
h ハンドル
例えば int型の配列であった場合
int iaKey[] といった名前になります。
134ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(20,562ポイント)
Date: 2009/03/07(土) 13:10
No:30208
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
なるほどこういう風に書けばいいのですか。
KEY関連には便利ですね。
22ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..初心者(6,490ポイント)
Date: 2009/03/07(土) 13:50
No:30210
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
隙間無く書かれたプログラムよりも、
DrawBox(PlayerX,PlayerY,PlayerX+32,PlayerY+30,BLUE,TRUE);
ある程度空間を入れることで個々の変数が識別しやすくなります。
DrawBox( PlayerX, PlayerY, PlayerX+32, PlayerY+30, BLUE, TRUE ) ;
コメントを行末ではなく上に移動させていますが、
これにも意味があります。
Sleep(1) ; // コメント
// コメント
Sleep(1) ;
編集するために頻繁にEndキー(行末移動)を使いますが
コメントが行末にあるとプログラム行末への移動の妨げになります。
編集する事が少ない場合や、行末にあった方がわかり易い場合は
そうしますが、それ以外は上のほうが良いでしょう。
ループ処理等を使う場合はインデントを入れて
どの部分がループされるのか処理されるのか分かり易くします。
for( i=0; i<4; i++ )
// for文で繰り返される段落
if( PlayerX == deguchiX[i] && PlayerY == deguchiY[i] )
{
// if文で処理される段落
}
※この出口判定部分の deguchiX[i] が deguchiX[1]になっていたので
修正して下さいm(_ _)m
376ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(20,544ポイント)
Date: 2009/03/08(日) 10:26
No:30260
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
Dixqさん最終的に最後にアップしたのじゃ、だめですかね?
18ポイント を落としてしまった。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,006,237ポイント)
Date: 2009/03/08(日) 20:02
No:30284
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
またまた私がこんなことをいえる立場では無いですが、掲載するからには、人の手本となるものとなると思います。
言い換えれば人に教える立場だと言うことですよね。
ですから間違いがあると、間違いまで人に一緒に教えてしまうことになりますし、
改善点の指摘が出ているならそれを直すべきだと思います。
とりあえず指摘が出たところは一通り直すようにしてみてはどうでしょうか。
111ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,008,490ポイント)
Date: 2009/03/09(月) 22:22
No:30358
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
>とりあえず指摘が出たところは一通り直すようにしてみてはどうでしょうか。
ということで、とりあえず指摘の出たところは最低限直すようにしてみてはいかがでしょうか。
指摘が出るということは、ひよこさんのコードを参考に誰かがコードを書いたとき、
その人も同じ指摘を受けてしまうことになりますので・・。
109ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(20,861ポイント)
Date: 2009/03/10(火) 11:47
No:30370
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
一通り直そうとしたらDixqさんの
static int count=0;
if( Key[ KEY_INPUT_LEFT]==1 || ( Key[ KEY_INPUT_LEFT]>10) && count%2) x-=32;
if( Key[ KEY_INPUT_RIGHT]==1|| ( Key[ KEY_INPUT_RIGHT]>10) && count%2) x+=32;
if( Key[ KEY_INPUT_UP]==1 || ( Key[ KEY_INPUT_UP]>10) && count%2) y-=30;
if( Key[ KEY_INPUT_DOWN]==1 || ( Key[ KEY_INPUT_DOWN]>10) && count%2) y+=30;
count++;
のcountはどういう意味なのですか?
142ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,009,649ポイント)
Date: 2009/03/12(木) 08:33
No:30492
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
まず、どういう意味なのかな?と思ったら聞く前に意味を理解してみようとしてみて下さい。
「何か解らないな」>「聞く」
より
「何か解らないな」>「調べる、考える、試行錯誤してみる」
の方が上達が早いです。
なお、今回の場合は、countの意味が解らないなら、一度count無しで実行してみたり、
「%2」とかいてあるなら、2回に1回処理するわけですから、「%3==0」にして3回に1回処理するようにしたら
どう変化するかなどを見て、何の為にあるのか調べてみて下さい。
なお、条件式は0か0以外かで真か偽かが決まるので
count%3
これは2/3実行され、
count%3==0
これは1/3実行されます。
さて、どういう意味かお解かりになったでしょうか?
※
トピック名が「Dixqさんへ質問」よりこちらの題名の方がふさわしいと思いましたので変更しておきました。
283ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(21,059ポイント)
Date: 2009/03/12(木) 18:48
No:30536
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
やっぱり試行錯誤ですか。
サンプルになれるようがんばります。
ソースは添付しておきました。
44ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(71,845ポイント)
Date: 2009/03/16(月) 19:59
No:30855
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
技術的・・・^^;
「C言語 分割ファイル」
っとググればたくさんの解説ページが出てきますが・・・。
今後のゲーム開発でよほど小規模でない限り、
ひとつのファイルにすべてを記述することは現実的ではないと思います。
ここで知識を身につけてみてはいかがでしょうか?
っと余計な事を言わせてもらいました。
152ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..ぴよぴよ(250ポイント)
Date: 2009/03/16(月) 20:06
No:30856
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
スコアを10000-scoreとして表示していますが、最初の値をscore=10000としておき、
そこから数値を減らしていく方が良いのではないでしょうか。
そうすれば、114, 134行目の処理がその上のコメントと一致するようになります。
表示する際には、DrawFormatString( 400,400, White, "スコア%d",score ) ; となり、見た目にも分かりやすいと思います。
(同様のことがdeguchicounterにも言えます)
2倍のポイントを手に入れた! 202ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(22,816ポイント)
Date: 2009/03/16(月) 21:16
No:30866
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
kazuoniさん>>
分割って調べました。
externを使ってソースを見やすくって意味でしょうか?
35ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(71,897ポイント)
Date: 2009/03/17(火) 00:38
No:30877
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
externももちろん必要ですが、
分割ファイルにすれば、いろいろな管理がしやすくなります。
VC++ 2008 EEならば関数・変数はすぐに検索できたり、
関数においては一覧とかも出てきますが、
.cppごとに役割があるともっと管理がしやすいかと。
例えば
main.cpp→ゲームの流れを制御する関数の集合
draw.cpp→描写専用の関数の集合
calc.cpp→ゲーム内のあらゆる計算をする関数の集合
なんて感じです。
52ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(22,895ポイント)
Date: 2009/03/17(火) 06:32
No:30879
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
extern int とextern void の違いは何ですか?
18ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(16,498ポイント)
Date: 2009/03/17(火) 09:35
No:30881
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
おそらく、
extern int i;
extern void func2();
などを指していると思いますが、「extern」+「int i」のように考えると分かりやすいです。
つまり、externで外部へ参照している変数の型、関数の戻り値の型が違うだけです。
58ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(22,932ポイント)
Date: 2009/03/17(火) 21:43
No:30930
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
つまりextern int 変数 extern void 関数と考えればよろしいのでしょうか?
37ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(72,699ポイント)
Date: 2009/03/17(火) 21:51
No:30933
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
そう言われればそうなんですが^^;
例えば
コードにいきなり
void Function();
なんて書かれたらコンパイラは何のことか分かりません。
でも
extern void Function();
と書けば、もし関数定義がなされる前にFunction()が出てきても、
「あ、Functionは戻り値voidの関数なんだったんだよな」
っと解釈してくれます。
なのでコンパイルエラーにはなりません。
これは分割ファイルをするにあたって必要です。
212ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..ぴよぴよ(265ポイント)
Date: 2009/03/17(火) 22:06
No:30936
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
もしかして、変数はすべてextern int、関数はすべてextern voidとすると思っておられるのでしょうか。
そうではなく、例えば、
//a.cpp
int a;
float b;
int func() {}
void func2() {}
としていた場合、これを参照するためには、
//b.cpp
extern int a;
extern float b;
extern int func();
extern void func2();
としなければいけません。
これがSCIさんが仰ったことだと思います。
133ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(16,907ポイント)
Date: 2009/03/17(火) 22:18
No:30939
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
なんか分かりにくくてすみません(笑)
fatensさんの通りです。
35ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(22,959ポイント)
Date: 2009/03/17(火) 22:29
No:30941
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
では型+変数(関数)にexternを型の前につければよろしいのですか?
27ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(23,043ポイント)
Date: 2009/03/18(水) 15:55
No:31007
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
一応分割にしてみましたが、なぜか最初の文字がでなくて上の時間と敵も表示されないのですが、
どこが原因でしょうか?
Zipにはソースしか入っておりませんので以前のファイルを使ってください。
84ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..ぴよぴよ(661ポイント)
Date: 2009/03/18(水) 17:25
No:31011
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
文字は表示されていますが、初期化する関数が呼ばれていないので、黒で書かれています。
そのため表示されないように見えますが、移動してみれば分かります。
また、画像をロードする処理も行われていないようです。
86ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(23,764ポイント)
Date: 2009/03/18(水) 18:17
No:31015
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
fatensさん>>ありがとうございます。なおしてみたら文字も絵も出るようになりました。
Dixqさん>>かなりソースも変わりました。これでよろしいのでしたら新しくUPします。
下に修正したものをおいておきます。
#include "DxLib.h"
#include "GlobalVariable.h"
extern void Draw();
extern void img_sound_load();
extern void KEY();
extern void Set_Shoki();
extern void stage();
extern void stage2();
extern void STAGE_TEKI();
extern void TEKI_HANTEI();
void Opening()
{
//大きい文字にする。
SetFontSize( 64 ) ;
DrawString(100,100,"脱出ゲーム",White);
DrawString(100,200,"Z ハード",White);
if(Key[KEY_INPUT_Z]==1)
{
SetFontSize( 20 ) ;function_status=1;
}
}
void Danjon()
{
stage();
stage2();
Draw();
KEY();
STAGE_TEKI();
if(deguchicounter==100){function_status=2;}
}
void Ending()
{
int End=LoadGraph( "ENDINGU" ) ;
DrawGraph( 0 , 0 , End , TRUE ) ;
DrawFormatString( 400, 350, White, "%d秒でした", timer/100 );
DrawFormatString( 400,400, White, "スコア%d",10000-score ) ;
DrawString(0,350,"Zを押してね",White);
if(Key[KEY_INPUT_Z]==1)
function_status=3;
}
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。
Set_Shoki();
img_sound_load();
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
switch(function_status)
{
case 0:
Opening();
break;
case 1:
Danjon();
break;
case 2:
Ending();
break;
default:
DxLib_End() ;
return 0;
break;
}
ScreenFlip() ;
}
DxLib_End() ;
return 0 ;
}
721ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(23,827ポイント)
Date: 2009/03/18(水) 18:40
No:31017
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
Dixqさんにプログラムの字下げ、改行の修正して下さるなんて光栄です。
サンプルになったら私もそのサンプルを参考にさせて頂きたいと思います。
63ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..上級者(23,840ポイント)
Date: 2009/03/18(水) 21:25
No:31020
|
|
Title: Re:「雑談トピ」Dixqさんへ質問
|
|
Dixqさんへ>>
もしサンプルできてアップロードできたら一言ほしいです。(掲示板に完成の報告?)
みたいなものを入れてほしいです。
13ポイント を手に入れた。
|
|
|
|
|