C言語何でも質問掲示板

Total hit  今日  昨日  



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

 
   龍神録館   
     ・[39172] Dixq (管理人) 
   龍神録のオプションか ....   
     ・[39171] Dixq (管理人) 
   漢字弾幕について   
     ・[39159] a 
     ・[39164] Justy 
     ・[39169] Dixq (管理人) 
   typedef 構造体 配列 ....   
     ・[39163] box 
   横スクロールアクショ ....   
     ・[39054] Dixq (管理人) 
     ・[39055] sizuma 
     ・[39057] チルチル 
     ・[39065] けんたろうちゃん 
     ・[39090] zwi 
     ・[39107] けんたろうちゃん 
     ・[39113] zwi 
     ・[39115] けんたろうちゃん 
     ・[39123] zwi 
     ・[39143] けんたろうちゃん 
     ・[39156] けんたろうちゃん 
   4章   
     ・[39135] ネオ 
   BCCで   
     ・[39121] box 
     ・[39132] ディア 
   弾を沢山重ねたらレー ....   
     ・[38816] Justy 
     ・[38821] @ 
     ・[38823] チルチル 
     ・[38829] Justy 
     ・[38873] そうは問屋の最終兵器 
     ・[38874] そうは問屋の最終兵器 
     ・[38880] @ 
     ・[38888] Dixq (管理人) 
     ・[38889] Dixq (管理人) 
     ・[38893] @ 
     ・[38895] Dixq (管理人) 
     ・[38935] Justy 
     ・[38950] Dixq (管理人) 
     ・[38952] Dixq (管理人) 
     ・[38957] そうは問屋の最終兵器 
     ・[38959] Justy 
     ・[39041] Dixq (管理人) 
     ・[39069] Justy 
     ・[39100] @ 
     ・[39128] Justy 
   キャラをゲームパッド ....   
     ・[39118] yu 
   質問です   
     ・[38956] T.C.D 
     ・[38958] MNS 
     ・[39007] 朝見草 
     ・[39011] sizuma 
     ・[39021] バグ 
     ・[39024] あ〜る 
     ・[39025] ねこ 
     ・[39030] mnkr 
     ・[39050] Dixq (管理人) 
     ・[39117] 朝見草 
   char配列で作成したデ ....   
     ・[39110] b 
     ・[39111] binoruto 
     ・[39112] non 
     ・[39114] binoruto 
   ボスがアイテムを落と ....   
     ・[38797] zwi 
     ・[38822] ほのか 
     ・[39101] TKOZ 
     ・[39104] zwi 
   ハイスコアを龍神録に ....   
     ・[38899] Dixq (管理人) 
     ・[39102] たか 
   area.bgm.flag==4の場 ....   
     ・[39047] さめ 
     ・[39049] Dixq (管理人) 
     ・[39099] しっぽ 
   龍神録のスクロールに ....   
     ・[39083] yu 
     ・[39097] 犀 
   VC.netでRedo機能の追 ....   
     ・[39068] Justy 
     ・[39070] バグ 
     ・[39085] 餅 
     ・[39086] Justy 
     ・[39092] 餅 
     ・[39095] Justy 
   落ちもの系   
     ・[39071] バグ 
     ・[39078] うどん 
     ・[39079] conio 
     ・[39080] バグ 
     ・[39088] うどん 
   歩くのをテクテクさせ ....   
     ・[39067] チルチル 
     ・[39072] zwi 
     ・[39074] kazuoni 
     ・[39081] garugaru 
     ・[39082] zwi 
     ・[39087] garugaru 
   無題   
     ・[39075] mnkr 
     ・[39077] Mist 
   インベーダーのような ....   
     ・[39042] Dixq (管理人) 
     ・[39060] HIT 
   画像をキー入力で移動   
     ・[39003] チルチル 
     ・[39004] チルチル 
     ・[39005] kazuoni 
     ・[39008] Justy 
     ・[39014] garugaru 
     ・[39015] garugaru 
     ・[39017] sizuma 
     ・[39018] チルチル 
     ・[39036] garugaru 
     ・[39037] garugaru 
     ・[39044] Dixq (管理人) 
     ・[39059] garugaru 
   IntelliSenceの不具合 ....   
     ・[38969] にょろーん 
     ・[38978] Tororo 
     ・[38979] 御津凪 
     ・[39058] ねこ 
   画像ファイルについて   
     ・[38974] バグ 
     ・[38988] Justy 
     ・[38994] AAS 
     ・[38995] toyo 
     ・[39052] Dixq (管理人) 
   自機が点滅してしまい ....   
     ・[39026] チルチル 
     ・[39051] Dixq (管理人) 
   全方向シューティング ....   
     ・[39034] DVDM 
     ・[39035] チルチル 
     ・[39045] Dixq (管理人) 
     ・[390311253170589] 電気屋 
   教えて下さい   
     ・[39016] conio 
     ・[39038] AAA 
     ・[39039] AAA 
     ・[39043] Dixq (管理人) 
   行列から角度の求めか ....   
     ・[39012] Justy 
   タイトル画面とステー ....   
     ・[38800] zwi 
     ・[39006] 天魔 
   EEは無料?それとどち ....   
     ・[38997] Mist 
     ・[39001] ターボ 
   オプションについて   
     ・[38904] ☆ 
     ・[38916] チルチル 
     ・[38920] ☆ 
     ・[38922] チルチル 
     ・[38924] ☆ 
     ・[38926] conio 
     ・[38927] チルチル 
     ・[38928] ☆ 
     ・[38931] ☆ 
     ・[38932] conio 
     ・[38936] ☆ 
     ・[38937] ☆ 
     ・[38943] conio 
     ・[38985] ☆ 
     ・[38986] チルチル 
     ・[38987] ☆ 
     ・[38989] conio 
     ・[38998] チルチル 
   黄色に何を混ぜたら灰 ....   
     ・[38970] Dixq (管理人) 
     ・[38991] 未来 
   レーザーを飛ばしたい   
     ・[38892] Dixq (管理人) 
     ・[38962] mik 
     ・[38981] チルチル 
     ・[38982] mik 
     ・[38983] チルチル 
     ・[38984] mik 
   処理が重くなっていく   
     ・[38652] 羽流布 
     ・[38653] kazuoni 
     ・[38660] マウ 
     ・[38661] kazuoni 
     ・[38662] 羽流布 
     ・[38972] マウ 
   無題   
     ・[38939] T.C.D 
     ・[38941] UKONN 
     ・[38942] MNS 
     ・[38944] T.C.D 
     ・[38965] UKONN 
   ClearDrawScreenが効か ....   
     ・[38948] MNS 
     ・[38953] 狼太郎 
   フェードイン、フェー ....   
     ・[38544] kazuoni 
     ・[38545] situmon 
     ・[38546] kazuoni 
     ・[38547] チルチル 
     ・[38576] situmon 
     ・[38578] kazuoni 
     ・[38597] situmon 
     ・[38598] situmon 
     ・[38626] kazuoni 
     ・[38677] situmon 
     ・[38689] kazuoni 
     ・[38774] situmon 
     ・[38813] おむすび 
     ・[38814] kazuoni 
     ・[38883] おむすび 
     ・[38886] Dixq (管理人) 
     ・[38905] おむすび 
     ・[38919] Justy 
     ・[38949] おむすび 
   ファイル出力入力のプ ....   
     ・[38706] MNS 
     ・[38708] 狼太郎 
     ・[38709] 狼太郎 
     ・[38710] non 
     ・[38712] 狼太郎 
     ・[38721] box 
     ・[38737] non 
     ・[38946] 狼太郎 
   「RyuJin.sln」が開け ....   
     ・[38894] Dixq (管理人) 
     ・[38945] 小夜 
   背景透過のPNGの描画   
     ・[38810] kazuoni 
     ・[38811] 560 
     ・[38815] Justy 
     ・[38817] ととろ 
     ・[38818] ととろ 
     ・[38819] Justy 
     ・[38820] Justy 
     ・[38824] ととろ 
     ・[38826] ととろ 
     ・[38828] Justy 
     ・[38879] ととろ 
     ・[38890] Dixq (管理人) 
     ・[38934] ととろ 
   戻り値はあるけれど   
     ・[38911] MNS 
     ・[38929] uwlover 
   オーバーロード関数と ....   
     ・[38923] Justy 
     ・[38925] APS 
   太鼓の鉄人の性能を高 ....   
     ・[38884] Justy 
     ・[38885] Dixq (管理人) 
     ・[38921] Justy 
   エフェクト画像はどう ....   
     ・[38917] kazuoni 
   敵に長距離ビームを撃 ....   
     ・[38897] Dixq (管理人) 
     ・[38915] 560 
   ニコニコ組曲のwavデー ....   
     ・[38914] チルチル 
   途中計算結果   
     ・[38841] Tororo 
     ・[38842] UKONN 
     ・[38846] box 
     ・[38847] UKONN 
     ・[38849] mats 
     ・[38900] Dixq (管理人) 
     ・[38912] UKONN 
   一瞬で消えてしまいま ....   
     ・[38739] noob 
     ・[38740] kazuoni 
     ・[38767] zyf 
     ・[38768] 夢夢 
     ・[38769] zwi 
     ・[38771] zyf 
     ・[38772] zwi 
     ・[38836] zyf 
     ・[38852] conio 
     ・[38869] zyf 
     ・[38875] pooka 
     ・[38876] suzume 
     ・[38877] conio 
   自機ショットと敵消滅 ....   
     ・[38854] 素人A 
     ・[38857] まる 
     ・[38859] yu 
     ・[38860] 素人A 
     ・[38862] まる 
     ・[38865] まる 
     ・[38867] まる 
     ・[38870] 素人A 
     ・[38871] pooka 
     ・[38872] まる 
   DxLibに詳しい人へ質問 ....   
     ・[38834] kazuoni 
     ・[38835] usami 
     ・[38837] MNS 
     ・[38838] usami 
     ・[38839] Justy 
     ・[38855] usami 
     ・[38856] yu 
     ・[38861] usami 
     ・[38863] yu 
     ・[38864] MNS 
     ・[38866] Justy 
     ・[38868] usami 
   レーザーの実装につい ....   
     ・[38850] yu 
     ・[38851] 名無し 
     ・[38853] yu 
     ・[38858] 名無し 

Name: aaa  ..ぴよぴよ(275ポイント)   Date: 2009/09/12(土) 11:55   No:39136       
Title: 龍神録館    
どうも、aaaです

現在、BCCでゲームを作成してるのですが、
コンパイル時に

〜\PROJECT\INCLUDE\ZLIB_D.LIB'
(別の場所に保存した龍神録のプロジェクト内)

と、ソースの中には記していないはずのディレクトリからZLIB_D.LIBを
呼び出してしまいます。

DXライブラリに入っている「プロジェクトに追加すべきファイル_BCC用」

の中身を使っているのですが、
どうしてかそこから呼び出してくれません。

どうしたら直るでしょうか?


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,056,637ポイント)   Date: 2009/09/13(日) 08:11   No:39172     
Title: Re:龍神録館    
BCCを使った事がないのでよくわかりませんが、
プロジェクトの設定がそうなっているのではないでしょうか?
例えばインクルードパスの設定が、そのフォルダを指していて、
どこから呼ぼうとそこを指すといった状況になっているのではないでしょうか?


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



Name:  ..ぴよぴよ(380ポイント)   Date: 2009/09/12(土) 00:18   No:39125       
Title: 龍神録のオプションから発射するショットについて    
50章まで勉強させてもらいました。
オプションから発射するショットのみ、ショットの画像を変えたいのですがどうしたらいいのでしょうか?
アドバイスお願いします。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,056,629ポイント)   Date: 2009/09/13(日) 08:09   No:39171     
Title: Re:龍神録のオプションから発射するショットについて    
細かくではなくとも、だいたいでも龍神録のプログラムを理解されていたらすぐに解ると思いますので、
プログラムを目で追って確認してみて下さい。

例えば画像の読み込みって一箇所でしかしてないですよね。
後、画像を差し替えたいだけならデータフォルダから確認したらすぐにわかります。
画像を差し替えるだけで、プログラムを変更する必要はありません。


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



Name:  ..ぴよぴよ(35ポイント)   Date: 2009/09/12(土) 01:52   No:39129       
Title: 漢字弾幕について    
漢字弾幕のツールについてお聞きしたいのですが、
このツールを使って生成された.datを
確認のために再び開きたいのですが、どうしたら開くのでしょうか?


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


Name: a  ..かけだし(1,044ポイント)   Date: 2009/09/12(土) 22:08   No:39159     
Title: Re:漢字弾幕について    
管理人さんに直接メールで聞かれてはいかがでしょうか

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

Name: Justy  ..伝説なるハッカー(419,934ポイント)   Date: 2009/09/13(日) 01:23   No:39164     
Title: Re:漢字弾幕について    

>このツールを使って生成された.datを
>確認のために再び開きたいのですが、どうしたら開くのでしょうか

 そのデータはテキストでも画像でもないので、開くには 53章のようなデータを
解釈するプログラムを使うか、バイナリエディタで開いて下さい。
 


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,056,522ポイント)   Date: 2009/09/13(日) 08:05   No:39169     
Title: Re:漢字弾幕について    
Justyさんが仰っているバイナリエディタですが、それって何?と思われたら
http://www.zob.ne.jp/~c.mos/soft/bz.html
こんな感じのものを使ってみて下さい。


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



Name: Usuke  ..ぴよぴよ(125ポイント)   Date: 2009/09/12(土) 23:44   No:39162       
Title: typedef 構造体 配列を引数にすることはできますか?    
たとえば
<pre>
typedef struct {
int data0;
int data1
} DATA_ST;

DATA_ST data_st0[5];
DATA_ST data_st1[6];

////func.h(関数宣言)/////-----------------
void Test(DATA_ST data[],hairetusuu){
for(i=0;i<hairetusuu;i++){
data[i]=5;
}
}
////////////////--------------------------

void(data_st0[],5);


このような関数は実行できますか?


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


Name: box  ..ハッカー(144,120ポイント)   Date: 2009/09/13(日) 00:04   No:39163     
Title: Re:typedef 構造体 配列を引数にすることはできますか?    

> void(data_st0[],5);
>
>
> このような関数は実行できますか?

関数呼び出し部分を正しく書けば、できます。

ところで、

> ////func.h(関数宣言)/////-----------------
> void Test(DATA_ST data[],hairetusuu){

これは関数の宣言ではなくて、定義です。
複数のソースファイルからのインクルードがあり得る
ヘッダーファイルに、関数の実体を書くのは好ましくないと思います。



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



Name: けんたろうちゃん  ..入門者(4,567ポイント)   Date: 2009/09/09(水) 11:23   No:39023       
Title: 横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
題名の通り、2D横スクロールアクションゲームの製作について質問させてもらいます。
現在、下記のページを参考にアクションゲームを製作しています。
http://javagame.skr.jp/index.php?%A5%D6%A5%ED%A5%C3%A5%AF%A4%C8%A4%CE%BE%D7%C6%CD
このページで記されているような方法でマップチップとキャラクターの接触判定を行っています。

ここで斜めの坂を導入したいのですが、これを上記のようなマップチップで再現したいのですが、その方法が思いつかない状態です。
坂による斜め移動を考慮して、接地判定を点と線分にするという方法もありますが、できるだけマップチップで表現したいと考えています。(なるべく一括して管理したいので)
どなたか教えてください。


ささいな質問
現在、画面上に存在する敵などのオブジェクトが格納されているlistを管理する(表示したり、消したりする)クラス名を、ObjectFactoryとしていますが、
デザインパターンのファクトリとは厳密には異なるため、名前を変えようとも考えています
この場合、どんな名前がよいでしょうか。参考に教えて欲しいです。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,056,380ポイント)   Date: 2009/09/09(水) 21:12   No:39054     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
リンク先は拝見していませんが、
マップチップにもっと複雑な属性を持たせてみてはどうでしょうか?
「通行可」「通行不可」だけじゃなく、
例えば添付ファイルのような「斜め45度通行不可」みたいな。

1つあれば回転して4種類のブロックになると思います。
傾斜25%のブロックなら4つつなげるとブロック一つ超えられる坂になるなど、色々考えられると思います。

このようにブロック自体に形を持たせ、それを並べてみてはどうでしょう。
こうなってくるとマップチップを並べるツールが必要になってきそうですね。


この方法がいい方法かどうか知りません;


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

Name: sizuma [URL]  ..上級者(15,913ポイント)   Date: 2009/09/09(水) 21:31   No:39055     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
>ささいな質問
EnemyManagerでしょうか。
ぼくは管理するクラスにはよくManagerを使います。
・・・・スペルあってるかな。


あとナナメ移動が入ると、主人公が四角画像だと不自然な動きになりそう。


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

Name: チルチル  ..熟練のプログラマー(50,324ポイント)   Date: 2009/09/09(水) 21:59   No:39057     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
参考になるかわかりませんが
このゲームを知っているでしょうか?
私の知っている唯一の斜めがあるゲームです

http://www.t3.rim.or.jp/~naoto/j_sm2/index.html

後でこちらで質問してみても良いかもしれません

http://www.t3.rim.or.jp/~naoto/naoto.html


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

Name: けんたろうちゃん  ..入門者(4,684ポイント)   Date: 2009/09/10(木) 00:22   No:39065     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
>Dixqさん
問題は「斜め45度通行不可」のマップチップで、うまく斜め移動が再現できないところです・・・
Curse'sSoul(仮名)の動画では斜め坂が出てきましたが、これはやはり点と線分の接触判定で再現してるのでしょうか?

>shizumaさん
〜Managerですね。参考にさせてもらいます。
タスクシステムからとって〜Taskにしようとも考えています。

>ちるちるさん
japaAppletはまったくわかりませんが、いろいろ参考になりそうなページですね。


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

Name: zwi  ..入門者(3,700ポイント)   Date: 2009/09/10(木) 23:25   No:39090     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
>問題は「斜め45度通行不可」のマップチップで、うまく斜め移動が再現できないところです・・・

斜め45度のマップチップ限定なら、上りか下りの2種類しかないのでX座標からY座標は簡単に計算できると思いますが。

計算式は、こんな感じです。
前提として上り坂のマップチップとして、Xは右が数値が大きくなり、Yは上が数値が大きくなる座標系を想定しています。
マップチップ内の相対x = キャラクタ座標のX座標 - マップチップの先端X座標
マップチップ内の相対y = マップチップ内の相対x
キャラクタ座標のY座標 = マップチップの先端Y座標 + マップチップ内の相対y
って具合でキャラクタのY座標が計算できます。

話を勘違いしていたら、ごめんなさい。


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

Name: けんたろうちゃん  ..入門者(4,704ポイント)   Date: 2009/09/11(金) 12:31   No:39107     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
そのやり方でも、うまく接触判定を行うコードが思いつきません・・・
できたら具体的にコードで示してもらえませんでしょうか?


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

Name: zwi  ..入門者(4,126ポイント)   Date: 2009/09/11(金) 18:24   No:39113     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
とりあえずは簡単に答えますが、キャラクタの移動先が斜めななめのマップチップだった場合は、キャラクタブロックの底辺の中央が先ほどの式で計算される座標に移動したと仮定してもらえば良いはずです。
移動先のマップチップが当たり無しならX座標を変えるだけですが、もし上りの斜めマップチップならY座標を加算してやれば斜めを上っている表現になると思います。
アルゴリズムを完全に検証していないので動作保障は出来ませんが、いちどプログラムに組んでみていただけますか?
ジャンプの着地とか、そこら辺りは実際に試して見ないと問題が出てこないです。こちらはソースもデータも無いので検証が出来ませんがご容赦を。



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

Name: けんたろうちゃん  ..入門者(4,761ポイント)   Date: 2009/09/11(金) 19:30   No:39115     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
簡単に述べているようですが、そんなに簡単じゃないような・・・
まず下り坂に乗っているときから歩いて通常の平らの地面に乗るときや、
上がり坂から歩いて平らの地面に上るときや、
複雑に条件式が必要になると思います


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

Name: zwi  ..入門者(4,205ポイント)   Date: 2009/09/11(金) 22:30   No:39123     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
そうですね。最終的にはある程度複雑になると思いますよ。
なので、そこまで分かっているのなら条件を全て書き出してみましょうか。
思いつく限り書き出してみてください。


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

Name: けんたろうちゃん  ..入門者(4,870ポイント)   Date: 2009/09/12(土) 15:32   No:39143     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
無理です
考えて、さまざまな条件を立てて、自分でコードを書いて、それでもできないからここで質問しているのです
そもそもホントにこの考えでできるとは思えなくなってきました
これでできるというのなら、コードで示して欲しいです
・・・
と思ったのですが、点と三角形の当り判定を利用すれば、条件をスマートな感じでまとめられそうです
新しいDXライブラリは球と三角形の接触判定があるので、それを利用してみます


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

Name: けんたろうちゃん  ..入門者(4,897ポイント)   Date: 2009/09/12(土) 20:56   No:39156 解決!     
Title: Re:横スクロールアクションにおいて、斜め坂をマップチップで制御したい    
マップチップによる坂を作成することができました
ありがとうございました。


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



Name: ネオ  ..ぴよぴよ(72ポイント)   Date: 2009/09/12(土) 11:09   No:39134       
Title: 4章    
龍神録4章で、コンパイル結果が

char.cpp 4: 未定義のシンボル ch(関数 calc_c

となってしまうのですが、
どうすればいいでしょうか。

BCCでやってます


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


Name: ネオ  ..ぴよぴよ(91ポイント)   Date: 2009/09/12(土) 11:12   No:39135 解決!     
Title: Re:4章    
すみません

自己解決しました


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



Name: ディア  ..ぴよぴよ(0ポイント)   Date: 2009/09/11(金) 21:14   No:39120       
Title: BCCで    
はじめまして、ディアです。

BCCでソースをコンパイルしたのですが、下記のようなエラーが出てしまいます。

Fatal: オプションが必要 : Lc:\borland\bcc55\Lib;c:\borland\bcc55\Lib\PSDK

基本すぎる質問かもしれませんが、解決法はないでしょうか。


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


Name: box  ..ハッカー(143,352ポイント)   Date: 2009/09/11(金) 21:41   No:39121     
Title: Re:BCCで    
C:\borland\bcc55\bin
に存在すると思われる、

bcc32.cfg
ilink32.cfg

の2つの設定ファイルの中身を見せてください。
その際、メモ帳などのエディタで開いてから、
コピー&ペーストしてください。
正確を期するために、手で書き写すことはお控えください。


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

Name: ディア  ..ぴよぴよ(101ポイント)   Date: 2009/09/12(土) 09:02   No:39132     
Title: Re:BCCで    

・bcc.cfg

-I"c:\borland\bcc55\Include"
-L"c:\borland\bcc55\Lib;c:\borland\bcc55\Lib\PSDK"

・ilink32.cfg

-L"c:\borland\bcc55\Lib;c:\borland\bcc55\Lib\PSDK"


です


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



Name: @  ..ぴよぴよ(325ポイント)   Date: 2009/09/04(金) 17:14   No:38794       
Title: 弾を沢山重ねたらレーザーになる画像    
がほしいのですが何か良い素材、
もしくはその素材があるサイトはないでしょうか?
よろしくお願いします。


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


Name: Justy  ..伝説なるハッカー(412,764ポイント)   Date: 2009/09/05(土) 00:29   No:38816     
Title: Re:弾を沢山重ねたらレーザーになる画像    



>弾を沢山重ねたらレーザーになる画像

 これはつまり、弾としてもレーザーとして使える共通の素材が欲しいということですか?

 んー、そういうサイトの方は知らないですね。

 でもどんなレーザーをイメージしているのかわかりませんが、
よくある(?)重ねる系のレーザーなら少し小さめのシンプルな感じの素材を
引き延ばしたりした上で加算&半透明の組み合わせで大抵レーザーっぽく
なります。

 例えば添付の画像(適当に円描いたやつ)も工夫次第で

http://dixq.net/zip/bbs/Justy/LazerMovie.zip
解凍PASS : nuGszfWM


のように。


※ 1本目は普通に直線、2本目はランダムで色を青系を混ぜた、
3,4本目は動きを変えてみたものです


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

Name: @  ..ぴよぴよ(358ポイント)   Date: 2009/09/05(土) 01:06   No:38821     
Title: Re:弾を沢山重ねたらレーザーになる画像    
>Justyさん
すみません。違います。ちょっとそういった処理は自分にはまだできないので
添付した感じ画像(添付した画像は分かりやすく一つ一つに色を変えてつけてあります)みたいに
弾を連続して出したら重なってレーザーのように見える画像がほしい
ということをさきほど言ったのですが・・ないでしょうか?


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

Name: チルチル  ..熟練のプログラマー(47,875ポイント)   Date: 2009/09/05(土) 01:19   No:38823     
Title: Re:弾を沢山重ねたらレーザーになる画像    
龍神録で言うとこれなんかどうでしょうか?
中が強い白系か黒系だと繋がりやすいようです
まあ加算ブレンドぐらいはした方が良いですが
この画像は引き伸ばした方が綺麗ですけどね


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

Name: Justy  ..伝説なるハッカー(415,007ポイント)   Date: 2009/09/05(土) 02:17   No:38829     
Title: Re:弾を沢山重ねたらレーザーになる画像    

>弾を連続して出したら重なってレーザー

 んーと、やっぱりさっきの画像ですが、こんなかんじのものでしょうか?

 これは、さっきの画像を5:2の割合で横長に引き延ばし、
多数の弾の開始地点と色をランダムで微妙にずらして、横に飛ばしながら
加算&半透明で表示したものです。


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

Name: そうは問屋の最終兵器  ..ぴよぴよ(12ポイント)   Date: 2009/09/05(土) 19:33   No:38873     
Title: Re:弾を沢山重ねたらレーザーになる画像    
単一の画像ではないですが、私はこんな感じで描画しています。

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

Name: そうは問屋の最終兵器  ..ぴよぴよ(57ポイント)   Date: 2009/09/05(土) 19:38   No:38874     
Title: Re:弾を沢山重ねたらレーザーになる画像    
いくつか並べて、とりあえず撃ってみるとこんな感じ。
画像のようにへにょらせるのも結構簡単。
参考になれば幸いです。


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

Name:  ..かけだし(1,170ポイント)   Date: 2009/09/06(日) 00:53   No:38880     
Title: Re:弾を沢山重ねたらレーザーになる画像    
>そうは問屋の最終兵器さん
ちなみに一つのレーザーにつき、何カウント間隔で、何個並べているのでしょうか?
参考までに教えてください。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,051,813ポイント)   Date: 2009/09/06(日) 03:42   No:38888     
Title: Re:弾を沢山重ねたらレーザーになる画像    
>>Justyさん

おぉぉ・・・すごくて感動しました、さすがJustyさん^^
出来れば・・可能ならばサンプルプログラミングの館に置いていただきたい・・w

工夫次第でどうにでもなるものですねぇ。
これは単にDrawModiGraphを使ったりして引き延ばして加算してるだけですか?
ウネウネはsin?

後、あの動画、消えてしまうのが勿体ないのですが・・、
こちらのサーバーにうつして、こちらからリンクを張らせていただいてもいいでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,051,821ポイント)   Date: 2009/09/06(日) 03:46   No:38889     
Title: Re:弾を沢山重ねたらレーザーになる画像    
>@さん

過去ログでよく見かけますが、大抵の弾なら引き延ばせばレーザーに見えるようです。
東方でいえば米粒弾とか。
レーザーとしての画像が作りたければ以前作り方を紹介した動画作ったのでよければご覧ください。
http://www.nicovideo.jp/watch/sm6055308

案外簡単に作れるので、下手に素材を探すより作ったほうが効率的ですよ。


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

Name: @  ..ぴよぴよ(331ポイント)   Date: 2009/09/06(日) 04:03   No:38893     
Title: Re:弾を沢山重ねたらレーザーになる画像    
>Dixqさん
ニコニコ動画は見たらハマると友人から聞いたのでアカウントをとってません。
だから見れないです・・


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,052,220ポイント)   Date: 2009/09/06(日) 04:06   No:38895     
Title: Re:弾を沢山重ねたらレーザーになる画像    
そうでしたか^^;
まぁ必要な動画を見るだけならどうということは無いと思いますが;

そうですね〜とりあえずレーザーは米粒弾を引き延ばせば作れるようですよ。


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

Name: Justy  ..伝説なるハッカー(418,016ポイント)   Date: 2009/09/06(日) 17:00   No:38935     
Title: Re:弾を沢山重ねたらレーザーになる画像    

>工夫次第でどうにでもなるものですねぇ。

 そうですね。
 パーティクル系のエフェクトなので、面白いことに結構適当なテクスチャでも
どうとでもなるんですよね。

 あの円テクスチャ1枚で、炎系・煙系などもいろいろ表現できますので、
円の周囲のぼかし具合とかを調整した数種類があれば汎用的に使えます。



>これは単にDrawModiGraphを使ったりして引き延ばして加算してるだけですか?
>ウネウネはsin?

 見ての通り軌跡を繋げているので、結果的に長く引き延ばしたもの
(比率的には1:100〜200以上)を透明度を上げてランダムで微妙に
色合いと開始位置を変えて加算で何十と表示しています。
(開始位置のずれが“揺らぎ”になってるわけですね)

 で、DrawModiGraphではないです。そもそも DirectXなので……。
 でも、DXライブラリでもポリゴン関数はあるんで、やってやれなくはないと思います。

 動きは読み通り sin/cos系です。行列計算の中で回転するときに使っています。



>こちらのサーバーにうつして、こちらからリンクを張らせていただいてもいいでしょうか?

 それは構いません。
 よろしくお願いします。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,052,995ポイント)   Date: 2009/09/06(日) 20:02   No:38950     
Title: Re:弾を沢山重ねたらレーザーになる画像    
DXライブラリで出来ないかやってみました。

http://dixq.net/zip/bbs/Lazer.zip

う〜ん、ちょっと違いますかね・・。
Justyさんのようなキラっと光る感じが出ません・・。
後、いい意味でのムラが出ません。
単純に円を拡大しているので、ウネウネの時のように中間が透けたりしないし・・。

>炎系・煙系などもいろいろ表現できますので、

ろうそくならこれを上向きにゆらゆらさせたらよさそうですが、「爆発」ってどうやるんでしょう^^;


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,053,395ポイント)   Date: 2009/09/06(日) 20:49   No:38952     
Title: Re:弾を沢山重ねたらレーザーになる画像    
>パーティクル系のエフェクト

この言葉は最近DXライブラリの質問掲示板でsyさんが仰っているのをお見かけしました。
エフェクトは作ると色々出来るものですね。
IWさん、かたぱるとさんのご意見を参考に作ったものですが、
やっつけでこんな物作ってみました。

これは、ロマサガのロゴの出方がかっこよくて


(最初の9秒位)

何とかDXライブラリでできないかな〜と思って作ったものです。
http://dixq.net/zip/bbs/LogoEffect.zip
座標データ的なものは、龍神録プログラミングの館の漢字弾幕データ生成ツールで作りました。
・・・って段々脱線してすみません^^;


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

Name: そうは問屋の最終兵器  ..ぴよぴよ(135ポイント)   Date: 2009/09/06(日) 21:58   No:38957     
Title: Re:弾を沢山重ねたらレーザーになる画像    
二番目の画像の弾幕だと、

x方向に速さ 2.5*cos(弾の角度)
y方向に速さ 2.5*sin(弾の角度)

で動かして、
4カウント毎に、計10発(36方向なので合計360発)撃ってます。
速さが変わると発射の間隔を手動で設定し直さなければならないので結構面倒だったりします。


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

Name: Justy  ..伝説なるハッカー(418,536ポイント)   Date: 2009/09/06(日) 22:00   No:38959     
Title: Re:弾を沢山重ねたらレーザーになる画像    
 結構脱線気味なので、ほどほどにしないとと思いつつも
いや、もう実にお見事としか言いようがありません!



>Justyさんのようなキラっと光る感じが出ません・

 もう十分私のは越えていますよ。
 輪郭もすごく綺麗です。

 あとはそのときの状況に合わせて、レーザーの周囲を補強するエフェクトだったり
光源だったりと足していけば完璧です。




>ロゴ

 いいですね、とても綺麗です。
 データに依存した形式になっているところが再利用性が
あってすばらしいです。



>爆発

 レーザーもそうなのでうが、どういう爆発なのかでも全然変わってくるのですが、
テクスチャ1つで出来るのは小爆発くらいですね。

 よくある爆発だと幾つかの種類のパーティクル&パターンアニメの組み合わせが
必要になってきます。

 例えば、

・ 爆発の絵
 寿命短めなパーティクルで、16〜25コマくらいの発生から収束までのパターンアニメ。
 加算して白く飛ばし、いくつも断続的に出す

・ 黒煙
 爆発よりは長めな寿命を持つパーティクル、16〜25コマくらいの発生から収束までのパターンアニメ。
 絵としては爆発と同じでもいいかも。

・ 白い爆発と黒煙の中間的な爆発
 寿命短めなパーティクル。

・ インパクト時の輪っか
 よくある輪っか。

・ 破片
 パーティクル。ものによっては軌跡を持った破片もいいかも。
 
・ 赤系のグロウ
 インパクトの瞬間のものと、燃えている間周囲を赤く染めるような揺らぎを持たせた
加算テクスチャ。
 
と、これくらい入れると“らしく”見えるかな、と思います。


 あ、それから sin/cosを使っていたのは動画の3番目と4番目の方です。
 1番目と2番目の方は実は開始地点が微妙にずれているだけで、
完全な直進で、揺らいでいるように見えるのは1つ1つが高速で移動している為、
そういう動きに見えているだけです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,054,309ポイント)   Date: 2009/09/09(水) 20:25   No:39041     
Title: Re:弾を沢山重ねたらレーザーになる画像    
いえいえ、全く見事などと言って頂けるような出来ではありませんが・・^^;
Justyさんにそう言って頂けると光栄です^^

>レーザーの周囲を補強するエフェクトだったり

あぁなるほど、そうするとハッキリしそうですね。
じゃぁ龍神録2のレーザーはこれでいってみるか・・(単純)

>爆発

あれから色々弄って見ましたが、工夫次第で結構色んな事が出来そうですね。
良いエフェクトがもし出来たらサンプルプログラミングの館にでもアップして見たいと思います^^

あ、Justyさんも何か新作出来ましたら載せさせて下さいw

>sin/cosを使っていたのは動画の3番目と4番目の方です。 1番目と2番目の方は実は開始地点が微妙にずれているだけで、
>完全な直進で、揺らいでいるように見えるのは1つ1つが高速で移動している為、そういう動きに見えているだけです。

なるほど、そのようですね。
私の画像は横に引き伸ばしてるので、発射地点を変えると発射地点のグラフィックが薄くなってしまったので、
ちょっと角度を変えることでムラを出しました。
レーザーの発射地点は何か別の画像で発射元であることを演出してもいいかもしれませんね。


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

Name: Justy  ..伝説なるハッカー(419,813ポイント)   Date: 2009/09/10(木) 02:04   No:39069     
Title: Re:弾を沢山重ねたらレーザーになる画像    

>Justyさんも何か新作出来ましたら載せさせて下さいw

 では、そのうち何か作ってみます。



>発射地点を変えると発射地点のグラフィックが薄くなってしまったので
>レーザーの発射地点は何か別の画像で発射元であることを演出してもいいかもしれませんね

 そうですね。
 発射地点は発射口のモデルがあるならその中に入れてしまえばうまい具合に隠れると思いますが、
発射元に別のエフェクトをおくのもいいですね。


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

Name:  ..かけだし(2,341ポイント)   Date: 2009/09/11(金) 02:20   No:39100     
Title: Re:弾を沢山重ねたらレーザーになる画像    

あの、特定の弾だけに
加算ブレンドをするっていうのはどうしたらよいのでしょうか?

//弾丸の描画
void graph_bullet(){
int i,j,eff;
double disp_angle;
SetDrawMode( DX_DRAWMODE_BILINEAR ) ;//線形補完描画
for(i=0;i<SHOT_MAX;i++){//敵の弾幕数分ループ
if(shot[i].flag>0){//弾幕データがオンなら
for(j=0;j<SHOT_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
if(shot[i].bullet[j].flag!=0){//弾データがオンなら
if(shot[i].bullet[j].eff==1)
SetDrawBlendMode( DX_BLENDMODE_ADD, 255) ;
if(bullet_info[shot[i].bullet[j].knd].kaiten==1)
disp_angle=PI2*(shot[i].bullet[j].cnt%120)/120;
else
disp_angle=shot[i].bullet[j].angle+PI/2;

DrawRotaGraphFdF(
shot[i].bullet[j].x, shot[i].bullet[j].y,
1.0, disp_angle,
img_bullet[shot[i].bullet[j].knd][shot[i].bullet[j].col],TRUE);

if(shot[i].bullet[j].eff==1)
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
}
}
}
}
boss_assist_img();
//ボス
if(boss_shot.flag>0){//弾幕データがオンなら
for(j=0;j<BOSS_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
if(boss_shot.bullet[j].flag!=0){//弾データがオンなら
eff=0;
if(boss_shot.bullet[j].kaiten==1)
disp_angle=PI2*(boss_shot.bullet[j].cnt%120)/120;
else
disp_angle=boss_shot.bullet[j].angle+PI/2;
if(boss_shot.bullet[j].eff_detail==1){//風雨にも負けず用弾エフェクト
SetDrawBlendMode( DX_BLENDMODE_ADD, 100+GetRand(155)),eff=1 ;
DrawRotaGraphFdF(
boss_shot.bullet[j].x, boss_shot.bullet[j].y,
1.3, disp_angle,
img_bullet[boss_shot.bullet[j].knd][boss_shot.bullet[j].col],TRUE);
}
if(boss_shot.bullet[j].eff==1)
SetDrawBlendMode( DX_BLENDMODE_ADD, 255),eff=1 ;
if(boss_shot.bullet[j].eff==2)
SetDrawBlendMode( DX_BLENDMODE_ADD, 255+GetRand(100)),eff=1 ;
DrawRotaGraphFdF(
boss_shot.bullet[j].x, boss_shot.bullet[j].y,
1.0, disp_angle,
img_bullet[boss_shot.bullet[j].knd][boss_shot.bullet[j].col],TRUE);
if(eff==1)
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
}
}
for(j=0;j<BOSS_ASSIST_MAX;j++){//その弾幕が持つ弾の最大数分ループ
if(boss_shot.assist[j].flag!=0){//弾データがオンなら
if(boss_shot.assist[j].eff==1)
SetDrawBlendMode( DX_BLENDMODE_ADD, 255) ;
if(boss_shot.assist[j].kaiten==1)
disp_angle=PI2*(boss_shot.assist[j].cnt%120)/120;
else
disp_angle=boss_shot.assist[j].angle+PI/2;
DrawRotaGraphF(
boss_shot.assist[j].x+FX+dn.x, boss_shot.assist[j].y+FY+dn.y,
1.0, disp_angle,
img_bullet[boss_shot.assist[j].knd][boss_shot.assist[j].col],TRUE);
if(boss_shot.assist[j].eff==1)
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
}
}
}
SetDrawMode(DX_DRAWMODE_NEAREST);//描画形式を戻す
}


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

Name: Justy  ..伝説なるハッカー(419,758ポイント)   Date: 2009/09/12(土) 01:51   No:39128     
Title: Re:弾を沢山重ねたらレーザーになる画像    

>特定の弾だけに
>加算ブレンドをするっていうのはどうしたらよいのでしょうか?

 その特定の弾とやらの メンバ effを 1にすればいいように見えます。


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



Name: コンパクレイム  ..ぴよぴよ(279ポイント)   Date: 2009/09/11(金) 20:35   No:39116       
Title: キャラをゲームパッドのスティックで動かすプログラムについて    
いつもプログラミングの勉強をさせてもらっています。
龍神録でゲームパッドの方向キーだけでなく
左スティックでも上下左右斜めが操作できるようにするにはどうすればいいでしょうか。

私は添付した画像ようなLogicool製のゲームパッドを持っているのですが
このパッドの左側のアナログスティックでもキャラクターが移動できるようにしたいと考えています。

このコントローラーのボタンは
コントローラ入出力機能 : ボタン12個(1/2/3/4/5/6/7/8/9/10 左スティック(11) 右スティック(12)
となっているのですが、左スティックの値の11と1つだけなので
8方向移動させるためにはどう対応させればいいのかわかりませんでした…。

環境はWindowsXPでコンパイラはVC++ 2008EEです。
ライブラリはDXライブラリを使っています。
C言語の知識はキーコンフィグのところまではだいたい把握している感じです。
どうかよろしくお願いいたします。


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


Name: yu  ..プログラマー(38,284ポイント)   Date: 2009/09/11(金) 20:59   No:39118     
Title: Re:キャラをゲームパッドのスティックで動かすプログラムについて    
GetJoypadAnalogInput関数でアナログスティックの座標を所得して
ある一定値(パッドの遊び)を越えたら入力されたとする。
こんな感じでできると思います


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



Name: 朝見草  ..ぴよぴよ(20ポイント)   Date: 2009/09/06(日) 21:47   No:38955       
Title: 質問です    
どうもはじめまして、朝見草と申すものです。
プログラミングを勉強し、いつかゲームをつくって公開したいと思っております。
しかし自分はこの世界に関しては全くといって良いほど知識が無いのでまずどの言語を学べば良いのか見当がつきません。一応ネットなどで調べまして、「C#」か「なでしこ」がいいかなと思っておりますが、もし初心者が比較的容易に習得でき、上達した後も末永く使っていけるようなプログラム言語があるようでしたらお教え頂けると幸いです。


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


Name: T.C.D  ..かけだし(1,363ポイント)   Date: 2009/09/06(日) 21:54   No:38956     
Title: Re:質問です    
個人的な見識ですが、やはりはじめはC言語で練習するのがいいと思います。

>「C#」か「なでしこ」がいいかなと思っておりますが

そのためにはまずC言語の感覚をつかんでから、自分に合うそれらの言語に移るのがいいかな、と思います。


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

Name: MNS  ..上級者(15,090ポイント)   Date: 2009/09/06(日) 21:58   No:38958     
Title: Re:質問です    
プログラミングというものを習得したいのならば、
なでしこでも良いと思います。すぐ習得できます。
しかし、なでしこでは他の言語にあまり応用が利かないかもしれません。
そういった点では、JavaやC#などもオススメできます。
最近では、Pythonというプログラミング言語も注目されています。
この言語は初心者にも扱いやすく、作法も身につくのでオススメです。

また、とにかくゲームが作りたいのであれば、
やはりC言語をオススメします。
正直、CやC++以外でゲーム開発は初心者には中々難しいでしょう。
DXライブラリを使えば簡単に開発できますので、
個人的には、
PythonかC & DxLibをオススメします。


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

Name: 朝見草  ..ぴよぴよ(109ポイント)   Date: 2009/09/08(火) 21:56   No:39007     
Title: Re:質問です    
うーんなるほど、みなさん親切なご回答有難うございます。
それでは若干質問がズレますが、皆さんが初めてプログラミングを勉強しはじめた時の言語は何でしたか?一応の参考にしたいと思いますので差し支えなければお答え頂けると有難いです。


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

Name: sizuma [URL]  ..上級者(15,813ポイント)   Date: 2009/09/08(火) 22:22   No:39011     
Title: Re:質問です    
>初めてプログラミングを勉強しはじめた時の言語
一年ほど前。C#、XNAでした。
現在はActionScriptいじってみたいなと思ってます。

ゲームを作るだけであれば僕もC・DXライブラリが一番入りやすいんじゃないかなと思います。


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

Name: バグ  ..ハッカー(169,988ポイント)   Date: 2009/09/09(水) 09:48   No:39021     
Title: Re:質問です    
今は、昔のBASIC(VBではありません)のように敷居の低いプログラム言語が少ないですからねぇ…(^_^;)

何の予備知識も無しに勉強を始めるならば、VBやC#なんかは比較的分かりやすいかもしれませんね。


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

Name: あ〜る  ..中級者(11,658ポイント)   Date: 2009/09/09(水) 12:23   No:39024     
Title: Re:質問です    
僕は最初HSPを使ってました。
すごく簡単なんで、ゲームを作りたいならまずあれからやってみるのもいいかも知れないです
で、慣れたらCやらなんやらをやってみたり、HSPでもそれなりに本格的なゲームを作れるそうなんで、そのまま使い続けてもいいかもしれません
僕はHSP→(JAVA)→C++って順番で勉強しました(JAVAはかじった程度ですが(^^;))


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

Name: ねこ  ..プログラマー(39,307ポイント)   Date: 2009/09/09(水) 12:46   No:39025     
Title: Re:質問です    
最初はFLASHの言語ActionScriptでした。
1.0⇒2.0⇒3.0と来て、ソースが段々CっぽくなってきたのでCに移行しました。
言語的には仕事の絡みVB, VBA, ASP, Java, perl, JavaScriptと様々です。

WEB上での簡単なゲームなら2.0あたりでやるとさくっと作れるかもしれません。
今はFDとか便利なコードエディタも充実してますしねぇ。


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

Name: mnkr  ..ぴよぴよ(897ポイント)   Date: 2009/09/09(水) 14:09   No:39030     
Title: Re:質問です    
わたしは最初は学校でアルゴリズムを習いました。
プログラム全体の流れの勉強です。
言語うんぬんではなく、流れの勉強です。
人で例えると、
朝起きる → 朝ご飯を食べる → 着替える → 出勤
というような感じでしょうか。。。

それからCOBOLという銀行系でよく使われる言語を勉強し、
それからC言語、Javaでした。
COBOLは簡単ですが、一般的でありませんのでオススメしません。
C言語はよく使われるので勉強するのには向いているかもしれませんが、
ポインタという機能が難しいかもしれません。
JavaはC言語と似ているので、C言語を勉強しているととっつきやすいです。

VisualBasicは簡単ですし、名前にあるとおり「Visual」(絵)のある、動きのあるものがすぐ作れますので
プログラムをしていて楽しいと思います。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,055,657ポイント)   Date: 2009/09/09(水) 20:57   No:39050     
Title: Re:質問です    
まず最初にCを勉強しておいて間違いはないですよ^^;
他の言語特にマイナーな言語を勉強して「しまった・・」と思うことがあったとしても、
Cを勉強して後悔する事はまず無いかと。
簡単だからといって手を出すよりメジャーで利用価値の高いものがいいかと思います。

例えば今何でもいいから外国語を勉強しようとしている2人がいるとします。

一人目A君は、中国の山奥の数百人しか使っていないマイナーなある言語がすごく簡単だと聞いてそれを勉強したとします。
二人目B君は、世界で最もメジャーである共通の言語、英語を勉強したとします。

大学を卒業して世の中に出てさて役立つのはどちら・・?
と聞かれたらどうでしょう。

ただ初歩的な言語で味見してみるとかもいいと思いますし、
色んな言語を知るということは大事だと思いますし、参考程度に聞いておいて頂ければと思います。


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

Name: 朝見草  ..ぴよぴよ(250ポイント)   Date: 2009/09/11(金) 20:55   No:39117 解決!     
Title: Re:質問です    
さっきブラウザ開いてびっくりしました。まさかこんなに返答頂けるとは……恐れ入ります……
数々の助言を参考にして再度考慮した結果、C#で行こうと思いました。これからコツコツ暇を見つけて取り組んでいきたいと思います。
皆さんご親切な回答有難うございました。また何か壁にぶつかったら訪れたいと思います。


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



Name: binoruto  ..かけだし(2,469ポイント)   Date: 2009/09/11(金) 16:05   No:39109       
Title: char配列で作成したデータとchar *の比較    
binorutoと申します。

[1] 質問文
 [1.1] 自分が今行いたい事は何か
    ⇒C++のソースからCの関数を呼び出しその中でC++上で定義したchar配列をつかっております。

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
⇒例として↓のようなコードを用意しました。
C++


main(){
char dev[6];
memset(dev,'\0',6);
snprintf (dev, 6,"%s\0","video");
test(dev);
}




C関数
    

void test(char *dev)
{
printf("%s",dev);
if(dev == "video")
{
printf("%s\n","Success");
}
else
{
printf("%s\n","Error");
}
}

 [1.4] 今何がわからないのか、知りたいのか
    ⇒これ実行すると出力結果
     videoError     となるんですが

     videoSuccessにしたいときどうしたらよいでしょうか。

[2] 環境  
 [2.1] OS : Linux
 [2.2] コンパイラ名 : gcc4.1.2



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


Name: b  ..かけだし(1,504ポイント)   Date: 2009/09/11(金) 16:20   No:39110     
Title: Re:char配列で作成したデータとchar *の比較    
test関数の
if(dev == "video")を
if(strcmp(dev,"video")==0)
にすればよいかと。


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

Name: binoruto  ..かけだし(2,456ポイント)   Date: 2009/09/11(金) 16:26   No:39111 解決!     
Title: Re:char配列で作成したデータとchar *の比較    
返信ありがとうございました。

> if(strcmp(dev,"video")==0)

で解決しました。



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

Name: non  ..熟練のプログラマー(62,049ポイント)   Date: 2009/09/11(金) 18:06   No:39112     
Title: Re:char配列で作成したデータとchar *の比較    
>snprintf (dev, 6,"%s\0","video");
\0はいらないです。たぶん、終端に\0が自動的に追加されたはず。
文字数をオーバーしたときには、コンパイラによって振る舞いが違ってたかもしれないけど。
今回は6文字限定なので。



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

Name: binoruto  ..入門者(2,503ポイント)   Date: 2009/09/11(金) 18:29   No:39114 解決!     
Title: Re:char配列で作成したデータとchar *の比較    
> >snprintf (dev, 6,"%s\0","video");
> \0はいらないです。たぶん、終端に\0が自動的に追加されたはず。

返信ありがとうございます。
わかりました。snprintfについて調査して対応します。

以上です。



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



Name: ほのか  ..初心者(5,310ポイント)   Date: 2009/09/04(金) 17:32   No:38795       
Title: ボスがアイテムを落とす方法    
龍神録の50章をいじらせて楽しく遊ばしてもらっているのですけど
ボスが各弾幕が終了するごとにアイテムを指定して落とす方法が
分からなくて困ってます。どうしたらボスがアイテムを放出するようになるのか
誰か教えてください。アドバイスお願いします><


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


Name: zwi  ..入門者(2,814ポイント)   Date: 2009/09/04(金) 18:52   No:38797     
Title: Re:ボスがアイテムを落とす方法    
ボス専用のitem_nを用意して弾幕終了毎に
enter_item(boss.x, boss.y, item_n_boss, 6);
とすれば良いかと思います。
ただし、毎回アイテム変えたいなら、item_n_bossにも工夫が必要ですか。


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

Name: ほのか  ..初心者(5,359ポイント)   Date: 2009/09/05(土) 01:15   No:38822     
Title: Re:ボスがアイテムを落とす方法    
毎回アイテムを変えたいのですが、
雑魚敵みたいに、エクセルとかでは処理は出来ないのでしょうか?
出来るとしたらどうしたら良いでしょうか?


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

Name: TKOZ  ..プログラマー(31,143ポイント)   Date: 2009/09/11(金) 02:23   No:39101     
Title: Re:ボスがアイテムを落とす方法    
面倒な処理になると思いますよ

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

Name: zwi  ..入門者(3,945ポイント)   Date: 2009/09/11(金) 12:13   No:39104     
Title: Re:ボスがアイテムを落とす方法    
すいません、見逃してました。
私も龍神録の全容を把握しているわけではないのですが、雑魚キャラのitem_nと似たような処理をすればよいだけです。まず、雑魚キャラのitem_nの動作を追っかけてみてください。その上で分からない所があれば聞いてくださいね。それとボス専用のアイテムだけのcsvも用意しましょう。


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



Name: たか  ..初心者(8,481ポイント)   Date: 2009/09/06(日) 04:00   No:38891       
Title: ハイスコアを龍神録に実装    

これを使ってうまく龍神録の50章にハイスコアを作成してみたいのですが、
どのようにしたら良いでしょうか?load.cppにうまく繋げたいです。
具体的なやり方を教えてください。

#include "DxLib.h"



typedef struct{//セーブデータの構造体

char i;//スコアとかクリアしたかを記録する変数、必要な時に増やす

} score_t;



char *name = "score.dat";
FILE *fp;
score_t score;//セーブデータ



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

score.i=0;//デフォルト値を代入

fp = fopen( name, "a" );//ファイルがなければ新規作成
fclose( fp );

fp = fopen( name, "rb" );
fread( &score, sizeof(score_t), 1, fp );//データのロード
fclose( fp );

//DxLib_Initの前に呼ぶのがコツ、ウィンドウの初期状態とかに使える
//新規作成した場合は中身が空なので規定の動作を行わず
//デフォルト値を上書きしない事を期待しているが
//一応ファイルの有無で分岐した方が良いかも

ChangeWindowMode(TRUE);if(DxLib_Init() == -1) return -1;//初期化



DrawFormatString(0,0,GetColor(255,255,255),"前回の値 %d",score.i);

DrawString( 0 , 16 , "数値を入力してください" , GetColor( 255 , 255 , 255 ) ) ;

//score.i=KeyInputNumber( 0 , 32 , 1000 , 0 , FALSE ) ;
score.i=KeyInputNumber( 0 , 32 , 100 , 0 , FALSE ) ;



fp = fopen( name, "wb" );
fwrite( &score, sizeof(score_t), 1, fp );//データのセーブ
fclose( fp );

//実際は終了直前にセーブすると×を押された時とかにセーブできないので
//フェードインの関数内で場面変化のたびにセーブしています

DxLib_End();
return 0;

}


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,052,786ポイント)   Date: 2009/09/06(日) 04:27   No:38899     
Title: Re:ハイスコアを龍神録に実装    
このプログラムをみるとコンフィグに関するファイルもスコアに関するファイルも同じファイルのように感じられますが、そうなのでしょうか?
同じでも出来ると思いますが、別にしたほうが楽ではないでしょうか?
コンフィグだと注釈にも書かれている通り、初期化の前に読み込んだほうがいいかもしれませんね。

しかしスコアなどはload.cppなど、後からでも大丈夫だと思いますし、
読み込む必要が無い時には呼ばない方がいいと思います。



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

Name: たか  ..初心者(8,498ポイント)   Date: 2009/09/11(金) 02:25   No:39102     
Title: Re:ハイスコアを龍神録に実装    
え?loadのときの読み込む方法ってどうやるんでしょうか?

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



Name: しっぽ  ..中級者(10,922ポイント)   Date: 2009/09/09(水) 15:10   No:39032       
Title: area.bgm.flag==4の場合を教えてください    

48章にて、ボスを倒したらボスのBGMを止める処理を色々試してみたのですが
うまく行きません・・どうしたら止まりますか?

void bgm_main(){
if(area.bgm.flag==0){//最初に読み込む
load_bgm(0);
SetLoopPosSoundMem( area.bgm.loop_pos[0], area.bgm.handle );//ループ位置セット
area.bgm.flag=1;
}
if(area.bgm.flag==1){//種類に応じて再生をはじめる
switch(area.bgm.knd[0]){
case 0://再生種類0なら
if(stage_count==60){//はじまって60カウント後に再生
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
area.bgm.flag=2;
}
break;
default:
break;
}
}
if(area.bgm.flag==2){//ボス出現時に読み込む
if(stage_count==boss.appear_count[1]){//ラスボスが現れたら読み込む
StopSoundMem(area.bgm.handle);
delete_bgm();
load_bgm(1);
SetLoopPosSoundMem( area.bgm.loop_pos[1], area.bgm.handle );//ループ位置セット
area.bgm.flag=3;
}
}
if(area.bgm.flag==3){
switch(area.bgm.knd[0]){
case 0://再生種類0なら
if(stage_count==boss.appear_count[1]){//ラスボスが現れたら再生
PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP);
area.bgm.flag=4;
}
break;
default:
break;
}
}
if(area.bgm.flag==4){

}
}



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


Name: さめ  ..ぴよぴよ(25ポイント)   Date: 2009/09/09(水) 20:44   No:39047     
Title: Re:area.bgm.flag==4の場合を教えてください    
area.bgm.flag==4この部分ってことでしょうか?

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,055,324ポイント)   Date: 2009/09/09(水) 20:50   No:39049     
Title: Re:area.bgm.flag==4の場合を教えてください    
==4
のとこにとめる処理を書いたらいいのではないでしょうか・・?

今再生中かチェックし、再生中ならとめればいいと思います。

再生中かどうかチェックする関数、再生をとめる関数についてはこちらをご覧下さい。
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_sound.html#R8N6


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

Name: しっぽ  ..中級者(10,945ポイント)   Date: 2009/09/11(金) 02:17   No:39099     
Title: Re:area.bgm.flag==4の場合を教えてください    
ちょっとお聞きしたいのですが、
ボス(中ボス)が死んだときのフラグみたいなものって
龍神録ではどの関数がそれに該当するのでしょうか?


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



Name:  ..ぴよぴよ(45ポイント)   Date: 2009/09/10(木) 11:25   No:39076       
Title: 龍神録のスクロールについて    

お聞きしたいのですが、2Dスクロール時、
ボスが登場したら、一瞬スクロール部分が元の最初の位置に戻るバグが発生します。(スペルカード時じゃないとき)
ボスが登場しても、そのまんまスクロールさせたいのですが原因が分からなくて困ってます。
何が原因なのでしょうか?
ちなみに60章を使ってます。

#include "../include/GV.h"

extern int DrawGraphFd( int xd, int yd, int GrHandle, int TransFlag);

void graph_back00(){//通常背景
SetDrawArea( 32 , 16 , 416 , 464 ) ;//描画可能エリアを設定
DrawGraphFd(0,count%700-700,img_back[0],FALSE);
DrawGraphFd(0,count%700 ,img_back[0],FALSE);
SetDrawArea( 0, 0, 640, 480);//エリアを戻す
}

void graph_back01(){//スペルカード用背景
SetDrawArea( 32 , 16 , 416 , 464 ) ;//描画可能エリアを設定

DrawGraphFd(0,-count%480,img_back[11],FALSE);
DrawGraphFd(0,-count%480+480,img_back[11],FALSE);
DrawGraphFd(0,0,img_back[10],TRUE);

SetDrawArea( 0, 0, 640, 480);//エリアを戻す
}

void graph_back_main(){
//ボスがオンで、スペルカードなら
if(boss.flag==1 && boss.back_knd[boss.knd]==1)
graph_back01();
else//それ以外
// Main3Dbackground();//(60)
graph_back00();
}


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


Name: yu  ..プログラマー(38,233ポイント)   Date: 2009/09/10(木) 21:08   No:39083     
Title: Re:龍神録のスクロールについて    
自分の所で60章を起動してみましたが確認できませんでした
その他にも自分で変更した箇所はありますか?


>> ボスが登場したら、一瞬スクロール部分が元の最初の位置に戻るバグが発生します。

どこかで count の値が変わってしまっているのだと思います
変更した他のソースファイル(特にboss_shot.cpp)を見せてくださったら原因が分かるかもしれません


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

Name:  ..ぴよぴよ(44ポイント)   Date: 2009/09/11(金) 02:10   No:39097 解決!     
Title: Re:龍神録のスクロールについて    
>yuさん
count!?
と思って調べてみたところ
void enter_bossのときに
count=0;
を行っていたのが原因でした。
おかげさまで無事、直りました。yuさんありがとう


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



Name:  ..初心者(6,481ポイント)   Date: 2009/09/09(水) 23:07   No:39062       
Title: VC.netでRedo機能の追加    
http://www.play21.jp/board/formz.cgi?action=res&resno=38121&page=&lognum=117&id=dixq&rln=38165
上記に以前、投稿し助けていただきました。
その節はありがとうございまいした。

今回はその続きの質問となります。

if (this->m_redoStack.Count > 0)と書いているのに起動してからすぐに
Ctrl+ZをやるとUndoのスタックがEmptyとエラーが出てしまいます。
またUndo、Redo時にカーソルの位置が0番目になってしまうのですが前回の位置にと直せないでしょうか?

// カーソル操作
this->TextBox1.Focus()
this->TextBox1.Select(番目, 0)

でできるとわかったのですがどこに移動させればいいのかということと
このソースで作ったテキストボックスだと強制的に0番目にカーソルがあってしまいます。

どのようにすれば直せるでしょうか。
お忙しいかとは思いますがアドバイスを頂けますと助かります。



#pragma once

public ref class UndoTextBox : public System::Windows::Forms::TextBox
{
private:
System::Collections::Generic::Stack<System::String^> m_redoStack;
System::Collections::Generic::Stack<System::String^> m_undoStack;
bool m_change;

public:
UndoTextBox(void)
{
InitializeComponent();

// メンバの初期化
init();
}

UndoTextBox(System::ComponentModel::IContainer ^container)
{
container->Add(this);
InitializeComponent();

// メンバの初期化
init();
}

protected:
~UndoTextBox()
{
if (components)
{
delete components;
}
}

virtual void OnTextChanged(System::EventArgs^ e) override
{
// フラグがtrueの場合は…
if (this->m_change == true)
{
// UNDOかREDOによってTEXTが変化したので、フラグをfalseにするだけで何もしない
this->m_change = false;
}
else
{
// REDO用Stackの中身を削除する
this->m_redoStack.Clear();

// UNDO用Stackへ最新のTEXTを挿入する
this->m_undoStack.Push(this->Text);
}
TextBox::OnTextChanged(e);
}

virtual void OnKeyDown(System::Windows::Forms::KeyEventArgs^ e) override
{
if (e->Control == true)
{
switch (e->KeyCode)
{
case System::Windows::Forms::Keys::A:
// 全選択
SelectAll();
return;
case System::Windows::Forms::Keys::Z:
// UNDO処理
undo();
return;
case System::Windows::Forms::Keys::Y:
// REDO処理
redo();
return;
}
}
TextBox::OnKeyDown(e);
}

private:
/// <sammary>
/// メンバの初期化
/// <sammary>
void init(void)
{
// Stackの中身を削除する
this->m_redoStack.Clear();
this->m_undoStack.Clear();

// UNDO用Stackの最初の要素として、空文字を挿入しておく
this->m_undoStack.Push(System::String::Empty);

// フラグをfalseで初期化
this->m_change = false;
}

/// <sammary>
/// UNDO
/// <sammary>
void undo(void)
{
// UNDO用のStackが空っぽでなければ…
if (this->m_undoStack.Count > 0)
{
// Stackの先頭要素がTextBox内のTEXTと同じの場合は…
if (this->m_undoStack.Peek() == this->Text)
{
// 一度だけ空読みして先頭要素を削除する
this->m_undoStack.Pop();
}

// UNDOによってTEXTが変化するのでフラグをTRUEにする
this->m_change = true;

// TextBox内のTEXTをREDO用Stackの先頭へ挿入する
this->m_redoStack.Push(this->Text);

// UNDO用のStackの先頭要素をTextBox内のTEXTへコピーする
this->Text = this->m_undoStack.Pop();
}
}

/// <sammary>
/// REDO
/// <sammary>
void redo(void)
{
// REDO用のStackが空っぽでなければ…
if (this->m_redoStack.Count > 0)
{
// REDOによってTEXTが変化するのでフラグをTRUEにする
this->m_change = true;

// TextBox内のTEXTをUNDO用Stackの先頭へ挿入する
this->m_undoStack.Push(this->Text);

// REDO用のStackの先頭要素をTextBox内のTEXTへコピーする
this->Text = this->m_redoStack.Pop();
}
}

private:
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
components = gcnew System::ComponentModel::Container();
}
#pragma endregion
};



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


Name: Justy  ..伝説なるハッカー(419,536ポイント)   Date: 2009/09/10(木) 01:19   No:39068     
Title: Re:VC.netでRedo機能の追加    

>と書いているのに起動してからすぐに
>Ctrl+ZをやるとUndoのスタックがEmptyとエラーが出てしまいます

 ソースを目で追った限りだと、出そうですね、そのエラー。
 
 init関数で m_undoStackに空の文字列が1つ追加されます。
 続いて undoが実行されると最初のチェックは 0以上なので空ではないと
判定されます。

 その次の「先頭要素が TextBoxと同じかどうか」チェックで、
まだ TextBoxには文字を入力していないのであれば this->Textは空なので
m_undoStackの唯一の中身と一致、「空読みして先頭要素が削除」されます。

 この段階で m_undoStackの要素数は0なのですが、undo関数のラストで、というわけです。
 なので、空読みした後要素が0なら何らかの対処をして Popしないようにして下さい。


# init関数で余計な空文字列を追加しないで処理する方式にすれば空読みしないで済んで、
すっきりしそうです。



>でできるとわかったのですがどこに移動させればいいのかということと
>このソースで作ったテキストボックスだと強制的に0番目にカーソルがあってしまいます。

 TextBoxには SelectionStartと SelectionLengthというプロパティがあります。

TextBox.SelectionStart プロパティ (System.Windows.Controls)
ttp://msdn.microsoft.com/ja-jp/library/system.windows.controls.textbox.selectionstart.aspx

TextBox.SelectionLength プロパティ (System.Windows.Controls)
ttp://msdn.microsoft.com/ja-jp/library/system.windows.controls.textbox.selectionlength(VS.95).aspx

 今は Textプロパティだけを Push/Popしているようですが、これらのメンバも Push/Popすれば
カーソルの位置も一緒に Undo/Redoされるはずです。

#ひょっとしたら SelectionStartだけでもいいのかもしれません。


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

Name: バグ  ..ハッカー(170,054ポイント)   Date: 2009/09/10(木) 08:21   No:39070     
Title: Re:VC.netでRedo機能の追加    
うわっ、そんなバグがあったとは…
また、時間のある時に修正しときますわ(^_^;)


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

Name:  ..初心者(6,531ポイント)   Date: 2009/09/10(木) 22:04   No:39085     
Title: Re:VC.netでRedo機能の追加    
皆様ご回答ありがとうございます。

>>Justyさん
カーソルを移動させる関数の使い方はわかりました。
ただどこにどのようにかけばよいのかわかりません。

>>バグs
その節はお世話になりました。
お手数掛けて申し訳ありませんが
私では修正できそうにないのでアドバイスを頂けますと助かります。

お手数おかけしますがご教授いただけますと助かります。


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

Name: Justy  ..伝説なるハッカー(419,979ポイント)   Date: 2009/09/10(木) 22:25   No:39086     
Title: Re:VC.netでRedo機能の追加    

>ただどこにどのようにかけばよいのかわかりません

 Textの Push/Popと同じ場所で Textと同じように Push/Popして下さい。
 
 今は m_redoStackや m_undoStackは string型の Stackとしていますが、
string(Text)と int2つ(SelectionStartと SelectionLength)を持つクラスを
1つ作り、そのクラスに変えます。

 あとは Push/Popしちるところをそれに合わせて変更すればいいかと。


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

Name:  ..初心者(8,175ポイント)   Date: 2009/09/11(金) 00:01   No:39092     
Title: Re:VC.netでRedo機能の追加    
>>Justy様

カーソルの移動について修正できました。
ありがとうございます。

またバグ?を一点みつけたのですが
Enterキーを連打した後にUNDOを繰り返すと消えない文字があります。
これは仕様なのでしょうか?

またControl+Zでをやりまくると稀にスタックがEmptyとエラーが出ることがあります。



#pragma once

public ref class UndoTextBox : public System::Windows::Forms::TextBox
{
private:
System::Collections::Generic::Stack<System::String^> m_redoStack;
System::Collections::Generic::Stack<System::String^> m_undoStack;

System::Collections::Generic::Stack<int> c_redoStack;
System::Collections::Generic::Stack<int> c_undoStack;

bool m_change;

public:
UndoTextBox(void)
{
InitializeComponent();

// メンバの初期化
init();
}

UndoTextBox(System::ComponentModel::IContainer ^container)
{
container->Add(this);
InitializeComponent();

// メンバの初期化
init();
}

protected:
~UndoTextBox()
{
if (components)
{
delete components;
}
}

virtual void OnTextChanged(System::EventArgs^ e) override
{
// フラグがtrueの場合は…
if (this->m_change == true)
{
// UNDOかREDOによってTEXTが変化したので、フラグをfalseにするだけで何もしない
this->m_change = false;
}
else
{
// REDO用Stackの中身を削除する
this->m_redoStack.Clear();
this->c_redoStack.Clear();

// UNDO用Stackへ最新のTEXTを挿入する
this->m_undoStack.Push(this->Text);
this->c_undoStack.Push(this->SelectionStart);
}
TextBox::OnTextChanged(e);
}

virtual void OnKeyDown(System::Windows::Forms::KeyEventArgs^ e) override
{
if (e->Control == true)
{
switch (e->KeyCode)
{
case System::Windows::Forms::Keys::A:
// 全選択
SelectAll();
return;
case System::Windows::Forms::Keys::Z:
// UNDO処理
undo();
return;
case System::Windows::Forms::Keys::Y:
// REDO処理
redo();
return;
}
}
TextBox::OnKeyDown(e);
}

private:
/// <sammary>
/// メンバの初期化
/// <sammary>
void init(void)
{
// Stackの中身を削除する
this->m_redoStack.Clear();
this->m_undoStack.Clear();
this->c_redoStack.Clear();
this->c_undoStack.Clear();

// UNDO用Stackの最初の要素として、空文字を挿入しておく
this->m_undoStack.Push(System::String::Empty);
this->c_undoStack.Push(0);

// フラグをfalseで初期化
this->m_change = false;
}

/// <sammary>
/// UNDO
/// <sammary>
void undo(void)
{
// UNDO用のStackが空っぽでなければ…
if (this->m_undoStack.Count > 0)
{
// Stackの先頭要素がTextBox内のTEXTと同じの場合は…
if (this->m_undoStack.Peek() == this->Text)
{
// 一度だけ空読みして先頭要素を削除する
this->m_undoStack.Pop();
this->c_undoStack.Pop();
}

// UNDOによってTEXTが変化するのでフラグをTRUEにする
this->m_change = true;

// TextBox内のTEXTをREDO用Stackの先頭へ挿入する
this->m_redoStack.Push(this->Text);
this->c_redoStack.Push(this->SelectionStart);

// UNDO用のStackの先頭要素をTextBox内のTEXTへコピーする
this->Text = this->m_undoStack.Pop();
this->SelectionStart = this->c_undoStack.Pop();
}
}

/// <sammary>
/// REDO
/// <sammary>
void redo(void)
{
// REDO用のStackが空っぽでなければ…
if (this->m_redoStack.Count > 0)
{
// REDOによってTEXTが変化するのでフラグをTRUEにする
this->m_change = true;

// TextBox内のTEXTをUNDO用Stackの先頭へ挿入する
this->m_undoStack.Push(this->Text);
this->c_undoStack.Push(SelectionStart);

// REDO用のStackの先頭要素をTextBox内のTEXTへコピーする
this->Text = this->m_redoStack.Pop();
this->SelectionStart = this->c_redoStack.Pop();
}
}

private:
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
components = gcnew System::ComponentModel::Container();
}
#pragma endregion
};



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

Name: Justy  ..伝説なるハッカー(419,500ポイント)   Date: 2009/09/11(金) 01:09   No:39095     
Title: Re:VC.netでRedo機能の追加    

>これは仕様なのでしょうか?
>またControl+Zでをやりまくると稀にスタックがEmptyとエラーが出ることがあります

 Enterキーを押して起こるかどうかはソースから読み取れないのですが、
Backspaceとかならありえそうです。

 本来、1回の undoなら m_undoStackを1回 popすればいいはずなのですが、
1回だったり2回だったりと不自然な挙動をしているのが問題な気がします。


 改善方法としては(今のコードのバックアップをとった上でお試し下さい)


・ initで m_undoStackへの 無駄な空文字列の追加を止め、
代わりにメンバに文字列 m_oldTextを追加して、m_oldTextに対して
空文字列を入れておく(c_undoStackも同様)。

・ OnTextChangedで、m_changeがどうであろうと、this->Textの文字列を
m_oldTextに保存しておく。

・ undoで空読みを止める

・ あちらこちらで行われている全ての Push(undoだろうが redoだろうが)処理で
this->Textの代わりに m_oldTextを使う。


 とりあえず、(試してはいませんが)これでうごくかな、と思います。
 ……たぶん。


#あと、redoStackや undoStackがそれぞれ2つあるのは非効率的です。
 余力があれば1つに纏めておきましょう。


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



Name: うどん  ..ぴよぴよ(47ポイント)   Date: 2009/09/09(水) 23:45   No:39063       
Title: 落ちもの系    
現在ぷよ○よのようなものを作ってみようかと思うのですが、消えるアルゴリズムがうまく思い浮かびません。
なので、効率のよいものがありましたら解説を少しつけて教えてくださると助かります。


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


Name: バグ  ..ハッカー(170,079ポイント)   Date: 2009/09/10(木) 08:24   No:39071     
Title: Re:落ちもの系    
消えるアルゴリズムというのは、4つ以上の同色のぷよが繋がったら消える判定の事でしょうか?

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

Name: うどん  ..ぴよぴよ(34ポイント)   Date: 2009/09/10(木) 12:52   No:39078     
Title: Re:落ちもの系    
はい、それのことです。
説明不足ですみません。


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

Name: conio  ..熟練のプログラマー(43,422ポイント)   Date: 2009/09/10(木) 14:14   No:39079     
Title: Re:落ちもの系    
「周囲に同じ色がいくつあるのか?」を調べるのには再帰関数が使えますよ。
ただ、再帰関数はちょっと理解するまでに時間がかかるかもしれません。


一応、プログラムと解説を載せているサイトがあるので、こちらを参考にしてみてはどうでしょうか?
http://www13.plala.or.jp/kymats/study/game_other/TOKOPUYO/tokopuyo.html


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

Name: バグ  ..ハッカー(170,170ポイント)   Date: 2009/09/10(木) 14:39   No:39080     
Title: Re:落ちもの系    
一応、このサイトのサンプルプログラムのところにも載せてもらってはいるんですが…

http://dixq.net/sm/w1.html

かなり以前に作ったものなので、あまり参考にならないかも…(^_^;)


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

Name: うどん  ..ぴよぴよ(42ポイント)   Date: 2009/09/10(木) 22:40   No:39088 解決!     
Title: Re:落ちもの系    
ありがとうございます

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



Name: garugaru  ..かけだし(1,044ポイント)   Date: 2009/09/09(水) 23:55   No:39064       
Title: 歩くのをテクテクさせる    
何度も質問してしまって申し訳ございません。検索しても、ヒントが得られなかったので、また質問してしまいました。

今、1枚の画像を12枚に分割し、歩いているのをテクテクさせるようにする処理をしようとしています。
しかし、右キーを押す何とか進むのですが、一瞬裏向きになってまた元に戻ります。

図で説明すると

[下歩1][下止][下歩2]※キャラ画像の目線でみるとこちらを見ている
[左歩1][左止][左歩2]
[右歩1][右止][右歩2]
[上歩1][上止][上歩2]※キャラ画像の目線でみると後ろを見ている
  ↑図1

のキャラ画像があり、右に移動するので、 右止から右歩1(又は2)→右歩き2(又は1)になります。
しかし、プログラミングの館にある画像は

[上止][上歩1][上止][上歩2]
[左止][左歩1][左止][左歩2]
[下止][下歩1][下止][下歩2]
[右止][右歩1][右止][右歩2]
↑図2
となっているので、

ch.img=image[(ch.x%32)/8 +12];

で正常に(右キーを押したら右にテクテク移動する)移動します。



そこで、図1でも右止→右歩1(または2)右歩2(または1)→右止になるように自己流にアレンジし

c_character.chief_image = image[(c_character.chief_x%33)/11+7];

にしました。
しかし、図1の7番目の画像から8番目の画像→9番目の画像→7番目の画像となるので後ろ向きの
画像が一瞬出てしまいます。(9番目の画像が一瞬出る)

そこで、 7番目→8番目(又は6番目)→6番目(又は8番目) という順番にすればよいのですがその方法が分かりません。
どうすれば 7→8(6)→6(8)になるでしょうか?

説明不足だったらすみません・・・。


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


Name: チルチル  ..熟練のプログラマー(50,324ポイント)   Date: 2009/09/10(木) 00:37   No:39067     
Title: Re:歩くのをテクテクさせる    
自信はありませんが

c_character.chief_image = image[((c_character.chief_x+11)%33)/11+6];

で行けるかもしれません

7→8→6と変化します

しかし行けたとしても無駄に複雑になるので
やはり配置を変えた方が良いと思います


Name: zwi  ..入門者(3,121ポイント)   Date: 2009/09/10(木) 10:48   No:39072     
Title: Re:歩くのをテクテクさせる    
こんな場合は歩くパターンの配列を用意します。
static int right_walk[3]={7,8,6};
で、これを使って歩くパターンを作ります。
c_character.chief_image = image[ right_walk[ (c_character.chief_x%3) ] ];
この方法なら色んなパターンに対応できますよ。


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

Name: kazuoni [URL]  ..ハッカー(104,720ポイント)   Date: 2009/09/10(木) 11:10   No:39074     
Title: Re:歩くのをテクテクさせる    
プログラミングの館のようにやるのならば、
mukiが
down=0
left=1
right=2
up=3
のように対応するとして、

int i=(int)pow(-1.0,(int)((player.x%32+player.y%32)/11));

int j=((player.x%32+player.y%32)/11)&&1;
ch.img=image[ j*i + player.muki*3+1];


っとすれば一応は動きますが・・・
ほぼゴリ押しですw

zwiさんのやりかたが一番簡単でしょうねぇ^^;


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

Name: garugaru  ..かけだし(1,375ポイント)   Date: 2009/09/10(木) 18:35   No:39081     
Title: Re:歩くのをテクテクさせる    
皆様返信ありがとうございます。

>>チルチル様

>c_character.chief_image = image[((c_character.chief_x+11)%33)/11+6];

これを4方向で動かすにはどうすればよいでしょうか?

c_character.chief_image = image[((c_character.chief_x+11)%33+(c_character.chief_y+11)%33)/11+???]

この ???  の部分をどう改造すればよいか分かりません・・・。





>>zwi様


>static int right_walk[3]={7,8,6};
で、これを使って歩くパターンを作ります。
c_character.chief_image = image[ right_walk[ (c_character.chief_x%3) ] ];


やってみましたが、テクテクの速さがかなり早くなってしまいました。どうすれば直るでしょうか?
また、4方向の場合は

up_walk[3]={1,2,0};
down....
left....
right...

if(Key[KEY_INPUT_UP]==1)
 c_character.chief_up = 1;

if(c_character.chief_up==1)
c_character.chief_y --;
c_character.chief_image = image[up_walk[(c_character.chief_x%3)]];

if....

if....

if....


のようにすれば出来ますか?


>>kazunoni様


>int i=(int)pow(-1.0,(int)((player.x%32+player.y%32)/11));
int j=((player.x%32+player.y%32)/11)&&1;
ch.img=image[ j*i + player.muki*3+1];


む・・・難しい・・・。

移動の処理方法は
構造体で right left up down を作りそれを
if(right==1)if(left==1)if(up==1)if(down==1)のようにしています。

構造体で 4方向作ってifで処理する方法で右テクテク左テクテク上テクテク下テクテクのようにするには
どうすればよいでしょうか?


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

Name: zwi  ..入門者(3,512ポイント)   Date: 2009/09/10(木) 18:57   No:39082     
Title: Re:歩くのをテクテクさせる    
パターンの速度変えたい場合は、用は同じコマを続ければ良いわけですので
#define SPEED 2
c_character.chief_image = image[ right_walk[ ((c_character.chief_x/SPEED)%3) ] ];
って感じでスピードを調整してください。

あと、4方向の件ですがy方向しか動かないのでパターン変化にxを使うのは無理です。
こんな場合は、歩きパターン専用のカウンタを構造体に追加してください。
int ptn_count;
このカウンタを参照してイメージを決めます。
c_character.chief_image = image[ right_walk[ ((c_character.ptn_count/SPEED)%3) ] ];
このptn_countは移動があったときのみカウントアップします。

それと歩きの処理の件ですが、

if(Key[KEY_INPUT_UP]==1)
 c_character.chief_up = 1;

if(c_character.chief_up==1) {
c_character.chief_y --;
c_character.ptn_count++;
c_character.chief_image = image[ up_walk[ ((c_character.ptn_count/SPEED)%3) ] ];
}

これと同じパターンで全方向やればいけます。

実はwalk配列を2次元化して、kazunoniさんの提案にあるmukiを番号化するって方法を使うともっとシンプルなプログラムにすることも可能ですので考えてみてください。


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

Name: garugaru  ..かけだし(1,289ポイント)   Date: 2009/09/10(木) 22:25   No:39087 解決!     
Title: Re:歩くのをテクテクさせる    
返信ありがとうございます!

上下左右の移動が出来ました!

32じゃなかったら32になるまでマイナスし続ける処理が出来ないのですが、
止まってる時中途半端に手が上がってもいいのでほっときます。
とりあえず解決しました!


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



Name: α-gel  ..ぴよぴよ(144ポイント)   Date: 2009/09/10(木) 11:01   No:39073       
Title: 無題    
いきなりですが、質問させていただきます。

error LNK2019: 未解決の外部シンボル "void __cdecl Background(void)" (?Background@@YAXXZ) が関数 _WinMain@16 で参照されました。
fatal error LNK1120: 外部参照 1 が未解決です。

と出てくるのですが、原因はなんでしょうか?
ネットで調べてみてもよくわからないので、できれば詳しく教えて下さい。


それとさらにもうひとつ…

typedef struct{
int flag,pattern,counter,img;
double
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];//[200];
} ENEMY_SHOT_t;

と宣言したのですがENEMY_SHOT.xを使おうとすると共用体、構造体でなければならないと出てきます。



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


Name: mnkr  ..ぴよぴよ(958ポイント)   Date: 2009/09/10(木) 11:22   No:39075     
Title: Re:無題    
ぱっと見ですが、
ENEMY_SHOT.xではなくENEMY_SHOT_t.xの記述ミスでしょうか?

それと、ENEMY_SHOT_tの中にxは宣言されていませんね。。。


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

Name: Mist  ..熟練のプログラマー(68,304ポイント)   Date: 2009/09/10(木) 11:28   No:39077     
Title: Re:無題    
エラーについて
WinMainでBackground()という関数が使用されているけど、関数の実体が見つからないとうことです。
Background関数を定義しているのにそのエラーが出る場合、プロトタイプ宣言と関数が一致しているがどうか確認してみましょう。

構造体
「自己参照構造体」でググってもらえるとすぐにわかると思います。
一応説明しておくと自己参照する場合は構造体名を省略してはいけません。
また、typedef名で定義できません。

typedef struct _ENEMY_SHOT_t {
int flag,pattern,counter,img;
double // ここに何も書いてないのは写し間違い??
struct _ENEMY_SHOT_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];//[200];
} ENEMY_SHOT_t;


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



Name: HIT  ..ぴよぴよ(189ポイント)   Date: 2009/09/09(水) 20:03   No:39040       
Title: インベーダーのようなゲームを作ってみたいのですが・・・    
ゲームプログラミングの館に シューティングの基本。という
章があります それを改造してインベーダーのようなゲームを
作りたいのですが、自機を画面上に出現させる方法、自機を移動する方法(左右だけ)と
敵を出現させてその敵が左右に移動しながら近づいてくる
方法と その敵が自分に当たる、敵が自機より後ろにいった
、敵が弾を発射してそれが自機に当たった場合ライフが1つへり、3回当たったらゲームオーバーに
なる方法、敵が弾を発射してくる方法を教えて下さい!!


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,054,437ポイント)   Date: 2009/09/09(水) 20:28   No:39042     
Title: Re:インベーダーのようなゲームを作ってみたいのですが・・・    
HITさん

初めまして^^
ゲーム作りを始められるようですね。期待していらっしゃる事と思います☆

まず、最初からあれこれ作ろうとすると挫折の元ですので、少しずつ作ってみましょう。
プロジェクトも別で構いませんし、その機能ごとに作り方が違っても大丈夫です。

まずは「作ってみた!」「その通り動いた!」という感動が味わえるとモチベーションもグンと上がってくると思います。

では、ゲームプログラミングの館で基本は抑えていらっしゃるのですね?
では「自機」を作る事は出来たと思いますので今度は「敵」を作ってみてはどうでしょう?

敵を表示して右に移動したり左に移動したりしてみてはどうでしょうか?
それが出来たら

自機から弾を発射する事は出来たと思いますので、敵から弾を発射してみましょう。
それも出来たら、あたり判定についてもゲームプログラミングの館にありますので、
それを見ながら作ってみてはどうでしょうか。

まず何を作るのか小さく限定して作り、つまったら限定して質問することで回答も集まり易いと思いますよ。
制作頑張って下さい☆


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

Name: HIT  ..ぴよぴよ(203ポイント)   Date: 2009/09/09(水) 22:52   No:39060     
Title: Re:インベーダーのようなゲームを作ってみたいのですが・・・    
ありがとうございます!!! 

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



Name: garagara  ..ぴよぴよ(896ポイント)   Date: 2009/09/08(火) 19:45   No:39002       
Title: 画像をキー入力で移動    
分割した画像をキー入力で画像を移動させるというのがプログラミングの館であったので、
自分で構造体を作り、自分で作成してみました。しかし、プログラミングの館を参考にしながら作成したにも
関わらず、正常に動作されません。(エラーは起きない。)


#include "DxLib.h"
#include "練習[主人公].h"

char Key[256];

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

if(DxLib_Init()==-1)return -1;
SetDrawScreen(DX_SCREEN_BACK);

while(ProcessMessage()==0)
{

ClsDrawScreen() ;

//◇◇◇プログラミング開始◇◇◇

int image[12];

c_character.chief_x =100;
c_character.chief_y = 100;

LoadDivGraph("主人公.png" , 12 , 3 , 4 , 32 , 32 , image);

if(Key[KEY_INPUT_RIGHT] == 1)
c_character.chief_x ++;


c_character.chief_image = image[11];

DrawGraph(c_character.chief_x , c_character.chief_y , c_character.chief_image , TRUE);



ScreenFlip();

if(CheckHitKey(KEY_INPUT_LALT)==1)
if (CheckHitKey(KEY_INPUT_F4)==1)
break;
}
DxLib_End();
return 0;

}



----------------------------------------------------------------------------------------------------

練習.h

#include "DxLib.h"

struct chief { //主人公の構造体

int chief_x; //主人公のX座標
int chief_y; //主人公のY座標
int chief_image;//主人公の画像(32x32)
int chief_up; //主人公の向き(上)
int chief_down; //主人公の向き(下)
int chief_left; //主人公の向き(左)
int chief_right;//主人公の向き(右)
int chief_stop; //主人公が止まっている
int chief_moves;//主人公が動いている

}c_character;



これで、正常に動作しない原因はなんでしょうか?また、解決法はどうすれば良いでしょうか?
構造体は、使用していない関数(?)があります。


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


Name: チルチル  ..熟練のプログラマー(49,164ポイント)   Date: 2009/09/08(火) 20:04   No:39003     
Title: Re:画像をキー入力で移動    
c_character.chief_x =100;
c_character.chief_y =100;

をループの前にしてはどうでしょうか?


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

Name: チルチル  ..熟練のプログラマー(49,288ポイント)   Date: 2009/09/08(火) 20:21   No:39004     
Title: Re:画像をキー入力で移動    
ちなみに正常に動作しないと言うのは具体的に何が起こっているのですか?



それから

int image[12];

c_character.chief_x =100;
c_character.chief_y = 100;

LoadDivGraph("主人公.png" , 12 , 3 , 4 , 32 , 32 , image);

if(Key[KEY_INPUT_RIGHT] == 1)
c_character.chief_x ++;


c_character.chief_image = image[11];

の範囲もループの前で行った方が良いと思います



if(CheckHitKey(KEY_INPUT_LALT)==1)
if (CheckHitKey(KEY_INPUT_F4)==1)
break;

は危ない気がするので条件式に加えるか

if( CheckHitKey(KEY_INPUT_LALT)==1 && CheckHitKey(KEY_INPUT_F4)==1 )break;

としてはどうでしょうか?



あとKey[]とCheckHitKey()の2通りあるのはなぜですか?

それとKey[]に代入がされていない気がするのですが・・



>プログラミングの館を参考にしながら作成したにも関わらず

少し理解が不足しているようですね・・


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

Name: kazuoni [URL]  ..ハッカー(104,564ポイント)   Date: 2009/09/08(火) 20:59   No:39005     
Title: Re:画像をキー入力で移動    
if(CheckHitKey(KEY_INPUT_LALT)==1) 

if (CheckHitKey(KEY_INPUT_F4)==1)
break;


は大丈夫では?
特に問題ないかと思います。
まぁ、インデントしといたほうがあとが見やすいですけどね。


#余談
#include "練習[主人公].h"
あんまり日本語ファイル名のヘッダーってみないですよね。
自分だけかもしれないですけど・・・。^^;


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

Name: Justy  ..伝説なるハッカー(418,733ポイント)   Date: 2009/09/08(火) 21:58   No:39008     
Title: Re:画像をキー入力で移動    
 本題からは外れますが、

>    if(CheckHitKey(KEY_INPUT_LALT)==1)
>        if (CheckHitKey(KEY_INPUT_F4)==1)
>            break;

 ALT + F3とか Ctrl + Qとか他の組み合わせならわかるのですが、
ALT + F4ならこれ要らないですよね……。
 


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

Name: garugaru  ..ぴよぴよ(718ポイント)   Date: 2009/09/08(火) 23:26   No:39014     
Title: Re:画像をキー入力で移動    
皆様返信ありがとうございます。



>ループの前にしてはどうでしょうか?

while(ProcessMessage()==0)
{
の前に入れてもダメでした。

>ちなみに正常に動作しないと言うのは具体的に何が起こっているのですか?

エラーは起こらず普通に起動はするのですが、右キーを押しても、画像が右に移動しません。
多分、if(Key[KEY_INPUT_RIGHT]==1)という部分が怪しいです。

>範囲もループの前で行った方が良いと思います

while(ProcessMessage()==0)
{
の前に入れてもダメでした。

>if( CheckHitKey(KEY_INPUT_LALT)==1 && CheckHitKey(KEY_INPUT_F4)==1 )break;

if(CheckHitKey(KEY_INPUT_LALT)==1)
if (CheckHitKey(KEY_INPUT_F4)==1)
break;


をif( CheckHitKey(KEY_INPUT_LALT)==1 && CheckHitKey(KEY_INPUT_F4)==1 )break;
に書き直してもダメでした。

>あとKey[]とCheckHitKey()の2通りあるのはなぜですか?

CheckHitKey()はDXリファレンスを見てやったもので、Key[]のほうはプログラミング館にあったので2箇所になってしまいました・・・。また、if(CheckHitKey(KEY_INPUT_RIGHT)==1)
c_character.chief_x ++;
               とやってもほんの少しだけ動いただけで(カクッと)だめでした。


>それとKey[]に代入がされていない気がするのですが・・

if(Key[KEY_INPUT_RIGHT] == 1)の後に文章を表示する処理をしたところ、正常に表示されませんでした。
なので、   if(Key[KEY_INPUT_RIGHT] == 1)    の処理が間違っているように見えます。(一番怪しい箇所)
Key[]に代入がされていないとは、どういうことでしょうか。理解力なくてすみません・・・。

>あんまり日本語ファイル名のヘッダーってみないですよね。

英語より日本語のほうが分かるので、分かりやすい日本語にしてみました。"主人公.png"も分かりやすいので日本語です!


>ALT + F3とか Ctrl + Qとか他の組み合わせならわかるのですが、
ALT + F4ならこれ要らないですよね……。

確かにそうですよね・・・。
ALT F4は強制終了なので、一々そんな処理しなくても大丈夫ですよね・・・。


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

Name: garugaru  ..ぴよぴよ(852ポイント)   Date: 2009/09/08(火) 23:48   No:39015     
Title: Re:画像をキー入力で移動    
すみません。今、プログラムとにらめっこして、間違っている部分を見つけました。

GetHitKeyStateAll( Key ) ; という部分が抜けていました・・・。本当に単純なミスでした・・。
しかし、これを加えても、押している間は、右にちょっと移動するのですが、離すとまた戻ってしまいます。

>それとKey[]に代入がされていない気がするのですが・・
この部分が理解できました。 GetHitKeyStateAll(Key)のことですよね。


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

Name: sizuma [URL]  ..上級者(15,855ポイント)   Date: 2009/09/09(水) 00:05   No:39017     
Title: Re:画像をキー入力で移動    
チルチルさんのアドバイスを実行してみてください。


>英語より日本語のほうが分かるので、分かりやすい日本語にしてみました。
僕も始めたときはそう思ってましたけど、普通はしないですね。
そのうち英語で慣れてきますよ。
今はかなり違和感があって見づらいです。たぶん普通のプログラマーの方もそうなんではないでしょうか。
別に誰にもコードを見せないならそれでいいと思いますけど・・・


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

Name: チルチル  ..熟練のプログラマー(49,964ポイント)   Date: 2009/09/09(水) 00:57   No:39018     
Title: Re:画像をキー入力で移動    
>押している間は、右にちょっと移動するのですが、離すとまた戻ってしまいます。
これは「押し続けている間は右にどんどん進んで行くけど、離した瞬間に初期位置に戻る」と言う事でしょうか?

違う場合はもしかしたら「ちょっと移動」と言うのは1ピクセルの事ではないでしょうか?

c_character.chief_x =100;
c_character.chief_y =100;

を現在でもループの前に置いてあるでしょうか?

ループの中に戻している場合は毎フレーム初期位置に戻されてしまいます
右を押している時は戻った後で右に1ピクセル動いているので
押している間だけ右に1ピクセル動くという現象が起きているのではないでしょうか?

あと下の処理はループの前で行ってください

int image[12];

c_character.chief_x =100;
c_character.chief_y = 100;

LoadDivGraph("主人公.png" , 12 , 3 , 4 , 32 , 32 , image);

c_character.chief_image = image[11];

見た目には変化が無いように見えますが
画像を毎フレーム読み込んでいるので重くなって行くと思います


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

Name: garugaru  ..ぴよぴよ(978ポイント)   Date: 2009/09/09(水) 17:47   No:39036     
Title: Re:画像をキー入力で移動    
出来ました!ありがとうございます!

ループの中にあったので出来なかったのですか・・。

while(ProcessMessage()==0)
{
の外から行う処理もある・・・ 勉強になりました!

目的は、4方向に斜めありで処理することなので、出来るように頑張ります。


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

Name: garugaru  ..ぴよぴよ(994ポイント)   Date: 2009/09/09(水) 17:47   No:39037 解決!     
Title: Re:画像をキー入力で移動    
解決押し忘れました。

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,054,711ポイント)   Date: 2009/09/09(水) 20:37   No:39044     
Title: Re:画像をキー入力で移動    
ファイルやファイルパスに全角を使うと自分が今使っている環境じゃないと動かないって可能性があるんですよね。
例えばLinuxで動かすとか、日本語に対応していないOSで使うとか・・。

現に龍神録は一部ファイルパスに全角が含まれていたので、
海外の方から龍神録が自分の環境で遊べないと苦情が何件か寄せられました。

何を思ったのか、練習の為に作ったセーブデータの暗号化ツールの書き出すファイル名が「セーブデータ.dat」だったんですが、面倒だからそのまま使いまわしました・・。

・・その結果がこれd・・・!・・でした^^;


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

Name: garugaru  ..かけだし(1,008ポイント)   Date: 2009/09/09(水) 22:26   No:39059     
Title: Re:画像をキー入力で移動    
な、、なるほど!日本語に対応してないOSからですか!

本番(練習じゃないもの)になったら、また新しくファイルを作ろうと思ってるので、多分大丈夫だと思います!


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



Name: ねこ  ..プログラマー(39,060ポイント)   Date: 2009/09/06(日) 23:07   No:38963       
Title: IntelliSenceの不具合?    
こんばんは、VC2008の環境での問題について質問です。
現在一部のファイル(cpp)においてコードヒントが出なくなりました。

そのファイルに記述しているのはクラスの処理内容です。
1.全く出ないのではなく、最初にCTRL+SPACEを押すとグローバル変数は出ますがクラスのメンバー変数がリストに出ません。
2.グローバル変数選択後「.」を押してもメンバ関数、というかコードヒントが全く出ません。
※変数がポインタ変数というわけではないです。
3.ディレクトリ構造はslnのある箇所にはフォルダ「Enemy」「CmnClass」等があり、その中の「Enemy」のみそうなります。
4.コンパイルエラーは無く、ゲーム自体は正常に動作します。
5.プリプロセッサを使用していますが、正常に動作する他のファイルとプロパティの設定は全て同一です。
6.ncbファイルを消して再度作成されても同じ状態です。
7.Enemyフォルダにあるクラスはいくつかのロードしたライブラリのクラスを継承しています。

環境として何を上げれば良いのか分からないので上述しました。
何か思い当たる方、過去同じような経験をされた方、解決方法をご存じないでしょうか?

よろしくお願いします。


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


Name: にょろーん  ..ぴよぴよ(330ポイント)   Date: 2009/09/07(月) 06:08   No:38969     
Title: Re:IntelliSenceの不具合?    
初めまして。
うちのIntellisenseさんも機嫌悪いんですよねえ……。
再起動したら治ったりとか、ncb消したら更に調子悪くなったりですとか。

と言うわけで、私からもお願いします。


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

Name: Tororo  ..ぴよぴよ(244ポイント)   Date: 2009/09/07(月) 16:43   No:38978     
Title: Re:IntelliSenceの不具合?    
私も同じ状況に陥ったことがあります
どうしてなんでしょうね〜?
(いつのまにか直った〜)


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

Name: 御津凪 [URL]  ..ハッカー(112,893ポイント)   Date: 2009/09/07(月) 17:00   No:38979     
Title: Re:IntelliSenceの不具合?    
何をしても一切出ることが無い場合、
下記の事を試してみてはどうでしょうか。

・エラーが無くビルド(リビルド)が出来るかどうか。(正しく IntelliSence が反応しないことがあるため)
・プロジェクトに対象のファイル(ライブラリなどのファイルは除く)が登録されているか。
・プリコンパイルヘッダを使用する

プロジェクトの状況が良く分からないのでこれで直るかどうかはわかりませんが。
たいていの場合はプリコンパイルヘッダを使用した上で ncb ファイルを削除し、生成を待てば直ってくれるはずです。

また、同名のクラスがあったりしませんか?
using などで被っていると出ないことがあります。


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

Name: ねこ  ..熟練のプログラマー(40,047ポイント)   Date: 2009/09/09(水) 22:10   No:39058 解決!     
Title: Re:IntelliSenceの不具合?    
>にょろーんさん、Tororoさん
やはり皆気にかかる部分なのですね。

>御津凪さん
レスありがとうございます。自身で調べる時間が取れず返信遅くなってすみません。

結果としてはEnemyフォルダにあるクラスのクラス定義ヘッダにダミーヘッダをインクルードしているのが原因だったみたいです。
構成を変えた際Include全部書き換える手間を防ぐためにしたのが仇となりました。

<また、同名のクラスがあったりしませんか?
<using などで被っていると出ないことがあります。
この文で気づくことができました、ありがとうございます!

<・エラーが無くビルド(リビルド)が出来るかどうか。(正しく IntelliSence が反応しないことがあるため)
<・プロジェクトに対象のファイル(ライブラリなどのファイルは除く)が登録されているか。
<・プリコンパイルヘッダを使用する
大体はこのあたりで治りますよね。僕も出ないときはncb消してリビルドしてました。

疑問に思ってるお二方も構成を再確認してみると意外なところに穴があるかもしれません。
解決したので、解決マーク付けておきます。

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



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



Name: AAS  ..ぴよぴよ(25ポイント)   Date: 2009/09/07(月) 12:17   No:38973       
Title: 画像ファイルについて    
VC++でGIFを使うにはどうすればいいのでしょうか?

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


Name: バグ  ..ハッカー(169,986ポイント)   Date: 2009/09/07(月) 12:27   No:38974     
Title: Re:画像ファイルについて    
開発環境、使用するライブラリにもよるかと思います。

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

Name: Justy  ..伝説なるハッカー(418,624ポイント)   Date: 2009/09/08(火) 01:33   No:38988     
Title: Re:画像ファイルについて    
 gifをどうしたいのかよくわからないんですが、まぁ GDI+か giflibってところはどうでしょうか?


第336章 GDI+の基礎 その2
ttp://www.kumei.ne.jp/c_lang/sdk4/sdk_336.htm

giflib -- A library for processing GIFs
Get giflib -- A library for processing GIFs at SourceForge.net
ttp://sourceforge.net/projects/giflib/


 表示するだけなら susieプラグインを利用するというのも面白いかもしれません。


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

Name: AAS  ..ぴよぴよ(45ポイント)   Date: 2009/09/08(火) 09:42   No:38994     
Title: Re:画像ファイルについて    
バックに表示したりしたいのです。

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

Name: toyo  ..熟練のプログラマー(40,966ポイント)   Date: 2009/09/08(火) 10:34   No:38995     
Title: Re:画像ファイルについて    
ただ表示するだけなら他の画像ソフトで別の形式に変換しておいたらだめですか


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,055,861ポイント)   Date: 2009/09/09(水) 21:00   No:39052     
Title: Re:画像ファイルについて    
何のライブラリを使うのでしょうか?
バグさんが仰っている通り、環境を書かないと答えにくいかと思います。


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



Name: よこしゅー  ..ぴよぴよ(126ポイント)   Date: 2009/09/09(水) 01:52   No:39019       
Title: 自機が点滅してしまいます    
龍神録プログラミングの7章で自機が不規則にてんめつしてしまいます。
一枚絵なのがいけないのでしょうか。

#include "../include/GV.h"


void load(){
LoadDivGraph( "../img/ziki.png" , 1 , 1 , 1 , 64 , 64 , img_ch[0] ) ;
}



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


Name: チルチル  ..熟練のプログラマー(50,066ポイント)   Date: 2009/09/09(水) 12:56   No:39026     
Title: Re:自機が点滅してしまいます    
確か龍神録では複数の画像でアニメーションしていたと思うので
読み込んでいない要素で描画しようとしたら何も表示されないんじゃないでしょうか?

画像を必要数用意するかアニメーションを止めれば正常になるかと・・


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,055,807ポイント)   Date: 2009/09/09(水) 20:59   No:39051     
Title: Re:自機が点滅してしまいます    
LoadDivGraphの最後の引数はアドレスじゃないといけないと思いますがそこは大丈夫ですか?

後龍神録プログラミングの館そのまんまのコードだとすると、チルチルさんが仰っている通り、
素材と同じだけ自機の画像を用意して下さい。


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



Name: 電気屋  ..ぴよぴよ(149ポイント)   Date: 2009/09/09(水) 14:25   No:39031       
Title: 全方向シューティングについて    
初めまして、今回初めて質問させていただきます。
私は今、全方向型のシューティングゲームの作成をしています。
そして、このサイトを拝見して、どうにか一定方向の弾の発射まで行えるようになりました。
しかし、そのプログラムを改造して方向キーを押した後、弾がその方向にでる用にしたいのですが、
うまくいきません。どうしたらよいかアドバイスをください。


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


Name: DVDM [URL]  ..入門者(3,008ポイント)   Date: 2009/09/09(水) 17:07   No:39034     
Title: Re:全方向シューティングについて    
>>電気屋さん
ある角度に打ち出すのであれば

弾のX座標 += 速度 * cosf(ラジアンに変換した角度);
弾のY座標 += 速度 * sinf(ラジアンに変換した角度);
(sinf, cosf は float で計算するものです。doubleで計算したい場合は sin, cos を使って下さい)

例えば90度の方向に速度2で打ちたい場合、
弾のX座標 += 2 * cosf((90)*PI/180.0f);
弾のY座標 += 2 * sinf((90)*PI/180.0f);
(PIは円周率の3.141592・・・)
という風になります。

もちろん、90度に画像を回転させる処理も入れなければなりません。


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

Name: チルチル  ..熟練のプログラマー(50,241ポイント)   Date: 2009/09/09(水) 17:35   No:39035     
Title: Re:全方向シューティングについて    
>このサイトを拝見して
と言う事はコードも同じような感じと考えて良いのでしょうか?

その場合は初期角度だけ変えれば良さそうですね
「弾を発射中に方向キーで発射方向を変えられる」と解釈すると、こんな感じでどうですか?(8方向限定)

char X=0,Y=0;

if( Key[KEY_INPUT_UP]>0 )--Y;

if( Key[KEY_INPUT_RIGHT]>0 )++X;

if( Key[KEY_INPUT_DOWN]>0 )++Y;

if( Key[KEY_INPUT_LEFT]>0 )--X;

if( X!=0 || Y!=0 )Angle=atan2( Y , X );


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,054,967ポイント)   Date: 2009/09/09(水) 20:40   No:39045     
Title: Re:全方向シューティングについて    
>電気屋さん

初めまして^^
うちのサイトをご覧下さりありがとうございます☆

まず、発射と軌道計算はどのようにしていますか?

弾.x++;

みたいな撃ち方だとすぐに変えられないかもしれませんが、
「角度」を持って

弾.x += cos(弾.角度) * 弾.スピード;

みたいに計算していれば、その角度を変更すればいいだけですよね。
まずは、色んな角度に発射できることを確認し、
それから同時に色んな角度で発射してみてはどうでしょう?

作ったプログラムが比較的短いものなら、ここにアップしたほうが回答が得られやすいかもしれません。


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

Name: 電気屋   Date: 2009/09/17(木) 15:56   No:390311253170589     
Title: プログラムです    
/方向キー入力で変数mukiに0〜3を入れる
if( Key[ KEY_INPUT_UP ]==1)
muki=0;
if( Key[ KEY_INPUT_LEFT ]==1)
muki=1;
if( Key[ KEY_INPUT_DOWN ]==1)
muki=2;
if( Key[ KEY_INPUT_RIGHT ]==1)
muki=3;


//         yを減らす
//           ↑
//           ↑
//           ↑
//   xを減らす ←←←★→→→ xを増やす
//           ↓
//           ↓
//           ↓
//         yを増やす
// 



switch (muki){
case 0://キャラクターが上を向いていたら
for(i=0;i<SHOTMAX;i++){
if(tama[i].flag==1){ //発射している玉なら
tama[i].y-=SHOTSPEED; //y座標を減らす
DrawGraph( tama[i].x , tama[i].y , image[muki] , TRUE );//玉を描画
if(tama[i].y < -32){ //もし画面外まで来たら
tama[i].x=320; //初期値に戻し
tama[i].y=240;
tama[i].flag=0; //発射フラグを戻す
}
}
}
break;

このような感じで4方に打てるようにがんばっているのですが、うまくいかないのでアドバイスお願いします。
また、弾は始点から発射されたらその場所から画面の端まで方向を変えず、進むようにしたいと思っています。





Name: AAA  ..かけだし(1,591ポイント)   Date: 2009/09/08(火) 23:24   No:39013       
Title: 教えて下さい    
DXライブラリを使って プログラムを組んでみたいのですが どうすればいいのでしょうか?
内容は Aキーを押したら Aの曲  Bキーを押したら Bの曲 Cキーを押したら 終了 という風に
作りたいのですが・・・


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


Name: conio  ..熟練のプログラマー(43,417ポイント)   Date: 2009/09/09(水) 00:02   No:39016     
Title: Re:教えて下さい    
まず、実装するためにはどんな処理が必要なのかを考えてみてください。
-----------------------------------------
@メインループの作り方
A音声データをメモリに読み込む方法
Bキー入力を判定する方法
C音声データの再生、停止などを行う方法
D終了のさせ方
-----------------------------------------
大体、このような処理が必要だと思います。
で、それぞれの処理を行う為にはどんな関数等を使えばいいのかを
探してみると良いと思います。

↓リファレンスのページ
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html


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

Name: AAA  ..かけだし(1,604ポイント)   Date: 2009/09/09(水) 18:57   No:39038     
Title: Re:教えて下さい    
ありがとうございました!!

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

Name: AAA  ..かけだし(1,599ポイント)   Date: 2009/09/09(水) 18:58   No:39039 解決!     
Title: Re:教えて下さい    
やってみます


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,054,455ポイント)   Date: 2009/09/09(水) 20:31   No:39043     
Title: Re:教えて下さい    
まずDXライブラリの基本的な使い方はOKでしょうか?
ゲームプログラミングの館の内容が一通り解るレベルなら制作も大丈夫だと思います。

メモリに取り込んでから再生する方法はこちらに
http://dixq.net/g/#16

キーがどれ位押されたかチェックする関数はこちらに
http://dixq.net/g/#40

基本的なプログラムの骨格はこちらに
http://dixq.net/g/#41

ありますので良ければ参考にして下さい。


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



Name: はね  ..中級者(12,345ポイント)   Date: 2009/09/08(火) 22:21   No:39010       
Title: 行列から角度の求めかた    
いつもお世話になっています。


現在、カメラ行列から角度を求める関数を作っているのですが、
YZ軸がうまく出力できずに困っています。

現象としてはカメラのupベクトルによって角度が安定して取れていないようです。

Y軸の角度は-90~90
Z軸の角度は-180~180まで取りたいです。

以下に製作中の関数を載せさせて頂きますのでご教示お願いいたします。
なおX軸の処理は省略しています。

 


/* 引数:カメラ行列 求める角度 */
int mat2rot(Matrix3 mat, float deg[3])
{
int i;
 /* Y軸が±90のとき */
if( fabs(mat.m[2][0]) > (1.0-eps5E) ) {
deg[0] = PrevDegree.x;/* 表示をそのままにしたいのでひとつ前の角度を入れる */
deg[2] = PrevDegree.z;
deg[0] = deg[0] * M_PI / 180.0f;
deg[2] = deg[2] * M_PI / 180.0f;
deg[1] = -asin(mat.m[0][2]);
} else {
deg[1] = -asin(mat.m[2][0]);
deg[2] = atan2(mat.m[0][1],mat.m[0][0]);
}

for(i = 0; i < 3; i++) {
deg[i] *= (180.0/M_PI);
}

return 1;
}





ちなみに出力した行列は以下です。
 

0.999998 -0.001268 0.001702 0.000000
-0.001767 -0.053233 0.998581 -0.000000
-0.001175 -0.998581 -0.053235 -7.584273
0.000000 0.000000 0.000000 1.000000



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


Name: Justy  ..伝説なるハッカー(418,886ポイント)   Date: 2009/09/08(火) 22:35   No:39012     
Title: Re:行列から角度の求めかた    

>カメラ行列から角度を求める

 そういう処理が必要な状況をなんとかした方がいいと思うんですが。

Lμcifer @Wiki - オイラー角と行列の相互変換
ttp://www7.atwiki.jp/lucifer/pages/13.html

 こちらを参考にすれば、なんとかなる……かもしれません。


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



Name: 天魔  ..かけだし(1,082ポイント)   Date: 2009/09/04(金) 13:04   No:38787       
Title: タイトル画面とステージの移行    
以前、13章について質問をさせていただいたものです。

またもや、わからないことができたので質問させていただきます。

まず1つは、ゲームが始まる際に表示される「タイトル画面」を表示するにはどうすればいいのでしょうか?
なお、タイトル画面についてはNewGameを選択することによってゲームが始まる形のものです。


2つ目は、1つ目のステージが終わり、2つ目のステージに移行する時の処理はどのようにすればいいのでしょうか?main関数に加える形でしょうか・・・?


質問ばかりで申し訳ありませんが、教えていただければ幸いです。


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


Name: zwi  ..入門者(3,012ポイント)   Date: 2009/09/04(金) 19:10   No:38800     
Title: Re:タイトル画面とステージの移行    
mainにタイトル画面、ステージ1、ステージ2・・・と加えていく事になると思います。
switch(func_state)の外側にswitch文でタイトル画面、ステージ1、ステージ2と分ければ良いんじゃないかと。
この場合は、stage変数が使えると思います。

類似の質問
http://www.play21.jp/board/formz.cgi?action=res&resno=38783&page=&id=dixq&rln=38796


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

Name: 天魔  ..かけだし(1,116ポイント)   Date: 2009/09/08(火) 21:02   No:39006     
Title: Re:タイトル画面とステージの移行    
なるほど、わかりました。
ありがとうございます、是非参考にさせていただきます!


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



Name: ターボ  ..かけだし(2,361ポイント)   Date: 2009/09/08(火) 12:22   No:38996       
Title: EEは無料?それとどちらがお勧め?    
こんにちは。この前はお世話になりました。

そこでまた質問なのですが、Microsoft Visual Studio 2008 Express Editionは無料で期間限定なしに使えるで合っていますか?

私は、昔VC.net2003とVB.net2003を買って持っているのですが、今までほとんど使ってなかったのですが今からVC++やVBを勉強しようかと思うのですが、VC.net2003やVB.net2003より新しいMicrosoft Visual Studio 2008 Express EditionのVC++EEやVBEEの方が良いのか解らず迷っています。

ちなみに、この前の投稿で林晴比古さんの本を進めてもらったのですが、林さんの新VisualC++.net入門version2003対応のビギナー編は持っているのですが、少し古いので、新しいのを買った方が良いのでしょうか?

誰かアドバイスお願いします。


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


Name: Mist  ..熟練のプログラマー(67,012ポイント)   Date: 2009/09/08(火) 12:44   No:38997     
Title: Re:EEは無料?それとどちらがお勧め?    
> そこでまた質問なのですが、Microsoft Visual Studio 2008 Express Editionは無料で期間限定なしに使えるで合っていますか?

無期限に使用するためにはユーザ登録(無料)する必要があります。
ユーザ登録しないと30日で使えなくなります。

> 2003と2008EE

どういったソフトを作るかで選択が変わります。
MFCを使用したソフトを作りたいというのであれば、2008EEは非対応ですので選択の余地なしです。
.netプログラミング(C++/CLI)であれば最新バージョンに対応している2008EEのほうが良いでしょう。
DXライブラリを使ったゲーム作成のようにWin32アプリであればどちらでもかまわないと思います。
インターフェース等が若干変わっていますので両方使って使いやすいほうでも良いかと。

> 本の買い替え

その本持っていませんのでどういう内容かわかりませんが、本の値段に見合うほどの変更は無いと思いますので2003の本で2008EEを使用しても相違点はネットで調べるなりすれば解決するかと思います。


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

Name: ターボ  ..かけだし(2,399ポイント)   Date: 2009/09/08(火) 18:13   No:39001 解決!     
Title: Re:EEは無料?それとどちらがお勧め?    
Mistさん返信ありがとうございます。

そして、情報提供ありがとうございます。新しい本は買わず2003の本を使おうと思いました。


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



Name:  ..上級者(21,829ポイント)   Date: 2009/09/06(日) 05:12   No:38903       
Title: オプションについて    

龍神録のcshot.cpp内でstate_optionが1のとき、
オプションが自機の周りに回るようにしてるのですが、
二つ固まって回ってしまい困ってます・・
添付したような形にしたいのですが、どこを修正したら
いいでしょうか?
また、オプション自体もstate_optionが1のときは
オプションの画像を変えたいのですが変わらなくて困ってます。
誰か助けてください><

ini.cpp内の一部
option_bb[3].img=img_cshot[5]; //オプションボンボンの画像代入(49)
option_bb[4].img=img_cshot[5];

cshot.cpp内
#include "../include/GV.h"

int cshot0num[2] ={2,4};
//通常の自機ショットの1発目は(-10,-30)の位置、2発目は(10,-30)の位置、3発目は(-30,-10)・・・
int cshot0pos_x[4]={-10, 10,-30, 30};
int cshot0pos_y[4]={-30,-30,-10,-10};

#define OPTION_X 25
#define OPTION_Y 35
int option0num[2] ={2,4};
double option0ang[4] = {-PI/2,-PI/2,-PI/2-PI/4,-PI/2+PI/4};//オプションの発射角度(49)

//自機ショットの登録可能番号を返す
int search_cshot(){
for(int i=0;i<CSHOT_MAX;i++){
if(cshot[i].flag==0)
return i;
}
return -1;
}

//通常ショット登録A
void ch0_shot_pattern(){
int k;
int n=cshot0num[ch.power<200?0:1];
for(int i=0;i<n;i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=15;
cshot[k].x=ch.x+cshot0pos_x[i];
cshot[k].y=ch.y+cshot0pos_y[i];
cshot[k].power= (n<2 ? 20 : 12) +ch.power/100;//2筋なら20,4筋なら12(50)
cshot[k].knd=0;
cshot[k].img=img_cshot[0];//画像番号代入(49)
}
}
se_flag[2]=1;//発射音オン
if(ch.power>=100){
for(int i=0;i<(ch.power<300?2:4);i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=option0ang[i];
cshot[k].spd=8;
cshot[k].x=option_bb[i%2].x;
cshot[k].y=option_bb[i%2].y;
cshot[k].power=10-7*(i/2);//マイナスにならないよう注意(50)
cshot[k].knd=1;
cshot[k].img=img_cshot[1];//画像番号代入(49)
}
}
}
}

//低速通常ショット登録A
void ch1_shot_pattern(){
int k;
int n=cshot0num[ch.power<200?0:1];
for(int i=0;i<n;i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=15;
cshot[k].x=ch.x+cshot0pos_x[i]/3;//低速中なら位置を中心側へ
cshot[k].y=ch.y+cshot0pos_y[i]/2;
cshot[k].power= (n<2 ? 20 : 12) +ch.power/100;//2筋なら20,4筋なら12(50)
cshot[k].knd=0;
cshot[k].img=img_cshot[0];//画像番号代入(49)
}
}
se_flag[2]=1;
if(ch.power>=100){
for(int i=0;i<(ch.power<300?2:4);i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=option0ang[i];
cshot[k].spd=8;
cshot[k].x=option_bb[i%2].x;
cshot[k].y=option_bb[i%2].y;
cshot[k].power=10-7*(i/2);//マイナスにならないよう注意(50)
cshot[k].knd=1;
cshot[k].img=img_cshot[1];//画像番号代入(49)
}
}
}
}

//通常ショット登録B
void ch2_shot_pattern(){
int k;
int n=cshot0num[ch.power<200?0:1];
for(int i=0;i<n;i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=20;
cshot[k].x=ch.x+cshot0pos_x[i];
cshot[k].y=ch.y+cshot0pos_y[i];
cshot[k].power= (n<2 ? 20 : 12) +ch.power/100;//2筋なら20,4筋なら12(50)
cshot[k].knd=0;
cshot[k].img=img_cshot[3];//画像番号代入(49)
}
}
se_flag[2]=1;//発射音オン
if(ch.power>=100){
for(int i=0;i<(ch.power<300?2:4);i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=option0ang[i];
cshot[k].spd=8;
cshot[k].x=option_bb[i%2].x;
cshot[k].y=option_bb[i%2].y;
cshot[k].power=10-7*(i/2);//マイナスにならないよう注意(50)
cshot[k].knd=0;
cshot[k].img=img_cshot[4];//画像番号代入(49)
}
}
}
}

//低速通常ショット登録B
void ch3_shot_pattern(){
int k;
int n=cshot0num[ch.power<200?0:1];
for(int i=0;i<n;i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=20;
cshot[k].x=ch.x+cshot0pos_x[i]/3;//低速中なら位置を中心側へ
cshot[k].y=ch.y+cshot0pos_y[i]/2;
cshot[k].power= (n<2 ? 20 : 12) +ch.power/100;//2筋なら20,4筋なら12(50)
cshot[k].knd=0;
cshot[k].img=img_cshot[3];//画像番号代入(49)
}
}
se_flag[2]=1;
if(ch.power>=100){
for(int i=0;i<(ch.power<300?2:4);i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=option0ang[i];
cshot[k].spd=8;
cshot[k].x=option_bb[i%2].x;
cshot[k].y=option_bb[i%2].y;
cshot[k].power=10-7*(i/2);//マイナスにならないよう注意(50)
cshot[k].knd=0;
cshot[k].img=img_cshot[4];//画像番号代入(49)
}
}
}
}


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


Name:  ..上級者(23,100ポイント)   Date: 2009/09/06(日) 05:13   No:38904     
Title: Re:オプションについて    
続き


//オプションのぼんぼん計算
void calc_option_bb(){
switch(state_option){
case 0://選択
if(ch.power>=100){//パワー100以上ならオプションをつける
for(int i=0;i<5;i++){
if(CheckStatePad(configpad.slow)==0){//低速移動中じゃないなら
option_bb[i].x=ch.x+OPTION_X*(i==0 ? -1 : 1);
option_bb[i].y=ch.y+OPTION_Y+sin(PI2/150*option_bb[i].cnt)*13;
}
else{
option_bb[i].x=ch.x+OPTION_X/2*(i==0 ? -1 : 1);
option_bb[i].y=ch.y+OPTION_Y/2;
}
option_bb[i].cnt++;
}
if(option_bb[0].flag==0)
option_bb[0].flag = option_bb[1].flag = 1;
}
else{
if(option_bb[0].flag==1)
option_bb[0].flag = option_bb[1].flag = 0;
}
break;
case 1:
if(ch.power>=100){//パワー100以上ならオプションをつける
for(int i=0;i<5;i++){
//if(CheckStatePad(configpad.slow)==0){//低速移動中じゃないなら
// option_bb[i].x=ch.x0+sin(PI2/150*option_bb[i].cnt)*40;
// option_bb[i].y=ch.y0+OPTION_Y*(i==0 ? -1 : 1);
//}
//else{
// option_bb[i].x=ch.x0+OPTION_X/2*(i==0 ? -1 : 1);
// option_bb[i].y=ch.y0+OPTION_Y/2;
//}
if(CheckStatePad(configpad.slow)==0){//低速移動中じゃないなら
ch.x0 = 60 * cos(2*PI*(count%50)/50) + ch.x;
ch.y0 = 60 * sin(2*PI*(count%50)/50) + ch.y;
option_bb[i].x=ch.x0+10*(i==0 ? -1 : 1);
option_bb[i].y=ch.y0;
}
else{
ch.x0 = 20 * cos(2*PI*(count%50)/50) + ch.x;
ch.y0 = 20 * sin(2*PI*(count%50)/50) + ch.y;
option_bb[i].x=ch.x0+10/2*(i==0 ? -1 : 1);
option_bb[i].y=ch.y0+10/2;
}
option_bb[i].cnt++;
}
if(option_bb[0].flag==0)
option_bb[3].flag = option_bb[4].flag = 1;
}
else{
if(option_bb[0].flag==1)
option_bb[3].flag = option_bb[4].flag = 0;
}
break;
default:
printfDx("不明なstate_option\n");
break;
}
}


//ショット登録部
void enter_shot(){
//ショットボタンが押されていたら
if(CheckStatePad(configpad.shot)>0){
ch.shot_cnt++;
switch(state_option){
case 0://選択
if(ch.shot_cnt%3==0){//3カウントに1回
if(CheckStatePad(configpad.slow)>0)//低速移動中なら
ch1_shot_pattern();
else
ch0_shot_pattern();
}
break;
case 1:
if(ch.shot_cnt%3==0){//3カウントに1回
if(CheckStatePad(configpad.slow)>0)//低速移動中なら
ch3_shot_pattern();
else
ch2_shot_pattern();
}
break;
default:
ch.shot_cnt=0;
break;
}
}
//else
// ch.shot_cnt=0;
}

//一番近い敵を探して角度をセットする
void calc_homing(int k){
int i,d, num=-1, min=-1;
double x,y;
if(boss.flag==0){//ボスが居ない時
for(i=0;i<ENEMY_MAX;i++){//敵の総数分
if(enemy[i].flag==1){
x=(enemy[i].x-cshot[k].x);
y=(enemy[i].y-cshot[k].y);
d=(int)(x*x+y*y);//ショットと敵の距離
if(d<min || min==-1){//計算結果が最小値かまだ格納していないなら
num=i;//番号記録
min=d;//距離記録
}
}
}
}
//近い敵が見つかったら、あるいはボスがいて、HPがあるときは角度をセット、かつ描画しないフラグがオフ
if(num!=-1 || boss.flag==1 && boss.hp>0 && boss.graph_flag==0){
if(boss.flag==0){
x=enemy[num].x-cshot[k].x;
y=enemy[num].y-cshot[k].y;
}
else{
x=boss.x-cshot[k].x;
y=boss.y-cshot[k].y;
}
cshot[k].angle=atan2(y,x);
}
}

//ショットの移動計算
void calc_cshot(){
for(int i=0;i<CSHOT_MAX;i++){
if(cshot[i].flag==1){
int dranx=(int)(cshot[i].spd+11/2),drany=(int)(cshot[i].spd+55/2);
if(cshot[i].knd==1)
calc_homing(i);
cshot[i].x+=cos(cshot[i].angle)*cshot[i].spd;
cshot[i].y+=sin(cshot[i].angle)*cshot[i].spd;
cshot[i].cnt++;
if(cshot[i].x<-dranx || cshot[i].x>FMX+dranx ||
cshot[i].y<-drany || cshot[i].y>FMY+drany)//画面から外れたら
cshot[i].flag=0;
}
}
}

//キャラクタショットに関する関数
void cshot_main(){
calc_option_bb();//オプションのぼんぼん計算(49)
calc_cshot();//ショットの起動計算
if( func_state != 103){
enter_shot();//ショット登録
}
}


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

Name: チルチル  ..熟練のプログラマー(47,985ポイント)   Date: 2009/09/06(日) 12:21   No:38916     
Title: Re:オプションについて    
プログラムを読み解くのは苦手なので確信はありませんが

2つ固まってしまうなら片方の角度に+PIすれば反対側に行くんじゃないでしょうか?

画像を変えるのはstate_optionを配列の要素番号指定に使うか直接分岐すれば良いんじゃないでしょうか?


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

Name:  ..上級者(23,138ポイント)   Date: 2009/09/06(日) 13:31   No:38920     
Title: Re:オプションについて    
>>チルチルさん
片方の角度とはプログラムでいうと、どこを指しているのでしょうか?


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

Name: チルチル  ..熟練のプログラマー(48,060ポイント)   Date: 2009/09/06(日) 14:18   No:38922     
Title: Re:オプションについて    
オプションの座標を計算する三角関数の引数です

プログラムで言うと(多分)ここです

ch.x0 = 60 * cos(2*PI*(count%50)/50) + ch.x;

ch.y0 = 60 * sin(2*PI*(count%50)/50) + ch.y;


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

Name:  ..上級者(23,254ポイント)   Date: 2009/09/06(日) 14:52   No:38924     
Title: Re:オプションについて    
ch.x0 = 60 * cos(2*PI*(count%50)/50) + ch.x+PI;
ch.y0 = 60 * sin(2*PI*(count%50)/50) + ch.y+PI;
こうってことですか?
特に変わりませんでした。
というか、どれが一つのオプションを表していて、
もう一つのオプションがどれを表してるとうのがよく分かりません。

それに
option_bb[i].x=ch.x0+10*(i==0 ? -1 : 1);
等の()内のプログラムが何を言ってるのかが分からないのですが、
解説お願いしてもらえませんでしょうか?


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

Name: conio  ..熟練のプログラマー(42,215ポイント)   Date: 2009/09/06(日) 15:21   No:38926     
Title: Re:オプションについて    

@「角度を足す」のと、
A「足す角度の値を足す」のは 全然意味が違ってしまいますよ。

------------------------------------------
@x = sin(90゜+ 90゜); //x = sin(180)、 x = 0
Ax = sin(90゜) + 90; //x = 1 + 90、 x = 91
------------------------------------------

☆さんのは、@ではなく、Aを実行してます。


>>というか、どれが一つのオプションを表していて、
>>もう一つのオプションがどれを表してるとうのがよく分かりません。
プログラムはコピーペーストなのですか?
自分で書いたわけでは無いのですか?
質問内容を見ると、オプションの部分は自分で実装させようとしているように感じました。


>>option_bb[i].x=ch.x0+10*(i==0 ? -1 : 1);
>>等の()内のプログラムが何を言ってるのかが分からないのですが、
()内は条件演算子です。

iが0なら-1、そうでないなら1となります。
下記のif文と同じ動作です。
---------------------------------------
if(i==0){
option_bb[i].x=ch.x0+10*-1;
}else if(i != 0){
option_bb[i].x=ch.x0+10*1;
}
---------------------------------------


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

Name: チルチル  ..熟練のプログラマー(48,770ポイント)   Date: 2009/09/06(日) 15:35   No:38927     
Title: Re:オプションについて    
確信はありませんがfor(int i=0;i<5;i++)から察するに
オプションを5個まで出現させれるようですね
つまりi=0が1個目でi=1が2個目だと思います

ch.x0とch.y0は自機の座標から求めた原点のようですが
今回は自機が回転軸なので必要ない気がします

option_bb[i].xとoption_bb[i].yがオプションの座標のようなので


ch.x0 = 60 * cos(2*PI*(count%50)/50) + ch.x;

ch.y0 = 60 * sin(2*PI*(count%50)/50) + ch.y;

option_bb[i].x=ch.x0+10*(i==0 ? -1 : 1);

option_bb[i].y=ch.y0;


の部分を


option_bb[i].x=60*cos(PI/30*count+PI*i)+ch.x;

option_bb[i].y=60*sin(PI/30*count+PI*i)+ch.y;


に変えれば行けるかもしれません


option_bb[i].x=ch.x0+10*(i==0 ? -1 : 1);

これは多分オプションを右と左にずらしているんだと思います


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

Name:  ..上級者(23,161ポイント)   Date: 2009/09/06(日) 15:39   No:38928     
Title: Re:オプションについて    
>>conioさん
解説ありがとうございます。
なるほど、条件演算子でしたか。
最近まったく使ったことなかったのですっかり忘れてましたorz

角度を足すとはこういうことでいいでしょうか?
ch.x0 = 20 * cos(2*PI*(count%50)/50+PI) + ch.x;
ただ、これでも画像のように二つ一緒に回ってしまうのですが・


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

Name:  ..上級者(23,367ポイント)   Date: 2009/09/06(日) 15:47   No:38931     
Title: Re:オプションについて    
>>チルチルさん
おお!動きました!ありがとうございます!
ch.x0とch.y0はオプションが自機の周りをまわりながら
オプション自体も回るようにしようとしたのですが・・

あとは
オプション自体もstate_optionが1のときは
オプションの画像を変えたいのですが
多分、
if(option_bb[0].flag==0)
option_bb[3].flag = option_bb[4].flag = 1;

else{
if(option_bb[0].flag==1)
option_bb[3].flag = option_bb[4].flag = 0;

このへんがおかしいと思ってるのですが、どこが間違ってるのでしょうか?


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

Name: conio  ..熟練のプログラマー(42,503ポイント)   Date: 2009/09/06(日) 16:05   No:38932     
Title: Re:オプションについて    

---------------------------------------------------------------------------------
ini.cpp内の一部
option_bb[3].img=img_cshot[5]; //オプションボンボンの画像代入(49)
option_bb[4].img=img_cshot[5];
---------------------------------------------------------------------------------
上記のプログラムを見た限り、"img"というメンバで画像の種類を選択しているっぽいので、
とりあえず、下記の赤字の部分のようにしてみてはどうでしょうか。


------------------------------------------------------------------------------------------------
case 1:
for(int i = 0; i < 5; i++)
option_bb[i].img = //任意の画像番号を指定

if(ch.power>=100){//パワー100以上ならオプションをつける
for(int i=0;i<5;i++){
//if(CheckStatePad(configpad.slow)==0){//低速移動中じゃないなら
// option_bb[i].x=ch.x0+sin(PI2/150*option_bb[i].cnt)*40;
// option_bb[i].y=ch.y0+OPTION_Y*(i==0 ? -1 : 1);
//}
//else{
// option_bb[i].x=ch.x0+OPTION_X/2*(i==0 ? -1 : 1);
// option_bb[i].y=ch.y0+OPTION_Y/2;
//}
if(CheckStatePad(configpad.slow)==0){//低速移動中じゃないなら
ch.x0 = 60 * cos(2*PI*(count%50)/50) + ch.x;
ch.y0 = 60 * sin(2*PI*(count%50)/50) + ch.y;
option_bb[i].x=ch.x0+10*(i==0 ? -1 : 1);
option_bb[i].y=ch.y0;
}
else{
ch.x0 = 20 * cos(2*PI*(count%50)/50) + ch.x;
ch.y0 = 20 * sin(2*PI*(count%50)/50) + ch.y;
option_bb[i].x=ch.x0+10/2*(i==0 ? -1 : 1);
option_bb[i].y=ch.y0+10/2;
}
option_bb[i].cnt++;
}
if(option_bb[0].flag==0)
option_bb[3].flag = option_bb[4].flag = 1;
}
else{
if(option_bb[0].flag==1)
option_bb[3].flag = option_bb[4].flag = 0;
}
break;
------------------------------------------------------------------------------------------------


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

Name:  ..上級者(23,712ポイント)   Date: 2009/09/06(日) 17:05   No:38936     
Title: Re:オプションについて    
>>conioさん
あの・・
graph.cpp内はこうなってるのですが・・



//自機ショット描画
void graph_cshot(){
for(int i=0;i<CSHOT_MAX;i++){
if(cshot[i].flag>0){
DrawRotaGraphFdF(cshot[i].x,cshot[i].y,1,cshot[i].angle+PI/2,cshot[i].img,TRUE);
}
}
for(int i=0;i<5;i++){//オプション(49)
if(option_bb[i].flag>0){
DrawRotaGraphFdF(option_bb[i].x,option_bb[i].y,1.0,2.0*PI*(count%120)/120,option_bb[i].img,TRUE);
}
}
}


ここの部分は
if(option_bb[0].flag==0)
option_bb[3].flag = option_bb[4].flag = 1;
}
else{
if(option_bb[0].flag==1)
option_bb[3].flag = option_bb[4].flag = 0;
コメントアウトするということでしょうか?





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

Name:  ..上級者(24,010ポイント)   Date: 2009/09/06(日) 17:17   No:38937     
Title: Re:オプションについて    
すみません。質問を間違えてました。

if(option_bb[0].flag==0)
option_bb[3].flag = option_bb[4].flag = 1;
}
else{
if(option_bb[0].flag==1)
option_bb[3].flag = option_bb[4].flag = 0;
にしたら
state_option=1のときはちゃんとオプションが描画されてるのですが
state_option=0のときにもstate_option=1と同じオプションが一緒に描画されてしまうバグが
起こってしまいます。state_option=0は
if(option_bb[0].flag==0)
option_bb[0].flag = option_bb[1].flag = 1;
}
else{
if(option_bb[0].flag==1)
option_bb[0].flag = option_bb[1].flag = 0;
だけ表示するようにしたいです





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

Name: conio  ..熟練のプログラマー(43,418ポイント)   Date: 2009/09/06(日) 18:39   No:38943     
Title: Re:オプションについて    

まず、"オプション"のシステムが曖昧なので確認してみます。

"オプション"というのは
-----------------------
@ 0番と1番と2番を描画
A 3番と4番と2番を描画
-----------------------
の2種類があり、それらは排他的と言うことでしょうか?
(@とA、どちらか一方しか描画しない。case 0,case 1で分岐させる事により実装。)


それともう一つ。
@とAの状態遷移は複数回起こるものなのですか?
(@→A→@→A→@・・・)


とりあえず、
【1】オプションは2種類あり、排他的。
【2】オプション@になったり、オプションAになったりする
という条件で考えると、下記の様にすればよいと思います。
--------------------------------------------------------
switch(state_option){
case 0:
if(攻撃力 >= 100){
if(オプション0番が付いていなければ)
オプション0番と1番を描画するフラグを立てる。
}else{
if(オプション0番が付いていれば)
オプション0番と1番を描画フラグを消す。
}
break;
case 1:
if(攻撃力 >= 100){
if(オプション3番が付いていなければ)
オプション3番と4番を描画するフラグを立てる。
}else{
if(オプション3番が付いていれば)
オプション3番と4番を描画フラグを消す。
}
break;
}
--------------------------------------------------------
※状態遷移する際は現在描画されているオプションの描画フラグを0に戻して下さい。


で、オプション@とオプションAで画像を変えたいのであれば、
下記の様に初期化しておけば良いと思います。
-------------------------------------
option_bb[0].img = //任意の画像番号A
option_bb[1].img = //任意の画像番号A

option_bb[3].img = //任意の画像番号B
option_bb[4].img = //任意の画像番号B
-------------------------------------


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

Name:  ..上級者(23,851ポイント)   Date: 2009/09/07(月) 22:44   No:38985     
Title: Re:オプションについて    
>>conioさん
>状態遷移する際は現在描画されているオプションの描画フラグを0に戻して下さい
これを見事に初期化するのを忘れていたために発生したバグであることが分かりました。
助かりました。ありがとうございました。

それと、もうちょっと聞きたいことがあるのですが
パワーが300〜400のときに添付した画像のように
三角の形でまわしたいのですが、三角の形がどうしてもできません。
どのようにしたらいいのでしょうか?


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

Name: チルチル  ..熟練のプログラマー(49,067ポイント)   Date: 2009/09/07(月) 23:01   No:38986     
Title: Re:オプションについて    
三角関数は早くマスターした方が良いですよ

option_bb[i].x=60*cos(PI/30*count+PI2/3*i)+ch.x;

option_bb[i].y=60*sin(PI/30*count+PI2/3*i)+ch.y;

で行けると思います、全方位ショットと同じような感じです


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

Name:  ..上級者(23,880ポイント)   Date: 2009/09/08(火) 00:42   No:38987     
Title: Re:オプションについて    
あの、オプション自体を一つ増やすにはどこのプログラムが関係して
どの部分を変更すればいいのでしょうか?


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

Name: conio  ..熟練のプログラマー(43,602ポイント)   Date: 2009/09/08(火) 02:06   No:38989     
Title: Re:オプションについて    
"option_bb"を増やせば良いのではないでしょうか。
何処にあるのかは知りませんが、恐らくoption_bb[5];みたいになっていると思います。
(for文の繰り返し回数から判断。)

そのオプションの配列を増やせば良いのではないのかと。


あと、プログラムを把握できていないままどんどん開発を進めようとすると、
どんどんゴチャゴチャになって訳が分からなくなる可能性が高いですので、
一旦、プログラムがどういう構造になっているのか、どの変数が何を定義しているのか
などを確実に理解してから 進める事をお勧めします。


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

Name: チルチル  ..熟練のプログラマー(49,128ポイント)   Date: 2009/09/08(火) 14:23   No:38998     
Title: Re:オプションについて    
現時点でも5個用意してあるようなので
option_bb[2].flag=1;
で3個目が使えるんじゃないでしょうか?
0番と1番のフラグを立てている所に追加するのが一番ですが・・


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



Name: 未来  ..ぴよぴよ(13ポイント)   Date: 2009/09/07(月) 03:13   No:38967       
Title: 黄色に何を混ぜたら灰色になるか    
あまりC言語に関係ない質問ですが
SetDrawBrightを使ってるうちにぶち当たった壁です。
だれか知っていましたら教えてください


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,053,922ポイント)   Date: 2009/09/07(月) 06:44   No:38970     
Title: Re:黄色に何を混ぜたら灰色になるか    
RGBの値が全て同じだとモノクロになります。
モノクロのうち、(0,0,0)に近ければ黒く、(255,255,255)に近ければ白くなります。
ですからどの程度かによりますが、「灰色」っぽいのは(128,128,128)位ではないでしょうか?
黄色が
(255,255,0)
だとし、各色を表す変数をR,G,Bとすると、
(R-128,G-128,B+128)
これで灰色になるのでは無いかと思います。


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

Name: 未来  ..ぴよぴよ(43ポイント)   Date: 2009/09/08(火) 07:39   No:38991 解決!     
Title: Re:黄色に何を混ぜたら灰色になるか    
Dixq (管理人)さんありがとうございました。
おかげで解決することできました


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



Name: mik  ..ぴよぴよ(290ポイント)   Date: 2009/09/05(土) 23:54   No:38878       
Title: レーザーを飛ばしたい    
こんばんは。mikです。
龍神録プログラミングの館のレーザーを弾幕のように飛ばすにはどのようにすればいいんでしょうか?
また、欲を言えば星蓮船で出たぐにゃぐにゃと曲がるレーザーもつくってみたいんですが、実装することはできるんでしょうか?
教えてください!

よろしくおねがいします。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,052,083ポイント)   Date: 2009/09/06(日) 04:01   No:38892     
Title: Re:レーザーを飛ばしたい    
直線で飛ばすことも出来ますし、ぐにゃぐにゃも出来ますよ。

まずは直線で飛ばしてみましょう。
・・といっても特に難しいことをする必要はなく、
「レーザー」というより「小さな弾の集合」だと思えば楽です。
加算ブレンドすると弾と弾との結合部分は継ぎ目がなくなりますので一本のレーザーに見えます。
長細い弾を作ってみて、それを連続で飛ばしてみてください。

レーザーについてはもっとよい実装方法があるかもしれませんが、
差し当たり連続で撃って加算ブレンドするだけでもそれっぽく見えますよ。


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

Name: mik  ..ぴよぴよ(414ポイント)   Date: 2009/09/06(日) 22:54   No:38962     
Title: Re:レーザーを飛ばしたい    
回答ありがとうございます!
早速弾を重ねて、加算ブレンドをしてレーザーのようにみせようとおもったんですが、
肝心の弾の撃ち方がわかりません。
東方のように真ん中が少し膨らんだ感じのレーザーをつくってみたいんですが、
どうすればできるでしょうか?

よろしくお願いします。


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

Name: チルチル  ..熟練のプログラマー(48,879ポイント)   Date: 2009/09/07(月) 18:06   No:38981     
Title: Re:レーザーを飛ばしたい    
弾を重ねると全体が同じ太さになってしまうと言う事でしょうか?
画像を引き伸ばすのが一番簡単だと思いますが
龍神録のレーザーだとすると全体に対しての位置で幅を変えれば良いんじゃないでしょうか?


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

Name: mik  ..ぴよぴよ(509ポイント)   Date: 2009/09/07(月) 20:37   No:38982     
Title: Re:レーザーを飛ばしたい    
回答ありがとうございます!
弾をひきのばしたらレーザーのようになりました!
ありがとうございます!
もう一方のぐにゃぐにゃレーザーはどうやったら実装できるのでしょうか?
何度も質問してすいませんm(_ _)m


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

Name: チルチル  ..熟練のプログラマー(49,006ポイント)   Date: 2009/09/07(月) 20:50   No:38983     
Title: Re:レーザーを飛ばしたい    
過去ログでも色々ありましたが

「引き伸ばし型」で「曲がる」レーザーは無かった気がしますね・・

もう一方と言う事は曲がる方は弾を並べる方法でもOKなんですか?
その場合は弾を並べれば行けると思いますが
引き伸ばして曲げる場合は最近そういう話をしたので過去ログを

http://www.play21.jp/board/formz.cgi?action=res&resno=38458&page=&lognum=118&id=dixq&rln=38530

参考にはならないと思いますが、結構手間が掛かると言う事は伝わるかと・・


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

Name: mik  ..ぴよぴよ(531ポイント)   Date: 2009/09/07(月) 21:03   No:38984 解決!     
Title: Re:レーザーを飛ばしたい    
ぐにゃぐにゃレーザーは難しそうなのでやめておきます;
でもお二方のおかげでレーザーをつくることができました!
ありがとうございました!


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



Name: マウ  ..かけだし(1,304ポイント)   Date: 2009/08/31(月) 10:23   No:38651       
Title: 処理が重くなっていく    
オプション画面で選択した画像を何回か選んでいるとどんどん動きが重くなるのはどうしてでしょうか?
あと矢印キーとZで選択したいのですがどうすればいいのでしょうか?
作成したプログラムをんのせます。

#include "DxLib.h"
int function_status=0,White;
char KeyBuf[ 256 ] ;
void Menu();
void Games();
void Option();
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
SetWindowText("Defend the fish!!");
SetGraphMode( 800 , 600 , 32 ) ;
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
White = GetColor( 255 , 255 , 255 ) ; //色の取得
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
while( 1 ){
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( KeyBuf ) ; // すべてのキーの状態を得る
switch(function_status){
case 0:
Menu();
break;
case 1:
Games();
break;
case 2:
Option();
break;
case 3:
Menu();
break;
case 4:
Option();
LoadGraphScreen( 410 , 50 , "EN1.bmp" , TRUE ) ;
break;
case 5:
Option();
LoadGraphScreen( 410 , 50 , "EN2.bmp" , TRUE ) ;
break;
case 6:
Option();
LoadGraphScreen( 410 , 50 , "EN3.bmp" , TRUE ) ;
break;
case 7:
Option();
LoadGraphScreen( 410 , 50 , "EN4.bmp" , TRUE ) ;
break;
default:
DxLib_End() ; // DXライブラリ使用の終了処理
return 0;
break;
}
if( ProcessMessage() == -1 ) break ; //エラーが起きたら終
ScreenFlip() ; // 裏画面データを表画面へ反映
}
DxLib_End();
return 0;
}

void Menu(){
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "back1.bmp" ) ; //back1.bmpのハンドルを代入
DrawGraph( 0 , 0 , image , FALSE ) ; //画像を表示
SetFontSize( 50 ) ; //サイズを30に変更
SetFontThickness( 10 ) ; //太さを8に変更
ChangeFont( "MS 明朝" ) ; //種類をMS明朝に変更
ChangeFontType( DX_FONTTYPE_ANTIALIASING ); //アンチエイリアスフォントに変更
DrawString(200,200,"Defend the fish!!",GetColor(0,0,0));
SetFontSize( 20 ) ;
DrawString(320,310,"スタート(S)",GetColor(0,0,0));
if(KeyBuf[KEY_INPUT_S]==1)
function_status=1;
DrawString(320,360,"オプション(O)",GetColor(0,0,0)); //サイズを20に変更
if(KeyBuf[KEY_INPUT_O]==1)
function_status=2;
DrawString(320,410,"終了(E)",GetColor(0,0,0));
if(KeyBuf[KEY_INPUT_E]==1)
function_status=8;
}
void Games(){
if(KeyBuf[KEY_INPUT_R]==1)
function_status=3;
}
void Option(){
int White,Red,G_Blue;
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "back1.bmp" ) ; //back2.bmpのハンドルを代入
DrawGraph( 0 , 0 , image , FALSE ) ; //画像を表示
White = GetColor( 0 , 0 , 0 ) ; // 白色の値を取得
Red = GetColor( 255 , 0 , 0 ) ; // 赤色の値を取得
G_Blue = GetColor( 0 , 255 , 255 ) ; // 緑と青の混合色の値を取得
DrawBox ( 720 , 50 , 410 , 400 , White , FALSE) ; // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
DrawBox ( 30 , 50 , 400 , 200 , White , FALSE) ; // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)

DrawString(60,60,"カスタム1(キー1)",White);
if(KeyBuf[KEY_INPUT_1]==1)
function_status=4;
DrawString(60,90,"カスタム2(キー2)",White);
if(KeyBuf[KEY_INPUT_2]==1)
function_status=5;
DrawString(60,120,"カスタム3(キー3)",White);
if(KeyBuf[KEY_INPUT_3]==1)
function_status=6;
DrawString(60,150,"カスタム4(キー4)",White);
if(KeyBuf[KEY_INPUT_4]==1)
function_status=7;
DrawString(160,250,"変更",White);
DrawString(660,560,"もどる(R)",White);
if(KeyBuf[KEY_INPUT_R]==1)
function_status=3;
}






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


Name: 羽流布 [URL]  ..中級者(12,445ポイント)   Date: 2009/08/31(月) 10:38   No:38652     
Title: Re:処理が重くなっていく    
初の回答してみようかな(;^^

えっと・・・
詳しくは見てないですが、Menu()関数の中でLoadGraph()関数を何回も呼び出しているのは問題ですね。
初期化の際に1回呼び出せば十分です。

> あと矢印キーとZで選択したいのですがどうすればいいのでしょうか?

カーソル位置を記憶しておく変数を用意して、矢印キーが押されるたびにそれを変更すればいいです。
で、Zが押された場合にカーソル位置に応じて処理を振り分けると良いかと。。。


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

Name: kazuoni [URL]  ..ハッカー(102,779ポイント)   Date: 2009/08/31(月) 10:40   No:38653     
Title: Re:処理が重くなっていく    
まず、毎ループLoadGraphScreen
はしないほうがよいようです。処理的に重くなるらしいです。
(試したことがないのではっきりとは言えませんが・・・。)
毎ループ描写するものは、LoadGraphにして、イメージハンドルを生成
してから描写するとよいかと思います。

あとMenu,Optionなどの関数に入ると、どの関数でも、
LoadGraphしています。そのハンドルで初期化している変数はローカル変数なので、
スコープ(関数)を抜けると、使えなくなります。
再度関数に入ったとき、またイメージハンドルが作られ、初期化としているので、
イメージハンドルは毎ループ「放り投げられる」わけです。
これがメモリに蓄積されるので、重くなるのでしょう。

いろいろ解決策がありますが、イメージ管理はグローバル変数にして、
初期化の関数を作り、あらかじめ生成しておくなどなど。


>あと矢印キーとZで選択したいのですがどうすればいいのでしょうか?
二つのキーの入力の論理積を取ればよいです。

Key[KEY_INPUT_Z] && Key[KEY_INPUT_矢印]
みたいにですね。


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

Name: マウ  ..かけだし(1,398ポイント)   Date: 2009/08/31(月) 12:07   No:38660     
Title: Re:処理が重くなっていく    
コメントありがとうございます。

すいませんが、勉強不足でよくわからないのですがくわしく教えてもらえないでしょうか。


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

Name: kazuoni [URL]  ..ハッカー(103,044ポイント)   Date: 2009/08/31(月) 12:24   No:38661     
Title: Re:処理が重くなっていく    
何を詳しく教えたらよいのでしょうか?

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

Name: 羽流布 [URL]  ..中級者(10,700ポイント)   Date: 2009/08/31(月) 14:04   No:38662     
Title: Re:処理が重くなっていく    
既にkazuoniさんが書かれている通りなのですが・・・(汗)
何もないのもアレなので、
kazuoniさんの回答を参考に昼飯前に書いてみました。
実行できる環境がないのでテストはしていませんが、
参考にしてみてください^^


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

int function_status;
int White, Red, G_Blue;
int hFont;/*追加*/
int hFontS;/*追加*/
int menuImg;/*追加*/
int optionImg;/*追加*/
int enImg[4];/*追加*/
int cursorPos;/*追加*/
char KeyBuf[256];

void init();/*追加*/
void setState( int );/*追加*/
void Menu();
void Games();
void Option();

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// 初期化
init();

while( 1 )
{
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( KeyBuf ); // すべてのキーの状態を得る
switch( function_status )
{
case 0: Menu(); break;
case 1: Games(); break;
case 2: Option(); break;
case 3: Menu(); break;
case 4: Option(); DrawGraph( 410, 50, enImg[0], TRUE ); break;
case 5: Option(); DrawGraph( 410, 50, enImg[1], TRUE ); break;
case 6: Option(); DrawGraph( 410, 50, enImg[2], TRUE ); break;
case 7: Option(); DrawGraph( 410, 50, enImg[3], TRUE ); break;
// DXライブラリ使用の終了処理
default: DxLib_End(); return 0;
}
if( ProcessMessage() == -1 ) break; // エラーが起きたら終了
ScreenFlip(); // 裏画面データを表画面へ反映
}
DxLib_End();
return 0;
}

void init()/*追加*/
{
ChangeWindowMode( TRUE ); // ウィンドウモードに変更
SetWindowText( "Defend the fish!!" );
SetGraphMode( 800, 600, 32 );
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
White = GetColor( 0, 0, 0 ); // 白色の値を取得
Red = GetColor( 255, 0, 0 ); // 赤色の値を取得
G_Blue = GetColor( 0, 255, 255 ); // 緑と青の混合色の値を取得
SetDrawScreen( DX_SCREEN_BACK ); // 描画先を裏画面に設定
hFont = CreateFontToHandle( "MS 明朝", 50, 10, DX_FONTTYPE_ANTIALIASING );/*追加*/
hFontS = CreateFontToHandle( "MS 明朝", 20, 10, DX_FONTTYPE_ANTIALIASING );/*追加*/
menuImg = LoadGraph( "back1.bmp" );/*追加*/
optionImg = LoadGraph( "back1.bmp" );/*追加*/
for( int i = 0; i < 4; ++i )/*追加*/
{
char[16] name;
sprintf( name, "EN%d.bmp", i + 1 );
enImg[i] = LoadGraph( name );
}
function_status = 0;
}

void setState( int state )/*追加*/
{
function_status = state;
cursorPos = 0;
}

void Menu()
{
DrawGraph( 0, 0, menuImg, FALSE ); // 画像を表示
DrawStringToHandle( 200, 200, "Defend the fish!!", White, hFont );
DrawStringToHandle( 320, 310, "スタート(S)", White, hFontS );
if( KeyBuf[KEY_INPUT_S] == 1 )
setState( 1 );
DrawStringToHandle( 320, 360, "オプション(O)", White ); // サイズを20に変更
if( KeyBuf[KEY_INPUT_O] == 1 )
setState( 2 );
DrawStringToHandle( 320, 410, "終了(E)", White );
if( KeyBuf[KEY_INPUT_E] == 1 )
setState( 8 );
}

void Games()
{
if( KeyBuf[KEY_INPUT_R] == 1 ) setState( 3 );
}

void Option()
{
DrawGraph( 0, 0, optionImg, FALSE ); // 画像を表示
DrawBox( 720, 50, 410, 400, White, FALSE ); // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
DrawBox( 30, 50, 400, 200, White, FALSE ); // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)

DrawStringToHandle( 60, 60, "カスタム1(キー1)", White, hFont );
if( KeyBuf[KEY_INPUT_1] == 1 )
setState( 4 );
DrawStringToHandle( 60, 90, "カスタム2(キー2)", White, hFont );
if( KeyBuf[KEY_INPUT_2] == 1 )
setState( 5 );
DrawStringToHandle( 60, 120, "カスタム3(キー3)", White, hFont );
if( KeyBuf[KEY_INPUT_3] == 1 )
setState( 6 );
DrawStringToHandle( 60, 150, "カスタム4(キー4)", White, hFont );
if( KeyBuf[KEY_INPUT_4] == 1 )
setState( 7 );
DrawStringToHandle( 160, 250, "変更", White, hFont );
DrawStringToHandle( 660, 560, "もどる(R)", White, hFont );
if( KeyBuf[KEY_INPUT_R] == 1 )
setState( 3 );

// カーソル移動処理
const int HEAD = 0;
const int TAIL = 4;
if( KeyBuf[KEY_INPUT_UP] == 1 )
cursorPos = (cursorPos == HEAD) ? TAIL : (cursorPos - 1);
else if( KeyBuf[KEY_INPUT_DOWN] == 1 )
cursorPos = (cursorPos == TAIL) ? HEAD : (cursorPos + 1);

// 決定処理
if( KeyBuf[KEY_INPUT_Z] == 1 )
{
switch( cursorPos )
{
case 0: setState( 4 ); break;
case 1: setState( 5 ); break;
case 2: setState( 6 ); break;
case 3: setState( 7 ); break;
case 4: setState( 3 ); break;
//
default: break;
}
}
}


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

Name: マウ  ..かけだし(1,436ポイント)   Date: 2009/09/07(月) 12:16   No:38972 解決!     
Title: Re:処理が重くなっていく    
コメントありがとうございました。完全には動作しませんでしたが、自分で変えていきたいと思います。

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



Name: UKONN  ..かけだし(1,460ポイント)   Date: 2009/09/06(日) 16:23   No:38933       
Title: 無題    
初歩的な質問させてください。
手違いで、プログラムを書く下の出力結果(ブレークポイントの結果表示など)の出るツールバーみたいなのが消えてしまいました。
どのようにしたらもう一度出現させることができますか?
初歩的な質問ですがよろしくお願いします。


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


Name: T.C.D  ..かけだし(1,295ポイント)   Date: 2009/09/06(日) 18:03   No:38939     
Title: Re:無題    
何のソフトでどのような開発環境かを言わないと、まったく分かりません。
規約のとおり、もっと詳しく教えてくださらないと困ります。

まあ、もしVC++2008であれば、メニュー > 表示 の出力ウィンドウ
のことかと思いますが。


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

Name: UKONN  ..かけだし(1,710ポイント)   Date: 2009/09/06(日) 18:33   No:38941     
Title: Re:無題    
具体的でなくてすいません。ただ文章として表現するのが難しいです。
自分は、VC++2008を使いプログラム内にブレークポイントを使って計算結果を出力していました。
しかし、何かの手違いでプログラムの下に表示される出力結果が出る部分の右上に表示される×をクリックしてしまい、出力結果が出る部分が消えてしまいました。
もう一度出てくるようにいろいろ試行錯誤したのですができません。
出力をクリックして出せたとしてもプログラム下部に固定することができません。

初心者です。よろしくお願いします。


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

Name: MNS  ..中級者(14,976ポイント)   Date: 2009/09/06(日) 18:36   No:38942     
Title: Re:無題    
出力ウィンドウを表示させ、
そのタイトル部分を右クリックします。
ドッキング可能の部分にチェックを入れ、
GUIの下部にもっていけば、固定することが出来るはずです。


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

Name: T.C.D  ..かけだし(1,303ポイント)   Date: 2009/09/06(日) 18:45   No:38944     
Title: Re:無題    
出力をクリックした後、ウィンドウ枠内で右クリックし、

コンテキストメニューが出たら「ドッキング可能」を選択してください。
おそらく「フローティング」になっていたと思います。
その後、ウィンドウ枠をドラッグし、下の方の矢印のついた小さな枠の所にドロップしてください。

そうすれば元通りになると思います。

また、エラー一覧なども同じウィンドウ内に復元したい場合、同じようにドッキング可能にし、復元した出力ウィンドウの中央にドロップすればできます。


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

Name: UKONN  ..かけだし(1,732ポイント)   Date: 2009/09/06(日) 23:20   No:38965     
Title: Re:無題    
MNS さん、T.C.D さんありがとうございます。
試してみます。


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



Name: 狼太郎  ..入門者(3,289ポイント)   Date: 2009/09/06(日) 19:54   No:38947       
Title: ClearDrawScreenが効かない    
非常に初歩的な質問かもしれませんが・・

#include"DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return -1;
char KEY[256];
SetDrawScreen(DX_SCREEN_BACK);
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(KEY) && !KEY[KEY_INPUT_ESCAPE]){
int pointX;
int pointY;
GetMousePoint(&pointX,&pointY);
printfDx("%d",pointX);
printfDx("%d",pointY);
ScreenFlip();
}
DxLib_End();
return 0;
}

このプログラムを実行すると画面がクリアされずに、マウスの座標が延々と画面に表示されつづけてしまいます。
ClearDrawScreen関数が効いてないのでしょうか?


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


Name: MNS  ..上級者(15,038ポイント)   Date: 2009/09/06(日) 19:56   No:38948     
Title: Re:ClearDrawScreenが効かない    
printfDxは簡易出力関数なので、他の文字描画関数とは異なり、
ClsDrawScreenやClearDrawScreenではクリアされません。
これをクリアしたければ、clsDx関数を使用します。


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

Name: 狼太郎  ..入門者(3,262ポイント)   Date: 2009/09/06(日) 21:15   No:38953 解決!     
Title: Re:ClearDrawScreenが効かない    
回答ありがとうございます!
そうだったんですか・・・覚えておきます


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



Name: situmon  ..熟練のプログラマー(41,752ポイント)   Date: 2009/08/28(金) 17:24   No:38543       
Title: フェードイン、フェードアウトの作り方    
ゲームプログラミングの館を見て実装しようとしたのですが、うまくいきませんでした。
どのように実装すればいいのでしょうか?ゲームに応用するのができません。
とくに選択画面で選択したときにどうすればいいのでしょう?


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


Name: kazuoni [URL]  ..ハッカー(101,873ポイント)   Date: 2009/08/28(金) 17:50   No:38544     
Title: Re:フェードイン、フェードアウトの作り方    
どのようにうまくいかないか、もう少し具体的に書いたほうが
より詳しい回答が得られるかと思います。

本家にも参考がでていますが、
これでは不備があるでしょうか?

DXライブラリ置き場
ttp://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N9


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

Name: situmon  ..熟練のプログラマー(41,942ポイント)   Date: 2009/08/28(金) 18:08   No:38545     
Title: Re:フェードイン、フェードアウトの作り方    
えっと選択画面をswitch形式にしているのですが

switch(choose_y){
case 80:

if( CheckSoundMem( bgm[5] ) == 1 )
StopSoundMem( bgm[5] ) ;
if( CheckSoundMem( sound_effect[6] ) == 0 )
PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ;
main_flag=2;
if(stage_flag!=1)
stage_flag=1;
break;
...省略
}

としているのですが、この選んでからゲームが始まるまでに(main_flag=2になるまでに)フェードインなどをしたいのです。


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

Name: kazuoni [URL]  ..ハッカー(101,909ポイント)   Date: 2009/08/28(金) 18:30   No:38546     
Title: Re:フェードイン、フェードアウトの作り方    
とりあえずやっつけに書いてみました。

back.pngは自分で用意してください^^;
参考になるかどうか微妙ですが・・・。


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

Name: チルチル  ..熟練のプログラマー(47,806ポイント)   Date: 2009/08/28(金) 20:57   No:38547     
Title: Re:フェードイン、フェードアウトの作り方    
私の経験ですがフェードイン、フェードアウトは関数化しておくと後でかなり楽になります
前に送ったサンプルのSceneChange関数が参考になるかもしれません

1.ZとかXが押された時にカウンタをリセットして
2.カウンタでフェードイン
3.カウンタが半分まで進んだら画面を変える
4.カウンタでフェードアウト

この流れでどうでしょうか?
まあこれだけだと入力関係が不十分ですが・・


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

Name: situmon  ..熟練のプログラマー(42,087ポイント)   Date: 2009/08/29(土) 20:24   No:38576     
Title: Re:フェードイン、フェードアウトの作り方    

// フェードイン処理
for(int i = 0 ; i < 256 ; i++ )
{
// 描画輝度をセット
SetDrawBright( 255 - i , 255 - i , 255 - i ) ;

if(i==255){
if( CheckSoundMem( sound_effect[6] ) == 0 )
PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ;

WaitTimer( 200 ) ;//0.2秒待つ
main_flag=2;
player.easy_flag=0;
player.hard_flag=0;
if(stage_flag!=4)
stage_flag=4;
}
}

としたのですが、なぜか失敗してしまいます。
追記
失敗というのは真っ暗のままになってしまうのです。


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

Name: kazuoni [URL]  ..ハッカー(102,012ポイント)   Date: 2009/08/29(土) 21:09   No:38578     
Title: Re:フェードイン、フェードアウトの作り方    
このfor文のなかにScreenFlip的な、
表描写もDraw系もないので、
このfor文を抜けるときには、輝度は0で、真っ暗かと思います。

コード全部が載っていないので、あくまで予想ですが・・・。


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

Name: situmon  ..熟練のプログラマー(43,358ポイント)   Date: 2009/08/30(日) 09:20   No:38597     
Title: Re:フェードイン、フェードアウトの作り方    

#include "DxLib.h"
#include "Extern.h"

void Title_Draw(){
if(bgm_select_flag!=0 ||stage_flag!=0){
stage_flag=0;
bgm_select_flag=0;
}
DrawGraph( 0 , 0 , title_img , FALSE );

DrawStringToHandle( 20 , 420 , "タイトル" , white , font[2] );
DrawStringToHandle( 460 , 420 , "Ver 1.00 (test) " , white , font[3] );

DrawGraph( 50 , 100 , title_d_img[0] , TRUE );
DrawGraph( 50 , 156 , title_d_img[2] , TRUE );
DrawGraph( 50 , 212 , title_d_img[1] , TRUE );
DrawGraph( 10 , title_y+16 , title_d_img[3] , TRUE );

//上キー
if( CheckHitKey( KEY_INPUT_UP ) == 1 && t_count%5==0 ){
if( CheckSoundMem( sound_effect[0] ) == 0 )
PlaySoundMem( sound_effect[0] , DX_PLAYTYPE_BACK ) ;
if(title_y>100){
if(title_y==212&&clear_flag==0)
title_y-=112;
else
title_y-=56;
}
}
//下キー
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 && t_count%5==0 ){
if( CheckSoundMem( sound_effect[0] ) == 0 )
PlaySoundMem( sound_effect[0] , DX_PLAYTYPE_BACK ) ;
if(title_y<212){
if(title_y==100&&clear_flag==0)
title_y+=112;
else
title_y+=56;
}
}
//escapeキー
if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1){
if( CheckSoundMem( sound_effect[0] ) == 0 )
PlaySoundMem( sound_effect[0] , DX_PLAYTYPE_BACK ) ;
if(title_y!=212)
title_y=212;
}

if( CheckHitKey( KEY_INPUT_Z ) == 1 || CheckHitKey( KEY_INPUT_RETURN ) == 1 ){
switch(title_y){
case 100:
if( CheckSoundMem( sound_effect[6] ) == 0 )
PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ;

WaitTimer( 200 ) ;//0.2秒待つ
main_flag=1;
break;
case 156:

if( CheckSoundMem( bgm[5] ) == 1 )
StopSoundMem( bgm[5] ) ;

if( CheckSoundMem( sound_effect[6] ) == 0 )
PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ;

WaitTimer( 200 ) ;//0.2秒待つ
main_flag=2;
player.easy_flag=0;
player.hard_flag=0;
if(stage_flag!=4)
stage_flag=4;
break;
case 212:
if( CheckSoundMem( sound_effect[6] ) == 0 )
PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ;

DxLib_End(); //終了
break;
default:
break;
}
}
}

となっていますが、
このfor文のなかにScreenFlip的な
>main.cppで書いているのですが・・・
表描写もDraw系もないので、
>ここにまた
DrawGraph( 50 , 100 , title_d_img[0] , TRUE );
DrawGraph( 50 , 156 , title_d_img[2] , TRUE );
DrawGraph( 50 , 212 , title_d_img[1] , TRUE );
DrawGraph( 10 , title_y+16 , title_d_img[3] , TRUE );
とかくのでしょうか??


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

Name: situmon  ..熟練のプログラマー(43,894ポイント)   Date: 2009/08/30(日) 09:59   No:38598     
Title: Re:フェードイン、フェードアウトの作り方    

switch(title_y){
case 100:
if( CheckSoundMem( sound_effect[6] ) == 0 )
PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ;
for(int i=0;i<256;i+=4){
// 描画輝度をセット
SetDrawBright( 255 - i , 255 - i , 255 - i ) ;
DrawGraph( 0 , 0 , title_img , FALSE );
ScreenFlip() ;
}
for(int i=0;i<256;i++){
// 描画輝度をセット
SetDrawBright( i , i , i ) ;
DrawGraph( 0 , 0 , title_img , FALSE );
ScreenFlip() ;
if(i==255){
main_flag=1;
}
}
break;

とすることにより実装できましたが考え的には、
DrawGraph( 0 , 0 , title_img , FALSE );

DrawGraph( 50 , 100 , title_d_img[0] , TRUE );

DrawGraph( 50 , 156 , title_d_img[2] , TRUE );

DrawGraph( 50 , 212 , title_d_img[1] , TRUE );

DrawGraph( 10 , title_y+16 , title_d_img[3] , TRUE );

で描いた(映した)画像の上にまた新たにまたDrawGraph( 0 , 0 , title_img , FALSE );
で同じ画像を描いているわけだと思うのですが、これでいいのですか?


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

Name: kazuoni [URL]  ..ハッカー(102,212ポイント)   Date: 2009/08/30(日) 20:32   No:38626     
Title: Re:フェードイン、フェードアウトの作り方    
確かに、反映されているので、それで成功するかと思います。
ただ、プログラムの各所に表描写反映(ScreenFlip)を書くと、
いつか、管理しにくくなってくるかと思います。
なので、反映する関数はmainループに一度だけ書くことをお勧めします。

>描いた(映した)画像の上にまた新たにまたDrawGraph( 0 , 0 , title_img , FALSE );
>で同じ画像を描いているわけだと思うのですが、これでいいのですか?

プログラムは上から流れてきますので、そうですね。
裏描写のクリアもしていないので、Drawするたびに、上書きしていっています。


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

Name: situmon  ..熟練のプログラマー(43,975ポイント)   Date: 2009/08/31(月) 21:18   No:38677     
Title: Re:フェードイン、フェードアウトの作り方    
その場合、どうすればいいのでしょう。
それだけ消すのか、そのままでは問題ないのでしょうか?
自分の考えではDrawするたび少しですが、パソコンに、負担がかかると思うのですが。


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

Name: kazuoni [URL]  ..ハッカー(103,405ポイント)   Date: 2009/09/01(火) 09:33   No:38689     
Title: Re:フェードイン、フェードアウトの作り方    
>その場合、どうすればいいのでしょう。
>それだけ消すのか、そのままでは問題ないのでしょうか?

「その場合」がどの場合で、それだけの「それ」がどれかはっきり分かりませんが、
確かに、画面内に動きがない場合はこれでも画面のフェードインアウトはいいと思います。
ただ、もし、次に、キャラクターがぐるぐるフィールド上を
回っている最中にフェードアウトし、フェードインでは次の場面にしたい
なんてなった場合、この書き方では使えないですよね?
なので、根本的な見直しをする必要があるかと思います。

>自分の考えではDrawするたび少しですが、パソコンに、負担がかかると思うのですが。
それはそのとおりです。

ちょっと勘違いをしているかもしれないので付け加えを。
「裏描写の内容は動きのないものだから、一回描写して、
あとはSetDrawBrightで輝度を下げればいいんじゃないの?」
ってことを言いたいのでは?と勝手に決め打ちしますが、
SetDrawBrightはあくまで、描写のモードを決めるだけであって、
今裏描写にあるものの輝度とは別物です。
この関数を読んだ以降のDrawはすべてSetDrawBrightで決めた輝度にセットしますよ
ってな感じです。


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

Name: situmon  ..熟練のプログラマー(44,392ポイント)   Date: 2009/09/03(木) 21:20   No:38774 解決!     
Title: Re:フェードイン、フェードアウトの作り方    
よくわかりました。
ありがとうございました。
これからもよろしくお願いします。
実装は一応できました。


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

Name: おむすび  ..ぴよぴよ(620ポイント)   Date: 2009/09/04(金) 22:55   No:38813     
Title: Re:フェードイン、フェードアウトの作り方    
横スレ失礼いたします。
わたしも以前フェードイン、アウトの処理を使ったのですがうまくいきませんでした。
フェードではなく一瞬で色が変わってしまいます。


// フェードイン処理
int FadeIn( int Color , int Speed ){
for(int i = 0 ; i < 255 ; i += Speed ){
// 描画輝度をセット
SetDrawBright( i , i , i ) ;
// グラフィックを描画
DrawBox( 0 , 0 , 640 , 480 , Color , true ) ;
if(i < 255) return true;
}
return false;
}

// フェードアウト処理
int FadeOut( int Color , int Speed ){
for(int i = 0 ; i < 255 ; += Speed ){
// 描画輝度をセット
SetDrawBright( 255 - i , 255 - i , 255 - i ) ;
// グラフィックを描画
DrawBox( 0 , 0 , 640 , 480 , Color , true ) ;
if(i < 255) return true;
}
return false;
}

if(CheckHitKey(KEY_INPUT_B)){
FadeIn(RGB(0,0,0),1);
}
if(CheckHitKey(KEY_INPUT_A)){
FadeOut(RGB(0,0,0),1);
}




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

Name: kazuoni [URL]  ..ハッカー(103,758ポイント)   Date: 2009/09/04(金) 23:12   No:38814     
Title: Re:フェードイン、フェードアウトの作り方    
Drawを表描写にしているのか、裏描写にしているのか定かではないのであれですが・・・
もし、裏描写なら
>フェードではなく一瞬で色が変わってしまいます。
になります。

フェードイン、アウト共に、表描写(ScreenFlip)していないからです。
この関数だと、裏描写には淡々と描写していますが、
それを表描写しなければ、画面には反映されません。


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

Name: おむすび  ..かけだし(2,240ポイント)   Date: 2009/09/06(日) 01:52   No:38883     
Title: Re:フェードイン、フェードアウトの作り方    
たぶんScreenFlipしておりますので書き方が悪いのかと思います。
サンプル置き場にあるものを実行したら問題なかったので・・・。
現在のソースを書かせていただきます。



// フェードイン処理
bool FadeIn( int Color , int Speed ){
for(int i = 0 ; i < 255 ; i += Speed ){
// 描画輝度をセット
SetDrawBright( i , i , i ) ;
// グラフィックを描画
DrawBox( 0 , 0 , 640 , 480 , Color , true ) ;
// ScreenFlip();
if(i < 255) return true;
}
return false;
}

// フェードアウト処理
bool FadeOut( int Color , int Speed ){
for(int i = 0 ; i < 255 ; i += Speed){
// 描画輝度をセット
SetDrawBright( 255 - i , 255 - i , 255 - i ) ;
// グラフィックを描画
DrawBox( 0 , 0 , 640 , 480 , Color , true ) ;
// ScreenFlip();
if(i < 255) return true;
}
return false;
}

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

ChangeWindowMode(true); // ウインドウの変更 フルスクリーン・ウインドウ
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定


// DXライブラリ初期化処理
if( DxLib_Init() == -1 ){
return -1; // エラーが起きたら直ちに終了
}
// 処理
while(1){

// BMP画像の表示
ClearDrawScreen();
if(CheckHitKey(KEY_INPUT_B)){
FadeIn(RGB(0,0,0),1);
}
if(CheckHitKey(KEY_INPUT_A)){
FadeOut(RGB(0,0,0),1);
}
ScreenFlip();

// 処理の終了
if(CheckHitKey(KEY_INPUT_ESCAPE)) break;

}
DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,051,572ポイント)   Date: 2009/09/06(日) 03:33   No:38886     
Title: Re:フェードイン、フェードアウトの作り方    
今コンパイラが手元にないので詳しく書けませんが・・。
ScreenFlip();
はあちこちに書かないほうがいいです。
メインループの中に一度だけ書くようにしてください。
必ずメインに戻しても処理が出来るはずですから。

「輝度」なる変数を用意し、それを変更することで明るさを調整するといいと思いますよ。


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

Name: おむすび  ..かけだし(2,295ポイント)   Date: 2009/09/06(日) 05:43   No:38905     
Title: Re:フェードイン、フェードアウトの作り方    
管理人さま
ご回答ありがとうございます。

ScreenFlipなのですが現在コメントにしてありますので一回しか書いてありません。
とても便利な関数なのですがよくどちらに書いたかわからなくなるので・・・ww

やはりフェードインしませn。


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

Name: Justy  ..伝説なるハッカー(416,577ポイント)   Date: 2009/09/06(日) 13:18   No:38919     
Title: Re:フェードイン、フェードアウトの作り方    

>やはりフェードインしません

 1回分の whileループ(1フレーム)の中の処理を日本語で書き出してみましょうか。


1  ClearDrawScreen();
 画面を消す。

2  if(CheckHitKey(KEY_INPUT_B)) { FadeIn(RGB(0,0,0),1); }
 Bのキーが押されてたら輝度を{ 0, 0, 0 }から { 254, 254, 254 }まで
255回 DrawBox関数で全画面塗りつぶす。

3  if(CheckHitKey(KEY_INPUT_A)) { FadeOut(RGB(0,0,0),1); }
 Aのキーが押されてたら輝度を{ 255, 255, 255 }から { 1, 1, 1 }まで
255回 DrawBox関数で全画面塗りつぶす。

4  ScreenFlip();
 裏画面と表画面を交換して、1以降で描画した内容を画面に表示する

5  if(CheckHitKey(KEY_INPUT_ESCAPE)) break;
 ESCキーが押されたら、whileループを抜ける


 これが1回分の whileループの処理です。

 さて、ここで2や3の処理をみて下さい。
 SetDrawBright〜DrawBoxを 255回も行って描いていますが、
当然これ全て1フレームで処理されてしまっています。

 透明属性の指定はないので、最終的には 255回目に描いたものが一番上になり
見た目には 1回目〜 254回目までの描画はなかったことになります。

 これでは一瞬で色が変わってしまいますよね。

 なので、何フレーム〜何十フレームもかけて輝度を変化させて表示するように
変更してみて下さい。


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

Name: おむすび  ..かけだし(2,316ポイント)   Date: 2009/09/06(日) 19:58   No:38949     
Title: Re:フェードイン、フェードアウトの作り方    
できました><

ありがとうございます。


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



Name: 狼太郎  ..入門者(2,578ポイント)   Date: 2009/09/01(火) 19:25   No:38704       
Title: ファイル出力入力のプログラム    
ファイルを開き、変数の内容をファイルに移してから、再度読み込み、画面に表示するプログラムを組んだのですが。。

#include<stdio.h>
#include"DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return -1;
FILE *fp;
int f=1000;
fp=fopen("aaa.dat","wb+");
fwrite(&f,sizeof(f),1,fp);
fread(&f,sizeof(f),1,fp);
fclose(fp);
printfDx("%d",f);
ScreenFlip();
WaitKey();
DxLib_End();
return 0;
}

コンパイルは成功するのですが、画面に、1000と表示してくれません。。
どこが間違っているのでしょうか・・


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


Name: MNS  ..中級者(14,481ポイント)   Date: 2009/09/01(火) 19:40   No:38706     
Title: Re:ファイル出力入力のプログラム    
fwriteで書き込んだ時点で、ファイル位置は書き込んだデータバイト数進みますので、
fpはファイルの終端を指しているためではないでしょうか?


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

Name: 狼太郎  ..入門者(2,618ポイント)   Date: 2009/09/01(火) 19:56   No:38708     
Title: Re:ファイル出力入力のプログラム    
そうなんですか。。。
何度もすみませんが、fpをもとの場所をさすようにするにはどうすればいいのでしょうか?


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

Name: 狼太郎  ..入門者(2,677ポイント)   Date: 2009/09/01(火) 20:02   No:38709     
Title: Re:ファイル出力入力のプログラム    
すみません、fclose(fp);を
間に挟んだらきちんと表示できました!

ですが、コンパイル中に”fopen()の宣言を確認してください”と警告が出てきます。


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

Name: non  ..熟練のプログラマー(61,672ポイント)   Date: 2009/09/01(火) 20:11   No:38710     
Title: Re:ファイル出力入力のプログラム    
>fpをもとの場所をさすようにするにはどうすればいいのでしょうか?
fseekを使います。


>fclose(fp);を 間に挟んだらきちんと表示できました!
どういうこと?賢いコンパイラってことかな?

>”fopen()の宣言を確認してください”
fcloseしたなら、使う前にまたfopenしなきゃいけませんよね。



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

Name: 狼太郎  ..入門者(2,886ポイント)   Date: 2009/09/01(火) 21:16   No:38712     
Title: Re:ファイル出力入力のプログラム    
思った数値を表示することはできたのですが、新たな疑問が・・ホントすみません。
#include<stdio.h>

#include"DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return -1;
FILE *fp;
int f=1000;
fp=fopen("aaa.dat","wb+");
fwrite(&f,sizeof(f),1,fp);
fseek(fp,0,SEEK_SET);
fread(&f,sizeof(f),1,fp);
fclose(fp);
printfDx("%d",f);
ScreenFlip();
WaitKey();
DxLib_End();
return 0;
}

このfseek(fp,0,SEEK_SET)で先頭まで戻し、表示はできたのですが・・
fseek(fp,0,SEEK_END)やfseek(fp,0,SEEK_CUR)でも同じ結果が返ってきます。


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

Name: box  ..ハッカー(143,213ポイント)   Date: 2009/09/01(火) 23:25   No:38721     
Title: Re:ファイル出力入力のプログラム    
書込みモードでオープン
ファイルへの書込み
ファイルのクローズ

読込みモードでオープン
ファイルからの読込み
ファイルのクローズ

オープンして、使い終わったらクローズする、これ基本です。


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

Name: non  ..熟練のプログラマー(61,782ポイント)   Date: 2009/09/02(水) 11:37   No:38737     
Title: Re:ファイル出力入力のプログラム    
>fseek(fp,0,SEEK_END)やfseek(fp,0,SEEK_CUR)でも同じ結果が返ってきます。
読むデータがないのだから、正常に読み込まれていません。
もともとfに格納されている値が表示されているだけ。
別の変数にfreadしてみたらわかると思うけど。


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

Name: 狼太郎  ..入門者(2,897ポイント)   Date: 2009/09/06(日) 19:41   No:38946 解決!     
Title: Re:ファイル出力入力のプログラム    
ありがとうございました!
できました!


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



Name: 小夜  ..ぴよぴよ(269ポイント)   Date: 2009/09/05(土) 15:53   No:38848       
Title: 「RyuJin.sln」が開けません    
C言語初心者です。

「RyuJin.sln」が開けません。
私が今使っているのは、「Microsoft Visal C++ 2008」です。
開こうとすると、「変換しますか?」というのが出て、変換すると
「ソリューションファイルが.....」と出てしまい、
タグ(?)を貼りつける所が出てきません。

「ゲームプログラミングの館」のやつは全て実行出来ました。

ゲームプログラミングの館は「9」
龍神録プログラミングの館は「8」となっています。
それが原因なのでしょうか?

解決策を教えてください!!

(ちなみに、パソコンはWindows vistaです。)


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,052,141ポイント)   Date: 2009/09/06(日) 04:04   No:38894     
Title: Re:「RyuJin.sln」が開けません    
う〜んよくわかりませんが・・。
「ソリューションファイルが.....」の後は何ですか?
そのエラーメッセージをググっても解決策は見つからないでしょうか?

また、タグを張り付けるところというのは何でしょう・・?

後、規約にあります通り、お名前はどれか一つだけをお使いいただきますようお願いします。
複数トピでお名前や質問内容が混在していると回答がわけわからなくなってしまいますので。


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

Name: 小夜  ..ぴよぴよ(75ポイント)   Date: 2009/09/06(日) 19:25   No:38945 解決!     
Title: Re:「RyuJin.sln」が開けません    
すみません、開き方が間違っていたようです;
無事開けました!
回答ありがとうございました。

色々と失礼致しました。


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



Name: ととろ  ..初心者(5,700ポイント)   Date: 2009/09/04(金) 22:02   No:38809       
Title: 背景透過のPNGの描画    
なぜかキャラの周りの白い部分(背景)まで四角く描画されてしまうので、GIMPというツールを使って白い背景を透過(α値を0に)しました。しかし(DX_BLENDMODE_ALPHA,?)で第二引数に値を入れますよね
α値を0にすると背景は透過されるがキャラも透過される。
α値を255にすると背景が白く残る。

背景のα値を0に、キャラのα値を255にして描画する方法ってありますか?
そうでなくても背景が透過できればどういう方法でもいいのですが


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


Name: kazuoni [URL]  ..ハッカー(103,631ポイント)   Date: 2009/09/04(金) 22:29   No:38810     
Title: Re:背景透過のPNGの描画    
SetTransColor
を使用すれば解決するかと思います。

ちなみに、ブレンドモードは画像全体に効果をかけるものです。


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

Name: 560  ..かけだし(2,015ポイント)   Date: 2009/09/04(金) 22:34   No:38811     
Title: Re:背景透過のPNGの描画    
質問の意図を勘違いしましたので編集しました。すみません。

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

Name: Justy  ..伝説なるハッカー(412,424ポイント)   Date: 2009/09/04(金) 23:26   No:38815     
Title: Re:背景透過のPNGの描画    

>背景のα値を0に、キャラのα値を255にして描画する方法

 DrawGraph()などの関数を使う時、引数 TransFlagを TRUEにしていますか?
 その素材には本当にアルファチャンネルが含まれていますか?

 もし、していてもそうなるのであれば、再現できるその素材とサンプルコードを
提示してもらえれば何かわかるかもしれません。


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

Name: ととろ  ..初心者(5,718ポイント)   Date: 2009/09/05(土) 00:30   No:38817     
Title: Re:背景透過のPNGの描画    

>  もし、していてもそうなるのであれば、再現できるその素材とサンプルコードを
> 提示してもらえれば何かわかるかもしれません。

素材は透過したい画像でいいのでしょうか?


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

Name: ととろ  ..初心者(5,748ポイント)   Date: 2009/09/05(土) 00:33   No:38818     
Title: Re:背景透過のPNGの描画    
ちなみにαチャンネルはちゃんと入っていてtransもTRUEになっています。


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

Name: Justy  ..伝説なるハッカー(412,846ポイント)   Date: 2009/09/05(土) 00:34   No:38819     
Title: Re:背景透過のPNGの描画    

>素材は透過したい画像でいいのでしょうか?

 ええ、透過処理済みの画像を。


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

Name: Justy  ..伝説なるハッカー(413,189ポイント)   Date: 2009/09/05(土) 00:43   No:38820     
Title: Re:背景透過のPNGの描画    

>ちなみにαチャンネルはちゃんと入っていてtransもTRUEになっています

 だとすると、DxLib_Init()より前に

    SetNotUse3DFlag(TRUE);

とか或いは

    SetUseDirectDrawFlag(FALSE);
    SetNotUse3DFlag(TRUE);

とかするとどうなりますか?



>キャラの周りの白い部分

 あれ? ひょっとして、キャラの周囲の1ピクセル前後だけ、の話しだったりします?


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

Name: ととろ  ..初心者(5,979ポイント)   Date: 2009/09/05(土) 01:24   No:38824     
Title: Re:背景透過のPNGの描画    

>ちなみにαチャンネルはちゃんと入っていてtransもTRUEになっています

 だとすると、DxLib_Init()より前に

SetNotUse3DFlag(TRUE);

とか或いは

SetUseDirectDrawFlag(FALSE);
SetNotUse3DFlag(TRUE);

とかするとどうなりますか?


特に透過できませんでした。


>キャラの周りの白い部分

 あれ? ひょっとして、キャラの周囲の1ピクセル前後だけ、の話しだったりします?


いいえ。キャラを除いてロードした画像サイズの背景が白で描画されます





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

Name: ととろ  ..初心者(5,913ポイント)   Date: 2009/09/05(土) 01:28   No:38826     
Title: Re:背景透過のPNGの描画    
すみません。あと透過した画像は東方本家のものだったりするので多分掲載はだめ、でしょうね。
GIMPなどのツールでαチャンネル追加、背景を選択、削除したのでおそらく透過できていると思いますが。


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

Name: Justy  ..伝説なるハッカー(414,717ポイント)   Date: 2009/09/05(土) 01:54   No:38828     
Title: Re:背景透過のPNGの描画    

>GIMPなどのツールでαチャンネル追加、背景を選択、削除したのでおそらく透過できていると思いますが

 その画像ファイル(多分 PNG?)をあらためて GIMPに読み込ませてアルファチャンネルが
入っているかどうかで確認できますよ。

 その上で、画像ファイルに問題がなければ以下のコードを実行してみて下さい。

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int)
{
    ChangeWindowMode(TRUE);
    if(DxLib_Init() < 0) return -1;
    SetDrawScreen(DX_SCREEN_BACK);
    
    int image = LoadGraph("******.png");
    if(image == -1)    return -1;

    int graphSizeX, graphSizeY;
    GetGraphSize(image, &graphSizeX, &graphSizeY);
    
    int alpha = 0, offset = 5;
    while(ProcessMessage() != -1)
    {
        char Key[256];
        GetHitKeyStateAll( Key );
        if(Key[ KEY_INPUT_ESCAPE ])
            break;
        
        ClearDrawScreen();
        SetBackgroundColor(50, 50, 70);
        
        int blendMode, blendParam;
        GetDrawBlendMode(&blendMode, &blendParam);
        SetDrawBlendMode(DX_BLENDMODE_ALPHA, alpha);
        
        alpha += offset;
        if(alpha > 255)
        {
            alpha = 255;
            offset = -offset;
        }
        else
        if(alpha < 0)
        {
            alpha = 0;
            offset = -offset;
        }
        
        DrawGraph((DEFAULT_SCREEN_SIZE_X-graphSizeX)/2,
                    (DEFAULT_SCREEN_SIZE_Y-graphSizeY)/2, image , TRUE);
        
        SetDrawBlendMode(blendMode, blendParam);
        ScreenFlip();
    }
    
    DxLib_End();
    return 0;
}

 これは読み込んだ画像ファイル(******.png)をアルファ値が0〜255に変化させながら
表示するものです。

 このプログラムでその画像ファイルを読み込ませて(******の部分は書き換えて)試しても、
同様にうまくいかないとなると、ちょっと厄介です……。


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

Name: ととろ  ..初心者(5,996ポイント)   Date: 2009/09/06(日) 00:36   No:38879     
Title: Re:背景透過のPNGの描画    
ちょっと道それますが、
GIMPで
αチャンネル追加、背景を選択、削除。
削除した部分は縞模様になり色もなくなりますけど、
それでα値が0になったことになったのでしょうか


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,051,846ポイント)   Date: 2009/09/06(日) 03:57   No:38890     
Title: Re:背景透過のPNGの描画    
そうですね。それで保存すれば透過されるはずですが・・。

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

Name: ととろ  ..初心者(6,018ポイント)   Date: 2009/09/06(日) 16:40   No:38934     
Title: Re:背景透過のPNGの描画    
何を試してみてもだめなようです。
GIMPでもっとじっくり調べてみます


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



Name: uwlover  ..入門者(2,589ポイント)   Date: 2009/09/06(日) 11:47   No:38910       
Title: 戻り値はあるけれど    
関数には戻り値を返すものがありますが、通常戻り値を格納する変数が伴うものですよね。例えば、
int func(int a,int b)のような関数なら、int c = func(a,b);といった感じに。直接func(a,b);というように
記述できるのはvoid型だけだと思っていたのですが、WindowsプログラミングのUpdateWindow関数はBOOL型
(実際にはint型)なのにも関わらず、戻り値を格納するオブジェクトを伴わずに直接記述することができます。
これはどうしてなのでしょうか?


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


Name: MNS  ..中級者(14,901ポイント)   Date: 2009/09/06(日) 12:05   No:38911     
Title: Re:戻り値はあるけれど    
>直接func(a,b);というように 記述できるのはvoid型だけだと思っていたのですが
違います。void型以外でもそのような記述は可能です。
その場合、返されたものは破棄されます。
何も、UpdateWindow関数に限ったことではありません。


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

Name: uwlover  ..入門者(2,602ポイント)   Date: 2009/09/06(日) 15:41   No:38929 解決!     
Title: Re:戻り値はあるけれど    
なるほど、そうだったんですか。ありがとうございました。

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



Name: APS  ..かけだし(1,559ポイント)   Date: 2009/09/06(日) 12:58   No:38918       
Title: オーバーロード関数とは何?    
プログラミングの館のボムを打ってみようという所をやっているのですが、

c:\documents and settings\aps\デスクトップ\project\1章ver2.1\mydat\source\effect.cpp(27) : error C2668: 'cos' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
c:\program files\microsoft visual studio 9.0\vc\include\math.h(551): 'long double cos(long double)' の可能性があります。
c:\program files\microsoft visual studio 9.0\vc\include\math.h(503): または 'float cos(float)'
c:\program files\microsoft visual studio 9.0\vc\include\math.h(116): または 'double cos(double)'
引数リスト '(int)' を一致させようとしているとき

というエラーが出るのですが、これはどういう事を意味しているのでしょうか?

エラーに詳しい方お願いします。


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


Name: Justy  ..伝説なるハッカー(417,437ポイント)   Date: 2009/09/06(日) 14:18   No:38923     
Title: Re:オーバーロード関数とは何?    

>これはどういう事を意味しているのでしょうか

 C++のオーバーロード関数絡みのエラーですね。
 
C++ - オーバーロード
ttp://www.booran.com/menu/cplus/overload.html


 コンパイラとしては cos(float)と cos(double)と cos(long double)の
3つの別々の関数の存在を認識しているけどユーザーが書いたコードから
そのどれを呼び出せばいいのか判らない状態にあります。

 多分、こんな感じで書いていませんか?


    int v = 1;
    cos(v);

とか

    cos(1)

とか。

 こういう場合、明示的に floatとか doubleか、long doubleにキャストするか、
定数なら .f .0を付けたりして引数となる型を明確にしてあげて下さい。

    cos((double)v);
    cos(1.f)
    cos(5.0)


 あるいは float版でよければ cosf関数を、long doubleなら cosl関数を
使ってもいいですね。


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

Name: APS  ..ぴよぴよ(145ポイント)   Date: 2009/09/06(日) 14:55   No:38925 解決!     
Title: Re:オーバーロード関数とは何?    
詳しい解説ありがとうございます。
おかげでエラーを吐かなくすることができました。


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



Name: Yussanstar  ..ぴよぴよ(117ポイント)   Date: 2009/09/06(日) 01:30   No:38881       
Title: 太鼓の鉄人の性能を高めよう!    
サンブルプログラミングの館にある、太鼓の鉄人の性能を
高めるには、さらにどんな処理を追加したらいいでしょうか。

注 あくまで性能の話であって、機能や描画項目の追加ではありません。
例 微妙なずれをなくすために...
FPSのエラーをなくすために...




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


Name: Justy  ..伝説なるハッカー(415,833ポイント)   Date: 2009/09/06(日) 02:13   No:38884     
Title: Re:太鼓の鉄人の性能を高めよう!    

>FPSのエラーをなくすために

 機能の追加、というよりかは書き直しに近いかもしれませんが、
根本的に(再生情報などによる)時間ベースで判定・表示をするようにして
fpsに依存しない作りにするのはどうでしょう。

 全てが時間ベースで作られていれば、fpsのずれでシークする必要がなくなるので、
fpsエラーそのものが発生しません。

 とはいえ、あまりにも fpsが低くなると絵とタイミングをとることが
むずかしくなるので、そのような状態でも遊べるように、とか考えるなら
内部処理の更新(入力判定など)だけは 30〜60fps程度で非同期で行う必要が
あるかもしれません。



>微妙なずれをなくすために

 何度もプレイして調整するしかないような気がします。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,051,449ポイント)   Date: 2009/09/06(日) 03:28   No:38885     
Title: Re:太鼓の鉄人の性能を高めよう!    
音ゲーは「時間」「タイミング」が命ですから、フレームで計算する処理は適切ではないかもしれません。
ただ時間で計算すると途端に処理がめんどくさくなるんですよね・・。

私は音楽と同期させる処理をするときは
発想を逆にして「処理落ちしたら音楽の再生位置を調整する」という風にしています。
つまり音楽に合わせて処理をするのではなく、処理に合わせて音楽を再生します。
ただ、そうすると処理落ちした時に音楽の再生の仕方がおかしくなるので、お勧めはできません。

>>微妙なずれをなくすために

>何度もプレイして調整するしかないような気がします。

以前Justyさんが仰っていた
「音楽の再生スピードを半分にして調整する」という方法、これかなり使えますよね。
あれ以来結構この方法重宝させていただいています。
もっと本格的に作りたいなら音楽と同期して譜面データを作る作成支援ツールを作ってもいいかもしれませんね。


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

Name: Justy  ..伝説なるハッカー(416,906ポイント)   Date: 2009/09/06(日) 13:42   No:38921     
Title: Re:太鼓の鉄人の性能を高めよう!    

>>微妙なずれをなくすために
>「音楽の再生スピードを半分にして調整する」という方法

 あー、そっか。そっちのずれもあるんですね。
 
 私はタイミングデータは正確なことが前提で、画面上のボックスと弾の判定で、
指がキーを押す動作を始めてから内部的にキーが押された判定が行われるまでの
微妙なラグだとばかり思ってましたw


 データの方のずれに関しては、ある程度正しくタイミングがとれているデータを
頑張って作った上でタイミングの最小限単位(分解能)を決めて後からクォンタイズをかければ
綺麗にデータがそろいます。

 まさに MIDIのリアルタイムレコーディングしたあとの処理と同じ方法ですね。

クォンタイズ(Quantize)|DTM用語集 01SoundEarth
ttp://word.01sound-earth.com/dtm_ka/quantize.php

 これでも元データによっては完全とはいかないこともあるでしょうけど、
ずれをなくす方法としては有りかなと思います。


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



Name: ゲンゲン  ..ぴよぴよ(159ポイント)   Date: 2009/09/06(日) 12:07   No:38913       
Title: エフェクト画像はどうやって    
アクションゲーム系のゲームをつくっているんですが、
攻撃エフェクト等の画像作成をどうしたらいいかわからないでいます;
作りたいエフェクト画像は
http://www.ne.jp/asahi/unyu/nyu/rubia/bm/bmshot1.htm
こちらのスクリーンショットに載っているような画像です。

それ専用の製作ソフトがあるんでしょうか?それとも普通のお絵かきソフトみたいなので描くしかないんでしょうか?
それともプログラミングで処理できるのか…

システム関係のプログラムはもちろん大事ですけど、こうゆう画像も美しい方が何倍もゲームをプレイするのが楽しくなると思いますのでドットでの攻撃画像は使いたくないんです。。

どうかよろしくお願いします。


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


Name: kazuoni [URL]  ..ハッカー(104,201ポイント)   Date: 2009/09/06(日) 12:44   No:38917     
Title: Re:エフェクト画像はどうやって    
フェードイン、アウトや、画面のフラッシュ、レインボーなどなど、
プログラムで表現できるものはたくさんあるのですが、
剣で切る、稲妻が落ちる、氷山が出る・・・
などは自作するなり、エフェクトを作っていらっしゃる方々からお借りする
しかないかと思います。

エフェクト画像を作っていらっしゃる方はキャラチップ、マップチップ制作者
よりははるかに少ないです。
自分も探したので、オススメをあげておきます。
ただ、自分で頭で想像しているものとは違うかも知れません。
やはり自作が一番いいんですかね・・・^^;
(自分はできないので、RGBをいじって、同じ攻撃でも色を変えて使いまわしています^^;)

SPIERAL WIND
ttp://hiropiro-may.hp.infoseek.co.jp/

みんとのお部屋-そざい-
ttp://mintoroom.web.infoseek.co.jp/Special.html

First Seed Material
ttp://www.tekepon.net/fsm/

TalesWeaver@ ツクール36
ttp://www7a.biglobe.ne.jp/~twrpg/top.html


ただ、ドット=美しくないは誤認かと。
使い方次第ですが。

#他の方も、自分はここのエフェクト画像使用している!
なんて上げてもらえると、自分もうれしいのですが・・・w


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



Name: 560  ..かけだし(1,675ポイント)   Date: 2009/09/04(金) 21:24   No:38808       
Title: 敵に長距離ビームを撃たせたい場合    
龍神録で以下のように真下に1回直線発射のビームを撃たせるような方法で
溜め撃ちの様な形で敵のビームを発射させる先端部でエネルギーを溜め、断続的にビーム(長距離ビーム?貫通ショット?カメハメ波?そういう直線状にビームが一本伸びるタイプのショット)を発射させたい場合どのようにすればよいのでしょう

void shot_bullet_H000(int n){
int k;
if(shot[n].cnt==0){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =enemy[shot[n].num].blknd2;
shot[n].bullet[k].angle =PI/2;
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x;
shot[n].bullet[k].y =enemy[shot[n].num].y;
shot[n].bullet[k].col =enemy[shot[n].num].col;
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].spd =3;
se_flag[0]=1;
}
}
}




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


Name: Dixq (管理人) [URL]  ..ウィザード(1,052,411ポイント)   Date: 2009/09/06(日) 04:14   No:38897     
Title: Re:敵に長距離ビームを撃たせたい場合    
手元にコンパイラが無いので詳しく書けませんが・・。

小さめの弾を敵の前方すぐ近くに出現させ、出現させたらその中心点を元に
円の半径を0〜溜めうちで広げたいエフェクトの広さに円運動で広げ、
ある時間になったら下に打ち出せばいいのではないでしょうか。
これを連続で行い、全て加算ブレンドするとレーザーっぽくなると思います。


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

Name: 560  ..かけだし(2,051ポイント)   Date: 2009/09/06(日) 12:18   No:38915 解決!     
Title: Re:敵に長距離ビームを撃たせたい場合    
アドバイスありがとうございます。

とりあえずアドバイスとほぼ同じような感じでやってみて自己解決しました。

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



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



Name: dakei  ..ぴよぴよ(31ポイント)   Date: 2009/09/06(日) 05:02   No:38901       
Title: ニコニコ組曲のwavデータ    
隠し弾幕の「ニコニコ中毒・・・」っていうのをやったのですが、組曲wavのデータが見つかりませんと出ました。これは個人で曲データを落とさなければいけないのですか?既に同じ質問があったらごめんなさい;;

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


Name: チルチル  ..熟練のプログラマー(47,906ポイント)   Date: 2009/09/06(日) 12:16   No:38914     
Title: Re:ニコニコ組曲のwavデータ    
確か版権的な理由で同梱できないんだったと思います

http://dixq.net/sr/niconico.html

ここで落としてください


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



Name: UKONN  ..かけだし(1,115ポイント)   Date: 2009/09/05(土) 14:16   No:38840       
Title: 途中計算結果    
検索キーワードになんと入力すればいいのかわからず、見つからなかったので質問させてください。

現在、とある計算のプログラムを作成しています。
最終の計算結果が思うような値になりません。プログラムにはいくつかの式があり、どこの式が原因なのか追究しようと思っています。
なので、一つの式ごとに計算結果を出力することは可能だと思うのですがどのように行うのかわかりません。教えていただけませんか?


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


Name: Tororo  ..ぴよぴよ(217ポイント)   Date: 2009/09/05(土) 14:27   No:38841     
Title: Re:途中計算結果    
一つの計算が終わったら
Printfなどで画面に表示すればいいのでわ〜

Printf("デバッグ %d", 答え)でどうですか〜


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

Name: UKONN  ..かけだし(1,180ポイント)   Date: 2009/09/05(土) 14:36   No:38842     
Title: Re:途中計算結果    
回答ありがとうございます。
その方法でもできるのだと思いますが、計算式が膨大です。
一気に出力する方法はないでしょうか?


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

Name: box  ..ハッカー(143,252ポイント)   Date: 2009/09/05(土) 15:16   No:38846     
Title: Re:途中計算結果    
> 計算式が膨大です。
> 一気に出力する方法

「膨大」と「一気に」の、具体的な内容を記述してください。


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

Name: UKONN  ..かけだし(1,348ポイント)   Date: 2009/09/05(土) 15:44   No:38847     
Title: Re:途中計算結果    
具体性に欠けていました。すいません。
つまり、
x=....
y=...
z=...
dx=...
dy=...
dz=...
A=...
...の部分は式が当てはまるとして、画面にはAの答えしか出力されないとする。出力結果が出てAの結果は予想していたものと明らかに異なる。⇒どこの式が間違っていたのだろうか?⇒x=3,y=2,z=o⇒zの式が間違っている。

としたいのですが、何か良い方法はないものですか?

A=...の前で計算を打ち切る方法があるのではないかなと。

わかりづらいとおもいますが、よろしくお願いします。


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

Name: mats  ..かけだし(1,135ポイント)   Date: 2009/09/05(土) 15:57   No:38849     
Title: Re:途中計算結果    
ブレークポイントを使ってみてはいかがでしょうか?

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,052,911ポイント)   Date: 2009/09/06(日) 04:29   No:38900     
Title: Re:途中計算結果    
大量にデータがあってみにくいときは、ファイルに書き出してはどうでしょうか?
また、その出力したデータを管理しやすくするには、エクセル形式のデータファイルにするなどしたら良いかと思います。
カンマでデータを区切って単純にテキスト形式で保存すればセルにわかれます。


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

Name: UKONN  ..かけだし(1,387ポイント)   Date: 2009/09/06(日) 12:07   No:38912 解決!     
Title: Re:途中計算結果    
わかりました。なるほどと思う意見がたくさんありました。今すぐ実行してみたいと思います。
ありがとうございます。


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



Name: zyf  ..入門者(3,158ポイント)   Date: 2009/09/02(水) 19:04   No:38738       
Title: 一瞬で消えてしまいます    
以前の投稿と同じような内容で申し訳ありません。
ショットを打たせることはできるようになったのですが、時期から発射された直後に消えてしまいます。


#include "DxLib.h"

typedef struct{//キャラクターの構造体
int x,y,img;
}ch_t;

struct shot{//ショットの構造体
int x,y;
int flag;
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了
/////定義
int na_shot[3],i,counter=0; //counter=発射してからのカウントをする変数。
int nanoha0[1];
int back0[1];
char Key[256];
ch_t ch;
struct shot tama[20]; //tamaを10個作る。

ch.x=132;
ch.y=240;



SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に設定

LoadDivGraph( "na_shot.png" , 3 , 1 , 3 , 36 , 36 , na_shot ) ;//画像を分割してimage配列に保存
LoadDivGraph( "nanoha00.png" , 1 , 1 , 1 , 64 , 64 , nanoha0 );//キャラクター
LoadDivGraph( "back00.bmp" , 1 , 1 , 1 , 640 , 480 , back0 );//背景01




while(1){
ClearDrawScreen(); //裏画面のデータを全て削除
GetHitKeyStateAll( Key ) ; // すべてのキーの状態を得る

if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
/////背景
DrawGraph( 0 , 0 , back0[0] ,TRUE);


/////移動
if(Key[KEY_INPUT_RIGHT]==1)//右
ch.x+=2;
if(Key[KEY_INPUT_LEFT]==1)//左
ch.x-=2;
if(Key[KEY_INPUT_UP]==1)//上
ch.y-=2;
if(Key[KEY_INPUT_DOWN]==1)//下
ch.y+=2;
//移動の限界
if(ch.x<-15)
ch.x=-15;
if(ch.y<-15)
ch.y=-15;
if(ch.x>620)
ch.x=620;
if(ch.y>450)
ch.y=450;

ch.img=nanoha0[0];

DrawGraph(ch.x,ch.y,ch.img,TRUE);


/////ショット
for(i=0;i<20;i++){ //初期化処理
tama[i].x=ch.x;
tama[i].y=ch.y; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}

if(counter<5) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ

else if( Key[ KEY_INPUT_Z ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(i=0;i<20;i++){
if(tama[i].flag==0){ //発射していない玉を探し、
tama[i].flag=1; //発射フラグを立てる
break;
}
}
}
for(i=0;i<20;i++){
if(tama[i].flag==1){ //発射している玉なら
tama[i].x+=5; //座標を8増やす
DrawGraph( tama[i].x+18 , tama[i].y+18 , na_shot[0] , TRUE );//玉を描画
if(tama[i].x > 650){ //もし画面外まで来たら
tama[i].x=ch.x; //初期値に戻し、
tama[i].x=ch.y;
tama[i].flag=0; //発射フラグを戻す
}
}
}
/////////////////////////////////////////////////終了
if( Key[ KEY_INPUT_ESCAPE ] == 1 ) break;//Escボタンが押されたらブレイク

ScreenFlip() ;//裏画面データを表画面へ反映
}
DxLib_End() ;// DXライブラリ使用の終了処理
return 0 ;// ソフトの終了
}

自分に力不足のため、原因がわかりませんでした。
わかる方いましたら、どうか教えてください。


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


Name: noob  ..ぴよぴよ(575ポイント)   Date: 2009/09/02(水) 19:19   No:38739     
Title: Re:一瞬で消えてしまいます    
ショットの初期化処理をループからはずせばいいと思います。

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

Name: kazuoni [URL]  ..ハッカー(103,717ポイント)   Date: 2009/09/02(水) 19:27   No:38740     
Title: Re:一瞬で消えてしまいます    
インデントが少しみにくいので、次からはプレビューで確認してから、
コードを載せるようにすると、他の方が見やすくなるかと思います。

>時期(自機)から発射された直後に消えてしまいます。

毎ループ初期化をしているので、
弾がDrawされた後、すぐ弾の存在フラグtama[i].flag=0;
としているので、消えてしまう(自らフラグを下げている)のではないかと。


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

Name: zyf  ..入門者(3,468ポイント)   Date: 2009/09/03(木) 15:29   No:38767     
Title: Re:一瞬で消えてしまいます    
初期化処理の
flag=0;
をループから外すということは、

for(i=0;i<20;i++){ //初期化処理
tama[i].x=ch.x;
        tama[i].y=ch.y; //座標代入
tama[i].flag=0;//飛んでいない事を示すフラグ=0
}




for(i=0;i<20;i++){//初期化処理
tama[i].x=ch.x;
        tama[i].y=ch.y; //座標代入
}
    tama[i].flag=0;


とすればいいということでしょうか?
こうすると、時期の位置がおかしくなってショットが表示されなくなるのですが何故でしょうか?


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

Name: 夢夢  ..入門者(2,784ポイント)   Date: 2009/09/03(木) 15:38   No:38768     
Title: Re:一瞬で消えてしまいます    
whileの中で初期化処理を入れているので、
毎回初期化されることになってしまっています。
初期化処理をwhileの前に記述してください。


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

Name: zwi  ..入門者(2,616ポイント)   Date: 2009/09/03(木) 16:39   No:38769     
Title: Re:一瞬で消えてしまいます    
C言語の理解が不十分なのだと思いますが、今後のためにも一文ごとの意味を理解してください。

for(i=0;i<20;i++){ //初期化処理
tama[i].x=ch.x;
        tama[i].y=ch.y; //座標代入
tama[i].flag=0;//飛んでいない事を示すフラグ=0
}

for(i=0;i<20;i++)で20個の弾を初期化します。
tama[i].x=ch.x;で弾のX座標を自キャラのX座標と一致させています。
tama[i].y=ch.y;で弾のY座標を自キャラのY座標と一致させています。
tama[i].flag=0;は弾の存在を消す(0)と言う意味です。
iは弾の番号ですね。

何が問題かというと弾の存在フラグやら座標を毎回初期化していたら弾はちゃんと飛んでくれません。
発射されてから消えるまでは独自に移動するのが弾ですから。
なので、弾の初期化はループに入る前の最初だけで良いとみなさんが言っているわけです。

もしちゃんと思うままに自分でゲームを作りたいなら、今は不十分な命令の一文毎の意味を自分で理解出来る必要があります。なぜwhileループの中に書くとだめなのか?ここでちゃんと理解せず言われたまま直すと後でまたつまずきますから、ここでしっかり理解してくださいね。
疑問があったら聞いてください。


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

Name: zyf  ..入門者(3,537ポイント)   Date: 2009/09/03(木) 19:04   No:38771     
Title: Re:一瞬で消えてしまいます    
すみません。ショット部分はゲームプログラミングの館の26章を書き写しただけで、意味をよく理解していませんでした。
今のところやりたいことは、19章のキャラクターの移動と、26章のショットを組み合わせて、シューティングゲームの移動とショットを作るということです。

今のところ、移動の部分は理解できているので、ショットのところがよくわからないだけです。
玉の初期化、カウンター、打っていない玉を探す、のところがよくわからないので、どなたか詳しく教えていただけないでしょうか?


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

Name: zwi  ..入門者(2,717ポイント)   Date: 2009/09/03(木) 19:20   No:38772     
Title: Re:一瞬で消えてしまいます    
じゃあ、細かい解説の前に気になる事があるので質問します。
・for文の使い方は理解されていますか?
・配列の添え字の意味を理解されていますか?
・先ほど書いた

for(i=0;i<20;i++){//初期化処理
tama[i].x=ch.x;
       tama[i].y=ch.y; //座標代入
}
    tama[i].flag=0;

でtama[i].flag=0;の代入文でiは何の値を指していますか?
そしてそのiの値には問題がありますが何でしょうか?

以上の理解度で、説明が変わってくるので答えをお待ちしています。


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

Name: zyf  ..入門者(3,676ポイント)   Date: 2009/09/05(土) 11:31   No:38836     
Title: Re:一瞬で消えてしまいます    
返信が遅くなってすいません。

>・for文の使い方は理解されていますか?
>・配列の添え字の意味を理解されていますか?
全く理解していませんでした…

tama[i].flag=0;のiは、事前に作っておいたtama[20]のうちのどれかを指すと考えているのですがあっているでしょうか?
iの値の問題についてはこれもわかりません。


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

Name: conio [URL]  ..熟練のプログラマー(40,953ポイント)   Date: 2009/09/05(土) 17:04   No:38852     
Title: Re:一瞬で消えてしまいます    

>>tama[i].flag=0;のiは、事前に作っておいたtama[20]のうちのどれかを指すと考えているのですがあっているでしょうか?
違います。
ポインタではないので、"指す"という表現も適切ではないでしょう。
「iにどんな数値が入っているのか?」と考えたほうが良いと思います。

あと、for文の外に出したら 
構造体のメンバ"flag"が初期化されず不定値が入ることになりますよ。

--------------------------------------------------------
#include<stdio.h>
int main(void)
{
int i;

for(i=0;i<20;i++){
printf("iの値は、%2dです。\n",i);
}
printf("for文から抜けました。iの値は%dです。\n",i);
return(0);
}
--------------------------------------------------------
とりあえず、上記のコードを実行してiの値を確認してみてはどうでしょうか?
そして、そのiの値がどのような問題を発生させるなるのかを考えてみてください。
(コレ ⇒ tama[i].flag=0;)


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

Name: zyf  ..入門者(3,557ポイント)   Date: 2009/09/05(土) 18:52   No:38869     
Title: Re:一瞬で消えてしまいます    
例となるプログラムまで書いてくださって本当にありがとうございます。
実行してみて、iの値は、0です。から、for文から抜けました。iの値は20です。という文字が表示されたということは、for(i=0;i<20;i++)というのは、iは最初は0で、それが20以下の間i++を実行し続けるといった感じでよいでしょうか?

そして、tama[i].flag=0;の問題は、20発の発射する玉を準備する段階で、発射フラグを0にしてしまっているということですか?


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

Name: pooka [URL]  ..上級者(17,441ポイント)   Date: 2009/09/05(土) 20:11   No:38875     
Title: Re:一瞬で消えてしまいます    
>for(i=0;i<20;i++)というのは、iは最初は0で、それが20以下の間i++を実行し続けるといった感じでよいでしょうか?
一応こちらを参考に確認してみてください。
ttp://homepage3.nifty.com/mmgames/c_guide/09-02.html#S1

>そして、tama[i].flag=0;の問題は、20発の発射する玉を準備する段階で、発射フラグを0にしてしまっているということですか?
例えば
struct shot tama[20];
とすると、指定できる添え字は0〜19までの20個です。
conioさんのプログラムを実行したということなので、for文から抜けたときiの値は20であるとわかると思います。
ここで
tama[i].flag=0;

tama[20].flag=0;
ということなので、範囲を超えて0を代入しようとしていることがわかると思います。


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

Name: suzume  ..ぴよぴよ(155ポイント)   Date: 2009/09/05(土) 21:41   No:38876     
Title: Re:一瞬で消えてしまいます    
noobさんの”ショットの初期化処理をループからはずせばいい”
というのは

for(i=0;i<20;i++){ //初期化処理
tama[i].x=ch.x;
  tama[i].y=ch.y; //座標代入
tama[i].flag=0; //飛んでいない事を示すフラグ=0
}

全部をwhileの上に持っていけばいいと言っているんだと思います。
tamaの座標も初期化処理ですから。


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

Name: conio  ..熟練のプログラマー(41,895ポイント)   Date: 2009/09/05(土) 23:24   No:38877     
Title: Re:一瞬で消えてしまいます    

>>for(i=0;i<20;i++)というのは、iは最初は0で、
それが20以下の間i++を実行し続けるといった感じでよいでしょうか?

厳密に言うと、20以下(0〜20)ではなく20未満(0〜19)です。
で、最後にiがインクリメントされた時、20<20となり、条件を満たさなくなるので
for文を抜けます。

ついでに、「iが20以下の場合実行する」という条件だとfor(i=0;i<=20;i++)となります。
(for文を抜けたときのiの値は21です。)


>>そして、tama[i].flag=0;の問題は、20発の発射する玉を準備する段階で、発射フラグを0にしてしまっているということですか?
違います。
メモリの概念は分かりますか?
PC上では、様々なデータを保存する場合などは当然「データを保存する領域」が必要となります。
プログラムでも同じことで、通常変数や配列などもメモリ上に配置されます。

で、とりあえず、配列の範囲外アクセスのプログラムを実行してみてください。
-----------------------------------------------------------------
#include<stdio.h>
int main(void)
{
int test[3][3] = {0};
int i, j;

test[0][0] = 1;
test[0][5] = 1;//範囲外アクセス!

for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
if(test[i][j] == 0)
printf("○");
else if(test[i][j] == 1)
printf("●");
}
puts(" ");
}
return(0);
}
-----------------------------------------------------------------

実行結果は以下の通りになる筈です。
------------
●○○
○○●
○○○
------------

上記では、3×3の2次元配列を定義しているのですが、
test[0][5]に1を代入しています。

「この場合はどうなるのか?」というのは上記の実行結果を見ても分かるとおり、
test[1][2]の値が変更されてます。

何故、こんなことになるのかというと、
今回の2次元配列を定義した場合、メモリ上は下記の様に並んでいます。
-------------
┃test[0][0]
┃test[0][1]
┃test[0][2]
┃test[1][0]
┃test[1][1]
┃test[1][2]
┃test[2][0]
┃test[2][1]
▼test[2][2]
-------------
添え字に5としてしまうと、メモリ上で3つ余分に進んだ2次元配列"test"にアクセスすることになります。

-------------
┃test[0][0]
┃test[0][1]
┃test[0][2]
┃test[1][0]
┃test[1][1]
┃test[1][2] = test[0][5]
┃test[2][0]
┃test[2][1]
▼test[2][2]
-------------

で、今回はたまたま2次元配列の範囲内でしたが、もし「配列が存在しなかった場合はどうなるのか?」というと
------------
┃test[2][0]
┃test[2][1]
┃test[2][2]
▼????????? = test[2][3]
------------
全然関係の無い場所にアクセスすることになります。
当然、何らかの値を入れようとした場合は、その場所にあるデータが破壊されます。
特に影響は無いかもしれませんし、重要なデータが格納されていれば、PCの動作が不安定になったり
致命的なエラーが発生するかもしれません。

なので、添え字をオーバーした場所にアクセスするような事は起こらないようにして下さい。
(今回の場合は、tama[0]〜tama[19]までしかないのに、tama[20]に値を入れてます。)


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



Name: まる  ..かけだし(1,559ポイント)   Date: 2009/09/04(金) 22:42   No:38812       
Title: 自機ショットと敵消滅エフェクトが表示されない。    
何度も質問してすいません。

以前自機ショットについて質問したあとエラーは吐かずに起動するようになったのですが、今度はエラーは吐かないのに自機のショットや敵消滅エフェクトが表示されません。
あと、自機ショットと敵消滅エフェクトの音も再生されません。
プログラミングの館の敵の消滅エフェクトを作ってみようと自機にショットを打たせてみようを見直してみましたが、プログラムはちゃんと全部書いてありました。

こういう場合は何が原因なんでしょうか?
お願いします。


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


Name: 素人A  ..ぴよぴよ(741ポイント)   Date: 2009/09/05(土) 17:26   No:38854     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
解決策ではないので申し訳ありません。
私は初心者級の素人なので回答するのも気が引けますが、想像するに、load.cppのload()で画像と音を読み込んでいるので、そこで自機ショットや敵消滅エフェクトが読み込まれていないのかな〜と思いました。

各章の説明とソースを見ながら、プログラムを書き込んでいると想像したのですがいかがでしょうか?
あとどこの章で悩んでいるのか教えてくれたら答えやすいかな〜と思いました。



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

Name: まる  ..かけだし(1,615ポイント)   Date: 2009/09/05(土) 17:42   No:38857     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
プログラミングの館の17〜19章です。
ちなみにload()の自機ショットと敵の消滅エフェクトの画像とか読み込む(?)ためのプログラムは、プログラミングの館どうりに書きました。


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

Name: yu  ..プログラマー(37,946ポイント)   Date: 2009/09/05(土) 17:44   No:38859     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
プロジェクトごと添付して頂けたら
バグを見つけられるかもしれません


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

Name: 素人A  ..ぴよぴよ(358ポイント)   Date: 2009/09/05(土) 18:11   No:38860     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
こんにちは、素人です。
私と同じ問題にぶつかったようなので、解決策を練ってみました。

17章〜19章で以下のコードを追加していると思います。
自機ショットと敵消滅エフェクトと音を読み込んでいます。
---- load.cpp の load関数に以下を追加 ----

    //自機ショット画像
img_cshot[0]=LoadGraph("dat/img/char/bl_00.png");
img_cshot[1]=LoadGraph("dat/img/char/bl_01.png");
    //敵消滅エフェクト画像
    LoadDivGraph( "dat/img/enemy/hit_effect.png" , 5 , 5 , 1 , 140 , 140 , img_del_effect ) ;


sound_se[1]=LoadSoundMem("dat/se/enemy_death.wav");
sound_se[2]=LoadSoundMem("dat/se/cshot.wav");
sound_se[8]=LoadSoundMem("dat/se/hit.wav");


これを以下のように変更してみてください。

    //自機ショット画像
img_cshot[0]=LoadGraph("../dat/img/char/bl_00.png");
img_cshot[1]=LoadGraph("../dat/img/char/bl_01.png");
    //敵消滅エフェクト画像
    LoadDivGraph( "../dat/img/enemy/hit_effect.png" , 5 , 5 , 1 , 140 , 140 , img_del_effect ) ;

sound_se[1]=LoadSoundMem("../dat/se/enemy_death.wav");
sound_se[2]=LoadSoundMem("../dat/se/cshot.wav");
sound_se[8]=LoadSoundMem("../dat/se/hit.wav");


読み込むファイルの場所の指定が、実際と異なっているために読み込めていなかったと思われます。
素人的発想なので自信はありません!



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

Name: まる  ..かけだし(1,646ポイント)   Date: 2009/09/05(土) 18:20   No:38862     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
>vuさん
サイズの関係でSlhファイルしかむりでした。

>素人Aさん
試してみます。


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

Name: まる  ..かけだし(1,689ポイント)   Date: 2009/09/05(土) 18:29   No:38865     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
>vuさん
さっきのファイルを自分でひらいてみたら使えなくなっていたので上げなおします。


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

Name: まる  ..かけだし(1,759ポイント)   Date: 2009/09/05(土) 18:41   No:38867     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
>素人Aさん
ありがとうございます。自機ショットと音は表示+鳴るようになりました。
しかし、敵の消滅エフェクトがやはり表示されません。
こんなエラーが吐かれてしまいます。

c:\documents and settings\shi\デスクトップ\#project#\1章\mydat\source\load.cpp(25) : error C3872: '0x3000': この文字を識別子で使用することはできません


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

Name: 素人A  ..ぴよぴよ(606ポイント)   Date: 2009/09/05(土) 19:23   No:38870     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
自機ショットの音と画像が成功したようでよかったです。
以下のエラーは素人の私にはいまのところわかりません(_ _。)・・・シュン

> c:\documents and settings\shi\デスクトップ\#project#\1章\mydat\source\load.cpp(25) : error C3872: '0x3000': この文字を識別子で使用することはできません

なので、エラーになる前の状態に戻して置いたほうが無難なので、

//敵消滅エフェクト画像
LoadDivGraph( "../dat/img/enemy/hit_effect.png" , 5 , 5 , 1 , 140 , 140 , img_del_effect ) ;
の部分を以前のコードに戻してから、エラーが消えるかテストしてまた試行錯誤してみたほうがいいかな〜と素人の私は思いました。

私もいま19章をやっていますがエラーにはならないので・・・う〜ん。
今回で17章は成功したので、18章か19章のどこかにコピー&ペーストし忘れとかあるかもしれないかもしれない・・・。
自信はありません…。


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

Name: pooka [URL]  ..上級者(17,228ポイント)   Date: 2009/09/05(土) 19:26   No:38871     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
>error C3872: '0x3000': この文字を識別子で使用することはできません
おそらくload.cppで全角のスペースが使われている箇所があるからだと思うので、
修正してみてください。


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

Name: まる  ..かけだし(1,817ポイント)   Date: 2009/09/05(土) 19:29   No:38872 解決!     
Title: Re:自機ショットと敵消滅エフェクトが表示されない。    
>pookaさん
error C3872: '0x3000': この文字を識別子で使用することはできません =全角、半角スペースのミス
勉強になりました。

>素人Aさん
> なので、エラーになる前の状態に戻して置いたほうが無難なので、
>
> //敵消滅エフェクト画像
> LoadDivGraph( "../dat/img/enemy/hit_effect.png" , 5 , 5 , 1 , 140 , 140 , img_del_effect ) ;

を、そのままコピペしてみたら敵消滅エフェクトが表示されるようになりました。
ありがとうございました。

今後また、わからないエラーがあった時はよろしくお願いします。


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



Name: usami  ..かけだし(1,337ポイント)   Date: 2009/09/05(土) 11:01   No:38833       
Title: DxLibに詳しい人へ質問です    
お世話になっております。
また、力を貸していただけたらと思います。


現在、DxLibを使用して、簡単な戦略シュミレーションゲームを作成しているのですが、
実行中なぜか強制終了が起こる問題が発生しています。
(エラーが発生したために強制終了される類の問題でなく、ごく自然に画面が閉じられる。なして?)

コード的には、
while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
(中略)
}
DxLib_End();

ということで、
エスケープを押すとかしなければ終了されないはずなのですがなぜなのでしょう?

ちなみに強制終了される場合はいつも決まっており、

1.あるクラスの描画メソッドを呼び出しているとき(この場合、キャラクター選択クラスの描画メソッド)。
(ひとつの画面処理について、1クラスを作成するというスタイルで作成している。
 たとえばタイトル画面で、タイトル画面用のクラスを作成――class title{};
 たとえばバトル、マップ画面で、class buttle{}; class map{};
 みたいな感じで、あとはそのクラスの描画メソッドをグローバル変数のswitchケース分類する)
2.大体目算で15秒くらいはその画面を維持するのだが、そこで強制終了される。


途中、Sleep()を挿むことにより、維持される時間が可変であるように思えるので、
素人考えでは、そのクラスの処理(描画メソッド)が一定回数実行されると、
強制終了が起きているのではと推測するのですが、
何でそのような事態になるのか原因がさっぱりわかりません。

つきましては、DxLibがエラーでなく強制終了される場合をご存知の方がいらっしゃられましたら、
その解決法ともども
是非教えていただけたらと思います。

ちなみに現段階におきましては、
音楽は未使用、
使用画像は一律で.png で統一しています。


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


Name: kazuoni [URL]  ..ハッカー(103,808ポイント)   Date: 2009/09/05(土) 11:08   No:38834     
Title: Re:DxLibに詳しい人へ質問です    
>クラスの描画メソッド
>大体目算で15秒くらい

これだとよくわからないので、
コードを挙げたほうがいいかと思います。


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

Name: usami  ..かけだし(2,015ポイント)   Date: 2009/09/05(土) 11:23   No:38835     
Title: Re:DxLibに詳しい人へ質問です    
ご指摘ありがとうございます。

まず、main.cpp
ということで、
次のような形となっております。

#include "extern.h"
#include "include.h"

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
//変数宣言

//基本初期設定
ChangeWindowMode(true);
if(DxLib_Init()==-1) return -1;
//基本変数の初期化
Title tt;
Turn tn;
PlayLocation pl;
BMap bmap;
BStage bsg;
gamestatus=GS_CHARSELECT;//便宜上。

SetDrawScreen(DX_SCREEN_BACK); //描画対象裏面

while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
ClsDrawScreen(); //画面のクリア
GetHitKeyStateAll(HitKey);

/*
諸処理。
*/
switch(gamestatus){
case GS_TITLE:
tt.Draw();
break;
case GS_CHARSELECT:
tn.T_Draw();
break;
case GS_ZINSELECT:
pl.P_Draw();//←問題発生地点
break;
case GS_BUTTLEMAP:
bmap.BM_Draw();
break;
case GS_BUTTLESTATE:
bsg.BS_Draw();
break;
}

/*
FSPの調整。
*/

ScreenFlip(); //画面の入れ替え。
}

DxLib_End();
return 0;
}


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

Name: MNS  ..中級者(14,839ポイント)   Date: 2009/09/05(土) 12:10   No:38837     
Title: Re:DxLibに詳しい人へ質問です    
PlayLocation::Draw()のコードも提示されるべきでは?
メインループには問題ないように思えます


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

Name: usami  ..かけだし(2,496ポイント)   Date: 2009/09/05(土) 12:13   No:38838     
Title: Re:DxLibに詳しい人へ質問です    
↑イメージがつかめないと思うので、pl.P_Draw()実行時の画像を添付しておきました。
 この画面で、十数秒放置すると、勝手に終了されてしまうのです。

それではさらに、PlayLocationクラスについて。

とりあえず、長すぎるため、投稿しきれないということなので、
問題となっている
P_Draw();
のみ示します。


void P_Draw(){//総合的な描画。
 if(startflag) //スタート時の初期化。
  start();     //gamestatus=GS_ZINSELECTとなった最初の処理。

 selectSex=mselect[0]; //前画面からの選択変数の格納、男性/女性により、選択できる陣形が変わる。

 SelectNo(); //第一段階。現在選択されている陣形パターンにより、初期化を行う。描画はしない。

 BackGround();  //第二段階。基本となるグラフィック画像の配置。
 Comments();   //コメント用メソッド
 Block();     //背景の補助。ブロック配置。
 NowSelectBox(); //現在の選択。

 secondTurn(); //描画段階制御。アニメーション用変数の変化。

 if(!blight){   //導入部。だんだんと画面が明るくなる。
  ve_flag=true;
  if(!DarkOut())
   blight=true;
 }
 if(blight)
  SelectKey(); //第三段階。キー入力による制御切り替え。

 if(bdark)
  darks();          //だんだん画面が暗くなる。次の画面へ。

 return;
}

強制終了が発生するのは、
gamestatus=GS_ZINSELECT;
に移してから、十数秒後〜二十数秒後の間。
その他クラスでは別段問題が発生しているわけではないというのが現状で、
ポイントは、これが不正な処理による強制終了でなく、
あくまで、自然に終了する[デバック停止]ボタンなどをクリックした際と、
同様な終了であるということ(エラーメッセージが出ない)。

おそらく、上記のコードを見ても、解決策はなかなかでないと思うので、
(メソッド多用につき、具体的な処理はなにも記されていないのでイメージしかつかめないと思う)
こんなとき、エラーメッセージなく強制終了が起こる、といった判例を挙げていただくと、
とても参考になります。
よろしくお願いします。

DxLibは(DxLib_VC2_24b.exe)。VC2008での実行。


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

Name: Justy  ..伝説なるハッカー(415,446ポイント)   Date: 2009/09/05(土) 13:48   No:38839     
Title: Re:DxLibに詳しい人へ質問です    
 まず、DXライブラリを最新版(2.25b)にしてみてはどうでしょうか。

 それでも再現するのであれば、本当に強制終了かどうかを確認してみましょう。

 DXライブラリが吐き出す Log.txtに

    ウインドウを閉じようとしています
    ウインドウが破棄されようとしています
    ソフトを終了する準備が整いました


の3行はありますか?

 これがあるなら、ある意味正常終了ということなります。


 あとはどこで落ちているかを確認しましょう。

AppLogAddでも OutputDebugString()でもいいんで、メイン関数と
P_Draw()内のあちこちにそこを通過したことが判るようなログを仕掛けて下さい。

 多少処理は重くなりますが、これで落ちてくれればどこまで実行され
どれが実行されずに終わったかがわかると思うので、何回も行えば
該当箇所が絞り込めると思います。



>エラーメッセージなく強制終了が起こる、といった判例

 真っ先に思い浮かぶのは exit関数とか、それに類するものが呼ばれた場合ですね。


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

Name: usami  ..入門者(2,905ポイント)   Date: 2009/09/05(土) 17:31   No:38855     
Title: Re:DxLibに詳しい人へ質問です    
Justyさん、ありがとうございます。

おっしゃるように、
とりあえずLog.txtにあたってみると(これまでログなど気にしたこともありませんでした)、
原因はあっさりと判明しました。

どうやら、
for文でキャラクターの背景となる、画像を描画していたことに端を発する、
グラフィクス数の許容量オーバーということのようです。
320×320の間に、32×32の画像をおよそ100。16×16の画像を20程度。
あと、キャラクターやら、なにやらで、1回の処理に、150程のグラフィクスを表示し、
その繰り返しで、グラフィクス数の許容量を越え、終了命令が発生していた模様です。

しかしながら疑問なのですが、
俗に弾幕系と呼ばれるシューティングゲームなどでは、
一度の処理に100や200の画像を表示することなど珍しくないことだと思うのですが、
こういったゲームの場合、上記の問題をいかにクリアされているのでしょうか?

とりあえず、今回はこの背景となるレンガを一枚の画像で表現することで、
問題を回避しようと思うのですが、
この問題は後にひきそうなので、
ぜひご存知の方は教えていただけたらと思います。


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

Name: yu  ..プログラマー(37,923ポイント)   Date: 2009/09/05(土) 17:35   No:38856     
Title: Re:DxLibに詳しい人へ質問です    
違う弾ですが、グラフィックは同じなので
そのグラフィックハンドルを使い回せば良いです


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

Name: usami  ..入門者(3,927ポイント)   Date: 2009/09/05(土) 18:18   No:38861     
Title: Re:DxLibに詳しい人へ質問です    
vuさん、書き込みありがとうございます。
言葉が足りなかったようです申し訳ありません。

今回発生した問題は

for(int i=0; i<10; i++) //たとえばこれはレンガを敷くこと。
for(int j=0; j<10; j++)
DrawGraph( 32*i, 32*j, ghandle1, true);

for(int i=0; i<20; i++){ //たとえばこれはレンガの外枠。横軸。
DrawGraph( 16*j, 0, ghandle2, true);
DrawGraph(16*j, rect.botom-32, ghandle3, true);
}

(以下略)
//縦軸とか。
//キャラクターの配置とか。


この場合、グラフィックハンドル自体は使いまわしなのですが、
グラフィック数が許容量を越えている、とログは報告してきています。
なので十数秒〜二十数秒、すなわち一万〜二万回処理を行い、
処理1回150〜200程DrawGraph()呼び出しを行った末の、
描画しすぎの集積によるエラーだと自分は理解しました。

先の質問はこの理解の上のものです。(ひょっとしたら、これ自体が間違っているかもしれないのですが)

この場合、たとえば、弾丸200発が常時画面上に発生する、
シューティングゲームなんかを作成すると、
と同じ問題に直面するのではないか、と単純に思って質問させていただいたのです。


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

Name: yu  ..プログラマー(38,071ポイント)   Date: 2009/09/05(土) 18:24   No:38863     
Title: Re:DxLibに詳しい人へ質問です    
そうでしたか・・・
すみません orz

グラフィックをロードし、解放していなく
これ以上ロードできない状態になっているのかと思っていました

DrawGraph()を多く呼び出しただけで強制終了するのでしょうか?・・・
以前にSTGを作りましたが 1フレーム に3000回ぐらい描画していましたよ
特に特別な処理はしていませんよ(多分


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

Name: MNS  ..中級者(14,840ポイント)   Date: 2009/09/05(土) 18:24   No:38864     
Title: Re:DxLibに詳しい人へ質問です    
画像をロードする処理を見直してみてください。
何らかの手違いで大量に画像がロードされていることはありませんか?
もし、それでも原因が分からなかった場合は、
その処理が書かれている範囲のコードを提示されたほうが良いと思います。


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

Name: Justy  ..伝説なるハッカー(415,453ポイント)   Date: 2009/09/05(土) 18:38   No:38866     
Title: Re:DxLibに詳しい人へ質問です    

>グラフィック数が許容量を越えている、とログは報告してきています。

 このエラーは、LoadGraphなどでテクスチャを生成する際に内部的に最大数を越えた場合に
発生するものだと思うので DrawGraphが原因ではないと思いますが、試しにその DrawGraphを
コメントアウトして表示しないようにしたらどうなりますか?


 又、無駄に LoadGraphなどテクスチャの新規生成を行っている箇所がないか
調べてみて下さい。
(或いは GetGraphNum()で毎フレーム、登録されている画像数を確認してみるのも
いいかもしれません)


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

Name: usami  ..入門者(4,048ポイント)   Date: 2009/09/05(土) 18:50   No:38868 解決!     
Title: Re:DxLibに詳しい人へ質問です    
vuさん、MNSさん、Justyさんのおっしゃるように、
見返してみると、確かに結構メモリに画像をロードしているようです。
(他クラス、コンストラクタとかで)

失礼しました。

さらに、チェックしてみると、フラグの立て方のミスにより、
繰り返し画像のロードがされていることも判明。これが致命傷!!


とりあえず、コンストラクタでロードしていたグラフィックを、
Draw()メソッドへまわせば、この問題は解決だと思われます。

お付き合いいただきありがとうございました。


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



Name: 名無し  ..入門者(4,819ポイント)   Date: 2009/09/05(土) 14:58   No:38843       
Title: レーザーの実装について    
レーザーの当たり判定について質問があります。

龍神録プログラミングの館の34・35章を参考にレーザーを作っていたのですが、
レーザーの当たり判定が出現した瞬間、本来の当たり判定以外の場所(画面全体)に判定が出てしまいます。
画面全体に判定が出るのはその時だけで、以降は正しいレーザーの当たり判定になっています。

これまで1章のプロジェクトファイルを更新する形で作ってきていて、
34章及び35章のプロジェクトファイルと出来る限り見比べてみたのですが、相違が見つかりませんでした。
この場合、不具合の原因は何が考えられるのでしょうか?

ソースコードを貼れればいいのですが、怪しいと思われる場所が特定できませんでした。申し訳ないです。
ちなみにコンパイルの時点ではエラーは発生していません。


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


Name: yu  ..プログラマー(37,777ポイント)   Date: 2009/09/05(土) 16:16   No:38850     
Title: Re:レーザーの実装について    
>>この場合、不具合の原因は何が考えられるのでしょうか?

う〜ん・・・
やはりどこかが違っているのだと思います


>>ソースコードを貼れればいいのですが、怪しいと思われる場所が特定できませんでした。

アップローダーを利用してプロジェクトを全て上げてください。
分からなかったら
out.cpp, out_lazer.cpp, shot.cpp, boss_shotH.cpp
以上のフェイルを添付して見せてください


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

Name: 名無し  ..入門者(4,856ポイント)   Date: 2009/09/05(土) 16:42   No:38851     
Title: Re:レーザーの実装について    
>>out.cpp, out_lazer.cpp, shot.cpp, boss_shotH.cpp
やはりこの辺が怪しいという事ですよね…。何度も確認してはみたのですが。
プロジェクトファイルを添付しました。
どうぞ宜しくお願いします。


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

Name: yu  ..プログラマー(37,890ポイント)   Date: 2009/09/05(土) 17:22   No:38853     
Title: Re:レーザーの実装について    
main.cpp内の 
shot_main() と boss_shot_main() の実行する順番を変えてみてださい

レーザーの当たり判定の場所(outpt)を計算する前に
自機とレーザーの当たり判定を計算していました


>>out.cpp, out_lazer.cpp, shot.cpp, boss_shotH.cpp
>>やはりこの辺が怪しいという事ですよね…。何度も確認してはみたのですが。

見事に外れました。orz
これだけのファイルだったら見つけられませんでした


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

Name: 名無し  ..入門者(4,776ポイント)   Date: 2009/09/05(土) 17:43   No:38858 解決!     
Title: Re:レーザーの実装について    
yuさんありがとうございます。解決しました。
main.cpp内で計算する順番が間違っていたのですね。
当たり判定の計算自体が誤っているものとばかり…。
本当にありがとうございました。助かりました。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +