C言語何でも質問掲示板

Total hit  今日  昨日  



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

 
   C++エラーについて質問 ....   
     ・[44042] DVDM 
     ・[44046] シノニム 
   円形に敵弾を消しさる ....   
     ・[44032] あ〜る 
     ・[44033] y 
     ・[44036] Dixq (管理人) 
   スタッフロールについ ....   
     ・[44016] kazuoni 
     ・[44019] 電々 
   管理人さんにお聞きし ....   
     ・[44009] Dixq (管理人) 
   数値解析法   
     ・[44001] kazuoni 
   TextOutについて   
     ・[43991] たこやき 
     ・[43993] softya 
     ・[43994] たこやき 
     ・[43995] たこやき 
   点滅のさせる計算式   
     ・[43955] Dixq (管理人) 
     ・[43978] kai 
     ・[43981] Dixq (管理人) 
     ・[43982] kazuoni 
     ・[43983] kazuoni 
     ・[43984] kai 
     ・[43988] Dixq (管理人) 
   自機を画面の中心に吸 ....   
     ・[43930] Dixq (管理人) 
     ・[43935] Justy 
     ・[43941] Dixq (管理人) 
     ・[43957] Justy 
     ・[43979] はね 
     ・[439111260958271] はね 
   弾幕のプチテストプレ ....   
     ・[43926] ひよこ 
     ・[43928] Dixq (管理人) 
     ・[43945] jay 
     ・[43950] ひよこ 
     ・[43974] jay 
   ポインタについて   
     ・[43914] non 
     ・[43917] pokka 
     ・[43919] あまち 
     ・[43920] Mist 
     ・[43927] Tatu 
     ・[43929] Mist 
     ・[43931] non 
     ・[43938] Tatu 
     ・[43947] pokka 
     ・[43949] non 
     ・[43972] pokka 
   張り付けの誤動作につ ....   
     ・[43967] Dixq (管理人) 
   ヘッダーについて   
     ・[43934] kk 
     ・[43936] Mist 
     ・[43937] kk 
     ・[43939] Mist 
     ・[43966] Dixq (管理人) 
   タスクシステムについ ....   
     ・[43882] 御津凪 
     ・[43888] ジャーニー 
     ・[43894] 御津凪 
     ・[43897] ジャーニー 
     ・[43904] GPGA 
     ・[43958] ジャーニー 
   ボスの弾幕について   
     ・[43889] Dixq (管理人) 
     ・[43954] ジュンヤ 
   しましま描画について   
     ・[43877] softya 
     ・[43878] ベース 
     ・[43879] ベース 
     ・[43881] ベース 
     ・[43901] sizuma 
     ・[43915] ベース 
     ・[43940] ベース 
   ボスの表現の仕方につ ....   
     ・[43767] ☆ 
     ・[43770] Dixq (管理人) 
     ・[43777] スタートメニュー 
     ・[43790] kazuoni 
     ・[43791] 御津凪 
     ・[43866] スタートメニュー 
     ・[43890] Dixq (管理人) 
     ・[43925] スタートメニュー 
   字下げと空白   
     ・[43918] Mist 
     ・[43923] Justy 
     ・[43924] Dixq (管理人) 
   括弧の式による演算   
     ・[43795] Libra 
     ・[43893] MP 
     ・[43899] sizuma 
     ・[43900] pooka 
     ・[43902] Libra 
     ・[43903] MP 
     ・[43922] pooka 
   C++の宿題で困っていま ....   
     ・[43862] たいちう 
     ・[43864] non 
     ・[43865] kos-mos 
     ・[43895] Dixq (管理人) 
     ・[43909] non 
     ・[43910] たいちう 
   classを使って龍神録を ....   
     ・[43871] wing 
     ・[43875] softya 
     ・[43876] wing 
     ・[43907] wing 
     ・[43908] wing 
   インターフェイスの利 ....   
     ・[43754] たかぎ 
     ・[43760] sizuma 
     ・[43783] mnkr 
     ・[43787] 御津凪 
     ・[43905] mnkr 
   丸い太鼓の膜の振動の ....   
     ・[43811] やそ 
     ・[43812] 山崎 
     ・[43891] Dixq (管理人) 
   画像の取り込み   
     ・[43830] Mist 
     ・[43832] 77 
     ・[43836] Mist 
     ・[43840] 77 
     ・[43841] 77 
     ・[43844] Mist 
     ・[43846] 77 
     ・[43847] Mist 
     ・[43853] dic 
     ・[43880] ROM 
     ・[43887] Dixq (管理人) 
   管理人さんに聞きたい ....   
     ・[43757] Justy 
     ・[43771] Dixq (管理人) 
     ・[43772] Dixq (管理人) 
     ・[43779] 匿名 
     ・[43780] Justy 
     ・[43885] Dixq (管理人) 
   【雑談】よくある質問   
     ・[43592] kazuoni 
     ・[43593] たかぎ 
     ・[43594] Justy 
     ・[43598] tkmakwins15 
     ・[43619] バグ 
     ・[43658] tkmakwins15 
     ・[43659] tkmakwins15 
     ・[43672] Justy 
     ・[43685] Ma 
     ・[43690] バグ 
     ・[43691] たかぎ 
     ・[43735] bagu  
     ・[43736] バグ 
     ・[43741] バグ 
     ・[43744] たかぎ 
     ・[43747] バグ 
     ・[43758] Justy 
     ・[43798] バグ 
     ・[43804] Justy 
     ・[43805] バグ 
     ・[43816] バグ 
     ・[43817] バグ 
     ・[43884] Justy 
   分割ファイル   
     ・[43810] s-rush 
     ・[43813] layman 
     ・[43819] s-rush 
     ・[43822] layman 
     ・[43868] softya 
   バックスラッシュを入 ....   
     ・[43851] Mist 
     ・[43852] Mist 
     ・[43854] Mist 
     ・[43855] dic 
     ・[43856] dic 
   SEの止め方   
     ・[43818] Dixq (管理人) 
     ・[43820] kazuoni 
     ・[43823] まい 
   C# 加算演算子   
     ・[43696] バグ 
     ・[43697] バグ 
     ・[43702] softya 
     ・[43709] tk 
     ・[43713] YuO 
     ・[43714] YuO 
     ・[43737] たいちう 
     ・[43739] たかぎ 
     ・[43740] たいちう 
     ・[43821] tk 
   octave-3.2.3のコンパ ....   
   フルスクリーン時デバ ....   
     ・[43567] 御津凪 
     ・[43570] Libra 
     ・[43572] 御津凪 
     ・[43603] Libra 
     ・[43606] 御津凪 
     ・[43653] Libra 
     ・[43655] 御津凪 
     ・[43730] Libra 
     ・[43732] 御津凪 
     ・[43796] Libra 
     ・[43808] 御津凪 
   部分和   
     ・[43800] non 
     ・[43803] たいちう 
   多重インクルードにう ....   
     ・[43784] array 
     ・[43788] kazuoni 
     ・[43793] Ma 
     ・[43801] たいちう 
   フレームスキップ   
     ・[43612] Dixq (管理人) 
     ・[43670] ft 
     ・[43671] Justy 
     ・[43776] Dixq (管理人) 
     ・[43785] Justy 
   ステージ切り替え処理 ....   
     ・[43626] Dixq (管理人) 
     ・[43632] ジュンヤ 
     ・[43646] kazuoni 
     ・[43712] ジュンヤ 
     ・[43721] kazuoni 
     ・[43762] ジュンヤ 
     ・[43775] Dixq (管理人) 
   60章、画像を変える ....   
     ・[43759] Naohiro19 
     ・[43768] はね 
     ・[43774] Dixq (管理人) 
   三角関数   
     ・[43111] YuO 
     ・[43120] 50CIMA 
     ・[43121] Ma 
     ・[43124] 50CIMA 
     ・[43157] たかぎ 
     ・[43163] 50CIMA 
     ・[43165] たかぎ 
     ・[43169] 50CIMA 
     ・[43175] MNS 
     ・[43179] 50CIMA 
     ・[43194] non 
     ・[43231] たいちう 
     ・[43324] 50CIMA 
     ・[43343] MNS 
     ・[43353] non 
     ・[43373] Dixq (管理人) 
     ・[43585] 50CIMA 
     ・[43589] softya 
     ・[43591] 組木紙織 
     ・[43596] やそ 
     ・[43602] lbfuvab 
     ・[43617] Mist 
     ・[43656] Dixq (管理人) 
     ・[43657] たかぎ 
     ・[43678] non 
     ・[43746] 50CIMA 
     ・[43773] Dixq (管理人) 
   新規プロジェクトから ....   
     ・[43742] チルチル 
     ・[43769] Dixq (管理人) 
   Justyさんが作成した炎 ....   
     ・[43386] Justy 
     ・[43402] kai 
     ・[43406] Justy 
     ・[43409] kai 
     ・[43440] Justy 
     ・[43444] kai 
     ・[43449] Justy 
     ・[43595] kai 
     ・[43605] Justy 
     ・[43609] kai 
     ・[43673] Justy 
     ・[43727] kai 
     ・[43728] Justy 
     ・[43729] kai 
     ・[43731] Justy 
     ・[43756] kai 
     ・[43761] Justy 
     ・[43765] kai 

Name: シノニム  ..ぴよぴよ(646ポイント)   Date: 2009/12/14(月) 22:19   No:44040       
Title: C++エラーについて質問です    
こんばんわ。いつもお世話になってます

今回は発生したエラーについてお聞きしたいと思います
いつものようにVisual C++でプログラミングをしていたんですが、デバッグなしで実行した際に、

■fatall error LNK 1104 : ファイル・・・.exeを開くことができません

というエラーが発生しました。このエラーは自分の見解だと、すでに実行しているにもかかわらず新たに実行した場合に起こるエラー、だと思っていました。

しかしながらプロジェクトを実行している気配はなく、困ってリビルドしてみたところ、

■ファイル・・・.exeを削除することができませんでした。このファイルが他のプロセスによって使用されていないこと、または書き込み禁止になっていないことを確認してください

というエラーが・・・2つも出ました

とくに設定などをいじった覚えはなく、困っています
どなたかお力添えをお願いします

OS : Windows XP


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


Name: DVDM [URL]  ..初心者(6,317ポイント)   Date: 2009/12/14(月) 22:46   No:44042     
Title: Re:C++エラーについて質問です    
>>シノニムさん
タスクマネージャーを開き、「プロセス」タブの中に
シノニムさんが制作しておられるアプリケーションの名前はないでしょうか?
あるのであれば、その名前をクリックしてプロセスの終了を押し、
再度ビルドなりすると多分大丈夫なはずです。


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

Name: シノニム  ..ぴよぴよ(612ポイント)   Date: 2009/12/14(月) 23:14   No:44046 解決!     
Title: Re:C++エラーについて質問です    
>>DVDMさん
なんとこんなところに・・・お陰でがっつり解決しました!
ありがとうございました!


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



Name:  ..上級者(24,726ポイント)   Date: 2009/12/14(月) 20:20   No:44031       
Title: 円形に敵弾を消しさるには    
龍神録についてです。
if(out_judge_enemyshot(s,n)==1){ //自機にその弾が接触していたら
//全ての弾を消しさる

という処理を追加してるのですが、
もっと、ゲームらしく、
自機と敵弾が接触した場所を中心に、円形に範囲を広げながら
周りの敵弾を一つずつ消しさるという処理を追加したいのですが、
この処理の計算方法はどうしたらいいでしょうか?
誰か分かる方がいましたら、教えてください・・


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


Name: あ〜る  ..中級者(14,388ポイント)   Date: 2009/12/14(月) 20:44   No:44032     
Title: Re:円形に敵弾を消しさるには    
敵の弾が当たったら、敵の弾でフラグが立ってる弾と自機との距離を調べて、距離が○○以下だったらフラグをオフにする。で、○○の値を加算していく。(○○はもちろん任意の変数です)

みたいな感じで出来るかもです(もっと効率の良い方法があるかもしれないですが(-.-;))
ちょっと試験期間なんで試して無いから駄目かもしれないです。
駄目だったら申し訳無いですけど僕にはわかんないです…

あと携帯からなんで見にくかったらすいません。


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

Name: y  ..かけだし(1,940ポイント)   Date: 2009/12/14(月) 21:07   No:44033     
Title: Re:円形に敵弾を消しさるには    
初めて投稿させていただきます。

恐らく、東方風神録の被弾時のエフェクトを真似ているのだと思いますが、
“敵弾との当たり判定がある何も描画させないオブジェクト”を配置し、
時間の経過とともに当たり判定を広げる方法が、一番簡単だと思います。

処理の流れとしては、

1.被弾する
2.被弾位置にオブジェクトを配置する(初期化する)
3.オブジェクトの当たり判定を徐々に広げる
4.一定時間後、オブジェクトを破棄する(処理させない)

こんな感じになると思います。
ちなみに、円形に消したいならば、何も描画させないオブジェクトの当たり判定を円形にし、
円と四角形との当たり判定を行う必要があります。

参考になれば幸いです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,108,406ポイント)   Date: 2009/12/14(月) 21:46   No:44036     
Title: Re:円形に敵弾を消しさるには    
ちと簡単ではありますが、サンプル作ってみました。
特に難しい事はしていないので、見たらわかると思いますが、
Zキーを押したらその瞬間からあたり判定円が広がり、接触中の弾を消しています。


#include <math.h>
#include "DxLib.h"

//円周率
#define PI 3.141592654f
#define PI2 (PI*2)

//弾構造体
typedef struct{
int flag;
float x,y;
}Bullet_t;
Bullet_t Bullet[49*65];

//半径、カウンタ、状態変数
float r,cnt,states;

//初期化
void Ini(){
int x,y;
for(y=0;y<49;y++){
for(x=0;x<65;x++){
Bullet[y*65+x].flag=1;
Bullet[y*65+x].x=10*x;
Bullet[y*65+x].y=10*y;
}
}
}

//円計算
void Calc(){
if(CheckHitKey(KEY_INPUT_Z)==1 && states==0)
states=1;
if(states==1){
r=sin(PI/2/120*cnt)*300;
cnt++;
if(cnt==120)
states=2;
}
}

//弾消去
void DeleteBullet(){
int i;
for(i=0;i<49*65;i++){
if(Bullet[i].flag==1){
float x=320-Bullet[i].x;
float y=240-Bullet[i].y;
if( x*x+y*y < r*r ){
Bullet[i].flag=0;
}
}
}
}

//弾描画
void GraphBullet(){
int i;
for(i=0;i<49*65;i++){
if(Bullet[i].flag==1){
DrawCircle(Bullet[i].x,Bullet[i].y,2,GetColor(255,0,0),TRUE);
}
}
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if(ChangeWindowMode(TRUE)==-1 || DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;

Ini();//初期化

while(!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE)){
Calc();//円計算
DeleteBullet();//弾消去
GraphBullet();//描画
}

DxLib_End();
return 0;
}


こんな感じでどうでしょう?


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



Name: 電々  ..ぴよぴよ(151ポイント)   Date: 2009/12/14(月) 14:06   No:44015       
Title: スタッフロールについて    
今、龍神録の館を見て一通り作ったのですが、ラスボスを倒したあとの終わらせ方がわかりません。
ゲームで言えばスタッフロール見たいなプログラムを作ったのですがどこにどうやって入れればいいのかわかりません。このようなプログラムです
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) return -1 ;
int White;
White = GetColor( 255 , 255 , 255 ) ;



SetDrawScreen( DX_SCREEN_BACK ) ;

int i ;
for( i = 500 ; i > 230 ; i -- )
{
ClearDrawScreen();
DrawString(250,i, "これで終了です。" , White);
ScreenFlip() ;
}


WaitKey();
DxLib_End() ;
return 0 ;
}

プログラムに対して結構初心者です、どうかよろしくお願いします。


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


Name: kazuoni [URL]  ..ハッカー(118,988ポイント)   Date: 2009/12/14(月) 14:18   No:44016     
Title: Re:スタッフロールについて    
とりあえず、規約を読んでおいてくださいね^^;
不足がありますので。

>ゲームで言えばスタッフロール見たいなプログラムを作ったのですがどこにどうやって入れればいいのかわかりません。

関数化して、ゲーム遷移に組み込めばよいだけでは?
龍神録の館でいうswitch(func_state)...ですね。


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

Name: 電々  ..ぴよぴよ(89ポイント)   Date: 2009/12/14(月) 14:34   No:44019     
Title: Re:スタッフロールについて    
速い解答ありがとうございます、規約もう一度読み直したら確かに足りませんでした・・・申し訳ありません;

switch(func_state)を参考に頑張ってみます、また詰まったらまた質問させてもらいます


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



Name: 匿名  ..上級者(18,794ポイント)   Date: 2009/12/14(月) 02:02   No:44005       
Title: 管理人さんにお聞きしたいのですが2    
何度もすみません。
またフォントについて教えてもらいたいのですが、
龍神録のボム発射時の横と縦の線と
Aerobeat Plusのメインタイトルのフォントって同じですよね?
是非、そのフォントを使ってみたいと思っているので、
フォント名を教えていただけないでしょうか?
よろしくお願いします。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,107,816ポイント)   Date: 2009/12/14(月) 08:14   No:44009     
Title: Re:管理人さんにお聞きしたいのですが2    
このフォントいいですよね、結構気に入ってますw

フォント名は「Ruach LET」です。
何に入っていたかは忘れましたが、これはフリーフォントではないので、
これだけ入手するにはお金がかかると思います。

Photoshop CS3

に入ってたんじゃないかと勝手に思いますが・・何に入っていたかよく覚えていません;


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



Name: MU  ..ぴよぴよ(158ポイント)   Date: 2009/12/13(日) 23:56   No:44000       
Title: 数値解析法    
連立方程式の解を求めるプログラムを作りたい。
また、プログラムは任意の元数に対応できるものでないといけない。
数値解析法として反復法の「ヤコビ法」と「ガウス・ザイデル法」および消去法を用いる。
丸投げのようですみません。締切間近で焦ってます。アドバイスよろしくお願いします。
方程式は添付します。


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


Name: kazuoni [URL]  ..ハッカー(118,863ポイント)   Date: 2009/12/14(月) 00:03   No:44001     
Title: Re:数値解析法    
丸投げ禁止なのでとりあえず、参考ページを。意外とソースコードで書いてあります。(C言語)

ttp://hooktail.org/computer/index.php?Jacobi%CB%A1
ttp://www.yamamo10.jp/yamamoto/lecture/2006/5E/Linear_eauations/concrete_relax_html/node2.html
ttp://pc-physics.com/gauss1.html



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



Name: たこやき  ..入門者(2,833ポイント)   Date: 2009/12/13(日) 05:41   No:43970       
Title: TextOutについて    
ウィンドウの雛形に、
case WM_PAINT:{</pre>
    static int t;

    PAINTSTRUCT ps;

    wchar_t cbuf[100];

    HDC hdc = BeginPaint( hWnd, &ps );

    wsprintf( cbuf, _T("on WM_PAINT%d"),t);

    TextOut(hdc,0,100,cbuf,sizeof(cbuf));

    SetWindowText( hWnd, cbuf );

    t++;

    EndPaint( hWnd, &ps );

   break;

}
として実行したところ、ウィンドウを任意のところに重ねて、移動すると、
SetWindowはタイトルバーにちゃんとの値が表示されるのですが、TextOut
のtは再描画されないのですが、通っているのに描画されないのはなぜで
しょうか?またどうしたらちゃんと表示されるのでしょうか?


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


Name: たこやき  ..入門者(3,010ポイント)   Date: 2009/12/13(日) 21:13   No:43991     
Title: Re:TextOutについて    
WM_PAINTの中にInvalidateRect()を入れてそれでインクリメント(変数t)されたデータの数がようやく再描画
されるようになったのですが、これはあまりやらない方がよいのでしょうか?それともやっても大丈夫なのでし
ょうか?


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

Name: softya  ..熟練のプログラマー(65,720ポイント)   Date: 2009/12/13(日) 21:47   No:43993     
Title: Re:TextOutについて    
>WM_PAINTの中にInvalidateRect()を入れてそれでインクリメント(変数t)されたデータの数がようやく再描画
されるようになったのですが、これはあまりやらない方がよいのでしょうか?それともやっても大丈夫なのでし
ょうか?

やっちゃいけませんね。InvalidateRect()をWM_PAINTでやると再描画の無限ループです。
tを更新したかったら、WM_TIMERを使ってtの更新とInvalidateRect()を呼び出すべきです。


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

Name: たこやき  ..入門者(3,042ポイント)   Date: 2009/12/13(日) 21:57   No:43994     
Title: Re:TextOutについて    
わかりました。MW_TIMERを使えばいいのですね。
回答ありがとうございました!


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

Name: たこやき  ..入門者(3,060ポイント)   Date: 2009/12/13(日) 21:58   No:43995 解決!     
Title: Re:TextOutについて    
解決しました。

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



Name: kai  ..中級者(10,473ポイント)   Date: 2009/12/12(土) 18:08   No:43948       
Title: 点滅のさせる計算式    
こんにちは。
また龍神録を改造して遊んでいて、
今度は文字をブレンドを使って点滅(cnt%6==0みたいに一瞬の点滅ではない方)
させてみたいと思ってやってみたのですが、
点滅を何度も繰り返す方法がわからなくて困ってます。
たぶん%を使って何回も繰り返してるんだと思うのですが、
どういった計算式で繰り返してるんでしょうか?
点滅の例は、こちらの動画の感じです。(最初のほうのPRESS ANY BUTTON)
http://www.youtube.com/watch?v=hDy6tm2Jf9o&feature=PlayList&p=46B5309287816528&index=1
本家龍神録でも、四角■を点滅させたりしてます。
どなたか教えてください><


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,106,056ポイント)   Date: 2009/12/12(土) 21:20   No:43955     
Title: Re:点滅のさせる計算式    
>kaiさん

こんにちは^^
点滅さえすればいいのですか?
それとも動画のようにスーッと消えるように点滅させたいのですか?

単に点滅すればいいのなら、カウンタを割った物をさらに%で計算すればいいと思います。
例えば

cnt%2==0

これだと2/60秒周期で点滅しますよね?

(cnt/2)%2==0

これだと4/60秒周期で点滅しますよね?

(cnt/3)%2==0

これだと6/60秒周期で点滅しますよね?

ということで、こうやれば周期は簡単に変更できます。
また

if((cnt/3)%2!=0)

こんな感じにすれば、1:1点滅じゃなく、どちらかに偏った点滅も出来ると思います。


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

Name: kai  ..中級者(10,588ポイント)   Date: 2009/12/13(日) 15:23   No:43978     
Title: Re:点滅のさせる計算式    
すみません。
点滅と言った私の言い方が悪かったんだと思います。
点滅ではなく、
フェードアウトと、フェードインの繰り返しのことです。

>それとも動画のようにスーッと消えるように点滅させたいのですか?
そうです。
これが出来たら結構、応用が出来そうなので悪戦苦闘してるのですが、
分からなくて困ってます・・


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,107,113ポイント)   Date: 2009/12/13(日) 15:54   No:43981     
Title: Re:点滅のさせる計算式    
百聞は一見に如かず ということで実際にコードを見た方が早いですね。
2通り作ってみました。

1の方は輝度が255→0,255→0,を繰り返すので、
突然明るくなるような点滅です。
フェードインが無い、フェードアウトの連続ということです。

それに対して2の方は、フェードイン、フェードアウトの繰り返しです。
0→255,255→0,0→255,一次関数的なエフェクトでは安っぽくなってしまいますが
sin波を使うことで滑らかな表現が可能です。
龍神録をご覧になっているということはcosやsinはバリバリに使っていらっしゃると思いますので、
詳しい説明は省略します。
もし何かわからなければお聞きください。

変化する値を変えたり振幅を変えることでどのようなエフェクトにもなりえますね。


#include <math.h>
#include "DxLib.h"

#define PI 3.141592654f //円周率
#define PI2 (PI*2) //円周率

#define T1 60 //周期
#define T2 40 //周期

int Count;

void Tenmetsu1(){
SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255 - 255*(Count%T1)/T1 );
DrawString(0,0,"Hello world!!",0xFFFFFFFF);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0 );
}
void Tenmetsu2(){
SetDrawBlendMode(DX_BLENDMODE_ALPHA, 128 + sin( PI2/T2*Count ) * 128 );
DrawString(0,100,"Hello world!!",0xFFFFFFFF);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0 );
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if(ChangeWindowMode(TRUE)==-1 || DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;

while(!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE)){
Tenmetsu1();
Tenmetsu2();
Count++;
}

DxLib_End();
return 0;
}



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

Name: kazuoni [URL]  ..ハッカー(118,844ポイント)   Date: 2009/12/13(日) 15:56   No:43982     
Title: Re:点滅のさせる計算式    
結局、フェードイン・アウトが分からないということでしょうか?
簡単に書けばこんな感じですかね。(要DXライブラリ)
int para=255;

// ...
// paraの規則的加減算
// ...
SetDrawBlendMode(DX_BLENDMODE_ALPHA,para);
DrawString(x,y,str,color);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);
// ...
ScreenFlip();


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

Name: kazuoni [URL]  ..ハッカー(118,852ポイント)   Date: 2009/12/13(日) 15:57   No:43983     
Title: Re:点滅のさせる計算式    
モロかぶりすいません・・・。

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

Name: kai  ..中級者(10,653ポイント)   Date: 2009/12/13(日) 16:13   No:43984 解決!     
Title: Re:点滅のさせる計算式    
Dixqさん、kazuoniさん、ありがとうございます。

なるほど、sin波を使えばよかったんですね。
その発想が全く出てこなかったので、
ちょっと表現方法に感動して涙出ました。
本当にありがとうございます!


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,107,321ポイント)   Date: 2009/12/13(日) 20:00   No:43988     
Title: Re:点滅のさせる計算式    
> kazuoniさん

いえいえ^^;

> kaiさん

sin波って手軽に使えて、それでいてsin波を使っただけで動きが安っぽくならなくなるので、結構使えるんですよね。
私も至る所で使っています。
例えばエアロビートのメニュー画面、ロゴとかスッと動き始めてスッと止まるモーションとか、
曲選択メニュー画面の背景のオブジェクトの最初の回転とか。

sinは角度だけじゃなく、移動量であったり、輝度であったり、何にでも使えるので便利ですね。
しかも見ただけで(90°の倍数なら)角度いくつで値がどうなっているのか一目瞭然ですし。


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



Name: はね  ..上級者(16,105ポイント)   Date: 2009/12/12(土) 10:39   No:43911       
Title: 自機を画面の中心に吸い込ます方法    
龍神録50章を改造してます。
地霊殿のラスト弾幕のように
弾幕中、自機を画面の中心に少しずつ吸い込ます方法を
実装してみたいのですが、これはどういう計算式で
中心に引っ張られるのか分からなくて困ってます。
誰か分かる方がいたら教えてください・・


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,105,788ポイント)   Date: 2009/12/12(土) 13:33   No:43930     
Title: Re:自機を画面の中心に吸い込ます方法    
中心に向けて常に移動させればいいんじゃないでしょうか?
例えば左に引っ張るようにするなら

ch.x--;

常に上の計算をすれば引っ張られるように感じると思います。
中心に向かわせるならatan2関数で角度計算してそれに合わせてsin,cosでx,y成分を引っ張ればどうでしょう?


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

Name: Justy  ..伝説なるハッカー(482,427ポイント)   Date: 2009/12/12(土) 14:09   No:43935     
Title: Re:自機を画面の中心に吸い込ます方法    
 個人的にはXXXのようにと書くならついでに動画も紹介してくれると
たすかるのですが。


 察するに一応自由に操作できるけど、中央に何かあって自機がそちら方向に
移動するよう力が働いている、といったところでしょうか?

 Dixqさんの方法とほぼ同じではありますが、単純に自機から中心へのベクトルを出して
1フレームに移動させたい長さに調節、それをプレイヤーの位置に足す、
を毎フレーム行うでいいと思います。

 長さの調節は一度そのベクトルを単位ベクトル化してから、移動距離の係数を
掛けると楽です。

 プレイヤーを P、中心を C、そのフレームでの吸い寄せられる距離を Mとすると

    V = C - P;              // 自機から中心へのベクトル
    N = V / Length(V);      // 単位ベクトル化
    P += N * M;

これを毎フレームを行えば吸い寄せられるように見えるはずです。
 等速で吸い寄せられるなら Mは一定値となります。

 ただ、「吸い込む」とあるので距離に応じて吸引力を変えたり、
加速度とかも入れないと同じにはならないかもしれませんね。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,105,857ポイント)   Date: 2009/12/12(土) 15:57   No:43941     
Title: Re:自機を画面の中心に吸い込ます方法    
Justyさん、仰っている弾幕はこちらだと思います。

http://www.nicovideo.jp/watch/sm6574256
(7:56〜)

見ると、そこまで難しい計算はしておらず、単純に等速で中央に吸い寄せられているように思います。
まぁこの弾幕からしてあまり真中によることも出来ませんしね^^;


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

Name: Justy  ..伝説なるハッカー(482,523ポイント)   Date: 2009/12/12(土) 22:10   No:43957     
Title: Re:自機を画面の中心に吸い込ます方法    

> 仰っている弾幕はこちらだと思います

 ありがとうございます。

 なるほど、ブラックホールのような重力源があるのかなとか、
ひょっとして渦巻いているのかとか想像していましたが、
ベルトコンベア的な等速だったんですね。。


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

Name: はね  ..上級者(16,113ポイント)   Date: 2009/12/13(日) 15:25   No:43979     
Title: Re:自機を画面の中心に吸い込ます方法    
具体的な計算式はどういったものなんでしょうか?

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

Name: はね   Date: 2009/12/16(水) 19:11   No:439111260958271     
Title: Re:自機を画面の中心に吸い込ます方法    
よろしくお願いします



Name: jay  ..中級者(11,600ポイント)   Date: 2009/12/12(土) 12:33   No:43921       
Title: 弾幕のプチテストプレイその2    
また、弾幕のテストプレイをお願いします。
プログラムコードは龍神録仕様です、コピペして下さい。
プレイしてみて感想、意見、指摘などをよろしくお願いします。
void boss_shot_bulletH030(){
#define TM030 91
int i,k,t=boss_shot.cnt%TM030,t2=boss_shot.cnt;
static int c,cnum;
double angle=bossatan2();
if(t2==0){//最初なら
cnum=0;
c=0;
}
if(t==0 && cnum>4 && cnum%2==0){
for(i=-1;i<2;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =1;
boss_shot.bullet[k].col =5;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =angle+PI2/20*i;
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =3.8;
se_flag[0]=1;
}
}
}
if(t==0 && cnum>9 && cnum%2==1){
for(i=-8;i<9;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =3;
boss_shot.bullet[k].col =2;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =angle+PI2/36*i;
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =1.4;
se_flag[0]=1;
}
}
}
if(t==45){
for(i=0;i<40;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =8;
boss_shot.bullet[k].col =c;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =angle+PI2/150*i;
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =2.1;
se_flag[0]=1;
}
}
c++;
if(c>8) c=0;
}
if(t==90){
for(i=0;i>-40;i--){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =8;
boss_shot.bullet[k].col =c;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =angle+PI2/150*i;
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =2.1;
se_flag[0]=1;
}
}
c++;
cnum++;
if(c>8) c=0;
}
}
この弾幕は2面ボスがラスト1つ手前で使う予定です。
それもふまえて指摘などして下さい。


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


Name: ひよこ  ..比類無きプログラマー(75,883ポイント)   Date: 2009/12/12(土) 13:13   No:43926     
Title: Re:弾幕のプチテストプレイその2    
試してみました。
よく出来てますね。自分的には何か足りない気がしますが、
自分が改造するとしたらchild(レベル変化用!3面用くらいになってしまうかもしれません!)と、
ゆったりしているので、自分的には弾の速さを変えると思います。
これでも十分いいと思います。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,105,704ポイント)   Date: 2009/12/12(土) 13:28   No:43928     
Title: Re:弾幕のプチテストプレイその2    
>jayさん

こんにちは。
面白い弾幕ですね。
常に左右に移動しなければならないと。
ただ気合い入れて作る弾幕としては、
「見た目の物足りなさ」を少し感じる気がするので、
「被弾には関係ない弾」を少し多めに出してはどうでしょう?
弾幕って自分に当たる可能性のあるものだけ発射する必要はないと思うんですよね。
見栄えを良くするために「見栄え用弾」を発射させてもよいかも知れません。


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

Name: jay  ..中級者(12,817ポイント)   Date: 2009/12/12(土) 17:37   No:43945     
Title: Re:弾幕のプチテストプレイその2    
ひよこさん
>自分的には何か足りない気がしますが
2面だし、この位かな?って思ったんですがもっと発狂した方がいいですか?
自機狙いとナイフに加えてなにを入れたらいいでしょうか、スピードアップ?

Dixqさん
>「見栄え用弾」を発射
こんな感じでいいでしょうか?
なんか、違う弾幕みたいに見えてきたけど・・・

void boss_shot_bulletH030(){
#define TM030 91
int i,k,t=boss_shot.cnt%TM030,t2=boss_shot.cnt;
static int c,cnum;
double angle=bossatan2();
if(t2==0){//最初なら
cnum=0;
c=0;
}
if(t==0 && cnum>4 && cnum%2==0){
for(i=-1;i<2;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =1;
boss_shot.bullet[k].col =5;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =angle+PI2/20*i;
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =3.8;
se_flag[0]=1;
}
}
}
if(t==0 && cnum>9 && cnum%2==1){
for(i=-8;i<9;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =3;
boss_shot.bullet[k].col =2;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =angle+PI2/36*i;
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =1.4;
se_flag[0]=1;
}
}
}
if(t==45){
for(i=0;i<120;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =8;
boss_shot.bullet[k].col =c;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =angle+PI2/160*i;
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =2.1;
se_flag[0]=1;
}
}
c++;
if(c>8) c=0;
}
if(t==90){
for(i=0;i>-120;i--){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd =8;
boss_shot.bullet[k].col =c;
boss_shot.bullet[k].x =boss.x;
boss_shot.bullet[k].y =boss.y;
boss_shot.bullet[k].flag =1;
boss_shot.bullet[k].angle =angle+PI2/160*i;
boss_shot.bullet[k].cnt =0;
boss_shot.bullet[k].spd =2.1;
se_flag[0]=1;
}
}
c++;
cnum++;
if(c>8) c=0;
}
}

どのように「見栄え用弾」を使えば綺麗に見えるのでしょうか?
コツを教えて下さいませんか?


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

Name: ひよこ  ..比類無きプログラマー(75,942ポイント)   Date: 2009/12/12(土) 19:08   No:43950     
Title: Re:弾幕のプチテストプレイその2    
自分的にはこれでいいと思います。(自分のしたい改造はもっと先ですね。
見栄え用弾はわざと外す、きれいな何かを描くみたいなことですかね。私にはよくわかりません。


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

Name: jay  ..中級者(12,912ポイント)   Date: 2009/12/13(日) 11:59   No:43974 解決!     
Title: Re:弾幕のプチテストプレイその2    
ひよこさん
>自分的にはこれでいいと思います
ありがとうございます。
自分的にもとりあえず満足なので、一応完成ということにします

>見栄え用弾はわざと外す、きれいな何かを描くみたいなことですかね
勉強させていただきます。
ただカラフルなだけじゃダメなんですね。


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



Name: pokka  ..ぴよぴよ(146ポイント)   Date: 2009/12/12(土) 11:34   No:43913       
Title: ポインタについて    
ポインタについて疑問に思ったことがあるので教えてください。


func1(int *a)
{
 func2(&a);
}
func2(int *a)
{
 *a++;
}

main()
{
 int x = 0;
 func1(&x);
}


こうするとエラーになります。
func2(&*a);
とするとエラーは出なくなり、きちんと動作するようになりましたが、この書き方はどうなんでしょうか?
解説サイトとかを見てもあまりこういうことは書いておらず、あまり良くない書き方をしているのかと気になってしまい、投稿しました。
よろしくおねがいします。


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


Name: non  ..比類無きプログラマー(81,009ポイント)   Date: 2009/12/12(土) 11:45   No:43914     
Title: Re:ポインタについて    
まず、環境はなんでしょう?
次に、エラーはどの行で何というエラーなのでしょうか?警告ではないのですね。
きちんと動作するとありますが、何をしたいのでしょうか?

特に *a++; は何をしたかったのでしょうか?




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

Name: pokka  ..ぴよぴよ(150ポイント)   Date: 2009/12/12(土) 12:09   No:43917     
Title: Re:ポインタについて    
すみません。環境を書き忘れていました・・・
VisualC++2008で、OSはXPです。

エラー内容は
引数を 'int **' から 'int *' に変換できません
といったもので、上のソースでは3行目になります。

動作の方は、mainの中でprintfを用いてaの数字を表示させようとしたものです。省略してしまい、すみません。
*a++ ではなく、 *a = 1; として見てください。すみません。


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

Name: あまち  ..かけだし(1,002ポイント)   Date: 2009/12/12(土) 12:20   No:43919     
Title: Re:ポインタについて    
すみません、通りすがりです。

> 引数を 'int **' から 'int *' に変換できません
func1の引数が int * ですので
func1の関数内では引数 a の型は int * です。

func2の引数も int * 型なので
func2(&a) ではなく func2(a)とすればエラーはなくなります。
func2(&*a) だとエラーが出ない件ですが
&*a と a は同じなので結局 func2(a)を実行していることど同じです。
なのでエラーが出ないのです。
& と * の違いをよく確認してみてください。

これで疑問は解決したでしょうか?






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

Name: Mist  ..比類無きプログラマー(77,260ポイント)   Date: 2009/12/12(土) 12:21   No:43920     
Title: Re:ポインタについて    
そのプログラムだと普通は以下のように書きますね。

func1(int *a)
{
func2(a); // aはxのアドレス値であるので&も*も不要
}

func2(int *a)
{
*a = 1;

}

main()
{
int x = 0;

func1(&x);
}


&*aは、aの指すアドレスの変数(つまりx)のアドレスって意味なので間違ってはいませんけど、そんな面倒なことはしないでしょうね。


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

Name: Tatu  ..上級者(21,746ポイント)   Date: 2009/12/12(土) 13:19   No:43927     
Title: Re:ポインタについて    
あまちさんとMistさんが書いているとおりです。

ところで、なぜ、C言語のポインタを解説するときに

ポインタを宣言するときは
int *p;
のように変数名の前に*をつけてください。
という書き方をするのでしょうか。

ポインタを宣言するときは
int* p;
のように型の後ろに*をつけてください。
と書いたほうがよいのではないでしょうか。

こちらのほうが
void func(int* p){}
というように関数の引数にポインタを用いるときに
*がつくことが分かりやすいと思うのですが。


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

Name: Mist  ..比類無きプログラマー(77,393ポイント)   Date: 2009/12/12(土) 13:28   No:43929     
Title: Re:ポインタについて    
> ポインタを宣言するときは
> int *p;
> のように変数名の前に*をつけてください。

それは

int* p1, p2;

と書いたとき、p1はintのポインタ変数になりますがp2はただのint型変数として宣言されてしまうからです。
だからといって

int* p1, *p2;

と書くと変な感じがしますよね。
だから*を変数名に付けて書くスタイルが主流になってしまったのです(^-^;
余談ですがD言語ではこの辺を踏まえて

int* p1, p2;

と書けばp1もp2もポインタとして宣言されます。


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

Name: non  ..比類無きプログラマー(81,176ポイント)   Date: 2009/12/12(土) 13:46   No:43931     
Title: Re:ポインタについて    
こういうことだって考えられるのです。

void func1(int *a)
{
func2(&a);
}
void func2(int **a)
{
*a=(int *)1;
}

だから、何がしたいのかが、重要です。

>ポインタを宣言するときは
>int* p;
>のように型の後ろに*をつけてください。
>と書いたほうがよいのではないでしょうか。

そう仰る方も多いですね。
でも、初期値を入れるときは、*が後ろの方がしっくりいくかも。



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

Name: Tatu  ..上級者(21,844ポイント)   Date: 2009/12/12(土) 14:49   No:43938     
Title: Re:ポインタについて    
>Mistさん
なるほど、確かに
int* p1,p2;だと
p1はint*変数、p2はint変数になりますね。

例では変数が2つしかないので

int* p1;
int* p2;

と書けばよいだけだと思いますが、
数が多い場合、一つの変数の宣言ごとに
int*をかくのは面倒ですね。


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

Name: pokka  ..ぴよぴよ(360ポイント)   Date: 2009/12/12(土) 18:00   No:43947     
Title: Re:ポインタについて    
皆さんありがとうございました。
func2(a);にしたらエラーが出ないようになりました。

そこで、このソースを見たら疑問に思ったんですが、


main()
{
 int x = 0;
 int *px = &x
 func1(px);
}


これでも同じことになると思うんですが、プログラムかく上でどちらが好まれるんでしょうか?
わざわざポインタを宣言しないで済むので、func1(&x)とやった方がいいと思うんですが、人それぞれですか?


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

Name: non  ..比類無きプログラマー(81,198ポイント)   Date: 2009/12/12(土) 19:03   No:43949     
Title: Re:ポインタについて    
これだけのためなら、わざわざポインタ変数を用意する人はいないでしょう。


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

Name: pokka  ..ぴよぴよ(388ポイント)   Date: 2009/12/13(日) 07:30   No:43972 解決!     
Title: Re:ポインタについて    
分かりました。
皆さんありがとうございました。


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



Name: toto  ..ぴよぴよ(762ポイント)   Date: 2009/12/12(土) 16:47   No:43943       
Title: 張り付けの誤動作について    
VC++2008EEでやっています。
ソースを張り付けると文字が斜め上にあがっていきます。
どうしたら治るのでしょうか?


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,106,587ポイント)   Date: 2009/12/13(日) 05:03   No:43967     
Title: Re:張り付けの誤動作について    
規約を守って頂けるまで一時、回答を中断します。

** 質問者から何かコメントがあるまでお待ちください **


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



Name: kk  ..ぴよぴよ(171ポイント)   Date: 2009/12/12(土) 13:52   No:43933       
Title: ヘッダーについて    
int image[3];
image0[0] = LoadGraph("a.jpg");
image0[1] = LoadGraph("b.jpg");
image0[2] = LoadGraph("c.jpg");

ヘッダーで以上のことを書くと再定義にimage0の再定義みたいになって
値が代入できません。ヘッダーでは値の代入はむりなんですか?


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


Name: kk  ..ぴよぴよ(34ポイント)   Date: 2009/12/12(土) 13:58   No:43934     
Title: Re:ヘッダーについて    
int image0[3];
image0[0] = LoadGraph("a.jpg");
image0[1] = LoadGraph("b.jpg");
image0[2] = LoadGraph("c.jpg");
でした。誤字があるのでもう一度
ヘッダーで以上のことを書くとimage0の再定義みたいになって
値が代入できません。ヘッダーでの値の代入はむりなんですか?


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

Name: Mist  ..比類無きプログラマー(77,497ポイント)   Date: 2009/12/12(土) 14:12   No:43936     
Title: Re:ヘッダーについて    
グローバル変数に初期値を持たせたいなら

int image0[3] = { LoadGraph("a.jpg"), LoadGraph("b.jpg"), LoadGraph("c.jpg") };

とすればよいです。
ただし!!!(重要)
この変数初期化はプログラム開始前に実行されます。
LoadGraph関数はDxLib_Initの実行後で無ければ正常に動作しません。
よって、このようなことはしてはいけません。


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

Name: kk  ..ぴよぴよ(68ポイント)   Date: 2009/12/12(土) 14:36   No:43937     
Title: Re:ヘッダーについて    
仮にこの大規模な配列を入れるとしたら
関数がベストですか?
もうこれしかないような気がします


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

Name: Mist  ..比類無きプログラマー(77,595ポイント)   Date: 2009/12/12(土) 14:51   No:43939     
Title: Re:ヘッダーについて    
何がベストであるかはケースバイケースですので常にこれが正解というのは無いです。
これだけの情報では何がベストであるかを判断できないので回答しようが無いです。
(配列、入れる、関数という言葉の関連性が私には伝わらないです)

まずは自分の思うとおりにコーディングされてみてはいかがでしょうか。
それで問題があればまたご質問ください。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,106,530ポイント)   Date: 2009/12/13(日) 05:02   No:43966     
Title: Re:ヘッダーについて    
kkさん、
何度も言いますが、規約を守ってください。

色んな名前で投稿し、解決マークも押さず、
回答してくれた人にも何も言わずにさって新しいトピを作るのはやめて下さい。


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



Name: ジャーニー  ..入門者(2,941ポイント)   Date: 2009/12/12(土) 00:42   No:43873       
Title: タスクシステムについて    
お久しぶりです.
今回は今すぐに必要なことではないのですが今後のために質問したいことがあります.

class BaseObject
{
public:
virtual void Update()=0;//オブジェクト更新メソッド
virtual void DrawUpdate()=0;//描画用更新メソッド
virtual void DrawGraph()=0;//描画
};


例えば上のような仮想クラスがあったとして,これを継承したクラス(例えばCとします)を作ります.
BaseObject *bo = new C();といったように作ります.


これを以下のようなオブジェクト更新タスク,描画用タスクに渡します
list<BaseObject*> ObjectTask;
list<BaseObject*> DrawTask;

ObjectTask.push_back(bo);
DrawTask.push_back(bo);

1つのクラスで様々なタスクに対応できる作りにします.
描画はしないけどオブジェクトは更新するという場合にはDrawTaskからだけ外します.
このときDrawTaskから外したとき,ObjectTaskでboを使うのは問題ないのでしょうか.
一応簡単なテストを行った時動作には問題なさそうでしたが問題点などがあった場合教えてください.

また,この方法を実際ゲームなどに組み込む時に問題がないか,別の方法などがあれば教えてください.
抽象的な質問ですがよろしくお願いします.


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


Name: 御津凪 [URL]  ..ハッカー(131,620ポイント)   Date: 2009/12/12(土) 01:37   No:43882     
Title: Re:タスクシステムについて    
タスクシステムとしての機能は十分だと思いますが、
使用済みタスクを解放する場合の対処はどう考えていますか?

単に解放するだけだと、どこかでまだ使用されていたりすることをきちんと考慮しないとバグの原因になりやすいです。

そのため、 BaseObject に参照カウントをつける、つまり boost::shared_ptr の様なポインタクラスなどで
包括して使用すると、管理が楽になりますよ。

あと、実行順序と描画順序は操作(入れ替えたり先頭・末尾に移動させるなど)できるようにすると
なお良いでしょう。


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

Name: ジャーニー  ..入門者(3,042ポイント)   Date: 2009/12/12(土) 02:03   No:43888     
Title: Re:タスクシステムについて    
回答ありがとうございます.

一応全てのオブジェクトを保持するものを別に用意しようと考えていました.
shared_ptrですがboostを説明しているサイトによるとどの変数からも参照されなくなると解放されるとあるのですが,具体的にどのような状態になると解放されるのでしょうか?


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

Name: 御津凪 [URL]  ..ハッカー(132,284ポイント)   Date: 2009/12/12(土) 02:50   No:43894     
Title: Re:タスクシステムについて    
具体的に示すならコードで書いた方がいいと思ったので書いてみました。
#include <boost/shared_ptr.hpp>

#include <stdio.h>

class C {
public:
C( const char* inNname ):pName(inNname){
printf("instance new [%s].\n", inNname);
}
~C( void ){
printf("instance delete[%s].\n", pName);
}

private:
const char* pName;
};
typedef boost::shared_ptr<C> SP_C; // 短くするために typedef 。


void test_shared1( const char* inName ){
printf("test_shared1 func begin.\n");
SP_C sp_cb(new C(inName));
printf("test_shared1 func end.\n");
}
void test_shared2( const char* inName, SP_C& outPtr ){
printf("test_shared2 func begin.\n");
SP_C sp_cb(new C(inName));
outPtr = sp_cb;
printf("test_shared2 func end.\n");
}

int main( void ){
printf("main func begin.\n");
SP_C sp_ca(new C("A"));

printf("call test_shared1.\n");
test_shared1("B");
printf("call test_shared2.\n");
test_shared2("C", sp_ca);

printf("main func end.\n");
return 0;
}


下記が実行結果です。
main func begin.

instance new [A].
call test_shared1.
test_shared1 func begin.
instance new [B].
test_shared1 func end.
instance delete[B].
call test_shared2.
test_shared2 func begin.
instance new [C].
instance delete[A].
test_shared2 func end.
main func end.
instance delete[C].

コードと実行結果を見比べるとわかると思います。


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

Name: ジャーニー  ..入門者(2,957ポイント)   Date: 2009/12/12(土) 03:06   No:43897 解決!     
Title: Re:タスクシステムについて    
コード例まで書いていただいてありがとうございます.
そのアドレスに参照することがなくなった瞬間に破棄されるみたいですね.
かなり便利そうなのでboostの勉強もやってみます.
ありがとうございました.


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

Name: GPGA  ..比類無きプログラマー(72,242ポイント)   Date: 2009/12/12(土) 05:12   No:43904     
Title: Re:タスクシステムについて    
>問題点などがあった場合教えてください
継承元で変数を宣言し、継承先でnewをした場合
BaseObjectに仮想デストラクタを用意しないと、deleteするときにデストラクタが呼ばれません。


{
C c;
} // デストラクタが呼ばれる

{
C* c = new C();
delete c; // デストラクタが呼ばれる
}
{
BaseObject* c = new C();
delete c; // デストラクタが呼ばれない
}


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

Name: ジャーニー  ..入門者(3,041ポイント)   Date: 2009/12/12(土) 22:16   No:43958     
Title: Re:タスクシステムについて    
>GPGAさん
返事が遅くなりましたすいません.
仮想デストラクタについては質問する際突貫で作ったので忘れていました.
実際に作るときにはデストラクタは作成します


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



Name: ジュンヤ  ..かけだし(1,444ポイント)   Date: 2009/12/12(土) 00:20   No:43869       
Title: ボスの弾幕について    
四聖龍神録のオマケにある「ニコニコ中毒になりし者」で
ボスが出てきて、最初に撃ってくる、
オーロラみたいなきれいな羽の形をした弾幕を作りたいと思ったのですが、
うまくできないので、アドバイスしていただけませんでしょうか?

両方の羽の形の弾幕をいきなり作ったら難しいと思ったので、
最初に右の羽の形の弾幕だけ作ろうと思い、以下のように書きました。

最初は、angleとt(カウンター)を調整すれば、できそうな気がしたのですが、
ただ単にangleを上向きに上げて、上げきったら今度は、
下に行かせるというようなやりかたではできそうにないと思いました。
angleやt(カウンター)以外にも調整する必要な箇所はあるのでしょうか?
よろしくお願いします。

void boss_shot_bulletH000(){
int i,k,t=boss_shot.cnt%120;
if(t<60){
for(i=0;i<2;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 0;//弾の色
boss_shot.bullet[k].x = FMX/2;//座標
boss_shot.bullet[k].y = 100;
boss_shot.bullet[k].knd = 2;//弾の種類
boss_shot.bullet[k].angle = PI/120*t-PI/4;//角度
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].spd = 1.5;//スピード
boss_shot.bullet[k].eff = 1;
  }
}
}
if(60<t&&t<120){
for(i=0;i<2;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 0;//弾の色
boss_shot.bullet[k].x = FMX/2;//座標
boss_shot.bullet[k].y = 100;
boss_shot.bullet[k].knd = 2;//弾の種類
boss_shot.bullet[k].angle = PI/2-PI/120*t;//角度
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].spd = 1.5;//スピード
boss_shot.bullet[k].eff = 1;
}
}
}
}



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


Name: Dixq (管理人) [URL]  ..ウィザード(1,100,964ポイント)   Date: 2009/12/12(土) 02:05   No:43889     
Title: Re:ボスの弾幕について    
>ジュンヤさん

こんにちは^^
あの弾幕の上部分にウェーブみたいに出てるレーザーのことですよね?
あれは単にsin使ってるだけですよ。

sinの使い方は解りますか?
sinは
角度0で0,
角度PI/2で1,
角度PIで0,
角度PI*2/3で-1
となりますよね。
-1〜1の間の値をスムーズに変化させて取得できます。
sin波を思い浮かべて頂ければよいかと思います。

つまり今PI/2の振れ幅でかつ周期を2秒にしたいなら

.angle = sin(PI2/120*cnt)*PI/2;

となります。
cntは適切なカウンタ値にして下さい。
これで2秒かけて-90°〜+90°の値が延々と繰り返し取得できます。


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

Name: ジュンヤ  ..入門者(2,521ポイント)   Date: 2009/12/12(土) 20:36   No:43954     
Title: Re:ボスの弾幕について    
Dixgさんこんにちは^^

詳しく解説していただき、ありがとうございます。
弾幕を2つ別に作るのではなく、sinを使えばよかったのですね。

そこでさっそく作ってみたのですが、
ニコニコ動画で拝見させていただいた物とは、
似ても似つかないようなものになってしまいました。

自分なりの考えをまとめると
@周期は、およそ2秒周期なので、sin(PI2/120*t)とする。
A振れ幅は、135度なので、PI/4+PI/8とする。
B開始位置を20度ずらすため、20度をラジアンに変換して、その値を加算及び減算する。

動画を何回もよく見て観察したのですが、
ウェーブみたいに出てるレーザーの一番最初のangleは、
PI*2/3(270度)でsinが-1の状態の時ではないでしょうか?

そうだとすると、同じように上向きに撃ち始めるには、
sinが-1から始めるようにしないといけないと思いました。
sinは0から始めると、振れ幅のちょうど真ん中から始まってしまいますよね。

それともう一つ質問なんですが、周期を早くすると、レーザーの隙間が大きくなってしまい、
きれいに見えないのですが、動画で拝見させていただいた物は、
周期が早いわりには、レーザーの隙間がなく、きれいに見えました。
これは何か理由があるのでしょうか?

長々と質問してしまって、すみません。
以下にプログラムも載せておきますので、
時間のある時に見ていただければ、幸いです。
よろしくお願いします。


void boss_shot_bulletH000(){
int i,k,t=boss_shot.cnt%120;
if(t<120){
for(i=0;i<2;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 0;//弾の色
boss_shot.bullet[k].x = FMX/2;//座標
boss_shot.bullet[k].y = 100;
boss_shot.bullet[k].knd = 2;//弾の種類
boss_shot.bullet[k].angle = sin(PI2/120*t)*(PI/4+PI/8)-(20*PI/180); //角度
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].spd = 1.5;//スピード
boss_shot.bullet[k].eff = 1;
}
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 4;//弾の色
boss_shot.bullet[k].x = FMX/2;//座標
boss_shot.bullet[k].y = 100;
boss_shot.bullet[k].knd = 2;//弾の種類
boss_shot.bullet[k].angle = -sin(PI2/120*t)*(PI/4+PI/8)+(20*PI/180)+PI; //角度
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].spd = 1.5;//スピード
boss_shot.bullet[k].eff = 1;
}
}
}
}


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



Name: ベース  ..入門者(3,185ポイント)   Date: 2009/12/12(土) 00:44   No:43874       
Title: しましま描画について    
この画像でしましまにしたいのですが画像を重ねて右にずらすと画像のような結果に
なってしまいます。どうしたらしましまにできるのでしょうか?


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


Name: softya  ..熟練のプログラマー(63,804ポイント)   Date: 2009/12/12(土) 01:01   No:43877     
Title: Re:しましま描画について    
ベースさんに前にも書いた気がしますが、規約のマルチポストの項目に違反しています。
http://oshiete1.goo.ne.jp/qa5515709.html
こちらで質問するなら、あちらを閉じてください。
あちらを優先するなら、こちらを閉じてください。
よろしくお願いします。

質問内容にも問題があるので、じっくり規約に目を通す事をお勧めします。
http://dixq.net/board/board.html


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

Name: ベース  ..入門者(3,197ポイント)   Date: 2009/12/12(土) 01:15   No:43878     
Title: Re:しましま描画について    
そうだったんですか・・・閉じました。申し訳ありませんでした。問題となるソースはこうです。
wndclass.style = CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS;
wndclass.lpfnWndProc = WndProc; // このクラスの持つウィンドウプロシージャ
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); // exで追加される
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = _T("dc04"); // このクラスの名前

if(! RegisterClassEx( &wndclass )) return 0; // ウィンドクラスの登録
// できないと終了  
hWnd = CreateWindow( _T("dc04"), // クラスの名前
_T("..."),
WS_OVERLAPPEDWINDOW , // ウィンドウの属性
CW_USEDEFAULT, CW_USEDEFAULT,
400,200,
HWND_DESKTOP, // 親はデスクトップ
NULL, hInstance, NULL );

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
switch( iMessage ){
case WM_PAINT:{
PAINTSTRUCT ps;
char cbuf[100];
HDC hdc = BeginPaint( hWnd, &ps );
wsprintf( cbuf, _T("on WM_PAINT x0=%d y0=%d x1=%d y1=%d"),
ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom );
SetWindowText( hWnd, cbuf );
for( int i = ps.rcPaint.left; i < ps.rcPaint.right; i = i + 10 ){
MoveToEx( hdc, i, ps.rcPaint.top, NULL );
LineTo( hdc, i, ps.rcPaint.bottom );
}
EndPaint( hWnd, &ps );
break;
}
です。よろしくお願いします。


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

Name: ベース  ..入門者(3,301ポイント)   Date: 2009/12/12(土) 01:19   No:43879     
Title: Re:しましま描画について    
すみませんタブつけるの忘れてました。
wndclass.style = CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS;
wndclass.lpfnWndProc = WndProc; // このクラスの持つウィンドウプロシージャ
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); // exで追加される
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = _T("dc04"); // このクラスの名前

if(! RegisterClassEx( &wndclass )) return 0; // ウィンドクラスの登録
// できないと終了  
hWnd = CreateWindow( _T("dc04"), // クラスの名前
_T("..."),
WS_OVERLAPPEDWINDOW , // ウィンドウの属性
CW_USEDEFAULT, CW_USEDEFAULT,
400,200,
HWND_DESKTOP, // 親はデスクトップ
NULL, hInstance, NULL );

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
<per> switch( iMessage ){ </per>
<per> case WM_PAINT:{ </per>
<per> PAINTSTRUCT ps; </per>
<per> char cbuf[100]; </per>
<per> HDC hdc = BeginPaint( hWnd, &ps ); </per>
<per> wsprintf( cbuf, _T("on WM_PAINT x0=%d y0=%d x1=%d y1=%d"), </per>
<per> ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom );</per>
<per> SetWindowText( hWnd, cbuf ); </per>
<per> for( int i = ps.rcPaint.left; i < ps.rcPaint.right; i = i + 10 ){</per>
<per> MoveToEx( hdc, i, ps.rcPaint.top, NULL ); </per>
<per> LineTo( hdc, i, ps.rcPaint.bottom );</per>
<per> } </per>
<per> EndPaint( hWnd, &ps );</per>
<per> break;</per>
<per> }</per>
です。よろしくお願いします。


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

Name: ベース  ..入門者(3,350ポイント)   Date: 2009/12/12(土) 01:30   No:43881     
Title: Re:しましま描画について    
質問内容なのですが、このしましまの描画をどうやったら他のウィンドを重ねてずらしても
再描画してしましまにできるのかと言うことです。


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

Name: sizuma [URL]  ..上級者(18,928ポイント)   Date: 2009/12/12(土) 04:22   No:43901     
Title: Re:しましま描画について    
ソースの最初と最後にタグをつけてください。
perではなpreです

WinAPI32はさわったことがあるくらいです
普通再描写すると思いますけど・・・・
とりあえず誰もいなくてソース添付してくれれば考えます。


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

Name: ベース  ..入門者(3,355ポイント)   Date: 2009/12/12(土) 11:58   No:43915     
Title: Re:しましま描画について    
ソースはこれです。

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

Name: ベース  ..入門者(3,366ポイント)   Date: 2009/12/12(土) 15:35   No:43940 解決!     
Title: Re:しましま描画について    
解決しました。

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



Name: スタートメニュー  ..入門者(3,552ポイント)   Date: 2009/12/10(木) 22:29   No:43763       
Title: ボスの表現の仕方について    
龍神録のボスを主人公のように
立ち止っていたら→立ち止まり絵(4枚)のループ
右に動いたら→右に傾いてる絵(4枚)のループ
左に動いたら→左に傾いてる絵(4枚)のループ
のようにしたいのですがさっぱりわかりません。
龍神録60章を使っているのですが、どのように書き直せばいいのでしょうか。
(ボス絵の大きさは400×300で一枚が100×100です)

あと、自分は龍神録の改造からC言語に入ったので1から学んでいません。
改造しているとやはり書き換えられる範囲が限られてしまいます。
やはり1から学んだほうがいいのでしょうか
「これならわかるC入門の入門」という本を買おうか迷っています。

ご意見お待ちしています。


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


Name:  ..上級者(24,527ポイント)   Date: 2009/12/10(木) 23:00   No:43767     
Title: Re:ボスの表現の仕方について    
ループについてですが、
敵の画像みたいにmukiとcntを使うといいですよ。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,099,337ポイント)   Date: 2009/12/10(木) 23:26   No:43770     
Title: Re:ボスの表現の仕方について    
スタートメニューさん
こんにちは。

龍神録の館は結構経験者を対象にした内容になっています。
少なくとも基本がわかっていて、ゲームプログラミングの内容は理解していることが前提です。
ですので、Cの基本を理解されていないとかなり無理が来るような気がします。

ループとなると % を結構使ったりしますが、
こういう演算子については理解されていますか?

立ち止っている、右に動いている、左に動いている、といった情報はボスの構造体に持たせたらいいと思います。
.MovingStatesとでも名づけた変数にボスの動き状態を格納してやり、
ボスの動きカウンタに合わせて画像をループさせてやればよいかと。

構造体に変数を追加したり、計算したりする方法はわかりますか?

また、迷われている本はまず買って損はないと思いますよ。
もし本格的にCでゲームを作るなら基本がわかっていないとまず無理です。
・・というと敬遠してしまうかもしれませんが、簡単な基本がわかっていれば出来るという裏には
簡単な基本はわかっていないといけないという事があるわけです。

簡単なというのがどの程度かというと、「C言語 入門」で検索して出てくるような入門サイトの内容が
一通り理解出来るレベルでしょうか。
難解なアルゴリズムを使った問題が解けるようになどはならなくても大丈夫です。
(はじめのうちは)


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

Name: スタートメニュー  ..入門者(3,627ポイント)   Date: 2009/12/10(木) 23:58   No:43777     
Title: Re:ボスの表現の仕方について    
☆さん ご意見ありがとうございます。
四苦八苦すると思いますが参考に頑張ってみます。

管理人さん ご返事ありがとうございます。
やはり本格的に作る場合はそうなりますよね。自分に甘えが見えていました。
ご意見の内容を見ましたがやはりいまの自分にはさっぱりわかりません。
将来、管理人さんレベルのプログラマーになることを目指して今日からとことん勉強することにします。
こうなったら意地でもなってみせますよ!

そういえばプログラムを学べる大学(専門?)を通った方がやはり独学より実力伸びますかね?
管理人さんはそういった大学(専門?)を出ていますか?





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

Name: kazuoni [URL]  ..ハッカー(118,148ポイント)   Date: 2009/12/11(金) 01:49   No:43790     
Title: Re:ボスの表現の仕方について    
> そういえばプログラムを学べる大学(専門?)を通った方がやはり独学より実力伸びますかね?

決してそんなことはないと思います。
自分は情報系の大学ですが、むしろ物足りないぐらいです。
自分の学部は情報であって、情報≠プログラミングってこともありますが・・・。

結局は演習問題が出されて、それを解くって形になりますので、
授業は「へー」ぐらいになってしまい、結局は自力で解きます。

もちろん、ゲームプログラマ専用的な専門学校とかもありますが、
一度よく考えてから進学した方がよいかと思いますよ^^;
趣味と職業では大きく違ってきますからね。。

っということで(?)結局はやる気次第ですので、
参考書だろうと、入門ページだろうと、「一通りやりきれば」実力が伴ってくると思います!

#自分もまだ色々な意味でひよっ子レベルです・・・。


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

Name: 御津凪 [URL]  ..ハッカー(131,331ポイント)   Date: 2009/12/11(金) 02:29   No:43791     
Title: Re:ボスの表現の仕方について    
私はプログラムを独学(ほぼ趣味でしたが)で学び、現在は新人ゲームプログラマーの若造です。

kazuoni さんの言う通り、プログラミング自体はやる気次第でいくらでも実力がつきます。
が、今の時代はそれに伴いコミュニケーション能力と体力が必要ですので、
それを心に留めておいてくださいね。

ゲームプログラミングをしたいがためにゲーム会社に入ったが、うまく行かなくて辞めた、なんてことでは
その先が厳しい世の中ですから。


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

Name: スタートメニュー  ..入門者(3,898ポイント)   Date: 2009/12/12(土) 00:05   No:43866 解決!     
Title: Re:ボスの表現の仕方について    
kazuoniさん ご意見ありがとうございます。
進学まで関わってくるとやはりことの大きさを感じました。
よく考えてこの先の人生を歩んでいきたいと思います。(^^)

御津凪さん ご意見ありがとうございます。
独学から入ってきた人がいると心強く感じます!(^^)
今は独学をして、時が来たときに自分の実力と心境をともに
考えたいと思います。

なんか人生相談みたいになってしまいましたが^^;
皆さんいい人だらけでここを知ってよかったです!

この先のことを考えるとワクワクしてきたのでとにかく勉強を頑張ってみます。
皆様、ご意見など頂きまして本当にありがとうございました。



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

Name: Dixq (管理人) [URL]  ..ウィザード(1,101,355ポイント)   Date: 2009/12/12(土) 02:15   No:43890     
Title: Re:ボスの表現の仕方について    
私は大学で付けたCの知識なんて0ですよ^^;(そのせいでよく解ってないんじゃないかという突っ込みは無しで)
いや、0.1位にしておこうかな・・。

C言語の授業はありましたが、最初興味が全然無くて20点でした。
もちろん落第点です。

しかしDXライブラリに出会ってからプログラムの面白さを知り、毎日のように勉強(という意識はありませんでしたが)しました。
・・すると翌年受けたらほぼ100点でした^^;
まぁそんなもんじゃないですかね。
授業で学ぶより、自分で興味持って自分から意欲的に勉強する方が数段ためになると思いますよ。

プログラミング専門の授業に出ることで知らない知識が付けられる可能性は高まるので、
そりゃやっぱり専門の大学に行った方がいいのは確かですが
行かないと勉強出来ないなんてことはありません。

大学だと研究も出来るので、好きなことを突き詰めたいならやはり
自分が専門性を高めたい学部に行くのが良いと思います。
気に入れば大学院で研究を続けるという手もあります。
私は学部生の途中からやりたい研究が見つかったので、院に進学しましたが、
自分の好きな研究に朝から晩まで時間が割けるというのは嬉しいです。

社会人になってしまったら自分の研究なんて出来なくなってしまいますから・・。
(ミツナギさんと同じく、私も今年からプログラマーとして働いています。


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

Name: スタートメニュー  ..入門者(4,052ポイント)   Date: 2009/12/12(土) 13:06   No:43925     
Title: Re:ボスの表現の仕方について    
管理人さん ご意見ありがとうございます。
軽い気持ちで大学(専門)進学を決めることがなんか怖く思いました^^;
やはりやる気次第ってことですね!ますますワクワクしてきました。
これから冬休みに入るので基礎からの勉強に励みたいと思います。

プログラマーとはなんと羨ましい!

Amazonから入門書が届いたので今はテンションが上がっています(^^)







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



Name: 初心者  ..熟練のプログラマー(42,449ポイント)   Date: 2009/12/12(土) 12:00   No:43916       
Title: 字下げと空白    
例えば
←←←●
←←←●
←←←●
←←←●

●←←←
●←←←
●←←←
●←←←
のようにいっきに字下げできる機能ってありますか?
後、全角の空白を分かる機能とか
環境はVC++2008EEです。


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


Name: Mist  ..比類無きプログラマー(77,097ポイント)   Date: 2009/12/12(土) 12:17   No:43918     
Title: Re:字下げと空白    
2008のプロパティを一通り見ましたけど無いみたいですね。
何かフリーのエディタを探してみてはどうでしょうか。
なお、私がいつも使用しているMIFESっていうエディタにはどちらの機能も備えていますけど値段が高いのでお勧めしません。


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

Name: Justy  ..伝説なるハッカー(481,861ポイント)   Date: 2009/12/12(土) 12:58   No:43923     
Title: Re:字下げと空白    
 たしか、対象の行を丸ごと選択して、Tabや Shift+Tabでその図のようにインデントを
変えられたはずです。
 
 空白の方は、別のエディタを使えば全角の空白に色をつけられる機能をもったものもありますが、
VSの IDEなら空白を検索するしかないんじゃないかと。

 あ、でもコメント以外のコード中の空白ならコンパイルすれば全角の空白に
C3872: '0x3000: この文字を識別子で使用することはできません' 」のエラーが出るのですぐに判ります。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,105,579ポイント)   Date: 2009/12/12(土) 13:01   No:43924     
Title: Re:字下げと空白    
出来ますよ。
Justyさんが仰っているようにShift+Tabです。
Shiftを押しながら操作をすると、逆の操作が出来る事があるので、覚えておくといいかもしれません。

後、全角を分けるというか、置換すればいいんじゃないでしょうか?
全角スペースは半角スペース2つで置換すれば見た目もよいのではないかと思います。


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



Name: MP  ..かけだし(1,043ポイント)   Date: 2009/12/11(金) 05:58   No:43794       
Title: 括弧の式による演算    
はじめまして。質問させていただきます。

私は大学で情報工学科に通う二年生です。大学の課題で出た問題を自分だけでは解決できないため、ご助力願いたいです。
C言語の理解度としましては、大学のC言語の授業にはついていけなくなってきてまして、ポインタに関して理解に自信がありません。という程度です。
課題の提出期限の関係から今月13日(日)までには仕上げたいと考えています。

問題は、足し算や掛け算といった演算を括弧を用いて表すというものです。
(1 2 3)は1+2+3と考えます。
加算を()、減算を{}、乗算を[]、除算を<>を用いて表し、たとえば、
[10 {60 24 5} 3] → 10*(60-24-5)*3
となります。括弧内の初項に2項目以降を指定の演算で計算するようになっています。

課題としては、文字列として与えられた正しいこの式の値を求めるプログラムを作成するというものです。

プログラムを作成してみてはいるのですが、コンパイルが通らずです。エラーコードを読み取り見直しましても、間違ってないような・・・という感じでどこが間違っているのかわかりません。どのような間違いをおかしていますでしょうか?

・プログラム

#include <stdio.h>
#include <string.h>
#include <math.h>

int i=0;

int calc(char *buff){
int result;
int result_empty=1;
int calc_type;
int term=0;
int term_sign=1;
int term_figure=0;
int term_complete=0;

/* 計算の種類を開き括弧から判断している */
switch(buff[i]){
case '(':
calc_type=1;
i++;
break;
case '{':
calc_type=2;
i++;
break;
case '[':
calc_type=3;
i++;
break;
case '<':
calc_type=4;
i++;
break;
default:
break;
}

/* 入力された文字列の最後まで読み終えたら繰り返し文から抜ける */
while(i < signed int(strlen(buff))){

/* 現在読んでいる一文字から何をするか判断している */
switch(buff[i]){
/* 開き括弧ならcalc関数を呼び出し変数termに代入する */
case '(':
case '{':
case '[':
case '<':
term=calc(buff);
/* 空白および閉じ括弧なら一つの項が完成したとみなす */
case ')':
case '}':
case ']':
case '>':
case ' ':
term_complete=1;
break;
/* それ以外なら数字または-記号とみなし項の桁を増やす */
default:
term_figure++;
break;
}

/* 項を読み終えたら項の計算に入る */
if(term_complete){
while(term_figure>0){
/* もし-記号があれば変数term_signに-1を代入 */
if(buff[i-term_figure]=='-'){
term_sign=-1;
}else{
/* もし-以外(数字)であれば項に数字を加算していく */
term= term+
term_sign* /* 項の記号 */
int(buff[i-term_figure]-'0')* /* それぞれの桁の数字 */
int(pow(double(10), double(term_figure-1))); /* その数字が何桁目にあるか */
}
term_figure--;
}

/* 項が完成したら変数resultに計算していく */
/* もし変数resultが何も手をつけられていない状態なら */
/* 変数termをそのまま代入する */
if(result_empty){
result=term;
result_empty=0;
}else{
/* そうでないならそれぞれの計算の種類にそってresultを計算する */
switch(calc_type){
case 1:
result=result+term;
break;
case 2:
result=result-term;
break;
case 3:
result=result*term;
break;
case 4:
result=result/term;
break;
default:
break;
}
}
term=0;
term_sign=1;
term_complete=0;
}

/* 読んでいる一文字が閉じ括弧なら繰り返し文から抜け変数resultを返す */
if( buff[i]==')'||
buff[i]=='}'||
buff[i]==']'||
buff[i]=='>'){
i++;
break;
}
i++;
}
return result;
}

int main(void){
# define BUFSIZE 256
char buff[BUFSIZE];
fgets(buff, BUFSIZE, stdin);
printf("%s => %d", buff, calc(buff));
return 0;
}



・エラーコード
bq3.c: In function `calc':
bq3.c:47: error: parse error before "signed"
bq3.c:58: error: case label not within a switch statement
bq3.c:59: error: case label not within a switch statement
bq3.c:60: error: case label not within a switch statement
bq3.c:61: error: case label not within a switch statement
bq3.c:62: error: case label not within a switch statement
bq3.c:64: error: break statement not within loop or switch
bq3.c:66: error: `default' label not within a switch statement
bq3.c:68: error: break statement not within loop or switch
bq3.c: At top level:
bq3.c:72: error: parse error before "if"
bq3.c:92: warning: data definition has no type or storage class
bq3.c:93: error: parse error before '}' token
bq3.c:112: warning: data definition has no type or storage class
bq3.c:113: warning: data definition has no type or storage class
bq3.c:114: warning: data definition has no type or storage class
bq3.c:115: error: parse error before '}' token


環境  
 [2.1] OS : Windows vista (Cygwinを使っています。)
 [2.2] コンパイラ名 : gcc

宜しくお願いします。



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


Name: Libra  ..中級者(14,073ポイント)   Date: 2009/12/11(金) 06:19   No:43795     
Title: Re:括弧の式による演算    
while(i < signed int(strlen(buff))){ 
のsigned int の部分を

signed int→(signed int)

にしてはどうでしょう?
変更したところ、BCCコンパイラでは通りました。


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

Name: MP  ..かけだし(1,205ポイント)   Date: 2009/12/12(土) 02:46   No:43893     
Title: Re:括弧の式による演算    
文法的な間違いだったということでしょうか。
gccだと、Libraさんのようにすると、たしかにエラーコードはほとんどなくなったのですが、まだ一つ文法的な間違いをおかしているようです。探してみましたが、見つかりません。どこだかわかりますでしょうか。

・エラーコード
bq3_a.c: In function `calc':
bq3_a.c:73: error: parse error before "int"

・場所

int(buff[i-term_figure]-'0')* /* それぞれの桁の数字 */

が73行目です。


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

Name: sizuma [URL]  ..上級者(18,987ポイント)   Date: 2009/12/12(土) 03:44   No:43899     
Title: Re:括弧の式による演算    
文の途中にコメント入れたらだめ。
とかでしょうか?

コンパイラは全くわからないんですけどね(笑


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

Name: pooka [URL]  ..上級者(19,679ポイント)   Date: 2009/12/12(土) 04:05   No:43900     
Title: Re:括弧の式による演算    
>int(buff[i-term_figure]-'0')*

(int)(buff[i-term_figure]-'0')*
のようにしてみてください。


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

Name: Libra  ..中級者(14,428ポイント)   Date: 2009/12/12(土) 04:35   No:43902     
Title: Re:括弧の式による演算    
VisualStudio2008でもコンパイルしてみたところ、
最初に提示されたソースでコンパイルが通りました。
変更無しで通ったためびっくりしました(^^;)

型変換(キャスト)を明示的行う際に、
gccでは括弧で括る必要があるようですね。

規約に「コンパイラの種類を提示して下さい」とありますが、
まさにこのことですね。
学校の課題という事なので、恐らく先生がある程度作成したプログラム
だと思うのですが、出題者は別のコンパイラを使用したのでしょうね。

コンパイラでここまで違うものなのですね。
勉強になります。m(_ _)m


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

Name: MP  ..かけだし(1,339ポイント)   Date: 2009/12/12(土) 05:07   No:43903 解決!     
Title: Re:括弧の式による演算    
皆さんのコメントを参考に色々と弄っていたのですが、Libraさんのご指摘で解決いたしました。
C言語でもコンパイラの違いによって、書き方も異なったりするのですね。なるほどです。
コメントくださった方々、ありがとうございました。


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

Name: pooka [URL]  ..上級者(19,769ポイント)   Date: 2009/12/12(土) 12:49   No:43922     
Title: Re:括弧の式による演算    
Libraさん
>VisualStudio2008でもコンパイルしてみたところ、
>最初に提示されたソースでコンパイルが通りました。
とありますが、C++としてコンパイルしていませんか?
Cとしてコンパイルしたところ同じようなエラーになりましたので・・・


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



Name: kos-mos  ..入門者(3,919ポイント)   Date: 2009/12/11(金) 21:44   No:43860       
Title: C++の宿題で困っています。(問題)    
今回は3x3行列の表示、行・列の入れ替え、転置行列という宿題についての質問です。

宿題の内容は以下の通りです。
付属のサンプルファイルは次のに載せます。
どう書いたらいいか初めからわからないので、丸投げのようで申し訳ないですが、教えていただけると嬉しいです。

=問題=
以下の機能を持つプログラムを作成する。

行列(要素は整数型、3行x3列)に値を入力する
行列を表示する
利用者が入力した列番号に基づいて、行列の2つの列を入れ替える
利用者が入力した行番号に基づいて、行列の2つの行を入れ替える
転置行列を求める

=演習問題の考え方=
1) プログラムを1つにまとめる
機能毎に関数を定義する
主プログラム(main)
行列に値を入力する関数(getMatrix)
行列を表示する関数(showMatrix)
利用者が入力した列番号に基づいて、行列の2つの列を入れ替える関数(exchangeColumn)
利用者が入力した列番号に基づいて、行列の2つの行を入れ替える関数(exchangeRow)
転置行列を求める関数(transposeMatrix)
機能の一覧を表示する関数(showMenu)
アルゴリズム、プログラムは、関数毎に独立に作成する

2) プログラムの構造
行列は大域変数とする
二次元配列を用いる
行列以外の変数は局所変数とする
main関数の役割
利用者が各機能を選べるようにする
利用者の指示に従って、各機能を呼び出す
その他の関数の役割
指定された機能だけを完全に実現する
それ以外の機能を含めない

3) 機能の一覧
機能番号は定数で定義する
例:終了(0)、値の入力(1)、表示(2)、列の入れ替え(3)、行の入れ替え(4)、転置(5)
main関数のステップ3-1〜3-4はswitch文で実現する
機能の一覧を表示する関数showMenuを定義する
main関数の中で2回使う (参考例を参照)
機能:機能の一覧と機能番号を一覧表示する
アルゴリズム
定数: 配列の行数 N 3
配列の列数 M 3

定数: 機能番号「終了」 0
機能番号「値の入力」 1
機能番号「表示」 2
機能番号「列の入れ替え」 3
機能番号「行の入れ替え」 4
機能番号「転置」 5

大域変数: 配列 int matrix[N][M]

主プログラム
変数: 機能番号 int functionNumber
入替えする列番号 int column1,column2

1. 機能の一覧を表示する。
2. 機能番号を入力する。
3. 機能番号が「終了」でない限り以下の処理を繰り返す。
 3-1. 「値の入力」が指定されたならば、行列に値を入力する。
 3-2. 「表示」が指定されたならば、行列を表示する。
 3-3. 「列の入れ替え」が指定されたならば、以下の処理を実行する。
  3-3-1. 入れ替える列の番号column1, column2を入力する。
  3-3-2. 配列のcolumn1列とcolumn2列を入れ替える。
 3-4. 「行の入れ替え」が指定されたならば、以下の処理を実行する。
  3-4-1. 入れ替える行の番号row1, row2を入力する。
  3-4-2. 配列のrow1行とrow2行を入れ替える。
 3-5. 「転置」が指定されたならば、行列を転置する。
 3-6. 機能の一覧を表示する。
 3-7. 機能番号を入力する。

行列に値を入力する
引数:なし
1. 各行row に対して以下の処理を繰り返す。
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 行列の row行 column列の要素に値を入力する。

行列を表示する
引数:なし
1. 各行row に対して以下の処理を繰り返す。
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 行列の row行 column列の要素の値を表示する。
1-2. 改行する。

行列の列を入替える
引数: 入れ替え対象の列番号: int column1, column2

1. 各行rowに対して以下の処理を繰り返す。
1-1. 行列の row 行 column1列目の要素とrow 行 column2 列目の要素とを入れ替える。

行列の行を入替える
引数: 入れ替え対象の行番号:
int row1, row2

1. 各列columnに対して以下の処理を繰り返す。
1-1. 行列の row1 行 column列目の要素とrow2 行 column 列目の要素とを入れ替える。

行列を転置する
引数:なし
1. 各行row に対して以下の処理を繰り返す。
1-1. 当該行の0〜row-1番目までの各列column に対して以下の処理を繰り返す。
1-1-1. 行列の row 行 column 列目の要素とcolumn 行 row 列目の要素とを入替える。

機能の一覧を表示する
引数:なし
1. 「機能番号 0 は プログラムを終了する。」と表示する。
2. 「機能番号 1 は 行列に値を入力する。」と表示する。
3. 「機能番号 2 は 行列の値を表示する。」と表示する。
4. 「機能番号 3 は 行列の指定された行を入れ替える。」と表示する。
5. 「機能番号 4 は 行列の指定された行を入れ替える。」と表示する。
6. 「機能番号 5 は 行列を転置する。」と表示する。

OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。
四度目の投稿なので至らないところもあると思いますが、どうかよろしく願いします。


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


Name: たいちう  ..プログラマー(38,855ポイント)   Date: 2009/12/11(金) 22:05   No:43862     
Title: Re:C++の宿題で困っています。(問題)    
丸投げするつもりはなく、努力してくれるという前提での回答です。


> 行列(要素は整数型、3行x3列)に値を入力する
> 行列を表示する

まず、この部分だけ作ってみてください。
問題分の他の部分は無視しても構いませ


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

Name: non  ..比類無きプログラマー(80,447ポイント)   Date: 2009/12/11(金) 23:02   No:43864     
Title: Re:C++の宿題で困っています。(問題)    
それに、サンプルを2次元に書き直して、添付してください。
変数名等を質問者さんに決めてもらった方が、回答しやすいですね。


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

Name: kos-mos  ..入門者(2,957ポイント)   Date: 2009/12/11(金) 23:32   No:43865     
Title: Re:C++の宿題で困っています。(問題)    
#define N 3

#define M 3
int matrix[N][M];
int i;
int j;
void main(){
for(i = 0; i <= N -1; i++){
for(j = 0; j <= M -1; j++){
cout << matrix[i][j] << "の値を入力してください" << endl;
cin >> matrix[i][j];
}
}
for(i = 0; i <= N -1; i++){
for(j = 0; j <= M -1; j++){
cout << matrix[i][j] << endl;
}
}
}

まだ習っていないので調べて考えてみたのですが、これでいいんですかね?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,105,338ポイント)   Date: 2009/12/12(土) 02:55   No:43895     
Title: Re:C++の宿題で困っています。(問題)    
投稿を分ける時は同じトピック内にして下さい。
こちらに移しますね。

字数制限で分けさせていただきました。

=サンプルファイル=

/**************************************************************
プログラミング演習I課題(第10回サンプル)
1次元配列の操作を行う。エラー処理は略す。
  学籍番号:         氏名:
  提出日: 年 月 日
**************************************************************/
#include <iostream>
using namespace std;

// 定数定義
#define N 10 // 要素数

#define END 0 // 終了
#define INPUT 1 // 入力
#define SHOW 2 // 表示
#define GET 3 // 要素値の取得
#define SET 4 // 要素値の設定

// プロトタイプ宣言
void showMenu(void); // メニューを表示する。
void inputArray(void); // 配列に値を入れる。
void showArray(void); // 配列を表示する。
int getElement(int index); // 配列要素の値を取り出す。
void setElement(int index, int value); // 配列要素に値を設定する。

// 大域変数
int array[N]; // 対象とする配列

/*****************************************
メイン関数
*****************************************/
void main() {

int choice; // 機能番号
int index; // 要素番号
int value; // 要素値

// 1. 機能の一覧を表示し、機能番号を受け取る。
showMenu();
cout << "機能番号=";
cin >> choice;

// 2. 機能番号が「終了」でない限り以下の処理を繰り返す
while(choice != END) {

// 2.1. 機能番号によって処理を分岐する。
switch(choice) {

// 2.1.1. 機能番号が「入力」ならば配列に値を入力する
case INPUT:
inputArray();
break;

// 2.1.2. 機能番号が「表示」ならば、配列を表示する
case SHOW:
showArray();
break;

// 2.1.3. 機能番号が「要素取得」ならば、要素番号を受け取り、要素を取得して表示する。
case GET:
cout << "値を取得する要素番号を入れてください" << endl;
cin >> index;
value = getElement(index);
cout << "要素の値=" << value << endl;
break;

// 2.1.4. 機能番号が「要素設定」ならば、変更要素番号と要素値を受け取り、配列要素を入れ替える。
case SET:
cout << "値を設定する要素番号と設定値を入れてください" << endl;
cin >> index >> value;
setElement(index, value);
break;

// 2.1.5. 機能番号がそれ以外は何もしない。
default:
break;
}

// 2.2. 機能の一覧を表示し、機能番号を受け取る。
showMenu();
cout << "機能番号=";
cin >> choice;
}
}

/*****************************************
メニューを表示する。
*****************************************/
void showMenu(void) {

// 1. 機能番号の一覧を表示する。
cout << "番号を選択ください。" << endl;
cout << "終了  :" << END << endl;
cout << "入力  :" << INPUT << endl;
cout << "表示  :" << SHOW << endl;
cout << "要素取得:" << GET << endl;
cout << "要素設定:" << SET << endl;
}

/*****************************************
配列に値を入力する。
*****************************************/
void inputArray(void) {

// 1. 変数 i を0〜N-1まで変えながら以下の処理を繰り返す
for(int i = 0; i < N; i++) {

// 1.1. 配列のi番目の要素に値を入力する
cout << "array[" << i << "] = ";
cin >> array[i];
}
}

/*****************************************
配列を表示する。
*****************************************/
void showArray(void) {

// 1. 配列の全要素を表示する(要素はタブで区切る)。
for(int i = 0; i < N; i++) {
cout << array[i] << "\t";
}

// 2. 改行する。
cout << endl;
}

/*****************************************
配列要素を取得する。
index: 所得する要素の番号
戻り値: 取得した要素値
*****************************************/
int getElement(int index) {

// index番目の配列要素を戻す。
return array[index];
}

/*****************************************
配列要素に値を設定する。
index: 設定する要素番号
value: 設定する値
*****************************************/
void setElement(int index, int value) {

// index番目の配列要素に値valueを設定する。
array[index] = value;
}


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

Name: non  ..比類無きプログラマー(80,928ポイント)   Date: 2009/12/12(土) 09:35   No:43909     
Title: Re:C++の宿題で困っています。(問題)    
サンプルではこう書いてあります。

/*****************************************
配列に値を入力する。
*****************************************/
void inputArray(void) {

// 1. 変数 i を0〜N-1まで変えながら以下の処理を繰り返す
for(int i = 0; i < N; i++) {

// 1.1. 配列のi番目の要素に値を入力する
cout << "array[" << i << "] = ";
cin >> array[i];
}
}

/*****************************************
配列を表示する。
*****************************************/
void showArray(void) {

// 1. 配列の全要素を表示する(要素はタブで区切る)。
for(int i = 0; i < N; i++) {
cout << array[i] << "\t";
}

// 2. 改行する。
cout << endl;
}

ですから、このような関数にして、mainから呼び出して下さい。
i,jはローカル変数にしましょう。
データ入力を促すための表示がサンプルとは異なってます。
Nが未定義です。

>まだ習っていないので調べて考えてみたのですが
習ってないのは何がですか?2次元配列?
宿題なのに、習ってないなんて事あるかな。



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

Name: たいちう  ..プログラマー(38,907ポイント)   Date: 2009/12/12(土) 10:29   No:43910     
Title: Re:C++の宿題で困っています。(問題)    
> まだ習っていないので調べて考えてみたのですが、これでいいんですかね?

コンパイルして、実行して、結果を確認してください。
ここまでは自分でできるでしょ。
(できなかったらそのことについて質問)

自分で満足できる結果が得られているのならば、その旨も書いてください。


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



Name: wing  ..かけだし(1,060ポイント)   Date: 2009/12/12(土) 00:31   No:43870       
Title: classを使って龍神録を書き換えています    
本やネットで調べながらです。独学です。
VC2008EE DXライブラリ Windows7です。
「たくさん敵の行動パターンを作ってみよう」のところで
エラーが解決できません。

質問の内容
1.
error C2065: 'Enemy_Pattern0' : 定義されていない識別子です。
'Enemy_Pattern15'まで同じエラーがでます。Enemy_Pattern0〜15は
class Enemyで宣言しています。認識させる書き方が分かりません。

2.

void (*Enemy_Pattern[ENEMY_PATTERN_MAX])(int)={
Enemy_Pattern0, Enemy_Pattern1, Enemy_Pattern2, Enemy_Pattern3,
Enemy_Pattern4, Enemy_Pattern5, Enemy_Pattern6, Enemy_Pattern7,
Enemy_Pattern8, Enemy_Pattern9, Enemy_Pattern10, Enemy_Pattern11,
Enemy_Pattern12, Enemy_Pattern13, Enemy_Pattern14, Enemy_Pattern15,
};

この関数はどのクラスでも宣言していないがそれでいいのでしょうか?
宣言するとしたらどのように書くのか分かりません。
どなたかご指導をお願いします。

/* enemy.h */
#ifndef __ENEMY_H__
#define __ENEMY_H__
#include "DxLib.h"
#include <math.h>

#define ENEMY_MAX 30
#define ENEMY_PATTERN_MAX 16
#define ENEMY_ORDER_MAX 500
#define FX 32
#define FY 16
#define FMX 384
#define FMY 448
#define PI 3.1415926535898
#define PI2 (PI*2)

class Enemy{
int img_enemy[3][3];
protected:

public:
float x, y, vx, vy, sp, ang;
int bltime, blknd, blknd2, col, state, wtime, wait, cnt;
int flag, pattern, knd, hp, hp_max, img;
int item_n[6];

void Init();
void Enter();
void Move();
void Draw();
void LoadStory();
void Enemy_Pattern0(int i); void Enemy_Pattern1(int i);
void Enemy_Pattern2(int i); void Enemy_Pattern3(int i);
void Enemy_Pattern4(int i); void Enemy_Pattern5(int i);
void Enemy_Pattern6(int i); void Enemy_Pattern7(int i);
void Enemy_Pattern8(int i); void Enemy_Pattern9(int i);
void Enemy_Pattern10(int i); void Enemy_Pattern11(int i);
void Enemy_Pattern12(int i); void Enemy_Pattern13(int i);
void Enemy_Pattern14(int i); void Enemy_Pattern15(int i);

int Num_Search();
};
class EnemyOrder{
public:
float x, y, vx, vy, sp, ang;
int bltime, blknd, blknd2, col, state, wtime, wait, cnt;
int flag, pattern, knd, hp, hp_max, img;
int item_n[6];
};

#endif

長いので次に続きます。


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


Name: wing  ..かけだし(1,871ポイント)   Date: 2009/12/12(土) 00:34   No:43871     
Title: Re:classを使って龍神録を書き換えています    
/* enemy.cpp */

#include "../include/enemy.h"

Enemy enemy[ENEMY_MAX];
EnemyOrder enemy_order[ENEMY_ORDER_MAX];
extern int stage_count;

//渡された-ang〜angまでのランダムな角度を返す
double rang(double ang){
return ( -ang + ang*2 * GetRand(10000)/10000.0 );
}

void (*Enemy_Pattern[ENEMY_PATTERN_MAX])(int)={
Enemy_Pattern0, Enemy_Pattern1, Enemy_Pattern2, Enemy_Pattern3,
Enemy_Pattern4, Enemy_Pattern5, Enemy_Pattern6, Enemy_Pattern7,
Enemy_Pattern8, Enemy_Pattern9, Enemy_Pattern10, Enemy_Pattern11,
Enemy_Pattern12, Enemy_Pattern13, Enemy_Pattern14, Enemy_Pattern15,
};

void Enemy::Move(){
for(int i=0; i<ENEMY_MAX; i++){
if(enemy[i].flag==1){
Enemy_Pattern[enemy[i].pattern](i);
enemy[i].x+=cos(enemy[i].ang)*enemy[i].sp;
enemy[i].y+=sin(enemy[i].ang)*enemy[i].sp;
enemy[i].x+=enemy[i].vx;
enemy[i].y+=enemy[i].vy;
enemy[i].cnt++;
enemy[i].img=(enemy[i].cnt%18)/6;
//敵が画面から外れたら消す
if(enemy[i].x<-20.0f || enemy[i].x>FX+FMX+16.0f || enemy[i].y<-25.0f || enemy[i].y>FY+FMY+21.0f)
enemy[i].flag=0;
}
}
}

void Enemy::Enter(){
int i,j,t;
for(t=0;t<ENEMY_ORDER_MAX;t++){
if(enemy_order[t].cnt==stage_count){//現在の瞬間がオーダーの瞬間なら
if((i=Num_Search())!=-1){
enemy[i].flag =1;//フラグ
enemy[i].cnt =0;//カウンタ
enemy[i].pattern=enemy_order[t].pattern;//移動パターン
enemy[i].knd =enemy_order[t].knd;//敵の種類
enemy[i].x =enemy_order[t].x;//座標
enemy[i].y =enemy_order[t].y;
enemy[i].sp =enemy_order[t].sp;//スピード
enemy[i].bltime =enemy_order[t].bltime;//弾の発射時間
enemy[i].blknd =enemy_order[t].blknd;//弾幕の種類
enemy[i].blknd2 =enemy_order[t].blknd2;//弾の種類
enemy[i].col =enemy_order[t].col;//色
enemy[i].wait =enemy_order[t].wait;//停滞時間
enemy[i].hp =enemy_order[t].hp;//体力
enemy[i].hp_max =enemy[i].hp;//体力最大値
enemy[i].vx =0;//水平成分の速度
enemy[i].vy =0;//鉛直成分の速度
enemy[i].ang =0;//角度
for(j=0;j<6;j++)
enemy[i].item_n[j]=enemy_order[t].item_n[j];//落とすアイテム
}
}
}
} //以下 省略

よろしくお願いします。


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

Name: softya  ..熟練のプログラマー(63,677ポイント)   Date: 2009/12/12(土) 00:44   No:43875     
Title: Re:classを使って龍神録を書き換えています    
staticでは無いメンバ関数のポインタについては次のようにする必要があります。
http://www.geocities.jp/ky_webid/cpp/language/034.html

私はC#で書き換えたときにクラスで関数ポインタを使うのが気持ち悪かったので全部switch〜caseに書き換えました。
龍神録XNA
http://softyasu.net/game/gametop.html
C#とXNAで書いたソースですが、もし良かったら参考にしてください。19章までは出来ています。


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

Name: wing  ..かけだし(1,956ポイント)   Date: 2009/12/12(土) 00:57   No:43876     
Title: Re:classを使って龍神録を書き換えています    
siftya様、ありがとうございます。
関数ポインタを勉強してきます。
switch caseの方法も参考にさせていただきます。

夜も遅いのでとりあえず御礼だけさせていただきます。



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

Name: wing  ..入門者(2,639ポイント)   Date: 2009/12/12(土) 09:33   No:43907     
Title: Re:classを使って龍神録を書き換えています    
switch文を使ってみごとにできました。

void Enemy::Move(){
for(int i=0; i<ENEMY_MAX; i++){
if(enemy[i].flag==1){
int k;
k = enemy[i].pattern;
switch(k){
case 0:
Enemy::Enemy_Pattern0(i);
break;
case 1:
Enemy::Enemy_Pattern1(i);
break;
case 2:
Enemy::Enemy_Pattern2(i);
break;
case 3:
Enemy::Enemy_Pattern3(i);
break;
case 4:
Enemy::Enemy_Pattern4(i);
break;
case 5:
Enemy::Enemy_Pattern5(i);
break;
case 6:
Enemy::Enemy_Pattern6(i);
break;
case 7:
Enemy::Enemy_Pattern7(i);
break;
case 8:
Enemy::Enemy_Pattern8(i);
break;
case 9:
Enemy::Enemy_Pattern9(i);
break;
case 10:
Enemy::Enemy_Pattern10(i);
break;
case 11:
Enemy::Enemy_Pattern11(i);
break;
case 12:
Enemy::Enemy_Pattern12(i);
break;
case 13:
Enemy::Enemy_Pattern13(i);
break;
case 14:
Enemy::Enemy_Pattern14(i);
break;
case 15:
Enemy::Enemy_Pattern15(i);
break;
}
enemy[i].x+=cos(enemy[i].ang)*enemy[i].sp;
enemy[i].y+=sin(enemy[i].ang)*enemy[i].sp;
enemy[i].x+=enemy[i].vx;
enemy[i].y+=enemy[i].vy;
enemy[i].cnt++;
enemy[i].img=(enemy[i].cnt%18)/6;
//敵が画面から外れたら消す
if(enemy[i].x<-20.0f || enemy[i].x>FX+FMX+16.0f || enemy[i].y<-25.0f || enemy[i].y>FY+FMY+21.0f)
enemy[i].flag=0;
}
}
}


関数ポインタは例題はわかるような気がするんですが、今回の場合は
うまくあてはめることができませんでした。
これで先に進めます。
softya様、ありがとうございました。



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

Name: wing  ..入門者(2,646ポイント)   Date: 2009/12/12(土) 09:34   No:43908 解決!     
Title: Re:classを使って龍神録を書き換えています    
解決マークを忘れました。

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



Name: mnkr  ..入門者(2,764ポイント)   Date: 2009/12/10(木) 20:10   No:43751       
Title: インターフェイスの利点について教えてください    
インターフェイスの仕様はなんとなく理解しているつもりです。。。。

わたしが考えている利点は、
設計者がインターフェイスを用意し、
プログラマーがインターフェイスを利用することによって
インターフェイス内のクラスの使用を強制させることで
(インターフェイス内のクラスを記述せずにコンパイルするとエラーが出るため)
製造時の記述漏れを無くし製造しやすくなる、ということだと考えています。

先輩に上記のように答えたら納得いかない顔をしていたので、
どこか間違っているのでしょうか?


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


Name: たかぎ [URL]  ..ハッカー(135,684ポイント)   Date: 2009/12/10(木) 20:49   No:43754     
Title: Re:インターフェイスの利点について教えてください    
何の話なのかさっぱりわかりません。
規約を熟読した上で、第三者に状況が理解できるように質問し直してください。


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

Name: sizuma [URL]  ..上級者(18,941ポイント)   Date: 2009/12/10(木) 22:10   No:43760     
Title: Re:インターフェイスの利点について教えてください    
>インターフェイス内のクラス
メソッドですよね。

Java?C#?オブジェクト指向でのinterfaceを使った実装の話ですよね?
インターフェースや継承の利点はポリモーフィズムにあると思います。

実装するとき、記述漏れってどんだけ無能なプログラマなの?
と思うのは僕だけじゃないはず。テストすればすぐ分かるでしょうし。
とは言っても、そういう利点もなきにしもあらずでしょうけど。
親クラスやインターフェースのメソッドはeclipseだと自動生成できるので楽ですしね。


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

Name: mnkr  ..入門者(3,040ポイント)   Date: 2009/12/11(金) 00:57   No:43783     
Title: Re:インターフェイスの利点について教えてください    
失礼しました。テンプレを使用します。

[1] 質問文
インターフェイスを使用することで利点になることを教えてください。

 [1.1] 自分が今行いたい事は何か
  インターフェイスの利点が知りたいです。

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
  参考書やネットで多少調べた程度です。

 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
  エラーやトラブルはありません。

 [1.4] 今何がわからないのか、知りたいのか
  先輩からの問題で、「インターフェイスを利用する利点について」問われて、
  一番最初の書き込みのように答えましたが納得いかない感じでしたので、
  わたしの考えている利点が間違っていると思いました。
  そこで、他の方の考えるインターフェイスを利用する利点について教えてください。

[2] 環境  
 [2.1] OS : Windows
 [2.2] コンパイラ名 : 特に言語とかコンパイラのことは考えていませんです。。。。


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

Name: 御津凪 [URL]  ..ハッカー(131,023ポイント)   Date: 2009/12/11(金) 01:36   No:43787     
Title: Re:インターフェイスの利点について教えてください    
テンプレから察するに、「インターフェイス」というものの利点についての質問、ということですね。


いちばん身近である GUI(グラフィカル・ユーザー・インターフェイス)では、
標準で各ソフトウェアごとに共通の機能(メニューや閉じるボタンなど)が共通の位置に存在します。

そういうところから私の考えるインターフェイスを利用することの利点は、
最低限要求する機能を「統一」して実装させることで、使用者側から統一した機能を利用できる、と考えています。
つまり、インターフェイスは仕様書の様なものです。


※なお、私はこの辺りについてキチンと勉強した者ではないので、どこか間違っているだろうと思いますのでその辺はご了承を。


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

Name: mnkr  ..入門者(2,868ポイント)   Date: 2009/12/12(土) 05:35   No:43905 解決!     
Title: Re:インターフェイスの利点について教えてください    
sizuma様
ありがとうございます。

>Java?C#?オブジェクト指向でのinterfaceを使った実装の話ですよね?
そうです。

>インターフェースや継承の利点はポリモーフィズムにあると思います。
多態性、オーバーロードとか呼ばれるものでしたっけ?
抽象クラスの継承とは別で、インターフェイスの継承だけで考えたときの利点が知りたいのです。。。

御津凪様
ありがとうございます。
統一。。。確かにメソッド名と引数がわかればメソッドで行われている細かい処理を考えずに
返却される結果だけ考えれば良いですね!



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



Name: ばんあこ  ..ぴよぴよ(20ポイント)   Date: 2009/12/11(金) 10:14   No:43806       
Title: 丸い太鼓の膜の振動の様子を    
丸い太鼓の膜の振動の様子をC言語を使って表してください

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


Name: やそ  ..比類無きプログラマー(98,928ポイント)   Date: 2009/12/11(金) 11:12   No:43811     
Title: Re:丸い太鼓の膜の振動の様子を    
printf("ぼよよよ〜ん"); (笑)



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

Name: 山崎  ..プログラマー(30,204ポイント)   Date: 2009/12/11(金) 11:20   No:43812     
Title: Re:丸い太鼓の膜の振動の様子を    
こんにちは、私は山崎といいます。

規約を読んでいただければわかると思うのですが、
こちらの掲示板では課題の丸投げは禁止されているのです。
それと、質問はもっと具体的にして頂かないと、回答者さんもなかなか答えられません。
詳しくは、こちらの掲示板の規約をお読みください。必ず読んでくださいね。

さて。
質問文からは何か自暴自棄な感じを受けますが…。
何か嫌なことでもあったのですか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,101,529ポイント)   Date: 2009/12/12(土) 02:22   No:43891     
Title: Re:丸い太鼓の膜の振動の様子を    
>ばんあこさん

こんにちは。

質問が唐突過ぎる気がしますが・・^^;

何かの様子を再現するのは面白いですよね。
これは何のためにするのでしょう?
そして何で描画するのでしょう?

振動の様子を何かデータ形式で出力するのか、
グラフィカルな出力をするのか・・。

細かい仕様が解らないとどうにもならないのですが、具体的に教えてくれませんか?


>>やそさん

もし質問文が宿題文そのままならそう提出したいですねw


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



Name: 77  ..ぴよぴよ(111ポイント)   Date: 2009/12/11(金) 15:13   No:43827       
Title: 画像の取り込み    
画像の取り込みついて

何回も画像を取り込む場合
関数の中の画像を取り込む変数はatuoかstatic
どちらが望ましいですか?
あと、ChangeCallback( void *Data )関数で最大化すると
画面が変で明らかに点滅みたいに頻繁にフラッシュします。解決策があるのか
私だけの現象でしょうか?


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


Name: Mist  ..比類無きプログラマー(76,731ポイント)   Date: 2009/12/11(金) 15:28   No:43830     
Title: Re:画像の取り込み    
> 何回も画像を取り込む場合

情報が不足しすぎでケースバイケースとしか答えようがありません。

> あと、ChangeCallback( void *Data )関数で最大化すると

少なくとも私が組んだプログラムでは発生しませんでした。
http://www.play21.jp/board/formz.cgi?action=res&resno=43158&page=&lognum=132&id=dixq&rln=43193#43193


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

Name: 77  ..ぴよぴよ(258ポイント)   Date: 2009/12/11(金) 15:41   No:43832     
Title: Re:画像の取り込み    
while文の中でまわっている
画像を表示する関数をです。多くのデータをいちいち関数内で宣言してる
ならstaticのほうが効率的かなと思って・・・。
あと最大化は静止画ならフラッシュしないんですが
動かすとフラッシュするんでよ。コールバック関数じゃなくて
最大化に問題があるのかも?って思っています。FPSも最大化すると
落ちるので原因がよくわからないんですよ。


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

Name: Mist  ..比類無きプログラマー(76,833ポイント)   Date: 2009/12/11(金) 15:53   No:43836     
Title: Re:画像の取り込み    
> 変数について

あなたの言う効率というのがどういうことを期待しているのかよくわかりませんが、一般的に変数をグローバル化して使いまわすのは致命的なバグの要因にしかなりません。

質問の意図を読み違えていたようなので修正しました。

効率というのを速度として考えているのであれば(環境によるけど)autoのほうが早い可能性が高いです。
static変数は一般的に静的領域というメモリ上に確保されますが、autoの場合状況によってはCPUレジスタ
で済んでしまう場合もありますので。
あと、変数をauto宣言した場合とstatic宣言した場合では、マルチスレッド環境で複数スレッドから関数コール
した場合や、再帰呼び出しした場合の動作が異なるので注意してください。


> フラッシュ

あなたのプログラムに問題があると思われますが、言葉の説明から原因を見つけることは不可能と思われます。
現象を確認できるソースかプロジェクトを提示してください。


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

Name: 77  ..ぴよぴよ(421ポイント)   Date: 2009/12/11(金) 16:44   No:43840     
Title: Re:画像の取り込み    
伝わらなくてすいません
例えば
function(){
while(a<=100){
static int a = LoadGraph("a.png"); // ☆
DrawGraph( 30, 330, a, TRUE) ;
a++;
}
}
上の☆の部分の宣言はconst、 int、static intのどれが効率よいかって話です。
毎回宣言するintでは動きが遅くなるんですよね。

>ソースかプロジェクトを提示してください
プロジェクトは全部ってことですか?


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

Name: 77  ..ぴよぴよ(543ポイント)   Date: 2009/12/11(金) 16:51   No:43841     
Title: Re:画像の取り込み    
間違いました
int a=0;
function(){
while(a<=100){
static int b = LoadGraph("c.png"); // ☆
DrawGraph( 30, 330, b, TRUE) ;
a++;
}

平たく言えば画像を収納する変数についてですけど
グローバル変数は使わない方がいいって聞いたので


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

Name: Mist  ..比類無きプログラマー(76,643ポイント)   Date: 2009/12/11(金) 17:05   No:43844     
Title: Re:画像の取り込み    
> 毎回宣言するintでは動きが遅くなるんですよね。

その例で言えば、aはレジスタに用意されそうなのでautoのほうが早そうですが、あまり深く考えても意味がない気がします。
画像のロードや表示に掛かる時間に比べれば、変数の実態確保に掛かる時間なんて無いに等しいものです。
例えば大阪ー東京間を移動するためのルートを考えるのに、こっちのルートのほうが0.001秒早く着く、なんて話しても無意味でしょう。

> プロジェクトは全部ってことですか?

はい。
回答者の方で現象を確認できる物が欲しいです。
全く同じプロジェクトを使用して、こちらで同じ現象が発生しないようであればあなたのPC環境の問題ってことがわかりますので。


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

Name: 77  ..ぴよぴよ(648ポイント)   Date: 2009/12/11(金) 17:38   No:43846     
Title: Re:画像の取り込み    
そうですか、int型で動かすと以下のようなエラーをはいてとまるんですよね。
size:80(0.078kb) file:DxGraphics2.cpp line:1768 ID:773 addr:11391b78 data:<................> [01 00 00 00 05 00 00 00 01 00 00 00 00 00 01 01]
でもstaticやグローバル変数だと高速にうごくんですよ。うーん分かりません。

プロジェクトは人のデータも入ってるのでアップするのはちょっと無理です。


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

Name: Mist  ..比類無きプログラマー(76,766ポイント)   Date: 2009/12/11(金) 17:54   No:43847     
Title: Re:画像の取り込み    
> そうですか、int型で動かすと以下のようなエラーをはいてとまるんですよね。

問題はもっと他の部分にあるのではないでしょうか。(そこではないところでメモリ破壊しているとか)
staticやグローバルにするとautoとは配置されるメモリの場所が変わるので、問題が隠蔽されているだけのような気がします。
ソースが無いので具体的な回答は無理ですが・・・。


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

Name: dic  ..熟練のプログラマー(40,764ポイント)   Date: 2009/12/11(金) 19:41   No:43853     
Title: オフトピック    
オフトピックですが
日本語が気になったので・・・

間違いました 間違えました

http://www.google.co.jp/search?hl=ja&lr=&q=%E9%96%93%E9%81%95%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F+%E9%96%93%E9%81%95%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F&revid=1854063&ei=6h4iS6SKMIGgkQW1tNinAw&sa=X&oi=revisions_inline&resnum=1&ct=broad-revision&cd=1&ved=0CC8Q1QIoAA

スルーしてもらってもかまいません


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

Name: ROM  ..ぴよぴよ(757ポイント)   Date: 2009/12/12(土) 01:25   No:43880     
Title: Re:オフトピック    
いつも2chと同じ質問をここでするのはどうかと

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,100,776ポイント)   Date: 2009/12/12(土) 01:55   No:43887     
Title: Re:オフトピック    
ROMさんの仰ることの他に、規約違反を何度もされているようです。
規約をお読みいただければ何が他に規約違反か解ると思います。
規約に沿った質問をお願いします。
何が規約違反かわからない場合はお聞きください。


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



Name: 匿名  ..上級者(18,579ポイント)   Date: 2009/12/10(木) 20:41   No:43752       
Title: 管理人さんに聞きたいのですが、    
Aerobeat Plusの
最初のロゴの絵の「R」の文字の
書体(フォント)を教えてほしいのですが
どんなフォントを使っているのでしょうか?
差支えなければ、是非教えてください


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


Name: Justy  ..伝説なるハッカー(476,343ポイント)   Date: 2009/12/10(木) 21:05   No:43757     
Title: Re:管理人さんに聞きたいのですが、    
 多分 ParkAvenue系じゃないかと。
 ま、合ってるかどうかは訊かないとわからないですが。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,099,531ポイント)   Date: 2009/12/10(木) 23:28   No:43771     
Title: Re:管理人さんに聞きたいのですが、    
う・・・、
あの時あのロゴを作ったOSはもう無いので、フォントが解りません;
一度作った画像のPSDファイルは残さないという変な修正があるので、データもないし^^;

今手元にあるOSで同じものがあるか調べてみます。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,099,777ポイント)   Date: 2009/12/10(木) 23:32   No:43772     
Title: Re:管理人さんに聞きたいのですが、    
Justyさん、さすがというか何というか、調べる前から
「Justyさんが仰るならParkAvenue系で間違いないだろうな」と
確認程度に見てみると、やはり正解でした^^;
いや〜その知識は一体どこから・・。

ということで、ParkAvenueBTでした。
windows7にOffice入れただけなので、きっと珍しいフォントじゃないと思います。

http://www.google.co.jp/search?hl=ja&q=ParkAvenue%E3%80%80%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja&aq=f&oq=

フリーなのかな・・?


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

Name: 匿名  ..上級者(18,658ポイント)   Date: 2009/12/11(金) 00:25   No:43779 解決!     
Title: Re:管理人さんに聞きたいのですが、    
管理人さん、Justyさん。ありがとうございます。
非常に参考になりました。

確かにJustyさん凄いですね。
フォントを見ただけでフォント名が分かるって・・
凄まじい知識ですね。尊敬します。


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

Name: Justy  ..伝説なるハッカー(478,226ポイント)   Date: 2009/12/11(金) 00:31   No:43780     
Title: Re:管理人さんに聞きたいのですが、    

> その知識は一体どこから・

 ネタバレすると、そんなたいしたことじゃないです。

 こういうサイトがあります。

WhatTheFont! « MyFonts
http://new.myfonts.com/WhatTheFont/


 このサイトにフォントが含まれた画像送れば、その形状に近いフォントを
教えてくれます。


 ちょっと前に iPhone版も出たので、だいぶお手軽に。

WhatTheFont for iPhone: Overview « MyFonts
http://new.myfonts.com/WhatTheFont/iPhone/




> フリーなのかな・・?

 Adobe社のフォントだったはずです。
 どういう使用許諾になっているかは、フォントが付いていたソフトを
調べないとわからないです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,100,608ポイント)   Date: 2009/12/12(土) 01:50   No:43885     
Title: Re:管理人さんに聞きたいのですが、    
おぉ、こんな便利な物が・・!

なるほど、何かかっこいいロゴとか見つけたりしたらここに送ってしまえばよいのですね。

>フォント

あ〜そうか、Adobeの製品もいくつか入っているのでそれかもしれません。


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



Name: バグ  ..ハッカー(176,534ポイント)   Date: 2009/12/07(月) 14:39   No:43586       
Title: 【雑談】よくある質問    
『キーボードの押した瞬間の判定』って結構な回数質問されてますよね?
で、簡単に扱いやすいようにクラス化してみたんですが、どうでしょう?
判定するのは『押されているか否か』、『今押されたか否か』、『押しっ放しにされているカウント数』の3つです。


まずはクラス本体…


#pragma once

#include <limits.h>
#include "DxLib.h"

class Keyboard
{
private:
unsigned long long m_uPressCount[256];

public:
Keyboard(void)
{
for (int i = 0; i < 256; ++i)
{
m_uPressCount[i] = 0;
}
}

virtual ~Keyboard(void)
{

}

bool Refresh(void)
{
char chKeybuf[256] = {0, };
if (GetHitKeyStateAll(chKeybuf) != 0)
{
return false;
}

for (int i = 0; i < 256; ++i)
{
m_uPressCount[i] = chKeybuf[i] == 1 && m_uPressCount[i] < ULLONG_MAX ? m_uPressCount[i] + 1 : 0;
}
return true;
}

bool GetPressNow(int nKeyCode)
{
return m_uPressCount[nKeyCode] == 1 ? true : false;
}

bool GetPressed(int nKeyCode)
{
return m_uPressCount[nKeyCode] > 0 ? true : false;
}

unsigned long long GetPressCount(int nKeyCode)
{
return m_uPressCount[nKeyCode];
}
};



そして使用例を…



#include "Keyboard.h"
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
if (DxLib_Init() == -1)
{
return -1;
}

Keyboard cKeyboard;

while (ProcessMessage() == 0 && cKeyboard.Refresh() == true && clsDx() == 0)
{
if (cKeyboard.GetPressed(KEY_INPUT_Z) == true)
{
printfDx("Pressed = true\n");
}
else
{
printfDx("Pressed = false\n");
}

if (cKeyboard.GetPressNow(KEY_INPUT_Z) == true)
{
printfDx("PressNow = true\n");
}
else
{
printfDx("PresseNow = false\n");
}

printfDx("Pressed = %I64u\n", cKeyboard.GetPressCount(KEY_INPUT_Z));
Sleep(5);
}

DxLib_End();
return 0;
}


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


Name: kazuoni [URL]  ..ハッカー(117,352ポイント)   Date: 2009/12/07(月) 18:50   No:43592     
Title: Re:【雑談】よくある質問    
スマートですね^^
シングルトン化しちゃってもいいのかな?なんて思ったり、思わなかったり・・・。

ただ、ここに来る人が関数をスッ飛ばして、クラスが扱えるって人は、
そこまでたくさんいないかと思うので、使用方法はしっかり書いておかないと
同じように質問が来てしまうかもしれませんね。


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

Name: たかぎ [URL]  ..ハッカー(134,637ポイント)   Date: 2009/12/07(月) 20:28   No:43593     
Title: Re:【雑談】よくある質問    
DXライブラリはよく知らないので外しているかもしれませんが...

unsigned long longはやりすぎではないでしょうか?
unsigned longにしても、1msに1回カウントしても、49日間持ちます。
現実問題として、オーバーフローに対処する必要もないように思います。

細かな点としては、const修飾を徹底すべきなのと、ゼロクリアにはstd::fill_nを使ったほうがよいといったことはあります。
シングルトンにするのもよいですが、グローバルオブジェクトにしてしまっても良いと思います。


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

Name: Justy  ..伝説なるハッカー(474,262ポイント)   Date: 2009/12/07(月) 20:33   No:43594     
Title: Re:【雑談】よくある質問    
そうですね、雑感ですが


■ クラスは理解できない人がいるかもしれない
 ゲームの館、龍神録の館の延長線上で質問してくる人が多いので、
多分関数タイプの方が判り安いのではないかな、と。


■ long longは VCでは 7.1以上、BCCでは 5.61以上でないと使え無い
 まんまです。
 そんな古い環境を使っているのに問題があるとも言えなくもないですが、
DXライブラリの対応環境には VC6とか BCC5.5も含まれていますんで……。


■ 押した瞬間、押されているだけでいいのか
 押した瞬間(Press)、押されている(On)があるのなら、
離された瞬間(Release)、押されていない(Off)は必要ないでしょうか?

 Offは Onの否定で判定できるので要らないかもしれませんが、
Releaseは様々なケースで必要になるかと思います。

 あとプライオリティは低いですがリピートとか、
デバッグ用途向けにダブルクリック(?)もあると便利ですね。


■ GetPressNow / GetPressed / GetPressCount
 メンバ関数に constをつけておいた方が良かったりしませんか?


■ GetPressNow関数などは引数の範囲チェックを
 配列の範囲外に対するアクセスになる可能性があるので、せめて DEBUGビルドの時だけでも
範囲チェックして、ユーザに対して何らかの警告を促したほうがいいのではないでしょうか。


■ シングルトン
 二つめ三つめのキーボードに対応しないのであれば
シングルトンにしてしまった方がいいかと思います。

 1つのオブジェクトを全体で使い回すような使い方にしてくれればいいのですが、
よくわかっていない人はあちこちでインスタンス化する可能性があり、
その場合に正しく動作しなかったり、同一フレームでも Refleshのタイミング次第で
食い違いが発生する可能性があります。


■ デストラクタが virtualになっている
 純粋な疑問ですが、このクラスを継承して何かしようとする予定があるのでしょうか?


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

Name: tkmakwins15  ..比類無きプログラマー(98,873ポイント)   Date: 2009/12/07(月) 22:04   No:43598     
Title: Re:【雑談】よくある質問    
VCでlong long が使えることは知りませんでした。ずっと__int64のtypedefで通していましたから…

ただひとつだけ、C++であれば、
<limits.h>よりも<climits>のほうがいいと思います、できれば、<limits>のnumeric_limits<>::max()を使った方がいいと思います。


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

Name: バグ  ..ハッカー(177,231ポイント)   Date: 2009/12/08(火) 10:58   No:43619     
Title: Re:【雑談】よくある質問    
>> kazuoniさん
>> シングルトン

そうですね、シングルトンにしてしまった方がすっきりしそうですね。




>> たかぎさん
>> unsigned long longはやりすぎではないでしょうか?

確かにやり過ぎですね(苦笑)


>>細かな点としては、const修飾を徹底すべきなのと、ゼロクリアにはstd::fill_nを使ったほうがよいといったことはあります。

了解です。




>> Justyさん
>> DXライブラリの対応環境には VC6とか BCC5.5も含まれていますんで……。

すっかり忘れておりました(^_^;)
ULONGLONGみたいにWindef.hで定義されてあるものに変更しておけばよさそうですね。

>> 押した瞬間、押されているだけでいいのか、押した瞬間(Press)、押されている(On)があるのなら、離された瞬間(Release)、押されていない(Off)は必要ないでしょうか?

>> Offは Onの否定で判定できるので要らないかもしれませんが、Releaseは様々なケースで必要になるかと思います。

>> あとプライオリティは低いですがリピートとか、デバッグ用途向けにダブルクリック(?)もあると便利ですね。

たしかにReleaseはあった方が良さそうですね。
リピートというと一定間隔でオンオフを繰り返す機能の事でしょうか?
ダブルクリックは判定が面倒そうなので…(苦笑)

>> GetPressNow関数などは引数の範囲チェックを配列の範囲外に対するアクセスになる可能性があるので、せめて DEBUGビルドの時だけでも範囲チェックして、ユーザに対して何らかの警告を促したほうがいいのではないでしょうか。

これは本家のCheckHitKey関数に合わせたんで、ああなってます(^_^;)
リファレンスかコメントを載せていない私が悪いですね…。




>> tkmakwins15さん
>> <limits.h>よりも<climits>のほうがいいと思います、できれば、<limits>のnumeric_limits<>::max()を使った方がいいと思います。

VC++6.0だとなぜかエラーが出て使えないんですよ。MSDNのサンプルをそのまんまコピーしてもエラーが出るので、よく分かりません…ちなみに下記のようなコード(MSDNのコピーです)とエラーです(^_^;)


#include <iostream>
#include <limits>

using namespace std;

void main() {
cout << " 1 The minimum value for char is " <<
(int)numeric_limits<char>::min() << endl;
}



warning C4003: マクロ 'min' に指定された実引数の数が少なすぎます。
error C2589: '(' : スコープ解決演算子 (::) の右側にあるトークンは使えません。
error C2059: 構文エラー : '::'



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

Name: tkmakwins15  ..比類無きプログラマー(98,884ポイント)   Date: 2009/12/08(火) 20:50   No:43658     
Title: Re:【雑談】よくある質問    
>VC++6.0だとなぜかエラーが出て使えないんですよ。

処理系が勝手にminやmaxというマクロを定義してしまっていると思います。
#undef min
#undef max
で一応コンパイルは通ると思います。


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

Name: tkmakwins15  ..比類無きプログラマー(98,962ポイント)   Date: 2009/12/08(火) 21:03   No:43659     
Title: Re:【雑談】よくある質問    
>バグさん

なるほど、windef.hのなかにmax,minの両方が定義されているようです。ヘッダを見る限りは、NOMINMAXマクロで何とかなりそうです。


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

Name: Justy  ..伝説なるハッカー(475,196ポイント)   Date: 2009/12/09(水) 01:22   No:43672     
Title: Re:【雑談】よくある質問    

> ULONGLONGみたいにWindef.hで定義されてあるものに変更

 まぁ、そうですね。
 ただこのクラスのターゲットがターゲットなだけに、ユーザーがこの関数の戻り値を
あまり見慣れないだろう ULONGLONG型で受けなければならないということを考えると
たかぎさんの仰るように int、unsigned int型の方がいいかなと思ったりします。



>  リピートというと一定間隔でオンオフを繰り返す機能の事でしょうか?

 それです、それです。
 メニュー選択とかではあると便利です。


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

Name: Ma  ..上級者(22,505ポイント)   Date: 2009/12/09(水) 10:43   No:43685     
Title: Re:【雑談】よくある質問    
些細なことですが、

return m_uPressCount[nKeyCode] == 1 ? true : false;

より

return (m_uPressCount[nKeyCode] == 1);

のほうがいいのでは?

(処理速度の違いとかは知りません)


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

Name: バグ  ..ハッカー(177,308ポイント)   Date: 2009/12/09(水) 12:13   No:43690     
Title: Re:【雑談】よくある質問    
>> Maさん
式の結果の真偽値とbool型のtrue、falseは同じなのでしょうか?
VC++6.0のbool型はunsigned charの1、0と同等でしたが…
最近、C#での仕事が多いので、こういう書き方になってしまいますね…


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

Name: たかぎ [URL]  ..ハッカー(134,957ポイント)   Date: 2009/12/09(水) 12:15   No:43691     
Title: Re:【雑談】よくある質問    
> 式の結果の真偽値とbool型のtrue、falseは同じなのでしょうか?

C++では、等価演算子や関係演算子の評価結果はbool型ですので、trueやfalseと一緒です。
それはそれとして、個人的には、

return m_uPressCount[nKeyCode] == 1 ? true : false;

で問題ないと思います。


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

Name: bagu  ..ぴよぴよ(334ポイント)   Date: 2009/12/10(木) 08:54   No:43735     
Title: Re:【雑談】よくある質問    
>>tkmakwins15さん
とりあえず、下記のように記述することでマクロとの競合は防ぐことができました。


#include <iostream>
#include <limits>

void main()
{
int int_max = (std::numeric_limits<int>::max)();
int int_min = (std::numeric_limits<int>::min)();
std::cout << "max = " << int_max << std::endl;
std::cout << "min = " << int_min << std::endl;
}




>>たかぎさん
>>C++では、等価演算子や関係演算子の評価結果はbool型ですので、trueやfalseと一緒です。

なるほど、勉強になります。ありがとうございました。


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

Name: バグ  ..ハッカー(177,637ポイント)   Date: 2009/12/10(木) 08:55   No:43736     
Title: Re:【雑談】よくある質問    
すみません、1つ前の投稿は私です。名前を打ち間違えました…(^_^;)

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

Name: バグ  ..ハッカー(177,640ポイント)   Date: 2009/12/10(木) 12:16   No:43741     
Title: Re:【雑談】よくある質問    
色々と意見を頂きましたので、新しく組みなおしてみました。
開発はVC++6.0で行いました。


まずはヘッダを…

#pragma once

#include <vector>
#include <limits>
#include "DxLib.h"

class Keyboard
{
private:
static std::vector<bool> m_vbOnOff;
static std::vector<bool> m_vbRelease;
static std::vector<bool> m_vbRepeatOnOff;
static std::vector<bool> m_vbRepeatEnable;
static std::vector<unsigned int> m_vuRepeatCount;
static std::vector<unsigned int> m_vuRepeatInterval;
static std::vector<unsigned int> m_vuPressCount;

private:
Keyboard(void);
Keyboard(const Keyboard& cKeyboard);

public:
static bool Refresh(void);

static const bool GetOnOFF(int nKeyCode);
static const bool GetPress(int nKeyCode);
static const bool GetRelease(int nKeyCode);
static const unsigned int GetPressCount(int nKeyCode);
static void SetRepeat(int nKeyCode, bool bEnable, unsigned int uInterval = 1);
};





次に実装部を…

#include "Keyboard.h"

// スタティックメンバの初期化
std::vector<bool> Keyboard::m_vbOnOff(256);
std::vector<bool> Keyboard::m_vbRelease(256);
std::vector<bool> Keyboard::m_vbRepeatOnOff(256);
std::vector<bool> Keyboard::m_vbRepeatEnable(256);
std::vector<unsigned int> Keyboard::m_vuRepeatCount(256);
std::vector<unsigned int> Keyboard::m_vuRepeatInterval(256);
std::vector<unsigned int> Keyboard::m_vuPressCount(256);

// コンストラクタ
Keyboard::Keyboard(void)
{
// ベクタクラスの初期化
std::fill_n(m_vbOnOff.begin(), m_vbOnOff.size(), false);
std::fill_n(m_vbRelease.begin(), m_vbRelease.size(), false);
std::fill_n(m_vbRepeatOnOff.begin(), m_vbRepeatOnOff.size(), false);
std::fill_n(m_vbRepeatEnable.begin(), m_vbRepeatEnable.size(), false);
std::fill_n(m_vuRepeatCount.begin(), m_vuRepeatCount.size(), 0);
std::fill_n(m_vuRepeatInterval.begin(), m_vuRepeatInterval.size(), 0);
std::fill_n(m_vuPressCount.begin(), m_vuPressCount.size(), 0);
}

// キーボード情報の更新
bool Keyboard::Refresh(void)
{
// キーボードの押下状態の更新
char chKeybuf[256] = {0, };
if (GetHitKeyStateAll(chKeybuf) != 0)
{
// GetHitKeyStateAll関数が失敗したのでfalseを返す
return false;
}
else
{
for (int i = 0; i < 256; ++i)
{
m_vbOnOff[i] = chKeybuf[i] == 1 ? true : false;
}
}

for (int i = 0; i < 256; ++i)
{
if (m_vbRepeatEnable[i] == true)
{
if (++m_vuRepeatCount[i] > m_vuRepeatInterval[i])
{
m_vuRepeatCount[i] = 0;
m_vbRepeatOnOff[i] = m_vbRepeatOnOff[i] == true ? false : true;
}
m_vbOnOff[i] = m_vbRepeatOnOff[i];
}

if (m_vbOnOff[i] == true)
{
m_vuPressCount[i] += m_vuPressCount[i] < (unsigned int)(std::numeric_limits<int>::max)() ? 1 : 0;
}
else
{
m_vbRelease[i] = m_vuPressCount[i] > 0 ? true : false;
m_vuPressCount[i] = 0;
}
}
return true;
}

// 単純なオン・オフの取得
// int nKeyCode = DXライブラリで設定されてあるキーコード
const bool Keyboard::GetOnOFF(int nKeyCode)
{
return m_vbOnOff[nKeyCode];
}

// 今押されたかどうかの取得
// int nKeyCode = DXライブラリで設定されてあるキーコード
const bool Keyboard::GetPress(int nKeyCode)
{
return m_vuPressCount[nKeyCode] == 1 ? true : false;
}

// 今離されたかどうかの取得
// int nKeyCode = DXライブラリで設定されてあるキーコード
const bool Keyboard::GetRelease(int nKeyCode)
{
return m_vbRelease[nKeyCode];
}

// 押しっ放しのカウント数の取得
// int nKeyCode = DXライブラリで設定されてあるキーコード
const unsigned int Keyboard::GetPressCount(int nKeyCode)
{
return m_vuPressCount[nKeyCode];
}


// リピート機能の設定
// int nKeyCode = DXライブラリで設定されてあるキーコード
// bool bEnable = true : リピートのオン  false : リピートのオフ
// unsigned int uInterval = オン・オフの間隔
void Keyboard::SetRepeat(int nKeyCode, bool bEnable, unsigned int uInterval)
{
m_vbRepeatOnOff[nKeyCode] = true;
m_vbRepeatEnable[nKeyCode] = bEnable;
m_vuRepeatInterval[nKeyCode] = uInterval;
m_vuRepeatCount[nKeyCode] = 0;
}




最後に使用例を…

#include "DxLib.h"
#include "Keyboard.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1)
{
return -1;
}

// エンターキーのオートリピートを有効にする
Keyboard::SetRepeat(KEY_INPUT_RETURN, true, 25);

SetDrawScreen(DX_SCREEN_BACK);
while (ProcessMessage() == 0 && Keyboard::Refresh() == true && ClearDrawScreen() == 0)
{
// エンターキーの情報を表示
DrawFormatString(0, 0, GetColor(0xFF, 0xFF, 0xFF), "OnOff = %d\n", (int)(Keyboard::GetOnOFF(KEY_INPUT_RETURN)));
DrawFormatString(0, 32, GetColor(0xFF, 0xFF, 0xFF), "Press = %d\n", (int)(Keyboard::GetPress(KEY_INPUT_RETURN)));
DrawFormatString(0, 64, GetColor(0xFF, 0xFF, 0xFF), "Release = %d\n", (int)(Keyboard::GetRelease(KEY_INPUT_RETURN)));
DrawFormatString(0, 96, GetColor(0xFF, 0xFF, 0xFF), "Count = %u\n", (int)(Keyboard::GetPressCount(KEY_INPUT_RETURN)));
ScreenFlip();

// Aが押されたら終了させる
if (Keyboard::GetPress(KEY_INPUT_A) == true)
{
break;
}
Sleep(20);
}

DxLib_End();
return 0;
}



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

Name: たかぎ [URL]  ..ハッカー(135,643ポイント)   Date: 2009/12/10(木) 14:37   No:43744     
Title: Re:【雑談】よくある質問    
vectorを使っている理由がよくわかりませんでした。
これなら、bitsetやvalarrayを使ったほうがよいのではないでしょうか?
コンストラクタで呼出しているfill_nも、vectorを使うのであれば冗長なだけです。

欲をいえば、GetHitKeyStateAll関数などはハードコーディングするのではなく、ポリシークラスをテンプレート引数として与える方がよいのではないでしょうか?
それなら、GetKeyboardStateやWM_INPUTなどを使う方法にも簡単に切り替えられます。SDLやWindows以外に移植することさえ簡単です。
さらには、テンプレートですので、ヘッダファイルをインクルードするだけで使えるようになります。

経験の浅い人向けの対策としてはドキュメントさえちゃんと用意すれば問題ない気もしますが、心理的な敷居を避けるには、DXライブラリ用のポリシークラスとtypedef名またはラッパー関数をセットにしたヘッダファイルでも用意すればよいでしょう。


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

Name: バグ  ..ハッカー(178,041ポイント)   Date: 2009/12/10(木) 15:00   No:43747     
Title: Re:【雑談】よくある質問    
たしかにvectorは冗長ですね。配列で充分ですね。
あまりSTLを使用した事がなかったので、なんだか楽しくて調子に乗ってしまいましたm(_ _)m
STLはまだまだ勉強不足です…

>>欲をいえば、GetHitKeyStateAll関数などはハードコーディングするのではなく、ポリシークラスをテンプレート引数として与える方がよいのではないでしょうか?
それなら、GetKeyboardStateやWM_INPUTなどを使う方法にも簡単に切り替えられます。SDLやWindows以外に移植することさえ簡単です。
さらには、テンプレートですので、ヘッダファイルをインクルードするだけで使えるようになります。

>>経験の浅い人向けの対策としてはドキュメントさえちゃんと用意すれば問題ない気もしますが、心理的な敷居を避けるには、DXライブラリ用のポリシークラスとtypedef名またはラッパー関数をセットにしたヘッダファイルでも用意すればよいでしょう。

今回はあくまでも、『DXライブラリを使用した場合のキーボード入力関係』のみに特化して、多少でも分かりやすくなればいいなと考えておりましたので、そこまでは考えておりません(^_^;)


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

Name: Justy  ..伝説なるハッカー(477,168ポイント)   Date: 2009/12/10(木) 21:42   No:43758     
Title: Re:【雑談】よくある質問    
 うーん。
 
■ コンストラクタの存在意義
 これ、どこから実行されるんですか?


■ vector
 このケースで vectorを使うこと自体は良しとして、引っかかるのは
同じ要素数の vectorが7つもあることです。

 纏めれば1つで十分ですよね?


■ 静的メンバ関数だけ
 コンストラクタが意味を成さないものだとすると、残りは静的メンバ関数だけになるので
クラスである意味が薄れます。
 特殊なことを考えていないのであれば、Keyboardという名前空間で十分です。


■ リピート

 えーとですね例えば、一部のキーではメニューを操作するけど、一部のキーは
押しっぱなしになっているかもしれません。
 分かりやすい例だと、メタルギアソリッドシリーズのアイテム・武器選択とか。

 そういう場合など ON/OFFとは独立したリピート情報が必要です。
 
 あと、'O'が trueを返し、Xが falseを返すのだとすると

        1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
ON      O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O
REPEAT  O  X  X  X  X  X  X  O  X  X  X  O  X  X  X  O  X  X  X  O

のように初回の Xの時間と、2回目以降の Xの時間は異なるように設定できると
メニューなどでは操作しやすくなります。

※23:03 勘違いしていたところを修正 


 なんかまぁ面倒そうですし、本来のコンセプトからすると外れたところにあるので
提案しておいて何ですが、ばっさり削ってしまった方がいいのかもしれません。


■ 256
 変わることはまずないとはいえ、同じ意味を持つ直値があちこちに。


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

Name: バグ  ..ハッカー(178,101ポイント)   Date: 2009/12/11(金) 08:27   No:43798     
Title: Re:【雑談】よくある質問    
名前空間でも構わないかもしれませんが、プライベートメンバをユーザーに公開したくない場合はどのように処理すればよいのでしょうか?
ご教授くださいm(_ _)m


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

Name: Justy  ..伝説なるハッカー(478,673ポイント)   Date: 2009/12/11(金) 09:26   No:43804     
Title: Re:【雑談】よくある質問    
 クラスではない場合メンバではなくなりますので、普通に cpp側で

namespace
{
    int key_status[256];
    void internal_update()
    {
    }
}

のように無名名前空間の中に入れたり

static int key_status[256];
static void internal_update()
{
}

と staticを使えばいいかと。


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

Name: バグ  ..ハッカー(178,130ポイント)   Date: 2009/12/11(金) 09:35   No:43805     
Title: Re:【雑談】よくある質問    
それは分かるのですが、その方法ではユーザーに勝手に書き換えられてしまう危険性があるのではないかと思うのですが…?
そうなると、今回のクラスでいうRefresh関数での処理との整合性が取れなくなりますよね?

まぁ、書き換えたユーザーが悪いと言ってしまえばそれまでなのですが…(^_^;)


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

Name: バグ  ..ハッカー(179,828ポイント)   Date: 2009/12/11(金) 11:54   No:43816     
Title: Re:【雑談】よくある質問    
一応、最終バージョンという事で…
リピートを外して、シングルトンに変更して、よりシンプルになりました。


ヘッダ部です。


#pragma once

#include <limits>
#include <algorithm>
#include "DxLib.h"

class Keyboard
{
private:
enum {Buffer_Size = 256};

static Keyboard* m_pcKeyboard;
bool m_bOnOff[Buffer_Size];
bool m_bRelease[Buffer_Size];
unsigned int m_uPressCount[Buffer_Size];

private:
Keyboard(void);
Keyboard(Keyboard* cKeyboard);

public:
static Keyboard* GetInstance(void);
static void DeleteInstance(void);

bool Refresh(void);

bool GetOnOFF(int nKeyCode) const;
bool GetPress(int nKeyCode) const;
bool GetRelease(int nKeyCode) const;
unsigned int GetPressCount(int nKeyCode) const;
};





実装部です。



#include "Keyboard.h"

// スタティックメンバ変数の初期化
Keyboard* Keyboard::m_pcKeyboard = NULL;

// コンストラクタ
Keyboard::Keyboard(void)
{
m_pcKeyboard = NULL;
std::fill_n(&m_bOnOff[0], (int)Buffer_Size, false);
std::fill_n(&m_bRelease[0], (int)Buffer_Size, false);
std::fill_n(&m_uPressCount[0], (int)Buffer_Size, 0);
}

// コピーコンストラクタ
Keyboard::Keyboard(Keyboard* pcKeyboard)
{
m_pcKeyboard = pcKeyboard;
memcpy(&m_bOnOff[0], &pcKeyboard->m_bOnOff[0], Buffer_Size);
memcpy(&m_bRelease[0], &pcKeyboard->m_bRelease[0], Buffer_Size);
memcpy(&m_uPressCount[0], &pcKeyboard->m_uPressCount[0], Buffer_Size);
}

// インスタンスの取得
Keyboard* Keyboard::GetInstance(void)
{
if (m_pcKeyboard == NULL)
{
m_pcKeyboard = new Keyboard();
}

return m_pcKeyboard;
}

// インスタンスの削除
void Keyboard::DeleteInstance(void)
{
if (m_pcKeyboard != NULL)
{
delete m_pcKeyboard;
}

m_pcKeyboard = NULL;
}

// キーボード情報の更新
bool Keyboard::Refresh(void)
{
// キーボードの押下状態の更新
char chKeybuf[Buffer_Size] = {0, };
if (GetHitKeyStateAll(chKeybuf) != 0)
{
// GetHitKeyStateAll関数が失敗したのでfalseを返す
return false;
}

for (int i = 0; i < 256; ++i)
{
// オン・オフの更新
m_bOnOff[i] = chKeybuf[i] == 1 ? true : false;

if (m_bOnOff[i] == true)
{
// 押しっ放し時間の更新
m_uPressCount[i] += m_uPressCount[i] < (unsigned int)(std::numeric_limits<unsigned int>::max)() ? 1 : 0;
}
else
{
// 離した瞬間の判定
m_bRelease[i] = m_uPressCount[i] > 0 ? true : false;
m_uPressCount[i] = 0;
}
}

return true;
}

// オン・オフの取得
// int nKeyCode = DXライブラリで設定されてあるキーコード
bool Keyboard::GetOnOFF(int nKeyCode) const
{
return m_bOnOff[nKeyCode];
}

// 今、押されたかどうかの取得
// int nKeyCode = DXライブラリで設定されてあるキーコード
bool Keyboard::GetPress(int nKeyCode) const
{
return m_uPressCount[nKeyCode] == 1 ? true : false;
}

// 今、離されたかどうかの取得
// int nKeyCode = DXライブラリで設定されてあるキーコード
bool Keyboard::GetRelease(int nKeyCode) const
{
return m_bRelease[nKeyCode];
}

// 押しっ放し状態のカウント数の取得
// int nKeyCode = DXライブラリで設定されてあるキーコード
unsigned int Keyboard::GetPressCount(int nKeyCode) const
{
return m_uPressCount[nKeyCode];
}



使用例です。



#include "DxLib.h"
#include "Keyboard.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// DXライブラリの初期処理
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1)
{
return -1;
}
SetDrawScreen(DX_SCREEN_BACK);

// Keyboardクラスのインスタンスを取得する
Keyboard* pcKeyboard = Keyboard::GetInstance();

// メインループ
while (ProcessMessage() == 0 && pcKeyboard->Refresh() == true && ClearDrawScreen() == 0)
{
// Enterキーの情報を表示
DrawFormatString(0, 0, GetColor(0xFF, 0xFF, 0xFF), "OnOff = %d", (int)(pcKeyboard->GetOnOFF(KEY_INPUT_RETURN)));
DrawFormatString(0, 32, GetColor(0xFF, 0xFF, 0xFF), "Press = %d", (int)(pcKeyboard->GetPress(KEY_INPUT_RETURN)));
DrawFormatString(0, 64, GetColor(0xFF, 0xFF, 0xFF), "Release = %d", (int)(pcKeyboard->GetRelease(KEY_INPUT_RETURN)));
DrawFormatString(0, 96, GetColor(0xFF, 0xFF, 0xFF), "Count = %u", (int)(pcKeyboard->GetPressCount(KEY_INPUT_RETURN)));
ScreenFlip();

// Aが押されたらループを抜ける
if (pcKeyboard->GetPress(KEY_INPUT_A) == true)
{
break;
}

Sleep(20);
}

// Keyboardクラスのインスタンスを削除する
pcKeyboard->DeleteInstance();

// DXライブラリを終了させる
DxLib_End();
return 0;
}


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

Name: バグ  ..ハッカー(179,980ポイント)   Date: 2009/12/11(金) 12:03   No:43817     
Title: Re:【雑談】よくある質問    
すみません、コピーコンストラクタがおかしいですね…。


// コピーコンストラクタ
Keyboard::Keyboard(Keyboard* pcKeyboard)
{
m_pcKeyboard = new Keyboard();
memcpy(&m_pcKeyboard->m_bOnOff[0], &pcKeyboard->m_bOnOff[0], Buffer_Size);
memcpy(&m_pcKeyboard->m_bRelease[0], &pcKeyboard->m_bRelease[0], Buffer_Size);
memcpy(&m_pcKeyboard->m_uPressCount[0], &pcKeyboard->m_uPressCount[0], Buffer_Size);
}



こう書くべきでした。
まぁ、実際には使われる事は無いコンストラクタではありますが…


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

Name: Justy  ..伝説なるハッカー(478,848ポイント)   Date: 2009/12/12(土) 01:43   No:43884     
Title: Re:【雑談】よくある質問    

> その方法ではユーザーに勝手に書き換えられてしまう危険性があるのではないかと思うのですが

 書き換えられる、というのは Keyboard.h/cppの外から、ということですか?
それとも、Keyboard.hや Keyboard.cppを直接書き換える人がいる、ということですか?


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



Name: layman  ..ぴよぴよ(142ポイント)   Date: 2009/12/11(金) 10:19   No:43807       
Title: 分割ファイル    
分割コンパイルについて
環境はVC++2008です。
ソースファイルを分割して、メインファイルと関数ファイルに分けました。
プロジェクトの新しい項目から関数のcppファイル作り、ヘッダー部分に
関数の定義を書き、ソリューションのビルトを行いました。うまくいきません(関数を認識してくれません)。
何か、VC++ではcppのファイルをリンクさせるために特別な操作がいるのでしょうか?
基本的なことですいませんがよろしくお願いします。


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


Name: s-rush  ..熟練のプログラマー(57,512ポイント)   Date: 2009/12/11(金) 10:55   No:43810     
Title: Re:分割ファイル    
ソースが分からないので現地点で的確なことは言えませんが、
mainファイルで関数を定義したヘッダをインクルードしていますか?
また、ご自身で作られたヘッダファイルはどのようになっていますか?
ヘッダーは関数の宣言だけで、関数の実態を書かれている場合、
エラーが出るはずです。

VC++の場合、分割ファイルであってもビルドすれば自動的にリンクされたはずです。

もしよろしければ、ソース(プロジェクト)をアップしていただければ、
よりよい回答を得れると思いますよ^^

12/10 11:00頃修正


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

Name: layman  ..ぴよぴよ(336ポイント)   Date: 2009/12/11(金) 11:32   No:43813     
Title: Re:分割ファイル    
ソースファイルを確かめてみました。
プロジェクトは長いのでupはこれで分からなければにします。

エラー内容は次のような感じです。
error LNK20 "int bonus_sound" (?bonus_sound@@3HA) は既に Game.obj で定義されています。
error LNK2005: "int min1" (?min1@@3HA) は既に Game.obj で定義されています。
error LNK2005: "int bonusgame_logo" (?bonusgame_logo@@3HA) は既に Game.obj で定義されています。


error LNK2005ばかりです。グローバル変数をメインファイルと関数ファイルから
読んでいるのでエラーがでるのかぁ?と推測していますが分かりせん。よろしくお願いします。



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

Name: s-rush  ..熟練のプログラマー(57,799ポイント)   Date: 2009/12/11(金) 12:09   No:43819     
Title: Re:分割ファイル    
同じ名前のグローバル変数が複数回定義されていますね。

たとえば、

---------------------------------------
main.cpp
#include "header.h"

int main(){

}

--------------------------------------
func.cpp
#include "header.h"
int func(){
   略
}
--------------------------------------
header.h
int bonus_sound;
int min1;



このような感じになっているのであれば、
main.cppとfunc.cppでbonus_soundやmin1がそれぞれ定義されていることになります。
つまり、同じ名前の変数が複数存在することになり、エラーが出てしまっています。

externというものを使えばエラーがとれると思います。
聞き覚えがないのであれば、一度ググッて見てください。
たくさん引っかかると思います。

また、龍神録プログラミングの第3章、5章も参考になるかと思います^^


お門違いな回答だったら申し訳ないです><;;


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

Name: layman  ..ぴよぴよ(393ポイント)   Date: 2009/12/11(金) 12:38   No:43822     
Title: Re:分割ファイル    
そうです。そうなってます。
グローバル変数にexternを全部つけてダメだったので
できないと思っていました。
上の場合、どのようにすれば解決できますか?
ご迷惑をかけますが、よろしくお願いします。


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

Name: softya [URL]  ..熟練のプログラマー(63,473ポイント)   Date: 2009/12/12(土) 00:19   No:43868     
Title: Re:分割ファイル    
ソース分割して、グローバル変数を持つ場合は、

1.externを付けない実体をソース(cpp)側に用意します。実体はプログラム全体で名前毎に1個だけ存在が許されます。
※ ヘッダに実体を持つ書き方をしてしまうと、インクルードしている全てのソース側に実体が出来てしまうので今回の多重定義エラーとなります。

2.externを付けた参照だけの定義をヘッダ側に書きます。

を守ってください。

s-rushさんのコードを直すと。
---------------------------------------

main.cpp

#include "header.h"

int bonus_sound;

int min1 = 0;

int main(){



}



--------------------------------------

func.cpp

#include "header.h"

int func(){

   略

}

--------------------------------------

header.h

extern int bonus_sound;

extern int min1;



---------------------------------------
となります。


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



Name: dic  ..熟練のプログラマー(40,626ポイント)   Date: 2009/12/11(金) 19:12   No:43850       
Title: バックスラッシュを入力したい    
質問があるのですが色々根がふかそうなんでテンプレ使います

[1] 質問文
 [1.1] 自分が今行いたい事は何か
    printf( "hello" ); とstdio(DOS画面)に出力した文字をバックスラッシュを使って消したい
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
    printf( "\b" ); で出力した文字を消そうとした
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
    バックスラッシュ記号が入力できない
 [1.4] 今何がわからないのか、知りたいのか
    バックスラッシュを106日本語入力キーボードで入力する方法

[2] 環境  
 [2.1] OS : WindowsXP
 [2.2] コンパイラ名 : VC++ 6.0
[3] その他
 ・どの程度C言語を理解しているか
文字コードに関しては理解しています


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


Name: Mist  ..比類無きプログラマー(76,826ポイント)   Date: 2009/12/11(金) 19:32   No:43851     
Title: Re:バックスラッシュを入力したい    
文字消したいというところから推察してバックスラッシュじゃなくてバックスペースの間違いですか?
バックスラッシュに文字を消す機能があるなんて初耳ですけど。

一応、バックスペースは
putchar(0x08);
だったかな。


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

Name: Mist  ..比類無きプログラマー(76,896ポイント)   Date: 2009/12/11(金) 19:35   No:43852     
Title: Re:バックスラッシュを入力したい    
一応、バックスラッシュ
http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5

\記号はバックスラッシュです。


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

Name: Mist  ..比類無きプログラマー(77,023ポイント)   Date: 2009/12/11(金) 19:45   No:43854     
Title: Re:バックスラッシュを入力したい    
バックスペースということで話をすると、バックスペースは出力位置をひとつ戻すという機能しかなく、キーボードのバックスペースキーを押したときのように文字は消えません。
以下のプログラムは最後の一文字消す(消えたように見える)ソースです。
期待されているものとは違うかもしれませんけど。

#include <stdio.h>
int main(void)
{
printf("hello");
printf("\b");
printf(" ");

return 0;
}


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

Name: dic  ..熟練のプログラマー(40,825ポイント)   Date: 2009/12/11(金) 19:47   No:43855 解決!     
Title: Re:バックスラッシュを入力したい    
>Mist さん
バックスラッシュではないですね、バックスペースでした

putchar(0x08);
で解決しました

ありがとうございました


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

Name: dic  ..熟練のプログラマー(40,873ポイント)   Date: 2009/12/11(金) 19:49   No:43856 解決!     
Title: Re:バックスラッシュを入力したい    
>Mist さん
「出力位置をずらす」

という機能になるのですね

詳しい解説をありがとうございます


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



Name: まい  ..ぴよぴよ(56ポイント)   Date: 2009/12/11(金) 11:40   No:43815       
Title: SEの止め方    
龍神録(50章)より、
効果音(SE)が鳴るところで、
最後まで聞かないで途中にとめる方法を知りたいのですが
どうしたらいいのでしょうか?


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


Name: Dixq (管理人)  ..ウィザード(1,100,510ポイント)   Date: 2009/12/11(金) 12:08   No:43818     
Title: Re:SEの止め方    
StopSoundMemではダメですか?

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

Name: kazuoni [URL]  ..ハッカー(118,275ポイント)   Date: 2009/12/11(金) 12:09   No:43820     
Title: Re:SEの止め方    
StopSoundFileなり、StopSoundMemなりで止めることができます。

詳細は本家にて。
ttp://homepage2.nifty.com/natupaji/DxLib/index.html


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

Name: まい  ..ぴよぴよ(90ポイント)   Date: 2009/12/11(金) 13:15   No:43823 解決!     
Title: Re:SEの止め方    
ありがとうございます。
アドバイスのおかげで解決できました。


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



Name: tk  ..ぴよぴよ(847ポイント)   Date: 2009/12/09(水) 13:08   No:43692       
Title: C# 加算演算子    
C++ で書かれていたソースを C# に移植(そのままソースをコピーしただけ)したのですが
以下に書くソースでエラーがでました。(例として書きます)

***************************
ushort a;
ushort b;
ushort c;

a = 1;
b = 2;

c = a + b;
***************************

の「c = a + b;」のところで、
「型 'int' を 'ushort' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください)」
というエラーが出ました。

C++ の時はエラーがでいなかったのですが、C# でコンパイルするとエラーがでてします。
(もちろんキャストしてやるとエラーは消えますが)

ちょっと調べてみたのですが、C# にある加算演算子が、
・int operator +(int x, int y)
・long operator +(long x, long y)
・uint operator +(uint x, uint y)
・ulong operator +(ulong x, ulong y)
しかないことが分かりました。
(簡単に調べただけなので間違ってるかもしれません)


そこで質問です。

質問1
16bit(8bitも?)同士の演算では、絶対「int operator +(int x, int y)」が使われる?

質問2
c++ の時はなぜエラーがでないのか。

質問3
なぜ C# の加算演算子は上記の4つしかないのか。
(.NET Frameworkのアーキテクチャ的な問題?)


以上が質問です。
漠然とし質問で申し訳ないですが、
分かる方がいましたら、是非回答のほうお願い致します。


環境
Window XP
VS2008
.NET Framework 3.5


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


Name: バグ  ..ハッカー(177,510ポイント)   Date: 2009/12/09(水) 14:24   No:43696     
Title: Re:C# 加算演算子    
>>質問1
>> 16bit(8bitも?)同士の演算では、絶対「int operator +(int x, int y)」が使われる?

そうです。


>> 質問2
>> c++ の時はなぜエラーがでないのか。

暗黙的型変換が行われるからでしょう。
ちなみにVB.NETでもエラーはおきません(^_^;)


>>質問3
>>なぜ C# の加算演算子は上記の4つしかないのか。
>>(.NET Frameworkのアーキテクチャ的な問題?)

仕様だからでしょうね…。


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

Name: バグ  ..ハッカー(177,630ポイント)   Date: 2009/12/09(水) 14:28   No:43697     
Title: Re:C# 加算演算子    
追記です。
前記の現象を解決するには


ushort a;
ushort b;
ushort c;

a = 1;
b = 2;
c = (ushort)((int)a + (int)b);



こうするか…もしくは

ushort a = 1;
ushort b = 2;
ushort c = (ushort)(a + b);



こうするしかないようです。


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

Name: softya [URL]  ..熟練のプログラマー(62,246ポイント)   Date: 2009/12/09(水) 15:31   No:43702     
Title: Re:C# 加算演算子    
私も気になったので調べてみました。

>質問1 16bit(8bitも?)同士の演算では、絶対「int operator +(int x, int y)」が使われる?
どうやら、その様です。

>質問2 c++ の時はなぜエラーがでないのか。
C++/CLIやVB.NETは暗黙的にキャストしてくれるみたいです。
MSILコードを見るとソースコードに書いていなくても自動挿入されているとのこと。

>質問3 なぜ C# の加算演算子は上記の4つしかないのか。
MSILレベルで4つしか実装されていないためと思われます。
なぜ4つだけなのかはかなり疑問ですね。基本的にこの4つを優先して使ってくれという意味なのか?
ちなみに++演算子は、ちゃんとushortが用意されている様です。


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

Name: tk  ..ぴよぴよ(946ポイント)   Date: 2009/12/09(水) 16:28   No:43709     
Title: Re:C# 加算演算子    
>バグさん
>softyaさん

回答ありがとうございます。
なるほどVB.NETでもエラーは出ないんですね〜。
自分は、まだVBさわったことなくて(汗



> C++/CLIやVB.NETは暗黙的にキャストしてくれるみたいです。
> MSILコードを見るとソースコードに書いていなくても自動挿入されているとのこと。

コンパイラが自動的にキャストしてくれるんですね。



C#だと、なぜエラーで出すんでしょう。
明示的にオーバーヘッドしてる箇所を知らせるためとかだったり・・・?


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

Name: YuO  ..熟練のプログラマー(41,019ポイント)   Date: 2009/12/09(水) 17:24   No:43713     
Title: Re:C# 加算演算子    
CやC++でもunsigned short同士の加算演算子がないのは同じです。
ref) ISO/IEC 9899:1999 6.3.1.1 Boolean, characters, and integers
ref) ISO/IEC 14882:2003 4.5 Integral promotions
Integer Promotionが発生するため,C/C++でもint/unsinged int型同士の加算として扱われます。

ちなみに,VS2008付属のC#仕様書にも,変換が行われると書いてあります。
さらに,こちらはどの演算子で行われるかまで,書かれています。
これによると,ushort + ushortは上位変換によってint + intとみなされます。
この結果はint型になります。
ref) C# 言語仕様 Version 3.0 7.2.6.2 二項数値上位変換


で,CやC++では,代入先の型が代入元の型より表現可能な値の範囲が小さい場合,自動的に変換が発生します。
ref) ISO/IEC 9899:1999 6.3.1.3 Signed and unsigned integers
ref) ISO/IEC 14882:2003 4.7 Integral conversions
このため,C/C++ではunsigned short同士の加算の結果をunsigned shortに代入する事ができます。

それに対して,C#において表現可能な範囲が縮小されるような変換は明示的に行う必要があります。
ref) C# 言語仕様 Version 3.0 6.1.2 暗黙の数値変換
ref) C# 言語仕様 Version 3.0 6.2.1 明示的な数値変換の一覧表
このため,ushort + ushortはintなので,ushortへは明示的な変換が必要になります。
さらに,checkedコンテキスト中では例外が発生する可能性があるため,
確実にC/C++と同等の効果が欲しい場合,unchekced演算子を使う必要があります。


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

Name: YuO  ..熟練のプログラマー(41,065ポイント)   Date: 2009/12/09(水) 17:35   No:43714     
Title: Re:C# 加算演算子    
ちなみに,ジェネリックとテンプレートでテストしてみました (すべてVS2008)。
・C++
int
・C++/CLI
System.Int32
・C#
System.Int32
・Visual Basic
System.UInt16 (Strict On/Strict Offともに)


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

Name: たいちう  ..プログラマー(38,184ポイント)   Date: 2009/12/10(木) 09:17   No:43737     
Title: Re:C# 加算演算子    
ご教示お願いします。

C/C++について、YuOさんは、
unsigned short同士の加算演算子がないので、unsigned int型の演算になる。
と書いてますよね?ちょっと実験してみました。

# VC++ .NET 2003
# 警告レベルは4(MAX)

{

unsigned short x = 2;
unsigned short y = 3;
unsigned short z = x + y; // 警告なし
cout << z << endl;
}

{
unsigned short x = 2;
int y = 3;
unsigned short z = x + y; // warning C4244: '初期化中' :
// 'unsigned int' から 'unsigned short' に変換しました。
// データが失われているかもしれません
cout << z << endl;
}

警告レベル4では、「'unsigned int' から 'unsigned short' に変換」する場合に警告が出ますので、
前半が警告なしということは、unsigned short同士の加算の結果がunsigned intに
ならなかった事を現しているのではないでしょうか?

つまり、VC2003の仕様とISO/IEC 14882:2003が異なる、と理解してよいでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(135,237ポイント)   Date: 2009/12/10(木) 10:50   No:43739     
Title: Re:C# 加算演算子    
> C/C++について、YuOさんは、
> unsigned short同士の加算演算子がないので、unsigned int型の演算になる。
> と書いてますよね?

そうとは書かれていませんし、実際そうではありません。

C/C++の加算演算子の場合、両辺のオペランドに対して「通常の算術型変換」が行われます。
オペランドが汎整数型の場合、通常の算術型変換の第1ステップは汎整数拡張(整数拡張、汎整数昇格)です。
汎整数拡張では、unsigned short型は、int型でunsigned short型の全表現範囲を網羅できるのであればint型に、そうでなければunsigned int型に変換されることになります。
具体的には、sizeof(short) < sizeof(int) の環境であればunsigned short → intに、sizeof(short) == sizeof(int)の環境であればunsigned short → unsigned intに変換されます。


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

Name: たいちう  ..プログラマー(38,224ポイント)   Date: 2009/12/10(木) 11:30   No:43740     
Title: Re:C# 加算演算子    
たかぎさん

> そうとは書かれていませんし、実際そうではありません。

ご指摘ありがとうございます。
「unsigned short同士の加算演算子がないので、int型かunsigned int型の演算になる。 」
ということですね。私が勝手に解釈してしまいました。


それと別の修正があります。yの型と警告の型が一致していませんでした。コピペミスです。

{

unsigned short x = 2;
unsigned int y = 3;
unsigned short z = x + y; // warning C4244: '初期化中' :
// 'unsigned int' から 'unsigned short' に変換しました。
// データが失われているかもしれません
cout << z << endl;
}


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

Name: tk  ..かけだし(1,033ポイント)   Date: 2009/12/11(金) 12:35   No:43821 解決!     
Title: Re:C# 加算演算子    
> YuOさん

> さらに,checkedコンテキスト中では例外が発生する可能性があるため,
> 確実にC/C++と同等の効果が欲しい場合,unchekced演算子を使う必要があります。

今回は特にオーバーフローとか気にしなくていいのでcheckedは使わない予定です。
checkedを使う際は気をつけます。



これでこの質問は解決とさせていただきます。
回答者の皆様ありがとうございました。


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



Name: matsutake  ..かけだし(1,426ポイント)   Date: 2009/12/11(金) 11:37   No:43814       
Title: octave-3.2.3のコンパイルエラー    
作成したプログラムから、octaveのライブラリを使用したいと考えているので、
debian lennyにoctaveをインストールする際、ソースからコンパイルしようとしています。
しかし、以下のようなエラーが決まって発生してmakeコンパイルができません。(hogehoge/octave-3.2.3ディレクトリで)
いったいどうしたらいいのでしょうか?
宜しくお願いします。


making defaults.h from defaults.h.in
defaults.h is unchanged
making oct-conf.h from oct-conf.h.in
oct-conf.h is unchanged
g++ -I. -I.. -I../liboctave -I../src -I../libcruft/misc -DHAVE_CONFIG_H -mieee-fp -I/usr/include/freetype2 -Wall -W -Wshadow -Wold-style-cast -Wformat -g -O2 -rdynamic \
-L.. -fPIC -o octave \
main.o \
-L../liboctave -L../libcruft -L../src -Wl,-rpath -Wl,/usr/local/lib/octave-3.2.3 \
-loctinterp -loctave -lcruft \
-lumfpack -lamd -lcamd -lcolamd \
-lcholmod -lccolamd -lcxsparse -llapack -lblas \
-lfftw3 -lfftw3f -larpack -lftgl -lfreetype -lz -L/usr/X11R6/lib -lGL -lGLU \
-lX11 -lreadline -lncurses -ldl -lz -lm
make[2]: ディレクトリ `/home/matsutake3/octave-3.2.3/src' から出ます
make[1]: ディレクトリ `/home/matsutake3/octave-3.2.3' から出ます

../libcruft/libcruft.so: undefined reference to `r_imag'
../libcruft/libcruft.so: undefined reference to `c_exp'
../libcruft/libcruft.so: undefined reference to `i_len'
../libcruft/libcruft.so: undefined reference to `d_int'
../libcruft/libcruft.so: undefined reference to `c_sqrt'
../libcruft/libcruft.so: undefined reference to `e_wsfi'
../libcruft/libcruft.so: undefined reference to `d_sign'
../libcruft/libcruft.so: undefined reference to `s_wsle'
../libcruft/libcruft.so: undefined reference to `r_mod'
../libcruft/libcruft.so: undefined reference to `c_div'
../libcruft/libcruft.so: undefined reference to `r_cnjg'
../libcruft/libcruft.so: undefined reference to `s_copy'
../libcruft/libcruft.so: undefined reference to `s_cmp'
../src/liboctinterp.so: undefined reference to `s_wsfe'
../libcruft/libcruft.so: undefined reference to `do_lio'
../libcruft/libcruft.so: undefined reference to `c_log'
../libcruft/libcruft.so: undefined reference to `r_int'
../libcruft/libcruft.so: undefined reference to `pow_dd'
../libcruft/libcruft.so: undefined reference to `i_indx'
../libcruft/libcruft.so: undefined reference to `s_wsfi'
../libcruft/libcruft.so: undefined reference to `z_abs'
../libcruft/libcruft.so: undefined reference to `s_stop'
../libcruft/libcruft.so: undefined reference to `r_sign'
../libcruft/libcruft.so: undefined reference to `pow_di'
../libcruft/libcruft.so: undefined reference to `d_lg10'
../libcruft/libcruft.so: undefined reference to `pow_ri'
../libcruft/libcruft.so: undefined reference to `e_wsle'
../libcruft/libcruft.so: undefined reference to `s_cat'
../src/liboctinterp.so: undefined reference to `do_fio'
../src/liboctinterp.so: undefined reference to `e_wsfe'
../libcruft/libcruft.so: undefined reference to `c_abs'
../libcruft/libcruft.so: undefined reference to `d_mod'
collect2: ld returned 1 exit status
make[2]: *** [octave] エラー 1
make[1]: *** [src] エラー 2
make: *** [all] エラー 2



また./configure時に以下の警告がでていますが、(エラーはありません)これも関係あるのでしょうか?

configure: WARNING: cannot determine how to obtain linking information from f77
configure: WARNING: qrupdate not found. The QR & Cholesky updating functions will be slow.
configure: WARNING: qrupdate not found. The QR & Cholesky updating functions will be slow.


ちなみに、octave-3.2.3/libcruft/にはlibcruft.soは存在しています。


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




Name: Libra  ..中級者(12,446ポイント)   Date: 2009/12/07(月) 01:46   No:43558       
Title: フルスクリーン時デバイスロストの処理    
DirectXで画像を出すプログラムを作成しています。
フルスクリーンでウィンドウを出した際、
背景色が表示されず、そこから、ウィンドウモードへ移項した場合、
ゴミのようなものが表示されてしまいます。

フルスクリーン時に、背景色を表示させるにはどうしたらよいでしょうか?
WNDCLASSによるウィンドウの生成の設定が悪いのか、
D3DPRESENT_PARAMETERSの設定が悪いのか、
原因のあたりが付かない状態です。



・フルスクリーンとウィンドウの切り替え
F9キーを押すことで、モードの切り替えを行えます。
ウィンドウモード時はで最大化ボタンを押すことでも切り替わります。
起動の際、フルスクリーンで行うと、おかしな挙動をしたため、ウィンドウモードで
ウィンドウを作成してから、すぐフルスクリーンに切り替えるということをやっています。

参考にしたWebサイト:ウィンドウとフルスクリーンの切り替え
http://www36.atwiki.jp/directx/pages/15.html


開発環境:VisualStudio2008
言語:C++、C
DirectX:9


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


Name: 御津凪 [URL]  ..ハッカー(127,638ポイント)   Date: 2009/12/07(月) 10:05   No:43567     
Title: Re:フルスクリーン時の背景色表示    
中身は見ていませんが、フルスクリーンとウィンドウの切り替えを行うと、(DirectX9 までは)デバイスロストが発生します。
このため、それまでに読み込んだテクスチャ・リソース類は全て(D3DPOOL_DEFAULT で生成されたものが)無効になります。
ですので、それらのテクスチャはスクリーンの切り替えを行った後、(Release で解放してから)再度作り直す必要があります。


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

Name: Libra  ..中級者(12,716ポイント)   Date: 2009/12/07(月) 11:09   No:43570     
Title: Re:フルスクリーン時の背景色表示    
書籍にて、D3DPOOL_MANAGEDで生成されたものは、
「オブジェクトのメモリに関する部分を全てDirect3D側に
任せてしまうというフラグ」
とあったので、デバイスロストのみの処理を行っています。
書籍名:マスタリングDirectXプログラミング

自分のソースでは、GraphicManager.cpp:Clear_DrawScreenメソッドと、
Screen_Flipメソッドの2か所にデバイスロストの処理を入れています。
(2箇所なのは、まだ試験的なものです)

デバイスロスト時の処理

int GraphicManager::Screen_Flip( void )
{
HRESULT hr ;

lpD3DDev->EndScene( ) ;
hr = lpD3DDev->Present( NULL , NULL , NULL , NULL ) ;

if( FAILED( hr ) )
{
while( FAILED( hr = lpD3DDev->TestCooperativeLevel( ) ) )
{
switch( hr ){
case D3DERR_DEVICELOST:
Sleep( 100 ) ;
break;
case D3DERR_DEVICENOTRESET:
lpD3DDev->Reset( &d3dpp ) ;
break;
default:
break;
}
}
}

if( hr == S_OK )
{
return SUCCEED ;
}
else{
return FAILURE ;
}

}



一応ソースを最新版をアップしておきます。
(画像表示メソッド追加版)
画像位置を動かした状態で、フルスクリーンを行うと、
表示した画像が消えずに残っている様です・・・。


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

Name: 御津凪 [URL]  ..ハッカー(128,178ポイント)   Date: 2009/12/07(月) 11:44   No:43572     
Title: Re:フルスクリーン時の背景色表示    
とりあえず、切り替え後に Reset が正しく呼びだされていることも確認して、かつ成功しているかチェックしておいてください。

表示が切り替える前の状態のまま固まっていたり、あるいはごみのようなものが出ているということは正しくリセットされていないことを示しています。

異常が発生している時、メインループは正常に回っているかどうかも確認してください。

こちらでは動作チェックはできない環境にいるいるため、正確な答えではないかもしれません。


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

Name: Libra  ..中級者(12,887ポイント)   Date: 2009/12/07(月) 23:47   No:43603     
Title: Re:フルスクリーン時の背景色表示    
フルスクリーン切り替え時、Clearメソッドが失敗しているようです。


HRESULT hr ;

hr = lpD3DDev->Clear( 0, NULL , ( D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER ) , D3DCOLOR_XRGB( bg_color.r , bg_color.g , bg_color.b ) , 1.0f , 0 ) ;
if( hr != S_OK )
{
goto JUMP;
}
if( FAILED( lpD3DDev->BeginScene( ) ) )
{
return FAILURE ;
}

if( FAILED( hr ) )
{
JUMP://Clearメソッド失敗したとき飛ぶよ
while( FAILED( hr = lpD3DDev->TestCooperativeLevel( ) ) )
{
switch( hr ){
case D3DERR_DEVICELOST:
Sleep( 100 ) ;
break;
case D3DERR_DEVICENOTRESET:
hr = lpD3DDev->Reset( &d3dpp ) ;
break;
default:
hr = hr ;
break;
}
}
}


このようにgoto文で処理を飛ばしてみたのですが、
ループ内に処理が移行していかないようです。
画面には背景色、画像は表示されず、マウスポインタだけが表示されました。

次に、Clearが失敗したら、Resetの前まで飛ばすようにしてみたのですが、
画面には同じく背景色、画像は表示されず、マウスポインタだけが表示されました。




タイトルを「フルスクリーン時デバイスロストの処理」に変更しました。


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

Name: 御津凪 [URL]  ..ハッカー(129,314ポイント)   Date: 2009/12/08(火) 01:18   No:43606     
Title: Re:フルスクリーン時デバイスロストの処理    
動作チェックしてみました。

まず、
    // Z バッファの自動作成

d3dpp.EnableAutoDepthStencil = 1;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16 ;

これを起動時の初期化で行っているようですが、リセット時にはこの処理を行っていません。
つまり、ウインドウモードとフルスクリーンモードで設定を分けている各 D3DPRESENT_PARAMETERS 構造体の、
    d3dppWnd.EnableAutoDepthStencil = FALSE ;

d3dppWnd.AutoDepthStencilFormat = D3DFMT_A1R5G5B5 ;

がそのまま使用されることになり、深度バッファのないバックバッファが作成される状態となります。

Clear 関数が失敗しているのは、その存在しない深度バッファをクリアしようとしている(D3DCLEAR_ZBUFFER フラグが指定されている)ためです。

また、深度ステンシルバッファのフォーマットは、下記の形式しか使えません。
D3DFMT_D24S8

D3DFMT_D24X8
D3DFMT_D16
D3DFMT_D32F_LOCKABLE

ので、 D3DFMT_A1R5G5B5 をセットしておくのは不適切です。

因みに、DirectX などの HRESULT を返す関数で、その値に応じた名前と説明を返してくれる便利な関数が <dxerr.h> にあります。
DXTRACE_ERR マクロを使うとデバッグ出力に出してくれるので便利です。
例えば、
DXTRACE_ERR("[自由なメッセージ]", hr);


とすると、( hr が D3DERR_DEVICELOST の場合だと)
ファイルパス(行): [自由なメッセージ] hr=D3DERR_DEVICELOST (0x88760868)


のようにデバッグ出力に出してくれます。


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

Name: Libra  ..中級者(13,644ポイント)   Date: 2009/12/08(火) 18:23   No:43653     
Title: Re:フルスクリーン時デバイスロストの処理    
回答ありがとうございます。

"とりあえず"動くソースが出来ました。(処理は後でまとめます)

わからなかった部分は、TestCooperativeLevelメソッドが
失敗しない点です。
書籍のサンプルソースには記述されていますが、
機能しないなら、抜いてもいいのではないかと思っています。



HRESULT hr ;

hr = lpD3DDev->Clear( 0, NULL , ( D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER ) , D3DCOLOR_XRGB( bg_color.r , bg_color.g , bg_color.b ) , 1.0f , 0 ) ;
if( hr != S_OK )
{
DXTRACE_ERR( "[Clearメソッドを失敗]" , hr ) ;
goto JUMP;
}
if( FAILED( lpD3DDev->BeginScene( ) ) )
{
return FAILURE ;

}

if( FAILED( hr ) )
{
while( FAILED( hr = lpD3DDev->TestCooperativeLevel( ) ) )
{
DXTRACE_ERR( "[TestCooperativeLevelメソッドがFAILED]" , hr ) ;

switch( hr ){
case D3DERR_DEVICELOST:
Sleep( 100 ) ;
break;
case D3DERR_DEVICENOTRESET:
JUMP://Clearで飛ぶよ
DXTRACE_ERR( "[自由なメッセージだわ]" , hr ) ;
hr = lpD3DDev->Reset( &d3dpp ) ;
d3dpp.EnableAutoDepthStencil = TRUE ;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8 ;
break;
default:
hr = hr ;
break;
}
}
DXTRACE_ERR( "[自由なメッセージなの]" , hr ) ;
hr = lpD3DDev->Clear( 0, NULL , ( D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER ) , D3DCOLOR_XRGB( bg_color.r , bg_color.g , bg_color.b ) , 1.0f , 0 ) ;
if( hr != S_OK )
{
DXTRACE_ERR( "[Clearメソッドを失敗だッ]" , hr ) ;
goto JUMP;//Reset処理へ移動
}
if( FAILED( lpD3DDev->BeginScene( ) ) )
{
return FAILURE ;

}
}
DXTRACE_ERR( "[自由なメッセージかしら], hr ) ;





>>深度ステンシルバッファのフォーマットは、下記の形式しか使えません。

参考書やサンプルソースの例を元に作っているため、
自分の仕様に合わせたくても、パラメーターの説明を読んでも
わからない部分が多いので、なかなか上手くいきません・・・。
基本これにしておけば大丈夫!というパラメーターも、
自分の仕様にすると合わないのですね orz;


>>DXTRACE_ERR マクロを使うとデバッグ出力に出してくれるので便利です。

これは非常に役立ちました。
<dxerr.h>はWindows.hで定義されているものがあるので、
Windows.hより後に記述しないと使えないというのと、
#pragma comment(lib, "dxerr.lib")を付けないと使えないという2点を
知らなかったため、サンプルソースで記述されていても抜いて使っていました。
フルスクリーンでデバックするときは、ブレークポイントを用いて
値を確認することが出来なかったため、困っていました。


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

Name: 御津凪 [URL]  ..ハッカー(130,532ポイント)   Date: 2009/12/08(火) 19:10   No:43655     
Title: Re:フルスクリーン時デバイスロストの処理    
> わからなかった部分は、TestCooperativeLevelメソッドが
> 失敗しない点です。
> 書籍のサンプルソースには記述されていますが、
> 機能しないなら、抜いてもいいのではないかと思っています。

TestCooperativeLevel メソッドが行っているのは、平たく言えばデバイスが消失(ロスト)しているか、
あるいはその状態から復帰可能かどうかをチェックするものです。

Clear メソッドが前のコードで失敗しているのは D3DERR_INVALIDCALL 、
つまり「関数の呼び出しが無効である」というだけで、デバイスが消失しているわけではありません。

ではなぜ Clear メソッドが D3DERR_INVALIDCALL を返すのかというと、
深度バッファが作成されずに Reset 関数を呼び出したために深度バッファが無くなり、
Clear メソッドで指定している D3DCLEAR_ZBUFFER フラグにより、 Clear メソッドが深度バッファをクリアしようとしても
深度バッファが存在しないため、エラーとなって D3DERR_INVALIDCALL を返した、というわけです。


あと、それとは別ですが、

#pragma comment(lib, "dxerr.lib")

というマクロは環境依存であることを忘れないでください。
できれば VC++ のプロジェクト設定のリンカオプションで指定することをお勧めします。
(VC++ でのみ扱うコードならばそのまま使用しても支障はありません)

そして、 DXTRACE_ERR を付け忘れたところでエラーが出た場合でも、
エラー値さえ分かればエラーの種別を容易に判別する方法があります。
DirectX SDK には DirectX Error Lookup というエラー値からエラー名と説明を知ることができる
ユーティリティツールが付属しています。
(スタートメニュー内にあります)

ただし、説明文は英語ですけどね。


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

Name: Libra  ..中級者(14,014ポイント)   Date: 2009/12/10(木) 01:32   No:43730 解決!     
Title: Re:フルスクリーン時デバイスロストの処理    
やっとバグの取り除きに成功しました。
解決した、ということで変更したソースも添付しておきます。
御津凪さん、アドバイスありがとうございました!

仕様:
F9でフルスクリーン、ウィンドウ切り替え
ウィンドウモードの時、最大化ボタンを押すとフルスクリーン化


>>TestCooperativeLevel メソッドが行っているのは、平たく言えばデバイスが消失(ロスト)しているか、
あるいはその状態から復帰可能かどうかをチェックするものです。

D3DPRESENT_PARAMETERSの変数の値を修正したところ、期待通りの動作をしました。


>>DirectX SDK には DirectX Error Lookup というエラー値からエラー名と説明を知ることができる
>>ユーティリティツールが付属しています。
>>(スタートメニュー内にあります)

これも知りませんでした。
大変勉強になります。m(_ _)m
フルスクリーン状態でもprintf代わりに
DXTRACE_ERRを使えるようになったので、
デバッグ速度がかなり向上しました。



>>あと、それとは別ですが、

>>#pragma comment(lib, "dxerr.lib")

>>というマクロは環境依存であることを忘れないでください。
>>できれば VC++ のプロジェクト設定のリンカオプションで指定することをお勧めします。
>>(VC++ でのみ扱うコードならばそのまま使用しても支障はありません)

この部分だけわかりませんでした。
一応、今はVCのみで作成していますが、(ExpressEditionでした)
後々のため、教えていただけないでしょうか(^^;)
VCの使い方の話になってしまって申し訳ないです・・・。


VCはブレークポイント、コメントアウト、ブックマークくらいの
機能しか使えてないです・・・。


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

Name: 御津凪 [URL]  ..ハッカー(130,849ポイント)   Date: 2009/12/10(木) 02:13   No:43732     
Title: Re:フルスクリーン時デバイスロストの処理    
簡単に説明します。

#pragma comment(lib, "dxerr.lib")

これは、リンカ時に渡すライブラリファイルを指定するマクロです(プラグマ命令と言います)。

このプラグマ命令は、他の用途でも使用され(#pragma message("コンパイル中に表示するメッセージ") など)、
その機能はコンパイラや処理系(BCC や GCC などのこと)によって、大体同じではありますが、書き方が違います。
詳しくは "#pragma" でググるなどして調べるといいでしょう。

なので、書いているプログラムコードが移植目的(別のコンパイラでコンパイルするなど)であれば書くのを避けるべきです。

逆にいえば、 VC++ だけで使用するコードならば、使用しても問題ではありません。

なお、DirectX 関連の書籍では、大抵 Visual Studio でのライブラリファイルの追加方法などが載っていますので参考にするといいでしょう。

プロジェクトのプロパティから、
リンカ - 入力 のページにある「追加の依存ファイル」が、ライブラリファイルを指定する場所です。
ここにリンクするライブラリファイル名を追加することで、
#pragma comment(lib, "リンクするライブラリファイル名")
と同じ効果になります。


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

Name: Libra  ..中級者(14,225ポイント)   Date: 2009/12/11(金) 06:28   No:43796     
Title: Re:フルスクリーン時デバイスロストの処理    
回答ありがとうございます。

「リンカオプション 設定」etc等で色々検索かけたのですが、
見つからなかったので・・・。

>>なお、DirectX 関連の書籍では、大抵 Visual Studio でのライブラリファイルの追加方法などが載っていますので参考にするといいでしょう。

友人から借りた本にはVisualStudioに関する記載はなかったです・・・。残念。

#pragmaに関しては、調べて勉強します。


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

Name: 御津凪 [URL]  ..ハッカー(131,382ポイント)   Date: 2009/12/11(金) 10:21   No:43808     
Title: Re:フルスクリーン時デバイスロストの処理    
近くに書店があれば、書籍を探してみると良いですよ。
DirectX 9 関連の書籍はたくさんありますが、それぞれ初期化部分や描画の仕方等に定型的なコードはあれど、
説明のしかたが色々なので、理解を得やすいものがあるかもしれませんよ。
(大規模な所じゃないと余り沢山並んでないかもしれませんが)

さすがにおまじないと称して説明をしないのはあまり参考にならないですが…。

あと、 VisualStudio 関連の書籍もあるので、興味があったら見てみるといいでしょう。


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



Name: あすら  ..ぴよぴよ(121ポイント)   Date: 2009/12/11(金) 07:31   No:43797       
Title: 部分和    
部分和の問題です。すいませんがお願いします。

入力:n個の正の整数の集合{a1,a2・・・・an},及び正の整数s

出力{a1,a2・・・an}の部分集合でその和がちょうどsになるもの。

ただしその様な集合が存在しない場合には「sに等しい部分集合が存在しない」と出力する。

例{3,14,6,9}とs=12の場合

{3,9}3+9となるので出力は{3,9}

この問題でコマンドラインで出したんですが必ず「sに等しい部分集合は存在しない」と
なるのですがどうしてでしょうか?
すいませんがお願いします。


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


Name: non  ..比類無きプログラマー(79,651ポイント)   Date: 2009/12/11(金) 08:53   No:43800     
Title: Re:部分和    
私がコンパイルするとエラーになります。

エラーがおきないプログラムをのせてください。
まず、環境は何ですか?
ファイルを読み込むようですが、そのファイルを添付すること。
再現できないと、確認することができませんし、プログラムを読む気にもなれません。



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

Name: たいちう  ..プログラマー(38,507ポイント)   Date: 2009/12/11(金) 09:13   No:43803     
Title: Re:部分和    
それとコマンドライン引数とファイルの中身も説明してください。
その他に今言えることは、次の2つです。

1.コマンドライン引数の読み込みはできているか
2.ファイルの読み込みはできているか

両方できていることが何らかの形で確認できてから、
subsetsumのデバッグに進みましょうね。


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



Name: uul  ..ぴよぴよ(51ポイント)   Date: 2009/12/11(金) 00:03   No:43778       
Title: 多重インクルードにういて    
多重インクルード禁止について
今まで、メインソース(cpp)一つとヘッダーでやってきましたが
最近プログラムが長すぎるようになり多重インクルードよく発生します。
毎回インクルードファイルを書くのもめんどくさいし、どうやったら多重インクルードをおこらないように
綺麗まとめられます?
あと、関数も私はヘッダーに書いてましたけど、
人のプログラムを見るとヘッダーに関数の名前、cppファイルにその関数の内容を書いてます。
普通はそうなんですか?


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


Name: array [URL]  ..熟練のプログラマー(61,251ポイント)   Date: 2009/12/11(金) 00:58   No:43784     
Title: Re:多重インクルードにういて    
多重インクルードという用語を知っているので既知の事かもしれませんが

C++ だと、ヘッダファイルの先頭の行に
#pragma once

を追記するだけで多重インクルードガードしてくれます。

ヘッダファイルには宣言のみで実態を記述してはいけません。
記述されてると、コンパイルエラーになるはずなのでお気をつけて。

C言語でも可能です

/* main.h */
#ifndef MAIN_H // インクルードガード
#define MAIN_H

struct sample
{
int num;
};

#endif // ここまで


MAIN_Hというのは、ヘッダファイル名を大文字にして.を_になってます。
これが一般的らしいです。少し特殊な文字列に見えるかもしれませんが
他のdefine定数と被らないよう配慮しての事だと思います。
他にも __MAIN_H__ などが一般的によく用いられています。

参考:http://www.geocities.jp/ky_webid/c/060.html



> あと、関数も私はヘッダーに書いてましたけど、
> 人のプログラムを見るとヘッダーに関数の名前、cppファイルにその関数の内容を書いてます。
> 普通はそうなんですか?

普通は、cppファイルに関数を書きます。
極論、ヘッダファイルはプロトタイプ宣言のみを行います。


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

Name: kazuoni [URL]  ..ハッカー(117,883ポイント)   Date: 2009/12/11(金) 01:37   No:43788     
Title: Re:多重インクルードにういて    
> C++
> #pragma once

Visual C++のことですかね?
たしか、gccでも使えたような気がしますが・・・(嘘でしたら申し訳ありません。。)


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

Name: Ma  ..上級者(22,555ポイント)   Date: 2009/12/11(金) 05:09   No:43793     
Title: Re:多重インクルードにういて    
>gccでも使えたような
使えなかったと思います。

代用として、

#ifdef tempNAME
#define tempNAME

<ここに中身。>

#endif

が使えたはずです。


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

Name: たいちう  ..プログラマー(38,235ポイント)   Date: 2009/12/11(金) 08:59   No:43801     
Title: Re:多重インクルードにういて    
× #ifdef tempNAME
○ #ifndef tempNAME


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



Name: ft  ..初心者(6,837ポイント)   Date: 2009/12/08(火) 02:22   No:43610       
Title: フレームスキップ    
処理落ちで速度が低下するのを回避するためにフレームスキップを導入したいと思うのですが、
どのようにしたら良いのでしょうか?
ソースはほとんど龍神録サンプルに沿った形となっています


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,097,367ポイント)   Date: 2009/12/08(火) 08:26   No:43612     
Title: Re:フレームスキップ    
処理に時間がかかる原因は描画にあると思っていいと思います。
弾幕の軌道計算がいくらかかるといえども、2D位の処理なら、簡単にCPUはやってしまいます。
また、計算はしないと座標が進みませんが、描画はしなくても以後の処理に影響がありません。

ということで、描画をスキップさせてやればいいことになります。
ここで注意が必要なのが、計算の関数と描画の関数を完全に分けることです。
少しでも以後の処理に関係するような計算を描画関数でやっていると、スキップするとおかしくなってしまいます。
描画関数は描画しかしないようにしましょう。
リプレイ機能を付けるなら、描画内でGetRandを使うのもダメです。
乱数は呼んだ回数で値が決まるので、呼ばない処理が入ると値が変わってきます。

ということで、処理落ちが発生したら、描画関数の処理を飛ばし、
1フレームに複数回計算関数を呼んであげて下さい。


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

Name: ft  ..初心者(6,867ポイント)   Date: 2009/12/09(水) 00:41   No:43670 解決!     
Title: Re:フレームスキップ    
なるほど,そういう仕組みでしたか.
お蔭でフレームスキップを導入できました,ありがとうございます!


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

Name: Justy  ..伝説なるハッカー(474,996ポイント)   Date: 2009/12/09(水) 00:55   No:43671     
Title: Re:フレームスキップ    

> 1フレームに複数回計算関数を呼んであげて下さい

 処理をスキップするフレームが2,3フレーム以内ならさほど問題ないかもしれません。
 しかしそれ以上になるとその数フレーム間のキー入力状態だけはなんとかしないと、
ちょっと右押しただけなのに、処理落ちの為にずっと右押されたことに
なってて衝突してしまったとか、反対にショットを撃とうとしてたけど、
処理スキップの為に撃てず、チャンスを逃した、とかいうケースになってしまうかも……。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,100,499ポイント)   Date: 2009/12/10(木) 23:51   No:43776     
Title: Re:フレームスキップ    
あ〜なるほど、そう言う事が起こる可能性がありますね。
私は今までそう言う事は想定しませんでした。

ただ私の数少ない経験上の話ですが、
処理落ちする時はそんな例えば10フレーム位も落ちる事は無く、
コンスタントに10フレームも落ちたりするようなゲームではそもそも遊べないと思います。
(何かの負荷がかかった瞬間多いフレーム数になることはあるかもしれませんが)

Aerobeatにどれ位処理落ちしたかを表示する機能を付けましたが、
カクカクになってしまう古いノートPCで動かしてみても、
やはりコンスタントに一律のフレーム落ちが発生し、
私が試した範囲では飛びぬけてあるフレームだけ沢山落ちる(ロードは除く)という事はありませんでした。

しかしちゃんとしたゲームを作るならJustyさんの仰ることは考慮すべきでしょうし、
否定するつもりは毛頭ないこと述べておきます。
私も今後の参考になりました。

ただ、この実装に手間がかかって挫折してしまいそうになることがもしあれば、
こういうケースはレアじゃないかという事を頭に入れて制作されてはどうかとコメントしました。


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

Name: Justy  ..伝説なるハッカー(478,443ポイント)   Date: 2009/12/11(金) 01:06   No:43785     
Title: Re:フレームスキップ    

> 処理落ちする時はそんな例えば10フレーム位も落ちる事は無く

 それは仰る通りです。
 
 レアといえばレアですし、絶対に必要な処理というわけではありません。
 常に処理落ちている場合は考慮外で構わないと思います。
 仮にやるとしてもプライオリティを下げて、後回しにしても構わない類のものです。

 ただ、PCで実行している以上ユーザーの環境では裏でどんなソフトが動いているのか
わからないわけで、何かをトリガーにして眠っていたプロセスとかサービスが一瞬だけ動いて
ゲームにその間あまり処理が回らないということも考えられます。

(極端な例だと、とあるPCでは特定メーカーの USBメモリを差すと認識するまでの数秒間
マウスすら動かなくなることがありました。ここまでくると全くゲームになんか処理は
回らないのでどうにもならないですけど……)

 とはいえ、Dixqさんの仰る通り「まぁそういうこともあるかもね」くらいに考えて
おけばいい話ということで。


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



Name: ジュンヤ  ..ぴよぴよ(37ポイント)   Date: 2009/12/08(火) 12:01   No:43623       
Title: ステージ切り替え処理について    
はじめて質問させていただきます。ジュンヤと申します。
龍神プログラミングの館のプロジェクトをダウンロードさせていただき勉強してます。

タイトル画面を作って、そこからステージ画面に移行するときに、
func_state = 99;
このように指定するだけだと、すぐに画面がパッと変わってしまうんですけど、
ゆっくり画面を変更する方法はないでしょうか?
よろしくお願いします。


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


Name: Dixq (管理人)  ..ウィザード(1,097,679ポイント)   Date: 2009/12/08(火) 12:23   No:43626     
Title: Re:ステージ切り替え処理について    
どれくらい複雑になるかを問わなければどうやっても出来ない仕様はそう無いと思いますよ。

まず、仕様を明確にしましょう。
フェードアウト、フェードインによる画面の切り替わりならすぐ出来るでしょう。
切り替わりのあるタイミングでは、両方の場面が同時に描画されており、ブレンドする形で切り替わりエフェクトを作るなら制御部を一部改造する必要がありそうです。


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

Name: ジュンヤ  ..ぴよぴよ(167ポイント)   Date: 2009/12/08(火) 15:00   No:43632     
Title: Re:ステージ切り替え処理について    
さっそく返信ありがとうございます。
タイトル画面で、フェードアウトさせてから、ステージ画面に移行し、
その後フェードインさせるというやりかたでうまくいきました。
切り替わるタイミングに、両方同じ画面にしておくのがポイントだったんですね。

そこでブレンドする形で切り替わりエフェクトというのもやってみたいのですが、
それも似たような方法で、できるのでしょうか?


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

Name: kazuoni [URL]  ..ハッカー(117,429ポイント)   Date: 2009/12/08(火) 17:47   No:43646     
Title: Re:ステージ切り替え処理について    
> ブレンドする形で切り替わりエフェクト

次の画面にする前に、現在の画像をメモリに読み込み、
キャプチャ画像、次画面の順に描写します。
あとは、その二つを徐々にブレンドすれば簡単にできそうです。


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

Name: ジュンヤ  ..ぴよぴよ(111ポイント)   Date: 2009/12/09(水) 16:53   No:43712     
Title: Re:ステージ切り替え処理について    
画面をキャプチャした後に、画面を切り替えてから、
キャプチャ画像、次の画面を描画するということでしょうか?
画面を切り替えるタイミングがいまいちイメージできないです。


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

Name: kazuoni [URL]  ..ハッカー(117,820ポイント)   Date: 2009/12/09(水) 22:42   No:43721     
Title: Re:ステージ切り替え処理について    
とりあえず、やっつけで書いてみました。
大本は、ゲームプログラミングの館25bです。
プログラムでは画像char.pngとback.jpgが必要です。
char.pngはゲームプログラミングのchar.pngを、
back.jpgはなんでもいいので一枚画像を用意して下さい。(推奨640*480 ブレンド感が味わえるからw)

自分は、キャプチャーと書きましたが、
ジュンヤさんの描写の構造が分からなかったので、そう書きました。
キャプチャーすれば、撮った画像と次のステージでブレンドできます。
前画面の個々の描写はいらない(前画面のキャプチャーは必要ですが)ので、
前画面を制御する関数に入る必要はなく、管理に便利かと思ったのでそう書きました。

自分が今回書いたプログラムはキャプチャーせず、前画面の描写の次に次画面を描写しています。
単純なのでみたらわかるかと思います。


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

Name: ジュンヤ  ..ぴよぴよ(260ポイント)   Date: 2009/12/10(木) 22:15   No:43762 解決!     
Title: Re:ステージ切り替え処理について    
サンプルのプログラムを参考にさせていただいたおかげで、
ブレンドから、ステージ切り替えまでの一連の流れが
理解することができ、自分の思ったとおりの切り替えができました^^
必ずキャプチャーしなければいけないわけではなかったんですね。

丁寧なアドバイスに加え、サンプルまで作っていただき
ありがとうございました。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,100,045ポイント)   Date: 2009/12/10(木) 23:39   No:43775     
Title: Re:ステージ切り替え処理について    
キャプチャすると、どちらかの画面が止まってしまうと思いますので、
もし両方の画面を動かしたいなら
「両方の関数を呼ぶ時間」を設けて、その時間は両方の関数を呼んではどうでしょう。

画面1から画面2に変わる際、ブレンド時間が1秒だとすると、
画面1は1秒かけてフェードアウト、
画面2は1秒かけてフェードイン、
これを重ねて描画するとスムーズに切り替わりが出来そうです。

制御は若干ややこしくなりそうですが


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



Name: はね  ..上級者(15,798ポイント)   Date: 2009/12/10(木) 20:48   No:43753       
Title: 60章、画像を変える方法    

60章の龍神録について教えてください。
今改造して作成している一面、二面で
3D画像を変えたいのですが、
3Dbackground.cppのvoid Ini3Dbackground()で
if(stage==0){//一面ならば
ImgHandle = LoadGraph( "../dat/img/back/3D/tex00.png" );
IniObj(&Object[0], ImgHandle, 512, 0, 0, 256, 128, 250, 50, 3, 1000, 400, -200, -400, 320, 240-90, OBCHILD_MAX);
IniObj(&Object[1], ImgHandle, 512, 0, 0, 256, 128, 250, 50, 4, 1000, 400, -200, -400, 320, 240-90, OBCHILD_MAX);
//IniObj(&Object[2], ImgHandle, 512, 60,270, 405, 512, 180,125, 0, 1000, 400, -200, -400, 470, 275, 6);
IniObj(&Object[2], ImgHandle, 512, 60,270, 405, 512, 180,125, 0, 1000, 400, -200, -400, 360, 275, 6);
ImgHandle = LoadGraph( "../dat/img/back/3D/kabe00.png" );
IniObj(&Object[3], ImgHandle, 512, 0, 0, 390, 512, 73, 90, 1, 1000, 400, -200, -400, 170, 240, OBCHILD_MAX);
IniObj(&Object[4], ImgHandle, 512, 0, 0, 390, 512, 73, 90, 2, 1000, 400, -200, -400, 170, 240, OBCHILD_MAX);
}
if(stage==1){//二面ならば
ImgHandle = LoadGraph( "../dat/img/back/3D/tesuto.png" );
IniObj(&Object[0], ImgHandle, 512, 0, 0, 256, 128, 250, 50, 3, 1000, 400, -200, -400, 320, 240-90, OBCHILD_MAX);
IniObj(&Object[1], ImgHandle, 512, 0, 0, 256, 128, 250, 50, 4, 1000, 400, -200, -400, 320, 240-90, OBCHILD_MAX);
//IniObj(&Object[2], ImgHandle, 512, 60,270, 405, 512, 180,125, 0, 1000, 400, -200, -400, 470, 275, 6);
IniObj(&Object[2], ImgHandle, 512, 60,270, 405, 512, 180,125, 0, 1000, 400, -200, -400, 360, 275, 6);
ImgHandle = LoadGraph( "../dat/img/back/3D/tesuto2.png" );
IniObj(&Object[3], ImgHandle, 512, 0, 0, 390, 512, 73, 90, 1, 1000, 400, -200, -400, 170, 240, OBCHILD_MAX);
IniObj(&Object[4], ImgHandle, 512, 0, 0, 390, 512, 73, 90, 2, 1000, 400, -200, -400, 170, 240, OBCHILD_MAX);
}
みたいにして、画像を変えたいのですが、
なぜか二面に移行しても一面の3D画像のままなのですが、
変えるのはどうしたらいいのでしょうか?
誰か原因が分かり方がいましたら教えてください・・


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


Name: Naohiro19  ..かけだし(1,647ポイント)   Date: 2009/12/10(木) 21:47   No:43759     
Title: Re:60章、画像を変える方法    
switch case文で読み込みを0、描画を1 解放を3にして分けます


#define STATE_INIT 0
#define STATE_MAIN 1
#define STAGE_RELEASE 3
int processflag = STATE_INIT;

int game(char* fname) //fnameは
{
switch(processflag) {
case STATE_INIT:
//ステージの初期化関数を呼ぶ
break;
case STATE_MAIN:
//ステージのメイン処理関数を呼ぶ
break;
case STAGE_RELEASE:
//解放処理関数を呼ぶ
break;
}
return 1;
}


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

Name: はね  ..上級者(15,996ポイント)   Date: 2009/12/10(木) 23:04   No:43768     
Title: Re:60章、画像を変える方法    
え?そんな面倒なことをしなくてはならないのですか?
例えばですがボスの表示などは

//ボスの表示
if(stage==0){ //1面ならば
DrawRotaGraphFdF(boss.dx,boss.dy,1.0f,0.0f,img_boss01[0][boss.img],TRUE);
}
if(stage==1){ //2面ならば
DrawRotaGraphFdF(boss.dx,boss.dy,1.0f,0.0f,img_boss02[0][boss.img],TRUE);
}
これだけでも、変わっていたのですが・・
なぜ3D背景だけ?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,099,913ポイント)   Date: 2009/12/10(木) 23:36   No:43774     
Title: Re:60章、画像を変える方法    
パッと見、特に間違いは無いような気がしますけど、、、
眠くて目があかない^^;

stageの変数はきちんと変わっていますか?
ブレイクポイントなどでその条件式の中に入っていることは確実ですか?


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



Name: 50CIMA  ..ぴよぴよ(50ポイント)   Date: 2009/12/03(木) 11:52   No:43102       
Title: 三角関数    
質問です。
C言語のことは無知で申し訳ないのですが、質問させていただきます。
研究でC言語を学んでいるんですがsin^2の表し方がわかりません。
もしよかったら教えてもらってもよろしいですか?

迷惑かけますが協力おねがいします。

結果的にはI=i0sin^2(2θ)sin^2(Δndπ/λ)の計算をC言語でしたいです。
よろしくおねがいします。


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


Name: YuO  ..プログラマー(38,759ポイント)   Date: 2009/12/03(木) 12:12   No:43111     
Title: Re:三角関数    
sin^2(θ)というのは,sin2θのことですか?
であれば,sin2θは(sinθ)2のことですから,
pow関数でsin関数の結果を2乗すればよいと思います。


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

Name: 50CIMA  ..ぴよぴよ(96ポイント)   Date: 2009/12/03(木) 12:39   No:43120     
Title: Re:三角関数    
返信ありがとうございます。
そうです。
sin二乗θのことです。
I=i0sin^2(2θ)sin^2(Δndπ/λ)
のプログラミングはどのようにつくればいいんですか??

あつかましく無知で大変迷惑おかけします。


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

Name: Ma  ..上級者(22,051ポイント)   Date: 2009/12/03(木) 12:46   No:43121     
Title: Re:三角関数    
pow 関数を調べましたか?


sin^2(2θ)⇒pow(sin(2*θ),2)
sin^2(Δndπ/λ) ⇒ pow(Δndπ/λ,2)


です。(ただし、θとΔndπ/λはC言語的意味で変数とする。)


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

Name: 50CIMA  ..ぴよぴよ(50ポイント)   Date: 2009/12/03(木) 12:55   No:43124     
Title: Re:三角関数    
ありがとうございます。

まったくC言語がわからない状態でC言語の課題を与えられたためまったくわからなくて・・・。

本当にすみません。

だからどのようにプログラムをつくっていいのかもわからなくて・・・。

卒業研究の時間がもうなくてとてもあせっているんですよ。

それとこんな私の質問に返答していただきとても感謝しております。



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

Name: たかぎ [URL]  ..ハッカー(130,570ポイント)   Date: 2009/12/03(木) 16:20   No:43157     
Title: Re:三角関数    
pow関数でもよいですが、単に2乗するだけなら...

double y = sin(x);
y *= y;

で十分ですね。


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

Name: 50CIMA  ..ぴよぴよ(48ポイント)   Date: 2009/12/03(木) 16:41   No:43163     
Title: Re:三角関数    
返答ありがとうございます。

ある程度のプログラムを作ってもらうとかはできないですかね??

本当に申し訳ないです。


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

Name: たかぎ [URL]  ..ハッカー(130,662ポイント)   Date: 2009/12/03(木) 16:44   No:43165     
Title: Re:三角関数    
> ある程度のプログラムを作ってもらうとかはできないですかね??

丸投げは禁止です。
できるかできないかでいえばできますが、有償対応になります。
(お金儲けが目的ではありませんので、誤解なきよう)



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

Name: 50CIMA  ..ぴよぴよ(142ポイント)   Date: 2009/12/03(木) 16:51   No:43169     
Title: Re:三角関数    
すみません。

授業うけたけとないのにこの課題を与えられててんぱってしまってって・・・。

本当にすみませんでした。


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

Name: MNS  ..上級者(22,983ポイント)   Date: 2009/12/03(木) 17:04   No:43175     
Title: Re:三角関数    
まったく分からないのでしょうか?
main関数が書け、変数や演算子がわかるのならば、まだ少しは教えられると思いますが。


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

Name: 50CIMA  ..ぴよぴよ(62ポイント)   Date: 2009/12/03(木) 17:08   No:43179     
Title: Re:三角関数    
はい。
全くの無知です。



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

Name: non  ..比類無きプログラマー(74,180ポイント)   Date: 2009/12/03(木) 18:19   No:43194     
Title: Re:三角関数    
1週間あれば組めるようになると思いますよ。
卒研なら、まだ先があるだろうし、勉強することをお勧めします。


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

Name: たいちう  ..プログラマー(37,530ポイント)   Date: 2009/12/03(木) 21:04   No:43231     
Title: Re:三角関数    
理工系の卒業研究のために、ちょっとした計算をC言語でやりたいのでしょうか?
nonさんの書いた1週間(真剣に40時間やる)というのは、
C言語習得までの時間の1つの目安になると思います。
もちろんあなたの成果を保証することはできませんが、
ある程度基礎ができていれば、この掲示板も効果的に利用できるでしょう。

しかし最終的に作りたいのは本当に

> I=i0sin^2(2θ)sin^2(Δndπ/λ)

この計算だけなのでしょうか?
変数が全てスカラーで、この計算を一回するだけのプログラムならば、
基礎習得のおまけで完成させられると思います。
それ以上ならば、当然それなりの時間がかかります。

専門の研究にも時間がかかるでしょうし、C言語ができる友人に頼んだり、
担当教官に相談して、ハードルを下げてもらう方が現実的かもしれません。


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

Name: 50CIMA  ..ぴよぴよ(52ポイント)   Date: 2009/12/04(金) 15:04   No:43324     
Title: Re:三角関数    
返答ありがとうございます。
私は液晶を専門に研究をしているのですが、液晶の透過光強度って言うのを求める式がI=i0sin^2(2θ)sin^2(Δndπ/λ)なんですよ。

この式のΔndπを変化させてグラフを得たいんです。

私は情報コースではないため周りにC言語の詳しい人があまりいなくて・・・・。



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

Name: MNS  ..上級者(23,127ポイント)   Date: 2009/12/04(金) 17:31   No:43343     
Title: Re:三角関数    
その程度の計算を行うだけならば、今からC言語を勉強してもおそらくすぐに出来ると思います。
しかし、もしC言語を用いてグラフを描くことが目的となると、すぐには難しいかもしれません。


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

Name: non  ..比類無きプログラマー(74,911ポイント)   Date: 2009/12/04(金) 18:34   No:43353     
Title: Re:三角関数    
工学を勉強しているなら、C言語でなくても何かプログラムをやったのではないの?
プログラムの経験が何かあるなら、大丈夫だと思いますよ。まして、この後、グラフ作ったり
いろいろ手を加えるなら、人に作ってもらうのでなく自分で作らないとできませんよね。
もし、どうしてもCでは無理なら、卒研の先生にそういって、CでなくEXCELにするとか
MATLABなどを使うとか提案したらどうですか。でも、卒研の先生がCでやれってことは、やれる
能力が学生にあるだろうってことだと思いますけどね。毎年、ゼミの学生を見てきているのだから。

具体的に勉強していく段階でわからないことがあれば、力になりますので、がんばってください。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,094,802ポイント)   Date: 2009/12/04(金) 22:49   No:43373     
Title: Re:三角関数    
>50CIMAさん

こんばんは^^
自分の専門外のことはなかなかわからないものですよね。
それに今後使う予定の無いようなものにはなかなか熱心に勉強出来ないものですよね。

多分質問の書き出しが
「研究でC言語を学んでいるんですが」
だったので、
「C言語学んでるのにそんなことも解らないのか、しっかり勉強せぃ」
のような雰囲気になってしまったのだと思います。

4年生、しかも卒業目前にしてCを知らないという事は本当に完全に専門外なんですね。
授業でも全くやってないと?
Cは自分の専門外でさっぱりわからないことを先に伝えておけばアドバイスも何か変わったかも知れません。


さて、sinの計算とかはわかればホント1分とかでプログラムが書けてしまいます。
それ位簡単なので是非やってみましょう。
「1分で出来るんなら代わりにつくってよ」と思うかも知れませんが、
課題の丸投げは一応禁止という規約になっているので、管理人自ら破るわけにいかないのです、ごめんなさい。

では、まず、どの程度の知識があるのかということからはっきりさせましょう。
コンパイラはありますよね?
プロンプト画面に「hello world」の文字を出す位の事は出来るのでしょうか?
以下完全に入門レベルからこの課題が解けるレベルまで試しに問題を出してみますので、
どこまで解けるか教えてください。


問題1
「画面に hello world を表示するプログラムを書きましょう」

問題2
「2×2の計算結果をprintfで表示するプログラムを書きましょう」

問題3
「キーボード入力で受け取ったint型数値2つを掛け合わせた結果を表示するプログラムを書きましょう」

問題4
「キーボード入力で受け取ったdouble型数値のsinを表示するプログラムを書きましょう」

問題5
「テキストファイルに書かれたdouble型数値2つ(フォーマットは問わない)を掛け合わせた結果を表示するプログラムを書きましょう」


もし実験データとかじゃなく、本当にその計算だけすればいいなら3,4,5はわからなくても出来ます。
後、グラフを書くなら何で書くんですか?
何かグラフィックライブラリを使うんでしょうか?
エクセル出力にしてグラフ化するとか、DXライブラリ使うとか、「*」で頑張って書くとか色んな方法があると思います。


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

Name: 50CIMA  ..ぴよぴよ(244ポイント)   Date: 2009/12/07(月) 14:34   No:43585     
Title: Re:三角関数    
管理人様やアドバイスをくれた皆様返事ありがとうございます。

知り合いに教えてもらいI=i0sin^2(2θ)sin^2(Δndπ/λ) の計算のプログラムをつくることができました。

アドバイスありがとうございました。

あとひとつ質問なんですけどI=i0sin^2(2θ)sin^2(Δndπ/λ) で数値に範囲をつけて計算できるプログラムを作成したんですけどvisual studioのC言語のんでつくったのですがグラフのプロットはどうすればいいのでしょうか。

申し訳ないですがアドバイスおねがいします。


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

Name: softya [URL]  ..熟練のプログラマー(62,014ポイント)   Date: 2009/12/07(月) 16:02   No:43589     
Title: Re:三角関数    
規約違反ですので、ちゃんと規約を読み直してください。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1033831015
規約違反がなくならない限りお答えできません。


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

Name: 組木紙織  ..比類無きプログラマー(76,360ポイント)   Date: 2009/12/07(月) 17:42   No:43591     
Title: Re:三角関数    
規約違反であるとおもいますが、何処が規約違反か分からないときは、聞いてくれて構わないと思っています。

もちろん、規約を読んだ後の話ですが。


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

Name: やそ  ..比類無きプログラマー(98,916ポイント)   Date: 2009/12/07(月) 21:38   No:43596     
Title: Re:三角関数    
無事に計算ができたようで、おめでとうございます。

式の計算ができたということは、結果を表示できたわけですね。

printfなどで画面(標準出力)に表示したのでしょうか。

グラフなら、その出力結果をファイルに落として、エクセルかなにかのソフトで読み込んで
グラフ表示すればよいと思いますがどうでしょうか?


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

Name: lbfuvab  ..上級者(23,535ポイント)   Date: 2009/12/07(月) 23:23   No:43602     
Title: Re:三角関数    
=  一連の流れ  =
@必要なΔndπ毎に計算する

A計算結果をファイルに出力(csvファイル推奨)

Bエクセル(なければOpenOffice Calc、GNU plot等)でグラフ化。

=  解説コーナー  =
@については
「for文」とか「while文」でググってもらえれば良いです。

Aについては
出力に関してはfopen,fprintf,fclose辺りでググって下さい。
csvファイルの形式についてはググって下さい。勉強になりますので。

Bについては
出来ますよね?ファイルを開けるぐらい。


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

Name: Mist  ..比類無きプログラマー(76,588ポイント)   Date: 2009/12/08(火) 10:09   No:43617     
Title: Re:三角関数    
> lbfuvabさん

丸囲み数字はMacだと正しく表示されませんのでこういうところではあまり使わないほうがいいですよ。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,098,380ポイント)   Date: 2009/12/08(火) 19:12   No:43656     
Title: Re:三角関数    
50CIMAさんから、卒業が近いので協力してほしいとのメールを頂きましたが、
裏で話を進めたり、答えを教えてしまったりするのは良くないと思いますので、こちらで回答致します。

忙しくて早く答えが得たいのは解りますが、
せっかく回答して下さっている方々をそのままに、他の手段に移るのはあまり良い事ではないように思います、
真面目な話で面白くないかもしれませんが、コメントします。

協力してほしいとこことですが、協力して下さる方々はここに沢山いらっしゃいます。
規約さえ守り、やる気の姿勢でいれば皆さん積極的に教えて下さると思いますよ。

後、まず、聞かれたことにはなるべく漏れなく答えるようにして下さい。
必要があるから聞いているので、別に答えなくてもいいような事をわざわざ回答者は質問しません。

規約違反してすみませんと、記述がありましたが、結局softyaさんのご指摘内容はそのままで、何も対処されていません。

忙しいのは解りますが、やるべき事がやはりなされていないので、回答者が協力しようという気がそがれてしまい、
結局非効率になってしまっているように思います。
この課題をやる時間というものをしっかり確保し、課題をやる時は課題に集中しましょう。

それと、回答者は質問者のスキルが解らないと回答がしにくいのです。
例えば

「グラフを書きたいんですが、どうしたらいいですか?」
「OpenGLを使ってください」
「OpenGLって何ですか?」

みたいなやり取りが続くかもしれません。
質問者に適切な回答が出来ないのです。

私が上で聞いた事はその為です。ですから、その質問にお答えいただきたかったのです。
後、何に出力するのかということも解らないと答えようがないです。

それと、ただ初心者といっても、幅があると思います。
謙遜で言ってて実は中規模程度のソフト開発の経験ならあるのかもしれないし、
一行もプログラムを書いた事がないのかもしれないし。
「初心者です」だけ書いてあっても解らないんですよね。
ですから、どんな経験があって、何なら出来るのか、何をしたいのかを明確にしましょう。



・・と、こんな話ばかりしても面白くないでしょうから・・。



って回答にうつりたいのですが、まだ情報が足りなくて回答が出来ないのです。
エクセルにするのか、自分でグラフを書くのか、書くならライブラリはどうするのか、
そういうことも全て分からないので教えてくれだとか(その場合どのような完成像を思い描いているか明確に)
教えて下さい。


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

Name: たかぎ [URL]  ..ハッカー(134,904ポイント)   Date: 2009/12/08(火) 19:56   No:43657     
Title: Re:三角関数    
> 丸囲み数字はMacだと正しく表示されませんのでこういうところではあまり使わないほうがいいですよ。

Macでもちゃんと表示できていますよ。
まあ、それでも避けたほうが良いでしょうね。


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

Name: non  ..比類無きプログラマー(78,884ポイント)   Date: 2009/12/09(水) 10:05   No:43678     
Title: Re:三角関数    
前にもいいましたが、C言語でグラフを描かなければいけない理由がわからない。
卒研のための手段のはず。ただ単にデータとして、グラフが欲しいのではないの?
参考までにEXCELでグラフを描いてみた。式の意味が私にはわからないので、
あっているかはわからない。


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

Name: 50CIMA  ..ぴよぴよ(222ポイント)   Date: 2009/12/10(木) 14:50   No:43746     
Title: Re:三角関数    
みなさん、いろいろとアドバイスしていただいてありがとうございました。

いままで楽しようとにげている自分がいました。

みなさんの意見を参考にさしてもらい、自分の力でがんばってみようと思います。

また、質問がでてくるかもしれないですが、そのときはお世話になると思うので、よろしくおねがいします。

管理人様、貴重なスペースありがとうございました。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,099,837ポイント)   Date: 2009/12/10(木) 23:34   No:43773     
Title: Re:三角関数    
あら・・小言が多くて気を悪くさせてしまいましたかね^^;

卒論に間に合わないようですが、大丈夫ですか?

何で出力したいのかなどの詳細な仕様が解れば何とかアドバイス出来ると思うのですが・・


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



Name: VC++2008  ..ぴよぴよ(145ポイント)   Date: 2009/12/10(木) 08:24   No:43733       
Title: 新規プロジェクトからのゲーム    
このサイトの説明や他人のソースファイルに上書きして今までゲームを作って
いました。普段はgccでCをつかってますので、VC++関係はまったくの初心者で
知識もありません。
現在、新たにVC++2008EEでゲームを作ろうと思っています。
プロジェクト種類は全般で空のプロジェクトを作りましが、
DxLib_VCのプロジェクトに追加すべきファイル_VC用フォルダの内容は
プロジェクトのどこに入れるべきでしょうか?

VC++2008で新プロジェクト作成からDXライブラリを使ったゲームフォルダ(ソースファイル)の
作成(コンパイル)までの流れを教えてくれたらありがたいです。よろしくお願いします。
とにかくソリューションなどのおかげで、単に人のファイルを新規のプロジェクトにコピーしただけでは
ファイルを認識してくれなくてエラーが出て困ってます。
アホみたいな質問かもしれませんがよろしくお願いします。


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


Name: チルチル  ..比類無きプログラマー(83,588ポイント)   Date: 2009/12/10(木) 12:52   No:43742     
Title: Re:新規プロジェクトからのゲーム    
とりあえず本家の解説はご存知でしょうか?

http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2008express.html

VC用フォルダを置く場所は色々あって好みにもよります

本家のようにしても良いんですが
他のPCでコンパイルする時に面倒だったり
バージョン管理とかもあるので

一例としてはsinファイルと同じ場所に置くのがありますね
自分の作ったコードは別のフォルダに入れた方が見やすいと思います

ソリューションについては

プロジェクト→既存項目の追加
で追加するか

プロジェクト→新しい項目の追加
で作って内容をコピーするとかでどうでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,098,823ポイント)   Date: 2009/12/10(木) 23:17   No:43769     
Title: Re:新規プロジェクトからのゲーム    
VC++2008さん、
こんにちは^^

チルチルさんの仰る通り、本家の解説を読むのが一番早いと思います。

また、これもチルチルさんが仰る通りですが、
最近DXライブラリはver2.xxからver3.xxに大きく変わったので、
3で追加された関数を使う場合は特に同梱の必要が高いと思います。

・・という反面、
私は最近windows7にしてからver2.xxが動かなくなったので、サンプルプログラミングの館のプログラムがそのままでは動かず困っています^^;
何のバージョンを同梱しているか明記した方がよかったですね。

後、プロジェクトの作り方が解らない場合は
「サンプルプログラム実行用フォルダ」のプロジェクトを使うのも手です。
・・まぁこのフォルダはファイルが沢山あってそのまま作業に入ると少し大変ですが;


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



Name: kai  ..中級者(9,116ポイント)   Date: 2009/12/04(金) 14:22   No:43319       
Title: Justyさんが作成した炎サンプルを利用して    

Justyさんがちょっと前に作成した炎サンプルを
改造している龍神録につないでみようと試みた(ボスの後ろに描画)のですが、
particleがなぜか5で固定されてしまい、
微妙な炎しか描画できなかったのですが、どうしたらうまくいくのでしょうか?
解決策がわかる方がいましたら教えてください><
以下、60章に追加、変更した部分↓

common_type.h、dxl_peripheral.h、vector2.h
はそのまんまヘッダーファイルに入れて
#include "common/common_type.h"は削除。

dxl_peripheral.cppは
#include "dxl_peripheral.h"
#include <DxLib.h>
を削除

effect_fire.cppの中身は
graph.cpp内の適当な場所に切り取り&貼り付け
そのときに変更した部分(コメントアウトや変更した部分)は添付参照

void graph_boss()内の適当な場所に
MainLoop();
を追加。


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


Name: Justy  ..伝説なるハッカー(470,822ポイント)   Date: 2009/12/04(金) 23:27   No:43386     
Title: Re:Justyさんが作成した炎サンプルを利用して    
 書き直そう! といって忙しくてちっとも書き直せていないんですが、
添付のコードであからさまにおかしいのは 各種オブジェクトの生成位置が
元々メインループの外にあったものが中に入ってしまっているところです。

 具体体には fire、pauseCtrlです。
 MainLoop関数そのものがメインループの中に入ってしまっていると
するなら、fireオブジェクトはローカル変数なので MainLoop関数が呼ばれる度に
生成・破棄されることになり、その度に火の状態はリセットされてしまいます。

 なので fireが常に同じオブジェクトになるよう変更すれば直ると思うのですが、
まず(あまりいい方法ではないので)テストとして fireの宣言に staticをつけてみて下さい。


    static Effect::Fire fire;


 それでうまくいくようなら、fireオブジェクトを別のところで管理・保持するよう
変更してみて下さい。


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

Name: kai  ..中級者(9,191ポイント)   Date: 2009/12/05(土) 02:51   No:43402     
Title: Re:Justyさんが作成した炎サンプルを利用して    
staticを追加してみると一応上手く描画できました。ありがとうございます。

>fireオブジェクトを別のところで管理・保持するよう
>変更してみて下さい
すみません。これは具体的にはどうしたらよいのでしょうか?


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

Name: Justy  ..伝説なるハッカー(471,543ポイント)   Date: 2009/12/05(土) 03:12   No:43406     
Title: Re:Justyさんが作成した炎サンプルを利用して    

> これは具体的にはどうしたらよいのでしょうか?

 結局のところ、同一のインスタンス(オブジェクト)を Updateし続けることで継続して
火として成り立つので、同じオブジェクトでさえあればいいのです。

 持たせるとしたら大抵はエフェクトを出すべきオブジェクト、例えば火が松明の火であれば
松明が、蝋燭の火なら蝋燭、プレイヤーが燃えてるならプレイヤーに持たせれば
いいのではないでしょうか。


 ただ、Fireクラスをグローバル変数にしたり、グローバル変数の別のオブジェクトに
持たせたりはしないで下さい。

 今の状態ですと、Fireクラスのコンストラクタでテクスチャのロードを
行っているので、グローバル変数などにすると読み込みに失敗します。
(テクスチャの読み込みは DxLib_Init後でないと成功しない)

 その場合は、Fireクラスのポインタにしておいて、後から必要に応じて newして
インスタンス化して下さい。


# うーん、これクラスになっているんで龍神録のプログラムとは
なじまないような気がします……。


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

Name: kai  ..中級者(9,233ポイント)   Date: 2009/12/05(土) 03:38   No:43409     
Title: Re:Justyさんが作成した炎サンプルを利用して    
Justyさんありがとうございます。
アドバイス通りにこれからやってみたいと思います。
もうひとつ聞きたいことがあるのですが、
一応現段階では
boss.back_knd[boss.knd]==1、スペルカード時に描画するようにしているのですが
この描画してるさいFPSが30くらいになり、もの凄く処理落ちして困ってるのですが
何が原因なのでしょうか?


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

Name: Justy  ..伝説なるハッカー(471,663ポイント)   Date: 2009/12/05(土) 16:18   No:43440     
Title: Re:Justyさんが作成した炎サンプルを利用して    

> もの凄く処理落ちして困ってる

 まずはソートを止めてみて下さい。ソートを止めてもこのパラメータなら
見た目たいした違いはないはずです。

 それでも処理落ちが改善されないのであれば描画面積やパーティクルの枚数(発生頻度)を減らし、
それでもやっぱりダメなら別の方法を考えた方がいいのかもしれません。


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

Name: kai  ..中級者(9,036ポイント)   Date: 2009/12/05(土) 18:03   No:43444     
Title: Re:Justyさんが作成した炎サンプルを利用して    
すみません。言葉足らずでした。
通常の炎の場合は処理落ちしないのですが、
// 煙の ON/OFF
if(DXL::Peripheral::Mouse::Down(DXL::Peripheral::Mouse::ButtonType_Right))
の個所を
if(boss.hp<2000){ //ボスが死にそうなら
     fire.SetUseSmoke(!fire.GetUseSmoke());
}
に変えたとき、煙エフェクトが出たら処理落ちしました。

ついでに聞きたいのですが、
これって初期化はどうすればいいのでしょうか?
支館様より、ボス戦の途中、最初から戻るなどでリセットした場合、
もう一度ボスに出会うと、前の炎があった場所から炎が微妙に残って描画され、悩んでます。


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

Name: Justy  ..伝説なるハッカー(472,396ポイント)   Date: 2009/12/05(土) 18:54   No:43449     
Title: Re:Justyさんが作成した炎サンプルを利用して    

> 煙エフェクトが出たら処理落ちしました

 なんかそのコードですと毎フレーム煙を ONにしたり OFFにしたりしそうに
見えますが、その処理落ちはソートをコメントアウトしてもそうなりますか?

 あと、releaseビルドだとどうなりますか?



> これって初期化はどうすればいいのでしょうか?
> 前の炎があった場所から炎が微妙に残って描画され

 それは同じオブジェクトを使い回していませんか?
 同じオブジェクトを別のところで使えば、前の状態を覚えているので、それを
引きずっていまうのは自然です。

 なので、使わなくなったオブジェクトは破棄して、新規にオブジェクトを生成すれば
初期化されます。
(そうなるとコンストラクタでの LoadGraphは少し考えないといけませんが)


 どうしても同じオブジェクトを使い回したいのであれば……そうですね、こんな感じでしょうか。

 Fireクラスに Endメンバ関数を追加して、それが呼ばれた以降は新規のパーティクルの
生成を停止(AddFiresを呼ばない)するようにして下さい。

 Startメンバ関数を追加してそれが呼ばれた以降は新規のパーティクルの
生成を行う(AddFiresを呼ぶ)ようにして下さい。

 それから Resetメンバ関数も追加して、その中で m_Firesコンテナを空にして下さい。
 ついでに、その他のパラメータ(位置とかスケールとか)も初期化しておくといいかと思います。


 で、炎が必要なくなったら End関数を、必要になったら Start関数を呼べば自然な形で
炎が消えたり(数十フレームかけて炎が収束する)、炎が出現したりします。

 但し、消えている途中で再度出現させようとするとやはり、同じ現象がおきるので、
炎を再出現させようとする段階で、パーティクルの数が0になっていなかったら Reset関数を呼んで
強制的に前の情報を消し、改めて位置などの情報を設定してから Start関数を呼べば
一応望み通り動くかと思います。


 まぁでもどっちの戦略をとるにしても、明示的に Startしないと出現しない方が
なにかと便利なはずですし、消すのにいちいちオブジェクトを破棄していたら一瞬で
消えてしまうことになるんで、ゲームで使うなら Start/End/Reset関数は
追加しておいた方がいいでしょうね。


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

Name: kai  ..中級者(9,285ポイント)   Date: 2009/12/07(月) 21:06   No:43595     
Title: Re:Justyさんが作成した炎サンプルを利用して    
>Justyさん
返信遅れてすみません。

>処理落ちはソートをコメントアウトしてもそうなりますか?
コメントアウトしたら処理落ちはしませんでした。
>あと、releaseビルドだとどうなりますか?
debugと同じでした。

>使わなくなったオブジェクトは破棄して、新規にオブジェクトを生成すれば
>初期化されます。
特に同じオブジェクトを使い回しはしなくてもよさそうなので
使わなくなったオブジェクトは破棄して
新規にオブジェクトを生成して初期化したいと思うのですが、
沢山オブジェクトがあって、どれのことか分からない&破棄する方法が分からないのですが
どうしたらいいのでしょうか?


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

Name: Justy  ..伝説なるハッカー(474,847ポイント)   Date: 2009/12/08(火) 01:02   No:43605     
Title: Re:Justyさんが作成した炎サンプルを利用して    

> コメントアウトしたら処理落ちはしませんでした
> debugと同じでした

 この中の処理の中ではソートか描画が重いだろうと思っていたので、
ソートをコメントアウトして処理落ちがなくなったのはある意味予想通りですが、
Releaseビルドにしても Debugと同じと言うことは、ソートを入れると
Releaseでも処理落ちするということですかね。

 うーん、描画にも負荷がかかっているんでしょうか。



> 沢山オブジェクトがあって、どれのことか分からない&破棄する方法が分からないのですが

 C++は大丈夫ですか?

 C++のクラスを理解していないと難しい話になってしまうのですが、ボスで使うのなら
ボスのメンバに Effect::Fireクラスのポインタ pFireEffect(名前はお好みで決めて下さい)を
定義します。

 次にボスの初期化(或いは使い始める時)のところで、そのポインタに対し、
newを行い火のクラスをインスタンス化します。

    boss.pFireEffect = new Effect::Fire;

 これが生成になります。
 今のコードですと、コンストラクタでテクスチャを読み込んでいますので、
このあたりは事前に読み込んでおいて使い回すようにしておくのがいいかと思います。

 使う時は、

    boss.pFireEffect->Update();
    boss.pFireEffect->Draw();

のように使います。

 次にボスの終了(或いは火が必要なくなった時)のところでそのポインタに対し
deleteを行います。

    delete boss.pFireEffect;
    boss.pFireEffect = NULL;

 これが破棄になります。
 その際、bossオブジェクトはグローバル変数になっているので念のため
使わなくなった pFireEffectを 上のようにNULLで初期化しておくといいでしょう。


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

Name: kai  ..中級者(9,347ポイント)   Date: 2009/12/08(火) 02:13   No:43609     
Title: Re:Justyさんが作成した炎サンプルを利用して    
あの、
>ボスのメンバに Effect::Fireクラスのポインタ pFireEffect(名前はお好みで決めて下さい)を
>定義します。
というのは、どう定義すればいいのでしょうか?


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

Name: Justy  ..伝説なるハッカー(475,414ポイント)   Date: 2009/12/09(水) 01:39   No:43673     
Title: Re:Justyさんが作成した炎サンプルを利用して    

> どう定義すればいいのでしょうか?

 あー、そこからですか。
 
 本来ならきちんと Effect::Fireクラスを h, cppファイルに分けて書くべきでしょうが、
この状況だともっと簡単な方がいいですよね。

 んーと、struct.hのボス構造体より上(「//ボスの情報」のコメントの上あたりがいいでしょう)に

    namespace Effect { class Fire; }

と書き、ボスの構造体のメンバ変数として

    Effect::Fire * pFireEffect;

というのを定義して下さい。

 後は必要に応じて生成・破棄(或いは開始・停止)をすればOKです。


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

Name: kai  ..中級者(9,564ポイント)   Date: 2009/12/10(木) 00:20   No:43727     
Title: Re:Justyさんが作成した炎サンプルを利用して    
すみません。
Justyさんのいうとおりに行ったのですが、
今度はエラーが出て、描画すらできなくなってしまいました。
自分が改造してるゲームではないですが、
ほとんど同じの50章にJustyさんが作成した炎プログラムをドッキングしたのをアップロードしたので、
どこを修正すれば描画出来るようになるか教えていただけないでしょうか?
描画は
graph.cpp内、
void graph_boss()内のMainLoop();で描画しようとしてます

http://www.dotup.org/uploda/www.dotup.org440396.zip.html
パス:1q2w3e


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

Name: Justy  ..伝説なるハッカー(476,220ポイント)   Date: 2009/12/10(木) 00:46   No:43728     
Title: Re:Justyさんが作成した炎サンプルを利用して    

> 今度はエラーが出て、描画すらできなくなってしまいました

 生成する前に使おうとしているからです。
 つまり、boss.pFireEffectが NULLの状態で、Update等を行おうとしたのが原因です。

 一応動くよう直してみましたが、1回しかテストしていなので、
全く問題ないかどうかはわかりません。


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

Name: kai  ..中級者(9,646ポイント)   Date: 2009/12/10(木) 01:15   No:43729     
Title: Re:Justyさんが作成した炎サンプルを利用して    
Justyありがとうございます。
一応エラーもなく描画できましたが、
これだと、次の弾幕移行時に
particleが5に戻って、薄く描画されてしまうのですが、
これはどうしたらいいのでしょうか?


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

Name: Justy  ..伝説なるハッカー(476,307ポイント)   Date: 2009/12/10(木) 02:04   No:43731     
Title: Re:Justyさんが作成した炎サンプルを利用して    
 なるほど。
 多分、stage_countがボス戦中カウントが進んでいないので、
消したはずの火がすぐに際復活(生成)してしまうのでしょう。

 なんか、生成と破棄の条件はもう少し見直す必要がありそうですね。
(というか、ボスの開始と終了の条件判定をしている boss_shot_mainとか enter_bossの中で
やった方がいいような)


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

Name: kai  ..中級者(10,291ポイント)   Date: 2009/12/10(木) 21:02   No:43756 解決!     
Title: Re:Justyさんが作成した炎サンプルを利用して    

Justyさん、ありがとうございます。一応
// メインループ
void effect_fire_main(){
//開始時間なら
if((stage_count==boss.appear_count[0] || stage_count==boss.appear_count[1]) && !boss.pFireEffect){
boss.pFireEffect = new Effect::Fire; //生成
}
//ボスがいる、かつサウンドノベル処理でないならば
if(boss.flag==1 && boss.boss_wait_flag==0 && boss.pFireEffect){
//火エフェクト移動
boss.pFireEffect->SetPosition(vector2(static_cast<float>(boss.dx+FX), static_cast<float>(boss.dy+23+FY)));
boss.pFireEffect->SetScale((float)boss.fire_cnt); //火エフェクト拡縮
boss.pFireEffect->Update(); //火エフェクト更新
boss.pFireEffect->Draw(); //火エフェクト表示

//if(boss.hp<2000){ //ボスが死にそうなら
// boss.pFireEffect->SetUseSmoke(1); //煙エフェクト表示
//}
}

#define BOSS_POS2_Y (-150) //中ボスが逃げるY座標の位置
//中ボス逃走中で指定の位置に移動、かつ中ボスの出すべき弾幕をだしきったら
if(boss.state==3 && boss.y <= BOSS_POS2_Y+1 && boss.knd==boss.danmaku_num[0]){
delete boss.pFireEffect; //破棄
boss.pFireEffect = NULL;
}
//弾幕中で体力が無くなる、または時間切れ、かつボスの出すべき弾幕をだしきったら【つまりボスが死亡したら】
if(boss.state==2 && (boss.hp<=0 || boss.endtime<=0) && boss.knd==boss.danmaku_num[1]){
delete boss.pFireEffect; //破棄
boss.pFireEffect = NULL;
}
}

とすることで、なんとか初期化に成功しました。
これで炎は完璧に結合することができました。
Justyさんのおかげです。本当にありがとうございました><
スルーしてましたが、html?みたいなもので
修正箇所が簡単に分かる、あれも凄いですね。初めてみましたw

あとは、煙なんですが、どうしても処理落ちしてしまうのが現在の問題ですが
なんとか、これは自力で解決してみたいです。
最後に、炎の絵についてお聞きしたいのですが、
Justyさんのサンプルについてたfire64.ddsとfire64.png
これはどう違う画像なんでしょうか?
ddsなんて拡張子は初めてみたのですが、
使うとしたら、どちらのほうが良いのでしょうか?


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

Name: Justy  ..伝説なるハッカー(477,799ポイント)   Date: 2009/12/10(木) 22:11   No:43761     
Title: Re:Justyさんが作成した炎サンプルを利用して    

> これで炎は完璧に結合することができました

 元々は出ればいいだけのサンプルでしたので、あまりゲーム内にそのままの形で
組み込まれることは想定していませんでした。

 そういう面で前のスレでも書きましたが、実行効率とか最適化とかは
されていないので、そのあたりを追々自分好みに直してみて下さい。



> 修正箇所が簡単に分かる

 そういうツールがあります。

WinMerge 日本語版
http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html#screenshots

差分表示ソフト Rekisa
http://frozenlib.net/rekisa/



> なんとか、これは自力で解決してみたいです。

 わかりました。
 がんばって下さい。



> fire64.ddsとfire64.png
> これはどう違う画像なんでしょうか?

 LoadGraphで読み込んで表示させてみるとわかりますが、中身は同じです。
(厳密には DDSの方は非可逆圧縮がかかってるので、全く同じではないです)

 DirectXでよく使われるフォーマットです。

DirectDraw Surface - Wikipedia
http://ja.wikipedia.org/wiki/DirectDraw_Surface



> 使うとしたら、どちらのほうが良いのでしょうか

 DXライブラリ上では大差ないのでお好みで、ってところなのですが、
まぁ扱い易い PNGでいいのでないでしょうか。


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

Name: kai  ..中級者(10,264ポイント)   Date: 2009/12/10(木) 22:51   No:43765     
Title: Re:Justyさんが作成した炎サンプルを利用して    
なるほど。わかりました。
色々と教えていただきありがとうございました!


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +