C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   画像の平均化   
     ・[44420] kazuoni 
   斜め坂について   
     ・[43151] softya 
     ・[43306] TKOZ 
     ・[43361] TKOZ 
     ・[43363] TKOZ 
     ・[43395] softya 
     ・[43454] softya 
     ・[43528] TKOZ 
     ・[43531] softya 
     ・[43708] TKOZ 
     ・[43711] softya 
     ・[43715] softya 
     ・[43802] TKOZ 
     ・[43809] softya 
     ・[43959] TKOZ 
     ・[43962] softya 
     ・[44142] TKOZ 
     ・[44180] softya 
     ・[44224] softya 
     ・[44407] TKOZ 
     ・[44409] softya 
   課題   
     ・[44215] sizuma 
     ・[44216] non 
     ・[44217] softya 
     ・[44218] たかぎ 
     ・[44220] Naohiro19 
     ・[44303] null 
     ・[44307] non 
     ・[44308] ねこ 
     ・[44314] null 
     ・[44317] たかぎ 
     ・[44322] sizuma 
     ・[44332] null 
     ・[44333] null 
     ・[44335] sizuma 
     ・[44337] たかぎ 
     ・[44363] non 
     ・[44366] sizuma 
   ビルドができません。   
     ・[44324] softya 
     ・[44334] アーロン 
     ・[44339] softya 
     ・[44362] アーロン 
   関数   
     ・[44347] sizuma 
     ・[44349] 愛川 
     ・[44352] Ma 
     ・[44361] たかぎ 
   ACMの問題   
     ・[44348] sizuma 
     ・[44350] bun 
     ・[44351] mats 
     ・[44353] bun 
     ・[44354] mats 
     ・[44355] bun 
     ・[44356] mats 
     ・[44357] bun 
     ・[44358] mats 
     ・[44359] bun 
   3Dエフェクト:風   
     ・[44196] Justy 
     ・[44203] Ma 
     ・[44326] Justy 
     ・[44342] Ma 
   四角形の描画   
     ・[43782] lbfuvab 
     ・[43786] kazuoni 
     ・[43792] lbfuvab 
     ・[43799] kazuoni 
     ・[43837] lbfuvab 
     ・[43858] kazuoni 
     ・[43859] kazuoni 
     ・[43898] Justy 
     ・[43912] kazuoni 
     ・[43976] Tatu 
     ・[44085] lbfuvab 
     ・[44131] kazuoni 
     ・[44193] Justy 
     ・[44341] lbfuvab 
   無題   
     ・[44237] たかぎ 
     ・[44238] non 
     ・[44239] らふ 
     ・[44240] らふ 
     ・[44241] softya 
     ・[44270] ねこ 
     ・[44294] たかぎ 
     ・[44297] ミミ 
     ・[44305] ねこ 
     ・[44306] たかぎ 
     ・[44311] ねこ 
     ・[44312] たかぎ 
     ・[44315] Dixq (管理人) 
     ・[44331] たかぎ 
   無題   
     ・[44279] うっきー 
     ・[44280] Dixq (管理人) 
     ・[44282] Dixq (管理人) 
     ・[44286] うっき 
     ・[44320] Dixq (管理人) 
   無題   
     ・[44117] Dixq (管理人) 
     ・[44119] non 
     ・[44120] Dixq (管理人) 
     ・[44122] Dixq (管理人) 
     ・[44123] お願いします! 
     ・[44126] lbfuvab 
     ・[44127] Dixq (管理人) 
     ・[44128] たかぎ 
     ・[44129] Dixq (管理人) 
     ・[44130] たかぎ 
     ・[44132] Dixq (管理人) 
     ・[44133] non 
     ・[44134] softya 
     ・[44135] たかぎ 
     ・[44304] やそ 
   エラーになるのですが   
     ・[44153] non 
     ・[44157] C言語 
     ・[44164] デラ初心者 
     ・[44165] non 
     ・[44168] デラ初心者 
     ・[44170] box 
     ・[44174] Dixq (管理人) 
     ・[44175] non 
     ・[44176] たかぎ 
     ・[44206] デラ初心者 
     ・[44230] Naohiro19 
     ・[44293] デラ初心者 
   TextDrowについて   
     ・[44186] たこやき 
     ・[44192] たいちう 
     ・[44198] たこやき 
     ・[44209] たいちう 
     ・[44242] たこやき 
     ・[44243] たいちう 
     ・[44245] たこやき 
     ・[44246] たいちう 
     ・[44247] たこやき 
     ・[44252] たいちう 
     ・[44254] たこやき 
     ・[44257] たいちう 
     ・[44258] たこやき 
     ・[44260] YuO 
     ・[44265] たいちう 
     ・[44268] たこやき 
     ・[44272] softya 
     ・[44273] YuO 
     ・[44275] たいちう 
     ・[44278] softya 
     ・[44284] たこやき 
     ・[44287] たこやき 
     ・[44289] YuO 
     ・[44291] たこやき 
   警告が消えません   
     ・[44211] Mist 
     ・[44277] jay 
   龍神録 ポーズ中の効 ....   
     ・[44020] Dixq (管理人) 
     ・[44043] 初心者 
     ・[44044] 初心者 
     ・[44107] 初心者 
     ・[44109] ひよこ 
     ・[44110] ひよこ 
     ・[44115] Dixq (管理人) 
     ・[44141] 初心者 
     ・[44178] Dixq (管理人) 
     ・[44181] 初心者 
     ・[44271] 通りすがり 
   無題   
     ・[44249] らふ 
     ・[44250] らふ 
     ・[44251] Naohiro19 
   行列について(c++)   
     ・[44200] kos-mos 
     ・[44201] kos-mos 
     ・[44202] kos-mos 
     ・[44207] non 
     ・[44221] kos-mos 
     ・[44222] Mist 
     ・[44223] sizuma 
     ・[44225] kos-mos 
     ・[44226] sizuma 
     ・[44227] non 
     ・[44228] kos-mos 
   無題   
     ・[44114] softya 
     ・[44121] non 
     ・[44212] たかぎ 
     ・[44214] non 
     ・[44219] sizuma 
   点数アイテムの吸収   
     ・[43718] Justy 
     ・[43719] ft 
     ・[43720] ft 
     ・[43723] Justy 
     ・[43724] ft 
     ・[43725] Justy 
     ・[43726] ft 
     ・[43766] Justy 
     ・[43867] ft 
     ・[43883] Justy 
     ・[43906] ft 
     ・[43977] Justy 
     ・[44071] ft 
     ・[44103] ft 
     ・[44190] Justy 
     ・[44194] ft 
   DXライブラリでsnapsh ....   
     ・[44047] 山崎 
     ・[44048] むつ 
     ・[44049] 山崎 
     ・[44050] チルチル 
     ・[44052] むつ 
     ・[44053] Libra 
     ・[44054] 初心者 
     ・[44055] チルチル 
     ・[44056] むつ 
     ・[44057] Libra 
     ・[44058] チルチル 
     ・[44059] むつ 
     ・[44060] チルチル 
     ・[44061] むつ 
     ・[44062] チルチル 
     ・[44066] y 
     ・[44144] むつ 
     ・[44167] y 
     ・[44182] ねこ 
     ・[44183] むつ 
     ・[44191] チルチル 
   DXライブラリ:テクス ....   
     ・[44037] Justy 
     ・[44072] Ma 
     ・[44074] Ma 
     ・[44188] Justy 
   書き換えについて   
     ・[43964] Dixq (管理人) 
     ・[44034] サンタクロース 
     ・[44039] Dixq (管理人) 
     ・[44172] サンタクロース 
     ・[44177] Dixq (管理人) 
     ・[44179] yu 
   ポインタと関数を用い ....   
     ・[44137] たかぎ 
     ・[44138] ゆり 
     ・[44140] たかぎ 
     ・[44143] ゆり 
     ・[44145] Dixq (管理人) 
     ・[44148] Dixq (管理人) 
     ・[44149] Dixq (管理人) 
     ・[44150] たかぎ 
     ・[44151] ゆり 
     ・[44154] Dixq (管理人) 
     ・[44155] Dixq (管理人) 
     ・[44156] Dixq (管理人) 
     ・[44160] ゆり 
     ・[44161] non 
     ・[44162] Dixq (管理人) 
     ・[44163] ゆり 
     ・[44169] ゆり 
     ・[44171] Dixq (管理人) 
     ・[44173] たかぎ 
   エラーについて   
     ・[44159] Dixq (管理人) 
   無題   
     ・[44087] lbfuvab 
     ・[44091] 光翼型近接支援残酷超初心者 
     ・[44093] 初級者 
     ・[44099] YuO 
     ・[44102] non 
     ・[44113] YuO 
     ・[44125] たかぎ 
     ・[44152] ヤクザマンション 
   再描画について   
     ・[43969] Dixq (管理人) 
     ・[43971] たこやき 
     ・[43973] TKOZ 
     ・[43975] たこやき 
     ・[43989] softya 
     ・[43990] たこやき 
     ・[43996] たこやき 
     ・[43998] たこやき 
     ・[43999] たこやき 
     ・[44002] softya 
     ・[44004] たこやき 
     ・[44010] softya 
     ・[44011] たこやき 
     ・[44012] たこやき 
     ・[44013] softya 
     ・[44018] たこやき 
     ・[44063] たこやき 
     ・[44064] softya 
     ・[44067] たこやき 
     ・[44068] たこやき 
     ・[44077] たいちう 
     ・[44079] たこやき 
     ・[44082] たいちう 
     ・[44084] softya 
     ・[44089] たこやき 
     ・[44090] たこやき 
     ・[44092] たこやき 
     ・[44094] softya 
     ・[44095] たこやき 
     ・[44100] たこやき 
     ・[44105] たこやき 
     ・[44108] softya 
     ・[44139] たこやき 
   無題   
     ・[44124] Dixq (管理人) 
   ビットマップ画像の10 ....   
     ・[43896] Dixq (管理人) 
     ・[44026] SIT 
     ・[44027] SIT 
     ・[44028] SIT 
     ・[44035] Libra 
     ・[44106] SIT 
     ・[44116] non 
     ・[437891261047875] SIT 
   二次元正規分布 1回目 ....   
     ・[44104] non 
   二次元正規分布 プロ ....   
   構造体   
     ・[43829] たいちう 
     ・[43831] 天和 
     ・[43833] たいちう 
     ・[43834] 天和 
     ・[43848] non 
     ・[43849] たかぎ 
     ・[43857] example 
     ・[43863] 天和 
     ・[44007] Naohiro19 
     ・[44086] 天和 
   図形描画関数   
     ・[44075] Ma 
     ・[440691260951210] 夏天 
   弾を残像させる方法に ....   
     ・[43872] softya 
     ・[43892] Dixq (管理人) 
     ・[43932] yrao 
     ・[43942] softya 
     ・[43944] yrao 
     ・[43951] softya 
     ・[43953] yrao 
     ・[43956] softya 
     ・[43960] yrao 
     ・[43961] softya 
     ・[43980] yrao 
     ・[43987] softya 
     ・[44029] yrao 
     ・[44030] softya 
     ・[44041] yrao 
     ・[44051] softya 
     ・[438251261004469] yrao 
     ・[438251261004873] yrao 

Name: SIT  ..かけだし(2,209ポイント)   Date: 2009/12/17(木) 20:41   No:44413       
Title: 画像の平均化    
画像の10×10のピクセルの平均化をしたいのですが、どのようにプログラミングしたらよろしいでしょうか??

考えているのは、1ピクセル毎に(r+g+b)/3=グレーをして

そのあとに10×10の中のグレーを全て足して100で割ろうかという方法を考えています。



// データをコピーする
    // x, y はコピー先の座標
        for ( y = 0; y < bi1.biHeight; y++ ) {
            for ( x = 0; x < bi1.biWidth; x++ ) {
                data1[ y ][ x ].rgbtBlue =
                    (int)data[ y * 10+1 ][ x * 10 ].rgbtBlue / 10;  
                data1[ y ][ x ].rgbtGreen =
                    (int)data[ y * 10+1 ][ x * 10 ].rgbtGreen / 10;
                data1[ y ][ x ].rgbtRed =
                    (int)data[ y * 10+1 ][ x * 10 ].rgbtRed /10;
                
        }
    }
    // 出力ファイルを開く
        
        printf( "%s というファイルを作成します\n", filename1 );
        fp1 = fopen( filename1, "wb" );
        if ( !fp1 ) {
            printf("ファイルの作成に失敗しました\n");
            return 0;
        }

    // ファイルにデータを書き込む
        fwrite( &bf, sizeof(BITMAPFILEHEADER), 1, fp1 );
        fwrite( &bi1, sizeof(BITMAPINFOHEADER), 1, fp1 );
        fwrite( buf1, BufferSize1, 1, fp1 );
    // ファイルを閉じる
        fclose(fp1);
        return 0;
        }
    


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


Name: kazuoni [URL]  ..ハッカー(119,117ポイント)   Date: 2009/12/17(木) 21:29   No:44420     
Title: Re:画像の平均化    
まだ駆け出しなので、意に合わない回答になるかもしれませんが・・・

> 画像の10×10のピクセルの平均化をしたいのですが、

平均化フィルタの作成っということでしょうか?
それならば、線形フィルタの計算をすればよいのではないでしょうか。
(10*10となると、かなりボヤボヤになってしまいそうな気がしますが。。)

> 1ピクセル毎に(r+g+b)/3=グレーをして 
> そのあとに10×10の中のグレーを全て足して100で割ろうかという方法

これを求めるのであれば、おっしゃる通りにすればよいかと思いますが・・・
これってピクセルの平均化っていうのかなってのが正直な意見です。。
(重ねて言いますが、まだ駆け出しですので、的外れでしたらごめんなさい。。)


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



Name: TKOZ  ..熟練のプログラマー(42,345ポイント)   Date: 2009/12/03(木) 04:15   No:43087       
Title: 斜め坂について    
現在、テスト用として、Windows用のアプリケーションを作成中です。
cc65ではなく、普通のゲームです。

そこで、アクションゲームの斜め坂を実験として、取り入れる事にしました。

現状は、坂道以外は正常にマップチップによる当たり判定が行われています。

当たり判定の方法は、こちらを読みました。
http://javagame.skr.jp/index.php?%A5%D6%A5%ED%A5%C3%A5%AF%A4%C8%A4%CE%BE%D7%C6%CD

しかし、坂道の当たり判定がうまくいかず、困っています。

そこで、過去ログを読みました。

斜め45度の坂道ならば、zwiさんの投稿で

マップチップ内の相対x = キャラクタ座標のX座標 - マップチップの先端X座標
マップチップ内の相対y = マップチップ内の相対x
キャラクタ座標のY座標 = マップチップの先端Y座標 + マップチップ内の相対y
って具合でキャラクタのY座標が計算できます。

と書いてありました。

しかし、どうやって、マップチップの先端座標を取得するのか分からず、困っています。
また、マップチップに入った途端に計算するのか、それとも、三角形の当たり判定をすべきなのか
よく分かりません。どうか、教えてください。


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


Name: softya  ..熟練のプログラマー(57,645ポイント)   Date: 2009/12/03(木) 15:45   No:43151     
Title: Re:斜め坂について    
>マップチップ内の相対x = キャラクタ座標のX座標 - マップチップの先端X座標
>マップチップ内の相対y = マップチップ内の相対x
>キャラクタ座標のY座標 = マップチップの先端Y座標 + マップチップ内の相対y
>って具合でキャラクタのY座標が計算できます。 

>しかし、どうやって、マップチップの先端座標を取得するのか分からず、困っています。
キャラが立っているマップチップが分かるなら、マップチップの4点の座標は計算できると思いますが、それとも違う意味で聞いてらっしゃいます?

>また、マップチップに入った途端に計算するのか、それとも、三角形の当たり判定をすべきなのか
よく分かりません。どうか、教えてください。

斜めの坂と言ってもマップチップが32ドット程度なら、ドットサイズのサブマップチップだと考えてサブマップチップで当たり判定するのも一つの方法です。

こうなっている坂があるとして、
 /□1
□□□2
ABC
B-1の位置の斜めの坂をドット単位(例として8ドットで表現)
       □
      □□
     □□□
    □□□□
   □□□□□
  □□□□□□
 □□□□□□□
□□□□□□□□

の形状に並んでいるサブマップチップだと思って当たり判定します。
これなら現状の当たり判定の応用で出来ると思いますけど。どうでしょうか?


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

Name: TKOZ  ..熟練のプログラマー(42,533ポイント)   Date: 2009/12/04(金) 12:46   No:43306     
Title: Re:斜め坂について    
>キャラが立っているマップチップが分かるなら、マップチップの4点の座標は
>計算できると思いますが、それとも違う意味で聞いてらっしゃいます? 
図を描きながら計算したら、簡単にマップチップの先端座標を取得できる事が分かりました。
例えば、sentanx=(Player.x+16)/32*32;sentany=(Player.y+31)/32*32;
で取得できそうです。

>斜めの坂と言ってもマップチップが32ドット程度なら、
>ドットサイズのサブマップチップだと考えてサブマップチップで当たり判定するのも一つの方法です。 
ちょっとよく分かりません。サブマップチップとは何でしょうか?

とりあえず、現状のソースコードを載せるので、アドバイスを下さい。


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

Name: TKOZ  ..熟練のプログラマー(42,766ポイント)   Date: 2009/12/04(金) 20:07   No:43361     
Title: Re:斜め坂について    
一応、書いておきますが、自分なりには坂道のアルゴリズムを
考えているつもりです。
今まで、ずっと考えていましたが、答えが出せなかったのです。
このアップロードファイルは、ygs2k(YaneuraoGameScript2000)で
今までに考えたアルゴリズムをまとめたものです。
2Dゲームを作るにはまだ、経験不足か、実力が足りないという事でしょうか?

http://ppup.dip.jp/uploader/download/1259924801.zip
pass:tkoz


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

Name: TKOZ  ..熟練のプログラマー(42,790ポイント)   Date: 2009/12/04(金) 21:12   No:43363     
Title: Re:斜め坂について    
>>サブマップチップ
1ドットずつ当たり判定を行うという事で、よろしいでしょうか?


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

Name: softya [URL]  ..熟練のプログラマー(61,488ポイント)   Date: 2009/12/05(土) 00:37   No:43395     
Title: Re:斜め坂について    
>ドットずつ当たり判定を行うという事で、よろしいでしょうか?

出かけていたので、返事が遅くなりました。申し訳ないです。
32X32ドットのブロックで当たり判定しているのを、坂道だけは1X1ドットのブロックがあると仮定して当たり判定します。
ブロックと接触しているかを判定しているルーチンをこのときだけ1X1で行うことになります。

>2Dゲームを作るにはまだ、経験不足か、実力が足りないという事でしょうか? 

この手のアルゴリズムは試行錯誤を重ねるしか無いですね。
私も横スクロールは経験不足ですよ。平面スクロールのゲームは作った事があるんですが。
なので、一緒に考えていきましょう!

まぁ、ゲームなんてやりたい動きが出来るアルゴリズムを考え付くかが勝負って面がありますからね。
例えば「海腹川背」ってゲームがあるんですが、PSP版がすごく評判が悪いんです。SFC・PS版が原型にあるんですが、PSP版を担当したプログラマが原型のアルゴリズムを理解できない?あるいは力量不足で再現できなったためすごく出来の悪いゲームなりました。最新のDS版はSFC・PS版を担当したプログラマが作業したため完璧と言われています。PSP版の人も見ための動きからアルゴリズムを再現しようとしたんでしょうけどね。ソースは解読できなかったのかなぁと思います。
なので、思った動き出来る良いアルゴリズムを考え付くまで試行錯誤してみましょう。

すいませんソース見るの明日にさせてください。
よく検討してみますので。龍神録XNA 19章が終わったので少し余力が出来ました。


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

Name: softya [URL]  ..熟練のプログラマー(61,648ポイント)   Date: 2009/12/05(土) 19:19   No:43454     
Title: Re:斜め坂について    
ソースコード見ました。
移動後に補正するには、坂道を登る場合に問題がある気がします。

とりあえず、このコードベースに坂道処理を考えて見ます。アルゴリズムを検討中でまだ時間が掛かりそうですけどね。例えばスーパーマリオ3あたりが坂道を実装しているので、ファミコンで出来る程度のなるべく軽い処理で検討中です。



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

Name: TKOZ  ..熟練のプログラマー(42,962ポイント)   Date: 2009/12/06(日) 17:14   No:43528     
Title: Re:斜め坂について    
>例えばスーパーマリオ3あたりが坂道を実装しているので、
>ファミコンで出来る程度のなるべく軽い処理で検討中です。 
ファミコンで出来る程度のなるべく軽い処理ですか…私には思いつけません。
例えば、この間、ファミコンでブロック崩しを作ったのですが、
激重で、for(i=0;i<5;i++){for(j=0;j<16;j++){Block[i][j].…}}
といった処理を行ったのですが、メインループ内に
for文はきつい気がしました。


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

Name: softya [URL]  ..熟練のプログラマー(62,009ポイント)   Date: 2009/12/06(日) 18:16   No:43531     
Title: Re:斜め坂について    
ごめんなさい。まだ出来てませんね。
なかなか手ごわいですわ。


>for(i=0;i<5;i++){for(j=0;j<16;j++){Block[i][j].…}} 

ファミコンクラスのCPUで2次元配列はやばいでしょうね。
一次元配列で処理するようにしてください。
Block[x+y<<4]でアクセスするのがひとつの手。
あるいは、ポインタアクセスだけでループするのも手です。
pBlock = Block;
for( i=0 ; i<(5*16) ; i++,pBlock++ ) {
 *pBlock
}
シーケンシャルな処理ならこれで十分です。

まぁ、アセンブラならもっと大技が駆使できるので高速化できます。


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

Name: TKOZ  ..熟練のプログラマー(43,687ポイント)   Date: 2009/12/09(水) 16:24   No:43708     
Title: Re:斜め坂について    
話が逸れますが、ブロック崩しで
ブロックとの当たり判定で関数Hit()を作りましたが、かなり重いです。
何が原因でしょうか?やはり、for文の2重ループでしょうか?

#define IDX (i+j<<4)

void Hit()
{
    char i=0,j=0;
    
    for(i=0;i<5;i++)
    {
        for(j=0;j<16;j++)
        {
            if(Block[IDX].flag==1)
            {
                if(Ball.y+4>Block[IDX].y && Ball.y<Block[IDX].y+8)
                {
                    if(Ball.x+4==Block[IDX].x || Ball.x==Block[IDX].x+16)
                    {
                        Ball.mx*=-1;
                        SetDraw(j*2,i+2,0x00);
                        SetDraw(j*2+1,i+2,0x00);
                        SetScroll(0, 0);
                        return;
                    }
                }
                if(Ball.x+4>Block[IDX].x && Ball.x<Block[IDX].x+16)
                {
                    if(Ball.y+4==Block[IDX].y || Ball.y==Block[IDX].y+8)
                    {
                        Ball.my*=-1;
                        SetDraw(j*2,i+2,0x00);
                        SetDraw(j*2+1,i+2,0x00);
                        SetScroll(0, 0);
                        return;
                    }
                }
            }
        }
    }
}



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

Name: softya [URL]  ..熟練のプログラマー(62,774ポイント)   Date: 2009/12/09(水) 16:37   No:43711     
Title: Re:斜め坂について    
斜め坂は迷走中。
作ってみると色々なワナがありますね〜。
◇形で当たり判定しないと坂上れない?など試行錯誤中。

>ブロック崩しで
こちらは、アセンブラコード見てみないと的確には答えられないかも知れません。
確かなのは、IDXの1重ループにして、IDXからiとjを求める様にしたほうが早いでしょう。
int IDX;
for( IDX=0 ; IDX<(5*16) ; IDX++ ) {
として
int i=IDX&0x0f;
int j=IDX>>4;
でi,jが求まります。
Blockも添え字処理のコード効率が悪いとすれば、ポインタに変えたほうが良いと思います。
cc65の最適化能力と6502の機械語コードの特性にもよるので断言は出来ませんが。


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

Name: softya [URL]  ..熟練のプログラマー(63,115ポイント)   Date: 2009/12/09(水) 18:27   No:43715     
Title: Re:斜め坂について    
>cc65の最適化能力と6502の機械語コードの特性にもよるので断言は出来ませんが。
今cc65でアセンブラコードを出して見てみましたが、相当効率の悪いコードが出ている様に見えます。
6502の機械語やcc65をまともに使った事も無いですが、if(Block[IDX].flag==1)のコードだけ見ても、そうとう命令数が多いです。

;
; if(Block[IDX].flag==1)
;
    ldx     #$00
    lda     (sp),y
    clc
    iny
    adc     (sp),y
    bcc     L02D4
    inx
L02D4:    jsr     shlax4
    jsr     mulax5
    clc
    adc     #<(_Block)
    sta     ptr1
    txa
    adc     #>(_Block)
    sta     ptr1+1
    ldy     #$04
    lda     (ptr1),y
    cmp     #$01
    jne     L0147


ちゃんと解読してませんが、添え字の計算が前半でshlax4はシフト?やらmulax5は掛け算?などの重そうな処理が使われています。処理の後半のBlockのflag参照も色々面倒ですね。


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

Name: TKOZ  ..熟練のプログラマー(44,047ポイント)   Date: 2009/12/11(金) 09:07   No:43802     
Title: Re:斜め坂について    
ネットカフェから書き込みです。
void Hit()
{
    char i=0,j=0;
    
         i=Ball.x/16;
         j=Ball.y/8;    

        if(Block[IDX].flag==1)
        {
            if(Ball.y+4>Block[IDX].y && Ball.y<Block[IDX].y+8)
            {
                if(Ball.x+4==Block[IDX].x || Ball.x==Block[IDX].x+16)
                {
                    Ball.mx*=-1;
                    SetDraw(j*2,i+2,0x00);
                    SetDraw(j*2+1,i+2,0x00);
                    SetScroll(0, 0);
                    return;
                }
            }
            if(Ball.x+4>Block[IDX].x && Ball.x<Block[IDX].x+16)
            {
                if(Ball.y+4==Block[IDX].y || Ball.y==Block[IDX].y+8)
                {
                    Ball.my*=-1;
                    SetDraw(j*2,i+2,0x00);
                    SetDraw(j*2+1,i+2,0x00);
                    SetScroll(0, 0);
                    return;
                }
                 }
        }
    }


とかは無理でしょうか?


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

Name: softya [URL]  ..熟練のプログラマー(63,014ポイント)   Date: 2009/12/11(金) 10:35   No:43809     
Title: Re:斜め坂について    
良いアイデアですよ。
ただ、同時に2〜3ブロックに当たる可能性があるので最小限のループは必要ですね。

それとBlock[IDX]よりもポインタに変えた方が早いと思います。
こんな感じで。
Block_ *pBlock;
pBlock = &Block[IDX];
でポインタでアクセスです。
*pBlock
たぶん、これで早くなるかと。


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

Name: TKOZ  ..熟練のプログラマー(44,084ポイント)   Date: 2009/12/12(土) 22:28   No:43959     
Title: Re:斜め坂について    
*pBlockは、if(*pBlock->flag)でアクセスできますか?
正直ポインタはよく分かってません。


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

Name: softya  ..熟練のプログラマー(64,711ポイント)   Date: 2009/12/12(土) 23:12   No:43962     
Title: Re:斜め坂について    
>*pBlockは、if(if(*pBlock->flag))でアクセスできますか?
>正直ポインタはよく分かってません。
cc65で高速化したかったら、ぜひポインタは覚えたほうが良いですよ。
今のままじゃ高速化にも限度があります。

この場合は
if(pBlock->flag)
が正解です。
*pBlockはポインタ参照してねって意味で書いただけです。



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

Name: TKOZ  ..熟練のプログラマー(44,166ポイント)   Date: 2009/12/15(火) 20:02   No:44142     
Title: Re:斜め坂について    
最小限のループはどうやって組めばいいか分かりません。
Block_ *pBlock;

for(i=-3;i<3;i++)
{
    for(j=-3;j<3;j++)
    {
        pBlock=&Block[i][j];
        if(pBlock->flag==1)
        ,,,??? 
    }
}

どうやって組めばいいでしょうか?


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

Name: softya  ..熟練のプログラマー(67,316ポイント)   Date: 2009/12/15(火) 22:45   No:44180     
Title: Re:斜め坂について    
ざっと単純に組んでみました。コンパイルしてないのでエラーが有るかもしれません。
実際にはボールの大きさ次第で当たり判定しなくても良い場合が考えられますので、まだ工夫の余地はあります。
あとは、本当はアセンブルリストを見比べながら効率のよいコードを探っていかないとダメですので、かなり時間が掛かります。流石にそこまで時間が無いのでご容赦ください。


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

Name: softya  ..熟練のプログラマー(67,613ポイント)   Date: 2009/12/16(水) 12:42   No:44224     
Title: Re:斜め坂について    
補足として6502など貧弱なCPUの場合の高速化のテクニックですが、

(1)構造体配列や構造体ポインタからアクセスは出来るだけ避ける。ただの変数参照の方が早い。
 (a)x
 (b)pBlock->x
 (c)Block[i][j].x
の順で重くなります。

(2)配列の添字は出来るだけ使わない。
→ Block[i][j]などは激烈に重い。

(3)事前に計算できるものは計算を済ませておく。
→ Ball.x+4など何度も計算させない。

(4)ローカル変数よりもグローバル変数の方が軽い。
理由はローカル変数がスタックポインタ相対アドレスの変数だからです。

などがあると思います。
思いついたやつだけですが・・・。


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

Name: TKOZ  ..熟練のプログラマー(44,179ポイント)   Date: 2009/12/17(木) 18:42   No:44407     
Title: Re:斜め坂について    
>>softyaさんへ

若干ソースを弄りましたが、うまく当たり判定が動きました。
ありがとうございました。
これで、ブロック崩しもうまく完成しそうです。


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

Name: softya  ..熟練のプログラマー(69,959ポイント)   Date: 2009/12/17(木) 19:08   No:44409     
Title: Re:斜め坂について    
うまく動きましたか。良かったです。

斜め坂の方は時間が取れなくて保留中です。
もう少しまとまったらアップロードする予定ではいますけど。
→現在は斜め坂に刺さる場合があり処理を再検討中です。


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



Name: null  ..かけだし(1,856ポイント)   Date: 2009/12/16(水) 11:04   No:44213       
Title: 課題    
下のプログラムを実行すると、エラーがでるのですが理由がわかりません。
 疑問や書き方、おかしいと思われるところがあれば教えていただけるとありがたいです。

#include<stdio.h>
struct syuppi
{
    char name[21];
   unsigned int bunrui;
    int year,month,day,cost;
};
int main()
{
struct syuppi data[100]; int i,j,stop;
  FILE *fp;
if(fp=fopen("syuppi.txt","a")==NULL)  
{   printf("can`t open file.");  return;}

for(i=0;;i++)
{
    printf("年");
    scanf("%d",&data[i].year); if(data[i].year==0) { printf("終了します。");    return;}
    printf("月");
    scanf("%d",&data[i].month);
    printf("日");
    scanf("%d",&data[i].day);
    printf("分類");
    scanf("%d",&data[i].bunrui);
    printf("出費");
    scanf("%d",&data[i].cost);
    printf("名前");
    scanf("%s",&data[i].name);
}


for(j=0;j<i;j++)
{
    fprintf(fp,"%s %d %d %d %d %d\n",&data[j].name,data[j].bunrui,data[j].year,data[j].month,data[j].day,data[j].cost);
}

fclose(fp);
return(0);
}


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


Name: sizuma  ..上級者(19,028ポイント)   Date: 2009/12/16(水) 11:21   No:44215     
Title: Re:課題    
 ・ (提示してある場合)自分が書いたソースプログラムはどこからどこまでなのか教えて下さい
 ・ ソースコードは< pre>と< /pre>のタグで囲んでください
 詳しくはこの掲示板の使い方をご覧ください→ http://dixq.net/board/board.html


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

Name: non  ..比類無きプログラマー(82,404ポイント)   Date: 2009/12/16(水) 11:23   No:44216     
Title: Re:課題    
おかしなところはいっぱいありそうですが、まず、何のエラーか示してください。
Cなら、警告だけのような気がするのですが・・・
C++ならエラーかも。


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

Name: softya  ..熟練のプログラマー(67,537ポイント)   Date: 2009/12/16(水) 11:32   No:44217     
Title: Re:課題    
とりあえず、「規約と注意事項」をよく読んで捕捉してください。

規約と注意事項
http://dixq.net/board/board.html

特にテンプレを見て足らないを補足してほしいのとC言語系だと思われますので、使っているコンパイラの名称とC言語系の規格でC90,C99,C++のどれかも明確にしてくださいね。


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

Name: たかぎ [URL]  ..ハッカー(137,260ポイント)   Date: 2009/12/16(水) 11:45   No:44218     
Title: Re:課題    
> エラーがでるのですが理由がわかりません。

規約を守っていないので、回答もエラーメッセージだらけになります。


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

Name: Naohiro19  ..かけだし(1,907ポイント)   Date: 2009/12/16(水) 12:02   No:44220     
Title: Re:課題    
家計簿のプログラムを作ろうとしてるのですか?

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

Name: null  ..かけだし(2,216ポイント)   Date: 2009/12/16(水) 21:08   No:44303     
Title: Re:課題    
コンパイラ :  Microsoft Visual C++ 2008 
言語  :  詳しくはわからないのですが、調べてみるとc99だと思います。
   

>>(提示してある場合)自分が書いたソースプログラムはどこからどこまでなのか教えて下さい。
全部なのですが・・・もしかして自分はおかしいことを言っているのですか?

>>家計簿のプログラムを作ろうとしてるのですか?
課題としてこういうのを作れと言われただけなので、家計簿なのかはわかりませんが、特になにかを作っているわけではないと思います。 構文などを理解してるかどうかを調べているのかもしれません。

すいません勘違いで、エラーではなくテキストに書き込めてないということです。本当すいません。

いろいろ規約違反ですいません。コメントにタグが使えるのか疑問だったので・・・。
ソールコードの前後に
 
を挟むだけで良いのでしょうか?htmlみたいな感じですか?
 


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

Name: non  ..比類無きプログラマー(82,725ポイント)   Date: 2009/12/16(水) 21:23   No:44307     
Title: Re:課題    
まず、評価される優先順位を考えて
if((fp=fopen("syuppi.txt","a"))==NULL) 

次に、年を入力して終了の時のreturnですが、returnしたら終わってしまって出力できません。

can`t open fileのreturnも何か値を返すようにします。


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

Name: ねこ  ..熟練のプログラマー(50,875ポイント)   Date: 2009/12/16(水) 21:26   No:44308     
Title: Re:課題    
>nullさん
HTMLみたいにソース部分を<Pre>タグで囲めばOKです。

結果に関しては
・ファイルが出来ない
・ファイルはあるが何も書かれていない
等思いつきますが、具体的にどう動いて欲しくてこうなってしまう、というように書くと良いかと思います。

とりあえず
if( fp = fopen( "syuppi.txt", "a" ) == NULL )
これは
if( ( fp = fopen("syuppi.txt", "a" ) ) == NULL )

こうな気がします。


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

Name: null  ..かけだし(2,441ポイント)   Date: 2009/12/16(水) 22:40   No:44314     
Title: Re:課題    
訂正ありがとうございます。
>>次に、年を入力して終了の時のreturnですが、returnしたら終わってしまって出力できません。 
条件を書き忘れましたが、年の入力のときに0が入力された瞬間に終了するようにすることなのですが、確かにおっしゃる通りです。直したいのですが、returnで抜ける以外に方法があるのでしょうか?
  
>>can`t open fileのreturnも何か値を返すようにします。 
例えば1を返したとすると、どこにかえるのですか? 関数だったら呼び出したところですよね?
メイン関数だと・・・・??  もしメイン関数に1がreturnされたのなら意味があるのでしょうか?
すいませんくだらない質問で。

>>HTMLみたいにソース部分を<Pre>タグで囲めばOKです。
ありがとうございます。次から自信を持って使います。

>>具体的にどう動いて欲しくてこうなってしまう、というように書くと良いかと思います。
ファイルはできていますので、書き込めていないのかと思います。上で訂正してくれた通りでreturnで出力できてないみたいです。

if文はすぐに直しました。


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

Name: たかぎ [URL]  ..ハッカー(138,655ポイント)   Date: 2009/12/16(水) 22:52   No:44317     
Title: Re:課題    
> 例えば1を返したとすると、どこにかえるのですか? 関数だったら呼び出したところですよね? 
> メイン関数だと・・・・??  もしメイン関数に1がreturnされたのなら意味があるのでしょうか? 

そのプログラムを呼び出したプログラムにかえります。
あるプログラムが、下請け処理を別のプログラムにまかせた場合、処理が成功したか失敗したかは(原則として)mainからの返却値を見るしかありません。
画面上に「エラー」と表示しても、それをプログラム的に認識するには、画像・文字認識を行わなければならないため、非常に難しくなります。



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

Name: sizuma [URL]  ..上級者(19,919ポイント)   Date: 2009/12/16(水) 23:15   No:44322     
Title: Re:課題    
>mainにreturn
Cの決まりですね。
Javaだとvoidですし、C#でもvoidです。
0以外が返された場合はたかぎさんの書いてるように失敗を呼び出し元に返すそうです。
(実際にどういう動作を呼び出しもとがしてるのかわからないので・・・)

さて、プログラムのほうを。
まず、次からじゃなくて、今最初のプログラムを編集してタグをつけてくれたら見やすくなります。

>returnで処理が終わってしまう
方法はなんだかんだ出来ると。
せっかくstopがあるんで僕はfor文からstopフラグの判定で抜け出すようにしました。
0が入力されたら、stopフラグをfalseにしてcontinueで再判定させて抜け出せばいいですね。
この場合だと、iは一つ多いと思うので、fprintfの判定を気をつけましょう。

あとは入力部分を関数にする
こうすればreturnで入力データを返せばいいですよね。

goto文を使う
まぁこんだけ単純な動作だったら使っても問題ないと。
使わなくてもできるんで使う必要もないけどね。

上のループの中に下の処理を入れる。
returnする前に処理を済ませてしまえばいいですね。
コードは見づらくなるでしょうけど。

他にも関数の書式が違ったりするんで、実際動かしてみて想定された結果と見比べてみればいい勉強になるでしょう。


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

Name: null  ..かけだし(2,469ポイント)   Date: 2009/12/17(木) 00:01   No:44332 解決!     
Title: Re:課題    
ありがとうございます。
おかげさまで無事解決しました。

continue・・・知らなかったです・・すいません。教わることなんて本当に基礎だけなんですね。構文をいろいろ調べてみることにします。

goto文おもしろそうなので今から使ってみます。


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

Name: null  ..かけだし(2,475ポイント)   Date: 2009/12/17(木) 00:01   No:44333     
Title: Re:課題    
テスト

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

Name: sizuma [URL]  ..上級者(20,280ポイント)   Date: 2009/12/17(木) 00:06   No:44335     
Title: Re:課題    
>goto
はわわ、使わなくてもいいならそれでいいんですよ^^;


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

Name: たかぎ [URL]  ..ハッカー(138,875ポイント)   Date: 2009/12/17(木) 00:13   No:44337     
Title: Re:課題    
> >goto 
> はわわ、使わなくてもいいならそれでいいんですよ^^;

使えるようにしておくのはよいことです。
実践的なプログラミングで、本当に必要かどうかは、使えるようになっていないと判断ができませんから。


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

Name: non  ..比類無きプログラマー(82,729ポイント)   Date: 2009/12/17(木) 08:34   No:44363     
Title: Re:課題    
あれれ、何でbreakって案は出てないの?



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

Name: sizuma  ..上級者(20,553ポイント)   Date: 2009/12/17(木) 09:53   No:44366     
Title: Re:課題    
間違いない^^;
こういうのって気づかないときは気づかないのは僕だけ?


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



Name: 初心者  ..熟練のプログラマー(45,308ポイント)   Date: 2009/12/16(水) 22:23   No:44313       
Title: ビルドができません。    

龍神録をビルドすると
>DxLib.lib(DxGateway.obj) : fatal error LNK1112: モジュールのコンピュータの種類 'X86' は対象コンピュータの種類 'x64' と競合しています。
という警告が出ます 。
ビルドができません。どうしてもお手上げのため質問させていただきます。
この警告はどうすれば消えるのでしょうか?

【環境につきましては】下記になります。
Windows7 64bit
Visual C++ 2008 Express Edition

お力をお貸しください。
よろしくお願いします



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


Name: softya  ..熟練のプログラマー(69,281ポイント)   Date: 2009/12/16(水) 23:29   No:44324     
Title: Re:ビルドができません。    
とりあえず、初心者と言う名前では個人を識別出来ないので名前を変えてもらって良いですか?
で、質問なのですがプロジェクトのプロパティで構成プロパティ→リンカ→詳細→対象コンピュータは何になっていますでしょうか?


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

Name: アーロン  ..ぴよぴよ(61ポイント)   Date: 2009/12/17(木) 00:02   No:44334     
Title: Re:ビルドができません。    
失礼しました。名前を初心者からアーロンという名前にさせていただきます。
ご指摘ありがとうございます。

>質問なのですがプロジェクトのプロパティで構成プロパティ→リンカ→詳細→対象コンピュータは何になっていますでしょうか?

MachineX64 (/MACHINE:X64)
になっています。


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

Name: softya  ..熟練のプログラマー(69,562ポイント)   Date: 2009/12/17(木) 00:22   No:44339     
Title: Re:ビルドができません。    
DXライブラリが32bit版のx86で作られていると思いますので、MachineX86 (/MACHINE:X86)に変えてもらって試してみてください。
 


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

Name: アーロン  ..ぴよぴよ(92ポイント)   Date: 2009/12/17(木) 08:04   No:44362 解決!     
Title: Re:ビルドができません。    
解決しました。
助かりました。
ありがとうございます。


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



Name: 愛川  ..かけだし(1,182ポイント)   Date: 2009/12/17(木) 01:56   No:44345       
Title: 関数    
OSはWindows、コンパイラはVisual C++です。

整数配列data の,data[left]からdata[right-1]の最小値がある添字番号を返す
関数int min_ind_ary(const int data[ ], int left, int right)
を作成しなさい。
最小値が複数あるときは,一番小さい添字を返すようにする。

という問題です。
以下のように考えましたが、プログラムに組み込んだ時にうまくいきません。
どなたかお願いいたします。

#include <stdio.h>
int min_ind_ary(const int data[ ], int left, int right){
    int i, work, min;
    scanf("%d", min);
    for(i = left + 1; i <= right - 1; i++){
        if(min > data[i]){
            min = data[i];
            work = data[min];
        }
    }
    printf("%d\n", work);
    return;
}


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


Name: sizuma [URL]  ..上級者(20,441ポイント)   Date: 2009/12/17(木) 02:16   No:44347     
Title: Re:関数    
どのような結果を想定してたんだけど、どんな結果になったかを書いてください。

>scanf("%d", min);
これはなんでしょうか?何のために入力させるんですか?
それとscanfの引数の書き方も間違えてますよ。

int型を返さなくてはいけないのに、returnで何も返してません。
というか添字を返すんですよね?ぱっとみ何処にも添字を持ってないようなのですが?


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

Name: 愛川  ..かけだし(1,342ポイント)   Date: 2009/12/17(木) 02:53   No:44349     
Title: Re:関数    
すみません。
以下のようなプログラムで整数配列dataを小さい順に並び替えるのに
関数int min_ind_ary(const int data[ ], int left, int right)
を使うという問題につながっています。
これだと「7164823594」という結果になりました。

#include <stdio.h>
void print_ary(const int data[], int size){
    int i;
    for(i = 0; i < size; i++){
        printf("%d", data[i]);
    }
    printf("\n");
    return;
}

#include <stdio.h>
int min_ind_ary(const int data[ ], int left, int right){
    int i, x, min = 10000, number[100];
    for(i = left; i <= right - 1; i++){
        if(min > number[i]){
            min = number[i];
            x = i;
        }
    }
    return(0);
}

void sort_ary (int data[ ], int size){
    int i;
    for(i = 0; i < size - 1; i ++ ) {
        int min, work;
        min = min_ind_ary(data, i, size);
        work = data[min];
        data[min] = data[i];
        data[i] = work;
    }
    return;
}

int main(void){
    int data[10] = {1,6,4,8,2,3,5,9,7,4};
    print_ary(data, 10);
    sort_ary(data, 10);
    print_ary(data, 10);
    return(0);
}


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

Name: Ma  ..上級者(24,627ポイント)   Date: 2009/12/17(木) 04:56   No:44352     
Title: Re:関数    
チェックしていませんが、参考までに
data配列のleft から right-1 までの中での最小のindexを返します。
#include <stdio.h>
int min_ind_ary(const int data[ ], int left, int right){
    int min_index = left;
    for(int i = left+1; i < right ; i++){
        if(data[min_index] > data[i]){
            min_index = i;
        }
    }
    return min_index;
}


チェックなしなのでミスとかあってもゆるしてください。


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

Name: たかぎ [URL]  ..ハッカー(139,144ポイント)   Date: 2009/12/17(木) 08:00   No:44361     
Title: Re:関数    
最小値の添字を求めたいのなら、
#include <algorithm>
int min_ind_ary(const int data[ ], int left, int right) 
{
  return std::min_element(data + left, data + right) - (data + left);
}

でよいのでは?
言語不明なので、C++でよいのかどうか知りませんが...


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



Name: bun  ..ぴよぴよ(532ポイント)   Date: 2009/12/17(木) 01:38   No:44344       
Title: ACMの問題    
初投稿になります
ACMの問題を解いています。お手数ですが問題は以下のURLからお願いします
http://www.acm-japan.org/past-icpc/domestic2008/problems/all_ja.html
解決しました。
協力してくださったお二方に大変感謝します。



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


Name: sizuma [URL]  ..上級者(20,517ポイント)   Date: 2009/12/17(木) 02:38   No:44348     
Title: Re:ACMの問題    
scanfの中で,を使ってるからおかしな動作をするのでしょう。
こういうときはデバッグ機能を使って変数の中身を確かめてみてください。
scanfの後にprintfで出力する、とかね。

というか、この問題をコンソールから入力するのは・・・・
テキストファイルにコピペしてinputデータにするべきだと思いますよ。


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

Name: bun  ..ぴよぴよ(727ポイント)   Date: 2009/12/17(木) 03:40   No:44350     
Title: Re:ACMの問題    
ありがとうございます。
正常に動くようになりました。
ただまだ、いくらか問題があるので続けて質問させていただきます。
申し遅れましたが当方C言語はまだまだ初心者です。

問題文にある「なお,合計を等しくするようなカードの交換の方法が複数ある場合は,交換するカードの点数の和が最小となるものを出力すること」というような条件を満たす条件文がわかりません。
現状を添付しておきます。
また「合計を等しくする交換はありません」を表示させることができません。
どこに間違いがあるのでしょうか?



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

Name: mats  ..かけだし(1,673ポイント)   Date: 2009/12/17(木) 04:17   No:44351     
Title: Re:ACMの問題    
うーん…,とても惜しいです.

『A_changed_sum と B_changed_sum が等しくなったとき』にA_answer と B_answer に代入を行っていますが,
その時点で代入を行うのはまだ早いです.

『合計が等しくなった時,かつ A_answer と B_answer の和よりもA[i] と B[j] の和が小さい時』に代入を行うのが正解です.
(そのためには, A_answer と B_answer を宣言した時に大きな数字で初期化を行っておく必要があります)


合計が等しくなる交換が無かった場合の条件ですが,
『A_answer と B_answer が等しい時』でなく,『A_answer と B_answer が初期化した数字から変わっていなかった時』という条件にすればいいかと思われます.
printfは最後に(2つのfor文を抜けてから)一度だけ行ってください.

while文に関してはちょっと意味がわかりませんでした….


現時点のプログラムでは複数問を連続で解くことができませんが,それでよろしいのでしょうか?


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

Name: bun  ..かけだし(1,339ポイント)   Date: 2009/12/17(木) 05:10   No:44353     
Title: Re:ACMの問題    
返答大変ありがとうございます。
プログラムを書き直してみたのですが・・やはりできません
ご指摘お願いします。


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

Name: mats  ..かけだし(1,770ポイント)   Date: 2009/12/17(木) 05:27   No:44354     
Title: Re:ACMの問題    
if文の書き方が間違っています.
他の部分では合っているので,恐らく単純なミスだとは思いますが….
A_answer==999999&&B_answer==999999ではないでしょうか?

それと,print文は最後に持ってきてください.
このプログラムだとreturn 0の前に書けばいいかと思われます.
最後に持ってきた場合には,出力はA[i],B[j]ではなく,A_answer,B_answerに直すのもお忘れなく.


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

Name: bun  ..かけだし(1,434ポイント)   Date: 2009/12/17(木) 06:21   No:44355     
Title: Re:ACMの問題    
何度もありがとうございます。
printの方は改善させることができました。
デバックしてみたのですが、画像のようにやはり答えが2通り出てしまいます。
プログラムの目標は画像の交換するカードが1と3の時のみを表示させることです。
これまで教えてもらったことから、間違いはないと思うのですが・・
まだ何か不足していることがあるのでしょうか?


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

Name: mats  ..かけだし(1,922ポイント)   Date: 2009/12/17(木) 06:48   No:44356     
Title: Re:ACMの問題    
おや…,現時点でのプログラムを見せて頂けますか?


それと,指摘が遅れてしまい申し訳ないのですが,
if(A_answer+B_answer>A[i]+B[j]){
    A_answer = A[i];
    B_answer = B[j];
}else{
    if(A_answer!=B_answer){
        A_answer = A[i];
        B_answer = B[j];
    }
}

の二つ目の代入(A_answer!=B_answer)の部分は消してください.
これもちょっと意味がわからなかったのですが,先ほど指摘するのを忘れていました.


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

Name: bun  ..かけだし(1,811ポイント)   Date: 2009/12/17(木) 07:33   No:44357     
Title: Re:ACMの問題    
本当にお手数をおかけします。
現時点でのプログラムは以下の通りです。
解が複数でてしまう以外は正常に動きます。



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

Name: mats  ..かけだし(1,995ポイント)   Date: 2009/12/17(木) 07:41   No:44358     
Title: Re:ACMの問題    
交換すべきカードは〜のprint文も最後に書いてください.

ループの中に書いてしまうと,交換できる組み合わせを見つけるたびに表示されてしまいます.


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

Name: bun  ..かけだし(1,904ポイント)   Date: 2009/12/17(木) 07:54   No:44359 解決!     
Title: Re:ACMの問題    
うまくいきました。本当にありがとうございました!
初歩的なミスが多くてすいませんでした。これからもっとしっかり勉強していきたいと思います。
私的な事情により載せたソースは消します。
こんな朝まで付き合ってもらって本当に感謝します。


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



Name: Ma  ..上級者(24,246ポイント)   Date: 2009/12/16(水) 01:59   No:44195       
Title: 3Dエフェクト:風    
ども、いつもお世話になっています。

今回、3Dでの強風のエフェクトの表現方法のアイディアをいただけたらと思っております。

環境は、
 VC++2008 Express
 DXライブラリ 3.0f
 Windows 7 (念のため)
です。
現在持っている(画像、動画系)素材作成用ソフトは、
 PhotoShop CS4
 メタセコイア
 SAI
ぐらいです。

スモークみたいな表現ができたら最強ですが、おそらく簡単にはできないのである程度立体感がなくてもOKです。
今のところ、3Dオブジェクトにテクスチャをずらして描画することで、一直線に進む風はなんとなく表現できています。(3.0fからの新機能)
(2Dアニメ的風の表現)

問題は、曲がる風(どこかの角を曲がって通るような強風。)、の表現です。
3Dオブジェクトにアニメーションをアタッチするとできるかなって思っていますが、ほかに割と簡単な方法がありますか?

もしアニメーションがベストなら、アニメーション作成は未経験なのでおすすめのアニメーション作成ソフトがありましたら勧めてください。


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


Name: Justy  ..伝説なるハッカー(484,749ポイント)   Date: 2009/12/16(水) 02:49   No:44196     
Title: Re:3Dエフェクト:風    
 どこで吹く風とか、その強さとか、ずっと吹いている風なのかとかシチュエーション合わせて
演出プランを考える必要がありますが、風そのものを表示するより風を感じさせるエフェクト
というのはどうでしょう?


 例えば曲がる角が通路だったら

・ 風の音と周囲の物体との接触音(カメラの向きに合わせて音量やパンポットを調整)
・ (瞬間的な風なら)曲がり角の奥の窓からこちら側の窓の順番で時間差をつけて窓がかたかた揺らす
・ キャラの髪や服がなびく、キャラが風の向きに押される
・ 曲がり角に貼ってあるポスターに風の圧力がかかっているようなアニメーションをつける(或いは飛んでいく)
・ 強風が吹いた瞬間に近くの蝋燭の火がなびき、消える
・ 細かい複数のゴミが曲がり角で一度壁にぶつかり、そのまま道沿いにこちらに転がってくる

とか。



> 3Dオブジェクトにテクスチャをずらして描画することで、一直線に進む風はなんとなく表現できています

 ピンとこないのですが、これってマンガ的表現のスピード線を UVアニメーションでつけている、
ということですか?



> アニメーション作成

 テストしてみないとDXライブラリで使えるかどうかわかりませんが、Blenderとかどうでしょう?

blender.org - Home
http://www.blender.org/

Blender.jp - Blender Japanese Website
http://blender.jp/


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

Name: Ma  ..上級者(24,347ポイント)   Date: 2009/12/16(水) 05:27   No:44203     
Title: Re:3Dエフェクト:風    
>・ 風の音と周囲の物体との接触音(カメラの向きに合わせて音量やパンポットを調整) 
あぁ、まだやってませんでした!
とてもありがたいアイディアありがとうございます。

ところで、多数の音を3D空間で表現する場合は、やはり音が出る場所をリストか何かに登録、
視点からの距離で音の再生を判断、その後顔の向きでパンの指定、という形でしょうか。


>ピンとこないのですが、これってマンガ的表現のスピード線を UVアニメーションでつけている、 
ということですか?
 
そういうことです。


>・ 細かい複数のゴミが曲がり角で一度壁にぶつかり、そのまま道沿いにこちらに転がってくる 
これは、やってありました。

ほかのアドバイスもありがとうございます。
火はなさそうですが、ポスターとか窓は検討してみます!
キャラについては、キャラクター描くのが面倒でファーストパーソン視点にしてあるため避けます。

どうやら、アニメーションを回避できそうなので、まずはアニメなしでたいおうして必要が出たら
またBlenderに目を通してみます。

ありがとうございました。


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

Name: Justy  ..伝説なるハッカー(485,236ポイント)   Date: 2009/12/16(水) 23:36   No:44326     
Title: Re:3Dエフェクト:風    

> やはり音が出る場所をリストか何かに登録、 
> 視点からの距離で音の再生を判断、その後顔の向きでパンの指定、という形でしょうか

 リストはそもそもサウンドを鳴らすためのシステム側の方で「現在再生中の音リスト」を
持っているはずなので、その中に3Dサウンドにするかどうかのフラグを持たせ、
3Dサウンドにするなら音源座標など(*1)の必要な情報も一緒にもたせてあげればいいかと思います。

 次にリスナー位置からの距離(*2)で調整するのは基本は音量(*3)です。
 勿論計算の結果音量が0だった場合、再生を止めることもあるでしょうが、
それは何の音かで止めないこともあります。
 例えば川のせせらぎとかの環境音系は音量0なら止めて、反対に舞踏会の音楽とかは
(キャラが部屋を出て聞こえなくなっても)そのまま再生し続ける、とか。
 どちらかに統一してもいいですが、そのあたりは仕様と相談です。

 で、パンポットは音源とリスナー位置と向きの具合で決めます。
 リスナーの位置は大抵はカメラの位置と向きですが、FPSならカメラも顔も事実上同じなので
それでも問題はないと思います。



*1 通常はグローバルパラメータを見にいくとしても、必要に応じて個別に減衰率とか最小音量とかを
設定・調整できるようにしておくと後々便利かも。

*2 基本は距離で判定しますが、音源とリスナーとの間に遮蔽物がある場合や音源がある程度の
大きさを持っている場合は少し工夫が必要です。

*3 ドップラー効果とかも入れることがあります。


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

Name: Ma  ..上級者(24,522ポイント)   Date: 2009/12/17(木) 01:20   No:44342 解決!     
Title: Re:3Dエフェクト:風    
>リストはそもそもサウンドを鳴らすためのシステム側の方で「現在再生中の音リスト」を 持っているはずなので
DXライブラリなら、サウンドハンドルをリストしていく事になりますよね。

>遮蔽物がある場合や音源がある程度の 大きさを持っている場合
うー、たしかに、面倒そうですね。
幸い今はこの心配はありませんでした。(遮蔽物がないので)

>*3 ドップラー効果とかも入れることがあります。 
まさに物理のオンパレードですね。
ついに物理スキルをプログラミングに応用できます^^


また問題が起きたらよろしくお願いします。

ありがとうございました。


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



Name: lbfuvab  ..上級者(23,681ポイント)   Date: 2009/12/11(金) 00:40   No:43781       
Title: 四角形の描画    
環境はXP SP3 + DxLibです。
水面の波の干渉(定常波?)のプログラムを組んでいて、
細かく濃淡をつける必要あったので4x4の大きさの正方形を160x120個書いているのですが(プログラム添付済み
これを2x2の正方形を320x240個にするとガタガタに処理落ちしてしまいます。
調べてみると描画部分が時間を食っていました。

本題に入りますが、どうすれば正方形の描画スピードが上がるのでしょうか、教えてください。
また、目立たないように描画時にぼかしたり出来るのでしょうか?

現在はDrawBoxを使っています。


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


Name: lbfuvab  ..上級者(23,721ポイント)   Date: 2009/12/11(金) 00:44   No:43782     
Title: Re:四角形の描画    
ファイルの場所は
http://www1.axfc.net/uploader/Sc/so/62775.zip
です。


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

Name: kazuoni [URL]  ..ハッカー(117,875ポイント)   Date: 2009/12/11(金) 01:30   No:43786     
Title: Re:四角形の描画    
描写速度には詳しくないですが・・・
対称性から、半分描写して、それを左右反転したものをもう片方に張り付ける・・・
なんてのはだめですかね^^;

だめですよねorz


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

Name: lbfuvab  ..上級者(23,812ポイント)   Date: 2009/12/11(金) 03:15   No:43792     
Title: Re:四角形の描画    
>>kazuoniさん
真ん中が自由端と考えて反射ってことですか?
・・・すいません、数学的にどうしたらよいのか思いつきません。

それとも一部を出力してそれを対称性をつかって貼り付けるってことですか?


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

Name: kazuoni [URL]  ..ハッカー(118,155ポイント)   Date: 2009/12/11(金) 08:53   No:43799     
Title: Re:四角形の描画    
> それとも一部を出力してそれを対称性をつかって貼り付けるってことですか?

そっちです。


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

Name: lbfuvab  ..上級者(23,918ポイント)   Date: 2009/12/11(金) 16:06   No:43837     
Title: Re:四角形の描画    
>>kazuoniさん
できたのですが、
裏画面に1/4だけ書く

MakeGraphでつくった画像(以下a)にコピー

aを反転させながら裏画面に描画

としたのですが、これでは無駄が出るので(逆に遅くなる)

aに描画

aを反転させながら裏画面に描画

としたいのですが、描画先の変更はSetDrawScreen(a);では無理なようです。
どうすれば良いのでしょうか?


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

Name: kazuoni [URL]  ..ハッカー(118,426ポイント)   Date: 2009/12/11(金) 21:12   No:43858     
Title: Re:四角形の描画    
一応作ってみました。
BOX_SIZEを変えれば正方形のサイズが変わります。(2〜)

うちの環境では全く処理落ちはしませんが・・・
これ以上効率のいい描写は自分にはわからないです。。すみません。

一応自分のPCのスペック書いときます
Intel(R) Core(TM)2 Duo CPU     E6850  @ 3.00GHz (2 CPUs), ~3.0GHz
2046MB RAM
GeForce 8600 GT


#追記
波ではなく、ただ、用意したカラー配列をランダムの色でDrawBoxしているだけです^^;


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

Name: kazuoni [URL]  ..ハッカー(118,543ポイント)   Date: 2009/12/11(金) 21:24   No:43859     
Title: Re:四角形の描画    
×DrawBox(x,y,x+BOX_SIZE-1,y+BOX_SIZE-1,color[rand],true);
○DrawBox(x,y,x+BOX_SIZE,y+BOX_SIZE,color[rand],true);


意味のないことやってました^^;
これでBOX_SIZEは1〜になりますね。。

#メリクリ画像のおかげか、新鮮味があり、妙に落ち着かない・・・w


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

Name: Justy  ..伝説なるハッカー(481,419ポイント)   Date: 2009/12/12(土) 03:11   No:43898     
Title: Re:四角形の描画    

> aに描画

 レンダリング可能なテクスチャは MakeScreenで作ることができます。
 ついでに描画するのはボックスじゃなくて点にして、
最適化して(Releaseで)ビルドすればもっと高速になりそうです。

 実際に早くなったのかどうかはわかりませんが、簡単なサンプルを作ってみました。
 点を一気に描いているので少しは早くなっているかと思いますが、どうですかね?


#include "DxLib.h"
#include <time.h>
#include <stdlib.h>

// 基本値
const int WindowWidth = 640;
const int WindowHeight = 480;
const int BoxSize = 2;          // 0〜16くらいで


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
    srand((unsigned)time(0));

    ChangeWindowMode(TRUE);
    if(DxLib_Init() == -1)  return 0;
    SetDrawMode(DX_DRAWMODE_BILINEAR);
    
    const int color_max_num = 128 / BoxSize;
    int color[color_max_num];
    for(int i=0 ; i<color_max_num ; ++i )
        color[i] = GetColor(rand()%255 , rand()%255, rand()%255);
    
    // 仮想画面(レンダーテクスチャ)を作成
    const int virtualScreenTexWidth = WindowWidth/BoxSize;
    const int virtualScreenTexHeight = WindowHeight/BoxSize;
    int virtualScreenTex = MakeScreen(virtualScreenTexWidth, virtualScreenTexHeight);
    
    // 頂点情報
    POINTDATA *points = (POINTDATA *)malloc(sizeof(POINTDATA) * (virtualScreenTexWidth * virtualScreenTexHeight));
    
    int count = 0;
    char key[256];
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(key) && !key[KEY_INPUT_ESCAPE])
    {
        // 仮想画面を描画先に
        SetDrawScreen(virtualScreenTex);
        
        // 点を描く
        for(int y=0; y<virtualScreenTexHeight; ++y)
        {
            for(int x=0 ; x<virtualScreenTexWidth; ++x)
            {
                int pos = x + y * virtualScreenTexWidth;
                POINTDATA *p = &points[pos];
                p->x = x; p->y = y;
                p->color = color[(pos + x * y + count) % color_max_num];
                p->pal = 0;
            }
        }
        DrawPixelSet(points, virtualScreenTexWidth * virtualScreenTexHeight);
        ++count;
        
        // 描画先を裏画面に
        SetDrawScreen(DX_SCREEN_BACK);
        
        // 全画面に表示
        DrawExtendGraph(0, 0, WindowWidth, WindowHeight, virtualScreenTex, FALSE);
        
        ScreenFlip();
    }
    
    free(points);
    DeleteGraph(virtualScreenTex);
    
    DxLib_End();
    return 0;
}


2,571ポイント を手に入れた。

Name: kazuoni [URL]  ..ハッカー(118,682ポイント)   Date: 2009/12/12(土) 10:42   No:43912     
Title: Re:四角形の描画    
あ、やっぱりその方法のが高速ですよね^^;
自分もPixelSetのが早いのでは?っと思いながらプログラム組んでいましたが、
そんな関数があるとは・・・。いやはや、DXライブラリ関数を把握せねば。。

#じっくり見ると、細胞みたいで気持ち悪い・・・


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

Name: Tatu  ..上級者(19,992ポイント)   Date: 2009/12/13(日) 14:25   No:43976     
Title: Re:四角形の描画    
描画速度を速くする方法はわかりませんが、
私も水面を伝わる波を320*320の範囲内で描画するプログラム
を書いてみました。
止めるときはエスケープキーを押してください。

Rキーではじめの状態に戻します。

波の内容はwave.txtを変更することで変えられます。

描ける波は10個までで、
始点のx座標,始点のy座標,振幅,周期,波長
の値を整数で入れてください。

wave.txtの例

80,160,30,1,4
240,160,30,1,4
160,240,30,2,10
160,80,30,2,10
80,80,10,5,20
240,80,10,5,20
80,240,10,5,20
240,240,10,5,20
160,160,5,10,40
0,0,0,0,0



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

#define SIZE_X 320        //横の長さ
#define SIZE_Y 320        //縦の長さ
#define PI 3.14159265    //円周率

char key[256];

//波の情報構造体
typedef struct{
    int x,y;//始点の座標
    int a;//振幅
    int t;//周期
    int l;//波長
}wave_t;

wave_t wave[10];//10個まで


int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;
    if(ClearDrawScreen()!=0)return -1;
    GetHitKeyStateAll(key);
    return 0;
}

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

    //初期化
    int i;

    char c[8];            //文字列格納
    int l=0,m=0,n=0;    //行、列、文字の番号

    int x,y;//それぞれのピクセルの座標
    double dx,dy;//ピクセルと波の始点の座標の差
    double r;//ピクセルと始点の距離
    int cnt=0;//描画を始めてからの時間
    double cnt2;//描画を始めてからの時間-始点からピクセルに波が伝わる時間
    double z;//変位 大きいほど白くなる
    int brt;//明るさ

    //白から黒まで256色用意
    int color[256];
    for(i=0;i<256;i++){
        color[i]=GetColor(i,i,i);
    }

    //ファイル読み込み
    FILE* fp;
    fp=fopen("wave.txt","r");
    if(fp == NULL){
        return 0;
    }
    while(l<10){
        for(n=0;n<8;n++){
            c[n]=fgetc(fp);

            if(c[n]==',' || c[n]=='\n'){
                c[n]='\0';
                break;
            }
            if(c[n]==EOF) goto EXFILE;
        }

        switch(m){
            case 0:
                wave[l].x=atoi(c);
                break;
            case 1:
                wave[l].y=atoi(c);
                break;
            case 2:
                wave[l].a=atoi(c);
                break;
            case 3:
                wave[l].t=atoi(c);
                break;
            case 4:
                wave[l].l=atoi(c);
                break;
        }
        m++;
        if(m==5){
            m=0;
            l++;
        }

    }
EXFILE:
    fclose(fp);
            
    while(ProcessLoop()==0){

        //それぞれのピクセルで計算・描画
        for(y=0;y<SIZE_Y;y++){
            for(x=0;x<SIZE_X;x++){
                z=0;
                //それぞれの波による変位を計算し、足し合わせる
                for(i=0;i<10;i++){
                    //0で割ることを回避
                    //情報のないものを計算しない
                    if(wave[i].t!=0){
                        dx=x-wave[i].x;
                        dy=y-wave[i].y;
                        r=sqrt(dx*dx+dy*dy);
                        //波長/周期=速度
                        cnt2=cnt - r / (wave[i].l / wave[i].t );
                        //波がそのピクセルに伝わる時間をこえていたら
                        if(cnt2>0){
                            z+=wave[i].a * sin(PI*2 / wave[i].t * cnt2 );
                        }
                    }
                }
                brt=(int)(127+z);
                //ポインタエラー回避
                if(brt<0) brt=0;
                if(brt>255) brt=255;
                DrawPixel(x,y,color[brt]);
            }
        }
        DrawFormatString(0,320,color[255],"cnt=%d",cnt);
        cnt++;//時間経過

        //プログラムを止める
        if(key[KEY_INPUT_ESCAPE]==1) break;
        //最初からやりなおす
        if(key[KEY_INPUT_R]==1) cnt=0;

        ScreenFlip();
    }
    DxLib_End();
    return 0;
}


1,833ポイント を落としてしまった。

Name: lbfuvab  ..上級者(24,025ポイント)   Date: 2009/12/15(火) 13:05   No:44085     
Title: Re:四角形の描画    
DrawPixelSet使ってプログラム組みなおしたらやや速くなりました(^0^)/
Justyさん有難うございます。
今回はソースも添付しました。
サイズ的に添付できなかったのでアップローダを使ってます。
http://www1.axfc.net/uploader/Sc/so/64169.zip&key=static_wave

追記:出来たらどれくらいのFPSで動くか教えてください。


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

Name: kazuoni [URL]  ..ハッカー(119,032ポイント)   Date: 2009/12/15(火) 18:31   No:44131     
Title: Re:四角形の描画    
> やや速くなりました

うちの環境では59,60の間をうろうろします。なので、我が家ではほぼ問題なしです。

・・・我が家はですが・・・^^;


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

Name: Justy  ..伝説なるハッカー(484,130ポイント)   Date: 2009/12/16(水) 01:16   No:44193     
Title: Re:四角形の描画    

> 出来たらどれくらいのFPSで動くか教えてください

 実はうちの環境では最初のものも後のものもさほど変わりませんでした。
 最初のは 58〜62、後のは 57〜59です。


 あともう十分だとは思いますが折角なので、もちっと高速に描画できる
かもしれない方法も載せておきます。
 SoftImage系を使って点を描画し、最終的にDXライブラリのテクスチャに変換・表示を
しています。

 うちの計測では BoxSize=2で MakeScreen形式だと 2ms〜3ms、この方法だと 1msほど、
BoxSize=1で MakeScreen形式だと 10ms〜11ms、この方法だと 3〜4msほどとなります。



#include "DxLib.h"

// 基本値
const int WindowWidth = 640;
const int WindowHeight = 480;
const int BoxSize = 2;          // 0〜16くらいで


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
    ChangeWindowMode(TRUE);
    if(DxLib_Init() == -1)  return 0;
    SetDrawScreen(DX_SCREEN_BACK);
    
    // ソフトイメージを作成
    const int softImageWidth = WindowWidth/BoxSize;
    const int softImagHeight = WindowHeight/BoxSize;
    int memImage = MakePAL8ColorSoftImage(softImageWidth, softImagHeight);
    
    // ソフトイメージ用パレット作成
    for(int pal=0; pal<256; ++pal)
        SetPaletteSoftImage(memImage, pal, pal, pal, pal, 255);
    int tex = CreateGraphFromSoftImage(memImage);
    
    int count = 0;
    char key[256];
    int fontColor = GetColor(25, 255, 255);
    
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(key) && !key[KEY_INPUT_ESCAPE])
    {
        // 開始時間
        int start = GetNowCount();
        
        // ソフトイメージ上に点を描く
        for(int y=0; y<softImagHeight; ++y)
        {
            for(int x=0 ; x<softImageWidth; ++x)
                DrawPixelPalCodeSoftImage(memImage, x, y, (x + y * softImageWidth + x * y + count) % 255);
        }
        ++count;
        
        // テクスチャに変換
        ReCreateGraphFromSoftImage(memImage, tex);
        
        // 全画面に表示
        DrawExtendGraph(0, 0, WindowWidth, WindowHeight, tex, FALSE);
        
        // 実行時間表示
        DrawFormatString(0, 0, fontColor,"%dms", GetNowCount() - start);
       
        ScreenFlip();
    }
    DeleteSoftImage(memImage);
    DeleteGraph(tex);
    
    DxLib_End();
    return 0;
}



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

Name: lbfuvab  ..上級者(24,145ポイント)   Date: 2009/12/17(木) 01:05   No:44341     
Title: Re:四角形の描画    
>>Justyさん
有難うございます!
家の古いほうのPC(Pen4 + オンボードのグラボ)でもサクサク動くようになりました。


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



Name: らふ  ..ぴよぴよ(9ポイント)   Date: 2009/12/16(水) 15:34   No:44234       
Title: 無題    
http://dixq.net/g/02.htmlでコピペしたら
どうやって実行すればよろしいですか?


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


Name: たかぎ [URL]  ..ハッカー(137,308ポイント)   Date: 2009/12/16(水) 15:47   No:44237     
Title: Re:無題    
> どうやって実行すればよろしいですか?

最初に行うべきことは、規約を熟読し、それを順守することと、処理系(何かは不明ですが)のドキュメントを熟読することです。


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

Name: non  ..比類無きプログラマー(82,647ポイント)   Date: 2009/12/16(水) 15:51   No:44238     
Title: Re:無題    
VisualC++2008なら、デバッグ開始(緑色三角のボタン)です。


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

Name: らふ  ..ぴよぴよ(22ポイント)   Date: 2009/12/16(水) 15:58   No:44239     
Title: Re:無題    
ビルドに失敗してしまいます

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

Name: らふ  ..ぴよぴよ(28ポイント)   Date: 2009/12/16(水) 16:02   No:44240 解決!     
Title: Re:無題    
解決しました
ありがとうございます


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

Name: softya  ..熟練のプログラマー(67,709ポイント)   Date: 2009/12/16(水) 16:02   No:44241     
Title: Re:無題    
この2点をまず守ってください。
・質問は具体的にする
・よくわからない人はテンプレを


規約と注意事項
http://dixq.net/board/board.html


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

Name: ねこ  ..熟練のプログラマー(50,325ポイント)   Date: 2009/12/16(水) 17:56   No:44270     
Title: Re:無題    
スレ違いですが、なんかもう「規約」とか「テンプレ」っていう単語レベルで知らない人が多い気がします。
学生さんだとテンプレートって意味も知らないんじゃないかと。
「テスト」とか「勉強」を拒否反応するような感覚で見ようとしないんじゃないでしょうか。

昔要望により初心者向けツールチップで「専門用語」使う使わない版と切り替えられるの機能を追加した経験があるのですが、単語への拒否反応を和らげるために
「規約」「テンプレ」って単語を使わず「回答されやすい質問サンプル」とか「すぐ回答が付く質問例」みたいな言い回しにすると効果上がったりしないでしょうか?

餌で釣るような言い回しっぽくてあんまり良い感じはしないのですが・・・


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

Name: たかぎ [URL]  ..ハッカー(138,222ポイント)   Date: 2009/12/16(水) 19:41   No:44294     
Title: Re:無題    
> なんかもう「規約」とか「テンプレ」っていう単語レベルで知らない人が多い気がします。 

そういう意味では、「テンプレ」のような略語を使うのは反対ですね。
調べるのが非常に困難になりますから。

> 「規約」「テンプレ」って単語を使わず「回答されやすい質問サンプル」とか「すぐ回答が付く質問例」みたいな言い回しにすると効果上がったりしないでしょうか? 

これはちょっとやりすぎでしょう。
「すぐ回答が付く」かどうかは誰も保証できませんし。

以下、半分冗談ですが...

そういうことが必要な人に対しては、いっそのこと有償にして、1回答1,000円ぐらい取ってあげるのがむしろ親切なのかもしれません。
質問があいまいでスレッドが長くなると、すぐに数万円、数十万円になってしまいますので、嫌でも最初に具体的かつ正確に書くようになるはずです。
有償にすると他の掲示板に行ってしまうという指摘もあることでしょう。
しかし、掲示板で回答している人というのはかなり重複していますので、「そんな質問をするなら有償掲示板でどうぞ」と、みんなが誘導するようになれば、質の悪い質問者は行き場を失います。


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

Name: ミミ  ..ぴよぴよ(14ポイント)   Date: 2009/12/16(水) 20:25   No:44297     
Title: Re:無題    
うーん、嫌なら放置すればいいと思う。
気に入らなければ自分で掲示板作ってやればいいんだし、
何度も同じようなことで愚痴を言う人を見るのも気分悪いよ。
そこも気がついてほしいね


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

Name: ねこ  ..熟練のプログラマー(50,671ポイント)   Date: 2009/12/16(水) 21:19   No:44305     
Title: Re:無題    
>たかぎさん
「テンプレート」としたところできっと「分からない人は調べない」だろうなーと思う次第です。
質問している内容自体ググればすぐ分かるようなことも多いでしょうし、抜本的な解決法はないんだろうな、と思いつつ書いてます。

<これはちょっとやりすぎでしょう。 
<「すぐ回答が付く」かどうかは誰も保証できませんし。 
やりすぎですか(汗)
確かにすぐ回答が付く保証はないですが、少しでもテンプレに沿うような流れにならないかなと。

<以下、半分冗談ですが...
有償となると逆に厳密に答えられない回答者が萎縮して答え控えするかも^^;


>ミミさん
お気持ちは分かりますが、質問掲示板は回答者あって成り立つものなので
非効率的な流れを憂いて「なんとかならないかな」と発言する事を愚痴と捉えるのはいかがなものかと。


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

Name: たかぎ [URL]  ..ハッカー(138,441ポイント)   Date: 2009/12/16(水) 21:23   No:44306     
Title: Re:無題    
> 「テンプレート」としたところできっと「分からない人は調べない」だろうなーと思う次第です。 

わからない言葉が出てきても辞書で調べることができないのは、国語力に致命的な問題があります。
プログラミング言語より先に国語を勉強すべきですので、掲示板での回答でどうにかするのは無理がありますね。


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

Name: ねこ  ..熟練のプログラマー(50,943ポイント)   Date: 2009/12/16(水) 21:43   No:44311     
Title: Re:無題    
>たかぎさん
仰ること、ごもっともです。

<わからない言葉が出てきても辞書で調べることができないのは、国語力に致命的な問題があります。 
<プログラミング言語より先に国語を勉強すべきですので、掲示板での回答でどうにかするのは無理がありますね。
ただここまで言うと少し極端過ぎる気が^^;

「分からない単語だとスルーされてる気がするので分かりやすい言い回しにしたらどうでしょう?」
というのが主旨の書き込みでした。


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

Name: たかぎ [URL]  ..ハッカー(138,567ポイント)   Date: 2009/12/16(水) 22:12   No:44312     
Title: Re:無題    
いやだから

> 分からない単語だとスルーされてる気がするので

分からないままスルーすること自体、国語力に問題があるのです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,113,491ポイント)   Date: 2009/12/16(水) 22:40   No:44315     
Title: Re:無題    
しかし最近確かに規約云々、以前の質問が多いですね;

こちら側が回答用テンプレ用意しないといけない位^^;

私が思うに、最近質問している方の年齢が低いのだと思います。
先日メールで質問してきた方は聞いてみると9歳だと言っていました。

あまりにも酷い投稿はきっと小学生とかが多いのではないかと思います。
今日12才だと言ってくれた人がいましたが、そう言われると回答もしやすいですね。
どこまで砕けばいいのか、また、STG作りたいといっても、いきなりsin,cosの話は出来ないとか解りますし。
ということで、年齢を書いてもらうのも一つの手かもしれませんね。

年齢を入力しないと投稿できないとか・・。
まぁいくらでもごまかせるでしょうけど。

>>ミミさん

そうですね〜、放置もある意味対処の一つかもしれませんが、
なるべく、私は放置したくないなと思っています。
どうしようもないような投稿をする人に、何とか世間で通用するような投稿が出来るようになってほしいと思っています。
きっと彼らは今まで相手にされなかったから投げやりになっているか、投稿の仕方を知らないのだと思うのです。
回答者が回答しやすい質問をすれば、どんなに自分の利益になるか、それが解れば彼らは変わると思っているのです。

あまりにも悪質な投稿者にはさすがにそこまで出来ないこともありますが・・。
ということで、どうすればいいかなとあれこれ意見頂けるのは私としても有り難いと思っています。
ミミさんのご意見も一つのご意見だと思いますので、参考にさせて頂きたいと思います。ありがとうございます。


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

Name: たかぎ [URL]  ..ハッカー(138,795ポイント)   Date: 2009/12/17(木) 00:00   No:44331     
Title: Re:無題    
> 年齢を入力しないと投稿できないとか・・。 

掲示板に個人情報を書かないように、いろいろなところで指導されていますから、難しいかもしれません。
必要な情報は出してもらわないと、大人と同じ扱いをされるんですけどね(当然、大人と同じ能力や責任が要求されます)。


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



Name: うっきー  ..ぴよぴよ(95ポイント)   Date: 2009/12/16(水) 18:12   No:44274       
Title: 無題    
聞きたいことは二点あります。

@画像の透過処理は簡単ですが、暗色化処理はどうやってやるのですか?
例えば、影とかに隠れると物体は暗くなりますよね? このような画像処理はプログラムで
するのですか?または画像の段階で透過処理みたいに施すのですか?
簡単な例があれば教えてください。

A無限ループの残像についてです。無限ループするプログラムで画像を動かしているのですが、
初めのうちは綺麗にくっきり写ります。しかし、時間が経つにつれで残像がみえて醜くなってしまいます。
これは液晶特有の問題ですか?僕のプログラムの問題ですか?結構高速に画像は動かしています。
もし改善策とかがあるなら教えてください。

知りたいのはこの二点です。どちらでもよいので、指導よろしくお願いします。


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


Name: うっきー  ..ぴよぴよ(111ポイント)   Date: 2009/12/16(水) 18:26   No:44279     
Title: Re:無題    
@は透過率の問題です。つまり画像と画像が画面(ゲーム中)で重なったとき、
完全に透けるのではなく少し透けるように施すことは可能なのか?っていうことです。

Aについては長時間みていると起こる人間の目の問題かもしれません


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

Name: Dixq (管理人)  ..ウィザード(1,112,213ポイント)   Date: 2009/12/16(水) 18:26   No:44280     
Title: Re:無題    
(1)について

どちらでも出来ますが、どちらを使えばいいかはその時によります。
例えば龍神録1面の背景のように、谷の下に川があるような表現は画像でやった方が便利ですが、
松明をキャラが持ってて、そのまわりは真っ暗というような場面は画像+プログラムで表現するとよいでしょう。
全体を均一に暗くするならプログラムでやります。


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

Name: Dixq (管理人)  ..ウィザード(1,112,275ポイント)   Date: 2009/12/16(水) 18:28   No:44282     
Title: Re:無題    
(2)について

これはプログラムを見ないとわからないのでソースを見せてください。


#う〜寒くて手がかじかんでうまくうてん;


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

Name: うっき  ..ぴよぴよ(77ポイント)   Date: 2009/12/16(水) 18:32   No:44286     
Title: Re:無題    
>管理人さん
>松明をキャラが持ってて、そのまわりは真っ暗というような場面は画像+プログラムで表現するとよいでしょう。 

どこに説明ありますか?すいませんが教えてください。
できなければ簡単な例でお願いします。ある地点に入った画像だけ暗色化したいわけですよ。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,113,959ポイント)   Date: 2009/12/16(水) 22:58   No:44320     
Title: Re:無題    
(2)についてはもう大丈夫なのでしょうか?

(1)については、せっかくサンプルを書いても、こんなんじゃないといわれても悲しいので、
では具体的に書いてもらえますか?
例えばということで、説明がありましたが、今自分がしたい事を教えてください。

先ほど私が言ったように、暗い洞窟の中でたいまつを持っているような演出でいいのでしょうか?


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



Name: お願いします!  ..ぴよぴよ(142ポイント)   Date: 2009/12/15(火) 17:46   No:44112       
Title: 無題    
問題文
以下の出力例のように、西暦の年を入力して、
その年に夏季オリンピックがあれば「その年に夏季オリンピックが開催されます。」、
なければ「その年に夏季オリンピックは開催されません。」
と出力するプログラムを作成しなさい。
(ヒント:夏季オリンピックは、西暦が4で割り切れる年に開催されます。)
(全角文字、半角文字に注意してください)

出力例:
西暦を入力してください: 
2008 
その年に夏季オリンピックが開催されます。

#include <stdio.h>

int main(void)
{
    int year;
    
    printf("西暦を入力してください:\n");
    scanf("%d", &year);

//
(* ここに解答を書き加える *)

    
    return(0);
}
//

分からないので教えてください!



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


Name: Dixq (管理人) [URL]  ..ウィザード(1,109,513ポイント)   Date: 2009/12/15(火) 17:58   No:44117     
Title: Re:無題    
これを使う時が早速やってきましたね・・。

 

よく規約を読んで規約に沿った投稿をお願いします。
ここは宿題を誰かにやってもらう場ではないのです・・。

情報系を学びたくて専攻しているからこういう宿題が出ているわけですよね?
高いお金を払ってもらって得られている今の時間を大事にしましょう。

ということで、まず、何が解らないのかをはっきりさせて下さい。

とりあえず少し簡単な問題にしてみましょう。

問題1

入力した数値をそのまんま表示するだけのプログラムを書きましょう。

問題2

入力した数値が偶数なら「偶数です」、奇数なら「奇数です」と表示するプログラムを作りましょう。

問題3

入力した数値が4の倍数なら「4の倍数です」と表示するプログラムを作りましょう。

この3つをまずやってみませんか?


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

Name: non  ..比類無きプログラマー(81,690ポイント)   Date: 2009/12/15(火) 18:00   No:44119     
Title: Re:無題    
何がわからないか、示してください。
例えば、
(1) yearを4で割ったときの余りを求める方法はわかりますか?

(2) if文の使い方はわかりますか?

(3) printfで、文字列を表示することはできますか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,109,660ポイント)   Date: 2009/12/15(火) 18:01   No:44120     
Title: Re:無題    
規約を読むのがめんどくさいかもしれませんから、何がダメか言いますと・・。

・宿題の丸投げ禁止
・コードをタグで囲んでいない
・自分がどの程度理解しているのか説明がない
・どこが解らないのかが明確になっていない
・環境の説明がない(使ってるコンパイラなど)
・トピックが「無題」で投稿されている

この辺直していただけると有り難いです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,109,692ポイント)   Date: 2009/12/15(火) 18:02   No:44122     
Title: Re:無題    
> nonさん

私の1,2,3を3,2,1にしたかのような奇跡的な被り方ですね・・w


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

Name: お願いします!  ..ぴよぴよ(414ポイント)   Date: 2009/12/15(火) 18:03   No:44123     
Title: Re:無題    
規約を読んでいませんでした。すみませんでした。
4で割り切れないときを表すときはどうしたいいいですか?


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

Name: lbfuvab  ..上級者(24,103ポイント)   Date: 2009/12/15(火) 18:08   No:44126     
Title: Re:無題    
課題で出てるなら習ってるはずです。先生に聞いてください。
ここはC言語「質問」掲示板であって「入門」掲示板でも「宿題」掲示板でもないです、あしからず。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,110,008ポイント)   Date: 2009/12/15(火) 18:08   No:44127     
Title: Re:無題    
さっき私が言った問題は解けますか?

で、4で割り切れない云々の件ですが、

例えば、
5,10,15,20,25...

こんな5の倍数のデータがあったとしますね。
この数値をnとすると、これらは

nを5で割った余りが0であるという事が解りますよね?

ということは、5で割った余りが0であるときは、5の倍数、
5の倍数ではないという時はその否定「!」である時ですね。

では、ここで問題です。
与えられた数値nが4の倍数だったら
「4の倍数です」と表示するプログラムはどうなりますか?


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

Name: たかぎ [URL]  ..ハッカー(136,010ポイント)   Date: 2009/12/15(火) 18:13   No:44128     
Title: Re:無題    
> その年に夏季オリンピックがあれば「その年に夏季オリンピックが開催されます。」、 
> なければ「その年に夏季オリンピックは開催されません。」 
> と出力するプログラムを作成しなさい。

この問題はやや面倒ですね。
最初の近代オリンピックがいつから始まったのか、歴史的事実を踏まえる必要があります。
また、一時期戦争が原因で中止になりましたが、それも考慮しなければなりません。
さらに、古代オリンピックも考慮に入れるのであれば、古代ギリシャ語の古文書を紐解かなければならないかもしれません。
このあたりの調査は済んでいるのでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,110,048ポイント)   Date: 2009/12/15(火) 18:15   No:44129     
Title: Re:無題    
>たかぎさん

まぁまぁ、先生もそこまで求めていないでしょうし、
そこまで正確に答える事は誰も望んでないと思うのでいいと思いますよ^^;

察するに、高専、専門学校1年、大学1年などの、宿題ではないでしょうか・・?

しかし、そういう省く年のデータをテキストファイルか何かに保存しておいて、
それを排除して表示するように拡張したりしたらいい勉強になりそうですね。


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

Name: たかぎ [URL]  ..ハッカー(136,075ポイント)   Date: 2009/12/15(火) 18:28   No:44130     
Title: Re:無題    
> まぁまぁ、先生もそこまで求めていないでしょうし、 
> そこまで正確に答える事は誰も望んでないと思うのでいいと思いますよ^^; 

そこははっきりさせておいた方がよいですよ。
古代オリンピックはともかく、近代オリンピックに関しては。
閏年ではなく、夏季オリンピックの開催年だということが重要な示唆を含んでいると思います。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,110,103ポイント)   Date: 2009/12/15(火) 18:35   No:44132     
Title: Re:無題    
厳密に言うなら、回答が未来形であることから、これからの事を答えるような気もしますが・・
それでは、まぁ最初に4の倍数で考えておいてから特別な年を排除するプログラムに改良する方向で行きますか^^;


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

Name: non  ..比類無きプログラマー(81,727ポイント)   Date: 2009/12/15(火) 18:36   No:44133     
Title: Re:無題    
他の質問の程度からしても、本当は閏年の問題を出したかったけど、いきなりは無理だから、
とりあえず4の倍数のチェックだけやらしてみるかという先生の意図を感じます。


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

Name: softya  ..熟練のプログラマー(67,173ポイント)   Date: 2009/12/15(火) 18:43   No:44134     
Title: Re:無題    
>>たかぎさん
>そこははっきりさせておいた方がよいですよ。
>古代オリンピックはともかく、近代オリンピックに関しては。
>閏年ではなく、夏季オリンピックの開催年だということが重要な示唆を含んでいると思います。 

私もそこまでは必要ないと思います。
そんないじわるな先生がいたら、私だったらゴネくまくりますよ。


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

Name: たかぎ [URL]  ..ハッカー(136,285ポイント)   Date: 2009/12/15(火) 18:45   No:44135     
Title: Re:無題    
規約を守って質問していただけていないので、程度も真意もわかりませんね。
近代オリンピックは、1906年のアテネ中間大会のようなものもありますので、単純に計算で求めるのは無理があります。
結果的に4の倍数年でよいとしても、本当にそれでよいのかどうかを確認していないとすれば、大きな問題があります。

そもそも、学校の課題かどうかもわかりません(そんなことは書かれていませんので)。
仮に学校の課題だとしても、質問者さんは、体育学部や歴史学科の学生で、一般教養でC言語を習っているという可能性も否定できません。
その場合、歴史を調べることが課題をこなす上での重要なファクターだったとしても、何ら不思議ではありませんね。


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

Name: やそ  ..比類無きプログラマー(99,043ポイント)   Date: 2009/12/16(水) 21:13   No:44304     
Title: Re:無題    
近代オリンピック

1896
1900
1904
(1906)
1908
1912
1920
1924
1928
1932
1936
1948
1952
1956
1960
1964
1968
1972
1976
1980
1984
1988
1992
1996
2000
2004
2008

の年に開催されていますね。1906は中間オリンピックです。
よく見ると不開催の年があります。
世界大戦が原因だそうです。
これらを正確に調べるなら、配列(変数)に入れ込んでチェックすればよいかと思います。


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



Name: 初心者  ..熟練のプログラマー(45,138ポイント)   Date: 2009/12/15(火) 20:33   No:44146       
Title: エラーになるのですが    
if (month == 2)
days = 28;
else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
days = 31;
else if  (month == 4 || month == 6 || month == 9 || month == 11)
days = 30;
この場合わけやるとエラーになります。なぜですか?


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


Name: non  ..比類無きプログラマー(81,815ポイント)   Date: 2009/12/15(火) 20:51   No:44153     
Title: Re:エラーになるのですが    
先ほどの「お願いします!」さんとは、別の方なのでしょうか?
「初心者」というハンドルネームは、他の方が既に使われています。
お願いするという立場なら、もう少し規約を読んで常識をわきまえてはいかがでしょうか。

プログラムは全部を添付して下さい。
エラーが出る場合は、何というエラーか記述して下さい。


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

Name: C言語  ..ぴよぴよ(149ポイント)   Date: 2009/12/15(火) 21:03   No:44157     
Title: Re:エラーになるのですが    
#include <stdio.h>
int main(void)
{
    int month, days;
    puts("月を入力してください:");
    scanf("%d",&month);
    
//
if (month ==2)
days == 28;
else if (month ==1 || month ==3 || month ==5 || month ==7
                  || month ==8 || month ==10 || month ==12)
days == 31;
else if (month ==4 || month ==6 || month ==9 || month ==11)
days == 30;



    printf("%d月は%d日あります。\n", month, days);
    return(0);
}
//

解答例が1月は1049568日あります。になってしまいます。


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

Name: デラ初心者  ..かけだし(2,146ポイント)   Date: 2009/12/15(火) 21:18   No:44164     
Title: Re:エラーになるのですが    
switch文にすれば良いんじゃないですか?

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

Name: non  ..比類無きプログラマー(82,070ポイント)   Date: 2009/12/15(火) 21:19   No:44165     
Title: Re:エラーになるのですが    
先ほどの「初心者」さんと同じ方でしょうか?
「C言語」というハンドルネームの方もおられますが・・・

まぁ、それはそうとして、規約は読みましたか?
添付するときのルールがありますよ。

最初に添付してあるものと、今回添付してあるものでは、違います。
判断に困ります。
BCCでコンパイルしましたが、エラーは出ません。(警告はありますが)
あなたの環境は何ですか?


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

Name: デラ初心者  ..かけだし(2,225ポイント)   Date: 2009/12/15(火) 21:56   No:44168     
Title: Re:エラーになるのですが    
先ほどの「初心者」さんと同じ方でしょうか? 
「C言語」というハンドルネームの方もおられますが・・・

自分は別人です
名前の通り初心者です

自分のコンパイラは
MicrosoftVisualC++2008です


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

Name: box  ..ハッカー(147,615ポイント)   Date: 2009/12/15(火) 22:06   No:44170     
Title: Re:エラーになるのですが    
> if (month ==2)
> days == 28;

days に 28 を代入するときの等号は2個必要ですか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,112,058ポイント)   Date: 2009/12/15(火) 22:18   No:44174     
Title: Re:エラーになるのですが    
> デラ初心者さん

きっとnonさんはトピ主に言っているのだと思いますよ^^;


後、初心者さん、C言語さん、お願いします!さんは同じ方ですね。
明らかに回答の質問に対して答えているのに名前を変えるのは何故なのでしょうか・・。

投稿の仕方がちょっと酷いようです。
よく規約を読んで投稿して下さい。


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

Name: non  ..比類無きプログラマー(82,126ポイント)   Date: 2009/12/15(火) 22:18   No:44175     
Title: Re:エラーになるのですが    
>先ほどの「初心者」さんと同じ方でしょうか? 

>デラ初心者さん
間に、デラ初心者さんのメッセージが入っちゃいましたが、
デラ初心者さんに、お尋ねしたわけではありません。


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

Name: たかぎ [URL]  ..ハッカー(136,949ポイント)   Date: 2009/12/15(火) 22:20   No:44176     
Title: Re:エラーになるのですが    
> この場合わけやるとエラーになります。なぜですか?

文法が間違っているから。


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

Name: デラ初心者  ..かけだし(2,254ポイント)   Date: 2009/12/16(水) 08:41   No:44206     
Title: Re:エラーになるのですが    
そうですか〜

少々邪魔したようですね
申し訳ありません


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

Name: Naohiro19  ..かけだし(1,972ポイント)   Date: 2009/12/16(水) 13:18   No:44230     
Title: Re:エラーになるのですが    
== はif文の比較を行うため必要ですが
daysに代入するときは== ではなく=です。

No:44157のプログラムはランタイムエラーを引き起こします。


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

Name: デラ初心者  ..かけだし(2,498ポイント)   Date: 2009/12/16(水) 19:28   No:44293     
Title: Re:エラーになるのですが    
自分ならこの様に書きます
    switch(month){
        case 2:
                days =28;
                break;
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            days =31;
                           break;
これじゃ1〜12以外が押されたら困りますが・・・


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



Name: たこやき  ..初心者(5,011ポイント)   Date: 2009/12/15(火) 23:35   No:44185       
Title: TextDrowについて    
TextDrow()で描画したのですが、改行はするのですが、ウィンドウのサイズを小さくして大きくして改行されると最後の文字が連なって表示されます。どうしたら文字が連なわなくすることができるのでしょうか?

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


Name: たこやき  ..初心者(5,018ポイント)   Date: 2009/12/15(火) 23:59   No:44186     
Title: Re:TextDrowについて    
ソース間違えました。

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

Name: たいちう  ..プログラマー(39,425ポイント)   Date: 2009/12/16(水) 00:56   No:44192     
Title: Re:TextDrowについて    
次々と質問するよりも、しっかりとWinAPIの基礎を学ぶべきだと思います。
描画の仕組みとかイメージできていないでしょ。

http://www.kumei.ne.jp/c_lang/
http://www.amazon.co.jp/dp/4756136001


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

Name: たこやき  ..初心者(5,166ポイント)   Date: 2009/12/16(水) 03:13   No:44198     
Title: Re:TextDrowについて    
そのサイトではないですがあるサイトで
#include<windows.h>

int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE,PSTR lpCmdLine ,int nCmdShow ) {
    MessageBox(NULL , lpCmdLine , TEXT("Kitty") , MB_ICONINFORMATION);
    return 0;
}のlpCmdLineがパスが文字化けして出ないのですが。
これはGetCommandLine関数でやった方がいいのでしょうか?
またなぜ文字化けしたのでしょうか?


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

Name: たいちう  ..プログラマー(39,741ポイント)   Date: 2009/12/16(水) 09:54   No:44209     
Title: Re:TextDrowについて    
落ち着いて質問を読み直してください。

・環境が書いていません。
・どのような出力のプログラムを書いたのか書いていません。
・どこでどのように文字化けしているのか書いていません。

これらは回答に最低限必要な情報です。
これなしで私に確実に答えられることは、
「私のプログラムでは文字化けしませんよ」程度です。


こっからはサービスです。少しだけね。
VC2003でデフォルトの_tWinMainの直後に次のように書いたら文字化けもなく、
ひらがなの出力ができました。

TCHAR buf[1024];
_tcscpy(buf, lpCmdLine);
OutputDebugString(buf);
OutputDebugString(TEXT("\n"));


最後にもう一度書きますが、質問の投稿前に必ず読み直し、
自分の状況が相手に伝わるかを想像すると約束してください。


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

Name: たこやき  ..初心者(5,186ポイント)   Date: 2009/12/16(水) 16:04   No:44242     
Title: Re:TextDrowについて    
すみませんでした。環境はVC2005です。どういう文字化けが出たかは、どう書いてよいのかわかりません。漢字が
出てきます。メッセージボックスのクライアント領域に文字化けが表示されます。


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

Name: たいちう  ..プログラマー(39,832ポイント)   Date: 2009/12/16(水) 16:11   No:44243     
Title: Re:TextDrowについて    
私が書いた例は実行しましたか?
プロジェクトを新しく作って試してください。

> メッセージボックスのクライアント領域に文字化けが表示されます。

なぜメッセージボックス表示のコードをここに書かないのですか?
それと、半角英数字が正しく表示できるか確認してください。


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

Name: たこやき  ..初心者(5,448ポイント)   Date: 2009/12/16(水) 16:28   No:44245     
Title: Re:TextDrowについて    
回答ありがとうございます。
試しました・・・が文字化けでした。
#include<windows.h> 
#include<TCHAR.h> 

int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE,LPSTR lpCmdLine ,int nCmdShow ) { 
   TCHAR buf[1024]; 
   _tcscpy(buf, (LPWSTR)lpCmdLine);
 
   OutputDebugString(buf); 
   OutputDebugString(TEXT("\n")); 
   MessageBox(NULL , buf , TEXT("Kitty") , MB_ICONINFORMATION); 

return 0;  
}
半角英数字は正しく表示できてると思います。


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

Name: たいちう  ..プログラマー(39,882ポイント)   Date: 2009/12/16(水) 16:42   No:44246     
Title: Re:TextDrowについて    
私の書いた例では、どこに出力されましたか?
また、コマンドライン引数には何をどのように渡しましたか?


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

Name: たこやき  ..初心者(5,527ポイント)   Date: 2009/12/16(水) 16:48   No:44247     
Title: Re:TextDrowについて    
回答ありがとうございます。
ウィンドウのクライアント領域の真ん中に文字化けで出力されました。
確か A abcd とプロジェクトのプロパティのコマンド引数のところに書きました。


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

Name: たいちう  ..プログラマー(39,905ポイント)   Date: 2009/12/16(水) 17:01   No:44252     
Title: Re:TextDrowについて    
> ウィンドウのクライアント領域の真ん中に文字化けで出力されました。 

私はそのような例を書いていませんけど。このスレの話ですよ。
しっかり確認してください。


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

Name: たこやき  ..初心者(5,554ポイント)   Date: 2009/12/16(水) 17:10   No:44254     
Title: Re:TextDrowについて    
回答ありがとうございます。
OutputDebugStringは表示されませんでした。


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

Name: たいちう  ..プログラマー(39,936ポイント)   Date: 2009/12/16(水) 17:16   No:44257     
Title: Re:TextDrowについて    
OutputDebugStringについて調べましたか?
画面に表示する関数ではないですよ。


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

Name: たこやき  ..初心者(5,601ポイント)   Date: 2009/12/16(水) 17:31   No:44258     
Title: Re:TextDrowについて    
回答ありがとうございます。
わかっています。デバッグの出力元に表示されるのですよね。
すみません。探してみましたが上の方に書いてありました。
?????とだけ書いてあります。


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

Name: YuO  ..熟練のプログラマー(41,359ポイント)   Date: 2009/12/16(水) 17:37   No:44260     
Title: Re:TextDrowについて    
> _tcscpy(buf, (LPWSTR)lpCmdLine);

このキャストは何のためにしているのですか。


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

Name: たいちう  ..プログラマー(39,974ポイント)   Date: 2009/12/16(水) 17:46   No:44265     
Title: Re:TextDrowについて    
> わかっています。デバッグの出力元に表示されるのですよね。

たこやきさんが分かっているということを書いてくれないと、
私にはそれが分からないのですよ。忘れないで書いてください。


> ?????とだけ書いてあります。

それは、私の例のままですか?
YuOさんの指摘しているcastをしているのですか?

それとプロジェクトの文字セットを教えてください。


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

Name: たこやき  ..初心者(5,691ポイント)   Date: 2009/12/16(水) 17:54   No:44268     
Title: Re:TextDrowについて    
回答ありがとうございます。
はい、YuOさんの指摘しているとおりcastしてます。
出ないとエラーが「PSTRからLPWSTRに変換できません」と表示されるのです。
ので入れてみました。
間違っていますでしょうか?
文字セットはUnicodeです。


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

Name: softya  ..熟練のプログラマー(68,885ポイント)   Date: 2009/12/16(水) 18:03   No:44272     
Title: Re:TextDrowについて    
LPSTRはマルチバイト文字列のポインタです。
LPSTRの文字列の文字コードはマルチバイト文字じゃないでしょうか?

今のままだとマルチバイト文字列のポインタを無理やりワイド文字列のポインタにキャストしてるだけですね。
ポインタをキャストしているだけですから、当然中身の文字列はマルチバイト文字のままなので文字化けしているんですね。

この間から曖昧に使っているなとは思いますが重症です。
まず、マルチバイト文字とワイド文字の違いを理解してください。
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%90%E3%82%A4%E3%83%88%E6%96%87%E5%AD%97#.E3.83.AF.E3.82.A4.E3.83.89.E6.96.87.E5.AD.97.E3.81.A8.E3.81.AE.E5.AF.BE.E6.AF.94
http://ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A4%E3%83%89%E6%96%87%E5%AD%97
Windowsだとワイド文字の文字コードは"UTF-16"です。 覚えておいてください。

さて、問題解決ですが
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE,LPSTR lpCmdLine ,int nCmdShow ) { 
である限りワイド文字列ではなくマルチバイト文字列となります。

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPWSTR lpCmdLine, int nShowCmd);
を使ってください。


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

Name: YuO  ..熟練のプログラマー(41,505ポイント)   Date: 2009/12/16(水) 18:07   No:44273     
Title: Re:TextDrowについて    
> 出ないとエラーが「PSTRからLPWSTRに変換できません」と表示されるのです。 
> ので入れてみました。 
> 間違っていますでしょうか?

間違っています。
というか,一番やってはいけないキャストです。

キャストはエラーを消すためにあるのではないです。
Win32 APIではどうしても多用しますが,これは例えばWPARAMに構造体へのポインタが入っていると決まっている等の,
ちゃんとした理由に基づくもので,「エラーを消すためのキャスト」ではありません。


TCHARを使ってプログラムを作るのであれば,エントリポイントは_tWinMainを使い,
LP(C)STRやLP(C)WSTRではなくLP(C)TSTRを,char (CHAR) やwchar_t (WCHAR) ではなくTCHARを,
それぞれ使って組む必要があります。


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

Name: たいちう  ..熟練のプログラマー(40,171ポイント)   Date: 2009/12/16(水) 18:19   No:44275     
Title: Re:TextDrowについて    
> VC2003でデフォルトの_tWinMainの直後に次のように書いたら文字化けもなく、 
> ひらがなの出力ができました。 
...
> 私が書いた例は実行しましたか? 
> プロジェクトを新しく作って試してください。 

というような事を私は書いているわけで、その通りに
VCのデフォルトで作れば、問題は回避されていたはずです。
文字化けが解決した後に振り返って、
自分の姿勢のどこが間違っていたかを考えてください。


さて、もう一度、新しくプロジェクトを作り、
デフォルトに私が書いた4行だけ追加して確認してみてください。

# 集中砲火みたいに感じるかもしれませんが、誰も非難するつもりはないですよ。
# でも、みんなから似た指摘をされるならば、多分そこがあなたの弱点なのでしょう。
# 成長するには克服する必要がありますね。


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

Name: softya  ..熟練のプログラマー(68,943ポイント)   Date: 2009/12/16(水) 18:24   No:44278     
Title: Re:TextDrowについて    
あっ、_tWinMainじゃないとまずかったですね。訂正します。
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nShowCmd);
これでお願いします。 


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

Name: たこやき  ..初心者(5,771ポイント)   Date: 2009/12/16(水) 18:30   No:44284     
Title: Re:TextDrowについて    
softyaさん回答ありがとうございます。
サイト参考にしたいと思います。ところで一つ質問なのですが、今自分winodwXPを使っているのですが、
Window2000serverSP4下位で使うことを考えた場合、マルチバイト文字を使うべきなのでしょうか?
ワイド文字列を使うべきなのでしょうか?基本的にワイド文字列を使った方がいいのでしょうか?



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

Name: たこやき  ..初心者(5,943ポイント)   Date: 2009/12/16(水) 18:48   No:44287     
Title: Re:TextDrowについて    
YuOさん回答ありがとうございます。

そうなんですか、一番やってはいけないことですか。わかりました以後気をつけます。

 たいちうさん回答ありがとうございます。

># 集中砲火みたいに感じるかもしれませんが、誰も非難するつもりはないですよ。
># でも、みんなから似た指摘をされるならば、多分そこがあなたの弱点なのでしょう。
># 成長するには克服する必要がありますね。
当然何言われるか分からないと覚悟して聞いてますので仕方ないと思っています。
弱点を克服するため頑張りたいと思います!


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

Name: YuO  ..熟練のプログラマー(41,683ポイント)   Date: 2009/12/16(水) 18:58   No:44289     
Title: Re:TextDrowについて    
> Window2000serverSP4下位で使うことを考えた場合、マルチバイト文字を使うべきなのでしょうか? 
> ワイド文字列を使うべきなのでしょうか?基本的にワイド文字列を使った方がいいのでしょうか?

W系のAPIは,NT系列 (製品名にNTの付かない2000〜7/2008含む) では初期からサポートされていました。
とりあえず,私が扱ったことのある中での最古はWindows NT 4.0です。

このため,Windows 2000であればW系のAPIを利用する事に躊躇する必要はありません。
# A系のAPIを利用した場合,内部でW系のAPIを呼び出す実装になっていると聞いています。
ただし,ファイルの読み書きを行う場合は,文字コードに注意する必要が (A/Wどちらにしろ) 出てきます。


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

Name: たこやき  ..初心者(5,996ポイント)   Date: 2009/12/16(水) 19:06   No:44291 解決!     
Title: Re:TextDrowについて    
yuOさん回答ありがとうございます。W系のAPIを利用することに躊躇わなくてよいのですね。回答ありがとうごさいました。


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



Name: jay  ..中級者(13,021ポイント)   Date: 2009/12/16(水) 10:17   No:44210       
Title: 警告が消えません    
龍神録をビルドすると
warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。 今後のバージョンからは削除されます。
という警告が出ます 。
ビルドはちゃんとできるのですが、気になったので質問させていただきます。
この警告はどうすれば消えるのでしょうか?

環境は
Windows Vista
Visual C++ 2008 Express Edition
です。


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


Name: Mist  ..比類無きプログラマー(77,666ポイント)   Date: 2009/12/16(水) 10:37   No:44211     
Title: Re:警告が消えません    
アプリケーションのプロパティから、構成プロパティ→C/C++→全般 の画面で、64ビット移植への対応を「いいえ」にすれば、このWarningは出なくなります。

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

Name: jay  ..中級者(13,052ポイント)   Date: 2009/12/16(水) 18:21   No:44277 解決!     
Title: Re:警告が消えません    
おお、ありがとうございます。
おかげで警告が消えました。
やっぱり警告が無いほうがスッキリしますもんね。


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



Name: 初心者  ..熟練のプログラマー(42,628ポイント)   Date: 2009/12/14(月) 14:21   No:44017       
Title: 龍神録 ポーズ中の効果音について    
こんにちは。龍神録50章をいじってます。
今度は支館様の一時停止のときにどうしても解決出来ない問題があったので
質問させていただきました。
一時停止の判定を押した瞬間に
StopSoundMem(area.bgm.handle);    //音楽を止める
で音楽を止め
一時停止を解除した瞬間に
PlaySoundMem( area.bgm.handle , DX_PLAYTYPE_LOOP , FALSE );        //音楽を鳴らす
で音楽を開始するようにしてます。
この一時停止中に選択肢を選んでいるときに
効果音を鳴らしたいのですが、鳴りません。
多分StopSoundMemで音楽を止めてるから
効果音が鳴らなくなってしまっているのだと考えているのですが、
どうしたら、メインBGMはストップ&効果音が鳴るようになるでしょうか?
アドバイスお願いします


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


Name: Dixq (管理人)  ..ウィザード(1,107,862ポイント)   Date: 2009/12/14(月) 15:18   No:44020     
Title: Re:龍神録 ポーズ中の効果音について    
ハンドルの違う音楽データには影響されないと思いますよ。
何か他の原因じゃないですか?
実はファイルが読み込めてないとか


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

Name: 初心者  ..熟練のプログラマー(43,628ポイント)   Date: 2009/12/14(月) 22:59   No:44043     
Title: Re:龍神録 ポーズ中の効果音について    
すみません。まったく原因が分からないので、
control.cpp内のどこが原因なのか見てもらえないでしょうか?
ついでに、一時停止中にZボタンを押すと、メイン画面内が真っ暗になるバグも発生してて
参ってます・・・

void MenuDraw(){
    //背景を暗く
    SetDrawBlendMode( DX_BLENDMODE_ALPHA , 80 );
    DrawBox( FX , FY , FX+FMX , FY+FMY , color[1] , TRUE );
    SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 );

    //タイトル表示
    if(game_pause==0){        //一時停止を解除する
        DrawBox(FX+35,FY+310,FX+225,FY+330,color[0],TRUE);    //四角形(白)
    }
    if(game_pause==1){        //タイトルへ戻る
        DrawBox(FX+35,FY+340,FX+225,FY+360,color[0],TRUE);    //四角形(白)
    }
    if(game_pause==2){        //リプレイを保存して終了
        DrawBox(FX+35,FY+370,FX+225,FY+390,color[0],TRUE);    //四角形(白)
    }
    if(game_pause==3){        //最初からやり直す
        DrawBox(FX+35,FY+400,FX+225,FY+420,color[0],TRUE);    //四角形(白)
    }

    
    DrawGraph(FX+10,FY+260,img_board[16],TRUE);                    //一時停止用

    //キャプチャした画像の開放
    if( CheckStatePad(configpad.shot) == 1 ){
        DeleteGraph( img_screen );
    }
}

//一時停止
void game_stop(){
    MenuDraw();
    switch(game_pause){
        case 0:        //一時停止を解除する
            if(CheckStateKey(KEY_INPUT_UP)==1){
                se_flag[42]=1;                //カーソル音
                game_pause =3;                //表示を3にする(最初からやり直すへ移動)
            }
            if(CheckStateKey(KEY_INPUT_DOWN)==1){
                game_pause =1;                //表示を1にする(タイトルへ戻るへ移動)
                se_flag[42]=1;                //カーソル音
            }
            if(CheckStatePad(configpad.shot)==1){
                if(ch.story_flag == 0){        //ゲームメインなら
                    PlaySoundMem( area.bgm.handle , DX_PLAYTYPE_LOOP , FALSE );        //音楽を鳴らす
                    func_state = 100;        //メインに戻る
                }
                if(ch.story_flag == 1){        //ノベル中なら
                    PlaySoundMem( area.bgm.handle , DX_PLAYTYPE_LOOP , FALSE );        //音楽を鳴らす
                    func_state = 103;        //ノベルに戻る
                }
                se_flag[44]=1;                //決定音
            }
            break;
        case 1:        //タイトルへ戻る
            if(CheckStateKey(KEY_INPUT_UP)==1){
                game_pause =0;                //表示を0にする(一時停止を解除するへ移動)
                se_flag[42]=1;                //カーソル音
            }
            if(CheckStateKey(KEY_INPUT_DOWN)==1){
                game_pause =2;                //表示を2にする(リプレイを保存して終了へ移動)
                se_flag[42]=1;                //カーソル音
            }
            if(CheckStatePad(configpad.shot)==1){
                func_state = 3;                //タイトル前の初期化へ
                se_flag[44]=1;                //決定音
            }
            break;
        case 2:        //リプレイを保存して終了
            if(CheckStateKey(KEY_INPUT_UP)==1){
                game_pause =1;                //表示を1にする(タイトルへ戻るへ移動)
                se_flag[42]=1;                //カーソル音
            }
            if(CheckStateKey(KEY_INPUT_DOWN)==1){
                game_pause =3;                //表示を3にする(最初からやり直すへ移動)
                se_flag[42]=1;                //カーソル音
            }
            //if(CheckStatePad(configpad.shot)==1){
            //    se_flag[43]=1;                //選択できない音
            //}
            break;
        case 3:        //最初からやり直す
            if(CheckStateKey(KEY_INPUT_UP)==1){
                game_pause =2;                //表示を2にする(リプレイを保存して終了へ移動)
                se_flag[42]=1;                //カーソル音
            }
            if(CheckStateKey(KEY_INPUT_DOWN)==1){
                game_pause =0;                //表示を0にする(一時停止を解除するへ移動)
                se_flag[42]=1;                //カーソル音
            }
            if(CheckStatePad(configpad.shot)==1){
                func_state = 99;            //ゲーム初期化
                delete_bgm();                //BGM初期化
                se_flag[44]=1;                //決定音
            }
            break;
        default:
            printfDx("不明なgame_pause\n");
            break;
    }
}










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

Name: 初心者  ..熟練のプログラマー(44,799ポイント)   Date: 2009/12/14(月) 22:59   No:44044     
Title: Re:龍神録 ポーズ中の効果音について    
続き

//コンテニューは省略

//制御中の処理に応じた対応へ
void control_main(){
    switch(func_state){
        case 100:                                //メインゲーム
            //Escが押されたかつ、ボードがフェードインしてないかつ、クリア処理を行ってなければ
            if(CheckStateKey(KEY_INPUT_ESCAPE)==1&&board.flag==1&&clear.flag==0){
                //ここで画面をキャプチャ(スクリーンショットを撮る)
                img_screen = MakeGraph( 640 , 480 ) ;
                GetDrawScreenGraph( 0 , 0 , 640 , 480 , img_screen ) ;
                ch.story_flag =  0;
                ch.pause_cnt  =  0;
                game_pause    =  0;
                StopSoundMem(area.bgm.handle);    //音楽を止める
                func_state    =101;                //一時停止処理へ
            }
            if( ch.num < 0){                    //残機0なら
                //ここで画面をキャプチャ(スクリーンショットを撮る)
                img_screen = MakeGraph( 640 , 480 ) ;
                GetDrawScreenGraph( 0 , 0 ,    640 , 480 , img_screen ) ;
                ch.story_flag =  0;
                ch.pause_cnt  =  0;
                StopSoundMem(area.bgm.handle);    //音楽を止める
                func_state    =102;                //コンティニューへ
            }
            break;
        case 101:                                //一時停止
            game_stop();
            if(CheckStateKey(KEY_INPUT_ESCAPE)==1){
                if(ch.story_flag == 0){            //ゲームメインなら
                    PlaySoundMem( area.bgm.handle , DX_PLAYTYPE_LOOP , FALSE );        //音楽を鳴らす
                    func_state = 100;            //メインに戻る
                    DeleteGraph( img_screen );    //キャプチャ画像の開放
                }
                if(ch.story_flag == 1){            //ノベル中なら
                    PlaySoundMem( area.bgm.handle , DX_PLAYTYPE_LOOP , FALSE );        //音楽を鳴らす
                    func_state = 103;            //ノベルに戻る
                    DeleteGraph( img_screen );    //キャプチャ画像の開放
                }
            }
            break;
        case 102:                                //コンティニュー
            game_continu();
            break;
        case 103:                                //サウンドノベル
            if(CheckStateKey(KEY_INPUT_ESCAPE)==1){
                img_screen = MakeGraph( 640 , 480 ) ;
                GetDrawScreenGraph( 0 , 0 , 640 , 480 , img_screen ) ;
                ch.story_flag = 1;
                StopSoundMem(area.bgm.handle);    //音楽を止める
                func_state = 101;                //一時停止処理へ
            }
            if( ch.num < 0){                    //残機0なら
                img_screen = MakeGraph( 640 , 480 ) ;
                GetDrawScreenGraph( 0 , 0 ,    640 , 480 , img_screen ) ;
                ch.story_flag = 1;
                StopSoundMem(area.bgm.handle);    //音楽を止める
                func_state = 102;                //コンティニューへ
            }
        default:
            break;
    }
}












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

Name: 初心者  ..熟練のプログラマー(44,848ポイント)   Date: 2009/12/15(火) 17:08   No:44107     
Title: Re:龍神録 ポーズ中の効果音について    
あの・・よろしくお願いします

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

Name: ひよこ  ..比類無きプログラマー(75,968ポイント)   Date: 2009/12/15(火) 17:35   No:44109     
Title: Re:龍神録 ポーズ中の効果音について    
まさか1時停止のところにbgm_main();が抜けてるって理由ですかね?        

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

Name: ひよこ  ..比類無きプログラマー(75,993ポイント)   Date: 2009/12/15(火) 17:38   No:44110     
Title: Re:龍神録 ポーズ中の効果音について    
上のはまちがいです。se_flag[42]に音楽が読み込まれていますか?
music_playは通っていますか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,109,088ポイント)   Date: 2009/12/15(火) 17:50   No:44115     
Title: Re:龍神録 ポーズ中の効果音について    
フラグは立てていると思いますが、たてたフラグのサウンドを鳴らす処理はしていますか?

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

Name: 初心者  ..熟練のプログラマー(45,043ポイント)   Date: 2009/12/15(火) 19:58   No:44141     
Title: Re:龍神録 ポーズ中の効果音について    
>>ひよこさん
>se_flag[42]に音楽が読み込まれていますか? 
>music_playは通っていますか?
読み込まれてます。また、通ってます。
念のため、違う個所で
例えばse_flag[42]=1;//カーソル音
を鳴らしてみたところ、ちゃんと鳴りました。
>>Dixq (管理人)さん
>フラグは立てていると思いますが、たてたフラグのサウンドを鳴らす処理はしていますか?
music.cpp内の
void music_play(){
    int i;
    for(i=0;i<SE_MAX;i++){
        if(se_flag[i]==1){
            if(CheckSoundMem(sound_se[i])!=0){
                if(i==8)continue;
                StopSoundMem(sound_se[i]);
            }
            PlaySoundMem(sound_se[i],DX_PLAYTYPE_BACK);
        }
    }
}
で処理をしてるので、鳴ります。

プログラムのほうは問題ないのでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,112,220ポイント)   Date: 2009/12/15(火) 22:26   No:44178     
Title: Re:龍神録 ポーズ中の効果音について    
呼び出し元でこの関数が呼び出されていないという事はないですか?

一切合財コンパイル出来る形でアップローダなどにアップロードしてもらった方がよさそうな気がしますが・・。


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

Name: 初心者  ..熟練のプログラマー(45,164ポイント)   Date: 2009/12/15(火) 23:02   No:44181     
Title: Re:龍神録 ポーズ中の効果音について    
>呼び出し元でこの関数が呼び出されていないという事はないですか?

というのはどういったことなのでしょうか?


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

Name: 通りすがり  ..上級者(18,316ポイント)   Date: 2009/12/16(水) 18:02   No:44271     
Title: Re:龍神録 ポーズ中の効果音について    
>メイン画面内が真っ暗になるバグも発生してて
>参ってます・・・

多分これが原因?
    //キャプチャした画像の開放
    if( CheckStatePad(configpad.shot) == 1 ){
        DeleteGraph( img_screen );
    }




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



Name: らふ  ..ぴよぴよ(99ポイント)   Date: 2009/12/16(水) 16:49   No:44248       
Title: 無題    
僕はVisaul2005でやっているため
http://dixq.net/rp/img/1/1.png の画像みたいにソースファイルなどがなくて
改造する部分がないので書き換えができません
どうすればいいですか?


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


Name: らふ  ..ぴよぴよ(107ポイント)   Date: 2009/12/16(水) 16:52   No:44249     
Title: Re:無題    
こんな感じで表示されています

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

Name: らふ  ..ぴよぴよ(116ポイント)   Date: 2009/12/16(水) 16:55   No:44250 解決!     
Title: Re:無題    
解決しました

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

Name: Naohiro19  ..かけだし(1,992ポイント)   Date: 2009/12/16(水) 16:56   No:44251     
Title: Re:無題    
> 解決しました

書き込みをしようと思ったら先に解決でしたか。


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



Name: kos-mos  ..初心者(6,999ポイント)   Date: 2009/12/16(水) 03:33   No:44199       
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++は数カ月程度の初心者です。
五度目の投稿なので至らないところもあると思いますが、どうかよろしく願いします。



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


Name: kos-mos  ..初心者(7,013ポイント)   Date: 2009/12/16(水) 03:50   No:44200     
Title: Re:行列について(c++)    
わかる範囲で書いてみましたが、3.3.1.と3.4.1.のところで入力された値が0〜2ならば以下の処理を実行するという条件文を入れたのですが、これでコンパイルすると、加えたif文のところで: 「演算中の 'bool' 型の使用方法が安全ではありません」と表示されました。
どうしたらいいかわかりません。お願いします。




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

Name: kos-mos  ..初心者(7,551ポイント)   Date: 2009/12/16(水) 03:52   No:44201     
Title: Re:行列について(c++)    
長すぎるみたいなので、半分に切りました。(その1)

<pre>
#include <iostream>
using namespace std;

//定数定義
#define N 3  //配列の行数
#define M 3  //配列の列数
#define END 0  //終了
#define INPUT 1  //値の入力
#define SHOW 2   //表示
#define COLUMN 3    //列の入れ替え
#define ROW 4    //行の入れ替え
#define TRANSPOSE 5  //転置

//プロトタイプ宣言
void showMenu(void);         //機能の一覧を表示する関数
void getMatrix(void);        //行列に値を入力する関数
void showMatrix(void);       //行列を表示する関数
void ExchangeColumn(int column1, int column2); //利用者が入力した列番号に基づいて、行列の2つの列を入れ替える関数
void ExchangeRow(int row1, int row2);         //利用者が入力した列番号に基づいて、行列の2つの列を入れ替える関数
void transposeMatrix(void);           //転置行列を求める関数

//大域変数
int matrix[N][M];  //対象とする行列

/********************************
メイン関数
********************************/
void main(){
    int functionNumber; //機能番号
    int column1;  //入れ替えする列番号
    int column2;  //入れ替えする列番号
    int row1;     //入れ替えする行番号
    int row2;     //入れ替えする行番号

    //1.機能の一覧を表示する
    showMenu();
    cout << "機能番号=";

    //2.機能番号を入力する
    cin >> functionNumber;

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

        //選択された機能番号によって処理を分岐する
        switch(functionNumber){

            //3.1.「値の入力」が選択されたならば、行列に値を入力する
            case INPUT:
                getMatrix();
                break;

            //3.2.「表示」が選択されたならば、行列を表示する
            case SHOW:
                showMatrix();
                break;

            //3.3.「列の入れ替え」が選択されたならば、以下の処理を実行する
            case COLUMN:

                //3.3.1.入れ替わる列番号column1,column2を入力する
                cout << "入れ替える列番号を入力してください(0〜2)" << endl;
                cin >> column1;
                cin >> column2;
            
                                if(0 <= column1 <= 2, 0 <= column2 <= 2){

                //3.3.2.配列のcolumn1列とcolumn2列を入れ替える
                ExchangeColumn(column1, column2);
                break;
                                }            

            //3.4.「行の入れ替え」が選択されたならば、以下の処理を実行する
            case ROW:

                //3.4.1.入れ替える行の番号row1,row2を入力する
                cout << "入れ替える行の番号を入力してください(0〜2)" << endl; 
                cin >> row1;
                cin >> row2;

                                if(0 <= row1 <= 2, 0 <= row2 <= 2){
                
                                //3.4.2.配列のrow1行目とrow2行目を入れ替える
                ExchangeRow(row1, row2);
                break;
                                }
                      
            //3.5.「転置」が選択されたならば、行列を転置する
            case TRANSPOSE:
                transposeMatrix();
                break;

            //3.6.機能番号が0〜5以外ならば、以下のコメントを表示する
            default:
                cout << "それは選択できません" << endl;
                cout << "0〜5から選択してください" << endl;
                break;
        }

        //3.7.機能の一覧を表示する
        showMenu();
        cout << "機能番号=";

        //3.8.機能番号を入力する
        cin >> functionNumber;
    }
}



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

Name: kos-mos  ..初心者(8,383ポイント)   Date: 2009/12/16(水) 03:52   No:44202     
Title: Re:行列について(c++)    
(その2)

/****************************************
         機能の一覧を表示する
****************************************/
void showMenu(void){

    //1.機能番号の一覧を表示する
    cout << "機能番号を選択してください" << endl;
    cout << "プログラムを終了する" << "・・・・・・・" << END << endl;
    cout << "行列に値を入力する" << "・・・・・・・・" << INPUT << endl;
    cout << "行列の値を表示する" << "・・・・・・・・" << SHOW << endl;
    cout << "行列の指定された列を入れ替える" << "・・" << COLUMN << endl;
    cout << "行列の指定された行を入れ替える" << "・・" << ROW << endl;
    cout << "行列を転置する" << "・・・・・・・・・・" << TRANSPOSE << endl;
}

/****************************************
           行列に値を入力する
****************************************/
void getMatrix(void){

    //1.各行rowに対して以下の処理を繰り返す
    for(int i = 0; i < N; i++){

        //1.1.当該行の各列columnに対して以下の処理を繰り返す
        for(int j = 0; j < M; j++){

            //1.1.1.行列のrow行column列の要素に値を入力する
            cout << "matrix[" << i << "] = ";
            cout << "matrix[" << j << "] = ";
            cin >> matrix[i][j];
        }
    }
}

/******************************
       行列を表示する
******************************/
void showMatrix(void){

    //1.各行rowに対して以下の処理を繰り返す
    for(int i = 0; i < N; i++){

        //1.1.当該行の各列columnに対して以下の処理を繰り返す
        for(int j = 0; j < M; j++){

            //1.1.1.行列のrow行column列の要素の値を表示する
            cout << matrix[i][j] << "\t";
        }

        //1.2.改行する
        cout << endl;
    }
}

/******************************
     行列の列を入れ替える
******************************/
void ExchangeColumn(int column1, int column2){

    //1.各行rowに対して以下の処理を繰り返す
    for(int i = 0; i < N; i++){

        //1.1.行列のrow行column1列目の要素とrow行column2列目の要素とを入れ替える
        int temp = matrix[i][column1];
        matrix[i][column1] = matrix[i][column2];
        matrix[i][column2] = temp;
    }
}

/**********************************
       行列の行を入れ替える
**********************************/
void ExchangeRow(int row1, int row2){

    //1.各行columnに対して以下の処理を繰り返す
    for(int j = 0; j < M; j++){

        //1.1.行列のrow1行column列目の要素とrow2行column列目の要素とを入れ替える
        int temp = matrix[row1][j];
        matrix[row1][j] = matrix[row2][j];
        matrix[row2][j] = temp;
    }
}

/***********************************
          行列を転置する
***********************************/
void transposeMatrix(void){

    //1.各行rowに対して以下の処理を繰り返す
    for(int i = 1; i < N; i++){

        //1.1.当該行の0〜row-1番目までの各列columnに対して以下の処理を繰り返す
        for(int j = 0; j < N -1; j++){

            //1.1.1.行列のrow行column列目の要素とcolumn行row列目の要素とを入れ替える
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
}

</pre>


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

Name: non  ..比類無きプログラマー(82,262ポイント)   Date: 2009/12/16(水) 08:51   No:44207     
Title: Re:行列について(c++)    
前回投稿より、少し進んだようですね。

さて、警告は
>if(0 <= column1 <= 2, 0 <= column2 <= 2){
2つの条件を並べて書くなら、 && か || です。

ついでに、breakは、ifブロックの外でなくていいですか?

長いプログラムを、字下げなしで貼られると、読む気がしません。
preをつけようと努力はしたみたいですが、このようなときは、削除キーを
入れておいて、うまくいかなかったときは、編集してください。
または、長いプログラムはファイルで添付してください。


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

Name: kos-mos  ..初心者(8,456ポイント)   Date: 2009/12/16(水) 12:28   No:44221     
Title: Re:行列について(c++)    
preは二つに分けた時に、一緒に分けてしまったのを削除キーを設定せずにUPしたのとともに
後で気づいてしまいました。
以後気をつけます。すみませんでした。

&&に変えても警告はなくなりませんでした。



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

Name: Mist  ..比類無きプログラマー(77,691ポイント)   Date: 2009/12/16(水) 12:35   No:44222     
Title: Re:行列について(c++)    
> &&に変えても警告はなくなりませんでした。

どう変えたのか、どういう警告が出るのかを書かないと回答しようが無いですよ。


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

Name: sizuma  ..上級者(19,183ポイント)   Date: 2009/12/16(水) 12:40   No:44223     
Title: Re:行列について(c++)    
>以後
Name: kos-mos  ..初心者(8,456ポイント)   Date: 2009/12/16(水) 12:28   No:44221    引用  編集  
名前の右のリンクから編集できます。


>if(0 <= column1 <= 2, 0 <= column2 <= 2){
if(0 <= column1 <= 2 && 0 <= column2 <= 2){
こうした、ってことでしょうか?


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

Name: kos-mos  ..初心者(8,723ポイント)   Date: 2009/12/16(水) 12:42   No:44225     
Title: Re:行列について(c++)    
訂正します。すみません。

    
                                //3.3.1.入れ替わる列番号column1,column2を入力する
                cout << "入れ替える列番号を入力してください(0〜2)" << endl;
                cin >> column1;
                cin >> column2;
                
                if(0 <= column1 <= 2 && 0 <= column2 <= 2){
                
                //3.3.2.配列のcolumn1列とcolumn2列を入れ替える
                ExchangeColumn(column1, column2);
                }

                break;


としたところ(抜粋です)、「warning C4804: '<=' 演算中の 'bool' 型の使用方法が安全ではありません」と警告されました。
 


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

Name: sizuma  ..上級者(19,242ポイント)   Date: 2009/12/16(水) 12:53   No:44226     
Title: Re:行列について(c++)    
if(0 <= column1 && column1<= 2) && (0 <= column2 && column<= 2)

&か|なのかはコード読んでないのでわからないですが。


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

Name: non  ..比類無きプログラマー(82,440ポイント)   Date: 2009/12/16(水) 12:55   No:44227     
Title: Re:行列について(c++)    
0 <= column1 <= 2
このような書き方はできません。&& か || を使ってください。


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

Name: kos-mos  ..初心者(8,749ポイント)   Date: 2009/12/16(水) 13:06   No:44228 解決!     
Title: Re:行列について(c++)    
無事に警告が出ることなくコンパイルできました。
ありがとうございました。


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



Name: お願いします!  ..ぴよぴよ(135ポイント)   Date: 2009/12/15(火) 17:43   No:44111       
Title: 無題    
問題文
以下の出力例のように、月を入力して、その日数を返すプログラムを作成しなさい。

出力例:
月を入力してください: 

9月は30日あります。 


解答
#include <stdio.h>
int main(void)
{
    int month, days;
    puts("月を入力してください:");
    scanf("%d",&month);
    
//
(* ここに解答を書き加える *)


    printf("%d月は%d日あります。\n", month, days);
    return(0);
}
//

この問題も答え教えてください!


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


Name: softya  ..熟練のプログラマー(67,046ポイント)   Date: 2009/12/15(火) 17:49   No:44114     
Title: Re:無題    
規約と注意事項をよく読んで、補足を願います。
http://dixq.net/board/board.html


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

Name: non  ..比類無きプログラマー(81,677ポイント)   Date: 2009/12/15(火) 18:02   No:44121     
Title: Re:無題    
質問ですが、2月は何日ありますか?


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

Name: たかぎ [URL]  ..ハッカー(137,228ポイント)   Date: 2009/12/16(水) 10:52   No:44212     
Title: Re:無題    
規約を守らない質問者のことはどうでもよいですが、他に読んでいる人にとって、もしかすると役に立つかもしれませんので...
#include <stdio.h>
int main(void)
{
int month, days;
puts("月を入力してください:");
scanf("%d",&month);

//
    sub(month);
}

#include <time.h>

int sub(month)
    int month;
{
    time_t timer = time(NULL);
    struct tm t = *localtime(&timer);
    t.tm_mon = month;
    t.tm_mday = 0;
    mktime(&t);
    int days = t.tm_mday;

printf("%d月は%d日あります。\n", month, days);
return(0);
}
//

こんな感じでどうでしょうか?
閏年かどうかは、実行した年について判断しています。


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

Name: non  ..比類無きプログラマー(82,362ポイント)   Date: 2009/12/16(水) 11:17   No:44214     
Title: Re:無題    

t.tm_mon = month;
t.tm_mday = 0;
なるほど、こんなテクニックがあるのですね。勉強になります。




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

Name: sizuma  ..上級者(19,070ポイント)   Date: 2009/12/16(水) 11:50   No:44219     
Title: Re:無題    
>t.tm_mon = month;
>t.tm_mday = 0;
>mktime(&t);

なるほど、tmの仕様でmktime関数を使えばこんなことができるんですね。


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



Name: ft  ..初心者(7,464ポイント)   Date: 2009/12/09(水) 14:00   No:43694       
Title: 点数アイテムの吸収    
弾幕終了時にボスの弾が点数アイテムに変化して自機に吸収されるという処理を付けてみました.
しかし瞬間的にループ回数が増えるためか処理落ちしてしまいます.
どのような改善策がありますか?ソースは以下に貼っていきます

define.hの以下を変更
//アイテムの表示最大数
#define ITEM_MAX 200
out.cppに以下を追加
//ボス弾の位置に点数アイテムを置く
void enter_boss_item(){
    int i,item_n[1]={6};
        for(i=0;i<BOSS_BULLET_MAX;i++){
        enter_item(boss_shot.bullet[i].x, boss_shot.bullet[i].y, item_n, 1);
        }
}
boss_shot.cppでextern void enter_boss_item();を宣言して, boss_shot_main()の赤字部分を追加
//ボスの弾幕メイン
void boss_shot_main(){
        if(stage_count==boss.appear_count[0] && boss.flag==0)//開始時間なら
                enter_boss(0);//開始
        if(boss.flag==0)//ボスが登録されて無ければ戻る
                return;
        calc_boss();
        if(boss.phy.flag==1)//物理演算移動オンなら
                calc_phy();//物理計算を
        if(boss.state==2 && (boss.hp<=0 || boss.endtime<=0)){//弾幕中で体力が無くなったら
                enter_boss_item(),enter_boss(1),se_flag[14]=1;//次の弾幕を登録
        }
        if(boss.state==1){//弾幕間の待機時間
                waitandenter();
        }
        if(boss.state==2){//弾幕中なら
                boss_shot_bullet[boss.knd]();//弾幕関数へ
                boss_shot_calc();//弾幕計算
        }
        boss.cnt++;
}
calc.cppに以下を追加
if(boss.flag==1 && boss.hp<=0){//ボス弾幕終了,点数itemのスピード0でそのまま吸収
    item[i].state=1;
    item[i].v=0;
    calc_item_indraw(i);
}


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


Name: Justy  ..伝説なるハッカー(475,526ポイント)   Date: 2009/12/09(水) 22:04   No:43718     
Title: Re:点数アイテムの吸収    

> 瞬間的にループ回数が増えるためか処理落ちしてしまいます

 enter_boss_item関数の処理内容から察するに、BOSS_BULLET_MAX個分の……
標準から変えてないとしたら 3000ものアイテムを boss_shot.bullet[i]の位置から
出そうとしています。

 これはboss_shot.bullet[i].flagによる弾の登録の有無に関わらず
BOSS_BULLET_MAX個分の生成をしようとしますので、それなりに重いはずです。
 しかも、登録がない弾の位置は不定になっている可能性があるので
おかしな位置にアイテムが出る可能性があるのではないでしょうか。


 まず改善策としては、弾の登録がされているところだけを対象に
アイテム化してみてはどうでしょうか?

 いや弾が未登録でもアイテムを出す必要がある、もしくは登録済みのところだけを
対象にしてもまだ処理が重い、ということであれば、Releaseでビルドして実行してみて下さい。


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

Name: ft  ..初心者(7,490ポイント)   Date: 2009/12/09(水) 22:15   No:43719     
Title: Re:点数アイテムの吸収    
search_boss_shot()関数を使えば登録されているかどうか判断できますか?

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

Name: ft  ..初心者(7,582ポイント)   Date: 2009/12/09(水) 22:25   No:43720     
Title: Re:点数アイテムの吸収    
そういえばsearch_boss_shot()関数でもBOSS_BULLET_MAX個分のループをしておりましたね;
最初にフラグの有無も考えてみたのですが
これもBOSS_BULLET_MAX個分やってしまうため確かに遅くなってしまいますね.

>まず改善策としては、弾の登録がされているところだけを対象に
アイテム化してみてはどうでしょうか? 

どのようにやればいいのでしょうか?


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

Name: Justy  ..伝説なるハッカー(475,733ポイント)   Date: 2009/12/09(水) 23:40   No:43723     
Title: Re:点数アイテムの吸収    

> どのようにやればいいのでしょうか

 BOSS_BULLET_MAX個のボスショットを管理する配列のうち、
どれが登録されている(=使われている、表示されている)弾かの区別の
付け方はわかりますか?

 それさえわかれば enter_boss_item関数の、BOSS_BULLET_MAX分の forループを
回しているところで enter_item関数を呼ぶ際に参照する boss_shot.bulletが、
実際に使用されているものだけ行うようにすれば、いいんじゃないかと思います。

 そうすれば、5つしか弾が残っていなければ、5回だけしか enter_item関数は
呼ばれないので、その5つだけに対してアイテムが出現する、はずです。


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

Name: ft  ..初心者(7,629ポイント)   Date: 2009/12/09(水) 23:42   No:43724     
Title: Re:点数アイテムの吸収    
>BOSS_BULLET_MAX個のボスショットを管理する配列のうち、
どれが登録されている(=使われている、表示されている)弾かの区別の
付け方はわかりますか?

すみません,分かりません.


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

Name: Justy  ..伝説なるハッカー(476,063ポイント)   Date: 2009/12/09(水) 23:52   No:43725     
Title: Re:点数アイテムの吸収    
 boss_shot.bullet[n].flagの値を見ることで、調べることができます。

 out.cppを見てるならこういうコードがあります。

        for(n=0;n<BOSS_BULLET_MAX;n++){//弾総数
            if(boss_shot.bullet[n].flag==1){//弾が登録されていたら

 まんま、ですね。

 さすがに弾が使われているかいないかの区別が付かないというのは、大問題です。
 機能追加や改良を施す前に、龍神録の館をもう一度読み直すとかじっくり解析して、
龍神録のコードの理解を深めた方がいいかと思いますよ。


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

Name: ft  ..初心者(7,774ポイント)   Date: 2009/12/10(木) 00:20   No:43726     
Title: Re:点数アイテムの吸収    
それでしたら知っております.少々違った解釈をしてしまって勘違いしていました.

out.cppのenemyshot_and_ch()関数の
if(boss_shot.bullet[n].flag==1)
以降に
if(boss.hp<=0){
    enter_item(boss_shot.bullet[n].x, boss_shot.bullet[n].y, item_n, 1);
}

を追加することで同様の動作が得られました.
しかしあまりfpsは上昇しませんでした.


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

Name: Justy  ..伝説なるハッカー(477,959ポイント)   Date: 2009/12/10(木) 22:54   No:43766     
Title: Re:点数アイテムの吸収    

> if(boss_shot.bullet[n].flag==1) 
> 以降に
> 〜
> しかしあまりfpsは上昇しませんでした

 そこでもだめですか。

 んー、となると
・ enter_boss_item()をコメントアウトすると処理落ちはしないのですか?
・ 前にも書きましたが Releaseビルドではどうですか?


 あ、直悦的には関係ないのですが  item_n[1]={6} のようにアイテムの指定をしていますが、
 点数アイテムというのは6でいいのですか?


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

Name: ft  ..初心者(7,925ポイント)   Date: 2009/12/12(土) 00:10   No:43867     
Title: Re:点数アイテムの吸収    
遅れてすみません.

>enter_boss_item()をコメントアウトすると処理落ちはしないのですか? 
はい,そうです.

>前にも書きましたが Releaseビルドではどうですか?
最初からReleaseビルドをやっておりましたので,その上での結果となります.

また,点数アイテムは私が新たに加えたアイテムで,番号は6と割り当てております.


書き忘れておりましたが,DXライブラリPortableというライブラリを用いてPSPにおける動作を試みているため,
もしかしたら描画まわりの方にも原因があるのかもしれません.


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

Name: Justy  ..伝説なるハッカー(478,737ポイント)   Date: 2009/12/12(土) 01:41   No:43883     
Title: Re:点数アイテムの吸収    
 あぁ、PSPでしたか。
 前のスレを思い出しました。
 となると、どの程度龍神録から変更されたのかわからないですし
持ってないので、これ以上は何とも言いようがないですが、
ボトルネックの計測をして、処理落ちの原因になっている
直接の原因を調べるしかないです。

 その原因が特定できれば対策もたてられるかと思います。


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

Name: ft  ..初心者(7,951ポイント)   Date: 2009/12/12(土) 07:17   No:43906     
Title: Re:点数アイテムの吸収    
その計測というのは第44章のデバッグ支援関数を使えば良いということですよね?
(これとfpsを見る以外の方法は知りません;)

ちなみにネックを調べるために導入するこの関数計算自体がPSPにとって非常に重かったりします(汗)
その上で,enter_boss_item()をコメントアウトした場合,しない場合でかかる時間を調べれば良いということですか?


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

Name: Justy  ..伝説なるハッカー(482,879ポイント)   Date: 2009/12/13(日) 14:37   No:43977     
Title: Re:点数アイテムの吸収    
遅くなりました。


> 第44章のデバッグ支援関数
> 関数計算自体がPSPにとって非常に重かったりします

 一番いいのはちゃんとした測定ツールを使うことですが、
現状それは望めないので、まずは44章を参考にということになります。

 ただそのままで PSPの環境に合うのかどうかはわかりません。
 合わなければうまく環境に合わせて調整してみて下さい。



> enter_boss_item()をコメントアウトした場合,しない場合でかかる時間を調べれば良いということですか

 それだけではなく、全体の負荷と enter_boss_itemから波及する部分にも
手を広げる必要があるかと。

 最終的にどこの処理に負荷がかかっているかがわかればいいので、
そのあたりは実際にやってみて試行錯誤してみて下さい。


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

Name: ft  ..初心者(8,157ポイント)   Date: 2009/12/15(火) 05:49   No:44071     
Title: Re:点数アイテムの吸収    
計測した結果,敵弾が点数アイテムへ変化する際にgraph.cppにて時間が掛かっておりました.

PSPは仕様上メモリへのアクセスがとても遅いらしく,
そして瞬時に多数の描画が増えるため処理落ちが起こるのではないかと考えております.

またPSPの描画関係をライブラリに頼っている現状,
私自身の力不足で描画自体の速度に関してはどうすることも出来ません.(ライブラリの描画速度も発展途上とのことです)

弾幕中でもないですし,この処理落ち自体もほんの一瞬のことで,「遅くなった」と体感できない程のため,
これで妥協しようかとも思っております.


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

Name: ft  ..初心者(8,296ポイント)   Date: 2009/12/15(火) 16:04   No:44103 解決!     
Title: Re:点数アイテムの吸収    
他にもcalc.cppでも時間が掛かることが判りました.

アイテムを自動吸収処理をする関数calc_item_indrawです.

そこで,自機との角度を返すatan2をatan2fとすることで処理落ちが無くなりました.

graph.cppは相変わらずでしたので,原因はここだったと思われます.

いろいろなご助言ありがとうございました!


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

Name: Justy  ..伝説なるハッカー(483,013ポイント)   Date: 2009/12/16(水) 00:18   No:44190     
Title: Re:点数アイテムの吸収    

> 自機との角度を返すatan2をatan2fとすることで処理落ちが無くなりました

 見つかって良かったですね。

 ただ、1カ所あるということは他にもそういうところはありそうな感じもしますし、
この際徹底的にその手のボトルネックを見つけておいた方がいいのかもしれません。


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

Name: ft  ..初心者(8,534ポイント)   Date: 2009/12/16(水) 01:39   No:44194     
Title: Re:点数アイテムの吸収    
そうですね,三角関数はfastmathにするかテーブルを参照させる事に決めているため,
これは単に見落としていた,という事になります.
ちなみにテーブル参照にすると何故か遅くなる箇所がるため,一つ一つ確かめて使い分けています.
PSPのメモリアクセスが遅いことが関係しているのかもしれません.

他にもそのような部分があるかもしれないので見直してみようかと思います.


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



Name: むつ  ..中級者(13,033ポイント)   Date: 2009/12/14(月) 23:04   No:44045       
Title: DXライブラリでsnapshot    
DXライブラリでsnapshotが撮れると聞いたのですが、
これはどの関数を使ってどのように使えばいいのでしょうか?
保存方法も分かる方がいましたら教えてください


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


Name: 山崎  ..プログラマー(30,518ポイント)   Date: 2009/12/14(月) 23:18   No:44047     
Title: Re:DXライブラリでsnapshot    
こんばんは。

おそらく、GetDrawScreenGraphのことでしょうかな?

使い方は、本家DXライブラリのリファレンスページを読むほうが早いでしょう。
サンプルコードがありますので、それをご覧になるとわかりやすいかと思います。
ご存じでしょうが、こちらです。
ttp://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

「保存方法」とは、
「キャプチャーした画面を、画像ファイルとして保存する方法」ということでしょうかな?
それとも、グラフィックハンドルとして保存する、ということでしょうか?


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

Name: むつ  ..中級者(13,090ポイント)   Date: 2009/12/14(月) 23:20   No:44048     
Title: Re:DXライブラリでsnapshot    
ありがとうございます。
キャプチャーした画面を、画像ファイルとして保存する方法です。
どうやって、指定したフォルダ等の中に名前を指定してつけて保存するのかが分からないです。


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

Name: 山崎  ..プログラマー(30,446ポイント)   Date: 2009/12/14(月) 23:22   No:44049     
Title: Re:DXライブラリでsnapshot    
おおっとすいません!!

正しくは、こちらの関数でした。
SaveDrawScreen です。

これなら、一発で画面のスクリーンショットを撮れます。
こちらも、本家のリファレンスページを参照するのが一番いいと思います。

「その他」の方にあったので見落としていました、申し訳ないです…。


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

Name: チルチル  ..比類無きプログラマー(83,866ポイント)   Date: 2009/12/14(月) 23:23   No:44050     
Title: Re:DXライブラリでsnapshot    
こんな感じでどうですか?
#include <shlwapi.h>
#pragma comment( lib , "shlwapi.lib" )
void SnapShot(void){
    if( CheckHit_Switch(KEY_INPUT_P) ){
        for( int i=0;i<1000;i++ ){
            char str[64];
            sprintf( str , "SnapShot/ss%03d.bmp" , i );
            if( PathFileExists(str)==0 ){
                SaveDrawScreen( 0 , 0 , 640 , 480 , str );
                break;
            }
        }
    }
}


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

Name: むつ  ..中級者(13,216ポイント)   Date: 2009/12/14(月) 23:34   No:44052     
Title: Re:DXライブラリでsnapshot    
チルチルさんの方法で試してみると、エラーが発生したのですが、
これはどう対処すればいいのでしょうか?
error C3861: 'sprintf' の宣言を確認してください。
error C2664: 'PathFileExists': 識別子が見つかりませんでした


PathFileExistsって何ですか?


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

Name: Libra  ..中級者(14,555ポイント)   Date: 2009/12/14(月) 23:45   No:44053     
Title: Re:DXライブラリでsnapshot    
>>チルチルさん

実行してないですが、

for( int i=0;i<1000;i++ ){

↑ループ1000回も回して大丈夫でしょうか?


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

Name: 初心者  ..熟練のプログラマー(44,835ポイント)   Date: 2009/12/15(火) 00:43   No:44054     
Title: Re:DXライブラリでsnapshot    
#include <shlwapi.h>
#pragma comment( lib , "shlwapi.lib" )
って何ですか?


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

Name: チルチル  ..比類無きプログラマー(84,186ポイント)   Date: 2009/12/15(火) 00:45   No:44055     
Title: Re:DXライブラリでsnapshot    
>PathFileExistsって何ですか?

失礼、説明不足でしたね

PathFileExists関数はshlwapi.hで宣言されていて、引数に渡したファイルが存在すれば0を返します

sprintf関数はたしかstdio.hで宣言されていて書式付き文字列を出力します
DxLib.h内でstdio.hがインクルードされているので使えると思います

関数の前に

#include "DxLib.h"
#include <shlwapi.h>
#pragma comment( lib , "shlwapi.lib" )

が書いてあれば行けると思うんですけどね・・

#pragma comment( lib , "shlwapi.lib" )

は必要ないかもしれませんが・・

>↑ループ1000回も回して大丈夫でしょうか?

これはss000.bmp〜ss999.bmpまでのスナップショットが
取れると言う意味なので実際に1000回も回らないと思います

SnapShotフォルダにss000.bmpが無ければ、その名前で保存して終了

あれば次は
SnapShotフォルダにss001.bmpが無ければ、その名前で保存して終了

と言う風に続いて行くので最初の5回ぐらいでループから抜けると思います

>#include <shlwapi.h> 
>#pragma comment( lib , "shlwapi.lib" ) 
>って何ですか?

私も同じ質問をした時に教えていただいたので良く知りませんが
おそらく標準ライブラリの1つです


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

Name: むつ  ..中級者(13,144ポイント)   Date: 2009/12/15(火) 00:52   No:44056     
Title: Re:DXライブラリでsnapshot    
詳しい解説ありがとうございます!

ただ、この
if( PathFileExists(str)==0 ){
部分でエラーが新しくでて、
error C2664: 'PathFileExistsW' : 1 番目の引数を 'char [64]' から 'LPCWSTR' に変換できません。
実行できないのですが、どうしたらエラーが外せるのでしょうか?


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

Name: Libra  ..中級者(14,703ポイント)   Date: 2009/12/15(火) 00:59   No:44057     
Title: Re:DXライブラリでsnapshot    
breakを見落としていました^^;


>>LPCWSTR
プロジェクトの文字セットの設定がUnicodeになっていると思います。
マルチバイト文字に変更すると良いと思います。


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

Name: チルチル  ..比類無きプログラマー(84,322ポイント)   Date: 2009/12/15(火) 01:00   No:44058     
Title: Re:DXライブラリでsnapshot    
う〜んそれは私にもわからないですね
私の所ではコンパイルが通るので環境的な問題かもしれません

とりあえずコード全部作ってみたので実行してみてください

Pを押すとスナップショットを撮ります

実行する前に作業ディレクトリにSnapShotフォルダを作成しておいてくださいね

sprintf関数は別の関数を推奨しているようです
それが何かは知らないですが・・


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

Name: むつ  ..中級者(13,148ポイント)   Date: 2009/12/15(火) 01:05   No:44059     
Title: Re:DXライブラリでsnapshot    
念のために聞きたいのですが、
マルチバイト文字に変更する以外の方法はないでしょうか?


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

Name: チルチル  ..比類無きプログラマー(84,453ポイント)   Date: 2009/12/15(火) 01:11   No:44060     
Title: Re:DXライブラリでsnapshot    
また違う方法で代用すればできると思いますが
DXライブラリ自体がマルチバイト文字で動くのでマルチバイト文字にした方が良いと思います

それから上のコードなんですがフォルダが無い場合に作成してくれる機能は無いので
アレを使う場合は「SnapShotフォルダを消さないでください」ってどこかに書いた方が良いと思います・・


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

Name: むつ  ..中級者(13,229ポイント)   Date: 2009/12/15(火) 01:20   No:44061     
Title: Re:DXライブラリでsnapshot    
なるほど。分かりました。ありがとうございます。

あれ?でも今度は
error LNK2019: 未解決の外部シンボル __imp__PathFileExistsA@4 が関数 _WinMain@16 で参照されました。
というエラーに変わっただけなのですが・・


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

Name: チルチル  ..比類無きプログラマー(84,526ポイント)   Date: 2009/12/15(火) 01:30   No:44062     
Title: Re:DXライブラリでsnapshot    
う〜ん、どうもリンクに失敗しているようですが私の時は

#pragma comment( lib , "shlwapi.lib" ) 

これで解決できたんですが、今回はまだ足りないようですね・・

プロジェクトの設定が怪しいですが
これは私の手には負えないので誰か手助けをお願いします


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

Name: y  ..かけだし(1,971ポイント)   Date: 2009/12/15(火) 02:19   No:44066     
Title: Re:DXライブラリでsnapshot    
ソリューションのクリーン→ソリューションのビルド
もしくは、
ソリューションのリビルド
を実行しても出来ませんでしょうか。

あと、SnapShotフォルダが見つからないときは、
CreateDirectory関数なんかでフォルダを作ってあげると親切かもしれません。


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

Name: むつ  ..中級者(13,245ポイント)   Date: 2009/12/15(火) 20:10   No:44144     
Title: Re:DXライブラリでsnapshot    
実行してみましたが、特にエラーは消えませんでしたが・

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

Name: y  ..かけだし(2,243ポイント)   Date: 2009/12/15(火) 21:43   No:44167     
Title: Re:DXライブラリでsnapshot    
どう考えてもshlwapi.libをリンクできていないようなのですが…。

新しいプロジェクトを作って、設定をDxLibを導入するときと同じ設定に変えてから、
以下のプログラムをそのままコピペしてコンパイルしてみてください。

#include <windows.h>
#include <shlwapi.h>

#pragma comment(lib, "shlwapi.lib")

int WINAPI WinMain(HINSTANCE, HINSTANCE, char *, int)
{
        ::PathFileExists("test.txt");
        
        return EXIT_SUCCESS;
}


これで実行できれば、変な設定を行っている(行われている)場合があります。
その場合は、新しいプロジェクトに移すといいかもしれません。

実行できなければ…すみません、私もわかりません。


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

Name: ねこ  ..熟練のプログラマー(50,152ポイント)   Date: 2009/12/15(火) 23:22   No:44182     
Title: Re:DXライブラリでsnapshot    
昔そのリンクの仕方を教えたような気がするので一応。

まず「shlwapi.lib」は標準ライブラリではなかったような気が・・・
むつさんの環境次第ではライブラリ自体が無い可能性があります。

関数自体はチルチルさんが気を利かせて作った処理を実行するのに必要なものですが
主題であるのはスナップショットなので「SaveDrawScreen」だけ実行したのでいいんじゃないでしょうか?


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

Name: むつ  ..中級者(13,260ポイント)   Date: 2009/12/15(火) 23:31   No:44183     
Title: Re:DXライブラリでsnapshot    
龍神録でスナップショットは撮ることできないのですか?

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

Name: チルチル  ..比類無きプログラマー(84,801ポイント)   Date: 2009/12/16(水) 00:44   No:44191     
Title: Re:DXライブラリでsnapshot    
>まず「shlwapi.lib」は標準ライブラリではなかったような気が・・・

確かに一覧に軽く目を通しても見つからないので違うかもしれませんね
とりあえずVC++およびBCCではあるみたいですが、むつさんの環境は何ですか?

>主題であるのはスナップショットなので「SaveDrawScreen」だけ実行したのでいいんじゃないでしょうか?

そう言えば主題はそっちでしたね・・失礼しました
とりあえずSaveDrawScreen関数の使い方はわかって頂けたと思うので
後はyさんの指摘してくれた機能などを実現する関数を探して組み込めば完成すると思います

>龍神録でスナップショットは撮ることできないのですか?

見た感じは無いようですね


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



Name: Ma  ..上級者(22,558ポイント)   Date: 2009/12/14(月) 04:38   No:44006       
Title: DXライブラリ:テクスチャの入れ替え    
DXライブラリVC++で、3D空間にアニメエフェクトを作ろうとしているものです、
強力な静電気を表現しようと思ってはじめました。

そこで、3Dで表示するのは面倒そうなので3D空間に2Dアニメーションを表示にすることにしました。
2Dアニメーションの経験はある程度あります。(2Dゲームでアニメーション作るぐらいなら楽勝)

が、3Dにきてつまずきました。

方法1:テクスチャをいれかえる。
 MV1SetTextureGraphHandle(charge_light, textIndex, lightning[index%16], FALSE) ;
を使おうとしたのですが、どうも変わらない。
戻り値は0。
以下、引数説明
 int MHandle : モデルのハンドル
  には、int charge_light = MV1LoadModel("materials/lightning.mqo");
  こんな感じでロードした charge_lightを指定。
 int GrHandle : テクスチャとして使用するグラフィックハンドル
  には、ちゃんと、64×64の画像。LoadDivGraph でpngを、ロードしたハンドル。
  lightning[index%16]
  こんな感じで指定。indexは毎フレーム増加
 int TexIndex : テクスチャの番号
  には
  int textIndex = MV1GetMaterialDifMapTexture(charge_light, 0);
  こんな感じで取得した番号を指定。

方法2:フレームの利用。
 UV操作でメタセコがうまく使えないorz
 これ、未経験者には操作がかなり難しいです。


方法3:画像をファイル単位で分割、mqoをアニメのこま数だけ容易。
 確実にできるけど、一番よくない方法だと思う。

こんな状況です。解決策教えてください。


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


Name: Justy  ..伝説なるハッカー(482,838ポイント)   Date: 2009/12/14(月) 21:58   No:44037     
Title: Re:DXライブラリ:テクスチャの入れ替え    
 何かが間違っているのだと思いますが、それだけでは検討もつきません。
 状況を再現可能な素材込みの小規模なプロジェクト一式をアップしてみてはどうでしょうか。


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

Name: Ma  ..上級者(22,653ポイント)   Date: 2009/12/15(火) 06:30   No:44072     
Title: 無題    
Justy さん、返信ありがとうございます。
ちょっと遅れてすみません。

新しいプロジェクトでやってみたら、なぜか成功しました。
何が違うのか比べて、もう少しがんばってみます。

それでも分からなかったらもう一度よろしくお願いします。


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

Name: Ma  ..上級者(23,452ポイント)   Date: 2009/12/15(火) 07:20   No:44074     
Title: おそらくバグ    
おそらく、LoadDivGraphでロードした画像をテクスチャに指定すると、画像全体が指定されてしまうようです。
どうやら、DXライブラリのバグのようなので本家のほうで報告してみます。

以下テストコードです。

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    int ModelHandle ;
    int GrHandle ;
    int divGrHandle[4];
    int TexIndex ;

    ChangeWindowMode(TRUE);

    // DXライブラリの初期化
    if( DxLib_Init() < 0 )
    {
        // エラーが発生したら直ちに終了
        return -1 ;
    }
    

    // 画像の読みこみ
    GrHandle = LoadGraph( "materials/25.JPG" ) ;
    LoadDivGraph("materials/coin.jpg",4,2,2,128,128,divGrHandle);


    // 3Dモデルの読み込み
    ModelHandle = MV1LoadModel( "materials/sky_test3.mqo" ) ;

    // モデルを画面に映る位置に移動
    MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 400.0f ) ) ;

    // テクスチャの番号を取得
    TexIndex = MV1GetMaterialDifMapTexture( ModelHandle, 0 ) ;

    // モデルを描画する
    MV1DrawModel( ModelHandle ) ;
    ScreenFlip();
    WaitKey();

    for(int i = 0;i < 10; i++){
        // テクスチャで使用するグラフィックハンドルを変更する
        MV1SetTextureGraphHandle( ModelHandle, TexIndex, divGrHandle[i%4], FALSE ) ;

        // モデルを描画する
        MV1DrawModel( ModelHandle ) ;
        ScreenFlip();
        printfDx("LoadDivGraphでロードしたものをテクスチャに指定。\n");
        WaitKey();

    }

    
    // テクスチャで使用するグラフィックハンドルを変更する
    MV1SetTextureGraphHandle( ModelHandle, TexIndex, GrHandle, FALSE ) ;

    // モデルを描画する
    MV1DrawModel( ModelHandle ) ;
    ScreenFlip();
    printfDx("LoadGraphでロードしたものをテクスチャに指定。\n");

    // キー入力待ち
    WaitKey() ;
    

    // DXライブラリの後始末
    DxLib_End() ;

    // ソフトの終了
    return 0 ;
}




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

Name: Justy  ..伝説なるハッカー(482,912ポイント)   Date: 2009/12/16(水) 00:11   No:44188     
Title: Re:おそらくバグ    
 あー、分割テクスチャは非対応なのかも。

 テクスチャも2Dの時にはなかった2のべき乗制限とかありますから、
2Dの時ほど柔軟にテクスチャ扱えるようになるにはもうしばし時が必要かもしれません。


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



Name: サンタクロース  ..ぴよぴよ(889ポイント)   Date: 2009/12/12(土) 23:47   No:43963       
Title: 書き換えについて    
質問です。龍神録さんでは
LoadDivGraph( "dat/bullet/BULLET0.png"   , 16 ,16,1 ,10 ,10   ,img_bullet[0]) ;
で弾画像をロードして
DrawRotaGraphF(shot[i].bullet[j].x+FX+dn.x, shot[i].bullet[j].y+FY+dn.y,    1.0,
shot[i].bullet[j].angle+PI/2,img_bullet[shot[i].bullet[j].knd][shot[i].bullet[j].col],TRUE);
という風に描画していますよね。
では
gh=LoadDivGraph( "dat/bullet/BULLET0.png"   , 16 ,16,1 ,10 ,10   ,img_bullet[0]) ;
とすると描画の関数はどのように訂正すれば同じ結果が得られるでしょうか?




                    


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,106,242ポイント)   Date: 2009/12/13(日) 00:14   No:43964     
Title: Re:書き換えについて    
>>サンタクロースさん

こんにちは。

んんと、何がしたいのです?
ghにグラフィックハンドルを入れたいのでしょうか?

Div関数の返り値はグラフィックハンドルではなく、
処理結果です。エラーかどうかしかわかりません。
関数の仕様はこちらを見て下さい。
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R3N3

関数の返り値はエラーが起きたかどうか以外に使う必要はないです。


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

Name: サンタクロース  ..ぴよぴよ(914ポイント)   Date: 2009/12/14(月) 21:40   No:44034 解決!     
Title: Re:書き換えについて    
すみません。回答ありがとうございます。
一回頭を冷やして一から考え直そうと思います


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,108,898ポイント)   Date: 2009/12/14(月) 22:01   No:44039     
Title: Re:書き換えについて    
いや、全く難しい話ではないですよ^^;
つまり、何をしたいのかをお聞きしたかったのですが・・。

Divの関数の返り値はハンドルではありません。
よって、帰り値を格納してもエラーかどうかしかわかりません。
ハンドルはimg_bulletに格納されます。

・・どの辺で躓いていらっしゃいますか?


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

Name: サンタクロース  ..かけだし(1,167ポイント)   Date: 2009/12/15(火) 22:10   No:44172     
Title: Re:書き換えについて    
じつはPSPで自作しているので内容が分かりづらいかも知れないです。すみません
DXライブラリportableでは
MoveGraphToVRAM(gh); //VRAMへ置く
という関数があってこれを使うと画像をVRAMに置き描画の処理落ちがぐんと減るというものです。
使い方は

gh = LoadGraph("test.png" ); //画像読み込み

MoveGraphToVRAM(gh);//VRAMへ置く

DrawRotaGraphF( X, Y, 1.0 , 0 , gh ,TRUE,0);//描画

このように使います。
ところがこれをLoadGraphではなくLoadDivGraphを使う場合このghの部分?をどうすればよいのかよく分からないのです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,112,140ポイント)   Date: 2009/12/15(火) 22:22   No:44177     
Title: Re:書き換えについて    
DXライブラリポータブルの仕様は存じませんが、DXライブラリでは、こうなっています。
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R3N3
関数の第七引数にハンドルのポインタを渡します。

DXライブラリポータブルが正式に配布されているなら、どこかに関数仕様が書いてあるのではないでしょうか?


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

Name: yu  ..熟練のプログラマー(41,447ポイント)   Date: 2009/12/15(火) 22:38   No:44179     
Title: Re:書き換えについて    
>>サンタクロース様

>ところがこれをLoadGraphではなくLoadDivGraphを使う場合このghの部分?をどうすればよいのかよく分から
>ないのです。

DXLPはソースが公開されているので自分で見てみるのも良いかと思います。

...

少し見てきましたが、分割された画像のどのハンドルを渡してもVRAMに移動されるみたいです。
UV値変えて描画してるだけなので大本のデータは変わりません。
間違ってたら...すみません orz


#追記
DXLPのBBSに全く同じ話題が挙がっていましたw
ttp://dxlibp.sourceforge.jp/cgi-bin/patio/read.cgi?no=132


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



Name: ゆり  ..ぴよぴよ(17ポイント)   Date: 2009/12/15(火) 19:30   No:44136       
Title: ポインタと関数を用いたプログラム    
提出期限が迫っていて困っています!
自分ではいまいち関数からわからないのでそこから自分で勉強しているのですが、課題に今勉強している範囲外のことが出たので質問させてください。


9匹の魚を釣りました。もし1匹でも20cmの魚であれば、それを30cm以上の魚と交換してもらえるとすると最終的な魚の大きさの平均はいくつか。ただし20以下であれば30に値を変更する関数を作ること。平均値はmain文内で算出すること。


よろしくお願いします。


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


Name: たかぎ [URL]  ..ハッカー(136,247ポイント)   Date: 2009/12/15(火) 19:39   No:44137     
Title: Re:ポインタと関数を用いたプログラム    
言語不明なのでどうすることもできません。

> 平均値はmain文内で算出すること。 

ということは、CやC++ではありませんね。
言語は何でしょう?


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

Name: ゆり  ..ぴよぴよ(355ポイント)   Date: 2009/12/15(火) 19:48   No:44138     
Title: Re:ポインタと関数を用いたプログラム    
>たかぎさん

C言語なのですが…。関数として30センチ以上に交換したあと、その後main文を使って平均を算出するということだと思うのですが。。。
習った模範プログラムがあるので一応載せます。

#include <stdio.h>

void swap(int *x, int *y)
{
int temp =*x;
*x = *y;
*y = temp;
}

int main(void)
{
int a, b;

printf("aの値:\n"); scanf("%d", &a);
printf("bの値:\n"); scanf("%d", &b);

swap(&a, &b);

printf("aの値:%dです。\n", a);
printf("bの値:%dです。\n", b);

return(0);
}

これの
int main(void)
{
int a, b;

printf("aの値:\n"); scanf("%d", &a);
printf("bの値:\n"); scanf("%d", &b);

swap(&a, &b);

printf("aの値:%dです。\n", a);
printf("bの値:%dです。\n", b);

return(0);
}

の部分で平均値を計算するということかと思います。
C言語しか習ってないので、C言語だと思います。


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

Name: たかぎ [URL]  ..ハッカー(136,699ポイント)   Date: 2009/12/15(火) 19:57   No:44140     
Title: Re:ポインタと関数を用いたプログラム    
> C言語なのですが…。

C言語には「main文」なるものは存在しません。
あと...

> 9匹の魚を釣りました。もし1匹でも20cmの魚であれば、それを30cm以上の魚と交換してもらえるとすると最終的な魚の大きさの平均はいくつか。ただし20以下であれば30に値を変更する関数を作ること。平均値はmain文内で算出すること。 

どこからどこまでをプログラミングするのでしょうか?
そもそもプログラミングだけで済むのでしょうか?
処理系もハード構成もわかりませんので、何とも答えようがありません。

例えば、魚の大きさを計測する必要があるなら、計測器の制御プログラムを書く必要があります。
あるいは、釣った魚の大きさはユーザーに入力させるのでしょうか?
魚の大きさは、どの程度の有効桁数にすればよいのでしょうか?

規約を守って、正確な情報を提示してください。


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

Name: ゆり  ..ぴよぴよ(657ポイント)   Date: 2009/12/15(火) 20:06   No:44143     
Title: Re:ポインタと関数を用いたプログラム    
すいません、情報を書き足します。

魚の大きさは、ユーザーに入力させます。

大学の講義の一環なのでそんなに大がかりなものではないと思います。
講義ではC言語の基礎の基礎から(printfのところから)勉強しています。
その中の「ポインタ」の単元で出された課題が上記です。

実行結果の例としては


1匹目の大きさ 10
2匹目の大きさ 20
3匹目の大きさ 30
4匹目の大きさ 40
5匹目の大きさ 50

魚の大きさの平均:36.0000


だそうです。main文云々を抜きにしたらプログラムは組めますでしょうか?

上記は問題文そのまま載せたのですが解釈としては


30以下の数字が入力されたときそれを無条件で30とし、30以上ならそのまま採用する。そしてその値の平均を求める。


というものだと思います。

有効桁数はせいぜい3ケタ位でいいです。
5匹分の大きさを入力させるようにしたいです。


言葉足らずですいません。お願いします。




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

Name: Dixq (管理人) [URL]  ..ウィザード(1,110,305ポイント)   Date: 2009/12/15(火) 20:30   No:44145     
Title: Re:ポインタと関数を用いたプログラム    
まぁまぁ、習ったばかりでは、そこまでの事はなかなか解りませんよ;
正確な情報を伝える事は大事ですが、もうちょっと柔軟に対応してあげましょうよ^^;

>ゆりさん

こんにちは。大学の宿題ですね。
期限が迫っているということで、では頑張りましょう。

たかぎさんがmain文は無いからC言語じゃないと仰っているのは、
C言語では、main(){}の部分の事を「メイン関数」と呼ぶのであってmain文ではないからです。
まぁ一文字間違う位最初はいくらでもありますのでお気になさらず^^;
多分if文やfor文と混合されてるのだと思います。

さて、模範プログラムは提示して頂きましたが、ご自分で付け足されたプログラムはありますか?
後、コードを投稿する時はタグを使ってくださいね。
詳しくは規約をご覧ください。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,110,478ポイント)   Date: 2009/12/15(火) 20:36   No:44148     
Title: Re:ポインタと関数を用いたプログラム    
こういうのは段階を踏んで課題をクリアしていくのが一番だと思います。
こういう問題があったらどこまでこたえられますか?

問題1
整数を入力するごとに、入力した数値を画面に表示するプログラムを書きましょう

問題2
(問題1に付け足して)20以上が入力されたら「20以上です」と表示するプログラムを書きましょう

問題3
(問題2に付け足して)20以上が入力されたら30を代入するプログラムを書きましょう

問題4
(問題3に付け足して)入力する回数を10回とし、その10回の入力数値を全てたした結果を表示するプログラムを書きましょう
(20以上は30のはそのまま)

問題5
今回の課題そのもの(ただし関数化しなくてよいものとする)


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,110,878ポイント)   Date: 2009/12/15(火) 20:43   No:44149     
Title: Re:ポインタと関数を用いたプログラム    
ポインタ関連は難しいですよね。
時間も無いようですし、解り難いと思いますのでここは先にサンプルをお見せしましょう。

まず、関数に値を渡すと、関数先でどう変更しようが、呼び出し元には関係ないということはOKですか?

例えばmain関数がA君、swap関数がB君だとしましょう。
B君が「君の書類が欲しいから見せてほしい」と言ったとしましょう。
A君は自分の書類が大切なので、B君にはコピーを取って、コピーを渡しました。
そうすれば安心ですよね。B君がそのコピーを燃やそうが捨てようが、原本には全く影響ありません。

そう、関数に渡した先はコピー先なのです。
ということで、こいつを見てみましょう。

#include <stdio.h>

void swap( int a ){
    a = 30;
}

int main(){
    int a=20;
    swap(a);
    printf("a=%d",a);
}

実行結果が何になるかは、考えた上で自分で実行してみてください。

で、答えを言わないと次に進まないので、答えを言ってしまうのですが、20です。
関数先にaの値を渡していますが、関数先に渡したのはコピーなので、関数先で何しようが元の値は変わらないのです。

その一方で・・・


次に続く


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

Name: たかぎ [URL]  ..ハッカー(136,903ポイント)   Date: 2009/12/15(火) 20:45   No:44150     
Title: Re:ポインタと関数を用いたプログラム    
> まぁまぁ、習ったばかりでは、そこまでの事はなかなか解りませんよ; 
> 正確な情報を伝える事は大事ですが、もうちょっと柔軟に対応してあげましょうよ^^;

まあ、お約束の展開ですね。
最初の質問では、習ったばかりかどうかも書かれていませんからね。

> たかぎさんがmain文は無いからC言語じゃないと仰っているのは、 
> C言語では、main(){}の部分の事を「メイン関数」と呼ぶのであってmain文ではないからです。 
> まぁ一文字間違う位最初はいくらでもありますのでお気になさらず^^; 

これは、ゆりさんを責めているのではなくて、出題者を責めているのです。
出題者がC言語を理解できていないと、不必要な苦労をいろいろさせられます。まあ、それも社会勉強みたいなもんですが。

それはそれとして、よくわからないのですが...

> 5匹分の大きさを入力させるようにしたいです。

9匹釣ったんですよね?
あとの4匹はどうなったのでしょうか?
また、その5匹の選び方は?

> 有効桁数はせいぜい3ケタ位でいいです。 

とのことですが、

> 魚の大きさの平均:36.0000

では有効桁が6桁になっています。どちらが正しいのでしょうか?
また、入出力は全角数字を用いるということでよろしいでしょうか?



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

Name: ゆり  ..ぴよぴよ(733ポイント)   Date: 2009/12/15(火) 20:45   No:44151     
Title: Re:ポインタと関数を用いたプログラム    
ありがとうございます
その例なら問題5まで一応かけそうです
(if文とかfor文を使えばいいですよね?)
私がわからなくなったのは関数、ポインタといったあたりなので
なんの規制もなければ上記の問題も解けると思います



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

Name: Dixq (管理人) [URL]  ..ウィザード(1,111,542ポイント)   Date: 2009/12/15(火) 20:54   No:44154     
Title: Re:ポインタと関数を用いたプログラム    
その一方で・・・

いや、B君は実はA君の上司であり、書類をチェックしたら上司(B君)のハンコが必要だったのです。
だからコピーを渡したんじゃだめ、原本にハンコを押してもらわなければなりません。

そんな時どうしましょう?
A君とB君は恥ずかしがり屋なので、直接会って渡すことが出来ません。
なので、A君はB君にその書類を「○○番の棚においておくので持って行って下さい。」
ということにしました。

○○番の棚(いわば住所ね)にある原本を持って行ったB君がハンコを押すとどうなるかというと・・


#include <stdio.h>

void swap( int *a ){
    *a = 30;
}

int main(){
    int a=20;
    swap(&a);
    printf("a=%d",a);
}
  また、実行してみてください。 30と表示されるはずです。 関数先で値を変えたのに、なぜ変わったか? それはコピーを渡したのではなく、その書類がある住所を渡したからです。 そのデータがある住所を渡し、その住所先のデータを変更したので、元のデータが変わったのです。 コンピュータというのは、値だけを、何の情報も無く保持することはできません。 データには全て番地がふってあるのです。 1234番のデータは○○ 1235番のデータは○○ という感じで。 今、 int a; とaというデータの入れ物を作ると 1236番のデータはa こんな感じで用意されます。 ここで、関数先にaとは直接言わず 1236番のデータ と伝えるのです。すると、aとは言っていなくても、さしているデータは何かわかりますね? 1236番が示すデータを変えればaに入っているデータも変わるということです。 変数に「&」を付けると、「住所」になるという事は習いましたよね? つまり、関数先には「aの住所」を渡しているのです。 そして受け取っている方は int *a; となっていると思いますが、この変数の前にあるアスタリスク「*」は 「住所を入れるいれものですよ」という意味を指しています。 ですから、住所が送られてくるので、「住所の入れ物用変数」で格納しているのです。 住所の入れ物用変数に入れたものは、*を付けることで、その住所がさしているデータを参照することが出来るようになします。 つまり
void swap( int *a ){

で受け取った時、「a」には「住所」が入っているのです。
そして、「*a」には「住所先が示すデータ」が入っています。
という事は、

*a = 30;

と書くことで、aに入っている住所先のデータに30を入れる事が出来るのです。
住所先のデータを変更したので、メインに戻っても値は変わったままになります。

}
 
 
さて、ここまで読めばだいぶん解ってきたのではないでしょうか?
問題6が出来たらあとは自力で課題が完成させられると思います。
できそうでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,111,666ポイント)   Date: 2009/12/15(火) 20:58   No:44155     
Title: Re:ポインタと関数を用いたプログラム    
問題6をどこにも書いていなかったorz


ちなみに問題6は

メイン関数内で、int型変数を宣言し、適当に何か代入します。
その変数のアドレスを関数に渡し、渡した関数先で30を代入するプログラムを作りましょう

という問題だったのですが、もろ答えが話の中で出てきたのは内緒です。

これだけ出来たら出来そうじゃないですかね?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,111,749ポイント)   Date: 2009/12/15(火) 21:00   No:44156     
Title: Re:ポインタと関数を用いたプログラム    
> たかぎさん
> これは、ゆりさんを責めているのではなくて、出題者を責めているのです。

なるほど、失礼しました。
もし先生がこう言っているのだとすると、それは問題ですね。
最初であるからこそ、基礎をきっちりやらないと、後で困りますよね。

私は今になって色んな環境でプログラムを組むようになったので、
「windowsで動けばいい」的な投げやり方法は通用しなくなり、苦労しています^^;


後、仰るように問題にはまだ少し補足が必要そうですね。
これだけでは答えられないことが多そうです。


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

Name: ゆり  ..ぴよぴよ(929ポイント)   Date: 2009/12/15(火) 21:07   No:44160     
Title: Re:ポインタと関数を用いたプログラム    
>たかぎさん

9匹っていうのは私のタイプミスでした
あと全角で表示ではなく半角で大丈夫です
私の授業でもらったプリントには36.000000と書いてあるのですが、
別にdouble型であれば問題ないようです

出題者は教授なんですけど
こちらも意図を正確に伝えられなかったので…すいませんでした。

講義中の教授「〜だから、main文では〜」
が日常茶飯事なので間違って覚えてたみたいですね


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

Name: non  ..比類無きプログラマー(81,942ポイント)   Date: 2009/12/15(火) 21:07   No:44161     
Title: Re:ポインタと関数を用いたプログラム    
たびたびこのような質問があるのですが、本当に大学の先生は、教えてもいない課題を
出したり、こんな訳のわからない曖昧な問題を出すのでしょうか?
信じられない・・・・

最初の問題はどう解いていいのかさっぱり私もわかりません。

>1匹でも20cmの魚であれば
ちょうど20cmの魚ですよね。
>30cm以上の魚と交換してもらえる
30cm以上何cmあるかわからない魚と交換する。全部の魚を交換するのかなぁ?
>魚の大きさの平均
それは、無理でしょ。




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

Name: Dixq (管理人) [URL]  ..ウィザード(1,111,426ポイント)   Date: 2009/12/15(火) 21:13   No:44162     
Title: Re:ポインタと関数を用いたプログラム    
え、ホントに教授がそう言ってるんですか?
いや〜質問者さんが打ち間違えただけだと思ってましたが、
それはたかぎさんのお叱りが飛ぶのもごもっともw

それはちとひどいですね。
次授業中に言ったら突然挙手して指摘してあげてください!w

> nonさん

多分「教えたつもりになっている教授」と「教えてもらった覚えはない学生」との行き違いではないでしょうかね・・。
私もそうでした。
ポインタ関連、授業の最後にサラッと説明して課題が出ましたが、意味不明でした。
今回の場合はわかりませんが、
確かにほとんど教えていないも同然のような授業でいきなり課題が出る事はよくありました。
まぁ「きっかけを教えてもらったなら後は自分で調べなさい」ということになるでしょうけど。

特にプログラム関連はよく出来た授業であったとしても、授業聞いていただけではなかなか解らないものですからね・・。


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

Name: ゆり  ..ぴよぴよ(993ポイント)   Date: 2009/12/15(火) 21:16   No:44163     
Title: Re:ポインタと関数を用いたプログラム    
> >1匹でも20cmの魚であれば
> ちょうど20cmの魚ですよね。

たびたびタイプミスですごめんなさい;
1匹でも20cm以下であれば、です

> >30cm以上の魚と交換してもらえる
> 30cm以上何cmあるかわからない魚と交換する。全部の魚を交換するのかなぁ?

これも
30cmの魚と交換〜
でした;

値はscanfとかで直接代入して
その際の20以下の値は全て30にして、ということだと思います

なんとなくわかってきたような気がします
しばし試行錯誤…


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

Name: ゆり  ..ぴよぴよ(725ポイント)   Date: 2009/12/15(火) 21:57   No:44169     
Title: Re:ポインタと関数を用いたプログラム    
わからないでs…


#include <stdio.h>

void swap(double *a,double *b,double *c,double *d,double *e){
    if(*a<=20)*a=30;
    if(*b<=20)*b=30;
    if(*c<=20)*c=30;
    if(*d<=20)*d=30;
    if(*e<=20)*e=30;
}

int main(void){
    double a,b,c,d,e;
    printf("a:");scanf("%lf",&a);
    printf("b:");scanf("%lf",&b);
    printf("c:");scanf("%lf",&c);
    printf("d:");scanf("%lf",&d);
    printf("e:");scanf("%lf",&e);    

    swap(&a,&b,&c,&d,&e);

    printf("ave=%lf",(a+b+c+d+e)/5);

    return(0);
}


(ちゃんと見れるかしら)
を実行してみると

a:10
b:20
c:30
d:40
e:50
ave=36.000000


となりました

本当にわからなくてあれなんですが
値を入力するときに
この例でabcdeを使用したところに
配列やfor文を使いたいんですが…

もう少し試行錯誤…


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,111,968ポイント)   Date: 2009/12/15(火) 22:09   No:44171     
Title: Re:ポインタと関数を用いたプログラム    
上でも言いましたが、コードを投稿する時はタグを使ってください。

で、関数については・・。

私が出した問題は解答に繋がるように作った物なので、それを見ながら順を追って作ってみてください。
関数の仕様が私が言ったものと全く違うものになっています。

まずは、私が出した問題を配列とfor文で解いてみてください。
「解けます」ではなく、コードをここに張り付けてみてください。
自分では思わぬ間違い等があるかもしれません。
(量が多くなりそうなら解る一番最後の解答だけでもいいです)

今回の課題は無理やり配列やforを使わずにやる方法もありますが、
綺麗ではないので、順を追って作り、完成させましょう。

重複しますが、私が出した問題を順々に解けば出来ます。
解らない部分があればどこが解らないか教えてください。

配列やループについて解らなければ
この辺で勉強して下さい。
http://www5c.biglobe.ne.jp/~ecb/c/c00.html

例えば配列を使うとこんな感じになりますが、
とりあえずこれをfor文で表示するようにすることから始めてみましょう。

#include <stdio.h>

int main(){
    int Val[5];
    Val[0] = 1;
    Val[1] = 2;
    Val[2] = 3;
    Val[3] = 4;
    Val[4] = 5;

    printf("Val[0] = %d\n",Val[0]);
    printf("Val[1] = %d\n",Val[1]);
    printf("Val[2] = %d\n",Val[2]);
    printf("Val[3] = %d\n",Val[3]);
    printf("Val[4] = %d\n",Val[4]);

    return 0;
}
 
課題締め切りが明日までとかだったら、その旨教えてください。


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

Name: たかぎ [URL]  ..ハッカー(136,940ポイント)   Date: 2009/12/15(火) 22:10   No:44173     
Title: Re:ポインタと関数を用いたプログラム    
タイプミスがかなり多かったようですので、一度ここまでの内容をまとめて、改めて正しい質問内容を書いてみてください。


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



Name: お願いします!  ..ぴよぴよ(541ポイント)   Date: 2009/12/15(火) 21:05   No:44158       
Title: エラーについて    
Title: Re:エラーになるのですが      
 #include <stdio.h> 
int main(void) 

int month, days; 
puts("月を入力してください:"); 
scanf("%d",&month); 

// 
if (month ==2) 
days == 28; 
else if (month ==1 || month ==3 || month ==5 || month ==7 
|| month ==8 || month ==10 || month ==12) 
days == 31; 
else if (month ==4 || month ==6 || month ==9 || month ==11) 
days == 30; 



printf("%d月は%d日あります。\n", month, days); 
return(0); 

// 

解答例が1月は1049568日あります。になってしまいます。
 


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,111,784ポイント)   Date: 2009/12/15(火) 21:06   No:44159     
Title: Re:エラーについて    
規約も回答も読んでくれない人には答えられません;
言われたことと規約をよく読んで投稿して下さい・・。


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



Name: ヤクザマンション  ..ぴよぴよ(14ポイント)   Date: 2009/12/15(火) 12:28   No:44081       
Title: 無題    
if(!count==0)とif(count!=0)は同じ意味ですか?

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


Name: lbfuvab  ..上級者(24,039ポイント)   Date: 2009/12/15(火) 13:13   No:44087     
Title: Re:無題    
同じだと思いますよ。


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

Name: 光翼型近接支援残酷超初心者  ..入門者(2,651ポイント)   Date: 2009/12/15(火) 13:39   No:44091     
Title: Re:無題    
自分初心者なので自信ないですが。

たぶん違う物だと思います。


if(!count==0)は「count=0」ですが。

if(count!=0)は「count=0ではない」と言う意味だと思われますので、まったく違う物、むしろ逆。

という事です。

いや、にわか知識なのでとても怪しいです。間違ってたら本当にすみません。


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

Name: 初級者  ..初心者(7,216ポイント)   Date: 2009/12/15(火) 13:44   No:44093     
Title: Re:無題    
同じ意味ではありません。
演算子の優先順位により、前者は
if ((!count) == 0)
と解釈されます。

もし、「countが0でないとき」を表現したければ
if (count != 0)

if (!(count == 0))
と書いてください。


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

Name: YuO  ..熟練のプログラマー(41,266ポイント)   Date: 2009/12/15(火) 15:32   No:44099     
Title: Re:無題    
真偽値表を書けば一発でわかりますが,同じ意味になります。
count !count !count==0 count!=0
  0      1        0        1
  1      0        1        0
  2      0        1        0


文法から見た場合,
ISO/IEC 9899:1999 6.5.3.3 Unary arithmetic operatorsにより,!(E) と ((E) == 0) は等しく,
同じく==と!=の意味合いから,((E1) != (E2)) と !((E1) == (E2)) は等しいので,
!count == 0 → (count == 0) == 0 → !(count == 0) → count != 0
と書き換えができます。


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

Name: non  ..比類無きプログラマー(81,258ポイント)   Date: 2009/12/15(火) 16:01   No:44102     
Title: Re:無題    
YuOさんへ
count!=0 のとき
0
1
1
じゃないと、同じ意味になりませんよ。


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

Name: YuO  ..熟練のプログラマー(41,342ポイント)   Date: 2009/12/15(火) 17:47   No:44113     
Title: Re:無題    
> じゃないと、同じ意味になりませんよ。
本当ですね。書き間違えています。
count !count !count==0 count!=0
  0      1        0        0
  1      0        1        1
  2      0        1        1

が正しい表です。

nonさん,ありがとうございます。


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

Name: たかぎ [URL]  ..ハッカー(135,904ポイント)   Date: 2009/12/15(火) 18:07   No:44125     
Title: Re:無題    
countがスカラー型であればYuOさんの回答の通りです。
しかし、countがスカラー型でない場合、具体的にはクラス型の場合には事情が異なります。

言語不明なので質問の真意はわかりませんが、C++であれば、countがクラス型であり、!演算子、==演算子、!=演算子が多重定義されている場合、あるいは変換関数が定義されている場合には、意味も結果もまったく異なることがあり得ます。


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

Name: ヤクザマンション  ..ぴよぴよ(27ポイント)   Date: 2009/12/15(火) 20:51   No:44152 解決!     
Title: Re:無題    
みなさんありがとうございました

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



Name: たこやき  ..かけだし(2,430ポイント)   Date: 2009/12/12(土) 17:48   No:43946       
Title: 再描画について    
ウィンドウの雛形に
     case WM_PAINT:{
 
        PAINTSTRUCT ps;
 
        char cbuf[100];
 
        HDC hdc = BeginPaint( hWnd, &ps );
 
        wsprintf( cbuf, _T("Hello window"));
 
        TextOut(hdc,0,100,cbuf,sizeof(cbuf));
 
            SetWindowText( hWnd, cbuf );
 
        EndPaint( hWnd, &ps );
  
        break;
 
    }
 
を付けて実行したのですが、サイズを大きくしたり小さくしたりするとちらつきが見られるのですが、どうしたらこのちらつきをなくすことが出来るんでしょうか?


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,106,607ポイント)   Date: 2009/12/13(日) 05:05   No:43969     
Title: Re:再描画について    
質問する際は名前を統一して下さいますようお願いします。

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

Name: たこやき  ..入門者(2,847ポイント)   Date: 2009/12/13(日) 05:59   No:43971     
Title: Re:再描画について    
すみません。気をつけます。

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

Name: TKOZ  ..熟練のプログラマー(44,116ポイント)   Date: 2009/12/13(日) 08:55   No:43973     
Title: Re:再描画について    
サイズとは何のサイズの事でしょうか?
今、私もWindowsプログラミングを勉強しています。
力になれれば良いのですが…。


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

Name: たこやき  ..入門者(2,887ポイント)   Date: 2009/12/13(日) 13:02   No:43975     
Title: Re:再描画について    
回答ありがとうございます。サイズとは、ウインドウ自体のサイズのことです。

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

Name: softya  ..熟練のプログラマー(65,534ポイント)   Date: 2009/12/13(日) 20:00   No:43989     
Title: Re:再描画について    
多少のチラツキは避けられません。
ある程度抑える方法としては事前に作っておいた裏画面(バッファ)で描画して、表画面に転送する方法が一般的です。
参考↓
http://oshiete1.goo.ne.jp/qa4093552.html

それと2点気になったので修正しました。
1.UNICODEとマルチバイト文字の扱いの混在が気になったので統一。
2.TextOutの引数が間違っていたので修正。
        TCHAR tcbuf[100];
        HDC hdc = BeginPaint( hWnd, &ps );
        _stprintf( tcbuf, _T("Hello window"));
        TextOut(hdc,0,100,tcbuf,_tcslen(tcbuf)); ←バッファ長では無く文字列長を渡してください。
            SetWindowText( hWnd, tcbuf );
        EndPaint( hWnd, &ps );


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

Name: たこやき  ..入門者(2,913ポイント)   Date: 2009/12/13(日) 20:22   No:43990 解決!     
Title: Re:再描画について    
そうなんですか。その方法でやっていみたいと思います。
まだ実験はしてないですが。ようはstatic HDC hdc;を前のバッファにすればいいのですね。
回答ありがとうございました!


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

Name: たこやき  ..入門者(3,669ポイント)   Date: 2009/12/13(日) 23:07   No:43996     
Title: Re:再描画について    
参考にしたサイトを参考にしてやってみましたが、ちらつきが軽減しません。
やり方が間違っているのでしょうか?
ソースを見てください。
    case WM_PAINT:{
        PAINTSTRUCT ps;
        TCHAR tbuf[100];
        RECT r;
        HRGN hRgn;
        hdc = BeginPaint( hWnd, &ps );
        GetClientRect(hWnd,&r);
        wsprintf( tbuf, _T("on WM_PAINT%d"),t);
        TextOut(hdc,0,100,tbuf,::_tcslen(tbuf));
        SetWindowText( hWnd, tbuf );
<pre>        hdc2=hdc;
        EndPaint( hWnd, &ps );
        SetTimer(hWnd,NULL,1,NULL);
        break;
    } 
    case WM_TIMER:
        PAINTSTRUCT ps;
        wchar_t cbuf[100];
        RECT r;
        HRGN hRgn;
        hdc = GetDC( hWnd);
        GetClientRect(hWnd,&r);
        wsprintf( cbuf, _T("on WM_PAINT%d"),t);
        TextOut(hdc,0,100,cbuf,sizeof(cbuf));
      
        ReleaseDC( hWnd, hdc);
        t++;
        InvalidateRect(hWnd,NULL,FALSE);
        break;

です。


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

Name: たこやき  ..入門者(3,691ポイント)   Date: 2009/12/13(日) 23:31   No:43998     
Title: Re:再描画について    
このソースでいらないものがあると思いますが。それは無視してください。

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

Name: たこやき  ..入門者(4,233ポイント)   Date: 2009/12/13(日) 23:46   No:43999     
Title: Re:再描画について    
ソース間違えました。
   HDC hdc,hdc;
    case WM_PAINT:{
        PAINTSTRUCT ps;
        TCHAR tbuf[100];
        hdc = BeginPaint( hWnd, &ps );
            wsprintf( tbuf, _T("on WM_PAINT%d"),t);
        TextOut(hdc,0,100,tbuf,::_tcslen(tbuf));
        SetWindowText( hWnd, tbuf );
        EndPaint( hWnd, &ps );
        SetTimer(hWnd,NULL,1,NULL);
        break;
    } 
    case WM_TIMER:
        PAINTSTRUCT ps;
        TCHAR tbuf[100];
        RECT r;
        HRGN hRgn;
        hdc2 = GetDC( hWnd);
           GetClientRect(hWnd,&r);
        wsprintf( tbuf, _T("on WM_PAINT%d"),t);
        TextOut(hdc2,0,100,tbuf,::_tcslen(tbuf));
        ReleaseDC( hWnd, hdc2);
          t++;
        InvalidateRect(hWnd,NULL,FALSE);
        break;


です。


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

Name: softya  ..熟練のプログラマー(65,824ポイント)   Date: 2009/12/14(月) 00:34   No:44002     
Title: Re:再描画について    
本当にちゃんと読みました?
参考にリンクした情報と全然違うのですが・・・。
リンクの更にリンク先の情報までちゃんと読んでくださいね。
http://oshiete1.goo.ne.jp/qa3052870.html

問題点。
1.常駐のメモリDCが無い。
2.WM_PAINTでBitBltでメモリDCから転送していない。つまり何も変わっていない。



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

Name: たこやき  ..入門者(4,304ポイント)   Date: 2009/12/14(月) 01:38   No:44004     
Title: Re:再描画について    
回答ありがとうございます。あ、気づきませんでした。そのサイトで作ってみましたが,
create関数がないのですが、代わりの関数はないのでしょうか?一応探してみてはいるの
ですがみつからなので・・・


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

Name: softya  ..熟練のプログラマー(65,871ポイント)   Date: 2009/12/14(月) 10:07   No:44010     
Title: Re:再描画について    
createと言う関数は知らないので、オリジナル関数じゃないかと思われます。それに小文字で始まるWindowsAPIは見たことありません。
フォントはCreateFont()関数を使ってください。


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

Name: たこやき  ..入門者(4,446ポイント)   Date: 2009/12/14(月) 11:15   No:44011     
Title: Re:再描画について    
回答ありがとうございます。TextOutの方は再描画されたのですが、ボタンのほうがチカチカし始めました、どうしたらチカチカをとめるころができるのでしょうか?

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

Name: たこやき  ..入門者(4,550ポイント)   Date: 2009/12/14(月) 11:17   No:44012     
Title: Re:再描画について    
ボタンの定義はこれです。
CreateWindow( _T("BUTTON"),    _T("何もしない"),BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE ,50, 50, 300,50,
      hWnd, (HMENU)999, hInstance, NULL );
    


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

Name: softya  ..熟練のプログラマー(66,032ポイント)   Date: 2009/12/14(月) 12:25   No:44013     
Title: Re:再描画について    
ボタンのチカチカを止めることは基本的に無理です。
別ウィンドウとして描画されていますので、どうしてもチカチカしてしまいます。
色々なテクニックでチカチカを抑えることは出来ないことは無いですが、どれも裏技っぽい方法になってしまうのでどうかなと・・・。
それ以前にWindowsAPIの他の知識を深めてもらわないと説明も出来ないので色々とまず基本的なことを勉強してください。


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

Name: たこやき  ..入門者(4,581ポイント)   Date: 2009/12/14(月) 14:23   No:44018 解決!     
Title: Re:再描画について    
そうなんですか。裏技ですか。。。回答有難うございました。

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

Name: たこやき  ..入門者(4,675ポイント)   Date: 2009/12/15(火) 01:44   No:44063     
Title: Re:再描画について    
最後の質問なのでが、WM_TIMERにInvalidateRect(hWnd,NULL,FALSE);を入れて、
WM_PAINTにSetTime()をいれた場合、無限ループになるのでしょうか?また無限ループならどういう風
にかけば無限ループにならないのでしょうか?


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

Name: softya  ..熟練のプログラマー(66,939ポイント)   Date: 2009/12/15(火) 02:06   No:44064     
Title: Re:再描画について    
>最後の質問なのでが、WM_TIMERにInvalidateRect(hWnd,NULL,FALSE);を入れて、
>WM_PAINTにSetTime()をいれた場合、無限ループになるのでしょうか?また無限ループならどういう風
>にかけば無限ループにならないのでしょうか?

私が無限ループと表現したのは、WM_PAINTにInvalidateRect()を入れてしまうとWindowsの処理出来る範囲での最短時間で再描画されてしまうからです。これは描画リソースの無駄遣いですので無限ループと表現しました。
描画負荷のかかるWM_PAINTを呼び出すのは出来るだけ少なくするべきですので、都合の良い出来るだけ長い時間をSetTimerに設定してください。そうすれば描画負荷は最小限になります。1つのアプリがリソースを独占する事はWindowsプログラミングとして出来るだけ避けるべき重要な事柄です。
ちなみにWM_PAINTの度にSetTimer()をしてはいけません。SetTimer()は一回呼び出すだけでタイムアウト時間周期でWM_TIMERメッセージが毎回発生します。

そうそう、TextOutによるボタンのチラツキを抑える事はTextOutするウィンドウを子ウィンドウにしてInvalidateRect()で子ウィンドウだけ再描画すれば抑えられますよ。


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

Name: たこやき  ..入門者(4,623ポイント)   Date: 2009/12/15(火) 03:06   No:44067     
Title: Re:再描画について    
ソースをいじくりましたが、出来ません。
もうしわけないのですが具体的におしえてください。



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

Name: たこやき  ..入門者(4,661ポイント)   Date: 2009/12/15(火) 03:15   No:44068     
Title: Re:再描画について    
できれば例など出していただけると助かります。

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

Name: たいちう  ..プログラマー(39,025ポイント)   Date: 2009/12/15(火) 10:04   No:44077     
Title: Re:再描画について    
> できれば例など出していただけると助かります。

> ボタンのほうがチカチカし始めました

再現できる簡潔なプロジェクトをupしてくれたら手伝えるかも。
どんなボタンか分からないのに1から例を作るのは私は御免。
(ボタンがどこにあるのかとか、どこに描画しているのとか)


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

Name: たこやき  ..入門者(4,687ポイント)   Date: 2009/12/15(火) 12:00   No:44079     
Title: Re:再描画について    
はい。わかりました。プロジェクトは入りきらなっかったのでソースだけupします.


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

Name: たいちう  ..プログラマー(39,343ポイント)   Date: 2009/12/15(火) 12:29   No:44082     
Title: Re:再描画について    
再現しました。
多分一番ラクにごまかす方法。

case WM_TIMER: {
    TCHAR tbuf[100];
    SelectObject( hMemDC, hFont );
    int len = wsprintf( tbuf, _T("on  x=%d "),t);
    TextOut(hMemDC,0,100,tbuf,len); // ここは既にsoftyaさんが指摘している
    t++;
    RECT rect;
    SetRect(&rect, 0, 100, 200, 150);
    InvalidateRect(hWnd,&rect,FALSE);
    break;
}


正攻法としては、ダイアログリソースを使うとか、
WM_ERASEBKGROUNDを殺して、ボタンの部分以外をクリッピングして
自分で背景を描画するとかかな。
もちろんsoftyaさんの案の子ウィンドウを使う方法の他にという意味で。


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

Name: softya  ..熟練のプログラマー(66,995ポイント)   Date: 2009/12/15(火) 12:57   No:44084     
Title: Re:再描画について    
とりあえずstaticコントロールに文字を表示しただけの物です。
TextOutも使っていません。

こんな風にも出来るよって参考にしてください。

それとSetTimerの周期を1msにしてもOSのタスク・ディスパッチ周期が早くありませんので、0.001秒の周期ではWM_TIMERメッセージは発行されません。10msでも厳しいと思いますが一応10msにしてあります。



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

Name: たこやき  ..入門者(4,713ポイント)   Date: 2009/12/15(火) 13:36   No:44089     
Title: Re:再描画について    
回答ありがとうございます。結局TextOutではチカチカうぃとめることは出来ないということなのでしょうか?

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

Name: たこやき  ..入門者(4,723ポイント)   Date: 2009/12/15(火) 13:38   No:44090     
Title: Re:再描画について    
チカチカ止まっていました。回答ありがとうございます。

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

Name: たこやき  ..入門者(4,740ポイント)   Date: 2009/12/15(火) 13:41   No:44092     
Title: Re:再描画について    
すみません。やっぱり出来ませんんでした。

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

Name: softya  ..熟練のプログラマー(66,929ポイント)   Date: 2009/12/15(火) 14:14   No:44094     
Title: Re:再描画について    
>すみません。やっぱり出来ませんんでした。

意味がわかりません。
何ができなったんでしょうか?

ちなみにTextOut()を止めてもチラツキは完全には無くなりません。
ある程度抑えることが出来るだけです。


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

Name: たこやき  ..入門者(4,793ポイント)   Date: 2009/12/15(火) 14:23   No:44095     
Title: Re:再描画について    
TextOutでボタンのチカチカをとめることは出来なかったと言うことです。
TextOutではチカチカをとめることは出来ないということなのでしょうか?


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

Name: たこやき  ..入門者(4,865ポイント)   Date: 2009/12/15(火) 15:33   No:44100     
Title: Re:再描画について    
チカチカとることができました。タイチウさんありがとうございます。
ただ、TextOut()が2つあった場合どうすればよいのでしょうか。
自分でも考えてみたいとおもいます。


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

Name: たこやき  ..入門者(4,941ポイント)   Date: 2009/12/15(火) 16:32   No:44105     
Title: Re:再描画について    
原点に戻ってしまいました。ボタンとかのチカチカは消えたのですが、今度はウィンドウのサイズを変更したらまたチカチカするようになりました。助けてください。。。

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

Name: softya  ..熟練のプログラマー(67,084ポイント)   Date: 2009/12/15(火) 17:20   No:44108     
Title: Re:再描画について    
TextOutを子ウィンドウにだけ対応したもの。
どの程度のチカチカを避けたかが分かりませんが、このぐらいが限界です。
今回は、staticコントロールをサブクラス化して専用のウィンドウプロシージャで描画しています。

>ただ、TextOut()が2つあった場合どうすればよいのでしょうか。 
この方式なら、どうとでもなります。


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

Name: たこやき  ..入門者(4,920ポイント)   Date: 2009/12/15(火) 19:56   No:44139 解決!     
Title: Re:再描画について    
わかりました。回答ありがとうございました!!

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



Name: お願いします!  ..ぴよぴよ(408ポイント)   Date: 2009/12/15(火) 17:58   No:44118       
Title: 無題    
問題文 
以下の出力例のように、月を入力して、その日数を返すプログラムを作成しなさい。 

出力例: 
月を入力してください: 

9月は30日あります。 


解答 
#include <stdio.h> 
int main(void) 

int month, days; 
puts("月を入力してください:"); 
scanf("%d",&month); 

// 
(* ここに解答を書き加える *) 


printf("%d月は%d日あります。\n", month, days); 
return(0); 

// 

自分の答え
#include <stdio.h>
int main(void)
{
    int month, days;
    puts("月を入力してください:");
    scanf("%d",&month);
    
//
if(month==2)
puts("その月は28日か29日です。");
else if(month==1 || month==3 || month==5|| month==7 ||m onth==8 || month==10 || month==12)
puts("その月は31日です。");
else
puts("その月は30日です。");


    printf("%d月は%d日あります。\n", month, days);
    return(0);
}
どこかだめか教えてください!


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,109,764ポイント)   Date: 2009/12/15(火) 18:04   No:44124     
Title: Re:無題    
同じ内容についての投稿は同じトピックに投稿して下さい。
また、何度も言うようですが、規約を読んでください。
何がダメかは前回のトピックで書いていますので読んでください。


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



Name: SIT  ..かけだし(1,023ポイント)   Date: 2009/12/11(金) 01:41   No:43789       
Title: ビットマップ画像の10×10で区切って出力    
ビットマップ画像のRGBの値を出力するプログラムを書いたのですが、今度は画像の左下から10×10の画素ずつ区切って出力させるプログラムに直すことになりました。

計算式が難しいのでぜひともお知恵をお貸しください。


y2 = bi.biHeight;
x2 = bi.biWidth;

for ( y = 0; y <= y2; y++ ) {
    for ( x = 0; x <= x2; x++ ) {
        if((x % 10) == 0){y = y+1; x = 0; x3 = x;}
            if((y % 10) == 0){x = 0; y3 = x;}


                    R = data[ y ][ x ].rgbtRed;
                    G = data[ y ][ x ].rgbtGreen;
                    B = data[ y ][ x ].rgbtBlue;

printf("X軸:%d,Y軸:%d, R:%d, G:%d, B:%d\n", x, y, R, G, B);
                        }
                    }

さんざん悩んで今はこんな状態です。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,105,471ポイント)   Date: 2009/12/12(土) 03:04   No:43896     
Title: Re:ビットマップ画像の10×10で区切って出力    
>>SITさん

こんにちは。
ソースコードはプレタグで字下げして投稿して下さいね。

さて、区切って出力するというのは具体的にどうするのですか?
値をprintfで表示すればいいのか、それとも個別にファイルに保存するのか・・。

また、yは数が多い方と少ない方、どちらが下ですか?

******** 参考までに *********
#include <stdio.h> 
#define H 200
#define W 100
int main(){
    int x,y;
    for(y=0; y<H; y+=10){
        for(x=0; x<W; x+=10){
            printf("区切った10x10の左上の座標は[%d,%d]\n",x,y);
        }
    }
    return 0;
}


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

Name: SIT  ..かけだし(1,193ポイント)   Date: 2009/12/14(月) 17:35   No:44026     
Title: Re:ビットマップ画像の10×10で区切って出力    
Dixq様説明がかなり曖昧で申し訳ありません。
まず画像の左下が(0,0)です。
y2 = bi.biHeight;
x2 = bi.biWidth;

for ( y = 0; y <= y2; y++ ) {
    for ( x = 0; x <= x2; x++ ) {
        R = data[ y ][ x ].rgbtRed;
        G = data[ y ][ x ].rgbtGreen;
        B = data[ y ][ x ].rgbtBlue;
        printf("X軸:%d,Y軸:%d, R:%d, G:%d, B:%d\n", x, y, R, G, B);
    }
}

こうすると画像の左下からすべての画素をprintfで出力できたのですが、今度は左下から10×10の画素ずつ区切ってすべての画素をprintfで出力するプログラムです。


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

Name: SIT  ..かけだし(1,320ポイント)   Date: 2009/12/14(月) 17:51   No:44027     
Title: Re:ビットマップ画像の10×10で区切って出力    
添付した画像でご説明すると@の中のすべての画素をprintfで出力します。
次にAの中のすべてを出力してB・Cと同じ事して、画像の端まで行ったらDに進んで同じことをしていきます。

ただ画素を出力する画像のサイズが不明なので、


y2 = bi.biHeight; 
x2 = bi.biWidth; 

  for ( y = 0; y <= y2; y++ ) { 
       for ( x = 0; x <= x2; x++ ) { 

 
  
     
上記のようにしてどんなサイズでも対応できるようにしています。


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

Name: SIT  ..かけだし(1,503ポイント)   Date: 2009/12/14(月) 18:53   No:44028     
Title: Re:ビットマップ画像の10×10で区切って出力    
    for ( y = 0; y <= y2; y + 10 ) {
        for ( x = 0; x <= x2; x + 10 ){
/追加            for( yy = y; yy < y ; yy++){       
/追加                for( xx = x; xx < x ; xx++){
                        
                    R = data[ y ][ x ].rgbtRed;
                    G = data[ y ][ x ].rgbtGreen;
                    B = data[ y ][ x ].rgbtBlue;

                    printf("Y軸:%d,X軸:%d, R:%d, G:%d, B:%d\n", y, x, R, G, B);


                            }
                        }
                    }
                }

先ほどいじってみてこうなりました。
合っていると思うのですが実行しても何も表示されません・・・。




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

Name: Libra  ..中級者(14,519ポイント)   Date: 2009/12/14(月) 21:46   No:44035     
Title: Re:ビットマップ画像の10×10で区切って出力    
for ( y = 0; y <= y2; y + 10 ) {

最初 y = 0



for( yy = y; yy < y ; yy++){

yy = y ・・・ yy = 0 

yy < y → 0 < 0・・・yの値がどんな値でも条件を満たさない


ループの条件を満たしてないので、ループの中の処理に
入っていかないハズです。


あと、
for ( y = 0; y <= y2; y + 10 ) {

yに10を足すなら y+10 ではなく、 y+=10 じゃないと加算されません。
xについても同様で。


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

Name: SIT  ..かけだし(1,738ポイント)   Date: 2009/12/15(火) 16:58   No:44106     
Title: Re:ビットマップ画像の10×10で区切って出力    

    y2 = bi.biHeight;
    x2 = bi.biWidth;


        for ( y = 0; y <= y2;  y = y + 10) {
            for ( x = 0; x <= x2; x = x + 10){
                for( h = y; h > y + 10; h++){
                    for( w = x; w > x + 10; w++){

                        
                        R = data[ y ][ x ].rgbtRed;
                        G = data[ y ][ x ].rgbtGreen;
                        B = data[ y ][ x ].rgbtBlue;

                        printf("Y軸:%d,X軸:%d, R:%d, G:%d, B:%d\n", y, x, R, G, B);



                                }
                            }
                        }    
                    }




Libraさん、ご指摘ありがとうございます。
書き直してみましたがまだうまくprintfで出ません・・。


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

Name: non  ..比類無きプログラマー(81,584ポイント)   Date: 2009/12/15(火) 17:57   No:44116     
Title: Re:ビットマップ画像の10×10で区切って出力    
やりたいことがよく理解できてないので、間違っているかも知れませんが。
y2 = bi.biHeight; //縦の画素数
x2 = bi.biWidth; //横の画素数


for ( y = 0; y < y2;  y = y + 10) {
    for ( x = 0; x < x2; x = x + 10){
        for( h = y; h < y + 10 && h < y2; h++){
            for( w = x; w < x + 10 && w < x2; w++){

                R = data[ h ][ w ].rgbtRed;
                G = data[ h ][ w ].rgbtGreen;
                B = data[ h ][ w ].rgbtBlue;
                printf("Y軸:%d,X軸:%d, R:%d, G:%d, B:%d\n", y, x, R, G, B);

            }
        }
    }    
}



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

Name: SIT   Date: 2009/12/17(木) 20:04   No:437891261047875 解決!     
Title: Re:ビットマップ画像の10×10で区切って出力    
Dixq様 Libra様 non様
説明が不明確で申し訳ありませんでした。
プログラムを以下のようにしたらうまくいけました。

ご迷惑とお手数を取らせてしまいすいません。

//RGB別に出力する
    for ( y = 0; y <= bi.biHeight; y++ ) {
        data[ y ] = (RGBTRIPLE *)((char*)buf + LineSize * y);
    }

        fread( buf, BufferSize, 1, fp );
        n1 = z1 + 10;
        n2 = w1 + 10;
            for ( y = z1; y < n1; y++ ) {
                for ( x = w1; x <= n2; x++) {

                    if(x >= n2){
                        x = n2;
                        n2 = n2 + 10;
                    }else if(y >= n1){
                        y = n1;
                        n1 = n1 + 10;
                    }

                    if(n2 > w2){
                        break;
                    }else if(n1 > z2){
                        break;
                    }
            
            
            R = data[ y ][ x ].rgbtRed;
            G = data[ y ][ x ].rgbtGreen;
            B = data[ y ][ x ].rgbtBlue;

            printf("Y軸:%d,X軸:%d, R:%d, G:%d, B:%d\n", y, x, R, G, B);


        }
    }
    
    
    return 0;







Name: ろろろ  ..ぴよぴよ(687ポイント)   Date: 2009/12/15(火) 15:18   No:44098       
Title: 二次元正規分布 1回目しっぱいですw    
 二次元正規分布 プログラム      
 こんにちは、プログラムが作れません。手伝ってくださいお願いします。 
二次正規分布の公式  
         1   
f(x,y)= ------------------e-c^2/2 
    2πσxσy√1-p^2xy      こんなのなんですが、 

  Pxy = 0 (等高線が円の時) 
  σx=σy=σ(等高線が円の時) 
と定義し 
        1       1   x^2+y^2 
 f(x,y)=  --------- exp (- --- ------------ )
       2πσ^2      2   σ^2 
としました。 
プログラムは、f(x,y)=1/(2*pi*pow(z,2) * exp(-(pow(x,2) + pow(y,2))/2*pow(z,2)) 

としました。 自分でσをzと置いたプログラムなんですが間違ってますか?お願いします。 
環境は、UNIXです。
 


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


Name: non  ..比類無きプログラマー(81,339ポイント)   Date: 2009/12/15(火) 16:04   No:44104     
Title: Re:二次元正規分布 1回目しっぱいですw    
質問の意味がよくわからないけど、たぶん
>f(x,y)=1/(2*pi*pow(z,2) * exp(-(pow(x,2) + pow(y,2))/2*pow(z,2))

f(x,y)=1/(2*pi*pow(z,2) * exp(-(pow(x,2) + pow(y,2))/(2*pow(z,2)))


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



Name: ろろろ  ..ぴよぴよ(593ポイント)   Date: 2009/12/15(火) 15:07   No:44097       
Title: 二次元正規分布 プログラム    
こんにちは、プログラムが作れません。手伝ってくださいお願いします。
二次正規分布の公式 
                    1       
   f(x,y)=  ------------------e-c^2/2
             2πσxσy√1-p^2xy      こんなのなんですが、

  Pxy = 0   (等高線が円の時)
  σx=σy=σ(等高線が円の時)
と定義し
        1        1   x^2+y^2
 f(x,y)=  --------- exp (-  --- ------------
             2πσ^2         2   σ^2
としました。
プログラムは、f(x,y)=1/(2*pi*pow(z,2) * exp(-(pow(x,2) + pow(y,2))/2*pow(z,2))

としました。 自分でσをzと置いたプログラムなんですが間違ってますか?お願いします。
環境は、UNIXです。


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




Name: 天和  ..中級者(9,598ポイント)   Date: 2009/12/11(金) 15:17   No:43828       
Title: 構造体    
C言語の課題で
コマンドラインから入力した文章を単語単位で切り出します。
但し、文章の最後にピリオドは付けません。
次に、英単語をアルファベット順の辞書式順序 (lexicographic ordering) に並び替えます。
並び替えた後、すべての英単語とその文字数を画面に表示して下さい。

並び替えのために多少の制限が必要になります。
まず簡単のため、英単語は 'a' 〜 'z' の小文字26字からなる単語に限定します。
ハイフンやピリオドといった特殊記号は一切含まないと仮定します。
単語数の上限は 30,一単語の最大文字数は 20 と仮定します。


以下のようになれば、正解です。
> gcc -o exlexico exlexico.c
> exlexico this is an advanced programming class
advanced, 8
an, 2
class, 5
is, 2
programming, 11
this, 4
>
ただしつぎのmain関数は変更せずに使用すること(括弧のついてるコメントは自分がついてないコメントは先生が書きました)
#include<stdio.h>   /*標準入出力用*/
#include<string.h>  /* 文字列処理用*/

#define MAX_WORD 30   /*単語数の上限*/
#define MAX_CHAR 20  /*一単語の最大文字数*/

typedef struct word {
char letter[MAX_CHAR];
int lenght;
} WORD;
int main(int, char **);/*(何のためにある?)*/
int set_word(int, char **, WORD *);
void lexicosort(WORD *, int);/*(バブルソートなどの関数を書く?)*/

int main(int argc, char **argv)
{
    WORD word[MAX_WORD]; /*コマンドラインから取得した単語を格納する構造体配列*/
    int num;      /*配列wordに格納された要素数*/
    int i;
    num = set_word(argc, argv, word);/*構造体配列のメンバ値をセット(これの意味がよくわかりません)*/
        lexicosort(word, num);                             /*単語を辞書式順序で整列*/
    for(i = 0; i < num; i++){
        printf("%s, %d\n", word[i].letter, word[i].lenght); /*結果表示*/
    }
    return 0;
}


今回のコンパイラはMacのGCCです。(ただしたまにVISUAL C++でC言語書く場合あり(ウィンドウズでレポートを書くため)
自分のレベルは教科書読みながらなら構造体が少しわかる程度でしょうか。
よろしくお願いします。


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


Name: たいちう  ..プログラマー(38,512ポイント)   Date: 2009/12/11(金) 15:27   No:43829     
Title: Re:構造体    
質問は?

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

Name: 天和  ..中級者(9,850ポイント)   Date: 2009/12/11(金) 15:32   No:43831     
Title: Re:構造体    
失礼しました上の課題
C言語の課題で 
コマンドラインから入力した文章を単語単位で切り出します。 
但し、文章の最後にピリオドは付けません。 
次に、英単語をアルファベット順の辞書式順序 (lexicographic ordering) に並び替えます。 
並び替えた後、すべての英単語とその文字数を画面に表示して下さい。 

並び替えのために多少の制限が必要になります。 
まず簡単のため、英単語は 'a' 〜 'z' の小文字26字からなる単語に限定します。 
ハイフンやピリオドといった特殊記号は一切含まないと仮定します。 
単語数の上限は 30,一単語の最大文字数は 20 と仮定します。 


以下のようになれば、正解です。 
> gcc -o exlexico exlexico.c 
> exlexico this is an advanced programming class 
advanced, 8 
an, 2 
class, 5 
is, 2 
programming, 11 
this, 4 

のとき方を教えてほしいというのが質問です。
わからない部分はnum = set_word(argc, argv, word);/*構造体配列のメンバ値をセット*/の部分
になります。


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

Name: たいちう  ..プログラマー(38,788ポイント)   Date: 2009/12/11(金) 15:41   No:43833     
Title: Re:構造体    
よく見たらコメント部分に質問があったのね。
気づき難かったとはいえ失礼しました。

> /*(何のためにある?)*/

関数の宣言です。main関数については必要ありませんが、
もしも他の関数の定義をmain関数の定義よりも後に書く場合、
他の関数の宣言がなかったら、main関数のコンパイル時にその関数を
認識できません。
int i; と書いた後しか i を使えないことと似ています。

> /*(バブルソートなどの関数を書く?)*/

出題の意図はそうだと思います。
但し、ここは関数の宣言なので、別の場所に定義を書いたほうが良いでしょう。

> /*構造体配列のメンバ値をセット(これの意味がよくわかりません)*/

コマンドラインから受け取った文字列を分割し構造体に代入します。
set_wordはそのような処理を行っている、ということをコメントにして
説明しているのでしょう。


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

Name: 天和  ..中級者(10,117ポイント)   Date: 2009/12/11(金) 15:47   No:43834     
Title: Re:構造体    
>よく見たらコメント部分に質問があったのね。 
気づき難かったとはいえ失礼しました。 

いえいえこちらこそ見づらくてすいません。
>> /*(バブルソートなどの関数を書く?)*/ 

>出題の意図はそうだと思います。 
>但し、ここは関数の宣言なので、別の場所に定義を書いたほうが良いでしょう。 

そこなんですがバブルソートって文字でもちゃんと昇順にできるのでしょうか?
バブルソートを調べてみても例題が数字ばっかなので
>> /*構造体配列のメンバ値をセット(これの意味がよくわかりません)*/ 

>コマンドラインから受け取った文字列を分割し構造体に代入します。 
>set_wordはそのような処理を行っている、ということをコメントにして 
>説明しているのでしょう。

つまりthisという一単語があったらt h i sと分けて配列に入れるということですね。




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

Name: non  ..比類無きプログラマー(80,389ポイント)   Date: 2009/12/11(金) 18:00   No:43848     
Title: Re:構造体    
int set_word(int n, char **s, WORD *p)
{
    int i;
    for(i=1;i<n;i++){
        strcpy((p+i-1)->letter,*(s+i));
        (p+i-1)->lenght=strlen(*(s+i));
        puts(*(s+i));
    }
    return n-1;
}



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

Name: たかぎ [URL]  ..ハッカー(135,772ポイント)   Date: 2009/12/11(金) 18:45   No:43849     
Title: Re:構造体    
私も作ってみました。
int set_word(int argc, char **argv, WORD *word)
{
    int i;
    for (i = 0; i < argc - 1; i++)
        word[i].lenght = sprintf(word[i].letter, "%s", argv[i + 1]);
    return argc - 1;
}

こんな感じでしょうか?


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

Name: example  ..ぴよぴよ(503ポイント)   Date: 2009/12/11(金) 20:56   No:43857     
Title: Re:構造体    
#include <stdio.h>
#include <string.h>

#define MAX_WORD 30    /* 単語数の上限 */
#define MAX_CHAR 20    /* 一単語の最大文字数 */

typedef struct word {
    char letter[MAX_CHAR];
    int length;
} WORD;

int set_word(int, char **, WORD *);
void lexicosort(WORD *, int);

int main(int argc, char **argv)
{
    WORD word[MAX_WORD];    /* コマンドラインから取得した単語を格納する構造体配列 */
    int num;    /* 配列wordに格納された要素数 */
    int i;

    num = set_word(argc, argv, word);    /* 構造体配列のメンバ値をセット */
    lexicosort(word, num);    /* 単語を辞書式順序で整列 */
    for(i=0; i<num; i++) {
        printf("%s, %d\n", word[i].letter, word[i].length);    /* 結果表示 */
    }

    return 0;
}

int set_word(int argc, char **argv, WORD *word)
{
    int i;

    for(i=0; i<argc-1; i++)    {
        word[i].length = sprintf(word[i].letter, "%s", argv[i+1]);
    }

    return argc - 1;
}

void lexicosort(WORD *word, int num)
{
    WORD temp;
    int i, j;

    for(i=0; i<num-1; i++) {
        for(j=num-1; j>i; j--) {
            if(strcmp(word[j-1].letter, word[j].letter) > 0) {
                temp = word[j];
                word[j] = word[j-1];
                word[j-1] = temp;
            }
        }
    }
}

こんな感じでしょうか?
lenghtってlength?


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

Name: 天和  ..中級者(10,299ポイント)   Date: 2009/12/11(金) 22:30   No:43863     
Title: Re:構造体    
>nonさん >たかぎさん 
いつもありがとうございます。
早速ソース解読をさせていただきます。
>exampleさん
>lenghtってlength?
はいそうです。
すいませんうち間違い多くて。
またソース全文書いていただきありがとうございます


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

Name: Naohiro19  ..かけだし(1,897ポイント)   Date: 2009/12/14(月) 07:53   No:44007     
Title: Re:構造体    
Lua言語では以下のようなプログラムになります。
--wordは単語
data = {
        {word = "this"},
        {word = "is"},
        {word = "an"},
        {word = "advanced"},
        {word = "programming"},
        {word = "class"}
}

-- 比較
function comp(a, b)
    if( a.word < b.word) then
        return 1
    end
end

-- ソート
table.sort(data,comp)

--表示
for idx = 1, table.getn(data) do
        out = string.format("%s %d",data[idx].word, #data[idx].word)
        print(out)
end


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

Name: 天和  ..中級者(10,329ポイント)   Date: 2009/12/15(火) 13:08   No:44086 解決!     
Title: Re:構造体    
ありがとうございましたー
無事終了することができました


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



Name: 夏天  ..初心者(6,779ポイント)   Date: 2009/12/15(火) 03:47   No:44069       
Title: 図形描画関数    
DXライブラリの図形描画関数に関しての質問なのですが
中をくりぬいた図形を描画するときに枠線が1ピクセルしかないのですが
コレの太さを変えることは可能ですか?

もしも出来ないのなら
どうすれば太い中抜きの画像を書くことが出来ますか?

描きたい図形は
円、三角、四角、直線
の4つです


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


Name: Ma  ..上級者(23,869ポイント)   Date: 2009/12/15(火) 07:45   No:44075     
Title: Re:図形描画関数    
直線とかは、第6引数に太さを指定できます。

extern int DrawLine( int x1, int y1, int x2, int y2, int Color, int Thickness = 1 ) ;                                            
それ以外は、図形を少しずらして描画する方法を私はとっています。
もし、たくさん使うなら太さを引数に持ったオリジナル関数を作るのがいいかと。

ちょうど、昔作った関数がのこっていたのでのせます。


中を埋めない場合は、 fillColor に 0 を指定してください。
透明度0なら alpha には 256を。
border に太さを指定してください。

void DrawFrame(int x,int y,int width,int height,int border,int borderColor,int fillColor,int alpha){
    SetDrawBlendMode( DX_BLENDMODE_ALPHA,alpha) ;
    if(fillColor != 0)
        DrawBox(x,y,x+width,y+height,fillColor,TRUE);
    if(borderColor != 0){
        for(int i = 0; i < border; i++)
            DrawBox(x+i,y+i,x+width-i,y+height-i,borderColor,FALSE);
    }
    SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 ) ;
}


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

Name: 夏天   Date: 2009/12/16(水) 17:13   No:440691260951210 解決!     
Title: Re:図形描画関数    
お返事遅れてすみません
どうもアリガトウゴザイマス
三角形や円にも挑戦してみます




Name: yrao  ..初心者(6,345ポイント)   Date: 2009/12/11(金) 14:46   No:43825       
Title: 弾を残像させる方法について    
こんにちは、お世話になってます。
龍神録のプロジェクトを利用させてもらってゲームをつくっているのですが、
タイトル通り、弾を残像させるエフェクトの作り方についての質問です。
 
残像というよりも、弾が尾を引くようなエフェクトといった方がいいかもしれません。
どなたか分かる方いましたらよろしくお願いします。


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


Name: softya [URL]  ..熟練のプログラマー(63,570ポイント)   Date: 2009/12/12(土) 00:35   No:43872     
Title: Re:弾を残像させる方法について    
残像させる、尾を引く、どちらでもですが過去の座標や方向などを配列に残してやる方法を使います。
新しく移動する度に座標を残して配列に格納していくわけです。
その配列に残された過去の座標を時系列順に取り出して残像などに使います。
イメージは伝わりましたかね?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,101,818ポイント)   Date: 2009/12/12(土) 02:27   No:43892     
Title: Re:弾を残像させる方法について    
前フレームの弾の座標を記憶しておいて、アルファブレンドすればそれっぽくなりそうですね。
α値は試行錯誤で良い値を見つけていくことになると思いますが、
例えば
「1フレーム前にあった座標x1,y1にα値240で描画」
「2フレーム前にあった座標x2,y2にα値230で描画」
「3フレーム前にあった座標x3,y3にα値220で描画」
「4フレーム前にあった座標x4,y4にα値210で描画」
「5フレーム前にあった座標x5,y5にα値200で描画」
「6フレーム前にあった座標x6,y6にα値190で描画」
.....

みたいな感じで古いものほど薄く描画すれば尾を引いた感じになりそうです。


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

Name: yrao  ..初心者(6,503ポイント)   Date: 2009/12/12(土) 13:50   No:43932     
Title: Re:弾を残像させる方法について    
ありがとうございます。
 
 
nフレーム前の座標を所得して、その座標にαブレンドした弾の画像を描画する…ということでしょうか?
 
どのような処理を書いていったらいいのかがよく分からないのです;
サンプルなどないでしょうか…


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

Name: softya  ..熟練のプログラマー(64,149ポイント)   Date: 2009/12/12(土) 15:58   No:43942     
Title: Re:弾を残像させる方法について    
今後、弾幕を作っていくのにサンプルばかりに頼るのも初心者脱出の妨げになるので穴埋め問題にしてみました。

まず、前の座標を覚える配列を用意します。
10フレーム前まで覚えるなら
double bx[10];
double by[10];
double bangle[10];
を弾の構造体に追加します。

0.配列を初期化します。画面外にしたほうが良いでしょう。
※ 自分で考えてみてください。

1.座標をシフトします。後ろからやっている理由は考えてみてください。
for( int b=9 ; b>0 ; b-- ) {
shot[n].bullet[k].bangle[b] = shot[n].bullet[k].bangle[b-1]; 
shot[n].bullet[k].bx[b] = shot[n].bullet[k].bx[b-1];
shot[n].bullet[k].by[b] = shot[n].bullet[k].by[b-1];
}

2.今の弾の座標を移動する前にコピーします。
shot[n].bullet[k].bangle[0] = shot[n].bullet[k].angle; 
shot[n].bullet[k].bx[0] = shot[n].bullet[k].x;
shot[n].bullet[k].by[0] = shot[n].bullet[k].y;

3.残存の弾を表示します。
※ これも自分で考えてみてください。



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

Name: yrao  ..初心者(6,612ポイント)   Date: 2009/12/12(土) 16:51   No:43944     
Title: Re:弾を残像させる方法について    
そうですね、少し自分で考えてやってみようと思います。
 
 
質問が二つあるのですが、@、手順0の「画面外に」とはどういうことなのでしょうか?
A、手順1以降の処理は、「graph.cpp」>「if(boss_shot.flag>0){//弾幕データがオンなら〜〜」の中で、「if(boss.shot.bullet[j].eff_detail==2){〜〜」というような分岐をさせて、その中に書くということで大丈夫なのでしょうか?


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

Name: softya  ..熟練のプログラマー(64,273ポイント)   Date: 2009/12/12(土) 19:14   No:43951     
Title: Re:弾を残像させる方法について    
@、手順0の「画面外に」とはどういうことなのでしょうか? 

画面内だと表示されてしまいますから。
別の方法として、表示しないフラグを追加するのも良い方法です。

A、それは表示である3.だけにしといたほうが良いですね。
1.と2.は弾の座標を計算している処理ところでやったほうが良いでしょう。


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

Name: yrao  ..初心者(6,795ポイント)   Date: 2009/12/12(土) 20:26   No:43953     
Title: Re:弾を残像させる方法について    
うーん……
 
 
配列の初期化について調べてみたのですが、例えば
 
int hairetsu[5] = {0,1,2,3,4};
 
のようなものである
と書いてありました。

…画面外、画面内とはどこで指定すれば…
 
というか、そもそも自分が配列の初期化の意味を取り違えているような気もするのですが…
 
もしできたらもう少し詳しく教えていただけないでしょうか?


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

Name: softya  ..熟練のプログラマー(64,376ポイント)   Date: 2009/12/12(土) 21:43   No:43956     
Title: Re:弾を残像させる方法について    
>配列の初期化
確かに私の書き方が悪かったですね。申し訳ないです。
弾を生成する度に、画面外の値を与えてくださいって意味です。
画面外の値とは、-100とか画面内に表示されない位置であれば何でも良いです。


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

Name: yrao  ..初心者(6,839ポイント)   Date: 2009/12/12(土) 22:45   No:43960     
Title: Re:弾を残像させる方法について    
ということは、
構造体での宣言時に
double bx[10] = -100;


 
 
でいいのでしょうか?


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

Name: softya  ..熟練のプログラマー(64,604ポイント)   Date: 2009/12/12(土) 22:50   No:43961     
Title: Re:弾を残像させる方法について    
double bx[10] = -100; 
残念ですが、C言語はこんな初期化は出来ません。
それに
>弾を生成する度
と書いたんですが、理解されてますか?

それと
>弾の構造体に追加します。 
の部分を見逃していますよ。
もう一度私の書いた事を読み直してみてください。
その上で分からない部分はスルーするのではなく意味を聞いてくださいね。


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

Name: yrao  ..初心者(6,959ポイント)   Date: 2009/12/13(日) 15:53   No:43980     
Title: Re:弾を残像させる方法について    
今日もよろしくお願いしますm(__)m
 
 
>構造体に追加
  struct.h内のbullet_tに、
  double bx[10],by[10],bangle[10];
 
  と追加したのですが、これで大丈夫でしょうか?
 
>弾を生成する度に
  for(j=0;j<BOSS_BULLET_MAX;j++)
  のループ内に書くということですか?


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

Name: softya  ..熟練のプログラマー(65,020ポイント)   Date: 2009/12/13(日) 19:30   No:43987     
Title: Re:弾を残像させる方法について    
>struct.h内のbullet_tに、
>double bx[10],by[10],bangle[10]; 
>と追加したのですが、これで大丈夫でしょうか? 

大丈夫だと思います。
あと忘れていたのですが、ボスの弾に残像がある弾と無い弾があるなら残像の有無フラグも追加した方が良いでしょう。

>>弾を生成する度に 
>for(j=0;j<BOSS_BULLET_MAX;j++)
>のループ内に書くということですか?

それってgraph_bullet()関数では?ここは弾の表示をする場所ですよね。
弾の残像の表示はここになりますが、弾を生成(発生)させているのは別の場所です。

そうですね。
たぶん、龍神録のすべての関数の役割を理解されていない物と思われますので、ボスに関係するすべての関数と役割を書いてみてもらえますか?
(例)
graph_bullet()・・・。弾の表示を行う関数。
雑魚の弾とボスの弾の表示を行っています。
少なくとも、ボスの行動、ボスの弾幕の制御、ボスの弾幕の生成、ボスの弾幕の制御、ボスの弾幕から弾の生成の部分は何処かは書き出してくださいね。


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

Name: yrao  ..初心者(7,409ポイント)   Date: 2009/12/14(月) 19:15   No:44029     
Title: Re:弾を残像させる方法について    
遅れました
 
 
間違っている可能性大ですが、
 

boss_shot_main()
enter_boss()
enter_boss_shot()
→ボス弾幕の制御でしょうか…
ボス関係で一番重要な関数だと思うのですが、詳しくは分かりませんでした…

boss_shot_bullet[boss.knd]()
boss_shot_calc)()
→弾幕の生成と計算

graph_boss()
→ボス本体の描画
 
calc.boss()
→ボスの動き(上下にふわふわと浮くような)の計算
waitandenter()
→弾幕関数にいくまでの時間を設定する



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

Name: softya  ..熟練のプログラマー(66,675ポイント)   Date: 2009/12/14(月) 20:17   No:44030     
Title: Re:弾を残像させる方法について    
やはり、関数群の役割を理解されていませんかね。
これを理解していないと改造など出来るはずもありませんので、なんども見直して考えてみましょう。ヒントを書きますので、もう一度コードを眺めたり、改造して動かして見てください。

まず基本的なソースコードの解読手法。
実は非常に有効な学習方法でもあります。

1.名前から機能を類推する。
例えば、enter_boss()ならenterは入り口とか参加するとかの意味ですね。
って事はenter_boss()はボス発生じゃないかと類推出来るワケです。

2.関数内で、どの構造体を変更しているかで機能を推測する。
使われている構造体とその内容から行っていることを推測します。
例えば、enter_boss()はボス構造体の初期化をしています。さらにnumが0の時は中ボスとして処理されている事がわかりますね。

3.関数の一部をコメントアウトしてみて動作の変化から機能を見つける。
例えば、graph_boss()の中身を全てコメントアウトするとボスが表示されなくなりますよね。
これでボスの表示をしている所だと分かるわけです。

4.デバッガで動きをトレースする。
調べたい関数の先頭でブレークした後、ステップ実行でプログラムの流れを追います。
if文など分岐点を調べる場合は、更にブレークポイントを設定して調べます。

で、今回の回答の正解か不正解かですが。

>boss_shot_main()
>enter_boss()
>enter_boss_shot()
>→ボス弾幕の制御でしょうか…
>ボス関係で一番重要な関数だと思うのですが、詳しくは分かりませんでした…

ヒントを出しましたので、もう少し調べてみてください。
ちなみに、boss_shot_main()は名前から類推出来る機能と実際に書かれているコードが食い違っています。


>boss_shot_bullet[boss.knd]()
関数ポインタによる呼び出しです。
実際に呼び出されている関数の方を書いてください。

>boss_shot_calc()    →弾幕の生成と計算
惜しいですが微妙に違います。具体的にどんな計算をしているかも簡単に書いてください。

>graph_boss()    →ボス本体の描画
これは名前通りですね。正解です。

>calc_boss()        →ボスの動き(上下にふわふわと浮くような)の計算
これも正解です。

>waitandenter()    →弾幕関数にいくまでの時間を設定する 
微妙に違います。
enter_boss_shot()との関係でわかりますよ。


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

Name: yrao  ..初心者(7,982ポイント)   Date: 2009/12/14(月) 22:26   No:44041     
Title: Re:弾を残像させる方法について    
言われたとおりプログラムを見直してみました。
少しはプログラムの意味が分かってきた……ような気が…


各関数の役割の訂正も含めて、ボス関係の主な処理の流れを簡単にまとめてみたのですが、こんな感じであってるでしょうか?
 
 
boss_shot_main()
  中ボス開始時間又はラスボス開始時間で、かつboss.flagが0
 

 
enter_boss(0)
  雑魚敵消去
  雑魚弾幕消去
  ボスの初期座標設定
  (以上が中ボスの時だけの処理)
  弾幕残り時間設定
  弾幕の種類を一つづつ送る(boss.knd++)
  boss.stateを1(待機中状態)に
 

boss.stateが1になったので、boss_shot_main()の分岐を通ってwaitandenter()へ
 
waitandenter()
  設定した時間がたったらenter_boss_shot()へ
 

 
enter_boss_shot()
  弾情報初期化
  boss_shot.flagを1に
  boss.stateを2(弾幕中状態)に
  HP設定
 

boss.stateが2になったので、boss_shot_main()の条件分岐を通って、
  ・boss_shot_bullet(0)
  ↑
  1番目の弾幕
  ・boss_shot_calc()
  ↑
  弾の座標計算(…もしかして此処に弾の残像の処理を書くのですか?)
へ。
 
 
boss_shot_main()内分岐
1番目の弾幕中でボスの体力が0になったら、
  敵のピチュリ音
  レーザー、弾情報初期化  enter_boss(1)へ
 

 
enter_boss(1)
  弾幕残り時間設定
  弾幕の種類を一つづつ送る(boss.knd++)
  boss.stateを1(待機中状態)に
 



繰り返し



 
最後の弾幕で、ボスの体力が0になったら
  ボス撃破音
  boss.flagを0に
 


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

Name: softya  ..熟練のプログラマー(66,820ポイント)   Date: 2009/12/14(月) 23:34   No:44051     
Title: Re:弾を残像させる方法について    
良いですよ!さっきより大分と整理されましたね。
問題などポイントを絞って説明しますね。

>enter_boss_shot()
弾情報初期化じゃなくて弾幕情報の初期化ですね。
理解されているとは思いますけど念のため。

>・boss_shot_calc()
>↑
>弾の座標計算(…もしかして此処に弾の残像の処理を書くのですか?)
>へ。

そうです。残像の配列をコピーしたり配列への座標設定はここに記述します。

あと問題は、弾が生成される場所が書かれていないので残像の座標を画面外に設定する場所が決まりません。
弾の残像の表示場所は前回出ているのでわかりますね?


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

Name: yrao   Date: 2009/12/17(木) 08:01   No:438251261004469     
Title: Re:弾を残像させる方法について    
後少しで過去ログにいってしまいそうだったので、コメントだけでも…
ここ数日学校の用事のため書き込みができませんでした;
softyaさん申し訳ないです。
今日の夜にはPCを開くことができそうなので、ご教授お願いしますm(__)m


Name: yrao   Date: 2009/12/17(木) 08:07   No:438251261004873     
Title: Re:弾を残像させる方法について    
大分後ろに下がってしまったのでコメントだけでも… 
ここ数日、学校の用事で書き込みができませんでした;
softyaさん申し訳ないです。
 
今日の夜にはPCを開くことができそうなので、ご教授お願いしますm(__)m





 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +