C言語何でも質問掲示板

Total hit  今日  昨日  



必ずお読み下さい → 規約と注意事項  アンケートはこちら  エラーで投稿できない方はこちら  過去ログ検索はこちら

 
   画像をサイクルで描画   
     ・[40616] nayo 
     ・[40617] yant 
     ・[40619] ねこ 
     ・[40623] yant 
     ・[40625] ねこ 
     ・[40629] トゥル太郎 
   ヘッダファイルについ ....   
     ・[40618] ねこ 
     ・[40622] uwlover 
     ・[40627] uwlover 
   構造体について   
     ・[40522] GPGA 
     ・[40527] box 
     ・[40528] Naohiro19 
     ・[40561] たかぎ 
     ・[40613] 紅葉 
   windowsプログラミング ....   
     ・[40608] dic 
     ・[40609] 寺 
     ・[40610] Justy 
     ・[40611] 寺 
   DrawRotaGraphFで座標 ....   
     ・[40594] Mist 
     ・[40597] windows  
     ・[40606] lbfuvab 
   fpsについて   
     ・[40529] softya 
     ・[40568] TKOZ 
     ・[40569] toyo 
     ・[40574] EXTRL 
     ・[40575] softya 
     ・[40579] EXTRL 
     ・[40581] MNS 
     ・[40586] softya 
     ・[40587] EXTRL 
     ・[40588] Justy 
     ・[40605] EXTRL 
   ポインタを使った文字 ....   
     ・[40590] softya 
     ・[40595] トオリスガリ 
   剰余計算の高速化   
     ・[40560] toyo 
     ・[40562] たかぎ 
     ・[40592] ft 
   初心者です。4方向に ....   
     ・[40311] softya 
     ・[40317] kazuoni 
     ・[40320] R 
     ・[40321] R 
     ・[40323] softya 
     ・[40325] R 
     ・[40327] softya 
     ・[40328] kazuoni 
     ・[40329] R 
     ・[40335] softya 
     ・[40342] R 
     ・[40345] softya 
     ・[40349] R 
     ・[40367] softya 
     ・[40377] R 
     ・[40381] softya 
     ・[40383] R 
     ・[40391] softya 
     ・[40393] kazuoni 
     ・[40396] softya 
     ・[40398] 瓜 
     ・[40403] すずめ 
     ・[40404] softya 
     ・[40405] softya 
     ・[40406] すずめ 
     ・[40409] conio 
     ・[40411] R 
     ・[40417] すずめ 
     ・[40420] 瓜 
     ・[40421] 瓜 
     ・[40425] softya 
     ・[40475] R 
     ・[40491] すずめ 
     ・[40493] softya 
     ・[40494] kazuoni 
     ・[40499] ねこ 
     ・[40500] 瓜 
     ・[40512] すずめ 
     ・[40591] ドラ 
   文字列データの作成依 ....   
     ・[40533] softya 
     ・[40537] ☆ 
     ・[40538] box 
     ・[40539] たかぎ 
     ・[40583] バグ 
     ・[40589] dic 
   またまた質問です。   
     ・[40543] 御津凪 
     ・[40544] sweden 
     ・[40546] 御津凪 
     ・[40548] sweden 
     ・[40549] 御津凪 
     ・[40550] sweden 
     ・[40551] 御津凪 
     ・[40552] sweden 
     ・[40553] 御津凪 
     ・[40554] sweden 
     ・[40556] sweden 
     ・[40559] toyo 
     ・[40572] sweden 
     ・[40577] 御津凪 
     ・[40580] sweden 
     ・[40582] MNS 
     ・[40584] sweden 
   クラスのプロトタイプ ....   
     ・[40005] ねこ 
     ・[40006] Justy 
     ・[40021] チルチル 
     ・[40026] Justy 
     ・[40027] チルチル 
     ・[40030] Justy 
     ・[40033] チルチル 
     ・[40034] 組木紙織 
     ・[40036] チルチル 
     ・[40037] Justy 
     ・[40039] Justy 
     ・[40040] たいちう 
     ・[40055] チルチル 
     ・[40056] ねこ 
     ・[40057] チルチル 
     ・[40058] バグ 
     ・[40059] チルチル 
     ・[40062] ねこ 
     ・[40066] チルチル 
     ・[40071] ねこ 
     ・[40078] チルチル 
     ・[40080] バグ 
     ・[40086] ねこ 
     ・[40088] チルチル 
     ・[40089] チルチル 
     ・[40090] ねこ 
     ・[40102] たいちう 
     ・[40109] チルチル 
     ・[40110] MNS 
     ・[40111] チルチル 
     ・[40132] 組木紙織 
     ・[40153] たいちう 
     ・[40156] チルチル 
     ・[40157] conio 
     ・[40160] チルチル 
     ・[40163] conio 
     ・[40164] チルチル 
     ・[40165] MNS 
     ・[40166] たいちう 
     ・[40167] チルチル 
     ・[40168] conio 
     ・[40169] チルチル 
     ・[40171] skyblue 
     ・[40173] チルチル 
     ・[40175] conio 
     ・[40177] skyblue 
     ・[40182] ねこ 
     ・[40184] チルチル 
     ・[40188] たいちう 
     ・[40198] Mikan 
     ・[40206] チルチル 
     ・[40207] GPGA 
     ・[40210] MNS 
     ・[40215] チルチル 
     ・[40223] conio 
     ・[40244] チルチル 
     ・[40256] MNS 
     ・[40265] GPGA 
     ・[40290] チルチル 
     ・[40291] kazuoni 
     ・[40315] チルチル 
     ・[40316] バグ 
     ・[40319] チルチル 
     ・[40357] チルチル 
     ・[40362] kazuoni 
     ・[40369] チルチル 
     ・[40380] MNS 
     ・[40386] チルチル 
     ・[40387] GPGA 
     ・[40388] MNS 
     ・[40390] GPGA 
     ・[40394] チルチル 
     ・[40440] チルチル 
     ・[40479] チルチル 
     ・[40514] チルチル 
     ・[40515] conio 
     ・[40540] チルチル 
     ・[40542] 御津凪 
     ・[40545] たいちう 
     ・[40547] 御津凪 
     ・[40578] チルチル 
   質問です。   
     ・[40532] softya 
     ・[40564] TKOZ 
   東方星蓮船のような雪 ....   
     ・[40503] Justy 
     ・[40511] 鈴仙優曇華院イナバ 
     ・[40555] こまいぬ 
   ヒープソート   
     ・[40536] box 
     ・[405351256096529] 男子 
   課題について   
   typedefについて   
     ・[40521] GPGA 
   if   
     ・[40501] 瓜 
     ・[40504] Justy 
     ・[40505] けん 
     ・[40506] Justy 
     ・[40507] けん 
     ・[40508] Justy 
     ・[40509] けん 
   自機が死亡したとき、 ....   
     ・[40498] Justy 
   何故 0 で割ると計算出 ....   
     ・[40379] バグ 
     ・[40382] softya 
     ・[40444] イーグル 
     ・[40447] softya 
     ・[40448] 1 
     ・[40452] たかぎ 
     ・[40456] sizuma 
     ・[40457] たかぎ 
     ・[40464] Dixq (管理人) 
     ・[40466] Dixq (管理人) 
     ・[40471] lbfuvab 
     ・[40489] ホワイト 
     ・[40492] parapara 
     ・[40495] たいちう 
      
     ・[40446] Mist 
     ・[40451] たかぎ 
     ・[40459] 瓜 
     ・[40462] Dixq (管理人) 
     ・[40490] イーグル 
   windowsのプログラムを ....   
     ・[40477] tkmakwins15 
     ・[40478] softya 
     ・[40482] dic 
     ・[40483] toyo 
     ・[40484] バグ 
     ・[40485] parapara 
     ・[40486] softya 
     ・[40487] バグ 
     ・[40488] toyo 
   ボス死亡エフェクトに ....   
     ・[40454] 烏 
     ・[40468] Dixq (管理人) 
     ・[40480] いけやん 
   マッチメイク   
     ・[40372] たいちう 
     ・[40415] C初心者 
     ・[40428] たいちう 
     ・[40434] C初心者 
     ・[40437] non 
     ・[40442] C初心者 
     ・[40453] non 
     ・[40461] zard 
     ・[40463] たいちう 
     ・[40474] C初心者 
     ・[40476] たいちう 

Name: yant  ..ぴよぴよ(109ポイント)   Date: 2009/10/18(日) 20:31   No:40614       
Title: 画像をサイクルで描画    
C言語初心者ですが

何枚かの画像を次々にぐるぐると描画したいのですが

簡単に言うと、
ここに画像が三枚あるとして

画像1→画像2→画像3→画像1→・・・・・

と、こんな感じに描画したいのですが
counter++などを使ってif分の最後にまたcounterを元に戻してやる方法が
今のところ思いつく手段ですがどうもうまくいきません。

なにか別の方法があるなら教えていただけないでしょうか?


109ポイント を手に入れた。


Name: nayo  ..中級者(13,887ポイント)   Date: 2009/10/18(日) 20:40   No:40616     
Title: Re:画像をサイクルで描画    
思ってらっしゃるものと違ったらすみませんが…
画像が3枚、counterの初期値を0とすれば

counter = ( counter + 1 ) % 3;

とすればcounterの値を0→1→2→0→…とすることができます


93ポイント を手に入れた。

Name: yant  ..ぴよぴよ(173ポイント)   Date: 2009/10/18(日) 21:06   No:40617     
Title: Re:画像をサイクルで描画    
ありがとうございます。
しかし 確かにサイクルされているようですが、
かなり早いのですが

テンポよく画像サイクルできないでしょうか?

たびたびすいません


64ポイント を手に入れた。

Name: ねこ  ..熟練のプログラマー(46,346ポイント)   Date: 2009/10/18(日) 21:12   No:40619     
Title: Re:画像をサイクルで描画    
int iFrame = 60;
counter = ( counter + 1 ) % ( iFrame * 3 ) );
int idx = counter / iFrame;

こうすると「iFrame」に設定したフレーム数ごとに1枚ごと切り替わります。
こうする場合counterの代わりに「idx」を「○枚目」として考えます。
例では60フレーム(60FPSなら1秒)毎に画像が切り替わります。


108ポイント を手に入れた。

Name: yant  ..ぴよぴよ(344ポイント)   Date: 2009/10/18(日) 21:46   No:40623     
Title: Re:画像をサイクルで描画    
int iFrame = 60;
counter =(counter+1)%(iFrame%3);
int idx = counter / iFrame;


if(idx==0){
DrawGraph(0,0,image[0],true);
}
if(idx==1){
DrawGraph(0,0,image[2],true);
}
if(idx==2){
DrawGraph(0,0,image[3],true);
}

こういうことでしょうか?
しかし エラーが出てしまいデバックが途中で止まってしまいます・・・


171ポイント を手に入れた。

Name: ねこ  ..熟練のプログラマー(46,728ポイント)   Date: 2009/10/18(日) 21:57   No:40625     
Title: Re:画像をサイクルで描画    
if分とかは不要で
DrawGraph(0,0,image[idx],true);
でいいです。image変数の定義がわかりませんが、もし「int image[3]」とか定義してたらそれは3個目のifでimage[3]ってアクセスしてるためです。配列オーバーです。


77ポイント を手に入れた。

Name: トゥル太郎  ..ぴよぴよ(135ポイント)   Date: 2009/10/18(日) 23:05   No:40629     
Title: Re:画像をサイクルで描画    
counter =(counter+1)%(iFrame%3);の部分が違うからです。
iFrame%3→iFrame*3です。
ねこ氏の仰るとおり
if文を使わず、idxで画像を指定してやればコードが短く書けます。


#include "DxLib.h"

int image[3],counter,iFrame,idx;

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;//初期化と裏画面化

image[0]=LoadGraph("0.png") ;
image[1]=LoadGraph("1.png") ;
image[2]=LoadGraph("2.png") ;
iFrame = 60;
counter = 0;
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){


counter =(counter+1)%(iFrame*3);
idx = counter / iFrame;

DrawGraph(0,0,image[idx],TRUE);


ScreenFlip();
}

DxLib_End();
return 0;
}



135ポイント を手に入れた。



Name: uwlover  ..入門者(4,063ポイント)   Date: 2009/10/18(日) 19:38   No:40612       
Title: ヘッダファイルについて    
こんばんは。
リソーススクリプトを作るのにも四苦八苦しているのですが、ヘッダファイルでも困ったことになってます。
というのは、メニューのIDをヘッダファイルで次のように定義したのですが、
#define ID_FILE 0
#define ID_EXIT 1
これがソースファイルで反映されないのです。

case WM_COMMAND:
switch(LOWORD(wp)){
case ID_EXIT:
SendMessage(hWnd,WM_CLOSE,0,0);
break;

default:
break;
}

ここで、ID_EXITを1と書き換えれば問題なくいくのですが、ID_EXITのままだと定義されてない識別子とエラーを返されます。ヘッダファイルをインクルードしてもそんなファイルは開けない(英語ではそんなものはないと言われてます)とのことです。
どうすればいいんでしょうか?そもそもヘッダファイルについての知識が皆無なのでしょうね…


258ポイント を手に入れた。


Name: ねこ  ..熟練のプログラマー(46,238ポイント)   Date: 2009/10/18(日) 21:08   No:40618     
Title: Re:ヘッダファイルについて    
こういう場合は出来ればinclude文も記載して欲しいです。

cppファイルとヘッダファイルを考慮した相対パスになっていますか?
例えばcppファイルが「source」というフォルダにあり、ヘッダファイルがプロジェクトと同じ階層にあれば
include "..\\Header.h"
となります。

単純なパスの記述ミスだと思うので、上記のあたりを確認してみてください。


175ポイント を手に入れた。

Name: uwlover  ..入門者(3,746ポイント)   Date: 2009/10/18(日) 21:36   No:40622     
Title: Re:ヘッダファイルについて    
すいません、知っておくべきことをあまりにも知らなさすぎるようです。パスは意味だけは知ってますが、
それをプログラム上に記述することが分かりません…そもそもファイルを分割したときにどうやって各ファイルを関連付けるのかもちゃんと理解していないみたいです。
ファイルの扱いやパスについて詳しく書いてあるサイトでもっと勉強してきます。この話は単にプログラムをここに出せばいいってものではなさそうですし。
一応ですが、cppファイルもヘッダファイルも、GameCreationというフォルダのbenkyouというフォルダにあります。ファイル名はどっちもbenkyou(拡張子が違うだけ)です。includeの<>の中にパスを入れるということ自体知らなかったので、#include<benkyou.h>という風にやってました。ファイル名とパスが同じでややこしいですが、この<>の中のbenkyouはファイル名しか意識してません。あと、<>のときと""のときの違いも分からないという…改めて重症というか、まだ手を出すべきじゃなかったですね


317ポイント を落としてしまった。

Name: uwlover  ..入門者(3,752ポイント)   Date: 2009/10/18(日) 22:06   No:40627 解決!     
Title: Re:ヘッダファイルについて    
追記。自己解決しました。

6ポイント を手に入れた。



Name: つる  ..ぴよぴよ(573ポイント)   Date: 2009/10/16(金) 18:40   No:40520       
Title: 構造体について    
こんばんは。
C言語は初心者で、参考書を見ながら勉強中です。WindowsのVistaを使っています。コンパイラはBorland C++です。

参考書を見ていたら、構造体について分からなかったので質問します。

<pre>

/* マクロによって構造体に名前を与える(エラー) */

#define complex struct {double re, im; }

void main()
{
complex a, b;
comples x, y;

a = b; // 正しい
x = b;    // 正しくない
}

 このcomplexはstruct {double re, im; }に置換されますよね。そうすると、
 complex a, b;
complex x, y;
は、
 struct {double re, im;}a, b;
struct {double re, im;}x, y;
 となりますよね。そこで、a = bは代入できて、x = bは代入できません。

 参考書では、データの構造が同じであれば、同一の型とみなす<構造等価性>ではなく、型に与えられた名前が
同じでなければ、同一の型とみなされない<名称等価性>とありました。なんとなく理解はできました。
構造体の型名は<struct 構造体タグ名>ですよね。つまり、構造体のタグ名が必要なのですか?
そしたら、
#define complex struct test{double re, im;} ←testはタグ名
とやってみたのですが、エラーでした。
これはどうしてできないのですか?

お願いします。


340ポイント を手に入れた。


Name: GPGA  ..比類無きプログラマー(71,133ポイント)   Date: 2009/10/16(金) 18:52   No:40522     
Title: Re:構造体について    
構造体testを2回定義しているからです。

2倍のポイントを手に入れた! 28ポイント を手に入れた。

Name: box  ..ハッカー(144,319ポイント)   Date: 2009/10/16(金) 21:58   No:40527     
Title: Re:構造体について    
そもそも#defineの使い道が正しくありません。
typedefを使いましょう。


32ポイント を落としてしまった。

Name: Naohiro19  ..ぴよぴよ(314ポイント)   Date: 2009/10/16(金) 22:03   No:40528     
Title: Re:構造体について    

error C2679: 二項演算子 '=' : 型 '' の右オペランドを扱う演算子が見つかりません (または変換できません)。


58ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(112,898ポイント)   Date: 2009/10/17(土) 08:09   No:40561     
Title: Re:構造体について    
タグ名のない構造体や共用体は、定義を行うたびに異なる型とみなされます。


24ポイント を手に入れた。

Name: 紅葉  ..中級者(11,598ポイント)   Date: 2009/10/18(日) 19:48   No:40613     
Title: Re:構造体について    
構造体について
構造体は似たような変数を各個体ごとに持ちたい場合に使います。
たとえばシューティングゲームで自機と敵機の2つのデータを持たなければいけない場合があります。
普通にやると
float play_px,play_py; // 自機の座標
float enm_px,enm_py; // 敵機の座標
これだと両方でx,yを用意してますよね?
これを


typedef struct{
 float x,y;
}CHR;
CHR Play;
CHR Enm;


と宣言してあげるだけでまとめて変数を用意することができます。
上記だとPlay.x等と書いて変数の値を変更できます。

#defineは定義文と言い、値が変わったら変更が大変な場合に使います。
#define TEST 16
これはこのソースでTESTとかくと16を意味します。
int test = TEST; //test=16
となります。

急いで書いたので文脈がおかしかったら申し訳ないです。


228ポイント を手に入れた。



Name:  ..かけだし(2,282ポイント)   Date: 2009/10/18(日) 14:09   No:40604       
Title: windowsプログラミングとDxLibの併用について…    
2か月ぶりの投稿です。以前お世話になったかた、ありがとうございます。

この2か月間はSAIやphotoshopをいじっていたんでプログラミングは全くと言っていいほどやっておりません。
ので、変な記述をするかもしれませんが、よろしくお願いします。

お聞きしたいのは、windowsのプログラミングとDxLibライブラリを併用できるのかどうかです。

DxLibライブラリは関数を使用するだけでそれなりの処理ができるので重宝しておりますが、どうしても一部の処理をwindowsのプログラミングに任せたいと思っています。(記載者はwindowsのプログラムの知識が全くありません。これから勉強する予定です。)

例をあげるとウィンドウの生成に関して。

DxLibではDxLib_Initという関数がDxLibを初期化すると同時にウィンドウ(フルスクリーンで)を生成しています。

ですが、windowsのプログラムによって生成したウィンドウ上にDxLibライブラリを使うことはできないのか、と最近考えています。

はたしてこのような処理はできるのか。できるのであればwindowsの知識がないのでアルゴリズム的なものを提示してくれたらうれしいです。

変な質問ででしたらごめんなさい。

かなりプログラミングの知識は病み上がりなもので…

それとwindowsのプログラミングの学習に関して有効な書籍あるいはサイトがあれば教えてくださるとうれしいです。

ただ、まだCの知識すら習いたてで機能すべてを網羅していないので、こちらからさきに学習しなければなりませんが…


2倍のポイントを手に入れた! 674ポイント を手に入れた。


Name: dic  ..プログラマー(35,921ポイント)   Date: 2009/10/18(日) 16:53   No:40608     
Title: Re:windowsプログラミングとDxLibの併用について…    
>windowsのプログラムによって生成したウィンドウ上にDxLibライブラリを使うことはできないのか
可能ですが、DxLibのソースコードを改造もしくは借りる必要があるので
それができるかどうかですね

>windowsのプログラムによって生成したウィンドウ
とありますが、windowsのプログラムだからといって必ずウィンドウが出現する必要もない場合もあります
具体的に言うと CreateWindow(Ex) 巻数を呼び出さない限りウィンドウは生成されません
そして、ShowWindow関数で、デスクトップ画面にウィンドウを表示することを命令します

平たく言うとウィンドウをもたないwindowsプログラムもあるってことです


2倍のポイントを手に入れた! 356ポイント を手に入れた。

Name:  ..入門者(2,532ポイント)   Date: 2009/10/18(日) 17:11   No:40609     
Title: Re:windowsプログラミングとDxLibの併用について…    
ご回答ありがとうございます。

DxLibライブラリを使用した場合、ウィンドウ生成後DxLib初期化のため、ウィンドウ内真っ暗でウィンドウの移動もカタコテなので、どうにかしたいと考えました。

そこでDxLibライブラリを使用しない場合に.bmp等画像ファイルを表示するプログラムをサイトや書籍から借りてきて実行してみると、

すばやく画像を描写してくれます。

そこで、DxLib読み込み中にどうにかして、このような処理ができないか…と考えていたのですが、よくわからず、このような質問をしました。

無知でごめんなさい。


250ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(444,771ポイント)   Date: 2009/10/18(日) 17:42   No:40610     
Title: Re:windowsプログラミングとDxLibの併用について…    

>windowsのプログラムによって生成したウィンドウ上にDxLibライブラリを使うことはできないのか

 一応可能です。
 SetUserWindow(HWND)という関数がありますので、
DxLib_Init()より前にウインドウを生成し、この関数に引き渡してください。



>ウィンドウ生成後DxLib初期化のため、ウィンドウ内真っ暗で
>ウィンドウの移動もカタコテなので、どうにかしたいと考えました

 DxLib_Init()による一時的な硬直のことですか?
 
 うーん、DXライブラリを使う場合はどうしてもこの関数を呼ばなければならないので、
(あの手この手を尽くせばできるのかもしれませんが)現状避けらないと思います。

 ただ、誤魔化すことはできます。
 例えば、

    ChangeWindowMode(TRUE);
    SetWindowSize(0, 0);
    DxLib_Init();
    SetWindowSize(640, 480);
    SetDrawScreen(DX_SCREEN_BACK);

とすれば、最初にウインドウサイズを小さくしておいて、
初期化が終わった後にサイズを元に戻し、即座に表示を行えば
見かけ上ウインドウが現れたと同時に表示されます。


359ポイント を手に入れた。

Name:  ..入門者(2,618ポイント)   Date: 2009/10/18(日) 17:56   No:40611 解決!     
Title: Re:windowsプログラミングとDxLibの併用について…    
ご回答ありがとうございます。


回答をもとにチャレンジしてみたいと思います。


途中からトピックと質問内容が変わってしまったので、一度チャレンジしてなかなかうまくいかなければ再度質問したいと思います。


ご回答してくださった方、ありがとうございます。


86ポイント を手に入れた。



Name: windows  ..ぴよぴよ(172ポイント)   Date: 2009/10/18(日) 01:45   No:40593       
Title: DrawRotaGraphFで座標がfloat変換されてないエラーが    
画像の移動を細かくするべく
座標でfloat型の使えるDrawRotaGraphFを使ったのですが

DrawRotaGraphF(0,count*1.5%7,1.0f,0.0f,img,TRUE);
count++;

の指定をすると
error C2296: '%' : 無効です。左オペランドには型 'float' が指定されています。
というエラーが出てしまいます。

count は しっかりfloat型で宣言しています。
このエラーを消したいのですが
本家リファレンスには載っておらず困っております…。
どなたか教えて頂けないでしょうか…。


162ポイント を手に入れた。


Name: Mist  ..熟練のプログラマー(69,006ポイント)   Date: 2009/10/18(日) 02:03   No:40594     
Title: Re:DrawRotaGraphFで座標がfloat変換されてないエラーが    
%は余りを求める演算子で整数型にしか使えません。
実数型で余りを求める場合はfmodを使いましょう


51ポイント を手に入れた。

Name: windows  ..ぴよぴよ(29ポイント)   Date: 2009/10/18(日) 09:03   No:40597 解決!     
Title: Re:DrawRotaGraphFで座標がfloat変換されてないエラーが    
ありがとうございます!
おかげで描画することができました!


29ポイント を手に入れた。

Name: lbfuvab  ..上級者(22,958ポイント)   Date: 2009/10/18(日) 16:35   No:40606     
Title: Re:DrawRotaGraphFで座標がfloat変換されてないエラーが    
DrawRotaGraphF(0, (count*3%14)/2.0 ,1.0f,0.0f,img,TRUE);
count++;

こういう手もありかと思いますが・・・


59ポイント を手に入れた。



Name: EXTRL  ..かけだし(1,807ポイント)   Date: 2009/10/16(金) 19:29   No:40524       
Title: fpsについて    
ゲームプログラミングの館のs7節の「fpsを表示する。」の
サンプルプログラム(コピペ用)をエディタ(?)に丸写しして
実行すると、表示されるfpsが30前後(単位「fps」付き)になります。
しかも、館に載っている実行結果は一行ですが、
自分の実行画面は、その下に30ms前後の数字(単位付き)が表示されます。
これは自分のPC設定がおかしいんでしょうか? それともこんなもんなんでしょうか。
OS(?)はWindowsVistaです。 コンパイラはBorland+BCC Developerです。
返答お願いします。 不足があれば付け足します



128ポイント を手に入れた。


Name: softya  ..上級者(18,848ポイント)   Date: 2009/10/16(金) 22:19   No:40529     
Title: Re:fpsについて    
60fpsの設定で30fps前後なら、CPUとGPUの問題かも知れません。
どのようなパソコンをお使いでしょうか?

>しかも、館に載っている実行結果は一行ですが、
確かに画面は一行ですが、ソースコードを見る限りは2行ですよね。
こう書いてあるので
DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);
DrawFormatString(0,20,GetColor(255,255,255),"%dms" ,ave)
これだと2行出ないとおかしいです。


38ポイント を手に入れた。

Name: TKOZ  ..プログラマー(34,165ポイント)   Date: 2009/10/17(土) 12:13   No:40568     
Title: Re:fpsについて    
EXTRLさんへ

ディスプレイのリフレッシュレートが関係しているかもしれません。
ディスプレイのリフレッシュレートは、60Hzですか?

他のゲームでも、30FPS程度しか出ませんか?

このソースをビルドして実行してください。

スペースキーでScreenFlip()を実行する/しないを変更できます。


ScreenFlip()を実行しない状態でFPSが
どれくらい出るのか試してみてください。


#include"DxLib.h"

int FPScount=0;
int FPSLimitFlag=0;

void LimitOnOff()
{
static int prekey;

if(!prekey && CheckHitKey(KEY_INPUT_SPACE))
{
FPSLimitFlag^=1;
}

prekey=CheckHitKey(KEY_INPUT_SPACE);
}

bool SetFPS(int SleepTime)
{
static long int PreTime=0;

if( (PreTime + SleepTime<=GetTickCount()))
return false;
else
{
do{

}while(GetTickCount() < (PreTime + SleepTime));
return true;
}

PreTime = GetTickCount();
}

void ShowFPS()
{
static long int time=GetTickCount();
static int FPS=0;
if(GetTickCount()-time>1000)
{
time=GetTickCount();
FPS=FPScount;
FPScount=0;
}
//printf("FPS=%d\n",FPS);
DrawBox( 0 , 0 , 60 , 20 ,
GetColor(255,0,0) , TRUE ) ;
DrawFormatString( 0 , 0 , GetColor(255,255,255) ,
"FPS=%d" , FPS ) ;
char str[100];
sprintf(str,"TestFPS:fps=%d",FPS);
SetMainWindowText(str);
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE );

SetGraphMode(640,480,32);
SetMainWindowText("TestFPS");

//データ読み込み中と表示する
DrawString( 0 , 0 , "データ読み込み中" , GetColor(255,255,255) );

//乱数の初期化
srand(GetTickCount());
if(DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );

while(ProcessMessage()==0 && ClearDrawScreen()==0){

FPScount++;
ShowFPS();

SetFPS(1000/60);

LimitOnOff();

if(FPSLimitFlag==1)
ScreenFlip();
}
DxLib_End();
return 0;
}


597ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(42,404ポイント)   Date: 2009/10/17(土) 12:22   No:40569     
Title: Re:fpsについて    
DxLib_Init()の前に
SetWaitVSyncFlag( FALSE );
を入れたらいいかも


26ポイント を手に入れた。

Name: EXTRL  ..かけだし(1,984ポイント)   Date: 2009/10/17(土) 14:12   No:40574     
Title: Re:fpsについて    
>softyaさん
どのようなパソコンと言われてもあまりよく分かりません;
リフレッシュレートは、ググった所、使ってるPCは液晶なので多分変更は出来ないと思います。
ただ、使ってるPCはデスクトップで、買ってから1年ちょっとぐらいです。
メモリ(?)は、ローカルディスクCはもともと50GBありますが、残りの容量は700MB切ってます。
Dの方は150GB以上あります。


>TKOZさん
実行したところ、大体250〜300あたりを行ったり来たりしてます。
スペースで表示したとたんに30あたりになります。
このことから多分PC自体のリフレッシュレートは60以上あると思います。

>toyoさん
やってみましたが、実行結果は変わりませんでした。


177ポイント を手に入れた。

Name: softya  ..上級者(19,927ポイント)   Date: 2009/10/17(土) 14:37   No:40575     
Title: Re:fpsについて    
結果を見る限り描画が遅いのは間違いなさそうです。
となるとGPU(描画機能)が貧弱なのかもしれません。
それにしても遅い気がするのですが・・・。

パソコンのメーカー名と型番を教えてください。
それで分かります。

>メモリ(?)は、ローカルディスクCはもともと50GBありますが、残りの容量は700MB切ってます。
それは、HDD(ハードディスク)容量ですね。
メモリ容量やCPUは別の項目です。
コントロールパネルのシステムとメンテナンスを選んで、RAMの量とプロセッサ速度の表示を選んでください。これでRAM容量等を知る事ができます。
表示される項目のうち、
評価:
プロセッサ:
メモリ(RAM):
の項目を書き出してください。

ちなみに私のノートパソコン(DELL)だと
評価:2.9
プロセッサ:AMD Turion(tm) 64X2 Modile Tecnology TL-50 1.60GHz
メモリ(RAM):2.00GB
と表示されます。


311ポイント を手に入れた。

Name: EXTRL  ..かけだし(2,099ポイント)   Date: 2009/10/17(土) 16:44   No:40579     
Title: Re:fpsについて    
ひとつ言っておきます。
俺は致命的にそういうの分からん! すまん

とりあえず分かるもの全て挙げます
○は単なる区切り

WindowsVista(tm) Home Premium○Intel Celeron D insade○LX60W
FUJITHU(これがメーカー?)
評価:3.3
プロセッサ:Intel(R) celeron(R) D CPU 3.06GHz 3.06GHz
メモリ(RAM):1010MB





115ポイント を手に入れた。

Name: MNS  ..上級者(20,349ポイント)   Date: 2009/10/17(土) 17:10   No:40581     
Title: Re:fpsについて    
http://kakaku.com/spec/00100419129/

これのようですね。
スペック的には大丈夫だとは思うんですが・・・


37ポイント を手に入れた。

Name: softya  ..上級者(20,353ポイント)   Date: 2009/10/17(土) 17:59   No:40586     
Title: Re:fpsについて    
私のノートだと67fps程度ですので、表示が30fpsなのは遅いですね。スペースを押さないと570fpsあたりです。私のノートよりも評価値が高いので、下回るのは考えられない事態ですね。
心配な点があるのは、メモリ(RAM):1010MB とメモリが極端に少ないことです。それ以外はCPUはCeleronとは言え3.06MHzですので問題ないでしょう。グラフィックボード(GPU)も非力なのは確かですが、私のノートの性能を下回るはずが無いんですが。
ってことで出来る事。
1.ビデオカードのドライバを最新にする。
2.一緒に動いているプログラムを出来るだけ停止する。
特に1.は効果があると思います。

ちなみに、お使いのPCのスペックは
http://www.fmworld.net/product/hard/pcpm0704/deskpower/lx/size/index.html
を見る限り、デスクトップ風のノートパソコンって感じですからグラフィックボードの交換も出来ないと思われますので、今あるハードのままで何とかするしかなさそうです。


426ポイント を手に入れた。

Name: EXTRL  ..かけだし(2,190ポイント)   Date: 2009/10/17(土) 18:59   No:40587     
Title: Re:fpsについて    
解決策ありがとうございます
ただ、今使ってるPCは自分用ではなく親の仕事用なので、
さすがにそこまで大規模(?)な事は怖くてできないです。
30fpsでもゲームを作れないことはないと思うので、がんばってみます。
もし、バカみたいな処理落ちがするようであれば
コッソリやってみようかなと思います。

言い忘れてたんですが、他からダウンロードしたゲームはちゃんと60fpsに
なってたみたいです。(ファイル(?)はリリースでした。)遅くなってすいません。
これはどうなんでしょうか


91ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(443,560ポイント)   Date: 2009/10/17(土) 19:36   No:40588     
Title: Re:fpsについて    

>他からダウンロードしたゲームはちゃんと60fpsになってたみたいです。

 使っているライブラリのバージョンという可能性がありますね。
 
 DXライブラリですと、ver2系と ver3系では大きく違うので、
ver3系を使っているのなら ver2系に、ver2系を使っているのなら
ver3系を使ってみると改善されるかもしれません。


2倍のポイントを手に入れた! 260ポイント を手に入れた。

Name: EXTRL  ..かけだし(2,343ポイント)   Date: 2009/10/18(日) 14:51   No:40605 解決!     
Title: Re:fpsについて    
>Justyさん
3系だったので2系にしましたが、結果は変わりませんでした。

ちなみに、ニコニコ動画とこのサイトを開いた状態で実行したら、
スペース押さないで200fps未満、スペース押したら一桁になりました。

既にsoftyaさんが改善策を出してくれたので、この件は解決にします。
皆さんありがとうございました。


153ポイント を手に入れた。



Name: 電気屋  ..かけだし(1,105ポイント)   Date: 2009/10/17(土) 15:09   No:40576       
Title: ポインタを使った文字の表示    
どうも、とてもお世話になっている電気屋です。
よく、ゲーム中にボスや一定のステージに行くと、キャラクターなどの会話(文字の表示)がありますがそこはどのように作成しているのですか?ポインタを使うところまでは理解したのですが、自分なりにサンプルを集めているのですが解説が載っていなかったので教えてください。書き下手なので一応要点だけ書いておきます。
・ゲームのプレイ中に文字の表示
・画像の表示の仕方
もしよければ、サンプルをおいていただくとありがたいです。


119ポイント を手に入れた。


Name: softya  ..上級者(20,707ポイント)   Date: 2009/10/17(土) 21:18   No:40590     
Title: Re:ポインタを使った文字の表示    
とりあえず部品部品で説明します。
ポインタを使うのは初心者のうちは止めておきましょう。配列を使ったほうが良いと思います。
最大文字数を決めておけば配列だけで処理できます。
で、こんな構造体を宣言します。
typedef struct {
int imgno;//画像番号
char str[256]; //半角255文字以内のメッセージ
} Message;
で、想定される会話数だけ配列をとります。
Message Kaiwa[200];//200メッセージまで。
この配列にメッセージを読み込んでください。
int kaiwa_num,fp;
char fname[32]={"message.txt"};
fp = FileRead_open(fname);//ファイル読み込み
if(fp == NULL){
printfDx("read error\n");
return;
}
kaiwa_num=0;
while( 0==FileRead_eof(fp) ) {
FileRead_scanf(fp,"%d,%s\n",&Kaiwa[kaiwa_num].imgno,Kaiwa[kaiwa_num].str);
kaiwa_num++;
}
FileRead_close(fp);
ファイルのmessage.txtの中身はこうなります。
0,まず1メッセージ目の表示。画像は0番
1,2メッセージ目、画像は1番。
0,3メッセージ目、画像はまた0番。会話しているイメージで。
以上です。
ここまでは良いでしょうか?



354ポイント を手に入れた。

Name: トオリスガリ  ..ぴよぴよ(121ポイント)   Date: 2009/10/18(日) 02:53   No:40595     
Title: Re:ポインタを使った文字の表示    
はじめまして、

自分も苦労しましたね;
文字描画のサンプルプログラム、及び解説は
http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N6
http://dixq.net/g/#s2
です。
とりあえずsoftyaさんのと合わせて
自分なりに理解し、応用してください。


121ポイント を手に入れた。



Name: ft  ..入門者(3,533ポイント)   Date: 2009/10/17(土) 04:16   No:40558       
Title: 剰余計算の高速化    
毎回剰余計算をしている箇所があるためその高速化について考えているのですが、どのようにすればいいでしょう?
対象の具体例を示しますと

void calc_ch(){
ch.cnt++;
ch.img=(ch.cnt%24)/6;
}

のようなものなどです。


102ポイント を手に入れた。


Name: toyo  ..熟練のプログラマー(42,378ポイント)   Date: 2009/10/17(土) 07:24   No:40560     
Title: Re:剰余計算の高速化    
2のn乗なら簡単なんですが
cnt % 8 == cnt & 7
cnt % 16 == cnt & 15
cnt % 32 == cnt & 31


4ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(112,987ポイント)   Date: 2009/10/17(土) 08:15   No:40562     
Title: Re:剰余計算の高速化    
ch.cntの更新をここでしか行っていないのであれば...

void calc_ch(){
if (ch.cnt < 24 - 1)
++ch.cnt;
else
ch.cnt += 1 - 24;
ch.img=ch.cnt/6;
}

上記のようにすることができるかと思います。


89ポイント を手に入れた。

Name: ft  ..入門者(3,559ポイント)   Date: 2009/10/18(日) 00:11   No:40592 解決!     
Title: Re:剰余計算の高速化    
ありがとうございます。
お二方の方法を使わせてもらいます!


26ポイント を手に入れた。



Name: R  ..入門者(4,590ポイント)   Date: 2009/10/11(日) 15:40   No:40287       
Title: 初心者です。4方向にあるけません。    
画像が 縦32ピクセル、 横24ピクセル で
4方向にテクテク歩く動作をしようと思ったのですが、
どこを変えればきれいに動くのか分かりません。

#include "DxLib.h"

typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[16];
char Key[256];
ch_t ch;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch.x =320;
ch.y =160;
ch.walking_flag=0;
ch.muki=3;

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}

if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==2) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x++;
}

ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}

これから変えるにはどうすればよいでしょうか。

右や左といった、1方向の動きはできました。


976ポイント を手に入れた。


Name: softya  ..中級者(13,099ポイント)   Date: 2009/10/12(月) 10:12   No:40311     
Title: Re:初心者です。4方向にあるけません。    
プログラムを見ると32と言う数値があちこちにありますよね。
これがグラフィックのサイズと関係しています。
プログラムへの理解を深めてもらうために、あえてズバリな答えは書きませんので、何処を変えたら良いかためしに書き換えたソースコードを掲載してください。

そのためには各関数のパラメータの意味を理解する必要がありますので、こちらでパラメータを再確認してくださいね。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
ゲームプログラミングの館を22まで読み直してみるのも良いでしょう。



171ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(110,898ポイント)   Date: 2009/10/12(月) 13:16   No:40317     
Title: Re:初心者です。4方向にあるけません。    
>どこを変えればきれいに動くのか分かりません。
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;

if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット

の三か所を書きなおすだけで良いと思いますよ。


98ポイント を手に入れた。

Name: R  ..初心者(5,052ポイント)   Date: 2009/10/12(月) 14:40   No:40320     
Title: Re:初心者です。4方向にあるけません。    
前回より丁寧によんでいきました。

21章まではすらすらとつまづかずにいけたのですが、
22章で
ch.img=image[(ch.x%24+ch.y%32)/8+ch.muki*○
の○の部分に何を入れればよいのかが分かりません。

ここの22章にmukiの意味が載っていなかったので、どう変えればよいのか・・・。
しかし、サンプル道理 muki*4 で実行してみたところ、

下に進むとき、に一瞬画像がきえて、
右に進むとき、すべての画像が見えなくなります。

muki*3 に変えてやってみたところ、
左へのテクテクは正常に動作して、
他、3方向は向いている方向が違うまま、指定した方向へ動きました。

僕はmukiが関係しているのではないかと思うのですが、どうなのでしょうか?


2倍のポイントを手に入れた! 462ポイント を手に入れた。

Name: R  ..初心者(5,378ポイント)   Date: 2009/10/12(月) 14:44   No:40321     
Title: Re:初心者です。4方向にあるけません。    
kazuoniさん

LoadDivGraph( "char.png" , 12 , 3 , 4 , 24 , 32 , image ) ;
if(ch.x%24==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.img=image[(ch.x%24+ch.y%32)/8 + ch.muki*4]; //画像をセット

このように変えてみたのですが、どうなのでしょうか。

画像は、
横24ピクセル 縦32ピクセル で
横は3分割 縦 4分割です。


2倍のポイントを手に入れた! 326ポイント を手に入れた。

Name: softya  ..中級者(14,008ポイント)   Date: 2009/10/12(月) 15:19   No:40323     
Title: Re:初心者です。4方向にあるけません。    
>ch.muki*○
これを理解するには、LoadDivGraphでimage配列にどう格納されているか理解しないといけません。
LoadDivGraph( "char.png" , 12 , 3 , 4 , 24 , 32 , image ) ;
でロードした場合、
[0][1][2]
[3][4][5]
[6][7][8]
[9][10][11]
と配列に分割されて格納されます。
ここの説明は19〜21章にありますよね。
で、mukiと配列の対応を見てみます。
mukiが0なら画像の[0][1][2]を使いますよね。
同様に、mukiが1なら画像の[3][4][5]を、mukiが2なら画像の[6][7][8]を、
mukiが3なら画像の[9][10][11]を使いますよね。
ここはOKでしょうか?
であれば、3か4のどちらかが正しいかは明確ではないでしょうか?

>ch.img=image[(ch.x%24+ch.y%32)/8 + ch.muki*4]; //画像をセット
ここについては、なぜ/8なのかを理解してください。21章に書いてありますよ。

じつは歩く画像が3コマなのは、非常に問題があります。
出来なくは無いですが、今の式のままでは無理です。
なぜ無理なのか考えてみてください。


2倍のポイントを手に入れた! 720ポイント を手に入れた。

Name: R  ..初心者(5,481ポイント)   Date: 2009/10/12(月) 15:42   No:40325     
Title: Re:初心者です。4方向にあるけません。    
1区間を24ピクセルとしていて、
コマが3つなので 3つにわけるには 24÷8 だから /8 ですね。
ここまでは理解できました。

mukiについてですか、
むく方向が4つあるから、 muki*4 なんでしょうか?



103ポイント を手に入れた。

Name: softya  ..中級者(14,214ポイント)   Date: 2009/10/12(月) 15:56   No:40327     
Title: Re:初心者です。4方向にあるけません。    
>1区間を24ピクセルとしていて、
>コマが3つなので 3つにわけるには 24÷8 だから /8 ですね。
>ここまでは理解できました。

それは横方向の移動の場合だけですね。
実は、横方向は問題ないんですよ。
でも縦方向の移動はどうでしょうか?
問題ありませんか?

>mukiについてですか、
>むく方向が4つあるから、 muki*4 なんでしょうか?
mukiの値の範囲は4方向で0から3ですよね。最大値の3*4だと12となります。
これだと配列の番号を超えてしまいますよね。
向きごとの配列の最初の番号とmukiの値との対応をよ〜く見てみてください。


206ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(111,002ポイント)   Date: 2009/10/12(月) 16:10   No:40328     
Title: Re:初心者です。4方向にあるけません。    
>このように変えてみたのですが、どうなのでしょうか。

softyaさんのレクチャーがあるので・・・

・・・

がんばってくださいw


66ポイント を手に入れた。

Name: R  ..初心者(5,661ポイント)   Date: 2009/10/12(月) 16:18   No:40329     
Title: Re:初心者です。4方向にあるけません。    
縦のピクセルは32ですので、32を4分割するには8ずつ区切ればよいので
32/8
横と同じとおもってしまうのですが・・・。

最大値というのは、画像を分割したときの数でしょうか。


向きごとの配列の最初の番号ということは、
muki*0 のとき 最初が [0]
muki*1 のとき 最初が [3]
muki*2 のとき 最初が [6]
muki*3 のとき 最初が [9]
ということなのでしょうか?


180ポイント を手に入れた。

Name: softya  ..中級者(14,543ポイント)   Date: 2009/10/12(月) 17:34   No:40335     
Title: Re:初心者です。4方向にあるけません。    
>最大値というのは、画像を分割したときの数でしょうか。
mukiの最大値が3だってことですね。

>向きごとの配列の最初の番号ということは、
>muki*0 のとき 最初が [0]
>muki*1 のとき 最初が [3]
>muki*2 のとき 最初が [6]
>muki*3 のとき 最初が [9]
>ということなのでしょうか?

はい。それが正解です。

>縦のピクセルは32ですので、32を4分割するには8ずつ区切ればよいので
>32/8横と同じとおもってしまうのですが・・・。

ここで大きな勘違いをしています。
>(ch.x%24+ch.y%32)/8
は、[0][1][2]を選ぶための計算です。元の画像の横方向の位置ですね。アニメのコマの番号です。
>ch.muki*4
は、[0][3][6][9]を選ぶための計算です。つまり元の画像の縦方向の位置を選んでいます。これでキャラクタの向きを選びます。
なので、組み合わせると[0]〜[11]を選ぶ事ができます。
でも、(ch.y%32)/8はまずいです。なぜなら4分割して0から3を計算してしまうからです。アニメのコマは3つですよね?


329ポイント を手に入れた。

Name: R  ..初心者(5,773ポイント)   Date: 2009/10/12(月) 18:16   No:40342     
Title: Re:初心者です。4方向にあるけません。    
この (ch.y%32)/8 というのは、1区間32ピクセルの縦を8で割っている。
4分割しているということですよね。

4分割して0から3を計算してしまうというのはどういったことなのでしょうか?

丁寧に説明していただいているのに、分からないことが多くてすいませんTT


112ポイント を手に入れた。

Name: softya  ..中級者(14,726ポイント)   Date: 2009/10/12(月) 19:42   No:40345     
Title: Re:初心者です。4方向にあるけません。    
>4分割して0から3を計算してしまうというのはどういったことなのでしょうか?
ようは、縦移動のとき4コマのアニメコマがあるという計算式になっていると言う意味です。ch.yが変化するときは、4コマのアニメデータが必要となりますが、用意されている画像のデータは3コマアニメだと数が合いませんので、異常なコマが表示されてしまうこととなります。
上向きなら[0]→[1]→[2]→[0]と繰り返すのがお望みでしょうが、今の計算式のままだと[0]→[1]→[2]→[3]→[0]と繰り返す事になります。


26ポイント を手に入れた。

Name: R  ..初心者(5,805ポイント)   Date: 2009/10/12(月) 20:57   No:40349     
Title: Re:初心者です。4方向にあるけません。    
縦の1区間(32ピクセル)も3分割するということでしょうか??

その場合は、32を10ずつわればよいでしょうか。
ch.y%32/10  ??;

あと、上にいくときは 9,10,11でした。


32ポイント を手に入れた。

Name: softya  ..中級者(14,943ポイント)   Date: 2009/10/13(火) 07:00   No:40367     
Title: Re:初心者です。4方向にあるけません。    
>縦の1区間(32ピクセル)も3分割するということでしょうか??
アニメコマが3コマなら3分割しないとダメです。

>その場合は、32を10ずつわればよいでしょうか。
>ch.y%32/10  ??;
10で割っても0から3になりますよね。なので、11で割る事になりますが、その場合[2]のコマだけが1フレーム他のコマより短く表示されますのでアニメが多少ぎこちなくなるはずです。
気になるかは、やってみないと分からないです。
気になるようなら、画像の縦サイズを3で割り切るサイズにするしか無いでしょう。

>あと、上にいくときは 9,10,11でした
では、mukiの値を画像に合わせて変えてください。


217ポイント を手に入れた。

Name: R  ..初心者(6,593ポイント)   Date: 2009/10/13(火) 16:42   No:40377     
Title: Re:初心者です。4方向にあるけません。    
画像を変更して、横72 縦120 の横24ピクセル 縦30ピクセル にしてみました。

変更してからのプログラムです。


#include "DxLib.h"

typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[12];
char Key[256];
ch_t ch;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch.x =320;
ch.y =160;
ch.walking_flag=0;
ch.muki=3;

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "apollo.png" , 12 , 3 , 4 , 24 , 30 , image ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=3; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=0; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=2; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}

if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==3) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==0) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==2) //右向きならch.x座標を増やす
ch.x++;
}

ch.img=image[(ch.x%24)/8 + (ch.y%30)/10 + ch.muki*4]; //画像をセット

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}

この用にしたのですが、
おかしなところはあるでしょうか??


788ポイント を手に入れた。

Name: softya  ..上級者(15,927ポイント)   Date: 2009/10/13(火) 17:14   No:40381     
Title: Re:初心者です。4方向にあるけません。    
キャラクタの初期座標
ch.x =320;
ch.y =160;
がそれぞれ24と30で割り切れてませんので問題です。

それと最初のころに出た部分ですが、
if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
を直し忘れてませんか?

あとは大丈夫だと思いますが、まず自分で動かして試してみてくださいね。


87ポイント を手に入れた。

Name: R  ..初心者(7,770ポイント)   Date: 2009/10/13(火) 18:05   No:40383     
Title: Re:初心者です。4方向にあるけません。    
#include "DxLib.h"

typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[12];
char Key[256];
ch_t ch;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch.x =240;
ch.y =150;
ch.walking_flag=0;
ch.muki=3;

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "apollo1.png" , 12 , 3 , 4 , 24 , 30 , image ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

if(ch.x%24==0 && ch.y%30==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=3; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=0; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=2; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}

if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==3) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==0) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==2) //右向きならch.x座標を増やす
ch.x++;
}

ch.img=image[(ch.x%24)/8 + (ch.y%32)/10 + ch.muki*4]; //画像をセット

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}


この用に直してみました。
が、実行したときに、キャラが画面にでていない(動かすとでてくる)のと、
やはり、うまくうごかない。という問題がでました。

最初にいる座標を帰る前、
if(ch.x%24==0 && ch.y%30==0){ //座標が32で割り切れたら入力可能

に変えてやってみると、画像がまったくでてこず、どうなっているのかさっぱりでした。

なにかおかしいことがあるのでしょうか??


1,177ポイント を手に入れた。

Name: softya  ..上級者(16,352ポイント)   Date: 2009/10/13(火) 20:00   No:40391     
Title: Re:初心者です。4方向にあるけません。    
>この用に直してみました。
>が、実行したときに、キャラが画面にでていない(動かすとでてくる)のと、

それを考えるのは、あなた自身に任せます。
これまで答えてしまうと、バグを取る能力が育ちませんのであえて答えを書きません。

>やはり、うまくうごかない。という問題がでました。
どう、うまく動かないでしょう?
ちゃんと分析して教えてください。
バグの状況を正確に整理できる事は、プログラミングの初歩的な技術です。

>最初にいる座標を帰る前、
>if(ch.x%24==0 && ch.y%30==0){ //座標が32で割り切れたら入力可能
>に変えてやってみると、画像がまったくでてこず、どうなっているのかさっぱりでした。

これは、20〜21章に説明されてますよ。
一区間歩かせるってどう言うことかってかなり詳しく。

ともかく、変数の内容を表示する方法を教えますので、それを使って問題点を調べてみてください。
下記のようなコードを埋め込む事でVisualStudioの出力ウィンドウに変数の内容を表示することが出来ます。

{
TCHAR strbuf[256];
sprintf( strbuf, _T("ch.x=%d ch.y=%d\n"), ch.x, ch.y );
OutputDebugString( strbuf );
}

何処を調べるべきなのか、それをまず考えてみてください。


343ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(111,666ポイント)   Date: 2009/10/13(火) 20:14   No:40393     
Title: Re:初心者です。4方向にあるけません。    
>これまで答えてしまうと、バグを取る能力が育ちませんのであえて答えを書きません。
うーん・・・
もう回答例を掲載してもいいんじゃないですかね?^^;
ここで戦意喪失してしまい、
プロジェクト自体を諦めるのはとてももったいないことと思います。
サンプルプログラムからも得るものは多いかと思います。


12ポイント を手に入れた。

Name: softya  ..上級者(16,438ポイント)   Date: 2009/10/13(火) 20:33   No:40396     
Title: Re:初心者です。4方向にあるけません。    
>もう回答例を掲載してもいいんじゃないですかね?^^;
>ここで戦意喪失してしまい、
たしかに、ここで戦意喪失は勿体無いですよね。
では、ヒント。

ch.img=image[(ch.x%24)/8 + (ch.y%32)/10 + ch.muki*4]; //画像をセット
のところ、どこか変じゃありません?
今までのやり取りを全部見直してみてください。


86ポイント を手に入れた。

Name:  ..ぴよぴよ(7ポイント)   Date: 2009/10/13(火) 20:59   No:40398     
Title: Re:初心者です。4方向にあるけません。    
うーん、ここの方針としては異なると思うんだけど、C言語の基礎を覚えてからじゃないと手を出すべきじゃないと考えちゃったりします。

intやdoubleなどの変数の定義の仕組、二次元配列、ヘッダーファイルの取り込み方、extern宣言、九つの制御文(gotoとかいらないけど)、分割コンパイル、構造体、関数の自作。

C言語の基礎としてどの本にも載っている内容だと思いますが、最低限上に挙げたものくらいはある程度理解する必要があると思います。2、300ページ程度の本を購入して勉強してみたらいかがでしょう。
(借りて勉強はおすすめしません。自分のお金を出すとなんだかやる気が出ます。私だけかもしれませんが……)

一日一時間ずつでもさぼらずにやれば2ヶ月ほどでマスターできるはずです。
マスターした後にここのプログラムを見てみると、おそらく世界が変わるんじゃないかと思います。


7ポイント を手に入れた。

Name: すずめ  ..入門者(4,628ポイント)   Date: 2009/10/13(火) 21:26   No:40403     
Title: Re:初心者です。4方向にあるけません。    
C言語の基礎を覚えてからというと私も質問する権利が
ないようです。

私一ヶ月ほど悩んで思い切って質問したとき、MNSさんに
すぐ回答していただいて、今まで分からなかったことが一瞬で解決し
感激したことを覚えています。

質問するときどれだけ勇気がいるか、ベテランのひとには
分からないかもしれませんね。


116ポイント を手に入れた。

Name: softya  ..上級者(16,450ポイント)   Date: 2009/10/13(火) 21:28   No:40404     
Title: Re:初心者です。4方向にあるけません。    
修正したソースコードも用意してみました。
#defineを使ってますが大丈夫ですよね。
今までの説明を読み直してもらえば理解できると思います。
※ ごめんなさい、コンパイルチェックしていないのでエラーがあるかも知れません。


2倍のポイントを手に入れた! 12ポイント を手に入れた。

Name: softya  ..上級者(16,533ポイント)   Date: 2009/10/13(火) 21:34   No:40405     
Title: Re:初心者です。4方向にあるけません。    
私としては原理・アルゴリズムを理解して欲しいと思ってやっております。
C言語の文法書を理解したところで、これは別の次元の問題ですので、なぜプログラムでこう書く必要があるのかを回りくどくても理解して欲しいと考えてます。
プログラムの一行一行、1つの数値にも深い意味があることが理解できるとプログラムの見方も変わると思うんですよ。


83ポイント を手に入れた。

Name: すずめ  ..入門者(4,720ポイント)   Date: 2009/10/13(火) 21:43   No:40406     
Title: Re:初心者です。4方向にあるけません。    
C言語の基礎を覚えてからというと私も質問する権利が
ないようです。

私一ヶ月ほど悩んで思い切って質問したとき、MNSさんに
すぐ回答していただいて、今まで分からなかったことが一瞬で解決し
感激したことを覚えています。

質問するときどれだけ勇気がいるか、ベテランのひとには
分からないかもしれませんね。


92ポイント を手に入れた。

Name: conio [URL]  ..熟練のプログラマー(61,329ポイント)   Date: 2009/10/13(火) 22:24   No:40409     
Title: Re:初心者です。4方向にあるけません。    
>>C言語の基礎を覚えてからというと私も質問する権利がないようです。
「C言語の基礎などを固めたあとに、ゲーム制作に入ったほうが良いでしょう」、
と言っているだけで、
「C言語をマスターしていなければ、質問する権利はありません」
という意味では無いと思います。


基礎が曖昧なままゲーム制作に取り組むと 頓挫する可能性がありますよ
という指摘でしょう。
「質問はするな」という旨の発言は見当たりません。



148ポイント を落としてしまった。

Name: R  ..初心者(7,913ポイント)   Date: 2009/10/13(火) 22:31   No:40411     
Title: Re:初心者です。4方向にあるけません。    
みなさんのいっているとうりでした。
本を 購入 して 勉強してみようと思います!

Q1 みなさんが(やプロのプログラマーさんたち)ゲームを作成するときは、
何もみずに、考えて書いていくのでしょうか。
本を見つつかいているのでしょうか。

Q2 贅沢かもしれませんが、どの本がオススメなどありますか??

いろいろ質問ばかりですいません。


143ポイント を手に入れた。

Name: すずめ  ..入門者(4,753ポイント)   Date: 2009/10/13(火) 23:49   No:40417     
Title: Re:初心者です。4方向にあるけません。    
間違って同じ投稿を二度してしまいました。
たいへん失礼いたしました。


33ポイント を手に入れた。

Name:  ..かけだし(1,275ポイント)   Date: 2009/10/14(水) 00:55   No:40420     
Title: Re:初心者です。4方向にあるけません。    
ええと、あくまで一個人の意見です。
押し付けるつもりはありません。

意見なんてのは星の数ほどあります。
正しいと思えば実行すればいいし、正しくないと思えばやらなければいいんではないでしょうか。
(これもまた一個人の意見ということで……)
というより、書き込む資格を私が判断できるわけがないのです。


まあそれはともかく、いざプログラミングをしているときに、

・xxx.xxx;ってどこでも宣言してないのになんで変数として扱えるんだろう。
・cppファイルを分けてるのに何故同時にコンパイルされてるのか。
・いままでは<stdio.h>をつけてたのに何故"DxLib.h"なんだろう。
・なんでprintfがつかえないのか。
・DxLibで線を描写する術を覚えた。でも学校の授業中のプログラミングでは使えなかった。

などなどいろいろな疑問が出てくると思います。
ぶっちゃけた話コピペでもある程度できるので、知らなくても進めますけど、気持ち悪さが残るのでは。

まあここらへんはRさんがどう思ってるか次第ですが。

ともあれこんな他愛も無い疑問は、ある程度組める人なら誰でも答えられるのではないかと思います。
そこらへんの基礎本の前半100ページ以下程度に全部記されてるんじゃないでしょうか。

また、自分で独自の弾幕をいざ作ろうとしたときに制御文の使い方を知らずに作れるかと問われると
正直厳しいのではないだろうかと思います。がんばればできることはできるとおもいますが。
構造体についても同様です。変数を大量に用意するのも可能ですが、やはり構造体でやったほうが良いでしょう。

意味不明だったものが理解するというのは、これから多々起こるであろうエラーや警告の解決手段に
どうしても必要になるものだと思います。

長くなりましたが、あくまでこれは私個人の意見です。
違うと思えば無視してください、本当に。
議論することも可能ですが、そもそも正解の用意されていないので、あんまりしたくありません。
気に食わなければスルーしといてください><

まあ、アルゴリズムも大事ですよね。手続きで済ましているプログラムも見受けられるので。
手続きでも別にいいとは思いますけど……。

回答
Q1.プロではないのでなんともいえないですが、C言語には大量の関数があり、それ全部理解している人は僅かにしかいないと思います。なので複雑なプログラムは関数の解説書片手にやってる方が多いのではないでしょうか。

Q2.Rさんがどの程度C言語をできるかわからないのでなんともいえないです。
ただ、進められたものを買うより、実際に本屋に出向いて数時間いろんな本を立ち読みして自分にあった本を
探すのが良いと思います。ここで変な本を掴まされては出足があまりよろしくないです。
まあ相当書店側には迷惑でしょうが……。
ただ一つ覚えてほしいのは、自分の使用しているコンパイラで解説している本にしたほうがよいです。
VS2008をつかっているならそれを使っている解説書を。別に他のでもいいんですが、出足くじかれる可能性大です。

うーん、長くなってしまった。長文本当に申し訳ないです。




1,268ポイント を手に入れた。

Name:  ..かけだし(1,285ポイント)   Date: 2009/10/14(水) 01:00   No:40421     
Title: Re:初心者です。4方向にあるけません。    
日本語変なとこはスルーで……

10ポイント を手に入れた。

Name: softya  ..上級者(17,765ポイント)   Date: 2009/10/14(水) 07:13   No:40425     
Title: Re:初心者です。4方向にあるけません。    
Q1 みなさんが(やプロのプログラマーさんたち)ゲームを作成するときは、何もみずに、考えて書いていくのでしょうか。本を見つつかいているのでしょうか。

・日ごろ作っているコードのサンプルがあるかと言う意味なら、ありません。自力で作り出しています。
サイトや本に、そのものズバリな答えが見つかる事はまずありません。
・あるいは特殊なアルゴリズムを使う場合は、先人の知恵であるアルゴリズム辞典を参考にします。
http://www.amazon.co.jp/dp/4874084141
・全ての関数を覚えているかと言う意味なら、覚えられませんので関数リファレンスは参照しますよ。
DXライブラリなら
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
とかですね。


Q2 贅沢かもしれませんが、どの本がオススメなどありますか??
本は相性とかがありますので、本屋で確かめてみる事をお勧めします。
とりあえず私はサイトを紹介します。
http://homepage3.nifty.com/mmgames/c_guide/
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
http://www.geocities.jp/ky_webid/c/index.html

で、C言語の文法を覚える事以外にプログラミングのコツというか考え方を身につける必要があります。
これは、演習問題を数をこなすとか、サンプルプログラムを色々いじってみるとか、実践的な作業の中で身に付けて行くしかありません。なので、ゲームプログラミングの館のコードを色々変更してみるのは悪い勉強方法ではありません。しかし、ただ闇雲に変更してもプログラムは動かなくなるだけです。
なので、1つの関数や1つの値の意味などをちゃんと理解する事を心がけてください。

有名なプログラミングの考え方の基礎が身についているか確認する練習問題にFizzBuzzの問題があります。
「1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。」
と言う問題なのですが、ちゃんと出来る力が付いていたら本やサイトを見ずに自力で2分程度でプログラムが書けるはずです。参考にしてください。


2倍のポイントを手に入れた! 1,232ポイント を手に入れた。

Name: R  ..初心者(7,872ポイント)   Date: 2009/10/14(水) 21:55   No:40475 解決!     
Title: Re:初心者です。4方向にあるけません。    
いろいろわかりやすい解説をありがとうございました!!
勉強がんばります。

^^@


41ポイント を落としてしまった。

Name: すずめ  ..入門者(4,908ポイント)   Date: 2009/10/15(木) 14:41   No:40491     
Title: Re:初心者です。4方向にあるけません。    
親切に質問に答えてくれる方に意見するようで心苦しいのですが、
質問している方は”ゲームプログラミングの館の22章
キャラを4方向に歩かせる”を元に質問していると思われるので、
回答もそこのコードにできるだけ合わせたほうがいいのではないでしょうか。
softyaさんの添付されたコードではまた混乱してしまうと思います。

初心者の質問に対して、まる投げ禁止だからといって逆質問攻めにする
ケースが多く見られますが、私ならとっくにギブアップです。
といって他にいいサイトがあるわけでもないので、分からないときは
誰かが同じことを質問してくれるのを待っている状態です。


155ポイント を手に入れた。

Name: softya  ..上級者(18,810ポイント)   Date: 2009/10/15(木) 15:10   No:40493     
Title: Re:初心者です。4方向にあるけません。    
>softyaさんの添付されたコードではまた混乱してしまうと思います。
逆に分かり辛かったですか?
私としては、分かりやすくしたつもりだったんですよ。あと後々のバグの原因となる直接の数値を書く並べるのを避けるって目的もあります。

22章と書き方を同じにしてコメントを増やしてみましたがどうでしょうか?
キャラクタが24x30ドットでアニメパターンが3x4に変わっている&向きもオリジナルと違う時点で、数字だけ並べると余計分かり辛い気が私はするのですがどうでしょうか?
初心者の方の感想をお待ちしています。



150ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(111,132ポイント)   Date: 2009/10/15(木) 15:51   No:40494     
Title: Re:初心者です。4方向にあるけません。    
>初心者の質問に対して、まる投げ禁止だからといって逆質問攻めにする
>ケースが多く見られますが、

自分もいろいろ質問掲示板(回答は別として)を見ていますが、
回答コードを貼り付けのみ、
解説・コメント一切なし、批判コメ、レスなしなどもあります。
その中で、親身になって回答してもらえることは、
百利あって一害なしです。
回答側も質問攻めにする=悪意を持っている
わけではないと思うのです。
恐らく、欠落している情報を回答側が得たいのだと思います。
悪意を持っている人は恐らく相手にしません。
もしくは批評コメをしてくるかもしれません。

その中で、「〜〜を勉強してきたほうがいい」
といわれたら、そのとおりにすることがベストです。
それが問題解決の一番の近道でしょうから^^;

「ある程度下調べをし」、
分からないことや、もっとよりよい方法などを知りたい場合は、
全然質問していいと思いますよ。
自分は、質問ばっかしすぎで「ハッカー」の称号まで上り詰めてますので^^;


まぁ、確かに今回は、質問内容が
「これから変えるにはどうすればよいでしょうか。 」
なので、その書き方のみをビシっと書くだけで済んだかも知れませんが、
このスレでRさんは得たものがあると思いますよ^^


534ポイント を落としてしまった。

Name: ねこ  ..熟練のプログラマー(45,984ポイント)   Date: 2009/10/15(木) 21:13   No:40499     
Title: Re:初心者です。4方向にあるけません。    
>初心者の質問に対して、まる投げ禁止だからといって逆質問攻めにする
>ケースが多く見られますが、

逆質問される方に非はないんでしょうか?
ソースも無しに漠然と質問したり、「うまくいかない」「うごかない」等曖昧な表現に対して予想して答える事を「エスパーレス」って言います。
十分な情報を出してくれれば適格に答えを出せます。それをしないから逆質問されます。
すずめさんの言う逆質問攻めってのがどういう質問に対してどうされた事なのかは分かりませんが
ちゃんと情報出してくれれば親切丁寧に答えてくれるのがこの掲示板だと思います。

質問に勇気が要るというなら回答にだって間違えてはいけないというプレッシャーから勇気要りますよ。
むしろ丸投げ質問にも放置は無いこの掲示板は相当質問しやすい環境だと思いますが・・・


214ポイント を手に入れた。

Name:  ..かけだし(1,492ポイント)   Date: 2009/10/15(木) 21:45   No:40500     
Title: Re:初心者です。4方向にあるけません。    
まぁ、求めるものの違いでもあるのでしょうね。

その質問を解決したいという気持ちはもちろんわかります。
それに対し、答えを貼り付けるのは簡単なことです。(もちろん難しい質問は別ですが)

そこで一つ聞きたいのは、質問者はその質問の回答がほしいのか、それともアルゴリズムを構築する力ほしいのか、どちらかということです。

私としては、基礎が欠落していると判断したのでそちらをやったらおそらく世界が変わるのではないかと思ったためそういう回答をしたまでです。

また、softyaさんの逆質問はあくまで、順序良く説明するためにやったことだと思います。その時点で腰をすえて質問の回答をしてあげようという意思の現われです。感謝してしかるべき出はないでしょうか。
そしてその逆質問がわからなければわからないという旨の発言(もちろんどのように考えた結果わからなかったと記す必要があります)をすると、どの程度のプログラミング力があるかある程度知ることが可能です。


274ポイント を手に入れた。

Name: すずめ  ..初心者(5,060ポイント)   Date: 2009/10/16(金) 10:26   No:40512     
Title: Re:初心者です。4方向にあるけません。    
たいへんお騒がせしました。
私が気になったのは、Rさんが問題が解決して
解決ボタンを押したかどうかです。

まあ、質問者のことを心配して投稿したんですが、
自分の方が大変なことになってしまったようです。

弁解するようですが、逆質問を否定したわけではありません。
いつになったら回答にたどり着けるのかなって思ったからです。

いずれにしてもたいへんお騒がせしました。


152ポイント を手に入れた。

Name: ドラ  ..かけだし(1,303ポイント)   Date: 2009/10/17(土) 22:05   No:40591     
Title: Re:初心者です。4方向にあるけません。    
>画像は、
>横24ピクセル 縦32ピクセル で
>横は3分割 縦 4分割です。
ツクール200X向けの素材ですね。

もしRさんがツクール200X製ゲームのようにキャラを歩かせたいと思っているのだとしたら、ツクール200Xの素材規格やツクール200X製のゲームの仕様も理解した方がいいよ。
残念ながらゲームプログラミングの館も回答者の方々も、ツクール200Xの仕様にのっとった解説はしてくれていません。

Rさんまだ見てるのかな・・・、もう手遅れ?


2倍のポイントを手に入れた! 418ポイント を手に入れた。



Name:  ..ぴよぴよ(253ポイント)   Date: 2009/10/16(金) 23:01   No:40531       
Title: 文字列データの作成依頼    
char* data[61]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"0","1","2","3","4","5","6","7","8","9"};

配列dataに入ってる文字を1〜12文字ランダムで取得し
事前に用意しているtest.txtというファイルにその文字列を格納する。
ただし、作成された文字列がtest.txtのなかに存在するものならば格納はせず
もう一度文字列を作成しなおす。

確立的にはかなり低いですが
ランダムで作成された文字列が
abcdeでtest.txtの中に同じ
abcdeという文字列があれば
作成した文字列はファイルに書き込まず
もう一度ランダムで文字列を作り直す。

さらにtest.txtの中の文字列が1000個になったときは
test2.txtを作成してその中に次の文字列を格納する。
そのとき上記と同じ条件でtest.txt又はtest2.txtの中に
同じ文字列があるときは格納しない。

test2.txtが1000個になったときはtest3.txtを作成して格納する
test3.txtが1000個になったときはtest4.txtを作成して格納する

この繰り返しです。



トリップを作成するときに使うキーにしたいデータを作成したいのですが、
うまくいきません・・・・

トリップはCではなくWeb上のPHPでやるので作れるのですが、Cに関してはまったく初心者で・・・
どなたか変わりに作っていただける方がいましたらお願いします。

私のコンパイル環境は
VC++2008
です。
よろしくお願いします。


253ポイント を手に入れた。


Name: softya  ..上級者(19,061ポイント)   Date: 2009/10/16(金) 23:11   No:40533     
Title: Re:文字列データの作成依頼    
規約と注意事項を読んでいただくと分かるのですが、
>課題の丸投げ(問題文だけ書く事)は禁止です。
となっています。

それにPHPのコードが書けるなら、コマンドライン上でPHPで実行しても作れると思うのであえてCを使う必要はないんじゃ無いでしょうか?


112ポイント を手に入れた。

Name:  ..上級者(23,928ポイント)   Date: 2009/10/16(金) 23:47   No:40537     
Title: Re:文字列データの作成依頼    
失礼しました(>_<)
Webで作成すると長い時間処理できないんです・・・
サーバーが落ちてしまいますので・・・

もう少し勉強して頑張ってみます。


48ポイント を手に入れた。

Name: box  ..ハッカー(144,446ポイント)   Date: 2009/10/16(金) 23:51   No:40538     
Title: Re:文字列データの作成依頼    
> Webで作成すると長い時間処理できないんです・・・
> サーバーが落ちてしまいますので・・・

softyaさんの回答は、Webサーバ上でPHPスクリプトを動かすことを
想定されていません。

ご自分のPC上にPHPをインストールしてある状態にして、
Webサーバで動かすためのスクリプトをご自分のPC上で
動かしてみてはいかがですか?とおっしゃっています。


61ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(112,874ポイント)   Date: 2009/10/17(土) 00:46   No:40539     
Title: Re:文字列データの作成依頼    
意外なことに、PHPプログラマであってもコマンドラインでPHPが使えることを知らない人が多いんですよね。
普通に、

php hoge.php

のようにして呼び出せばよいだけなんですが、コマンドラインツールの使い方がそもそも分からないのかもしれません。
あるいは、環境変数の設定の仕方がわからないとか...


102ポイント を手に入れた。

Name: バグ  ..ハッカー(171,612ポイント)   Date: 2009/10/17(土) 17:16   No:40583     
Title: Re:文字列データの作成依頼    
文字列のチェックは全てのファイルに対して行うのですか?
それとも最新のファイルだけで構わないのですか?


35ポイント を手に入れた。

Name: dic  ..プログラマー(35,565ポイント)   Date: 2009/10/17(土) 20:40   No:40589     
Title: Re:文字列データの作成依頼    
手順は違いますが動くだけなら作ってみました

#pragma warning( disable: 4786 )
#include <windows.h> // for GetTickCount
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

static vector<string> gvStr;

#define DEF_CREATE_TRIP_NUM 250000 // 作成するトリップの数
#define DEF_CREATE_TRIP_SIZE 12 // 作成するトリップの文字列の長さ
void Now()
{
static vector<char> data;
int i;
for( i=0; i<26; i++ )
{
printf( "%c", 'A'+i );
data.push_back( 'A'+i );
}
for( i=0; i<26; i++ )
{
printf( "%c", 'a'+i );
data.push_back( 'a'+i );
}
for( i=0; i<10; i++ )
{
printf( "%c", '0'+i );
data.push_back( '0'+i );
}
printf( "\n" );

for( i=0; i<data.size(); i++ )
printf( "%c", data.at(i) );

// 何個作成するか?
int num = DEF_CREATE_TRIP_NUM;

printf( "\n%d個作成する\n", num );

int loop;
for( loop=0; loop<num; loop++ )
{

// 作成される文字列
char str[DEF_CREATE_TRIP_SIZE+2];

// ひとつ作成
// 作成する文字列の長さ
int len = rand()%DEF_CREATE_TRIP_SIZE+1;
memset( str, 0, sizeof(str) );
for( i=0; i<len; i++ )
{
int r = rand()%data.size();
str[i] = data.at(r);
}
gvStr.push_back( str );
// printf( "%s\n", str );
}

// 重複要素を削除する
vector<string>::iterator p;
sort( gvStr.begin(), gvStr.end() );
p = unique( gvStr.begin(), gvStr.end() );
gvStr.erase( p, gvStr.end() );

printf( "実際に作成されたトリップの数:%d\n", gvStr.size() );

// ファイルに出力する

int o_f_num; // 出力するファイルの数
o_f_num = gvStr.size()/1000;

int o;
for( o=0; o<=o_f_num; o++ )
{
char out_filename[80];
sprintf( out_filename, "test%02d.txt", o );

FILE *file = fopen( out_filename, "wt" );

for( i=o*1000; i<(o+1)*1000; i++ )
{
if( i>=gvStr.size() )
break;
char out_str[DEF_CREATE_TRIP_SIZE+2];
memset( out_str, 0, sizeof(out_str) );
strcpy( out_str, gvStr.at(i).c_str() );

strcat( out_str, "\n" ); // 見やすいようにする

fputs( out_str, file );
}

fclose( file );
}
}

int main()
{
remove( "*.txt" );

srand(GetTickCount());

Now();

return 0;
}



1,026ポイント を手に入れた。



Name: sweden  ..ぴよぴよ(23ポイント)   Date: 2009/10/17(土) 01:32   No:40541       
Title: またまた質問です。    
学校の宿題をやっているのですが、aをn回足すってどういう風に書けばいいんでしょうか??初歩的ですいません。

23ポイント を手に入れた。


Name: 御津凪 [URL]  ..ハッカー(116,803ポイント)   Date: 2009/10/17(土) 01:38   No:40543     
Title: Re:またまた質問です。    
どこまで習っているのかは質問から汲み取れませんが、
for 文を使えば可能です。


30ポイント を手に入れた。

Name: sweden  ..ぴよぴよ(68ポイント)   Date: 2009/10/17(土) 01:41   No:40544     
Title: Re:またまた質問です。    
すいません。まだfor文は習っていない状態です。for文を使わなくでできる方法はあるのでしょうか?

45ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(116,862ポイント)   Date: 2009/10/17(土) 01:50   No:40546     
Title: Re:またまた質問です。    
他の方法には
・while 文
・goto 文
・再帰処理
がありますが、多分習っていないと思いますし。

もしかしたら、「aをn回足す」の部分の表現を言い換えたものが答えなのでは?


59ポイント を手に入れた。

Name: sweden  ..ぴよぴよ(137ポイント)   Date: 2009/10/17(土) 01:58   No:40548     
Title: Re:またまた質問です。    
レスありがとうございます。while文、if文は習いました。具体的な数字は出ないのでアルファベットa,nとおいたのですが・・・。これがどうしてもわかりません。while文で考えたのですがどうしてもひらめきません。どう書けばよいのでしょうか??

69ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(116,972ポイント)   Date: 2009/10/17(土) 02:04   No:40549     
Title: Re:またまた質問です。    
基本的なC言語の構文の意味で出題されているのであれば、
「aをn回足す」の答えは、「a×n」と同じなので、これと同等の命令文が答えなのかもしれません。


44ポイント を手に入れた。

Name: sweden  ..ぴよぴよ(147ポイント)   Date: 2009/10/17(土) 02:18   No:40550     
Title: Re:またまた質問です。    
すいません、説明不足でした。今サイコロをn回振り、出た目の平均を出す問題をやっていいるのですが、出た目をaとおいてやっているのでaはランダムに1〜6まで出てくるんです。なので、出た目の合計の出し方がわからなくて困っている状態です。

10ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(117,168ポイント)   Date: 2009/10/17(土) 02:31   No:40551     
Title: Re:またまた質問です。    
では、おおよそ以下のような順序になります。

1. 合計を格納する変数を用意しておく。(0で初期化、ここでは仮に x とする)
2. while 文で n 回ループさせる。
3. その中で 1 〜 6 のランダムの数値を出し、その値を x に足す。
4. x を n で割れば出た目の平均が算出される。

この方法であれば、 while 文から出た時に x は出た目の合計となるはずです。


※ところで、規約と注意事項を読みましたか?


196ポイント を手に入れた。

Name: sweden  ..ぴよぴよ(190ポイント)   Date: 2009/10/17(土) 02:40   No:40552     
Title: Re:またまた質問です。    
ありがとうございます。その方法でやっているんですが、n回ループさせるってのはそうやるんでしょうか??たびたびすいません。
読んでませんでした。迷惑かけてすいません。


43ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(117,245ポイント)   Date: 2009/10/17(土) 02:44   No:40553     
Title: Re:またまた質問です。    
> 2. while 文で n 回ループさせる。

// 1. の処理部分
while(n > 0){
// ループ内の処理(3. の処理部分)
n--;
// n--; (--n;)を習っていないのなら、
// n -= 1; か、 n = n - 1; でも可
}
// 4. の処理部分


だいたいこんな感じです。


77ポイント を手に入れた。

Name: sweden  ..ぴよぴよ(205ポイント)   Date: 2009/10/17(土) 02:48   No:40554 解決!     
Title: Re:またまた質問です。    
何回もありがとうございます!!やってみます。

15ポイント を手に入れた。

Name: sweden  ..ぴよぴよ(233ポイント)   Date: 2009/10/17(土) 03:52   No:40556     
Title: Re:またまた質問です。    
やってみましたが上の方法だとnが0として定義されちゃいませんか??
答えがでません。while文の中身をのせるのでコメントお願いします。
while(n>0){
z=rand()/R15; //[0,1)-一様乱数
me=(int)(z*6)+1; //さいころの目
S=S+me;
n=n-1;
}
printf("平均は%lfです。",S/n);
}


28ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(42,374ポイント)   Date: 2009/10/17(土) 07:17   No:40559     
Title: Re:またまた質問です。    
nは繰り返したい回数で初期化しないといけませんよ
100回繰り返したいなら
n = 100;
while ( n > 0) ...


43ポイント を手に入れた。

Name: sweden  ..ぴよぴよ(287ポイント)   Date: 2009/10/17(土) 13:34   No:40572     
Title: Re:またまた質問です。    
レスありがとうございます。繰り返す回数はいちばん最初にscanfで入力することになってるんです。なので困っています・・・・。

54ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(117,499ポイント)   Date: 2009/10/17(土) 15:36   No:40577     
Title: Re:またまた質問です。    
scanf で数字を読み込む方法は理解していますか?

scanf("%d", &n); // 入力した数字を数値として n に読み込む


あと、while 文で n を変更している( 1 ずつ引いている)ので、
ループを抜けた後は n は 0 になってしまいます。
ので、 while 文に入る前に別の変数に退避し、
平均の計算時に退避した変数を使用すると良いでしょう。

また、 S/n としていると、整数の結果を返してしまう(小数点以下が切り捨てられる)ので、
浮動小数点型(float か double)に変換して割る必要があります。


例: (double)S / n

(どちらかが浮動小数点値なら、浮動小数点として計算されます)


254ポイント を手に入れた。

Name: sweden  ..ぴよぴよ(593ポイント)   Date: 2009/10/17(土) 17:05   No:40580     
Title: Re:またまた質問です。    
どうしても警告が出てしまってできません・・・・。プログラムはこんな感じです・・・。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main(){
int n,me,kaisuu;
double avereage,z,S,R15=RAND_MAX+1;//R15=2^15
srand((unsigned int) time(NULL)*314159265);
printf("さいころを振る回数を入力してください。");
scanf("%d",&n);
n=kaisuu;
S=0;
while(n>0){
z=rand()/R15; //[0,1)-一様乱数
me=(int)(z*6)+1; //さいころの目
S=S+me;
n=n-1;
}
avereage=S/kaisuu;
printf("平均は%lfです。",avereage);
}


306ポイント を手に入れた。

Name: MNS  ..上級者(20,372ポイント)   Date: 2009/10/17(土) 17:13   No:40582     
Title: Re:またまた質問です。    
n=kaisuu;
これは逆ではありませんか?
kaisuu = n;


23ポイント を手に入れた。

Name: sweden  ..ぴよぴよ(643ポイント)   Date: 2009/10/17(土) 17:19   No:40584 解決!     
Title: Re:またまた質問です。    
できました〜〜!!ありがとうございます!ほんとに迷惑かけてすいませんでした。また疑問が出たらよろしくです。

50ポイント を手に入れた。



Name: チルチル  ..熟練のプログラマー(56,202ポイント)   Date: 2009/10/05(月) 00:36   No:40004       
Title: クラスのプロトタイプ宣言    
class CA {

public:
int a;
} A;
class CB {
public:
int b;
} B;
こんな感じでクラスのインスタンスを作成するとAからbを使う場合は
CBとBを関数で言うプロトタイプ宣言する必要があります、可能でしょうか?


2倍のポイントを手に入れた! 214ポイント を手に入れた。


Name: ねこ  ..熟練のプログラマー(43,876ポイント)   Date: 2009/10/05(月) 00:55   No:40005     
Title: Re:クラスのプロトタイプ宣言    
意味がよく分からないんだけどもしかしてAクラス内でBクラスを扱うって事?

それならAクラスではBクラスのポインタのみ有効です。実体の場合はBを先に定義しないといけません。
「クラス・相互参照」とか検索すると知りたい事が分かるかもしれません。

何にしてもちょっと質問の意図が分かりにくいです。


138ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(434,752ポイント)   Date: 2009/10/05(月) 01:29   No:40006     
Title: Re:クラスのプロトタイプ宣言    

>CBとBを関数で言うプロトタイプ宣言する必要があります、可能でしょうか

 何故必要になりますか?


class CA
{
public:
    int a;
    void test();
} A;
class CB
{
public:
    int b;
} B;

void CA::test()
{
    B.b++;
}



103ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(56,424ポイント)   Date: 2009/10/05(月) 21:18   No:40021     
Title: Re:クラスのプロトタイプ宣言    
すみません例えが悪かったですね・・

例えばボスのクラスと自機のクラスを作った場合は
ホーミングなどの関係で相互に見えていないといけません

しかし先に作成した方からは後に作成した方が見えません
なのでプロタイプ宣言的な事が必要になります

冷静に考えるとJustyさんの仰るとおり
メンバ関数の実態だけ後に持って来れば良かったんですが
その場合だとクラスの作成をズラーっと書いた後に
メンバ関数の実態をズラーっと書くことになって
少し管理しづらいんですよね・・

この方法でも良いんですが
他に良い方法は無いでしょうか?


222ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(434,722ポイント)   Date: 2009/10/05(月) 22:57   No:40026     
Title: Re:クラスのプロトタイプ宣言    

>その場合だとクラスの作成をズラーっと書いた後に
>メンバ関数の実態をズラーっと書くことになって

 1つのヘッダ(と cppソース)で1つのクラス、とまでは言いませんが、
関連するクラスだけを1つにまとめればさほど管理しにくくなるとは思えないですが、
じゃぁ、CAと CBの定義順を入れ替えてはどうですか?


 ところで、このクラスはヘッダに書いているのですか?
(ヘッダに書いて複数の cppで includeするとリンクラーが出そうな気がするんですが)


184ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(56,723ポイント)   Date: 2009/10/05(月) 23:18   No:40027     
Title: Re:クラスのプロトタイプ宣言    
>1つのヘッダ(と cppソース)で1つのクラス

今のところ選択画面以外は1つのヘッダで1つのクラスになっていますね・・

>関連するクラスだけを1つにまとめればさほど管理しにくくなるとは思えないですが

全部と言うわけではありませんがクラスは強い連鎖構造にあるので
クラスは全体の半分ぐらいのクラスと関連しています
なので無理がありますね・・

>じゃぁ、CAと CBの定義順を入れ替えてはどうですか?

あ〜違います違います
CAとCBは両方とも相手のメンバを呼び出せないとダメなんです

>ところで、このクラスはヘッダに書いているのですか?

と言うより最初のクラスのコンストラクタでDxLib_Initを呼んでいて
後続のクラスのコンストラクタで読み込みを行っているので
ヘッダに書くしかないんですよね・・

cppが複数あると初期化順番が不定になるので
上記の構造を実現するためにヘッダに処理をズラーっと書いて
main.cppで初期化順に全部includeしています


299ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(435,219ポイント)   Date: 2009/10/05(月) 23:45   No:40030     
Title: Re:クラスのプロトタイプ宣言    

>CAとCBは両方とも相手のメンバを呼び出せないとダメなんです

>その場合だとクラスの作成をズラーっと書いた後に
>メンバ関数の実態をズラーっと書くことになって

 なんという・・・。

 うーん、そりゃ言語的には

struct internalCA
{
    int a;
};
struct internalCB
{
    int b;
};

class CA
{
public:
    internalCA a;
    void test(internalCB &cb)
    {
        cb.b = 1;
    }
} A;

class CB
{
public:
    internalCB b;
    void test(internalCA &ca)
    {
        ca.a = 2;
    }
} B;

こんな感じに別のクラスを作って引数で渡したり、
或いはこんな感じに

extern int *pa, *pb;

class CA
{
public:
    int a;
    void test()
    {
        *pb = 1;
    }
} A;
class CB
{
public:
    int b;
    void test()
    {
        *pb = 2;
    }
} B;
int *pa = &A.a;
int *pb = &B.b;

ポインタを経由にするとか、手はあります。

 でもさすがに目的が目的だけに、これらはとてもお勧めはできません。


 普通にメンバ関数の定義を分けて書くのがいいでしょう。


# 理想を言えば、根本的にグローバル変数に頼った、或いは相互に依存した関係に
なっている設計全般を見直した方がいいかと思います。


497ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(56,749ポイント)   Date: 2009/10/06(火) 01:00   No:40033     
Title: Re:クラスのプロトタイプ宣言    
う〜んやはりメンバ関数の定義をわけるしかなさそうですね・・

今の所はグローバル変数は無いですね
まあクラスがグローバルだから同じような物ですが・・

しかし相互に依存しないで実現できるのでしょうか?
自機とボスなどは相互に依存するしかないような気がするのですが・・


2倍のポイントを手に入れた! 26ポイント を手に入れた。

Name: 組木紙織  ..比類無きプログラマー(71,470ポイント)   Date: 2009/10/06(火) 01:35   No:40034     
Title: Re:クラスのプロトタイプ宣言    
別に継承を使う必要もないのですが
話の流れからこうしたいだろうと予想したコード(かなりエスパー(笑))
判定系だけ分けてあげて、自機とボスは自分の動きに関する情報だけを扱ってあげればよいと
思います。


class Kitai
{
/*機体を扱う基底クラス*/
};

class Jiki :public Kitai
{
/*
自機の位置座標、HPなどなど
*/
};


class Boss:public Boss
{
/*
Bossの位置座標などなど
*/
};


int Hantei(Kitai & kitaiA, Kitai & kitaiB)
{
/*
ここで色々判定をする。
*/
};


284ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(56,914ポイント)   Date: 2009/10/06(火) 01:47   No:40036     
Title: Re:クラスのプロトタイプ宣言    
う〜ん少し違いますね・・
判定などは座標のメンバ変数などを引数に渡して行うと思います
むしろ連鎖と言うより参照が多いかもしれません

そういう事になるとメンバ変数が非公開にできないですかね
色々なパターンで参照するわけですから・・

例えばボスのクラスのパターン関係のメンバ関数の中で
弾のクラスの登録関係のメンバ関数を呼び出して
引数に自機クラスの座標関係のメンバ変数を渡すとか・・

直接やっても間接的にやっても
これは依存するしかないと思うんですけどね・・

そもそもクラス同士で判定などを行うんだから
何らかの形で依存するのは当然なんでしょうかね・・


165ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(434,715ポイント)   Date: 2009/10/06(火) 02:13   No:40037     
Title: Re:クラスのプロトタイプ宣言    

>相互に依存しないで実現できるのでしょうか?
>自機とボスなどは相互に依存するしかないような気がするのですが・

 どういう状況で相互に互いの情報が必要があるのか、によって
変わってきますが。

 例えば、自機・ボス各々が互いをホーミングで攻撃するために座標が
必要だったとしましょう。

 まず、自機からはボスのクラスを直接参照するようなことはないですよね。
 それだと汎用性がないですから。

 ここはエネミー(の抽象クラス)リスト、或いはターゲットオブジェクト(攻撃対象となる
マーカークラス)リストを取得し、その情報を元に対象となるエネミー・ターゲットを選び出して
ホーミングクラスを生成します。

 で、ボスの方はボスという存在が特殊なので、普通に自機を直接見てしまっても
いいかもしれませんが、ボス戦を管理するクラスか何かが自機の位置を取得してボスに通知するとか、
自機のターゲットオブジェクトを取得して、ボスに設定しておけばそのターゲットオブジェクトから
対象の位置を取得できるので自機のことを直接知らなくて済みます。

 他にも、コールバックを利用して情報を通知するなど、あくまで一例ですが、
互いを直接参照しなくても情報を得る手段はいろいろあります。


504ポイント を落としてしまった。

Name: Justy  ..伝説なるハッカー(435,171ポイント)   Date: 2009/10/06(火) 02:30   No:40039     
Title: Re:クラスのプロトタイプ宣言    

> 直接やっても間接的にやっても
> これは依存するしかないと思うんですけどね・

 ゲームのように相互に情報をやりとりするケースが多いことはたしかですが、
だからといって、末端同士が直接アクセスしあうのはさすがにそうそうないでしょう。


 一番判りやすい例だとコリジョン判定でしょうか。
 
 コリジョン判定なんかは自機やボス、弾、アイテムなどの情報を直接参照していたら
オブジェクトの種類が増える度に大変になるので、当然別のオブジェクトを介して
判定することになるはずです。

 なんらかの抽象化……例えばコリジョンオブジェクトをつくり、形状や属性、ヒット時の
コールバックなどの情報を一元化して管理するようにして、それをコリジョン判定クラスに登録、
属性的に判定を行う必要があるもの同士を総当たり的に判定し、接触しているなら
双方にどういう状況で何に当たったかなどの情報をコールバックで通知すれば
通知先が自機とかエネミーとか関係なく処理できます。


456ポイント を手に入れた。

Name: たいちう  ..プログラマー(34,081ポイント)   Date: 2009/10/06(火) 08:56   No:40040     
Title: Re:クラスのプロトタイプ宣言    
> 全部と言うわけではありませんがクラスは強い連鎖構造にあるので
> クラスは全体の半分ぐらいのクラスと関連しています

この設計がまずいのでしょう。
組木紙織さんの案などが参考になると思いますが、
どの点で無理だと思います?

あと、間違いを一応修正。
×:class Boss:public Boss
○:class Boss:public Kitai

> そういう事になるとメンバ変数が非公開にできないですかね

組木紙織さんの案の方向だと、継承させてprotectedにできます。

class Kitai {
  static int Hantei(Kitai & kitaiA, Kitai & kitaiB);
};


137ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(57,538ポイント)   Date: 2009/10/06(火) 17:13   No:40055     
Title: Re:クラスのプロトタイプ宣言    
>例えば、自機・ボス各々が互いをホーミングで攻撃するために座標が
>必要だったとしましょう。
>まず、自機からはボスのクラスを直接参照するようなことはないですよね。
>それだと汎用性がないですから。

あれ?これって汎用性が無かったんですか・・
でも参照する状況に応じてオブジェクト郡を作成するのは荷が重いので
例えば自機からボスへの角度を返す関数などを作って呼び出すのはどうでしょうか?
これなら何かあっても関数の中だけ変更すれば良いから許容範囲ではないでしょうか?

直接参照はダメなんでしょうかね・・
できるだけ現実世界に近い関係がベストだと思っていたので
ボスを狙うならボスを見るのが普通な気がするんですが
プログラムではそうも言っていられないのでしょうかね・・

>コリジョン判定なんかは自機やボス、弾、アイテムなどの情報を直接参照していたら
>オブジェクトの種類が増える度に大変になるので、当然別のオブジェクトを介して
>判定することになるはずです。

う〜んまあそうですが
オブジェクトにしたらオブジェクト関係を追加していかないといけないので
手間は同じような気もするんですけどね・・

これも荷が重いので座標などを引数に渡すと判定してくれる関数を作って各所で呼ぶのはどうでしょうか?
弾や敵のループ部分が増えるぐらいなら許容範囲にならないでしょうか・・

>この設計がまずいのでしょう。
>組木紙織さんの案などが参考になると思いますが、
>どの点で無理だと思います?

どこからを関連していると言うかは微妙ですが
とりあえずクラスの作成部分をコメントアウトしたらエラーが出る場合に関連していると解釈しています

しかしクラスなんだからどこかで呼び出されているはずなので
クラスは全て何かと関連している事になりますね・・

関連の強さの判断は難しいので中途半端に細工すると自爆しそうなんですよね・・

>組木紙織さんの案の方向だと、継承させてprotectedにできます

クラスの関連関係はどんどん増えていくので
継承はどこかで手詰まりになる可能性が高いので気が進みませんね・・


624ポイント を手に入れた。

Name: ねこ  ..熟練のプログラマー(43,921ポイント)   Date: 2009/10/06(火) 18:05   No:40056     
Title: Re:クラスのプロトタイプ宣言    
Justyさんも書いてるけど単純にクラス名.hとクラス名.cppで管理すればいいんじゃない?

45ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(57,676ポイント)   Date: 2009/10/06(火) 19:27   No:40057     
Title: Re:クラスのプロトタイプ宣言    
cpp分割は初期化順番が確定していないとダメなので無理ですね・・

クラス名.hは一応やっていますね
選択画面は散らかっていますが・・

当初の目的はメンバ関数の定義を全部後ろにずらす事でほぼ解決しているのですが
クラスの関係性に問題があるようです・・

そういえばJustyさんのサンプルを見て思ったんですが
extern宣言ってプロトタイプ宣言の代わりにもなるんですね
オブジェクトとインスタンスを宣言すれば別解になるかもしれません・・


138ポイント を手に入れた。

Name: バグ  ..ハッカー(170,863ポイント)   Date: 2009/10/06(火) 20:14   No:40058     
Title: Re:クラスのプロトタイプ宣言    
『初期化順番が不定だと困る』という設計を見直してはいかがでしょうか?と、解答者の皆さんは言われているんだと思いますよ。

当たり判定などの相互参照が必要な場合は、『自機クラスと敵機クラスの両方のオブジェクトを使用しなければならないクラス』にメンバ関数として実装すればよいだけでしょう?

できるだけ、他クラスに依存するような設計は避けるべきです。


94ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(57,951ポイント)   Date: 2009/10/06(火) 20:28   No:40059     
Title: Re:クラスのプロトタイプ宣言    
>『初期化順番が不定だと困る』という設計を見直してはいかがでしょうか?

全てのコンストラクタで初期化関数を呼べば
順番に影響されることは無いと思いますが
無駄にコードの量が増えるのでダメですね・・

コンストラクタで読み込みを行うメリットが大きすぎるので
そこは残したままで見直す必要がありますね・・

>『自機クラスと敵機クラスの両方のオブジェクトを使用しなければならないクラス』にメンバ関数として実装

これは良くわからないですね
そんなクラスがあるのでしょうか?

メンバ関数に実装しても
間接的に依存しているように見えるのですが・・

>できるだけ、他クラスに依存するような設計は避けるべきです

そういえば一般的にどういう状態を「依存」と言うのでしょうか?


275ポイント を手に入れた。

Name: ねこ  ..熟練のプログラマー(44,261ポイント)   Date: 2009/10/06(火) 20:58   No:40062     
Title: Re:クラスのプロトタイプ宣言    
<cpp分割は初期化順番が確定していないとダメなので無理ですね・・
これの意味が分からないんだけど・・・cppにはメンバ関数の処理内容を記述するだけで初期化関係無いよ。

今回の問題はA・Bお互いのクラスでお互いを参照する際にコンパイルが通らない、俗に言う「循環参照」のエラーじゃないの?
Justyさんの例のように下にずらずら書くと分かりずらいから分ければって言ってるんだけど。


後、もうちょっと具体的なソースを提示してみたらどうかな?
多分問題自体はちゃんとしたソースを提示すれば回答者の誰もが簡単に答えられる程度だと思うんだけど
それをしないでコード量が増えるとか管理がしづらいとか表現されてもそれについての解決法があっても答えられない。
個人的にはクラス定義上定石だと思われるようなコードを無駄と感じてるんじゃないかと思います。


340ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(58,509ポイント)   Date: 2009/10/06(火) 21:28   No:40066     
Title: Re:クラスのプロトタイプ宣言    
>これの意味が分からないんだけど・・・

インスタンスが作成される順番がバラバラになるって事でしょうかね・・

>俗に言う「循環参照」のエラーじゃないの?

循環参照ではないですね
前のクラスから後ろのクラスが見えないって事でしょうか・・

>Justyさんの例のように下にずらずら書くと分かりずらいから分ければって言ってるんだけど

冷静に考えると現状でも分けてはいますね・・
何がわかりにくいかと言うと
メンバ関数だけ他に書くのがわかりにくいです
まあこれを言うと本末転倒ですが・・

>後、もうちょっと具体的なソースを提示してみたらどうかな?

そうですね、他の問題も見つかるかもしれませんし・・
ですが問題になっている部分はまだ作っていないので
推測してもらうしかないですね・・

作ってから「こんなハズじゃなかった」って事にならないように質問させていただいたので・・

>多分問題自体はちゃんとしたソースを提示すれば回答者の誰もが簡単に答えられる程度だと思うんだけど

あれ?そうだったんですか?
1人で未知の分野に悩んでいたんですが・・
当初の「見えるようにする方法」は簡単かもしれませんが
新たに出てきた「連鎖を回避する良い方法」もパッと解決できるのでしょうか・・

>個人的にはクラス定義上定石だと思われるようなコードを無駄と感じてるんじゃないかと思います。

まさにそうです
定石ではあるけど個人的にしっくりこないので敬遠しています・・


558ポイント を手に入れた。

Name: ねこ  ..熟練のプログラマー(45,171ポイント)   Date: 2009/10/06(火) 22:42   No:40071     
Title: Re:クラスのプロトタイプ宣言    
>インスタンスが作成される順番がバラバラになるって事でしょうかね・・
>循環参照ではないですね
>前のクラスから後ろのクラスが見えないって事でしょうか・・
それボスから自機、自機からボスって仕組みにしたら相互参照になりますよ。
どういうイメージしてるんでしょう?ヘッダとcppに分けた場合の例を以下に記載します。

(A.h)
class B;
class A {
protected:
B* m_pB;
public:
// コンストラクタ
A();
};
(A.cpp)
#include "A.h"
// コンストラクタ
A::A()
{
m_pB = NULL;
}

(B.h)
class A;
class B {
protected:
A* m_pA;
public:
// コンストラクタ
B();
};
(B.cpp)
#include "B.h"
// コンストラクタ
B::B()
{
m_pA = NULL;
}

(main.cpp)
#include "A.h"
#include "B.h"
A g_A;
B g_B;


このように記述するとAからB、BからAを参照できる仕組みになっているのが分かるでしょうか?
チルチルさんのソースのようにヘッダだけに記述するとこのように相互参照出来ません。
自機からボスが見れ、ボスから自機が見れるようし、かつヘッダ定義の下に書きたくないならこうするしか手はありません。
なので、ヘッダとcppを分けましょうと言っています。ヘッダとcppが分かれる、というよりはヘッダはcppのための定義用おまけ、程度の認識にしたらどうでしょうか?
後、基本的にクラスヘッダはソリューションの一覧には出しません。cppだけ見れば分かるようにしておくのが理想だと思ってます。

<あれ?そうだったんですか?
<1人で未知の分野に悩んでいたんですが・・
<当初の「見えるようにする方法」は簡単かもしれませんが
<新たに出てきた「連鎖を回避する良い方法」もパッと解決できるのでしょうか・
こんなのはただの考え方の問題です。
クラス構造は基本的に樹木のような構成になります。
自機・ボスを枝先とするなら、枝の根本が必ずあります。根本では双方を参照できるため、相互的な処理はそこでしましょう、というのが各人からの意見です。
チルチルさんは根本を見ないで、枝先から枝先へ糸をつなげるような仕組みを作ろうとしてますよね?
だからオブジェクトが増えるたびに連鎖して参照が増えて・・・となってしまうわけです。
ちゃんとどこで処理するかを考えて構成すれば、クラス単位の無駄な参照は激減します。


858ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(58,932ポイント)   Date: 2009/10/06(火) 23:12   No:40078     
Title: Re:クラスのプロトタイプ宣言    
ヘッダの上で相手のクラス名が書かれている意味が良くわからないですね、extern宣言の代わりでしょうか?

メンバ関数はどこかで繋がっていればある程度見えなさそうな感じでも
見えるというのはなんとなくわかりますが・・

全体的に何をやっているかはピンと来ないですが
cppが違えばクラスの本体が複数あってもOKと言うのはわかりました
クラスのcppでメンバ関数と連結しておけばmain.cppで有効になるのは理解に手間取りそうです

これなら初期化順番は固定なので実装できない事は無いですね
理解できるかは怪しいですが・・

クラスが増えるたびに宣言とヘッダのインクルードが増えてしまいますが
これもヘッダにまとめてしまえば何とかなりそうですね
ヘッダの中でヘッダをインクルードするのは確かタブーですが
同じ事を何度も書く方がタブーでしょうかね・・

クラス構造は樹木なんですか・・
私はクラスに限らずオブジェクトはクモの巣のような構造で考えていたんですけどね・・

自機やボスが枝先としたら根本は何でしょうか?
双方を参照できると言ってもメンバを公開しておけば普通に参照できますからね・・
この場合は双方を参照するのが自然な立場って事でしょうか?
自機とボスって独立しているような気がしますが
これの根本って言うと・・世界クラスとでも言えば良いのでしょうか?

根本で双方を関連させれば自機とボスは依存していないように見えますが
その代わりに根本が自機とボスに依存する形になるような気がするのですが・・


423ポイント を手に入れた。

Name: バグ  ..ハッカー(170,915ポイント)   Date: 2009/10/06(火) 23:25   No:40080     
Title: Re:クラスのプロトタイプ宣言    
考え方が逆ですね。
根元へ行けば行くほどにオブジェクトはそれ1つで完結する独立したものになります。

そうしないと、機能をカプセル化する意味が全くありません。


52ポイント を手に入れた。

Name: ねこ  ..熟練のプログラマー(45,437ポイント)   Date: 2009/10/07(水) 00:40   No:40086     
Title: Re:クラスのプロトタイプ宣言    
<ヘッダの上で相手のクラス名が書かれている意味が良くわからないですね、extern宣言の代わりでしょうか?
こうしておかないとクラス定義時にAってのが何か認識されません。
Aの定義が後にある場合に仮に定義しておくことで「A* m_pA」が定義出来ます。

<根本で双方を関連させれば自機とボスは依存していないように見えますが
<その代わりに根本が自機とボスに依存する形になるような気がするのですが・・
根本は自機とボスの変数をどこに定義しているかによりますが、どちらもグローバル変数ならグローバル領域が根本、あるクラスのメンバー変数であればそのクラスが根本になります。
依存という単語を「相互依存」と考えていませんか?
配列で言えば配列変数が根本、値が枝先になります。根本からは枝先の値が見えますが、枝先からは配列の情報は見えません。こういう形の構成だってありえるわけです。


とりあえずここらで簡単に構成作ってみませんか?
全く手もつけてない状態で分からない分からないと言われてもこちらも限界があります。
最初から完璧な構成なんてできっこないので、作りつつ自分の理想に近づくように修正してみてください。


92ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(58,655ポイント)   Date: 2009/10/07(水) 01:00   No:40088     
Title: Re:クラスのプロトタイプ宣言    
>根元へ行けば行くほどにオブジェクトはそれ1つで完結する独立したものになります

そうなんですか?
根本の独立性が高いって事は枝先を参照できないって事になる気がするんですが・・

根本に行くほど独立していると言う事は
枝先は独立性が低くなるって事になる気がするんですが
それだと枝先同士で参照する方が良いって事になってしまいます・・

バグさんの回答を入れると良くわからなくなってしまったのですが
とりあえずねこさんの回答から解釈してみると

枝先クラスは根本クラスだけを連鎖すれば良いって事でしょうか?

そして根本クラスは枝先クラスを参照すれば良いのでしょうか?

>とりあえずここらで簡単に構成作ってみませんか?

例えば

枝先クラスとして自機クラスとボスクラスがあり
根本クラスとして世界クラスがあります
自機クラスとボスクラスは世界クラスを見ています
世界クラスは自機クラスとボスクラスを見ています
自機クラスとボスクラスはお互いを見ていません

自機クラスがボスへの角度を知りたくなった場合は
世界クラスのメンバである「自機からボスへの角度を返す関数」を呼び出す
世界クラスのメンバ関数は自機クラスとボスクラスを参照して角度を求めて戻り値として返す
自機クラスが角度を受け取る

根本で相互的な処理をするってこういう事でしょうか?

他のクラスの事が知りたくなったら自分で見に行くんじゃなくて
根本クラスに聞いてみれば良いって言う事になり
枝先クラスは他のクラスに直接的に依存する事は無くなるので
枝先クラスの中では根本クラス以外の連鎖も参照も必要無くなって
根本クラスの中でだけ連鎖と参照が増えて行くという事になる

しかし根本クラスは単体では完結してくれないですね
関連の種類だけメンバ関数が必要になりますし・・

>依存という単語を「相互依存」と考えていませんか?

自分のクラス内で相手のクラスのメンバを呼び出したら自分は相手に依存していると解釈していますが・・
配列変数は値を呼び出せるので値に依存していると言う事になってしまいますが
さすがにこれは少し違う気がしますね・・

相手のクラスを消したら自分のクラス内で「未定義のシンボル・・・」がでる状態を
依存していると呼ぶのは間違っているのでしょうか・・


277ポイント を落としてしまった。

Name: チルチル  ..熟練のプログラマー(58,731ポイント)   Date: 2009/10/07(水) 01:20   No:40089     
Title: Re:クラスのプロトタイプ宣言    
でも良く考えたら

枝先クラスは根本クラスのメンバ関数を連鎖して

根本クラスは枝先クラスのメンバ変数を参照するので

これは相互依存になるんでしょうか?


76ポイント を手に入れた。

Name: ねこ  ..熟練のプログラマー(45,521ポイント)   Date: 2009/10/07(水) 01:22   No:40090     
Title: Re:クラスのプロトタイプ宣言    
構成ってのは実際に作ってみてコンパイルして関数を作ってみて実行してみて、って意味合いね。
実際に作れば何が良くてどういう問題が起こりえて定義方法に不都合が生じるのかが掴めると思いますので。


84ポイント を手に入れた。

Name: たいちう  ..プログラマー(34,301ポイント)   Date: 2009/10/07(水) 12:45   No:40102     
Title: Re:クラスのプロトタイプ宣言    
ねこさんに同意。

今までの流れで判断すると、チルチルさんはクラス設計というものを理解していません。
だからこそ、ここで質問しているのであって、もちろん構わないのですが、
「独立」とか「連鎖」とか「依存」とかいう言葉についても、
多くの回答者とは違う使い方・理解をしているようです。

チルチルさんは十分先の見通しが立ってから着手したいようですが、
今は試行錯誤で理解を深めるのが良いと思います。
ソースコードを伴った具体的な質問の方が説明もしやすいし、
理解もしやすいでしょう。


とりあえず「自機」と「ボス」だけ(必要なら「世界」等も)を定義して、
「自機」から見た「ボス」の角度を求める関数を作ってみてはどうでしょうか。
その上でなら、「雑魚」や「雑魚2」を追加する時どうなるのか、
具体的に議論できると思いますが。


2倍のポイントを手に入れた! 220ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(59,143ポイント)   Date: 2009/10/07(水) 18:20   No:40109     
Title: Re:クラスのプロトタイプ宣言    
>クラス設計というものを理解していません

何か一般的な定石があるのでしょうか?

>「独立」とか「連鎖」とか「依存」とかいう言葉についても、
>多くの回答者とは違う使い方・理解をしているようです。

一般的にはどういう意味なんでしょうか?

>とりあえず「自機」と「ボス」だけ(必要なら「世界」等も)を定義して、
>「自機」から見た「ボス」の角度を求める関数を作ってみてはどうでしょうか

作ってみました、関数と言うかメンバ関数ですが・・
自機やボスの知らない所で世界がメンバを操作すると言う構造になりました

世界が消えたら正常には動きませんが
自機とボスで「未定義のシンボル・・・」は出なくなりましたね

でも自機とボスが消えたら世界で「未定義のシンボル・・・」とかが出ますから
こういうのを依存と言うのでしょうかね・・

枝先が根本に聞くんじゃなくて
根本の方で一方的に回答を押し付ける感じになっています
でも枝先はその為のポストがどんどん必要になりますね
こうなると移動パターンなどは世界の方でやった方が良くなってしまいます・・

根本に行くほどクラスは単体で完結するらしいですが
相互的な処理を根本でやったら単体で完結してくれないんですが・・

>その上でなら、「雑魚」や「雑魚2」を追加する時どうなるのか、

今回の場合だと世界クラスの中身が増えて行きますかね・・


412ポイント を手に入れた。

Name: MNS  ..上級者(17,757ポイント)   Date: 2009/10/07(水) 18:43   No:40110     
Title: Re:クラスのプロトタイプ宣言    
friendはダメですよ。せっかくのカプセル化のメリットが失われてしまいます。

自機から世界が見えていたほうがいいのか、などという問題は、
時と場合によっても、個人の好みによっても変わってくるので、
それらに難癖は付けられませんが、
"包含"というものを使うことをオススメします。

私はそういう依存やら根本やらなどの単語は良くしらないのですが、
今の状況だと自機もボスも世界もみんな、いわゆる枝先になってはいませんか?
現実に置き換えると、世界というものが自機やボスを包含する、
つまり世界が自機やボスのインスタンスを持つ、という構造になりますが、
そうすると、世界が根本、自機やボスが枝先、となると思います。
また、こういう構造であれば自機がボスに直接アクセスすることは出来なくなり、
いっそうクラスの関係がシンプルなものになるとは思いませんか?


183ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(59,765ポイント)   Date: 2009/10/07(水) 19:38   No:40111     
Title: Re:クラスのプロトタイプ宣言    
>friendはダメですよ。せっかくのカプセル化のメリットが失われてしまいます。

あ〜やっぱり無理がありましたか・・
これは見直しが必要ですね

>自機から世界が見えていたほうがいいのか、などという問題は、
>時と場合によっても、個人の好みによっても変わってくるので、

枝先と根本が相互に見えていても良いんでしょうか?
それなら根本に聞いてみるという実装の仕方でも良いかもしれませんが
枝先の中に根本が連鎖する事になってしまいますね
まあ根本が消えたらどっちみち正常に動かないんだから別に関係ない気もしますが・・

>"包含"というものを使うことをオススメします。

やっぱり包含の方が良いんでしょうかね・・
根本クラスのコンストラクタで前処理ができなくなりますが
専用のクラスを追加するぐらいなら問題無さそうですね
インスタンス順番は固定のようですし・・

>今の状況だと自機もボスも世界もみんな、いわゆる枝先になってはいませんか?

なっていますね・・
直感的であるというのは重要のようです・・

>現実に置き換えると、世界というものが自機やボスを包含する、

やはり一番直感的なのは包含でしょうかね・・
枝先が根本クラスのメンバを呼び出す時にインスタンス名が不要になる気もしますし・・

>また、こういう構造であれば自機がボスに直接アクセスすることは出来なくなり、
>いっそうクラスの関係がシンプルなものになるとは思いませんか?

クラスの関係に現実的に見えないという強制力が付くので良いですね
しかし包含同士はお互いが見えないんですね
この辺は良く知らないのでどこからどこが見えるのかを勉強しないと・・

同じ世界に住んでいるのにお互いが直接見えないのも変な気がしますが
現実でも光を介して見ているんだから納得できない事も無いかな・・

包含の場合は枝先から根本が見える事が確定していますから悩む必要は無さそうですね
枝先から根本への連鎖を作るかは迷いますが・・

でも良く考えたらコンストラクタを包含するメンバクラスより上に書けば前処理も可能ですね・・


622ポイント を手に入れた。

Name: 組木紙織  ..比類無きプログラマー(72,116ポイント)   Date: 2009/10/07(水) 22:59   No:40132     
Title: Re:クラスのプロトタイプ宣言    
たいちうさんありがとございますサンプルコードを直していただいて。
全然気づきませんでした。




少しだけ添付されたコードを眺めただけなのですが、違和感満載な感じがしました。
たぶん以下のリンク先が参考になるかと。

C++で読むデザインパターン(Design Patterns read by C++)
ttp://www.01-tec.com/document/cpp_design_pattern.html

Head Firstデザインパターン―頭とからだで覚えるデザインパターンの基本 (単行本)
http://www.amazon.co.jp/Head-First%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E2%80%95%E9%A0%AD%E3%81%A8%E3%81%8B%E3%82%89%E3%81%A0%E3%81%A7%E8%A6%9A%E3%81%88%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF-%E3%83%95%E3%83%AA%E3%83%BC%E3%83%9E%E3%83%B3/dp/4873112494/ref=sr_1_7/375-9022407-5568127?ie=UTF8&s=books&qid=1254923049&sr=8-7


2倍のポイントを手に入れた! 646ポイント を手に入れた。

Name: たいちう  ..プログラマー(34,640ポイント)   Date: 2009/10/08(木) 08:56   No:40153     
Title: Re:クラスのプロトタイプ宣言    
> 何か一般的な定石があるのでしょうか?

将棋で駒の動かし方を知っているだけの人よりも、
定石を覚えた人の方がずっと強いでしょう。
プログラミングでは駒の動かし方が文法、
デザインパターンなどが定石の一つと言えるでしょう。
但し将棋と同様に正解はありません。
機械的に定石を覚えるよりも、何故この一手が良いとされるのかを
理解するように努力しましょう。


> 同じ世界に住んでいるのにお互いが直接見えないのも変な気がしますが
> 現実でも光を介して見ているんだから納得できない事も無いかな・・

現実世界の全てをモデル化して計算することは不可能です。
必要最低限の部分のみを再現しましょぅ


継承を使って書きなおしてみました。
コンパイルを通るようにしてみてください。
class Kitai {

protected:
float x;
float y;
public:
float getAngle(const Kitai *target) {
return atan2(target->y - y, target->x - x);
}
virtual void Run() = 0;
virtual void SetAngle() = 0;
};

class Player : public Kitai {
float bossAngle;
public:
void Run() {
//
}
void SetAngle() {
bossAngle = getAngle(world.getBoss());
}

// その他必要なもの
};

class Boss : public Kitai {
// その他必要なもの
};

class World {
Kitai* player;
Kitai* boss;

public:
World() {
player = new Player();
boss = new Boss();
}

Kitai* GetBoss() {
return boss;
}

void Run() {
Player.SetAngle();
Player.Run();
Boss.Run();
}
};

手を抜いてクラス宣言に実装を書いていますので、hとcppとに分割してください。


339ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(60,400ポイント)   Date: 2009/10/08(木) 09:57   No:40156     
Title: Re:クラスのプロトタイプ宣言    
ポインタを使った包含の方が良いんでしょうかね?

継承を使うのはピンと来ませんがテンプレートの代わりにはなるかもしれませんね

抽象クラスについては勉強が必要のようです・・

ボスのメンバの値が直接知りたい場合は
GetBossX(),GetBossY(),GetBossAngle()とかをいちいち作るんでしょうか?
ポインタを返してもらってGetBoss()->X;とかの方が簡単ですが
ボスが見えないけど意識していると言う事になってしまいますね
まあ、そういうメンバはすでにあるんだから関係ない気もしますが・・

そういう意味だとPlayer.SetAngleは汎用的ではないから必要ないかもしれませんね
直接ボスを参照しなければ世界を通してボスを参照しても大丈夫かも・・

自機とかボスとかは良いとして弾とかはどうしましょうか?
弾クラス内で線形リストを作るのと世界クラス内で弾クラス線形リストを作るのが考えられますが・・

どちらかというと前者の方が良さそうですね、たいちうさんのサンプルを見る限りは
1つの相互処理を行う為に各クラスごとにいちいち関数を作るのは一般的のようですし

ボスクラス内で「弾を登録するメンバ関数」を呼び出して
その中で世界クラスの「弾を登録するメンバ関数」を呼び出して
その中で弾クラスの「弾を登録するメンバ関数」を呼び出す

前者だと弾から弾を登録する場合に世界を通す必要が無いですからね
まあ継承が使えなくなってしまいますが・・

そのままサンプルを使ったら勉強にならないので見ながら作ってみます


635ポイント を手に入れた。

Name: conio  ..熟練のプログラマー(57,398ポイント)   Date: 2009/10/08(木) 10:11   No:40157     
Title: Re:クラスのプロトタイプ宣言    

継承を使うのならば、基底クラスのポインタの配列にした方が良いのではないのでしょうか。
もしくはlistを使うとか。
------------------------
list<Kitai*> CharaList;
------------------------

そうしないと、オブジェクトが増えるごとにゴチャゴチャしてしまいます。
---------------------------------------------
class World {
Kitai* player;
Kitai* boss;
Kitei* item;
Kitei* Zako;
Kitei* Bullet;

public:
World() {
player = new Player();
boss = new Boss();
item = new Item();
Zako = new Zako();
Bullet = new Bullet();
}

Kitai* GetBoss() {
return boss;
}

void Run() {
Player.SetAngle();
Player.Run();
Boss.Run();
iten.Run();
Zako.Run();
Bullet.Run();
}
};
---------------------------------------------
あと、上記のコードではデストラクタが無いのでメモリリークしてしまいます。

>>チルチルさん
参考になればと。
http://www.tnksoft.com/reading/classgame/


473ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(60,876ポイント)   Date: 2009/10/08(木) 10:36   No:40160     
Title: Re:クラスのプロトタイプ宣言    
>list<Kitai*> CharaList;

これって標準ライブラリの一種でしたっけ?
線形リスト系は手動でやりたいです・・

>基底クラスのポインタの配列

手動でやるとどんな感じでしょうか?

>Kitai* player;
>player = new Player();

継承については良く知りませんが
KitaiクラスのポインタだとPlayerクラスで追加したメンバにアクセスできない気がするんですが・・

>あと、上記のコードではデストラクタが無いのでメモリリークしてしまいます。

あ〜それ私も思いました・・

>そうしないと、オブジェクトが増えるごとにゴチャゴチャしてしまいます。

やっぱりポインタで包含した方が良いんでしょうか?
本体もゴチャゴチャしそうですが
相互処理の関数の方が多いのでゴチャゴチャしそうですね・・
その辺を短くまとめる良い方法とかないでしょうか?

>参考になればと。

さっそく見てみます


2倍のポイントを手に入れた! 476ポイント を手に入れた。

Name: conio  ..熟練のプログラマー(58,477ポイント)   Date: 2009/10/08(木) 11:15   No:40163     
Title: Re:クラスのプロトタイプ宣言    
>>>list<Kitai*> CharaList;
>>これって標準ライブラリの一種でしたっけ?
>>線形リスト系は手動でやりたいです・・
自分で実装しても勿論問題ありません。

>>>基底クラスのポインタの配列
>>手動でやるとどんな感じでしょうか?
---------------------------
Kitei* Object[20];
int Max = 0;
Object[Max++] = new Player;
Object[Max++] = new Boss;
Object[Max++] = new Zako;

for(int i = 0; i < Max; i++)
Object[i].Run();
---------------------------
こんな感じです。
まぁ、この場合は動的確保などもしていないので、オブジェクトの削除や追加が自由に出来ません。
単純に、実行したいオブジェクトが固定だと決めている場合の時のみに限ります。


>>>Kitai* player;
>>>player = new Player();

>>継承については良く知りませんが
>>KitaiクラスのポインタだとPlayerクラスで追加したメンバにアクセスできない気がするんですが・・
KiteiクラスがPlayerクラスのメンバを直接操作するのではありません。
それぞれのオブジェクトのpublicな関数(上記だとRun関数)を呼び出し、
その関数内で、メンバなどの操作をします。
あくまでも、メンバを扱うのはそのメンバを持っているクラスです。
以前のコードでも、直接メンバを操作している部分は無いはずです。


>>>そうしないと、オブジェクトが増えるごとにゴチャゴチャしてしまいます。
>>やっぱりポインタで包含した方が良いんでしょうか?
>>本体もゴチャゴチャしそうですが
>>相互処理の関数の方が多いのでゴチャゴチャしそうですね・・
>>その辺を短くまとめる良い方法とかないでしょうか?

全てのオブジェクトを管理するクラスを作っておき、そのクラスに対して
---------------------------------------------------------------------------------------
・"Boss"というオブジェクトは登録されてますか?登録されていたら教えてください
・"Enemy"というオブジェクトは登録されていますか?登録されている全ての"Enemy"オブジェクトを
 順次教えてください
---------------------------------------------------------------------------------------
このように、命令を出してやればいいと思います。
直接オブジェクトを参照するのではなく、一元管理しているクラスがオブジェクトを探し出し、
オブジェクトがあれば そのオブジェクトの情報を取得して処理をする、という方法です。

先ほど提示したサイトに詳しく載っているので参考にされると良いと思います。
(ただし理解するのには、骨が折れるかもしれません)


1,079ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(61,015ポイント)   Date: 2009/10/08(木) 11:39   No:40164     
Title: Re:クラスのプロトタイプ宣言    
>自分で実装しても勿論問題ありません。

クラスの線形リストってどうやって作るのでしょうか?

>まぁ、この場合は動的確保などもしていないので、オブジェクトの削除や追加が自由に出来ません。

ん?実行中に新たにインスタンスを作成する機会ってあるのでしょうか?

>それぞれのオブジェクトのpublicな関数(上記だとRun関数)を呼び出し、

ああ確かにRunは継承元で宣言されていますね
しかしメンバなどの操作とはメンバの値を調べる事も含まれるのでしょうか?
座標が知りたいのに角度その他まで返されると困ってしまうのですが・・

>全てのオブジェクトを管理するクラスを作っておき

え〜と・・この場合は世界ですよね?

>"Boss"というオブジェクトは登録されてますか?登録されていたら教えてください

これは
「"Boss"というクラスがあるのは知っていますが、インスタンスされているか教えてください」って事でしょうか?

それとも
「"Boss"というクラスは存在するのでしょうか?存在するとしたらインスタンスされていますか?」って事でしょうか?

>そのオブジェクトの情報を取得して処理をする

情報はどんな形で渡されるのでしょうか?
ポインタだとしたら、とりあえずRun関数はあると思うから呼ぼうって事になるのでしょうか?

>あくまでも、メンバを扱うのはそのメンバを持っているクラスです。

ではやはりGetBossX(),GetBossY(),GetBossAngle()とかをいちいち作るんでしょうか?


449ポイント を落としてしまった。

Name: MNS  ..上級者(18,313ポイント)   Date: 2009/10/08(木) 12:04   No:40165     
Title: Re:クラスのプロトタイプ宣言    
> クラスの線形リストってどうやって作るのでしょうか?
線形リストが持つ値をクラスにすればいいだけでしょうが、
そもそも線形リストが持つ機能といいますか、メリットデメリットをご存知でないのなら、
std::listを一度触れてみても良いと思います。

> ん?実行中に新たにインスタンスを作成する機会ってあるのでしょうか?
もちろんあります。例えば、弾のインスタンスは、弾を発射する時に作成すればよいです。
むしろ、それを行わないのなら、線形リストを使う必要はありません。

> しかしメンバなどの操作とはメンバの値を調べる事も含まれるのでしょうか?
基底クラスで共通したメンバを持つのならば、(座標、角度など)
そのメンバの値を返す関数などを基底クラスで定義すればよいです。

> これは
> 「"Boss"というクラスがあるのは知っていますが、インスタンスされているか教えてください」って事でしょうか?
> それとも
> 「"Boss"というクラスは存在するのでしょうか?存在するとしたらインスタンスされていますか?」って事でしょうか?
おそらく前者でしょう。

> 情報はどんな形で渡されるのでしょうか?
> ポインタだとしたら、とりあえずRun関数はあると思うから呼ぼうって事になるのでしょうか?
ポインタでも良いですし、参照でも良いでしょう。
いずれにせよ、呼び出せるメンバはpublicなもののみです。
例えば、敵が自機に向かって弾を撃つ処理を書くとき、
敵はいわゆる世界クラスに自機の情報を問い合わせ(これでポインタが返ってくるとして)
GetPosなど、座標を返すパブリックな関数を作っておき、
その関数から自機の座標を取得し、弾を撃ちます。

>ではやはりGetBossX(),GetBossY(),GetBossAngle()とかをいちいち作るんでしょうか?
ボスが何か基底クラス(座標、角度などが定義されているもの)を継承しており、
基底クラスでGetPosやGetAngleなどの関数が定義されていれば、
いちいちボスに対しそのような関数を作る手間は省けると思います。
もちろん、ボスで新たに定義されたメンバに対しては、それに応じた新たなアクセサを作る必要がありますが。


556ポイント を手に入れた。

Name: たいちう  ..プログラマー(35,129ポイント)   Date: 2009/10/08(木) 12:33   No:40166     
Title: Re:クラスのプロトタイプ宣言    
> ポインタを使った包含の方が良いんでしょうかね?

クラスWorldは、その名前からして全てのインスタンスを
所有したいものと思いました。
一方、Worldが全てのクラスの詳細を意識しないといけないと、
Worldのソースコードが膨れ上がります。
WorldはPlayerやBossの詳細は気にせず、複数のKitaiを扱います。
World.hで、Player.hやBoss.hをインクルードしないで済むように、
ポインタでPlayerやBossのインスタンスを管理する方法を書きました。

今までのやり取りからは、私にはこれが一番自然と感じられますが、
他の方法も可能です。どんな方法でも良いというわけではありませんが。


> 継承を使うのはピンと来ませんがテンプレートの
> 代わりにはなるかもしれませんね
>
> 抽象クラスについては勉強が必要のようです・・

まだ駒の動かし方を知らないということです。
龍や馬のように強力ですので、是非身につけてください。


> ボスのメンバの値が直接知りたい場合は
> GetBossX(),GetBossY(),GetBossAngle()とかをいちいち作るんでしょうか?
> ポインタを返してもらってGetBoss()->X;とかの方が簡単ですが
> ボスが見えないけど意識していると言う事になってしまいますね
> まあ、そういうメンバはすでにあるんだから関係ない気もしますが・・
>
> そういう意味だとPlayer.SetAngleは汎用的ではないから必要ないかもしれませんね
> 直接ボスを参照しなければ世界を通してボスを参照しても大丈夫かも・・

質問が散漫で何を聞きたいのか分かりません。
投稿前に読み直して、自分の考えを正しく伝える努力をもっとして下さい。

1つ言えるのは、ボスのメンバの値を誰が知りたいのか、という問題です。
カプセル化を意識して、この情報はどのクラスが持つか、公開するべきか、
この情報で計算するのはどのクラスであるべきか、を考えます。

もしも、World::GetBossX()のような関数を作り、Player::Run()から
呼び出すことを考えていたのならば、これは多分間違いでしょう。
せめてKitai::GetX()にしましょう。
Player::Run()の中で、Boss::xが何故必要なのかを具体的に書いてくれれば、
より良い設計を提示できると思います。


> そのままサンプルを使ったら勉強にならないので見ながら作ってみます

そのままだとコンパイルも通らないし、conioさんご指摘の問題もあるし、
十分勉強になると思いますけどね。まぁご随意に。


489ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(61,599ポイント)   Date: 2009/10/08(木) 12:58   No:40167     
Title: Re:クラスのプロトタイプ宣言    
>線形リストが持つ値をクラスにすればいいだけでしょうが、

あ〜やっぱりそうですか・・
値はKitei*でしょうかね?
多分これだと派生クラスで追加したメンバは見えないですから
派生クラスで追加するメンバは全部privateで良いんでしょうか?

>そもそも線形リストが持つ機能といいますか、メリットデメリットをご存知でないのなら、

何となくはわかっていると思うんですけどね・・
個人的には「Boss.」とかが「P->」になって式が短くなるのが一番のメリットでした・・

>もちろんあります。例えば、弾のインスタンスは、弾を発射する時に作成すればよいです。
>むしろ、それを行わないのなら、線形リストを使う必要はありません。

やはり
>弾クラス内で線形リストを作るのと世界クラス内で弾クラス線形リストを作るのが考えられますが・・
これで後者を選んだ場合は必要ですね

前者の場合は必要ないですが、弾が他の弾を参照できるのはマズイでしょうか?

>そのメンバの値を返す関数などを基底クラスで定義すればよいです

と言う事は派生クラスで追加した変数や関数はどうやって利用するのでしょうか?

>GetPosなど、座標を返すパブリックな関数を作っておき、

では自機の座標が知りたい場合は
float X=GetPlayer()->GetX();
見たいな感じになるのでしょうか?

>もちろん、ボスで新たに定義されたメンバに対しては、それに応じた新たなアクセサを作る必要がありますが。

アクセサってメンバ関数とかでしょうか?
Kitei*では追加した関数が見えないと思うのですが・・

>World.hで、Player.hやBoss.hをインクルードしないで済むように、

ああなるほど共通しているKiteiだけ見るならKiteiの使い方だけ知っていれば良いと言う事ですか

>1つ言えるのは、ボスのメンバの値を誰が知りたいのか、という問題です。

自機がボスの座標を知りたい場合に
GetBossX();とするか
GetBoss()->X;とするかでしょうかね・・

でも確かに
GetBoss()->GetX();とか
GetX(GetBoss());の方が良さそうですね・・

>そのままだとコンパイルも通らないし

そういえばそうでしたね・・
やはり見ながら通るように作らないと・・

しかし世界クラスがポインタを共通しているKitei*で持っていると
派生クラスで追加したメンバ関数とかにアクセスできないですね・・
そういうのは共通しているRunとかの中で内部だけで解決できるようにするのでしょうか?


584ポイント を手に入れた。

Name: conio [URL]  ..熟練のプログラマー(59,482ポイント)   Date: 2009/10/08(木) 13:03   No:40168     
Title: Re:クラスのプロトタイプ宣言    

>>>自分で実装しても勿論問題ありません。
>>クラスの線形リストってどうやって作るのでしょうか?
ノードの中のデータをintにすればint型の線形リストになりますし、
ノードの中のデータをfloatにすればfloat型の線形リストになります。

同じように、ノードの中のデータを基底クラスのポインタにすれば、クラスの線形リストになります。
それだけのことです。 難しく考える必要はありません。

>>>まぁ、この場合は動的確保などもしていないので、オブジェクトの削除や追加が自由に出来ません。
>>ん?実行中に新たにインスタンスを作成する機会ってあるのでしょうか?
インスタンスを作成したいのであれば、
インスタンスを作成する関数を作って、その関数を呼べばよいのではないのでしょうか。
作成する機会を作りたいのなら、自分で作成する機会を作ればいいのです。
---------------------------------------------------------
void AddObject(Kitai* m){
if(Max < 20){
Object[Max++] = m;
}
}
---------------------------------------------------------
既に述べたように、単純に追加する処理しかしていないので、オブジェクトが20を超えると
追加が出来なくなりますし、削除する機能もありません。
「自由自在に削除や追加が出来ない」と言ったのはそういう意味です。

ともかく、削除や追加を自由に出来る様にしたいのならば、配列ではなくリスト構造にすればいいかと。

>>ああ確かにRunは継承元で宣言されていますね
>>しかしメンバなどの操作とはメンバの値を調べる事も含まれるのでしょうか?
>>座標が知りたいのに角度その他まで返されると困ってしまうのですが・・
オブジェクトを戻り値として受け取って、それからメンバアクセス演算子などでアクセスすればいいと思います。
-------------------------------------------------
・角度を受け取る関数
・位置を受け取る関数
・●●を受け取る関数
     :
     :
-------------------------------------------------
と言う風にしたら、メンバを追加した文だけそのメンバを取得する関数が増えることになりますし、
明らかに無駄です。

ポインタで受け取って、アロー演算子で特定のメンバを調べるなりした方がいいと思います。

-----------------------------------------
Enemy* e;
e = Enemy型のポインタを返す関数();

e->PtX
e->PtY
など。
-----------------------------------------

>>これは
>>「"Boss"というクラスがあるのは知っていますが、インスタンスされているか教えてください」って事でしょうか?
>>それとも
>>「"Boss"というクラスは存在するのでしょうか?存在するとしたらインスタンスされていますか?」って事でしょうか?
先ほどのコードだと基底クラス型のポインタの配列 Object[20]がありましたよね?
その配列の中に、派生クラスBossが入れられている場所を探し、見つかればそのポインタを返す、
と言う処理だと思って下さい。

>>>あくまでも、メンバを扱うのはそのメンバを持っているクラスです。
>>ではやはりGetBossX(),GetBossY(),GetBossAngle()とかをいちいち作るんでしょうか?
違います。
既に述べたように、メンバごとに関数を作るようにすると、メンバの数だけ関数が増えます。
オブジェクトのポインタを受け取って、そのポインタを通じてメンバを調べるなりした方が良いと思います。

ついでに、当たり判定などは
Playerクラス、Enemyクラスなどの内部で行うのではなく、
それらを一元管理するクラスの方で行った方が良いでしょう。

http://www.tnksoft.com/reading/classgame/zissen/00/005.php
当たり判定についてはここら辺で解説しているので、コレを参考にして下さい。
こちらでは書きません。
(長くなりますし、2度手間になってしまいます。)


1,005ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(62,249ポイント)   Date: 2009/10/08(木) 13:36   No:40169     
Title: Re:クラスのプロトタイプ宣言    
>ポインタで受け取って、アロー演算子で特定のメンバを調べるなりした方がいいと思います。

なるほど、言われてみればその通りですね
継承のおかげで安全性も増している事だし・・

>Enemy型のポインタを返す関数();

これだとボスのクラスに自機やザコのクラスの宣言が見える必要がある気がするんですが・・

>その配列の中に、派生クラスBossが入れられている場所を探し、見つかればそのポインタを返す、

どうやって探すのでしょうか?
世界クラスは基底クラスの構造しか知らないようですが・・

>それらを一元管理するクラスの方で行った方が良いでしょう。

サイトは良くわかりませんでしたが
世界クラスの中で自機とボスのポインタから座標にアクセスして
当たっているか判断すれば良いって事でしょうか?
自機からすると「世界から何かに接触したと言う連絡があったので残機を減らそう」って事でしょうか?
メンバの変更はクラス内でやるべきだから世界は当たっているかだけ連絡して
残機を減らす処理は自機クラス内にそういうメンバ関数を定義するべきでしょうか?

>ともかく、削除や追加を自由に出来る様にしたいのならば、配列ではなくリスト構造にすればいいかと。

う〜ん弾が他の弾を自由に参照できても良いかによりますね・・

>オブジェクトを戻り値として受け取って、それからメンバアクセス演算子などでアクセスすればいいと思います

派生クラスで追加した変数とか関数にアクセスしたい時はどうすれば良いのでしょうか?


650ポイント を手に入れた。

Name: skyblue  ..ぴよぴよ(18ポイント)   Date: 2009/10/08(木) 15:26   No:40171     
Title: Re:クラスのプロトタイプ宣言    
ヘッダーファイルの自動生成ならたぶんこれ↓
http://www.vector.co.jp/soft/win95/prog/se324412.html

関係ないかもしれませんが。
シューティングで簡単なものだったら、
配列と関数を使って、それぞれの処理ごとに関数を作ればいい。(座標を使ってあたり判定を行う)
そうすればボス(自機)が動いたときに自機(ボス)を動かす処理を作ればいいのと思います。
main関数で呼び出しだけ。そうすれば、ファイルを分けなくても、cpadなら関数にジャンプできますし。
変数を配列の変わりに、ポインタを使う手もありますが。


18ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(62,380ポイント)   Date: 2009/10/08(木) 15:39   No:40173     
Title: Re:クラスのプロトタイプ宣言    
う〜ん環境うんぬんは現状で良いでしょうかね・・

>配列と関数を使って、それぞれの処理ごとに関数を作ればいい。(座標を使ってあたり判定を行う)
>そうすればボス(自機)が動いたときに自機(ボス)を動かす処理を作ればいいのと思います。

すいません・・
これの意味がさっぱりわからないです
どういう事か詳しく説明してください・・


131ポイント を手に入れた。

Name: conio [URL]  ..熟練のプログラマー(60,733ポイント)   Date: 2009/10/08(木) 16:07   No:40175     
Title: Re:クラスのプロトタイプ宣言    

>>>その配列の中に、派生クラスBossが入れられている場所を探し、見つかればそのポインタを返す、
>>どうやって探すのでしょうか?
>>世界クラスは基底クラスの構造しか知らないようですが・・
typeid演算子を使えば、基底クラス型のポインタにどのオブジェクトが入っているかを
調べる事ができますよ。
あと、名前と基底クラス型のポインタを構造体にしてしまっておいて、名前で検索するという事も出来ます。
----------------------
typedef struct{
string name; //名前
Kitei* Object; //基底クラス型のポインタ
}ObjectList;

ObjectList Object[20];
----------------------
みたいな。

>>サイトは良くわかりませんでしたが
>>世界クラスの中で自機とボスのポインタから座標にアクセスして
>>当たっているか判断すれば良いって事でしょうか?
「よく分からなかった。」で諦めるのではなく理解できるまで頑張ってみてはどうでしょうか。
よく分からない→質問する→やっぱりよく分からない→質問する→それでもよく分からない→質問する
の繰り返しになって、半永久的に理解が進まない可能性があります。

よくあるのが、下記のようなパターンです。
回答は貰ったけど理解出来ないから諦める → 他の場所で質問しなおす
いわゆる、マルチポストという奴ですね。

ともかく、質問の前に考えることも大事です。
あと、ゲームには
Playerや、Enemy、Bossのようにキャラクターの役割をするものや、
Texture、Sound、Inputのようにキャラクターではないものも存在します。

なので、"世界"クラスに処理を持たせる、ではなく"世界"クラスから、
"キャラクター管理"クラスを派生させ、そのキャラクター管理クラスの中で処理をする、
という風にしたほうが良いでしょう。


>>>Enemy型のポインタを返す関数();
>>これだとボスのクラスに自機やザコのクラスの宣言が見える必要がある気がするんですが・・
そうですね。
先ほどのサイトのソースを見ても分かるように、CEnemyBase型のポインタを使いたい場合は
ヘッダをインクルードします。
------------------------------------------------
#include "EnemyBase.h"
void CPlayerBullet::Exec()
{
/* 弾の移動処理 - 省略 */

// 優先度から敵クラスを列挙する
CPrioEnum pe;
CGameObject *g;
CEnemyBase *e;
CreateEnumeration(ENEMY_PRIORITY, ENEMY_PRIORITY + 10000, &pe);

while(g = pe.GetNext()){
e = dynamic_cast<CENEMYBASE*>(g);
// CEnemyBaseが基底クラスに無ければ処理はしない
if(e == NULL) continue;

if(e->HitTest(this)){
// 敵にヒットしたら弾を消去
RemoveObject(this);
return;
}
}
sprite.Draw(x, y, angle);
}
------------------------------------------------

>>派生クラスで追加した変数とか関数にアクセスしたい時はどうすれば良いのでしょうか?
派生クラス型のポインタを受け取れば、そのポインタを介して
派生クラスのメンバ関数やメンバにアクセスできると思います。
(private属性ならば、アクセッサを定義すればその関数からアクセス出来ます。)

また、基底クラス型のポインタの戻り値に、dynamic_castをすれば派生型のポインタに変換できます。


1,251ポイント を手に入れた。

Name: skyblue  ..ぴよぴよ(236ポイント)   Date: 2009/10/08(木) 16:13   No:40177     
Title: Re:クラスのプロトタイプ宣言    
投稿した後に、
龍神録プログラミングの館を参考に
作ろうとしているのならば、ソースを見てきましたけど、
main.cpp(project.zip/project/60章/mydat/source/)に処理を書いて、
それ以外はdefine.hやstruct.hにしろ、
project.zip/project/60章/mydat/source内にもソースがありますけど、
実体はmain.cppなどのcppファイルで書いているみたいです。
それ以外は、実体のない宣言などをしているファイルみたいです。
それ以外の章も同じだと思います。

>これの意味がさっぱりわからないです
>どういう事か詳しく説明してください・・
つまり、ボスの表示だけでひとつの関数を作るのです。
main関数で呼び出す形にすればメインファイルはかなりすっきりします。
敵の弾にあたったときの自機の当たり判定は
敵の弾の表示の関数(サブルーチン)に記述するときに
自機の座標を引数として指定すればできます。
ただしほとんどのサブルーチンがvoidになってしまいますが。

↑の環境はBCCでの場合です。それ以外は適宣VC++などの環境に合わせて変更してください。

補足

#includeはその場所にソースをそのまま張り付けているだけみたいです。



218ポイント を手に入れた。

Name: ねこ  ..熟練のプログラマー(45,587ポイント)   Date: 2009/10/08(木) 18:11   No:40182     
Title: Re:クラスのプロトタイプ宣言    
皆さんの良レスに対してチルチルさんが「??」状態になってる気がします。
しっかりとクラスの基礎が分かってない状態で連続でレスが付いてる状態なので仕方無いとは思うのですが・・・

僕はチルチルさんにクラス解説サイトを熟読するか書籍でも買って頂いてしっかりと基礎を付けてもらって再度質問してもらうのが一番の近道だと思います。

提案を出してもそれを自分の中の最良に近づけようとしている点が問題なので
継承時の基底クラスポインタへの設定についてやgetter/setterの理屈、クラスにおけるスコープ、ポインタについて等、
色々学んで貰わないと話がかち合わないと思います。


66ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(63,001ポイント)   Date: 2009/10/08(木) 21:24   No:40184     
Title: Re:クラスのプロトタイプ宣言    
え〜と前後の章も読んだら概要は理解できました

判定を行うクラスを作成し
基底クラスで使用し
自機やボスが継承し
必要ならばオーバーライドする

この構造はかなり便利そうですね
何事もすぐに投げ出してはいけないようです
これは反省しないといけませんね・・

>typeid演算子を使えば、基底クラス型のポインタにどのオブジェクトが入っているかを
>調べる事ができますよ。

そんな演算子があるとは知りませんでした・・
でも派生先のメンバを呼び出すにはヘッダのインクルードが必要のようですね

>なので、"世界"クラスに処理を持たせる、ではなく"世界"クラスから、
>"キャラクター管理"クラスを派生させ、そのキャラクター管理クラスの中で処理をする、

確かに性質の近いものをグループにして
それをさらにグループにするという構造の方が取っ付きやすそうですね

入力や効果音は・・
とりあえずイベント管理クラスとでも呼んでおくとして
世界の中にキャラクターとイベントを包含して
その中に自機や効果音を包含すると構造がわかりやすいでしょうかね・・

ボスが効果音を鳴らすメッセージを発信する時は

ボスのメンバ関数からキャラクターのメンバ関数を呼ぶ
キャラクターのメンバ関数から世界のメンバ関数を呼ぶ
世界のメンバ関数からイベントのメンバ関数を呼ぶ
イベントのメンバ関数から効果音のメンバ関数を呼ぶ

見たいな感じでしょうかね・・
連鎖が多くなっていますが、ボスが自機に何かする場合は
同じグループ内なので世界まで行かなくても良さそうですね
ボス→キャラクター→自機で行けそうです

そうすると
ボス→世界→効果音と直接たどっても良いかもしれませんが
メンバに直接アクセスするのはダメですかね・・

>龍神録プログラミングの館を参考に
>作ろうとしているのならば、ソースを見てきましたけど、

う〜ん素材や雰囲気は参考にしていますが
コードは参考にしていないですね・・

>つまり、ボスの表示だけでひとつの関数を作るのです。

Boss.Run();

を分解して

Boss.Draw();
Boss.Move();
Boss.Attack();

見たいにするって事でしょうか?

>色々学んで貰わないと話がかち合わないと思います。

色々なサイトを見ているんですが
最低限の事が書いてあるサイトと応用的な事が書いてあるサイトはあるんですが
その中間がなかなか見つからなくて手間取っています・・

しかし継承は使えるのか半信半疑で敬遠していたんですが
やはり使った方が良さそうですね


621ポイント を手に入れた。

Name: たいちう  ..プログラマー(35,299ポイント)   Date: 2009/10/08(木) 23:49   No:40188     
Title: Re:クラスのプロトタイプ宣言    
そんなに気負わずに、「ボスと自機がいて、自機が撃った弾がボスに当たればクリア」
というプログラムを作ってみましょう。大作を思い浮かべて心配するよりも、
よほど多くの事を学習できるはずです。

開発に着手する前にある程度設計をしっかりやらないと、と思っていませんか?
開発の経験が十分無いと、しっかりした設計はできないのです。
掲示板の回答でも不十分に感じるでしょ?
チルチルさんが実現したいことをうまくまとめることができるならば、
他の人に設計を頼むことも可能といえば可能ですが、それじゃ面白くないでしょ?

ウォーターフォール型ではなく、プロトタイプ型かスパイラル型の開発をしましょう。


170ポイント を手に入れた。

Name: Mikan  ..中級者(9,838ポイント)   Date: 2009/10/09(金) 12:46   No:40198     
Title: Re:クラスのプロトタイプ宣言    
私も同じ様な事を疑問に思ったことがあります。

たいちうさんの言うように、プレイヤー・ボスクラスを作成して
main関数から、クラスの制御(移動・ショット)などが呼べるのを確認して、カプセル化できるところはしていくといいかと思います。

当たり判定もmain関数(または世界クラス?)でやったほうが楽ですよ♪

そのプレイヤーやボスのクラスで、当たり判定などすべてのことをすると、すごくクラス間の連結が強くなってしまい、あんまりクラスの恩恵はないかも^^


139ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(63,503ポイント)   Date: 2009/10/09(金) 17:45   No:40206     
Title: Re:クラスのプロトタイプ宣言    
前回はボトムアップ型で失敗して
今はウォーターフォール型で難航しているので
とりあえずスパイラル型に移行してみましょうかね・・

製作に入れないのは歯痒いですが
ここでしっかり理解しておいた方が
後々役に立つと思うので慌てずに行って見ます

>main関数から、クラスの制御(移動・ショット)などが呼べるのを確認して、カプセル化できるところはしていくといいかと思います。

どのくらいをカプセル化と言うのか良くわからないんですが
包含されているクラスは外側から管理されるのでカプセル化は難しいでしょうね
これは一体化していると考えてmainに対して世界をカプセル化した方が良さそうですね
とりあえずメインループも世界の中に入れてRun以外は非公開でしょうかね・・
そうすれば全体としてのカプセル化は保たれますし

>当たり判定もmain関数(または世界クラス?)でやったほうが楽ですよ♪

それは私も思いましたね
Kitei*型のポインタを2個渡せば衝突しているか返すようなメンバ関数を世界に追加して
世界の方で勝手に判定して一方的に接触連絡した方が直感的でしょうかね・・

そうなるとクラス内に線形リストを持つ弾とかザコ敵はまた専用の関数を追加するとしましょう
弾同士とか敵同士は直接参照を許可しても良いでしょうかね・・

>そのプレイヤーやボスのクラスで、当たり判定などすべてのことをすると、すごくクラス間の連結が強くなってしまい、あんまりクラスの恩恵はないかも^^

う〜んクラスの恩恵は今の所コンストラクタが大きいと思いますね
だから動的にインスタンスを作成するのはしない方向で考えています

まあこの辺は理解してから考えた方が良いですね・・
とりあえずわかった範囲でコードを組んでみます


502ポイント を手に入れた。

Name: GPGA  ..熟練のプログラマー(67,331ポイント)   Date: 2009/10/09(金) 18:39   No:40207     
Title: Re:クラスのプロトタイプ宣言    
個人的には当たり判定マネージャーを作ってそこで判定させるのも
面白いと思います。
以下、当たり判定マネージャーの例です。(コンソールアプリで動きます。)


#include <iostream>
#include <list>

typedef void (*HitCallBack)(void*);
struct Rect {
Rect(){}
Rect(int x, int y, int w, int h) {
this->x = x;
this->y = y;
this->w = w;
this->h = h;
}
int x, y, w, h;
};

class HitManager {
struct Data {
Rect rect; // あたり範囲
HitCallBack callBack; // 当たった時に呼び出される関数
void* param; // 関数のパラメータ
};

std::list<Data> dataLeft_;
std::list<Data> dataRight_;
public :
void Clear() {
dataLeft_.clear();
dataRight_.clear();
}
void AddLeft(const Rect& rect, HitCallBack callBack, void* param) {
Data data;
data.rect = rect;
data.callBack = callBack;
data.param = param;
dataLeft_.push_back(data);
}
void AddRight(const Rect& rect, HitCallBack callBack, void* param) {
Data data;
data.rect = rect;
data.callBack = callBack;
data.param = param;
dataRight_.push_back(data);
}

void Check() {
std::list<Data>::iterator it1 = dataLeft_.begin();
for (; it1 != dataLeft_.end(); ++it1) {
std::list<Data>::iterator it2 = dataRight_.begin();
for (; it2 != dataRight_.end(); ++it2) {
// あたり判定
const Rect& rect1 = it1->rect;
const Rect& rect2 = it2->rect;
if ((((rect1.x - rect2.x - rect2.w) & (rect2.x - rect1.x - rect1.w) & (rect1.y - rect2.y - rect2.h) & (rect2.y - rect1.y - rect1.h)) < 0)) {
// 当たっていた場合コールバック呼び出し
it1->callBack(it1->param);
it2->callBack(it2->param);
}
}
}
}
};

class Kitai {
public :
virtual ~Kitai(){}
virtual void Run(HitManager*) = 0;
};

class Player : public Kitai {
// 当たった時の処理を記述
void HitCallBack_() {
std::cout << "プレイヤーあたった" << std::endl;
}
static void HitCallBack(void* p) {
((Player*)p)->HitCallBack_();
}
public :
void Run(HitManager* hitManager) {
// あたり判定クラスに登録
hitManager->AddLeft(Rect(0, 0, 10, 10), HitCallBack, this);
}
};

class Boss : public Kitai {
// 当たった時の処理を記述
void HitCallBack_() {
std::cout << "ボスあたった" << std::endl;
}
static void HitCallBack(void* p) {
((Boss*)p)->HitCallBack_();
}
public :
void Run(HitManager* hitManager) {
// あたり判定クラスに登録
hitManager->AddRight(Rect(0, 0, 10, 10), HitCallBack, this);
}
};

int main() {
Player player;
Boss boss;
HitManager hit;

// 各オブジェクトの処理を実行
player.Run(&hit);
boss.Run(&hit);

// あたり判定チェック
hit.Check();
}
 
Windows XP Professional
VisualStudio 2008 SP1にて作成


2倍のポイントを手に入れた! 1,466ポイント を手に入れた。

Name: MNS  ..上級者(18,822ポイント)   Date: 2009/10/09(金) 18:59   No:40210     
Title: Re:クラスのプロトタイプ宣言    
実際にゲームを作ってみて、クラスのメリット・デメリットを知ることも良いと思います。
やはり、開発の意欲は自分が作りたいものを作っているときが一番沸きますからね。
恐らくはどこかで躓き、一から設計を見直すことになるでしょうが、それも経験です。
もちろん基本的なことは学んでおくべきでしょうけれど。
ただ、自分で解決することが非常に重要です。
わからないからといって、直ぐに質問するのでは意味がありません。

メンバがプライベートならカプセル化の原則は守られていると言えます。

class Object
{
private:
int x;
public:
int GetX(){ return x; }
void SetX(int a){ x = a; }
};

このように、一つのメンバ変数に対し、(必要であればですが)セッターおよびゲッターを用意するだけで、
たとえSetX関数でxの値が変えられるとしても、カプセル化の原則は守られます。
なので、基本的に包含されるクラスであろうと、全てのクラスに対しカプセル化は考慮すべきです。

確かに、当たり判定は自機および敵機を包含するクラス、いわゆる世界クラスで行ったほうが楽かもしれませんね。
ただ、あまりに世界クラスが肥大化してしまうようでは、当たり判定を行うクラスというものを用意することも考えたほうがいいかもしれません。

>弾同士とか敵同士は直接参照を許可しても良いでしょうかね・・
これはどういうことでしょうか?

コンストラクタは、カプセル化が守られてこそ初めてメリットを発揮します。
>だから動的にインスタンスを作成するのはしない方向で考えています
コンストラクタのメリットが大きいので動的なインスタンスの作成をしない、
というのは良く分かりませんが、動的なインスタンスの作成は考えていたほうがいいかもしれません。
というのも、継承および多態性では必要となるかもしれないからです。


509ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(63,506ポイント)   Date: 2009/10/09(金) 22:34   No:40215     
Title: Re:クラスのプロトタイプ宣言    
>個人的には当たり判定マネージャーを作ってそこで判定させるのも
>面白いと思います。
>以下、当たり判定マネージャーの例です。(コンソールアプリで動きます。)

関数も型にできるんですね・・

struct Rect {
Rect(){}
Rect(int x, int y, int w, int h) {
this->x = x;
this->y = y;
this->w = w;
this->h = h;
}
int x, y, w, h;
};

これって後ろで定義しているint x, y, w, h;が
Rectから見えるのは何ででしょうか?

コールバックと言う方法は知りませんでしたね・・
どこかで使う時があるかもしれません

まあ自機とかボスの中でやっても良いんですが
ちょっと問題があるんですよね・・

例えば「自機がボスに接触したかの判定は自機とボスのどっちでやるのか?」という問題です

別にどっちでも特に変わらないと思いますが
私としては迷う所なんですよね・・

だから世界の方でやった方が後草無くて良いかな〜と思うんですよ・・

>このように、一つのメンバ変数に対し、(必要であればですが)セッターおよびゲッターを用意するだけで、
>たとえSetX関数でxの値が変えられるとしても、カプセル化の原則は守られます。

う〜んゲッターとかではなくてポインタを取得して間接参照するような感じで行こうと思ったんですが
それだとカプセル化が崩れますか?

>なので、基本的に包含されるクラスであろうと、全てのクラスに対しカプセル化は考慮すべきです。

やはり世界→キャラ→自機と包含していたとしても
世界から自機を直接参照するのはダメみたいですね・・

良く考えたら世界クラスの外にはmain関数ぐらいしか無いと思うから
クラス内でのカプセル化の方を重視した方が良さそうですね・・

>確かに、当たり判定は自機および敵機を包含するクラス、いわゆる世界クラスで行ったほうが楽かもしれませんね。
>ただ、あまりに世界クラスが肥大化してしまうようでは、当たり判定を行うクラスというものを用意することも考えたほうがいいかもしれません。

やはり自機クラスやボスクラスはキャラクラスに包含して
キャラクラスを世界クラスが包含する方が良さそうですね

自機からボスへの判定なら同じグループなのでキャラクラス内で判定をやってしまえば
世界クラスの負担が減るし構造が明確になりそうです

それなら世界クラスにはグループをまたぐ判定だけをやってもらえば良さそうですね

まあ判定に関してはクラスなりメンバ関数なりで汎用化するとして
今回は普通の関数は使わないでメンバ関数だけでやってみます

>これはどういうことでしょうか?

弾の構造で思い付くのは

弾管理クラスの中で弾の線形リストを作る
弾クラスの線形リストを作る

の2つです
私としては前者を使おうと思っているのですが
それだと弾同士が自由に参照できます
これはアリなのか微妙なんですよね・・

まあポインタを使った間接参照を多用する場合は
線形リストなんだからどっちにしても間接参照になると思うから
どっちでも関係無いようにも見えますが・・

>コンストラクタのメリットが大きいので動的なインスタンスの作成をしない、
>というのは良く分かりませんが、動的なインスタンスの作成は考えていたほうがいいかもしれません。
>というのも、継承および多態性では必要となるかもしれないからです。

コンストラクタで読み込みをやる予定です
それはあんまり関係ないですが
動的にインスタンスすると管理が大変な気がするんですよね・・

選択画面からゲーム画面に飛ぶ時に選択画面を開放すると
次に選択画面をインスタンスする時に前回どこを選択していたのかわからないと言う問題も出ますし・・


3ポイント を手に入れた。

Name: conio [URL]  ..熟練のプログラマー(61,477ポイント)   Date: 2009/10/10(土) 00:43   No:40223     
Title: Re:クラスのプロトタイプ宣言    

>>選択画面からゲーム画面に飛ぶ時に選択画面を開放すると
>>次に選択画面をインスタンスする時に前回どこを選択していたのかわからないと言う問題も出ますし・・
消さなければいいんですよ。
というより、そういったシーケンス遷移は木構造を思い出してください。
階層が深くなっても、根元から辿って行く方法です。

----------------------------------
タイトル
 ┃
┏┻┓
選 終
択 了


┣┳┓
初続終
めきわ
かかり
ららか
┃┃ら
┃┃┃
オコエ
|ンン
プテデ
ニィィ
ンニン
グュグ
 |
----------------------------------
例えば、"選択画面クラス"には下層の"ゲームプレイクラス"を呼び出して実行するようにするのです。
(ここではOP、Continue、Endingの3種類)

で、"ゲームプレイクラス"の処理が終了した時、(主人公が死んだりなど)
"ゲームプレイクラス"をデストラクトし、また"選択画面"クラスに戻ってくるようにします。

要するに、デストラクトするのは末端からです。

現在のシーケンス状態以外のクラスは存在しない(全てデストラクトしている)
という考え方はよろしくないと思います。

タイトルクラスが、選択画面クラスを呼んで、選択画面クラスがゲームプレイクラスを・・・
というように、根元から全てが繋がっており、ひとつの纏まりとなっているイメージです。


589ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(63,596ポイント)   Date: 2009/10/10(土) 13:10   No:40244     
Title: Re:クラスのプロトタイプ宣言    
そういえば構造的にはそんな感じですよね・・

前回質問した時に画面の移行は多態性を利用したメンバ関数ポインタを使って
どの画面へ飛ぶかは列挙型で指定しようと思ったんですが
それだとクラスは動的にインスタンスできないですね・・

でも包含は想定していなかったので構造は多少変更は必要ですね・・

選択画面なども世界が包含する事になると思うので
世界の中でうまく場合分けしないといけませんね・・


90ポイント を手に入れた。

Name: MNS  ..上級者(19,033ポイント)   Date: 2009/10/10(土) 20:57   No:40256     
Title: Re:クラスのプロトタイプ宣言    
オブジェクト指向言語には、デザインパターンと呼ばれる幾つかのテクニックがあり、
その中にステート(State)デザインパターンと呼ばれるものがあります。
これは条件分岐や列挙体を使わないので、とても簡潔に書くことができます。
選択画面で応用すればとても便利ですので、一度調べてみてはどうでしょう?


150ポイント を手に入れた。

Name: GPGA  ..熟練のプログラマー(67,456ポイント)   Date: 2009/10/11(日) 00:14   No:40265     
Title: Re:クラスのプロトタイプ宣言    
>これって後ろで定義しているint x, y, w, h;が
>Rectから見えるのは何ででしょうか?
C++の仕様です

>まあ自機とかボスの中でやっても良いんですが
>ちょっと問題があるんですよね・・
HitManagerのCheckの呼び出しはWorldで行います。

もし今回の当たり判定をHitManagerを使用しないで記述した場合
Worldの中の当たり判定とその後の処理がどのように記述され
HitManagerを使用した場合、どのようになるかを考えてみてください。


125ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(64,397ポイント)   Date: 2009/10/11(日) 18:08   No:40290     
Title: Re:クラスのプロトタイプ宣言    
包含の練習をしてみたんですが
class Boss {

private:
public:
void Run(void);
};
class World {
private:
Boss Boss;
public:
int i;
};
World World;
void Boss::Run(void){
World.i=0;
}
実際にやってみると包含であって内部クラスではないので
宣言部では独立している事になってしまうんですよね・・

世界からボスへはメンバを参照しているだけですが
ボスから世界へは別のクラスのメンバにアクセスしているので
どういう風に考えたら良いのか模索中です

このコードだと名前関係でエラーが出るので
型名と実体が同名なのは何とかしないといけませんね・・

>根元へ行けば行くほどにオブジェクトはそれ1つで完結する独立したものになります。
>そうしないと、機能をカプセル化する意味が全くありません。

これの意味がやっと分かりました、世界は自機やボスを包含しているので
世界が自機やボスを参照するのは自分のメンバにアクセスしているだけなので単体で完結している事になります
自機やボスが世界を参照するのは他のクラスにアクセスする事になるので独立性が低くなります
確かに根本に行くほど外部へのアクセスが少なくなりますね

あと練習中に意味不明なエラーが出てしまいました
class World {

private:
public:
void run(void);
};
void World::run(void){
}
これはコンパイルが通るんですが
class World {

private:
public:
void Run(void);
};
void World::Run(void){
}
runをRunに変えると

error LNK2005: "public: void __thiscall World::Run(void)" (?Run@World@@QAEXXZ) は既に main.obj で定義されています。
fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

このようなエラーが出るんですよね・・

他のプロジェクトでは出ないので
これから書き込むために空のソースとかヘッダを
沢山用意しているのが怪しいんですが
何がいけないのかわからない状態です・・

しかも引数をint型にするとコンパイルが通るので
さらに良くわからないです・・


801ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(110,800ポイント)   Date: 2009/10/11(日) 18:50   No:40291     
Title: Re:クラスのプロトタイプ宣言    
うーん。ねこさんや他の方々からも意見がありましたが、
ちょっといろいろ論議する前に、
先人の書かれているものを一度読んだほうがいいかと思います。(参考書・参考ページ)
No:40290の書かれているコードは基礎を学んだ人はすぐにおかしな所に気が付きます。


127ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(64,561ポイント)   Date: 2009/10/12(月) 12:18   No:40315     
Title: Re:クラスのプロトタイプ宣言    
実際にやってみると問題点が良くわかりますね・・

非公開メンバにはポインタを使ってもアクセスできない事がわかりました
だとすると公開しておくしかないんでしょうかね・・
カプセル化が壊れますけど別に関数を用意するのは無駄が多いし・・

自機とかボスは良いとして弾なんかは
弾と世界で別々にループを回すと時間が掛かるので
枝先でやった方が良いかもしれませんね・・

良く考えたら
世界→キャラ→自機
と参照しないとカプセル化が壊れますけど
自機→世界
と参照するのは別に問題ない気もしますね・・


164ポイント を手に入れた。

Name: バグ  ..ハッカー(171,113ポイント)   Date: 2009/10/12(月) 12:48   No:40316     
Title: Re:クラスのプロトタイプ宣言    
>>カプセル化が壊れますけど別に関数を用意するのは無駄が多いし・・

私も当初はこの作業を無駄だと思っていましたが、規模の大きい物を組むようになると、アクセッサのありがたみが理解できるようになりました。特にメンテナンスや改造の容易さにおいて痛感するのではないかと思います。

無駄だと思うかもしれませんが、アクセッサを用意して、カプセル化の原則を守ることによるメリットの方が遥かに大きいですよ。


148ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(64,648ポイント)   Date: 2009/10/12(月) 14:02   No:40319     
Title: Re:クラスのプロトタイプ宣言    
やっぱり構造は明確な方が良いみたいですね

となると世界まで行かなくて良い場合でも世界まで行った方が良さそうですね
むしろ包含の階層を増やさない方が良いかもしれません
世界の負担は増えますけどオーバーヘッドは減るかもしれませんし・・


87ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(65,011ポイント)   Date: 2009/10/13(火) 01:02   No:40357     
Title: Re:クラスのプロトタイプ宣言    
いちいちアクセッサを作るのは無駄だと言うお話もありましたが
現実的にポインタを使ってもアクセス拒否されるので
やはりアクセッサを使うしかなさそうですね

そうするとインスタンスを基底クラスのポインタで持つ必要もなくなりますからね
動的キャストは処理が重いらしいですし、静的キャストの方を使った方が良さそうです

そういえば内部へのカプセル化は良いとして
外部へのカプセル化はすべきなんでしょうか?
世界が自機のメンバ変数に直接アクセスしてはいけないのはわかりますが
自機が世界のメンバ変数に直接アクセスするのもダメなんでしょうか?

むしろ相手によって公開する範囲を指定できないのが残念ですね・・

Stateについては解説サイトを探しています
今の所は他で動的なインスタンスはしないつもりですね

ちなみに添付したコードですが
改良すべきなのはどの辺りでしょうか?


363ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(111,654ポイント)   Date: 2009/10/13(火) 03:53   No:40362     
Title: Re:クラスのプロトタイプ宣言    
>ちなみに添付したコードですが
>改良すべきなのはどの辺りでしょうか?

人それぞれですので、こうしろとは言えない気がしますが・・・

・自分はProtocol.hはやめたほうがいいかと思います。
確かに、コードの見栄えはいいかもしれないですけど、
ヘッダーが増えるにしたがって、
コンパイルの時間がものすごく長くなったりします。
各所でそれぞれ必要なヘッダーをインクルードするのを自分は採用しています。

・Charクラスで座標をpublicにしていますが、
自分ならprivateにします。

・ShotClassのコンストラクタなどでの動的確保は、
例外処理まではいかなくても、
さすがに確保失敗時の動作は書いたほうがいい気がします。

・グローバルのWorldClass World;を使用しないですむ構造にする

・DxLib_Init()とDxLib_End()を同じクラスで管理

などなど。
なんだか、すべてをクラスに混ぜている気がします。
「自分」は(何度も「自分」を押しますが^^;)ですが、
再利用を念頭にクラス化します。
確かにシングルトンクラスも使用はしますが。。
クラスのおかげで「管理しやすく」ではなく、「管理しにくく」
なってしまっては、元も子もないような気がします^^;

まだ大規模な開発をしたことがないので、
恐らくあてにならないことを言ってる気がしますが・・・
あくまで一個人としての意見なので、参考までに^^;


652ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(65,960ポイント)   Date: 2009/10/13(火) 13:15   No:40369     
Title: Re:クラスのプロトタイプ宣言    
>自分はProtocol.hはやめたほうがいいかと思います。

何でコンパイルにこんなに時間が掛かるのかなと思っていたら
やっぱりアレは問題でしたか・・

しかし世界クラスは必ずインクルードする必要があると思いますが
世界クラスは自機やボスのポインタを持っているので
そっちもインクルードしないと宣言ができなくなってしまって
結局すべてインクルードする事になってしまいますね・・

ポインタを基底クラスで持つメリットってこういう時なんでしょうか?
しかし動的キャストは処理が重いのでダメですね・・

最初の方で教えてもらった
class B;
これが使えるかもしれませんね
枝先が直接アクセスする事は無いと思うので
クラスのポインタと言う事がわかれば
宣言は可能かもしれません
世界本体ではどうするのか微妙ですが
そこはやってみれば何とかなるはず・・

>Charクラスで座標をpublicにしていますが、

アクセッサを作る事にしたので非公開にした方が良いですね
でも継承専用なのでprivateだとサブクラスからも見えないのでprotectedの方が良いかな・・
基底クラスの段階でアクセッサを作るならprivateでも良いですが
自分のメンバを変更するのにアクセッサを使うのも変だからやっぱりprotectedでしょうかね・・

>ShotClassのコンストラクタなどでの動的確保は、

newがNULLを返した時に終了するとかでしょうか?
いちいち書くのも大変なのでマクロ化が必要かもしれません・・

>グローバルのWorldClass World;を使用しないですむ構造にする

そういえば変ですね・・
WorldClassのメンバを全部staticにすれば良いかもしれません
その場合はWorldClassは長いのでWorldにする必要がありますね・・
むしろ全部のクラスをstaticにしても良いかもしれませんね
世界クラスでポインタを作る必要も無いですし・・
でもそれだとカプセル化が壊れるし
アクセッサをどうすれば良いのかわからないのでダメですね・・

>DxLib_Init()とDxLib_End()を同じクラスで管理

DxLib_End()は世界のデストラクタに入れた方が良いですね・・

>再利用を念頭にクラス化します。

クラスの再利用ってピンと来ないんですが
どんな風に再利用するのでしょうか?

>確かにシングルトンクラスも使用はしますが

こういうデザインパターンもあったんですね・・
インスタンスが1つしか作成されないのを保障するのもダメ押しで良いかもしれませんが
全部のクラスをstaticにした場合のアクセッサがさらに良くわからなくなるので微妙ですね・・


949ポイント を手に入れた。

Name: MNS  ..上級者(19,674ポイント)   Date: 2009/10/13(火) 17:11   No:40380     
Title: Re:クラスのプロトタイプ宣言    
>しかし世界クラスは必ずインクルードする必要があると思いますが
>世界クラスは自機やボスのポインタを持っているので
>そっちもインクルードしないと宣言ができなくなってしまって
>結局すべてインクルードする事になってしまいますね・・
言ってる意味が良く分からないのですが、
world.cppでboss.hやplayer.hをインクルードしていたとしても、
world.hで何もインクルードしていなければ、player.cppでworld.hをインクルードしても、
boss.hやその他のヘッダはインクルードされないと思いますが。

>動的キャストが遅い
確かにスタティックキャストと比べると遅いかもしれませんが、
問題になるほど処理が重いわけではないと思います。少なくともnewの方が遅いでしょう。

>WorldClassのメンバを全部staticにすれば良いかもしれません
>その場合はWorldClassは長いのでWorldにする必要がありますね・・
>むしろ全部のクラスをstaticにしても良いかもしれませんね
>世界クラスでポインタを作る必要も無いですし・・
>でもそれだとカプセル化が壊れるし
>アクセッサをどうすれば良いのかわからないのでダメですね・・
WorldClassのメンバを全てstaticにするというのも手ですが、
それならばシングルトンを実装してしまったほうが話しは早いでしょう。
自機やボスが常にWorldへのポインタをもつのも一つの手ですし、

class A
{
public:
static A* instance;
A(){ instace = this; }
}

こうやって、静的なパブリックメンバとして、自身のポインタを用意し、
コンストラクタでインスタンスが作成される際に自身のアドレスを代入する、
というやり方もあります。ただし、インスタンスが一つのみである場合に有効です。

>クラスの再利用
テンプレートという機能を学べば、少しはわかるかもしれません。


783ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(65,495ポイント)   Date: 2009/10/13(火) 18:39   No:40386     
Title: Re:クラスのプロトタイプ宣言    
>world.cppでboss.hやplayer.hをインクルードしていたとしても、
>world.hで何もインクルードしていなければ、player.cppでworld.hをインクルードしても、
>boss.hやその他のヘッダはインクルードされないと思いますが。

え〜とヘッダファイルにはクラスの本体を、ソースファイルにはメンバ関数の中身を書きますよね
と言う事はWorld.hでBoss.hやPlayer.hをインクルードしないと
WorldクラスのメンバにBoss*型やPlayer*型のポインタを宣言できないんじゃないのかなって事です

>確かにスタティックキャストと比べると遅いかもしれませんが、
>問題になるほど処理が重いわけではないと思います。少なくともnewの方が遅いでしょう。

気にするほどでも無いんでしょうかね・・
だとしても動的キャストは構文が長いのでマクロ化する必要がありますね・・

>WorldClassのメンバを全てstaticにするというのも手ですが、
>それならばシングルトンを実装してしまったほうが話しは早いでしょう。
>自機やボスが常にWorldへのポインタをもつのも一つの手ですし、

そういえばstaticにするとstaticメンバしかアクセスできなくなりますからね・・
全部のクラスをシングルトンにしておくのもアリかもしれません
確か2回目以降は普通にポインタを返すようになっているわけだから
ポインタを保持しなくても毎回呼び出せば良いかもしれませんね
毎回作成されているかの分岐を通ると無駄が多いですが
関数ポインタへの代入とか一回しか呼び出さない物との互換性のために
そこはしかたないでしょういかね・・
まあ継承とオーバーライドで何とかなるかもしれませんが
そうすると間接参照時に構文が長くなるのでダメですね
Worldへのポインタを基底クラスで宣言するのも良いかもしれません


465ポイント を落としてしまった。

Name: GPGA  ..熟練のプログラマー(67,214ポイント)   Date: 2009/10/13(火) 18:58   No:40387     
Title: Re:クラスのプロトタイプ宣言    


>と言う事はWorld.hでBoss.hやPlayer.hをインクルードしないと
>WorldクラスのメンバにBoss*型やPlayer*型のポインタを宣言できないんじゃないのかなって事です
いいえ

------------------ World.h ----------------------
class Player;
class Boss;

class World {
private :
Player* player_;
Boss* boss_;
};

------------------ World.cpp ----------------------
#include "World.h"
#include "Player.h"
#include "Boss.h"


・・・

 


242ポイント を落としてしまった。

Name: MNS  ..上級者(20,143ポイント)   Date: 2009/10/13(火) 19:07   No:40388     
Title: Re:クラスのプロトタイプ宣言    
>え〜とヘッダファイルにはクラスの本体を、ソースファイルにはメンバ関数の中身を書きますよね
>と言う事はWorld.hでBoss.hやPlayer.hをインクルードしないと
>WorldクラスのメンバにBoss*型やPlayer*型のポインタを宣言できないんじゃないのかなって事です
ポインタならば可能だと思います。と、いうか、チルチルさんのコードを見る限り、
World.h内ではBoss.hおよびPlayer.hをインクルードしていませんが、
Boss型やPlayer型のポインタを宣言しているように見受けられるのですが。

なんというか、チルチルさんの考えは短絡的すぎやしませんか?
全部のクラスをシングルトンにするなんて、せっかくのオブジェクト指向が台無しになります。
シングルトンはグローバル変数と同じような振る舞いをしますから、
グローバル変数特有のデメリットが浮き出てきます。
基本的にC++においてグローバル変数を使うのは好まれません。
WorldClassにシングルトンを実装するのは、WorldClassが全クラスからアクセスできることによって
もたらされるメリットが、それにより引き起こされるデメリットよりも重要だからです。
全部をシングルトンにしてしまえば、
結局はPlayerクラスやBossクラスがみんなグローバル変数だった時の状況に戻ってしまいますし、
そうするとWorldClassをシングルトンにする理由もなくなってしまいますよ。


469ポイント を手に入れた。

Name: GPGA  ..熟練のプログラマー(68,511ポイント)   Date: 2009/10/13(火) 19:14   No:40390     
Title: Re:クラスのプロトタイプ宣言    
>World.h内ではBoss.hおよびPlayer.hをインクルードしていませんが、
>Boss型やPlayer型のポインタを宣言しているように見受けられるのですが。
これが通るのは、World.cpp内部でインクルードしているProtocol.hが
Boss
Player
World
の順にインクルードしているため、文法エラーにならないだけです。
cppのインクルードする順番に依存する良くないつくりです。(企業が出すライブラリでもたまにあるから困る)

main.cppの中でworld.hだけを単独でインクルードすれば、文法エラーになるでしょう。


245ポイント を落としてしまった。

Name: チルチル  ..熟練のプログラマー(65,940ポイント)   Date: 2009/10/13(火) 20:24   No:40394     
Title: Re:クラスのプロトタイプ宣言    
これは使えそうですね、宣言にはこれを使うとして
うっかり「枝先は根本を見る」という前提を忘れていました・・
自機やボスは世界だけを見る事に戻して
枝先のソースは自分のヘッダとWorld.hだけをインクルードして動くようにした方が良さそうですね

世界→キャラ→自機と包含していても自機から直接世界を参照しますから外側へのカプセル化は壊れますが
こうした方がChar.GetBossとかWorld.GetBossが混在するのを防げるので良いかもしれません
内側へのカプセル化は守らないといけないので世界はキャラを通して自機を参照しますが
世界の負担が増えますが枝先からは見えないので問題無さそうですね
キャラは包含と言うよりグループと考えた方が良いかもしれません
枝先からのリクエストは世界が受け取って実際の処理はグループに委託すると後から変更しやすくて良さそうです
この構造だと行きは簡単だけど帰りが複雑って事になりますけど
根本が複雑になるデメリットよりも枝先が簡単になるメリットの方が大きそうだから悪くないかもしれません・・

シングルトンは複数のインスタンスが作成されない事を保障するものですが
別に自分で複数作らなければ問題は無いでしょうかね・・
>グローバルのWorldClass World;を使用しないですむ構造にする
これはシングルトンで実現できるんでしょうか?
staticならクラス名にスコープ演算子でアクセスできると思いますが
シングルトンの場合はどうやってアクセスするんでしょうか?
枝先がWorldのポインタを保持するやり方もアリですが・・


445ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(66,251ポイント)   Date: 2009/10/14(水) 12:41   No:40440     
Title: Re:クラスのプロトタイプ宣言    
良く考えたらインクルードするヘッダを構造から限定できそうですね

上の構造だとすると

・自機は世界が見える
・世界はキャラが見える
・キャラは自機が見える

と言う風にすれば構造が明確になって世界の負担も減りますね
何だかスコープの循環リストみたいにも見えます
これは全体的にバランスが良さそうな気がしますね

あと解説サイトでデザインバターンを見てきました
javaで書かれていたんですがアルゴリズムは理解できたと思います

Stateは添え字を変えるのではなく中身を変えるようですね
どこか関数ポインタを連想させます
現在の状態以外は存在しないのはダメとして
複数組み合わせるのも微妙なので
最初に全部インスタンスしておいて
場面を変える時に次のクラスのポインタを
代入すれば綺麗に変化してくれそうです

ポインタ名が列挙型の変わりになるのでかなりシンプルになりそうです
分岐内で変更するのは怖いので抜けてから変更した方が良さそうですね
列挙型に比べて関連性が弱く見えますが、まあ使う側から見れば問題無いでしょうかね・・

しかしデザインパターンは凄いですね・・
もっと早く気付くべきだったです・・


311ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(66,376ポイント)   Date: 2009/10/15(木) 00:26   No:40479     
Title: Re:クラスのプロトタイプ宣言    
そういえばクラスの再利用ですが

>テンプレートという機能を学べば、少しはわかるかもしれません

例えば2つの座標と半径を引数として渡すと接触しているかを返すような場合に
テンプレートを使ってどんな型の座標同士でも判定できるようにするとかでしょうか?
と言うよりこれは再利用と言うより汎用化と言うんでしょうか?


125ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(66,427ポイント)   Date: 2009/10/16(金) 12:20   No:40514     
Title: Re:クラスのプロトタイプ宣言    
皆さんに色々と教えていただいたおかげで
良さそうな構造も浮かんだのでそろそろ製作を開始しようと思うのですが
上に書いたような構造で大丈夫だと思いますか?


51ポイント を手に入れた。

Name: conio  ..熟練のプログラマー(61,339ポイント)   Date: 2009/10/16(金) 12:57   No:40515     
Title: Re:クラスのプロトタイプ宣言    
作り始めて、初めて気づく問題点などもあると思うので、とりあえず製作を開始してみてはどうでしょうか。
その時に 適宜もう一度質問する形にした方が良いかと。


10ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(66,646ポイント)   Date: 2009/10/17(土) 01:21   No:40540     
Title: Re:クラスのプロトタイプ宣言    
なるほど〜では製作を開始してみようと思います

皆様のおかげで大変勉強になったんですが
ここで少し疑問が浮かびました

解説サイトを見て思うにデザインパターンは定石ですがその他諸々に関しては
「何人かで作る場合に相手が使いやすくする」
「後から変更するのを容易にする」
これが重要だと言う事みたいですが

疑ってるわけではありませんが
例えば1人で製作していてコードも完璧で後から修正する必要が無い場合に
根本で枝先が繋がっているメリットは何なのでしょうか?

つまり1人で作るなら相手が使いにくても良いんじゃないか?
後から変更しないなら変更しにくい構造でも良いんじゃないか?って事です


219ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(116,773ポイント)   Date: 2009/10/17(土) 01:37   No:40542     
Title: Re:クラスのプロトタイプ宣言    
> つまり1人で作るなら相手が使いにくても良いんじゃないか?

例えば、自分一人で一つのプログラムを作り上げたとします。
しばらく後、そのプログラムのコードを参考(あるいは流用)しようとします。
その時自分がしっかりコードを覚えているのであれば問題ないかもしれませんが、
普通は忘れているはずです。

何が言いたいのかというと、自分の書いたコードでも、数週間後に見ると
書いたコードを忘れているのですから、他人のコードを見るのと変わりないということです。
つまり、使いにくいコードを書くことは自分でも使いにくいコードに成り得ます。

※他の方のコードの書き方を真似ると、
 今までに書いた自分のコードの書き方を忘れるということもあります。

そのため、出来るだけわかりやすく書くのが良いですね。
(コメントも書いておくといいです)


215ポイント を手に入れた。

Name: たいちう  ..プログラマー(35,818ポイント)   Date: 2009/10/17(土) 01:50   No:40545     
Title: Re:クラスのプロトタイプ宣言    
とっとと作り始めろ、という意見は私の他にもあったと思うけど、それは置いといて。

> つまり1人で作るなら相手が使いにくても良いんじゃないか?
> 後から変更しないなら変更しにくい構造でも良いんじゃないか?って事です

後から変更しないためには、作り始める時点で、完成形が分かっていないといけません。
規模が大きくなると、プロとはいえ凡庸な私には不可能な話であり、
失礼ながら私よりも(現時点では)腕が劣ると思われるチルチルさんの場合、
変更しないという前提で作り始めることは不可能ではないですか?

置いといて、とか言いながら、同じ事を書いていますね。
各人いろいろこだわりがあるわけで、それを否定するのも野暮かもしれませんが、
チルチルさんは失敗を恐れすぎているような気がします。

試行錯誤は必須ですよ。
私のプログラミングの時間の8割方は試行錯誤じゃないだろうか?多すぎ?


2倍のポイントを手に入れた! 334ポイント を手に入れた。

Name: 御津凪 [URL]  ..ハッカー(116,928ポイント)   Date: 2009/10/17(土) 01:55   No:40547     
Title: Re:クラスのプロトタイプ宣言    
> 私のプログラミングの時間の8割方は試行錯誤じゃないだろうか?

私はプログラミングの時間の半分位はコードの最適化にかけてますね^^;
それでも見やすいコードを維持しながらなので大変ではあります。
結局は試行錯誤の連続ですね。
昔も今も作りなおしは良くありますし。


66ポイント を手に入れた。

Name: チルチル  ..熟練のプログラマー(67,244ポイント)   Date: 2009/10/17(土) 16:37   No:40578 解決!     
Title: Re:クラスのプロトタイプ宣言    
う〜ん作り始めたかったんですが間の悪い事にテスト期間中だったもので
しかも新型インフルエンザに感染してプログラムを組む余力がありませんでした・・

>つまり、使いにくいコードを書くことは自分でも使いにくいコードに成り得ます。

デザインパターンの中でFacadeが印象に残ったんですが
作る側が使う側のために1つに見せかける構造は世界クラスと似通っていますが
見せ掛けを作る手間が作る側に増えるから1人で作る場合は必要ないんじゃないかとも思ったんですが
自分で作ったものでも使いこなせない事もあるなら必要はありますね

>変更しないという前提で作り始めることは不可能ではないですか?

前提と言うよりは「変更せずに済んだ」と言う過去形をイメージしていたのですが
まとめると、定石を使わなくてもできるなら良いけど
できると思っていても実際にやってみるとできない事が多いから
定石を使った方が無難だと言う事ですね、納得しました

>チルチルさんは失敗を恐れすぎているような気がします
>私のプログラミングの時間の8割方は試行錯誤じゃないだろうか

それは言えてますね、私も9割方試行錯誤していますが
プログラム上ではなくて頭の中でやっているんですよね・・

6時間ぐらいアルゴリズムを考えた後に10分ぐらいプログラムを書いて・・みたいな感じです
さすがに考えてる時間が長いので実際にやってみても試行錯誤する所はほとんど無いんですが

何でこういう事になっているかと言うと
プログラムの中に「見えないタブ」とか「見えない空白」があるのがすごく嫌なので
できるだけ頭の中で試行錯誤を終わらせてプログラムを書いたり消したりする時間を減らして
うっかり「見えない諸々」が発生する確率を下げようとしているのですが

そんな事を気にしてる場合じゃないですね・・プログラム上で試行錯誤してみます

では今度こそ解決にします

皆様長い間ありがとうございました


598ポイント を手に入れた。



Name: スウェーデン  ..ぴよぴよ(103ポイント)   Date: 2009/10/16(金) 22:56   No:40530       
Title: 質問です。    
こんばんわ。c言語歴5か月の未熟者ですが、初歩的な質問をさせてください。
//printf("");という文をよく見るのですが、この//の意味は何なのでしょうか??printfの前にこれを付けるとどう違うのか教えていただけたら幸いです。


103ポイント を手に入れた。


Name: softya  ..上級者(18,949ポイント)   Date: 2009/10/16(金) 23:06   No:40532     
Title: Re:質問です。    
大半のC言語では、/*と*/で囲むか//から後はコメント文となります。
//が使えるのは、本当はC99規格からなのですが、それ以前から対応していたC言語が多いです。
http://ja.wikipedia.org/wiki/C99
古い本だと紹介されていない可能性がありますので、参考にしている本の対応規格を確認してください。

ですので、
//printf("");
はprintf("");がコメントアウトされていて、コンパイル対象外となっているって事です。


101ポイント を手に入れた。

Name: TKOZ  ..プログラマー(33,568ポイント)   Date: 2009/10/17(土) 11:24   No:40564     
Title: Re:質問です。    
//printf("");は、コンパイルされず、実行されません。
同様に、
/*
printf("");
*/
もコンパイルされず、実行されません。


43ポイント を手に入れた。



Name: 鈴仙優曇華院イナバ  ..入門者(2,652ポイント)   Date: 2009/10/15(木) 23:00   No:40502       
Title: 東方星蓮船のような雪をたくさん降らせるには    
いつもお世話になっております。
現在作っているゲームの選択画面に東方星蓮船のような雪を降らせたいと思っているのですが、
1つ降らすのはできたのですが、沢山降らせるところでつまずいてしまいました…。
コードはだらだらと長くなってしまったので、添付ファイルに
exeファイルと一緒にコードを添付しました。
お手数をおかけしてすみません。
申し訳ないのですが…ヒントを頂けないでしょうか?
どうかよろしくお願いいたします。

雪エフェクト
http://home2.dip.jp/download/normal/index/no/159
ダウンロードパス:yukieff


236ポイント を手に入れた。


Name: Justy  ..伝説なるハッカー(442,414ポイント)   Date: 2009/10/15(木) 23:19   No:40503     
Title: Re:東方星蓮船のような雪をたくさん降らせるには    

>ヒントを頂けないでしょうか?

 そうですね、雪にまつわるパラメータは全て構造体に纏めましょう。
 
 一見たしかに yuki_tという構造体にまとめているようにみえますが、
「雪がだんだん消えていくようにするカウンタ」の countとか cflagとか cabuとかが
独立してしまっています。

 これらは雪の構造体の中にあるべきでしょう。


 その上で、雪の変数を配列にし、各制御関数や描画関数も配列に対応してみてください。


 これで一応複数の雪オブジェクトが出現するはずです。

 ただ、これだけだと同時に雪が出てしまったり、個々の揺らぎ具合が似通ってしまうので
実際にはもう一工夫必要になるとは思います。


233ポイント を手に入れた。

Name: 鈴仙優曇華院イナバ  ..入門者(2,738ポイント)   Date: 2009/10/16(金) 09:20   No:40511 解決!     
Title: Re:東方星蓮船のような雪をたくさん降らせるには    
Justyさん

早速のご回答ありがとうございます!

無事に星蓮船のような雪エフェクトができました!

個々の揺らぎは乱数によってばらつきを加えてみたいと思います。
本当にありがとうございます。


86ポイント を手に入れた。

Name: こまいぬ  ..入門者(2,581ポイント)   Date: 2009/10/17(土) 02:49   No:40555     
Title: Re:東方星蓮船のような雪をたくさん降らせるには    
よろしければ
イナバさんのソースを見させてもらえないでしょうか?
私も雪エフェクトにつまづき出来なくて困って・・


45ポイント を手に入れた。



Name: 男子  ..ぴよぴよ(49ポイント)   Date: 2009/10/16(金) 23:24   No:40535       
Title: ヒープソート    
Cは1年ぐらいやってます。OSはXPコンパイラはgccです。
ファイルから文字列を読み込んで辞書順にヒープソートするソースですが動きません。go,copy,hop,
,agoと4つの単語が一行に1つづつ書かれているファイルでは実行するとgo,copy,hopの3つだけが表示されます。
どこがいけないでしょうか?


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void swap( char *a, char *b );
void Hpsort(char s[], int n);
void DownHeap(char s[], int leaf, int root);

void swap( char *a, char *b )
{
char tmp;

// 文字列の入れ替え
while ( (*a != '\0') && (*b != '\0') ){
tmp = *a;
*a = *b;
*b = tmp;
a++;
b++;
}
// a 文字列が長い場合
while ( *a != '\0' ){
*b++ = *a; *a++ = '\0';
}
// b 文字列が長い場合
while ( *b != '\0' ){
*a++ = *b; *b++ = '\0';
}
*a = '\0';
*b = '\0';
}


void Hpsort(char s[], int n)
{
int leaf, root;

leaf = n; /* 初期値は末尾の要素 */
root = n/2; /* 初期値はその親 */

while (root > 0 ) { /* 半順序木を構成 */
DownHeap(s, leaf, root);
root--;
}

while(leaf > 0) {
swap(&s[1], &s[leaf]); /* 半順序木の根と末尾の要素を交換 */
leaf--; /* 末尾の要素を半順序木から外す */
DownHeap(s, leaf, 1); /* 半順序木を再構成する */
}
}



void DownHeap(char s[], int leaf, int root)
{
int i;

i = root * 2;
while (i <= leaf) {
if (i < leaf &&strcmp(&s[i + 1] , &s[i])>0) /* a[i] と a[i + 1] の大きい方と */
i++;
if (strcmp(&s[root], &s[i])>0) /* a[root] と比較 */
break; /* 子の方が大きければ */
swap(&s[root], &s[i]); /* 交換 */

root = i; /* 更にその子についても調べる */
i = root * 2;
}
}


int main(){

int i;
FILE *fp;
char s[4][10];

fp=fopen("test.txt","r");
if(fp==NULL){
printf("file not found\n");
exit(0);
}
for(i=1;i<5;i++){
fgets(s[i],10,fp);
}

for(i=1;i<5;i++){
printf("%s",s[i]);
}


Hpsort(s[4],4);


for(i=1;i<5;i++){
printf("%s",s[i]);
}
fclose(fp);
}



49ポイント を手に入れた。


Name: box  ..ハッカー(144,385ポイント)   Date: 2009/10/16(金) 23:44   No:40536     
Title: Re:ヒープソート    
s[4]と定義すると、アクセスできるのはs[0]〜s[3]です。
C言語の配列の添字はゼロ始まりであることを今一度確認なさってください。


66ポイント を手に入れた。

Name: 男子   Date: 2009/10/21(水) 12:42   No:405351256096529     
Title: Re:ヒープソート    
返信ありがとうございます。配列のインデックスはヒープ構造にする時に1から始まった方がわかりやすいためです。



Name: 困ったチャン  ..ぴよぴよ(148ポイント)   Date: 2009/10/16(金) 21:29   No:40526       
Title: 課題について    
命令ファイルによって直線、円とファイルから画像を入力し画面に貼り付ける機能を果たすプログラムを作っています。 しかし、自分で考えたプログラムでは実行時にセグメントエラーになります。ソースコードのファイルを添付するので、どなたか詳しい方問題点を指摘してください。お願いします。Cの学習は今年から始めました。

命令ファイル例
clear 0
line 60 120 260 120 1
line 160 20 160 220 1
circle 110 70 40 1
circle 210 170 40 1
image 180 50 c.pbm
image 210 30 c.pbm
image 210 70 sign.pbm
image 240 50 sign.pbm

コンパイル方法
cc cg.c -o cg -lm


148ポイント を手に入れた。




Name: つる  ..ぴよぴよ(233ポイント)   Date: 2009/10/16(金) 18:20   No:40517       
Title: typedefについて    
こんばんは。
C言語は初心者で、参考書を見ながら勉強中です。WindowsのVistaを使っています。コンパイラはBorland C++です。

参考書を見ていたら、typedefについて分からなかったので質問します。

typedef int INTEGER;
と宣言すると、
 INTEGER a;
 と、
 int a;
は実質的には同じになると記述されていました。
 ここは、理解できたのですが、

 typedef int Int5ary[5];
INt5ary x = {1, 2, 3}; ----@

 @は int x[5] = {1, 2, 3};と同じであると記述されているのですが、上記の方法ならば、
 @は int x = {1, 2, 3};になるのではないのでしょうか?

 どなたか、typedefについて教えていていただけませんか?
 よろしくお願いします。


233ポイント を手に入れた。


Name: GPGA  ..比類無きプログラマー(71,105ポイント)   Date: 2009/10/16(金) 18:50   No:40521     
Title: Re:typedefについて    

この問題は「型」というものの考え方を変えるだけで結構すんなり理解することができると思います。

int n[5];

上記を見た時に
int型の n という要素を5個もった配列を定義した
と認識すると思いますが、これを
intの5個の要素をもった配列という「型」の n を定義した
という考えたかに変えるのです。
プログラム的に記述すると以下のような考え方です。

int[5] n;


なお、JavaやC#などの言語だと型をそのように考えるようになっており
上記の内容を実際のプログラムで記述すると

int[] n = new int[5];

となります。
int配列の型 n を定義し、要素数を5個もった状態で実体化させています。
 


358ポイント を手に入れた。



Name: けん  ..かけだし(1,543ポイント)   Date: 2009/10/15(木) 19:50   No:40497       
Title: if    
あの・・単発なんですが、分からなかったので質問させてください
龍神録で
もしも最後の弾幕ならばという条件はどう書けばいいのか分からなくて
困ってるのですが、誰か助けてください><


77ポイント を手に入れた。


Name:  ..かけだし(1,643ポイント)   Date: 2009/10/15(木) 21:52   No:40501     
Title: Re:if    
1.新規フラグを作ります。
2.通常状態ならフラグが0です。
3.最後の弾幕が発動された瞬間フラグを1にします。
4.もしフラグが1のときは{処理}を行う。
5.必要であれば{処理}が終わった後にフラグを0に戻します。

そうすることで、最後の弾幕が発動したときに行う処理を実行することができます。

見当違いでしたらすいません。



151ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(442,594ポイント)   Date: 2009/10/15(木) 23:45   No:40504     
Title: Re:if    

>最後の弾幕ならばという条件

 50章で見ています。

 弾幕の進行状況は boss.kndでだと思われます。
 で、弾幕の最大数は

    boss.danmaku_num[0]=1;//中ボスが何個目までの弾幕を出すか
    boss.danmaku_num[1]=4;//最後に出るボスが何個目までの弾幕を出すか(47)

というコードを見ての通り、ボスごとに定義されています。

 これらの値 - 1が boss.kndの値と一致すれば
最後の弾幕中であると判定できるのではないでしょうか。


180ポイント を手に入れた。

Name: けん  ..かけだし(1,571ポイント)   Date: 2009/10/16(金) 00:54   No:40505     
Title: Re:if    
if(boss.danmaku_num[1]==-1){
}
ではうまくいきませんでしたorz


28ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(442,711ポイント)   Date: 2009/10/16(金) 00:58   No:40506     
Title: Re:if    

>>これらの値 - 1が boss.kndの値と一致すれば
boss.danmaku_num[1]==-1

 「これらの値 - 1」の「これらの値」と、boss.kndはどこで比較してるのですか?


117ポイント を手に入れた。

Name: けん  ..かけだし(1,593ポイント)   Date: 2009/10/16(金) 01:20   No:40507     
Title: Re:if    
boss.danmaku_num[1]-boss.knd
ということでしょうか?


22ポイント を手に入れた。

Name: Justy  ..伝説なるハッカー(443,001ポイント)   Date: 2009/10/16(金) 02:25   No:40508     
Title: Re:if    

>boss.danmaku_num[1]-boss.knd

 まぁその方向で突き詰めていっても判定はできなくはないですが、
そのままでは前は比較になっていたのが、今度はただの引き算になって
-1が消えてしまいました。


 先にこれらの値の値と書きましたが、よくみてみれば boss.danmaku_num[1]だけで
良さそうです。

 従って、これらの値、改め boss.danmaku_num[1] - 1が boss.kndの値と
一致すればいいということは、日本語の通りそのまま当てはめれば
boss.danmaku_num[1] - 1 == boss.knd ということなります。


290ポイント を手に入れた。

Name: けん  ..かけだし(1,619ポイント)   Date: 2009/10/16(金) 03:02   No:40509 解決!     
Title: Re:if    
なるほど・・
自分は何か勘違いしてました・・
おかげで無事、条件を作れました。ありがとうございます


26ポイント を手に入れた。



Name:  ..かけだし(2,442ポイント)   Date: 2009/10/15(木) 19:10   No:40496       
Title: 自機が死亡したとき、弾の消滅の仕方について    
再び、龍神録を改造してて分からないことがあったので教えてください。
東方では自機が死んだときに
自機を中心として、だんだん円形上?に敵やボスの弾が消えていくのですが
アレはどういった関数を利用して消しているのでしょうか?
誰か分かる方がいたら教えてください・・


101ポイント を手に入れた。


Name: Justy  ..伝説なるハッカー(442,181ポイント)   Date: 2009/10/15(木) 20:05   No:40498     
Title: Re:自機が死亡したとき、弾の消滅の仕方について    

>アレはどういった関数を利用して消しているのでしょうか

 見たことはないですが、その説明から察するに
単純に自機が死んだ座標と半径 rのパラメータを持たせ、
r=0から毎フレーム少しずつ加算しながらその半径内にある弾を
消しているのでしょう。

 で、全ての弾が消えればお終い、っと。


61ポイント を手に入れた。



Name: ホワイト  ..ぴよぴよ(10ポイント)   Date: 2009/10/13(火) 16:47   No:40378       
Title: 何故 0 で割ると計算出来ないの?    
数字をゼロでわるのはなぜいけないのですか?

(管理人によりタイトルが変更されました)


10ポイント を手に入れた。


Name: バグ  ..ハッカー(171,139ポイント)   Date: 2009/10/13(火) 16:49   No:40379     
Title: Re:無題    
参考URLです

http://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E9%99%A4%E7%AE%97


26ポイント を手に入れた。

Name: softya  ..上級者(16,009ポイント)   Date: 2009/10/13(火) 17:22   No:40382     
Title: Re:無題    
算数で習ったはずですが。
算数的に簡単に言うと、物を0個には分割できないんで答えが無いってことです。
ヨウカンを3人で分けましょうって出来るけど、ヨウカンを0人で分けましょうって意味が分からないでしょう?
答えが無い計算は、エラーにするしかないってのが今のコンピュータの考え方です。


82ポイント を手に入れた。

Name: イーグル  ..ぴよぴよ(23ポイント)   Date: 2009/10/14(水) 13:49   No:40444     
Title: Re:回答    
皿にヨウカンが、3つあります。0にんでわけます。
ヨウカンは誰のものでもありません。
ということでどうでしょう。


23ポイント を手に入れた。

Name: softya  ..上級者(17,943ポイント)   Date: 2009/10/14(水) 14:16   No:40447     
Title: Re:回答    
>皿にヨウカンが、3つあります。0にんでわけます。
>ヨウカンは誰のものでもありません。
>ということでどうでしょう。

誰のものでもないってことは、分けるって目的から既に逸脱してると思いますが。


24ポイント を手に入れた。

Name:  ..ぴよぴよ(177ポイント)   Date: 2009/10/14(水) 14:19   No:40448     
Title: Re:回答    
個人的な解釈ですが…

私も ヨウカン3つを0人で分ける=誰にも分けない→そのままの状態にしておく だと思います。
しかし、C言語ではプログラムによって一意な命令を与えなければいけません。
Youkan を X で割りなさい と命令すれば、Xが100でも0でも同様に割ろうとします。

一行目の「そのままの状態に…」はあくまで、
「0で分けるのだから」という条件を解釈した上での、言わば特別な行動です。

そのため、プログラムにも「Xが0ならそのままにしておけ」という命令を追加したり、
そもそも0で割らないようにするのだと思います。


172ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(112,712ポイント)   Date: 2009/10/14(水) 14:46   No:40452     
Title: Re:回答    
> 数字をゼロでわるのはなぜいけないのですか?

数字(という記号)を割るというのが何を意図しているのかわかりませんが...

数をゼロで割るということであれば、数学上の設定しだいでは可能です。
たとえば、仮に 1/0 を z という記号で表すと決め、あたかも複素数のように、それを用いた体系を定義すれば済むことです。

質問内容からは、数学の話なのか、プログラミングの話なのか、それ以外なのか判断がつきません(添付ファイルを見ても意図がわかりません)ので、一般的な話しかできません。


45ポイント を手に入れた。

Name: sizuma  ..上級者(16,005ポイント)   Date: 2009/10/14(水) 17:50   No:40456     
Title: Re:回答    
昔、頭のいい人が0ってものを考え出して、
またある人が
「0で割り算することは出来ない」
と決まりを定めた

からでは?

Cの言語設計したひとが、0割算はエラーとしたから、Cではエラーになるので。
他の言語では0で割ったら0になる、とかいう設計もありましたよ。


50ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(112,772ポイント)   Date: 2009/10/14(水) 18:36   No:40457     
Title: Re:回答    
> Cの言語設計したひとが、0割算はエラーとしたから、Cではエラーになるので。

/演算子と%演算子の第2オペランドが0の場合の動作は未定義です。エラーになるとは限りません。
例えば、多くの処理系では、1.0/0.0は無限大になります。


60ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,074,089ポイント)   Date: 2009/10/14(水) 20:05   No:40464     
Title: Re:回答    
大学受験の時、ある計算をしていて、こんな結果になりました。
確か数IIIの極限の計算をしていた時でしょうか?
自分としてはこの考え方が一番しっくりきます。

2をxで割った数がyだとしましょう。

2/x = y

両辺にxをかけると

2 = xy

になりますよね?この時、もしx=0ならば、yに何を入れたら式を満たすでしょうか?

2 = 0*y

これですね。
0って何をかけても必ず0になる数値です。
ところが、0に何をかけたら2になりますか?
と聞いているのです。ここで矛盾が生まれますよね?
つまり式を満たさない、計算できない値なのです。


277ポイント を落としてしまった。

Name: Dixq (管理人) [URL]  ..ウィザード(1,076,405ポイント)   Date: 2009/10/14(水) 20:30   No:40466     
Title: Re:回答    
>「0で割り算することは出来ない」と決まりを定めたからでは?

誰かが定めたからそうなったわけではなく、数学的に計算上そうなるからだと思います。
もう少し余計な話をしてみます。

0 ÷ 2 って「0」ですよね?
でも
2 ÷ 0 って「値なし」です。何故かというと、上の式も先ほどの式に代入すればわかります。

x/2 = y

両辺に2をかけて

x = 2y

x=0の時

0 = 2y

この時yに何を入れたら式を満たしますか?と聞かれたらy=0ですよね?
ですから、こちらには答えがちゃんとあるわけです。
では、

0÷2は「0」だということがわかりました。
2÷0は「値なし」だということがわかりました。
では

0÷0はどうなるんだ?

と思いますよね。結果どちらになるのでしょう。
これも先ほどと同じ式に当てはめてみます。

x/y = a

という式があったとし、両辺にyをかけます。

x = ay

になりました。ここで、x=0,y=0を代入してみましょう。

0 = a*0

この式を満たすaの値は何ですか?
0は何をかけても0になります。
つまり、aに何が入っても式を満たします。

つまり答えは・・・・「なんでもいい」ということになります。
嘘みたいな話ですが、大学受験に問題が出たらそう書いて大丈夫です(ナンデモイイとは書かず、「全ての数」みたいな書き方になるでしょうけど)。
まとめると

0÷2は 0
2÷0は 値なし
0÷0は ナンデモイイ

ということになります。


715ポイント を手に入れた。

Name: lbfuvab  ..上級者(22,731ポイント)   Date: 2009/10/14(水) 20:59   No:40471     
Title: Re:回答    
定義の仕様がないので手っ取り早く「それはタブー」としただけです。

説明としては
10 / 1 = 10
10 / 0.1 = 100
10 / 0.01 = 1000
と分母を正の数を取りながら0に近づけると、どんどん大きくなります ・・・@

ところが

10 / (-1) = -10
10 / (-0.1) = -100
10 / (-0.01) = -1000

と分母を負の数を取りながら0に近づけると、どんどん小さくなります ・・・A

@、Aよって0で割った時は定義できないのです。


184ポイント を手に入れた。

Name: ホワイト  ..ぴよぴよ(72ポイント)   Date: 2009/10/15(木) 12:46   No:40489 解決!     
Title: 何故 0 で割ると計算出来ないの?    
みなさん詳しく教えてくださってありがとうございます。

あと、間違えてファイルを添付してしまったので、混乱させてしまいすいませんでした


62ポイント を手に入れた。

Name: parapara  ..上級者(18,541ポイント)   Date: 2009/10/15(木) 14:49   No:40492     
Title: Re:何故 0 で割ると計算出来ないの?    
高校の範囲だと、理解は出来ません。lim→+-0の話が近いですが-∞+∞
大学の範囲で中堅以下は飛ばされてしまうことが多いい解析学の中のεで
無限と0について書かれています。


68ポイント を手に入れた。

Name: たいちう  ..プログラマー(35,484ポイント)   Date: 2009/10/15(木) 18:20   No:40495     
Title: Re:何故 0 で割ると計算出来ないの?    
> 誰かが定めたからそうなったわけではなく、
> 数学的に計算上そうなるからだと思います。

私たちにとって常識的な「数学的な計算」の体系も、
誰かが定めたものです。
他の体系と比較して圧倒的にポピュラーなので、
普段は意識すらしませんけど。

0での除算を定義できる体系もあったはずです。


52ポイント を手に入れた。



Name: イーグル  ..ぴよぴよ(46ポイント)   Date: 2009/10/14(水) 13:52   No:40445       
Title: ?    
さいん??????? こさいん?????
だれかわかりやすく教えてくださいませんか? 


23ポイント を手に入れた。


Name: Mist  ..熟練のプログラマー(68,955ポイント)   Date: 2009/10/14(水) 14:07   No:40446     
Title: Re:?    
三角関数の初歩

http://www8.plala.or.jp/ap2/suugaku/sankakukansuunoshoho.html


37ポイント を手に入れた。

Name: たかぎ [URL]  ..ハッカー(112,667ポイント)   Date: 2009/10/14(水) 14:34   No:40451     
Title: Re:?    
高校で分かりやすく教えてくれると思います。


2倍のポイントを手に入れた! 30ポイント を手に入れた。

Name:  ..かけだし(1,218ポイント)   Date: 2009/10/14(水) 18:48   No:40459     
Title: Re:?    
お近くの高専情報系学科に入りましょう。
入学した瞬間から三角関数を学べます。


32ポイント を落としてしまった。

Name: Dixq (管理人) [URL]  ..ウィザード(1,074,366ポイント)   Date: 2009/10/14(水) 19:54   No:40462     
Title: Re:?    
イーグルさん、こんばんは。

文系の方ですかね。
もしくは中学生とかでしょうか?
イーグルさんのことは解りませんが、自分の専門外や高校の時嫌いだった分野はいつになっても解りにくいものですよね。

サインというのは直角三角形の対辺を斜辺で割ったものです。
コサインというのは同様に底辺を斜辺で割ったものです。
聞いただけではわからないでしょうから、図を見ながらご覧ください。

http://w3e.kanazawa-it.ac.jp/math/category/sankakukansuu/henkan-tex.cgi?target=/math/category/sankakukansuu/hen-no-namae.html

何でいちいちこんな対辺を斜辺でわったような意味のわからないことをするのか?
そういう疑問もあるでしょう。
しかし、この考え方はいたるところで便利な使い方が出来ます。
例えばシューティング。弾がある角度で飛んで行っているとしますね。
弾はある角度で飛んで行っているわけですが、プログラム上では座標はx,yに分解して計算しなければなりません。(表示するときの座標を指定する為)
例えば「角度42度で10m進んだ時の垂直方向の距離(y)は?」なんて聞かれたらどうでしょう。困ってしまいますよね。

このとき、10mというのは斜辺を意味するわけです。
ということは(対辺/斜辺)を表すサインを斜辺にかけると、あら不思議、対辺つまりy成分が出るのです。
ですから

10 m * sin(42°)

を計算すれば42度で10m進んだ時の垂直成分の距離が出る訳です。
こういうわけで、x方向も同様に計算すると、x,y成分に分解する事が出来るのです。
sin,cosの数学に及ぼす影響はもちろんこれだけではなく、はかり知れません。
この説明でなんとなく こんなもんなんか〜 と思って頂けたら、
ぐぐってみるなりして調べてみてください☆


626ポイント を手に入れた。

Name: イーグル  ..ぴよぴよ(100ポイント)   Date: 2009/10/15(木) 14:28   No:40490     
Title: Re:?    
ありがとうございます。(中学生です)
Mistさんや管理人さんがおしえてくれたさいとで
だいたいは、わかりました。


54ポイント を手に入れた。



Name: parapara  ..上級者(18,445ポイント)   Date: 2009/10/14(水) 21:40   No:40473       
Title: windowsのプログラムを作るには    
以前2,3年前お世話になっていたものです。dixQ様とGPGA様、他にも昇進状態上位の人にお世話になっていました。ありがとうございます。あの頃はCの様々なアルゴリズムを教えていただいていました。
windowsのプログラムを作るためには、2年以上前の事なので結構忘れてるが、色々努力してきたのですが、駄目でした。まずはじめに、
プログラミング学習シリーズ Visual C++ 1 はじめてのWindowsプログラミング
をやりました。長いコードを丸暗記しました。←丸暗記というやり方は間違っていたでしょうか?
徐々に覚えていくというやり方のほうが良かった気がします。どうでしょう?
DLLの箇所は理解できませんでしたが、大きな収穫はありました。この本の売りはCしか知らなくてもAPIを学べて簡単なwindowsのプログラムを作れるというものでしたが、www13.plala.or.jp/kymats/book/book.htmlにも書いてあるように、完全読破しても自分で作れるようにならないのです。次に
Windowsゲームプログラミング 著者 赤坂玲音
をやった気がします。マルチスレッドやセマフォなどプログラミングの技術は全部習得できましたが、
最後の方の数種類のゲームはコードだけで解説が無いので、挫折しました。ここでwindowsプログラミングから手を引きました。
今思っていることは、Cだけじゃwindowsプログラミング無理なんじゃないか?
@C++を勉強するべきなんじゃないか?そのあとVisualC++を勉強するべきじゃないか?
それとも、A?才からはじめるで、DXライブラリで簡単な流れをつかむか?
複雑なwindowsプログラム作っている人は、MFC使っている人が多いんじゃないですか?どうなんでしょ?
CとAPIだけでプログラム作るのはめんどくさくないでしょうか?
あくまで素人判断ですので、気を悪くされないように。
以上の質問全てに答えて頂きたいです。お手を煩わせてすみません。
又windowsプログラミングを私はある本を読んでこうして(丸暗記or徐々)習得したとか?体験談募集^^/
又windowsプログラミングを習得するのに良い本ありましたら教えてください。凄く知りたいです。
お願いします。猫でもはCしか知らないので受け付けなかったです。





696ポイント を手に入れた。


Name: tkmakwins15  ..比類無きプログラマー(98,277ポイント)   Date: 2009/10/14(水) 22:33   No:40477     
Title: Re:windowsのプログラムを作るには    
あくまで僕の意見ですが…
1.Windows APIプログラミングは考え方だけ習得して後はリファレンスでどうにかしてます。
 あれを丸暗記するなんて無理です。
2.C++は勉強して損は無いですよ。とりあえず「独習C++」でC++に関しては大抵どうにかなります。
 別にクラスを使わなくてもstd::string(標準文字列ライブラリ)とかだけでもだいぶ楽です。
 何よりライブラリの選択肢が格段に増えます。
3.またはC#を勉強して.NETにするというのもいいかも…(これが最も手っ取り早いかも)

僕自身は最近はMFCではなくATL/WTLにずいぶん依存してますけど…


259ポイント を手に入れた。

Name: softya  ..上級者(18,487ポイント)   Date: 2009/10/14(水) 23:23   No:40478     
Title: Re:windowsのプログラムを作るには    
C++とMFCの組み合わせは手軽に作る分には楽ですが、込み入った事をしようとするとWindowsAPIを直接使っているよりも面倒な事になったりします。それにMFCを使いこなすには、最終的にC++のクラスの知識とWindowsAPIの知識の両方が必要になってきます。
WindowsAPI自体は、CでもC++からでも使えますが面倒さはさほど変わらないです。クラスで隠蔽してミニMFCみたいな物を自分で作れば後々は楽が出来ますね。同様にCでもWindowAPIを隠蔽するライブラリを自前で書いちゃえば面倒な事はある程度避けられます。
最近の事情としてはMFCの情報が極端に減ってきています。本もここ5年ほど新しいものは出ていません。本を探す事自体が難しくなっています。需要が無いでしょうか?それともMFCの難しさに気づいたんでしょうか?
なので、今WindowsAPIを組むのならWindowsAPIで直接組むか、.NET系(C#やC++/CLI)で組むことが選べる選択枝でしょう。
私としては、これからオブジェクト指向の道に進むならWindowsAPIをうまくクラス・ライブラリで隠蔽しているC#をお勧めします。

で、勉強の方法ですがWindowsプログラミングで大事な事は関数を丸暗記する事ではなくて、Windowsメッセージの仕組みを理解する事だと思います。それと基本的なメッセージの種類ですね。どんな時にどんなメッセージが飛んでくるかはある程度覚えたほうが良いかと思います。あまり使わないメッセージはメモしておけば大丈夫な程度でしょう。C#に行くとしても、ここの部分は理解しておいた方が良いでしょう。もちろん、WindowsAPIを直接使うなら分からないと話になりません。

Windowsの仕組みの本を読まれて、まず基本的なことから理解してみてはいかがでしょうか?
http://software.nikkeibp.co.jp/software/backno/04apimook2.html


462ポイント を手に入れた。

Name: dic  ..プログラマー(34,539ポイント)   Date: 2009/10/15(木) 05:35   No:40482     
Title: Re:windowsのプログラムを作るには    
私も独自の見解ですが
1.Cを理解する
2.C++を理解する
3.猫でも分かるプログラミング Windows SDK http://homepage2.nifty.com/c_lang/
の順に理解していくしかないと思います


Windowsは昔とありますが、Linux,UNIX系統の開発の経験があって、それにどっぷりつかってしまった
ということでしょうか?

いきなりDLLの概念を理解されても、それを使う方法がわからないのでは元も子もないと思います

私もいきなりMFCから入り挫折しかけた経験があります
MFCとはMicrosoftFoundationClassの略で、C++を理解していても扱うのは難しいです
SDKとはSingleDeveloperKitの略で、こちらから徐々に慣れていった方がいいです

最近の本はいきなりMFC,C#使ったりと初心者向けではないです


206ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(42,188ポイント)   Date: 2009/10/15(木) 08:00   No:40483     
Title: Re:windowsのプログラムを作るには    
CでWindowsプログラムするのが好きな一人です。
私もdicさんの意見に賛成ですね。
昔VisualC++6.0を買ったころ中に入っていたMFCの解説本で初めてC++とWindowsプログラムに触れました。
挫折しました。
それまでのCプログラムはmain( )で始まってプログラムの進み方がたどれて行くので理解しやすかったのですがMFCだとまずmain( )関数がないのにとまどいました。そして必要な処理をどこに書けばいいのかさっぱりわからず。
その後猫でもわかるのサイトでSDKプログラムに出会い再度Windowsプログラムに挑戦しました。
今度はとりあえずWinMain( )で始まるのに安心。
Windowsではメインループでメッセージを処理しながらプログラムすればいいとわかりそれからはCの書き方でWindowsSDKのプログラムばかりです。
SDKのプログラムに慣れるとMFCのプログラムもメッセージの処理を自動で関数にしているだけとわかり理解しやすくなりました。

猫でもわかるのWindows SDK編はCで書かれていますよ。


237ポイント を手に入れた。

Name: バグ  ..ハッカー(171,434ポイント)   Date: 2009/10/15(木) 08:12   No:40484     
Title: Re:windowsのプログラムを作るには    
他の人も書かれていますが、MFCはクラスライブラリなのでC++の知識が必須となります。
更に言えば、WINAPIについての知識もあればモアベターです。(無くてもMSDNでの調べ方を身に付ければ問題ありません)
ここからは個人的な意見ですが、Windowsプログラミングをやりたいだけであれば、C#やVBで.NETライブラリを使用する方が分かりやすいのではないかと思います。
というのも、MFCと比べると、クラス、メソッド、プロパティなんかの名前が直感的で分かりやすいんですよ。
ただ、トピ主さんは本を読んだり、ネットで情報を集める事に固執し過ぎているように感じます。トライ&エラーを繰り返さないと本当の意味では身につかないと思いますよ。


295ポイント を手に入れた。

Name: parapara  ..上級者(18,473ポイント)   Date: 2009/10/15(木) 09:48   No:40485 解決!     
Title: Re:windowsのプログラムを作るには    
tk様とsoft様は僕の求めていた事と違いますが、ありがとうございます。
C#だと複雑なものは作れないと聞いた気がします。
薦めてくださった日経本はC++の知識がないと無理な気がします。持っていますが。
dic様toyo様こんなに愚かな私に手を差し伸べてくださりありがとうございます。
まさに私の求めていたものです。
まずC++をやらないとですね。猫でもの本もC++をやってからのほうがいい気がします。
バグ様すいません。愚かな僕は本を読んだり、分んない所をネットで調べるしかできません。
これはもう筋金入りの性格ですね。

追記ここ2年、僕はどっち行こうか色々悩んでいて、もう一度大学行くための勉強をしてるんです。


28ポイント を手に入れた。

Name: softya  ..上級者(18,660ポイント)   Date: 2009/10/15(木) 10:33   No:40486     
Title: Re:windowsのプログラムを作るには    
>薦めてくださった日経本はC++の知識がないと無理な気がします。持っていますが。
申し訳ないですが、日経本の記述に一切C++は使われておりません。全てC言語です。
なにか、C++に幻想を抱かれていませんか?
C++はあくまでも、C言語にオブジェクト指向のクラスの概念を加えただけのものです。
日経本の内容がC++に見えるとしたら、C言語の勉強を再度された方が良いと思います。


173ポイント を手に入れた。

Name: バグ  ..ハッカー(171,577ポイント)   Date: 2009/10/15(木) 11:06   No:40487     
Title: Re:windowsのプログラムを作るには    
>>C#だと複雑なものは作れないと聞いた気がします。


んなこたぁないです(笑)
よっぽどの上級者とか、スペシャリスト級になれば分かりませんが、大抵の事はできますよ。
WINAPIの関数を使う事も可能ですし、WINAPIでやれる事は全てやれると思って大丈夫だと思います。
更に言えば、.NETを使えば、C#もVBも文法の違いだけでほとんど違いは無いです。


143ポイント を手に入れた。

Name: toyo  ..熟練のプログラマー(42,331ポイント)   Date: 2009/10/15(木) 11:19   No:40488     
Title: Re:windowsのプログラムを作るには    
>まずC++をやらないとですね。猫でもの本もC++をやってからのほうがいい気がします。

いや、私もC++はほとんどわかりません。
CオンリーでWindowsプログラムしています。(DirectXのクラスを使うときだけ拡張子を.cppにしてC++としてコンパイルしますがメインのプログラム記述はほぼCとして書きます。)
猫でもの本は持ってませんがサイトの方のWindowsSDK編はCで書かれていますよ。


143ポイント を手に入れた。



Name: いけやん  ..上級者(17,091ポイント)   Date: 2009/10/13(火) 23:41   No:40416       
Title: ボス死亡エフェクトについて    
50章をいじってます。
お聞きしたいのですが
東方みたいなボスの死亡エフェクトってどうやれば
できるのでしょうか?作り方のアドバイスがあれば教えてほしいのですが
よろしくお願いします。


84ポイント を手に入れた。


Name:  ..初心者(8,353ポイント)   Date: 2009/10/14(水) 15:16   No:40454     
Title: Re:ボス死亡エフェクトについて    
スロウになるところは処理落ちでおk

2倍のポイントを手に入れた! 36ポイント を手に入れた。

Name: Dixq (管理人) [URL]  ..ウィザード(1,076,426ポイント)   Date: 2009/10/14(水) 20:40   No:40468     
Title: Re:ボス死亡エフェクトについて    
「東方みたいな」といっても、色々あると思いますが、どのようなエフェクトでしょうか?
具体的に言って頂ければ何か言えることがあるかもしれません。

ただ、処理落ちで再現するのは・・・^^;

処理落ちに見せるということであれば、座標計算関数を2回に1回呼ぶなどという方法が良いかもしれませんね。


66ポイント を落としてしまった。

Name: いけやん  ..上級者(17,201ポイント)   Date: 2009/10/15(木) 02:14   No:40480     
Title: Re:ボス死亡エフェクトについて    
なんていうんでしょうか・・
最後の弾幕のHPがなくなったとき、
すぐにはボスは消滅せずに
ボスの中心からぶわ〜っと星みたいな画像を綺麗に
ランダム?に放出してから消滅する感じでしょうか?
スロウ・・もできるんでしょうか?
私もあれは処理落ちかと思ってたんですが
仕様で可能に出来るなら教えていただきたいです
よろしくお願いします


110ポイント を手に入れた。



Name: C初心者  ..かけだし(2,288ポイント)   Date: 2009/10/13(火) 14:44   No:40371       
Title: マッチメイク    
C言語を始めて半年の者です。
nチームからなるリーグ戦で考えられる対戦組み合わせを全部求めるプログラムを考えてみました↓
nチームそれぞれに1〜nの番号をふり、その番号をチーム名とする。
#include <stdio.h>
int main(void)
{
int i, j, n;
FILE *fp;
printf("Please input n:\n");
scanf("%d", &n);
fp = fopen ("data", "w");

for(i = 1; i <= n; i++){
for(j = i; j <= n; j++){
if(i != j){
fprintf(fp, "%d %d\n", i, j);
}
}
}
fclose(fp);
return 0;
}

今度はA={1,3,5,..,2n-1}←(奇数番号)とB={0,2,4,...,2n-2}←(偶数番号)のnチームずつ2リーグに分け
交流戦の対戦組み合わせをすべて求めるプログラムを作成しようとしていますが、
なかなか良い案が浮かびません。さらに欲を言えば例えば
    例)n=4の場合 A={1,3,5,7} B={0,2,4,6}
      一日目{1-0,3-2,5-4,7-6}
二日目{1-2,3-4,5-6,7-0}
......
のようにただ組み合わせを列挙するだけでなく、日にちごとに組み合わせを並べるプログラムを考えています。
何か良い案があればお教えください。ちなみに上のプログラムは無視して結構です。この程度のことで初心者なもんですいません。


460ポイント を手に入れた。


Name: たいちう  ..プログラマー(35,301ポイント)   Date: 2009/10/13(火) 14:57   No:40372     
Title: Re:マッチメイク    
n=4について、三日目以降の組み合わせを全て書き出してみましょう。できるだけ規則的に。
n=5についても同様。
n=6についてはやらなくても、そろそろ規則性を見つけることができるのでは?


2ポイント を手に入れた。

Name: C初心者  ..かけだし(2,289ポイント)   Date: 2009/10/13(火) 23:34   No:40415     
Title: Re:マッチメイク    
n=4の場合は24通り
n=5の場合は120通りあるのでそこから規則を見つけ出すのは難しいかと


1ポイント を手に入れた。

Name: たいちう  ..プログラマー(35,316ポイント)   Date: 2009/10/14(水) 08:58   No:40428     
Title: Re:マッチメイク    
その24通りと120通りをここに書いてみてください。

15ポイント を手に入れた。

Name: C初心者  ..入門者(3,107ポイント)   Date: 2009/10/14(水) 11:03   No:40434     
Title: Re:マッチメイク    
24通り
{0-1,2-3,4-5,6-7}
{0-1,2-3,4-7,6-5}
{0-3,2-1,4-5,6-7}
{0-1,2-5,4-3,6-7}
{0-1,2-7,4-5,6-3}
{0-5,2-3,4-1,6-7}
{0-7,2-3,4-5,6-1}
{0-1,2-5,4-7,6-3}
{0-3,2-5,4-1,6-7}
{0-1,2-7,4-3,6-5}
{0-5,2-1,4-3,6-7}
{0-5,2-3,4-7,6-1}
{0-7,2-3,4-1,6-5}
{0-7,2-1,4-5,6-3}
{0-3,2-7,4-5,6-1}
{0-7,2-1,4-3,6-5}
{0-3,2-5,4-7,6-1}
{0-3,2-1,4-7,6-5}
{0-7,2-5,4-3,6-1}
{0-5,2-1,4-7,6-3}
{0-3,2-7,4-1,6-5}
{0-7,2-5,4-1,6-3}
{0-5,2-7,4-3,6-1}
{0-5,2-7,4-1,6-3}
特に規則性を見出すことはできませんでした。
数学的センスがないもんで。


2倍のポイントを手に入れた! 818ポイント を手に入れた。

Name: non  ..熟練のプログラマー(64,184ポイント)   Date: 2009/10/14(水) 12:01   No:40437     
Title: Re:マッチメイク    
>特に規則性を見出すことはできませんでした。
規則性がないなら、答えを出せなかったと思いますが。

C++ならここが参考になります。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00108.html



59ポイント を手に入れた。

Name: C初心者  ..入門者(3,134ポイント)   Date: 2009/10/14(水) 13:11   No:40442     
Title: Re:マッチメイク    
C++ではなくCです。
0-□,2-□,4-□,6-□
□の部分を順列で埋めてみるということですか?


27ポイント を手に入れた。

Name: non  ..熟練のプログラマー(64,036ポイント)   Date: 2009/10/14(水) 14:48   No:40453     
Title: Re:マッチメイク    
> C++ではなくCです。

そうですか、残念です。

> 0-□,2-□,4-□,6-□
> □の部分を順列で埋めてみるということですか?

No:40434 の24通りからすると、そうだと思いました。
最初の質問の意味がよくわかってないものですから。
リーグ戦の総当たりだけなら24通りもありませんし。

順列をCで求める方法はここが参考になります。
私なら、再帰呼び出しを使う方法で解きます。
http://jubilo.cis.ibaraki.ac.jp/~isemba/PROGRAM/CPROG/c.shtml


148ポイント を落としてしまった。

Name: zard  ..ぴよぴよ(29ポイント)   Date: 2009/10/14(水) 19:15   No:40461     
Title: Re:マッチメイク    
問題はどうやって奇数番号の順列にするかですね
初心者にはキツイです


29ポイント を手に入れた。

Name: たいちう  ..プログラマー(35,316ポイント)   Date: 2009/10/14(水) 20:00   No:40463     
Title: Re:マッチメイク    
1〜nの順列を生成して、2倍して1を引けば良い。

Name: C初心者  ..入門者(3,489ポイント)   Date: 2009/10/14(水) 21:53   No:40474     
Title: Re:マッチメイク    
pre
#include <stdio.h>
int main(){
int a[99999];
int d[99999];
int i,j;
int n; /* 要素の個数 */
int r; /* 取り出す要素数 */
int count; /* 順列の個数 */
while(1){
printf("要素の個数:");
scanf("%d",&n);
printf("取り出す要素数:");
scanf("%d",&r);
printf("\n");
if(n<=0){
break;
}
count=0;
for(i=1;i<=r;i++){
a[i]=1;
}
do
{
d[0] = 1;
for(j=1;j<=n;j++){
d[j]=0;
}
a[0]=0;
i = r;
d[a[i]]++;
while(d[a[i]]==1){
i--;
d[a[i]]++;
}
if(i==0){
count++;
printf("%6.0d:",count);
for(i=1;i<=r;i++){
printf("%2d ",2*a[i]-1);
}
printf("\n");
}
i = r;
a[i]++;
while(a[i]>n){
a[i]=1;
i--;
a[i]++;
}
} while(i>=1);
printf("\n");
printf("%d通り\n",count);
printf("\n");
}
}
/pre

↑はどうでしょうか?何か不備がありましたら、アドバイスください。
これでn=4,r=4とすると24通り生成できましたが、そもそも順列にしなくても
n!通り最初から生成するほうが普通ですよね?


355ポイント を手に入れた。

Name: たいちう  ..プログラマー(35,432ポイント)   Date: 2009/10/14(水) 22:15   No:40476     
Title: Re:マッチメイク    
・<pre>タグの使い方を間違っているのでソースコードを読みにくい。
・rをnに置き換えて、不要な部分を削ればよい。
・main()の最後にreturn 0;を追加する。
・私も順列生成は再帰を使う。その方がプログラムが理解しやすいから。
・普通かどうかは状況次第。


116ポイント を手に入れた。




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +