C言語何でも質問掲示板

Total hit  今日  昨日  



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

 
   C言語歴一ヶ月です   
     ・[42910] チルチル 
     ・[42911] MNS 
     ・[42918] Alf 
     ・[42919] チルチル 
     ・[42921] Alf 
   C言語のプログラミング ....   
     ・[42743] たかぎ 
     ・[42745] non 
     ・[42913] shevchenko 
   和訳をお願いします;   
     ・[42799] やんち 
     ・[42864] yrao 
   メモリの上書き   
     ・[42836] MNS 
     ・[42842] やっくん 
     ・[42844] softya 
     ・[42862] やっくん 
   sin波ショットや円運動 ....   
     ・[41927] チルチル 
     ・[41934] チルチル 
     ・[41939] チルチル 
     ・[41944] トリ 
     ・[41956] トリ 
     ・[41994] チルチル 
     ・[41995] チルチル 
     ・[42165] トリ 
     ・[42172] チルチル 
     ・[42351] トリ 
     ・[42354] チルチル 
     ・[42400] トリ 
     ・[42406] チルチル 
     ・[42482] トゥル太郎(=トリ) 
     ・[42490] チルチル 
     ・[42592] icon 
     ・[42603] チルチル 
     ・[42605] チルチル 
     ・[42606] チルチル 
     ・[42607] チルチル 
     ・[42608] チルチル 
     ・[42609] チルチル 
     ・[42610] icon 
     ・[42612] icon 
     ・[42722] トゥル太郎 
     ・[42736] チルチル 
     ・[42739] softya 
     ・[42748] チルチル 
     ・[42835] トゥル太郎 
   3D表示でのカメラの向 ....   
     ・[42667] Justy 
     ・[42720] Kou 
     ・[42749] softya 
     ・[42810] Kou 
   敵にショットさせるこ ....   
     ・[42747] softya 
     ・[42793] jay 
   プログラミング   
     ・[42788] non 
   文字化けが起きてしま ....   
     ・[42721] たかぎ 
     ・[42762] 南瓜 
     ・[42769] たかぎ 
     ・[42770] 南瓜 
     ・[42773] たかぎ 
     ・[42781] 南瓜 
     ・[42783] 南瓜 
     ・[42784] たかぎ 
     ・[42785] 南瓜 
   sinとcosを求める   
     ・[42659] MNS 
     ・[42673] toyo 
     ・[42776] Naohiro19 
     ・[42778] TKOZ 
     ・[42779] 初級者 
     ・[42780] dic 
   計算プログラム   
     ・[42021] 組木紙織 
     ・[42069] non 
     ・[42111] 9mm 
     ・[42118] 組木紙織 
     ・[42132] 9mm 
     ・[42139] 組木紙織 
     ・[42140] もぐりん 
     ・[42144] 組木紙織 
     ・[42290] 9mm 
     ・[42298] 組木紙織 
     ・[42328] 9mm 
     ・[42329] dic 
     ・[42332] non 
     ・[42378] 9mm 
     ・[42380] non 
     ・[42383] Jitta 
     ・[42384] 9mm 
     ・[42396] non 
     ・[42399] 9mm 
     ・[42401] 組木紙織 
     ・[42402] 9mm 
     ・[42403] 組木紙織 
     ・[42405] 9mm 
     ・[42407] 組木紙織 
     ・[42410] 9mm 
     ・[42414] 組木紙織 
     ・[42488] Jitta 
     ・[42579] 9mm 
     ・[42593] Jitta 
     ・[42629] 組木紙織 
     ・[42645] 9mm 
     ・[42662] Jitta 
     ・[42664] 組木紙織 
     ・[42674] 9mm 
     ・[42675] バグ 
     ・[42676] 組木紙織 
     ・[42680] 9mm 
     ・[42706] 組木紙織 
     ・[42707] たいちう 
     ・[42714] Jitta 
     ・[42716] 9mm 
     ・[42717] 組木紙織 
     ・[42771] Jitta 
     ・[42775] 9mm 
   スタックオーバー   
     ・[42732] 御津凪 
     ・[42733] 初心者 
     ・[42734] 初心者 
     ・[42735] softya 
     ・[42738] 御津凪 
     ・[42741] 初心者 
     ・[42746] softya 
     ・[42750] 初心者 
     ・[42774] 初心者 
   C言語エラーについて   
     ・[42756] 初級者 
     ・[42758] conio 
     ・[42761] P 
     ・[42764] ぬんぬん 
     ・[42765] conio 
     ・[42767] softya 
     ・[42768] P 
   プログラミング   
     ・[42766] softya 
   ファイル出力がうまく ....   
     ・[42435] Justy 
     ・[42436] ぽこ 
     ・[42437] dic 
     ・[42440] Justy 
     ・[42446] dic 
     ・[42447] Justy 
     ・[42499] dic 
     ・[42500] softya 
     ・[42502] Justy 
     ・[42521] dic 
     ・[42523] softya 
     ・[42541] dic 
     ・[42752] dic 
     ・[42753] dic 
   テーブル参照   
     ・[42726] 朽木 
     ・[42744] たかぎ 
   落ちゲーのピースの作 ....   
     ・[42728] バグ 
     ・[42729] 朽木 
     ・[42737] softya 
     ・[427271259810017] 黒ヤギ 
   コマンドプロンクト   
     ・[42692] たかぎ 
     ・[42693] softya 
     ・[42698] 天和 
     ・[42699] 天和 
     ・[42700] non 
     ・[42701] softya 
     ・[42702] non 
     ・[42704] softya 
     ・[42705] softya 
     ・[42708] 天和 
     ・[42709] softya 
     ・[42710] たかぎ 
     ・[42711] 天和 
     ・[42712] softya 
     ・[42713] 天和 
     ・[42723] toyo 
   高速フ−リエ   
   当たり判定について   
     ・[42587] softya 
     ・[42647] Ω 
     ・[42649] Mist 
     ・[42650] softya 
     ・[42651] YuO 
     ・[42652] Ω 
     ・[42653] softya 
     ・[42654] Ω 
     ・[42656] softya 
     ・[42696] Ω 
     ・[42697] softya 
   無題   
     ・[42684] softya 
     ・[42685] non 
     ・[42687] マーサ 
     ・[42688] Mist 
     ・[42689] non 
     ・[42690] non 
     ・[42694] softya 
     ・[42695] non 
   効果音が鳴らない...   
     ・[42372] 御津凪 
     ・[42379] フランドールの義兄 
     ・[42387] 御津凪 
     ・[42443] フランドールの義兄 
     ・[42448] 御津凪 
     ・[42571] フランドールの義兄 
     ・[42572] 御津凪 
     ・[42681] フランドールの義兄 
     ・[42683] 御津凪 
     ・[423661259818827] フランドールの義兄 
   マップエディタについ ....   
     ・[42678] バグ 
     ・[42679] ラッコ 
   ウィンドウの大きさ変 ....   
     ・[42672] kazuoni 
   無題   
     ・[42549] チルチル 
     ・[42550] ひよこ 
     ・[42655] Ω 
     ・[42660] チルチル 
   無題   
     ・[42630] 組木紙織 
     ・[42637] non 
     ・[42646] あや 
   rang()について   
     ・[42639] バグ 
     ・[42640] たこやき 
     ・[42641] Dixq (管理人) 
     ・[42642] softya 
     ・[42643] Dixq (管理人) 
     ・[42644] たこやき 
   ショットの打ち方。   
     ・[42588] softya 
     ・[42611] sisi 
     ・[42619] softya 
     ・[42635] sisi 
   DLLファイルが読み込ま ....   
     ・[42595] 御津凪 
     ・[42597] ジャーニー 
     ・[42600] 御津凪 
     ・[42601] ジャーニー 
     ・[42604] 御津凪 
     ・[42614] ジャーニー 
     ・[42615] ジャーニー 
     ・[42616] 御津凪 
     ・[42617] 御津凪 
     ・[42618] ジャーニー 
     ・[42620] 御津凪 
     ・[42621] ジャーニー 
     ・[42622] 御津凪 
     ・[42623] ジャーニー 
     ・[42624] 御津凪 
     ・[42625] ジャーニー 
     ・[42626] 御津凪 
     ・[42632] ジャーニー 
     ・[42633] 御津凪 
     ・[42634] ジャーニー 
   おねがいします!   
     ・[42554] kazuoni 
     ・[42555] AYA 
     ・[42556] kazuoni 
     ・[42557] あや 
     ・[42558] mnkr 
     ・[42559] あや 
     ・[42560] kazuoni 
     ・[42561] あや 
     ・[42562] たかぎ 
     ・[42631] あや 
     ・[425511259678781] あや 
   for文やwhile文につい ....   
     ・[42577] softya 
     ・[42578] たいやき 
     ・[42580] たいやき 
     ・[42581] たいやき 
     ・[42582] Mist 
     ・[42583] たいやき 
     ・[42584] softya 
     ・[42598] たいやき 
     ・[42602] たいちう 
     ・[42613] softya 
   cのビルドができません ....   
     ・[42591] softya 
     ・[42594] おかめ 
     ・[42596] softya 
     ・[42599] 御津凪 
   HWND_DESKTOPとNULLに ....   
     ・[42574] softya 
     ・[42575] ベース 
   ファミコンSTGを作って ....   
     ・[42518] ひよこ 
     ・[42522] TKOZ 
     ・[42524] ひよこ 
     ・[42539] TKOZ 
     ・[42542] softya 
     ・[42552] klos 
     ・[42553] バグ 
     ・[42566] けんたろうちゃん 
     ・[42569] TKOZ 
   横スクロールアクショ ....   
     ・[42257] softya 
     ・[42303] 宮 
     ・[42308] softya 
     ・[42345] 宮 
     ・[42352] softya 
     ・[42404] 宮 
     ・[42464] 宮 
     ・[42468] けんたろうちゃん 
     ・[42543] 宮 
     ・[42544] softya 
     ・[42565] けんたろうちゃん 
   ポインタに関する質問 ....   
     ・[42454] たかぎ 
     ・[42466] non 
     ・[42470] ゲンタシン 
     ・[42473] たかぎ 
     ・[42475] non 
     ・[42514] ゲンタシン 
     ・[42517] たかぎ 
     ・[42548] ゲンタシン 
   モデルとマップの当た ....   
     ・[42546] Justy 
   Getmessageについて   
     ・[42513] たこやき 
     ・[42527] tkmakwins15 
     ・[42528] たこやき 
     ・[42531] YuO 
     ・[42537] たこやき 
   画像表示   
     ・[42487] softya 
     ・[42536] trx 
   永夜抄のスペルカード ....   
     ・[42491] チルチル 
     ・[42534] 小夜 
   for文で画像ハンドルを ....   
     ・[42526] kazuoni 
     ・[42530] banba 
   改造龍神録:7章『フ ....   
     ・[42461] ROM 
     ・[42529] 藍霧00 
   龍神録についてです   
     ・[42494] チルチル 
     ・[42497] オラウー 
     ・[42498] チルチル 
     ・[42501] オラウー 
     ・[42504] チルチル 
     ・[42505] オラウー 
     ・[42506] オラウー 
     ・[42507] チルチル 
     ・[42509] オラウー 
     ・[42512] チルチル 
     ・[42516] オラウー 
     ・[42519] チルチル 
     ・[42520] オラウー 
   自作関数SetDrawの調子 ....   
     ・[42493] TKOZ 
     ・[42515] TKOZ 
   弾の描画について 2   
     ・[42462] チルチル 
     ・[42471] Ω 
     ・[42474] Cry 
     ・[42510] Ω 
   自機ショットオプショ ....   
     ・[42496] チルチル 

Name: Alf  ..ぴよぴよ(395ポイント)   Date: 2009/11/29(日) 20:51   No:42908       
Title: C言語歴一ヶ月です    
初めまして、本サイト様の龍神録プログラミングの館で勉強をさせていただいているものです。
どうしても、わからない所があるので質問させてください。

龍神録プログラミングの館から一括ダウンロードしたプロジェクトの21章の中の自機と敵機の絵を自分のに変えるために、絵の表示のアニメーションをなくそうとして、load.cppの
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
から
img_ch[0] = LoadGraph( "../dat/img/char/0.png");
と変えて
GV.hの変数宣言部の
GLOBAL int img_ch[12][2];

GLOBAL int img_ch;
に書き変えたのですが、
c:\documents and settings\yuki\デスクトップ\project\project\21章\mydat\source\graph.cpp(22) : error C2109: 配列または、ポインタでない変数に添字が使われました。
というエラーが出ました。
どうすれば、絵のアニメーションをなくして一枚絵で表示できるでしょうか?どなたか教えてください。


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


Name: チルチル  ..比類無きプログラマー(81,499ポイント)   Date: 2009/11/29(日) 20:57   No:42910     
Title: Re:C言語歴一ヶ月です    
おそらくエラーが出ている行で
img_ch[i][j]
見たいな事をやっていると思うので
img_ch
に変えれば良いと思います


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

Name: MNS  ..上級者(22,692ポイント)   Date: 2009/11/29(日) 21:01   No:42911     
Title: Re:C言語歴一ヶ月です    
img_ch[0] = LoadGraph( "../dat/img/char/0.png");
少なくともこれは
img_ch = LoadGraph( "../dat/img/char/0.png");
であると思います。


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

Name: Alf  ..ぴよぴよ(741ポイント)   Date: 2009/11/29(日) 21:34   No:42918     
Title: Re:C言語歴一ヶ月です    
>おそらくエラーが出ている行で
img_ch[i][j]
見たいな事をやっていると思うので
img_ch
に変えれば良いと思います

>img_ch[0] = LoadGraph( "../dat/img/char/0.png");
少なくともこれは
img_ch = LoadGraph( "../dat/img/char/0.png");
であると思います。

おっしゃられた通りに
img_ch[0] = LoadGraph( "../dat/img/char/0.png");

img_ch = LoadGraph( "../dat/img/char/0.png");
に書きかえ、エラーが出ているgraph.cppの
DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[0][ch.img],TRUE);

DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[ch.img],TRUE);
に書きかえたのですが、エラーに変化はありませんでした。
どうしたらよいのでしょうか?


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

Name: チルチル  ..比類無きプログラマー(81,572ポイント)   Date: 2009/11/29(日) 21:38   No:42919     
Title: Re:C言語歴一ヶ月です    
他にも書き直していない所があると思うのですが
とりあえず
DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[ch.img],TRUE);

DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch,TRUE);
では?


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

Name: Alf  ..ぴよぴよ(712ポイント)   Date: 2009/11/29(日) 21:51   No:42921 解決!     
Title: Re:C言語歴一ヶ月です    
おお!
見事に表示されました!
こんな基本的な見落としだったんですね。
助言していただき本当にありがとうございました。


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



Name: shevchenko  ..ぴよぴよ(399ポイント)   Date: 2009/11/27(金) 13:21   No:42730       
Title: C言語のプログラミング    
初めて投稿します。
C言語で次の二つの微分方程式
y'=yの解をx=0〜1の範囲
y'=-4yの解をx=0〜4の範囲
を、Euler法、Heun法、Runge-Kutta法により求めるプログラムを作りたい。
初期条件はx=0,y=1で、また、間隔Δxを変えたときの解の変化も調べたい。
何とかEuler法のプログラムは完成?したのですが、残りのHeun法、Runge-Kutta法が全く分からずお手上げ状態です。C言語は全くの初心者なので簡単に解説(回答)して頂ければありがたいです。回答よろしくお願いします。
<Euler法のプログラム>
#include_<stdio.h>
#include_<math.h>
int_main(){
__double__a=0;
__double__b;
__int_____m=10;
__int_____n;
__double__h;
__double__x,y;
__double__dydx;
__int_____k;
__double__e;
__double__f;
__printf("オイラー法計算例:y=e^x,_y=1/e^4x\n\n");
__//_y_=_e^x
__b_=_1;
__for(n=100;n<=10000;n*=100){
____h_=_(b-a)/n;
____printf("y'_=_y:_h(=dx)_=_%.1e_(y=e^x)\n",h);
____x_=_a;_y_=_1;
____for(k=0;k<=n;k++)_{
______x_=_k*h;
______if(k%(n/m)==0)_{
________f_=_exp(x);
________e_=_fabs(y-f);
________printf("x=%.2f,_y=%f,_e^x=%f_er=%.0e\n",
________x,y,f,e);
______}
______dydx_=_y;
______y_=_y_+_dydx*h;
____}
__}
__printf("\n");
__//_y_=_1/e^4x
__b_=_4;
__for(n=100;n<=10000;n*=100){
____h_=_(b-a)/n;
____printf("y'_=_-4y:_h(=dx)_=_%.1e_(y=1/e^4x)\n",h);
____x_=_a;_y_=_1;
____for(k=0;k<=n;k++)_{
______x_=_k*h;
______if(k%(n/m)==0)_{
________f_=_exp(-4*x);
________e_=_fabs(y-f);
________printf("x=%.2f,_y=%f,_1/e^4x=%f_er=%.0e\n",
________x,y,f,e);
______}
______dydx_=_-4*y;
______y_=_y_+_dydx*h;
____}
__}
__return_0;
}


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


Name: たかぎ [URL]  ..ハッカー(124,511ポイント)   Date: 2009/11/27(金) 17:18   No:42743     
Title: Re:C言語のプログラミング    
とりあえず下記でも参考にしてください。
http://oshiete1.goo.ne.jp/qa5479736.html


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

Name: non  ..比類無きプログラマー(71,501ポイント)   Date: 2009/11/27(金) 17:22   No:42745     
Title: Re:C言語のプログラミング    
Heun法、Runge-Kutta法をCでプログラミングする際の何がわからないのでしょうか?
何の解説が必要なのですか?
Heun法、Runge-Kutta法の理論はわかっているのですよね。
しかも、上のプログラムは自力で作れていますよね。

なお、ファイルを添付するときは、スペースやタブをアンダーバーで置き換えるのは
やめてください。



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

Name: shevchenko  ..ぴよぴよ(537ポイント)   Date: 2009/11/29(日) 21:12   No:42913 解決!     
Title: Re:C言語のプログラミング    
...

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



Name: you  ..ぴよぴよ(797ポイント)   Date: 2009/11/28(土) 20:15   No:42797       
Title: 和訳をお願いします;    

どうしてもわかりません。

The bicycle has already gone through one full of development.

お願いしますm(_ _)m


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


Name: やんち  ..ぴよぴよ(14ポイント)   Date: 2009/11/28(土) 21:31   No:42799     
Title: Re:和訳をお願いします;    
バイシクルは、既に通り去られました、開発のすべてを。

直訳です。
意訳まではわかりません。


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

Name: yrao  ..初心者(6,239ポイント)   Date: 2009/11/29(日) 17:19   No:42864     
Title: Re:和訳をお願いします;    

横から失礼します。

この英文はプログラミング関係の文ででしょうか?

どのような話の流れでこの英文が出て来たのかがわからないので、不適切な和訳になってしまうかもしれませんが、一つの案として、
「その自転車は既に開発の全てを承認されました。」
ではないでしょうか。

go through には、「〜を承認する、可決される」
という意味もありますので。
間違ってたらすみません(汗



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



Name: やっくん  ..中級者(13,186ポイント)   Date: 2009/11/29(日) 14:16   No:42834       
Title: メモリの上書き    
こんにちわ。
DXライブラリを使用していて、以下のソースでメモリの問題が発生したのですが自分ではどうなっているかわからないのでご教授お願いします。
-------ソース---------

mahou_txt_reading();

/* ダメージ画像 */
for(i = 0; i < 10; i++){
sprintf(fname, "damage%d.bmp", i);
effect_damage[i] = LoadGraph(fname);
}

------------------------
mahou_txt_reading()では
魔法名
魔法の説明
1,3,3,50,360
の3行分×15個のテキストデータを構造体のメンバに読み込んでいます。
読み込んだ後、各メンバを画面に出力したら問題なく全て表示されます。
ですが、
その後の「ダメージ画像読み込み」という部分で10枚の画像を読み込んだ後、
魔法のデータを入れている一つ目のメンバに全く関係ない文字[.]が上書きされて入ってきました。
この二つの読み込みの間にも同じような手法で別の画像を多く読み込んでいます。
そこまでは問題なかったのですが、「ダメージ画像読み込み」を追加したらこのような現象がおこりました。
これはどうしてでしょうか?


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


Name: MNS  ..上級者(22,634ポイント)   Date: 2009/11/29(日) 14:59   No:42836     
Title: Re:メモリの上書き    
変数fnameはchar配列だと思うのですが、
その配列の容量は十分確保されていますか?


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

Name: やっくん  ..中級者(13,283ポイント)   Date: 2009/11/29(日) 16:16   No:42842     
Title: Re:メモリの上書き    
はい。
char fname[256];
と宣言しています。
ちなみに、ソースで
sprintf(fname, "damage%d.bmp", i);
effect_damage[i] = LoadGraph(fname);
とありますが、ここでの
damage%d.bmp

dat/gazou/effect/damage/damage%d.bmp
を略して書いています。
ですが、fnameに十分入りきれる量なので大丈夫かと思います。
同じ関数内でfnameを1箇所使いまわしているので使っている部分を載せます。

// 敵画像を読み込み
for(i = 0; i < ENEMY_MAX; i++){
  sprintf(fname,"dat/gazou/enemy/enemy%d_0.png",i + 1);
  en[i].image = LoadGraph(fname);
}


これは「ダメージ画像読み込み」で処理していますが、fname[256]で十分足りています。
また、「敵画像読み込み」の処理後に問題となっているメンバを表示させても正常に表示されています。


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

Name: softya  ..熟練のプログラマー(50,048ポイント)   Date: 2009/11/29(日) 16:24   No:42844     
Title: Re:メモリの上書き    
何処かの配列の要素数が足らないとしか思えません。
関連する全てのソースを開示してください。


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

Name: やっくん  ..中級者(13,416ポイント)   Date: 2009/11/29(日) 17:18   No:42862 解決!     
Title: Re:メモリの上書き    
>何処かの配列の要素数が足らないとしか思えません。
おっしゃる通りでした><
ヘッダーで「ダメージ画像読み込み」の処理で使う変数effect_damageを宣言してたのですが、要素数が足りませんでした。書き直すと動きました。

MNSさん、softyaさんありがとうございました。
解決とします。


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



Name: トリ  ..ぴよぴよ(378ポイント)   Date: 2009/11/13(金) 18:56   No:41916       
Title: sin波ショットや円運動ショットレーザーを作りたいのですが…    
過去ログのhttp://www.play21.jp/board/formz.cgi?action=res&resno=38458&page=30&lognum=118&id=dixq&rln=38530
で、ノードというものを使用してレーザー弾をチルチルさんが作成されておられますが、
これはどういう風に導入すればいいのでしょうか?
shotH.cppの中のvoid shot_bullet_H014(int n)などに直接書いても、エラーがでてしまうので教えて頂けないでしょうか?

あと、これを通常弾で再現したいと思い、通常弾用のsin波ショットのコードを作成したのですが
角度がPI/2の時だけしか再現できませんでした。bossatan2()を使用すると敵の横に移動すると弾が固まってしまいます。

//弾発射関数
void boss_bullet_on(int way,int knd,int col,double x,double y,double b_angle,double d_angle,double spd,int state,int till,int eff=0,int sflag=1){
int i,k;
for(i=0;i<way;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd = knd;//弾の種類
if(knd==7) boss_shot.bullet[k].kaiten=1;
else boss_shot.bullet[k].kaiten=0;
boss_shot.bullet[k].col = col;//弾の色
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].x = x;//座標
boss_shot.bullet[k].y = y;
boss_shot.bullet[k].angle = b_angle+d_angle*(i - way/2);//角度:bが基準、dが間隔
boss_shot.bullet[k].spd = spd;//スピード
boss_shot.bullet[k].state = state;//弾の状態
boss_shot.bullet[k].till = till;//弾が画面外に出ても消えない時間
boss_shot.bullet[k].eff = eff;//加算ブレンドするか否か
boss_shot.bullet[k].size = 3;
if(sflag==1)se_flag[0]=1;
}
}
}
void boss_shot_bulletH012(){
int i,t=boss_shot.cnt%100;
static double x = boss.x;
//double x,y,ang;
if(t==0){
//boss_shot.base_angle[0]=rang(PI2);

}
if(t<45 && t%4==0){
//ang=boss_shot.base_angle[0]+t*PI2/45;
boss_bullet_on(1,8,6,boss.x,boss.y,PI/2,0,4,0,0);
}


for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag==1){
boss_shot.bullet[i].x = cos(PI2/360*boss_shot.bullet[i].y)*30 + x;
}
}
}


何か手掛かりを教えて頂けないでしょうか・・・?


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


Name: チルチル  ..比類無きプログラマー(74,885ポイント)   Date: 2009/11/13(金) 20:43   No:41927     
Title: Re:sin波ショットや円運動ショットについて    
>これはどういう風に導入すればいいのでしょうか?

う〜ん、これは自分で作ったコードに導入する為に作ったので
龍神録に直接書くとエラーが出るのは仕方ないですね・・

導入するとなると双方向循環リストを理解する必要がありますね
これは解説サイトに詳しく書いてあると思います

と言うかレーザーが消えるとアイテムに変わりますけど
線形リストなので弾の最大数が決まっておらず
アイテムが配列で用意されている龍神録に導入すると
何か補正をしない限りオーバーフローを起こす危険性がありますね
まあ消えた時にアイテムに変えなければ問題ないですけど・・

龍神録のコードが理解できていないので明確な回答はできませんが
過去ログの時は悪ノリしていた上にクラスや分割コンパイルが使えなかったので
導入するとしたらソースとヘッダに分けてメインループや初期化部分で関数を呼ぶ感じになると思います

あと期待を裏切るようで言いにくいのですが、完成したレーザーを実装した直後に
ゲームの基礎部分の初期に作った手抜き部分が補いきれないと言う結論に達したのでコードを1から作り直しました
なので頑張って作ったレーザーは使用する前にボツになると言う結末を迎えましたね・・

>あと、これを通常弾で再現したいと思い、通常弾用のsin波ショットのコードを作成したのですが

龍神録のコードが理解できていないのでパッと原因はわかりませんが

>角度がPI/2の時だけしか再現できませんでした。bossatan2()を使用すると敵の横に移動すると弾が固まってしまいます。

p->x=P->x+cos(P->Angle+PI/2*P->Exception[0])*(sin((float)P->Count/10)*40);//波移動
p->y=P->y+sin(P->Angle+PI/2*P->Exception[0])*(sin((float)P->Count/10)*40);//波移動

PI/2って過去ログのこれの事でしょうか?
これは進行方向に対して右を表しているので変更してはいけません

もしくはsin波ショット全体が下に進んでいる時しか正常に動かないと言う事でしょうか?

それだったらおそらく上のコードの

boss_shot.bullet[i].x = cos(PI2/360*boss_shot.bullet[i].y)*30 + x;

が原因だと思います

過去ログの波移動している部分に相当すると思われますが
進行方向に対して左右なのでY座標も変更しないといけません

と言うよりX座標の計算でY座標が出てくるのはなぜでしょうか?

円移動ショットに関しては毎フレーム座標を代入するのでみょん弾幕に近いです


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

Name: チルチル  ..比類無きプログラマー(75,466ポイント)   Date: 2009/11/13(金) 22:53   No:41934     
Title: Re:sin波ショットや円運動ショットについて    
と言っても言葉ではわかりにくいので
見よう見まねで円移動ショットを作ってみました
void boss_shot_bulletH002(){

int i,k,t=boss_shot.cnt;
if(t==0){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 0;
boss_shot.bullet[k].x = 0;
boss_shot.bullet[k].y = 0;
boss_shot.bullet[k].knd = 8;
boss_shot.bullet[k].angle = 0;
boss_shot.bullet[k].base_angle[0] = PI/2;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 0;
boss_shot.bullet[k].state = 0;
boss_shot.bullet[k].kaiten= 0;
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
boss_shot.bullet[i].x = boss.x + cos( boss_shot.bullet[i].base_angle[0] + boss_shot.bullet[i].cnt * 0.03 ) * 100 ;
boss_shot.bullet[i].y = boss.y + sin( boss_shot.bullet[i].base_angle[0] + boss_shot.bullet[i].cnt * 0.03 ) * 100 ;
boss_shot.bullet[i].angle = boss_shot.bullet[i].base_angle[0] + boss_shot.bullet[i].cnt * 0.03 + PI/2 ;
}
}
}
一応円移動しますがコードの意味を推測しながら作ったので構文が汚いと思います
計算式の導入方法を理解するサンプルになれば嬉しいので
これで理解できたら自分のコードに応用してみてください
次はsin波ショットを作ってみます・・


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

Name: チルチル  ..比類無きプログラマー(76,365ポイント)   Date: 2009/11/13(金) 23:39   No:41939     
Title: Re:sin波ショットや円運動ショットについて    
sin波ショットを作ってみました
void boss_shot_bulletH002(){

int i,k,t=boss_shot.cnt;
if( t==0 )boss_shot.base_angle[0] = bossatan2();
if( t<600 && t%4==0 ){
for(i=0;i<2;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = i;
boss_shot.bullet[k].x = 0;
boss_shot.bullet[k].y = 0;
boss_shot.bullet[k].knd = 8;
boss_shot.bullet[k].angle = 0;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 0;
boss_shot.bullet[k].state = i?1:-1;
boss_shot.bullet[k].kaiten= 0;
}
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
double x=boss_shot.bullet[i].x;
double y=boss_shot.bullet[i].y;
boss_shot.bullet[i].x = boss.x + cos( boss_shot.base_angle[0] ) * ( boss_shot.bullet[i].cnt * 2.5 ) + cos( boss_shot.base_angle[0] + PI/2 * boss_shot.bullet[i].state ) * sin( boss_shot.bullet[i].cnt * 0.1 ) * 35 ;
boss_shot.bullet[i].y = boss.y + sin( boss_shot.base_angle[0] ) * ( boss_shot.bullet[i].cnt * 2.5 ) + sin( boss_shot.base_angle[0] + PI/2 * boss_shot.bullet[i].state ) * sin( boss_shot.bullet[i].cnt * 0.1 ) * 35 ;
boss_shot.bullet[i].angle = atan2( boss_shot.bullet[i].y-y , boss_shot.bullet[i].x-x );
}
}
}
あくまで計算式のサンプルなので汚いです・・
ちなみに円移動ショットとかsin波ショットの計算式は何種類かあって
これらはその中の1つなので慣れてきたら自分でも考えてみてください

それで問題のレーザーなんですが
これはパッと導入できる規模ではないので
トリさんの目的を聞きたいです

単に龍神録に実装してみたいのであれば
できるかどうかわかりませんが実装を試みます

もしくはアルゴリズムを参考にしたいのであればできる限り説明します

余談ですが静止画だと綺麗に見えますが動いてると結構気持ち悪いですよ・・

2Dポリゴンで描画しているので表示がガタガタしないように
毎フレーム弾を登録する事にしたのでグレイズがガンガン上がります・・

まあボツにした理由はこの辺も大きいかもしれませんね・・

あとレーザーのコードなんですがリンク切れで見れなかったりしませんでしたか?
それはそれで怖いので一応コードを添付しておきます・・


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

Name: トリ  ..ぴよぴよ(420ポイント)   Date: 2009/11/14(土) 01:43   No:41944     
Title: Re:sin波ショットや円運動ショットについて    
チルチルさん、詳しい回答本当にありがとうございます。
それにわざわざ、sin波などのコードも紹介して頂いて本当にすみません…。

>何か補正をしない限りオーバーフローを起こす危険性がありますね
その場合は、個々の弾を隙間なく発射させて加算ブレンドという方法にした方がいいんですかね…

早速、チルチルさんのコードを自分のプログラムに移植して
一応、教えてくださったsin波ショットでレーザーっぽく見えるショットを作成してみました。
画像の通りなのですが、作成と言っても加算ブレンドしただけで、それに先端と末尾が透けてないので
本家っぽくはないので、けっこう変です…あとは試行錯誤の問題ですね…


この方法だと
自機が当たるとレーザーが途切れるという現象くらいかなと考えているのですが
他に問題ありますかね…?

>PI/2って過去ログのこれの事でしょうか?
これは自分のコードで使っていた
boss_bullet_on(1,8,6,boss.x,boss.y,bossatan2(),0,4,0,0);
の部分のことです。bossatan2()のところでPI/2つまり、真下に自機がいた場合のみに正常に動作するということです。
なんだか、本当にわかりづらくてすみません…。

>と言うよりX座標の計算でY座標が出てくるのはなぜでしょうか?
これは恥ずかしすぎて、なぜこんなことをしているのか言いにくいのですが
最初真下にsin波をうたせることだけを考えていたために、yの変化を代入していたということです。
やはりチルチルさんのおっしゃる通り、これが原因ですね…。
それに自分のコードはy座標の分も書いていないので本当に何やってんだかわからないですね…

>トリさんの目的を聞きたいです
画像を参照して頂けるとお分かりだと思いますが、目的は今ちょっと作ってるゲームで、
さまざまなショットを作成したいと考えています。ゲームの流れとかはほとんどできているのですが
なにぶん、弾幕やショットを作るのが苦手で、簡単なものしか自力でつくれない状態です。
なかなか複雑な通常弾幕やレーザー系の弾幕が思い浮かばないのでノードを勉強して使った方がいいのかなと
思い、今回質問をさせて頂きました。
とはいっても相循環リストを理解していないのでまずそこが課題なのですが…

レーザーの導入はhttp://dixq.net/rp/34.htmlで曲がったレーザーや円形のレーザーなどが作成できるのであれば、34章と真剣に向き合って勉強しようと考えていますが、このレーザーは直線メインでしょうか?
またまた、質問になってしまいすみません…。

それにしてもチルチルさんはあっさりコードを作成なされて頭があがりません…。
本当に感無量です…。


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

Name: トリ  ..ぴよぴよ(766ポイント)   Date: 2009/11/14(土) 10:28   No:41956     
Title: Re:sin波ショットや円運動ショットについて    
再びすみません。
チルチルさんのsin波コードをいじっていて
int i,k,t=boss_shot.cntをint i,k,t=boss_shot.cnt%100;に変更して
if( t<600 && t%4==0 )をif( t<60 && t%3==0 )に変更して
100カウント周期で何度も発射させるようにしたのですが
画像のようにsin波ショットが瞬間移動してしまいます。
チルチルさんのコードはt==0のとき
boss_shot.base_angle[0] = bossatan2();
を代入しているので、
http://dixq.net/rp/14.html
自機に向かって直線発射(角度記憶)のしくみと同じだと思うのですが、
なぜ瞬間移動してしまうのでしょうか…?

boss_shot.bullet[i].x = boss.x + cos( boss_shot.base_angle[0] ) * ( boss_shot.bullet[i].cnt * 2.5 ) + cos( boss_shot.base_angle[0] + PI/2 * boss_shot.bullet[i].state ) * sin( boss_shot.bullet[i].cnt * 0.1 ) * 35 ;
boss_shot.bullet[i].y = boss.y + sin( boss_shot.base_angle[0] ) * ( boss_shot.bullet[i].cnt * 2.5 ) + sin( boss_shot.base_angle[0] + PI/2 * boss_shot.bullet[i].state ) * sin( boss_shot.bullet[i].cnt * 0.1 ) * 35 ;

この2行が軌道計算の核だと思うのでここをいじればなんとかなりますかね…

それと、スピードを速くしようとしてxとyの部分の( boss_shot.bullet[i].cnt * 2.5 )を
( boss_shot.bullet[i].cnt * 3.5 )に変更してみましたが、
確かに速くはなるのですが、周期が大きくかわってしまい、sin波が伸びた状態になってしまいます。

何度も本当にすみません…。


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

Name: チルチル  ..比類無きプログラマー(75,299ポイント)   Date: 2009/11/14(土) 17:18   No:41994     
Title: Re:sin波ショットや円運動ショットについて    
>その場合は、個々の弾を隙間なく発射させて加算ブレンドという方法にした方がいいんですかね…

え〜とオーバーフローは弾数の問題なので描画方法は関係ないです
アイテムが2000個用意されている時にレーザーの弾が5000個あったらオーバーしてしまうって事ですね

と言うより敵やアイテムが配列で用意されている所に線形リストを持ち込むと
他も線形リストにしないと噛み合わなくなってしまいますからね・・

普通に弾数を少なくする工夫をして、必要ならアイテムの最大数を増やすと言う方法もありますが・・

>画像の通りなのですが、作成と言っても加算ブレンドしただけで、それに先端と末尾が透けてないので

両端を薄くしたり細くしたりするのが簡単なのが2Dポリゴンのメリットなんですが
並べる場合は全体に対しての位置を求めてブレンドするとかでしょうかね・・

>他に問題ありますかね…?

配列の場合は重ねた時に同化しない画像だと
添え字が順番に並んでいないと汚くなるとかでしょうかね・・

>の部分のことです。bossatan2()のところでPI/2つまり、真下に自機がいた場合のみに正常に動作するということです
>それに自分のコードはy座標の分も書いていないので本当に何やってんだかわからないですね…

進行方向に対して左右に揺らしますが
X座標にしか反映されていないので進行方向が下でないと表示に出ないんでしょうね
だとすると上方向でも動作するはずですが・・

>画像を参照して頂けるとお分かりだと思いますが、目的は今ちょっと作ってるゲームで、
>さまざまなショットを作成したいと考えています。ゲームの流れとかはほとんどできているのですが

これはクオリティが凄いですね
素材の完成度が高いですが自作したのでしょうか?
完成したらやってみたいので良かったら掲示板で公開してください

>なにぶん、弾幕やショットを作るのが苦手で、簡単なものしか自力でつくれない状態です。
>なかなか複雑な通常弾幕やレーザー系の弾幕が思い浮かばないのでノードを勉強して使った方がいいのかなと

まあ確かにアレは本家を超えるレーザーを作るために開発したんですが
星蓮船に先を越されたので今はエフェクトとアシストの融合を検討しています・・

>とはいっても相循環リストを理解していないのでまずそこが課題なのですが…

線形リストを導入する前はscanf関数ぐらいしかポインタを使っていなかったんですが
サイトを見てみると結構簡単に理解できましたよ
サンプルコードを理解するより、アルゴリズムを理解して自分で作る覚え方が私のオススメです

双方向循環リストは使ってみると凄く便利で、それ以降は配列を使う事がほとんど無くなりましたね・・
参考になるかもしれないので私が練習に作ったコードを添付してみます

>このレーザーは直線メインでしょうか?

曲がるレーザーだと個々の位置の記録が必要なので
このレーザーを複数並べると言う通常弾と同じ方法になるでしょうかね・・

http://www.play21.jp/board/formz.cgi?action=res&resno=26494&page=&lognum=83&id=dixq&rln=26591

http://www.play21.jp/board/formz.cgi?action=res&resno=17514&page=&lognum=56&id=dixq&rln=17587

龍神録で言うとこの辺が参考になるかもしれません

>それにしてもチルチルさんはあっさりコードを作成なされて頭があがりません…

龍神録も良いんですが、自分で1から作るのもアリですね
複雑な弾幕を作るにはコードを自分でしっかり理解している事も重要になってきますから・・


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

Name: チルチル  ..比類無きプログラマー(74,361ポイント)   Date: 2009/11/14(土) 17:18   No:41995     
Title: Re:sin波ショットや円運動ショットについて    
>何度も本当にすみません…

これはトリさんのミスではなくて私の手抜きです・・
作る時も出たのですが途中で向きを変えない限りは問題ないのでスルーしました・・

なんでこうなるかと言うと
弾は毎フレーム前回の座標を破棄してboss_shot.base_angle[0]から再計算するので
boss_shot.base_angle[0]が変化すると全部の弾に影響します・・

他にはボスが途中で動いた場合も同じような事になりますね・・
前に角度を変化させる方法を思い付いたのですが、忘れてしまったんですよね・・

ここはboss_shot.bullet[k].base_angle[0]を使った方が良いですね、わかりやすく書き直すと
void boss_shot_bulletH002(){

int i,k,t=boss_shot.cnt;
if( t%90==0 )boss_shot.base_angle[0] = bossatan2();
if( t<1800 && t%4==0 ){
for(i=0;i<2;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = i;
boss_shot.bullet[k].x = 0;
boss_shot.bullet[k].y = 0;
boss_shot.bullet[k].knd = 8;
boss_shot.bullet[k].angle = 0;
boss_shot.bullet[k].base_angle[0] = boss_shot.base_angle[0];
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 0;
boss_shot.bullet[k].state = i?1:-1;
boss_shot.bullet[k].kaiten= 0;
}
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0){
#define Speed 2.5 //スピード
#define Width 35 //半径
#define Cycle PI/(Width*2/Speed)*boss_shot.bullet[i].cnt //周期
double x=boss_shot.bullet[i].x;//座標を記録
double y=boss_shot.bullet[i].y;//座標を記録
boss_shot.bullet[i].x = boss.x;//発射点に戻す
boss_shot.bullet[i].y = boss.y;//発射点に戻す
boss_shot.bullet[i].x += cos( boss_shot.bullet[i].base_angle[0] ) * ( boss_shot.bullet[i].cnt * Speed );//進行方向に進む
boss_shot.bullet[i].y += sin( boss_shot.bullet[i].base_angle[0] ) * ( boss_shot.bullet[i].cnt * Speed );//進行方向に進む
boss_shot.bullet[i].x += cos( boss_shot.bullet[i].base_angle[0] + PI/2 * boss_shot.bullet[i].state ) * sin( Cycle ) * Width ;//進行方向に対して左右に揺らす
boss_shot.bullet[i].y += sin( boss_shot.bullet[i].base_angle[0] + PI/2 * boss_shot.bullet[i].state ) * sin( Cycle ) * Width ;//進行方向に対して左右に揺らす
boss_shot.bullet[i].angle = atan2( boss_shot.bullet[i].y-y , boss_shot.bullet[i].x-x );//変化前と変化後の位置から描画角度を求める
}
}
}
一応周期を一定にする計算をしています
綺麗な円を描く計算式を考えようとも思いましたが、待たせると悪いので省略しました

しかし角度を変化させる方法に比べて無駄が多すぎますね・・
何とか思い出せないかな・・


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

Name: トリ  ..かけだし(1,301ポイント)   Date: 2009/11/16(月) 18:04   No:42165     
Title: Re:sin波ショットや円運動ショットについて    
せっかく回答していただいたのにレスがしばらくできなくてすみません…

>アイテムが2000個用意されている時にレーザーの弾が5000個あったらオーバーしてしまうって事ですね
あ、なるほど…なんか変な勘違いをしてしまっていました。
アイテムの最大とレーザーの弾の最大を一緒にしないと確かに上限越えてだめになってしまいますね…


>両端を薄くしたり細くしたりするのが簡単なのが2Dポリゴンのメリットなんですが
加算ブレンドだけではやっぱり難しいですか〜
う〜ん、やはり避けて通れないようですね…2Dポリゴンの勉強することにします

>これはクオリティが凄いですね
ありがとうございます
まさかこんなお言葉が頂けるとは…
素材はほとんど自作ですが、自機画像とボス画像は拝借しました。できれば公開してみたいです。

エフェクトとアシストの融合でレーザーができるんですか〜
アシストを使いこなせてない自分は技術的に難しいですね…
でも、アシストが使えればいろんな弾幕作れそうなので頑張ってみます。

>自分で作る覚え方が私のオススメです
チルチルさんがそうおっしゃるなら自分で作ってみることにします
使いこなせたら便利だろうな…

>このレーザーを複数並べると言う通常弾
わざわざ過去ログのURLを教えていただいて本当にすみません、
ありがとうございます…

>自分で1から作るのもアリですね
そうですね…理解度がいまいちなんで自作も試してみます

>なんでこうなるかと言うと
破棄されていたんですか…
それでワープしていたんですね
コードまで本当にありがとうございます
なんだか頼ってばかりで本当にすみません

ところで、チルチルさんは自分でここまでコードを
すらすら作れるようになるまでどれくらい年月が
かかりましたか?
お聞かせいただければありがたいです。


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

Name: チルチル  ..比類無きプログラマー(76,551ポイント)   Date: 2009/11/16(月) 19:46   No:42172     
Title: Re:sin波ショットや円運動ショットについて    
>せっかく回答していただいたのにレスがしばらくできなくてすみません…

ページを開く前に回答が来ている予感がしたんですよね
今日の私はカンが良いようです

>アイテムの最大とレーザーの弾の最大を一緒にしないと確かに上限越えてだめになってしまいますね…

龍神録のアイテムを線形リストに置き換えるのは大変だし
アレは線形リストである事が重要なので
オーバーフローするたびにアイテムの最大数を増やすのが簡単でしょうかね・・

ちなみにアレの場合は線形リストにする事で弾数制限が無くなる事より
先頭から最後までの弾が順番に並んでいる事が重要なんですよね

>う〜ん、やはり避けて通れないようですね…2Dポリゴンの勉強することにします

私が経験済みなのでわかるんですが
弾を毎フレーム登録しないと表示がガタガタするんですよね
画像の収縮率が数フレーム間隔でいきなり変わるからそうなります

まあ次の弾が登録されるまで今の弾を止めるとかいう方法もありますが・・

2Dポリゴンはsitumonさんの仰るとおり
画像が均一じゃないレーザーの場合には便利ですが
普通のレーザーなら弾を並べても作れると思いますよ

御津凪さんのレーザーのように全体でどの部分を担当しているかで濃さを調節する方法もあります
その場合は途中で消された場合の処理も必要ですが・・

あと曲がるレーザーは丸い弾を並べないとデコボコするかもしれませんが
直線のレーザーなら楕円形の弾でも大丈夫じゃないでしょうか?
あんまり長いと消す場合に不便ですが
楕円形の弾の両端を薄く細くしておけば重ねた時に先頭と最後だけ残って綺麗に表示されると思います

実際に星蓮船でも曲がるレーザーはクッキリしていて
直線的なレーザーは薄かったりしてるようにも見えますからね

2Dポリゴンは長く変形させると極端に細くなったりしますしね・・

>素材はほとんど自作ですが、自機画像とボス画像は拝借しました。できれば公開してみたいです。

素材が自分で作れるのは羨ましいですね〜

>エフェクトとアシストの融合でレーザーができるんですか〜

まあアレはエフェクトとアシストの融合みたいな物ですが
今回はレーザーじゃなくてアシスト兼エフェクトですね
最近の東方だとボスの後ろが歪んでいますが
永夜抄の使い魔の表示があんな感じになった物を作ろうと思っています

>チルチルさんがそうおっしゃるなら自分で作ってみることにします

まあサンプルコードが理解できないから自分で作るという理由もありますけどね・・

>それでワープしていたんですね

やはり角度を変化させる方が便利そうですね・・
そのうち自分も使うと思うので思い出せるか試みています

>ところで、チルチルさんは自分でここまでコードを
>すらすら作れるようになるまでどれくらい年月が
>かかりましたか?

この辺りは初歩的な事なので、慣れて来れば誰でも作れると思いますよ

私はプログラムを知ってから1年半ほどですが
最初の3ヶ月ぐらいは先輩にwhile文ぐらいまで教えてもらいましたが
後はこの掲示板で教えてもらったりしながらダラダラと構造体や自作関数まで理解しましたね

1年ぐらい経過した所で先輩のゲームのプログラムを依頼されてからはもう少しマジメに勉強しましたが
まだ実力不足で無茶苦茶なコードになり
先輩が就職活動で製作が凍結している間に1から作り直そうと思ったので
今度はかなり真剣に勉強して1ヶ月ほどでクラスとかテンプレートの基礎を理解して現在にいたります

なので実質的な学習期間は半年強でしょうかね・・?
まあダラダラと作ったコードも練習にはなったかもしれませんが・・

ちなみに作ったゲームは文化祭用に作ってボツになった偽ぷよぷよと
作り直しのせいで途中で放棄された弾幕STGぐらいですから
本格的なゲーム製作は今回が初めてだったりしますね・・

まあプログラム以外にやる事が無いので
最近は1日に平日は6時間、休日は12時間ぐらいプログラムしてますから
その辺は実力の向上に一役買っているかもしれませんね・・


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

Name: トリ  ..かけだし(1,917ポイント)   Date: 2009/11/19(木) 23:51   No:42351 解決!     
Title: Re:sin波ショットや円運動ショットについて    
レスが空いてしまってすみません。
学校が忙しくてなかなかサイトに来れない状態で…。

>レーザー
2Dにもメリットとデメリットがあるんですか〜
なるほど…
とりあえず、では、レーザー作成慣れするためにも
チルチルさんのおっしゃったような少し長めの弾を使ってレーザーを作るという方法で
試行錯誤をしてみたいと思います。
星蓮船のレーザーはけっこうくっきりしていますね〜
寅丸とかぬえとかのレーザーもくっきりしていましたし…。
そういえば、チルチルさんは聖蓮船どこまでクリアしましたか?
自分はEXをクリアしてハードに挑んでいるところですが苦しめられている状態です。

>半年強
すごいですね…
半年ほどでこんなにスラスラとゲームプログラムが作れるようになったんですか…
やっぱり基礎が重要そうですね…
一応自分は学校で習っているので、その知識も使用したりしてゲーム作っているのですが
弾幕作成って学校の知識とあんまりつながっていないので、やっぱり別途基礎から勉強する必要がありますね…

それに今まで2個もゲームを作っていたんですか…
新作というのはSTGでしょうか?
もしよろしければどんな感じのゲームか教えて頂けませんか?

>最近は1日に平日は6時間、休日は12時間ぐらいプログラムしてます
おお…やはりこれくらいはやらないとスラスラまでいけないんですね〜
さすがです
自分も努力をしないといけませんね…


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

Name: チルチル  ..比類無きプログラマー(77,483ポイント)   Date: 2009/11/20(金) 00:38   No:42354     
Title: Re:sin波ショットや円運動ショットについて    
>そういえば、チルチルさんは聖蓮船どこまでクリアしましたか?

う〜ん弾幕STGは苦手なのでイージーをクリアするので精一杯です
EXとかはリプレイで確認しました

やはり自分が下手だと作る時にも影響するようで
私の作った弾幕は各方面から理不尽と言う意見を頂いています

>一応自分は学校で習っているので、その知識も使用したりしてゲーム作っているのですが

ちなみに私の場合はプログラムの授業が始まる前に
部活の先輩達に3年間の授業でやる内容を2ヵ月ほどで叩き込まれましたね
おかげでプログラムの授業は毎回すごく楽でした

学校にもよりますが授業の内容では足らないでしょうね・・

>弾幕作成って学校の知識とあんまりつながっていないので、やっぱり別途基礎から勉強する必要がありますね…

弾幕STGを作り始める前は本家の弾幕も純粋に楽しむために見ていたのですが
始めてからは弾幕に使われている計算式を想像しながら見るようになりましたね
最近では弾幕を見ると計算式が何となくわかるようになったんですが
そのぐらいでやっとスタートラインに立った気がします

>新作というのはSTGでしょうか?

過去ログの時に作っていた弾幕STGのコードを1から作り直したものですね
旧バージョンは基礎部分を作った時の実力が低すぎて足手まといになって来たので
プロジェクトが凍結中の今を利用して再構築しているところです

内容としては完全な東方の2次創作ですね
まあ企画者である先輩の構成と私のプログラムが
おかしな不協和音を作り出して妙な世界観が展開されていますが・・

>自分も努力をしないといけませんね…

私がそうだったんですが
やはり1人で作っているとダラダラ作っても周りに迷惑が掛からないので
何となくいい加減になってしまって成長しない事があるんですよね

やはり上達するにはある程度のプレッシャーが必要だと思うんですよ
私も共同制作を始めてからはダラダラ作っていると先輩に怒られるので真剣に製作するようになりました

手っ取り早いのは誰かと合作する事なんですが、そう簡単には行かないですよね

それで物は相談なんですが、解決するついでに
この場を借りて「あと〇ヶ月でゲームを作って公開します」と宣言してみてはどうですか?
そうすればそれなりに緊張感が得られて上達が速くなるかもしれません


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

Name: トリ  ..かけだし(1,962ポイント)   Date: 2009/11/21(土) 00:32   No:42400     
Title: Re:sin波ショットや円運動ショットについて    
会話の途中なのに解決マークをチェックして
戸惑わせてすみません…
毎度レスありがとうございます。

>EXとかはリプレイで確認しました
自分もイージーでも確かに難しいです、ノーマルはイージーにほんの少し毛が生えたような感じで、EX出してクリアしたのも奇跡みたいなもんなんで…東方は全体的に難易度が高いと思います

>3年間の授業でやる内容を2ヵ月
なんというか…密度が高すぎて真似できないですね…
自分がどれだけだらだらとC言語の勉強をしているか痛感させられました…(笑)

>弾幕を見ると計算式が
なんと…
そんな世界を自分も味わってみたいです…それにしてもその感覚は研ぎ澄まされているというか
悟りを開いているというような…

>完全な東方の2次創作
東方のキャラクターもでてくるのでしょうか?それともオールオリキャラでしょうか?

>物は相談なんですが
なるほど…制限時間を設けるのですね〜!
いついつまでに完成させるということを全然意識していませんでした…(笑)
では、ここで公言しておきます。
今年中には完成させます。
ホームページにサンプル画像をupしているので、一応URLをはっておきます。
http://tourutarou.web.fc2.com/index.html
HNがトゥル太郎になっていますが、トリと同一人物です。
すみません、ややこしいですね…次回からはここでもトゥル太郎と名乗るよう統一します…。
タイトルは「東方桃源郷」で、ストーリーは、秋なのに、一日中夜みたいに暗く、雪が降るという異変を
霊夢が解決するというそんなストーリーです。


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

Name: チルチル  ..比類無きプログラマー(78,014ポイント)   Date: 2009/11/21(土) 02:11   No:42406     
Title: Re:sin波ショットや円運動ショットについて    
>会話の途中なのに解決マークをチェックして

本題は一区切りついたようなので解決にしても大丈夫だと思いますよ
解決にした後も話が続く事は良くありますしね

>東方は全体的に難易度が高いと思います

やりなれている人にはちょうど良いんでしょうかね・・
以前Meを使っていた頃は処理落ちさせて足掻いたりもしましたが
Vistaになってからは完全に諦めムードです・・

>なんというか…密度が高すぎて真似できないですね…

まあ3年分と言ってもwhile文ぐらいまでですから
むしろ授業の方が薄い事になりますね・・

>それにしてもその感覚は研ぎ澄まされているというか

計算式を考えていると、何故か最近の作品はわかりやすいんですが
初期の作品はむしろ計算式が浮かばないんですよね・・
特に永夜抄の後半はわからない物が多いです

>東方のキャラクターもでてくるのでしょうか?それともオールオリキャラでしょうか?

先輩いわく「オリキャラはクレームが来る」らしいので本家のキャラだけで作るそうです
本家と違う所と言えば主人公が「てゐ」で、物語が異変で始まらない事ですね

>今年中には完成させます。

今年中ですか〜それは楽しみですね
私も凍結が続く今年中に龍神録で言う60章ぐらいまで作らなくてはいけないので励みになります

>ホームページにサンプル画像をupしているので、一応URLをはっておきます。

ホームページを見てみたんですが、トリさん絵うまいですね!!
スナップショットを添付していただいた時からただ者じゃないと思っていたのですが
やっぱり絵がうまかったんですね、あの画力は羨ましい限りですよ

>タイトルは「東方桃源郷」で

あ〜そういえば関係無いですけど
私の1作目のパズルゲームの最初の名前は「東方闘源郷」だったんですよね
まあ先輩から「東方〇〇〇はNG」と言われたので最終的に「Ragnarok」になりましたけど


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

Name: トゥル太郎(=トリ)  ..ぴよぴよ(179ポイント)   Date: 2009/11/22(日) 14:23   No:42482     
Title: Re:sin波ショットや円運動ショットについて    
>まあ3年分と言ってもwhile文ぐらいまでですから
そうなんですか〜
他のC言語の知識を自分で補完するのが大変そうですね…
でも2カ月で終わるのはやっぱりすごいと思います

>計算式を考えていると
永夜抄の後半の輝夜とかはもう何が何だか状態です。
最近の方が思いつきやすいんですか〜
ちょっと自分も星蓮船や地霊殿で研究してみようと思います

>主人公が「てゐ」
てゐですか〜どんなゲームになるのか楽しみです
永夜抄軍団がけっこう絡んできそうですね


>私も凍結が続く今年中
60章と言うと3D背景ですね〜
3D背景はやはりクオリティを上げるには結構重要なポイントですね
そういえば無料公開でしょうか?コミケとかで販売なんでしょうか?

>ホームページを見てみたんですが
絵うまいなんて褒めて頂けるとは…ありがとうございます…
チルチルさんの方が明らかにただ者じゃないですよ〜!
レーザーの過去ログで高校生と書かれていましたが、
過去ログ見るまでは大学生か理科系の社会人かと思っていました。

>「東方闘源郷」
一文字違いですね〜
と思ったら読みが同じで吹きました(笑)

>「東方〇〇〇はNG」と言われたので最終的に「Ragnarok」
コミケとかで売る場合だったら東方○○○はやばそうですね…
そういえばRagnarokは本家と同様に6ステージですか?


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

Name: チルチル  ..比類無きプログラマー(78,999ポイント)   Date: 2009/11/22(日) 17:07   No:42490     
Title: Re:sin波ショットや円運動ショットについて    
>トゥル太郎(=トリ)

まあ次のスレッドからは「トゥル太郎」で良いと思いますよ

>他のC言語の知識を自分で補完するのが大変そうですね…

最初の方は調べ方がわからなくて苦労しましたね・・
"C++"の"C"の部分を理解するのは大変でしたが
"++"の方の基礎は1ヶ月で理解したので少しは成長したようです

>そういえば無料公開でしょうか?コミケとかで販売なんでしょうか?

先輩いわく「20枚ぐらい売る」らしいです
まあ売った後はここで公開させていただく事になると思いますけどね・・

そもそも売るだけのクオリティがあるか怪しいんですよね・・
過去ログの最後でsitumonさんにテストプレイしてもらった時は意外に好評だったんですが
先輩には「どう見ても弾幕風が上だろ」って言われましたからね
まあ再構築した理由はそこなんですが・・

と言うか製作開始の時点から完成予定日がどんどん伸びて行ってるので完成するかも怪しいですね・・

>チルチルさんの方が明らかにただ者じゃないですよ〜!

いやいやそんな事は無いです
私のコードは簡単な処理を沢山集めて性能を上げているので実力はそれほど高くないですよ
俗に言う「時間さえあれば誰でもある程度の物は作れる」って言う事ですね
私は時間だけは結構ありますから・・

>そういえばRagnarokは本家と同様に6ステージですか?

先輩から文化祭の1ヶ月前に作れと言われたので
ステージを作る時間が無くて対戦モードだけですね・・

アレは本当にボツになって良かったですよ
当時は悪ノリしていたので東方なのにサブタイトルが「暴力的幻想パズル」ですから・・
内容も無茶苦茶なスペルの応酬ですしね


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

Name: icon  ..ぴよぴよ(139ポイント)   Date: 2009/11/24(火) 22:03   No:42592     
Title: Re:sin波ショットや円運動ショットについて    
私もチルチルさんに質問なんですが。
過去ログのhttp://www.play21.jp/board/formz.cgi?action=res&resno=38458&page=30&lognum=118&id=dixq&rln=38530

No:38492、No:38496、の画像はどういったものを使っていますか?
どういう感じにああいった画像の演出をやっているのか気になります。
先端のほうは尖っていて透明度も変えてるみたいです。
僕も同じようなのを作りたいので教えてください。



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

Name: チルチル  ..比類無きプログラマー(79,848ポイント)   Date: 2009/11/24(火) 23:00   No:42603     
Title: Re:sin波ショットや円運動ショットについて    
>No:38492、No:38496、の画像はどういったものを使っていますか?

何か期待を裏切るようですが龍神録素材に手を加えたものですね
原型はこれです

>どういう感じにああいった画像の演出をやっているのか気になります。

普通に2Dポリゴンで引き伸ばしているだけなので
演出は何もやっていませんね、元画像が良いと楽ですよ

>先端のほうは尖っていて透明度も変えてるみたいです。

元画像の段階で尖っていて透明度があるので
引き伸ばすだけであんな感じになります

>僕も同じようなのを作りたいので教えてください。

変形させる場合は変形前と変形後の形が違う方がうまく行く事もあるようです
レーザーは楕円形ですが元画像はカプセル型ですね

ちなみに過去ログのアレはなかなかベストショットで
動いているとチカチカして結構気持ち悪いですよ

あと画像を引き伸ばす構造上
長くしすぎると先端が薄くなりすぎたりもします

まあ表示はそこそこ綺麗ですが結局アレは失敗作なんですよね・・


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

Name: チルチル  ..比類無きプログラマー(79,937ポイント)   Date: 2009/11/24(火) 23:12   No:42605     
Title: Re:sin波ショットや円運動ショットについて    
あと参考になるかもしれないので他の使用例も添付します

直線と曲線は上の画像を拡大した物を

環状は太さをそろえた物を

それから2Dポリゴンに使う画像は分割読み込みできないので色ごとに切り離しました


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

Name: チルチル  ..比類無きプログラマー(79,942ポイント)   Date: 2009/11/24(火) 23:13   No:42606     
Title: Re:sin波ショットや円運動ショットについて    
重いので分けました

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

Name: チルチル  ..比類無きプログラマー(79,947ポイント)   Date: 2009/11/24(火) 23:14   No:42607     
Title: Re:sin波ショットや円運動ショットについて    
さらに分けました

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

Name: チルチル  ..比類無きプログラマー(79,958ポイント)   Date: 2009/11/24(火) 23:14   No:42608     
Title: Re:sin波ショットや円運動ショットについて    
なおも分けました

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

Name: チルチル  ..比類無きプログラマー(80,001ポイント)   Date: 2009/11/24(火) 23:16   No:42609     
Title: Re:sin波ショットや円運動ショットについて    
何か無駄に多くなってしまいましたね
すいません、血迷いました・・

また気になる事があったらお気軽に質問してください


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

Name: icon  ..ぴよぴよ(188ポイント)   Date: 2009/11/24(火) 23:28   No:42610     
Title: Re:sin波ショットや円運動ショットについて    
チルチルさんありがとうがざいます。
あれは弾を重ねてるのかな、と思っていたのですがやはりそうでしたか。素材も重要でしたね。
添付ファイルゆっくりみてみます。また何かありましたらお願いします。


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

Name: icon  ..ぴよぴよ(206ポイント)   Date: 2009/11/24(火) 23:36   No:42612     
Title: Re:sin波ショットや円運動ショットについて    
弾は重ねてませんね・・勘違いorz お恥ずかしい・・
またお願いします。


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

Name: トゥル太郎 [URL]  ..かけだし(1,134ポイント)   Date: 2009/11/27(金) 08:47   No:42722     
Title: Re:sin波ショットや円運動ショットについて    
>"++"の方の基礎は1ヶ月で理解したので
自分も++を勉強しないと…
短くコードがかけるらしいですし…

>先輩いわく「20枚ぐらい売る」
ゲームの画像をアップされているようなので見てみましたが
クオリティ十分高いと思います
陰陽玉とかかなりカッコいいですね

>簡単な処理を沢山集めて性能を上げているので
これって結構重要なことではないのでしょうか
難しいものを使うと、修正とか変更をするときに、大変だと思うのです。

>対戦モードだけですね
対戦というと2人でですか?花映塚のような感じでしょうか?
処理が多そうで大変そうですね

ここでどうでもいい話ですが1面ルーミアの拡散レーザー完成記念に画像をアップしてみます。
名前が秋静葉になってたりスペカ名が表示されてなかったりとおかしいですが(笑)


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

Name: チルチル  ..比類無きプログラマー(80,828ポイント)   Date: 2009/11/27(金) 16:29   No:42736     
Title: Re:sin波ショットや円運動ショットについて    
>短くコードがかけるらしいですし…

まあカプセル化を守る為にメゾットが増えて長くなったりもしますけどね・・

>陰陽玉とかかなりカッコいいですね

何か陰陽玉って冷静に考えると切れ目が無いから普通の大玉と同じなんですよね
永夜抄の霊夢が出してくる陰陽玉と変わりなかったりして・・

そもそもアレは新バージョンに引き継ぐか微妙な所なんですよね
先輩に言っていないので私の構想の域を出ませんが
新バージョンではエフェクト付きアシストで代用しようと思っています

と言うか星蓮船でレーザーが強化されたので
他がやっていない事をしないと勝負にならないんですよね・・

>難しいものを使うと、修正とか変更をするときに、大変だと思うのです。

難しいと言うよりは短く書けないんですよね
同じ処理だったら短く書いた方が修正が容易な気がするんですよ・・

>対戦というと2人でですか?花映塚のような感じでしょうか?

まあキーボードを2人で使うので狭いですよ〜
フィールドが2つ並んでいて、お互いにブロックを送り込みます

>処理が多そうで大変そうですね

内容が少ないので処理は少ないですが
当時は関数化を知らなかったので全部ループでやりました・・

>ここでどうでもいい話ですが1面ルーミアの拡散レーザー完成記念に画像をアップしてみます。

何かもうパッと見ただけで私の完敗ですね
プログラム以前に素材作成能力で完全に負けました・・

背景とか魔法陣とか、もう私にはどうやったら
あんな綺麗なのが作れるのか見当も付きません

ドット絵は拝借しているそうですが
あれだけの画力があるなら十分自作できるのではないでしょうか?

それから弾幕デザインでも私は負けている気がしますね
本家をやりこんでいないので添付画像のようなレーザーも思い付かないです・・

しかし添付画像1枚でこれだけクオリティが伝わってくるとなると
完成したらどれだけ凄いものになるか今からとても楽しみです

私の方は先行きが怪しいですが、これだけ凄いものを見せられたら私も負けていられませんね


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

Name: softya  ..熟練のプログラマー(49,173ポイント)   Date: 2009/11/27(金) 16:43   No:42739     
Title: Re:sin波ショットや円運動ショットについて    
蛇足ですが。

>>"++"の方の基礎は1ヶ月で理解したので
>自分も++を勉強しないと…
>短くコードがかけるらしいですし…

最近良く、C++だと簡単になる or 楽が出来る or 作りやすい って話を初心者から聞くんですが都市伝説として流行っているんでしょうか?
少なくとも大量のコードを書かない限りC++のメリットって見えてこないと思うんですが。逆にコードが増えることの方が多いですよね。うまく書けばメンテナンス性やソースコードの可読性などメリットも多いですが初心者がうまく使えるはずも無く・・・。


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

Name: チルチル  ..比類無きプログラマー(81,005ポイント)   Date: 2009/11/27(金) 17:40   No:42748     
Title: Re:sin波ショットや円運動ショットについて    
>softyaさん

私の周りでもそういう話を聞く事があります
できる事が増えるので選択肢は増えますが
やる事も増えるのでコードはむしろ長くなる傾向がありそうですね

>トゥル太郎さん

また平安カフェオーレを見てみたんですが新しく加わったムラサの絵も上手すぎますよ!!
これはサイトの将来が楽しみなのでお気に入りに追加させていただきました


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

Name: トゥル太郎  ..かけだし(1,454ポイント)   Date: 2009/11/29(日) 14:33   No:42835     
Title: Re:sin波ショットや円運動ショットについて    
>エフェクト付きアシストで代用
おぉ…かなり期待です。
陰陽玉にエフェクトで後ろに炎をゆらゆらさせるとかっこよさそうですね〜
アシストが使えるのは羨ましい限りです

>お互いにブロックを送り込みます
花映塚っぽいですね〜あんな対戦が再現できるとは…
ブロック送り込みというのもかなり面白そうですね。

>内容が少ないので処理は少ないですが
そうなんですか、キャラの情報や弾の情報が二人分用意したりしなきゃならない気がしたので
多そうに思いましたが
処理が少なく済むんですね

>何かもうパッと見ただけで
いえいえ、実際プレイして見るとかなりしょぼいですよ…
ドット絵はちんぷんかんぷんです

>添付画像のようなレーザー
5面ナズーリンのグレイテストトレジャーのような感じです。

>今からとても楽しみです
そう言って頂けるとすごく励みになります!

>チルチルさん
わざわざお気に入りして頂いて本当にありがとうございます!
これからもどうかよろしくお願いいたします!

>softyaさん
そうなんですか〜
では、Cを極めていくだけでも十分かもしれないですね


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



Name: Kou  ..中級者(9,054ポイント)   Date: 2009/11/25(水) 02:02   No:42627       
Title: 3D表示でのカメラの向きについて    
以前お邪魔させて頂いてたKouです。
今回、DxLibのVer.3で3Dモデルを表示する際の、カメラの設定について質問させて頂きます。
デフォルトの状態でモデルを表示すると、正面やや上位からの視点で表示されますが、これを2Dシューティングのように真上から見た視点で表示する場合、カメラの向きを設定した方が良いのか、モデル自体をY軸で90度回転させた方が良いのか、どちらなのでしょうか?
普通に考えれば、カメラの向きを設定する方が良いのでしょうが、その場合、カメラの各座標は、どの程度の値に設定すれば良いのでしょうか。

WindowsXP
VC++ 2008EE
です。
よろしくお願いします。


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


Name: Justy  ..伝説なるハッカー(467,340ポイント)   Date: 2009/11/26(木) 01:38   No:42667     
Title: Re:3D表示でのカメラの向きについて    

> カメラの向きを設定した方が良いのか

 当然こちらでしょう。
 どっちでも同じ効果が得られるかもしれませんが、全モデルを回転させる
よりかはこちらのが楽なはずです。



> その場合、カメラの各座標は、どの程度の値に設定すれば

 これは実際にいろいろ値を入れて、試してみるのが一番いいかと。


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

Name: Kou  ..中級者(9,127ポイント)   Date: 2009/11/27(金) 06:06   No:42720     
Title: Re:3D表示でのカメラの向きについて    
返信遅くなってしまいました。
やっぱりカメラを動かした方が楽…って言うか、それが普通ですよね…。

設定値は…トライ&エラーで地道に行くしかないですか。
ある程度上方向からの視点にはできるんですけど、正確に真上からの視点なのか、微妙にズレてるのかが判断つかなくて…。


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

Name: softya  ..熟練のプログラマー(49,374ポイント)   Date: 2009/11/27(金) 17:53   No:42749     
Title: Re:3D表示でのカメラの向きについて    
DXライブラリの3D関係には詳しく無いですが、3Dカメラですので自在に方向は変えれますし、色んな設定方法があります。

例えば、DXライブラリのリファレンスを見ると
SetCameraPositionAndTarget_UpVecY  カメラの視点、注視点を設定する( 上方向はY軸から算出 )
SetCameraPositionAndTargetAndUpVec  カメラの視点、注視点、上方向を設定する
SetCameraPositionAndAngle  カメラの視点、垂直回転角度、水平回転角度、捻り回転角度を設定する
SetCameraScreenCenter  画面上でのカメラが見ている映像の中心座標を設定する。
などがありますので、使いやすいものを使えばよいと思うのですが。

ワールド空間にどのようにポリゴンモデルを配置しているかで画面に表示される位置関係は変わってきますので、そこは事前設計を万全に。


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

Name: Kou  ..中級者(9,278ポイント)   Date: 2009/11/29(日) 00:35   No:42810     
Title: Re:3D表示でのカメラの向きについて    
softya様ありがとうございます。
カメラに関する関数が何種類かあるので、正直どれを使えば良いのか迷っていましたが、ある程度は好み(処理にもよるのでしょうが…)で良いのですね。
3D表示はVer.3で初めて使用するので、まだ解らない部分が沢山ありますが、サンプル等を参考にしながら、とにかくいじって、数をこなしてみます。


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



Name: gurii  ..ぴよぴよ(36ポイント)   Date: 2009/11/27(金) 17:15   No:42742       
Title: 敵にショットさせることができません。    
ども、はじめまして!!
最近、初めてプログラミングを始め初めての自作ゲームでこちらのサイトを利用させていただいております。
そこでなんですが、龍神録プログラミングの13項目の敵にショットを打たせることができません。
最初から、作りなおしたのですがどうしてもSHOT_MAXだったと思うのですが、それがエラーで出てしまいます。
何か、原因になりやすいところがあれば教えてください!!
よろしくお願いします。


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


Name: softya  ..熟練のプログラマー(49,330ポイント)   Date: 2009/11/27(金) 17:32   No:42747     
Title: Re:敵にショットさせることができません。    
次のことを実践してください。
1.一括ダウンロードできるソースコードと比べてみましたか?違うところはありませんか?
2.それでも分からなければ、エラーが出るソースコードと正確なエラーメッセージを書いてください。
解決策を考えるにはあまりにヒントが少なすぎますのでお願いします。


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

Name: jay  ..ぴよぴよ(384ポイント)   Date: 2009/11/28(土) 18:42   No:42793     
Title: Re:敵にショットさせることができません。    
SHOT_MAX関連のエラーならまずdefine.hでちゃんとSHOT_MAXを宣言出来ているか
を確認してみて下さい。
SHOT_MAXの宣言が#include "struct.h"の上に記述されているか
SHOT_MAXの後の数値は正しいか
なども確認してみて下さい。
コピペでいいのでエラーメッセージとコードを書いてくれたならもっと的確に指摘できます。


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



Name: MU  ..ぴよぴよ(51ポイント)   Date: 2009/11/28(土) 16:13   No:42786       
Title: プログラミング    
Heun法のプログラムをRunge-Kutta法にするにはどうしたらいいですか?

#include <stdio.h>
#include <math.h>
double f1(double y) { return y; }
double f2(double y) { return -4*y; }
int main(){
double a=0;
double b;
int m=10;
int n;
double h;
double x,y;
int k;
double e;
double f;
double k1,k2;
printf("Heun法計算例:y=e^x, y=1/e^4x\n\n");
// y = e^x
b = 1;
for(n=100;n<=10000;n*=100){
h = (b-a)/n;
printf("y' = y: h(=dx) = %.1e (y=e^x)\n",h);
x = a; y = 1;
for(k=0;k<=n;k++) {
x = k*h;
if(k%(n/m)==0) {
f = exp(x);
e = fabs(y-f);
printf("x=%.2f, y=%f, e^x=%f er=%.0e\n",x,y,f,e);
}
// Heun's method
k1 = h*f1(y);
k2 = h*f1(y+k1);
y += (k1+k2)/2;
}
}


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


Name: non  ..比類無きプログラマー(71,588ポイント)   Date: 2009/11/28(土) 17:00   No:42788     
Title: Re:プログラミング    
前のshevchenkoさんのプログラムと同じ人が作ったプログラムですね。
ただし、Heun法まで進んだようですが。

>// Heun's method
>k1 = h*f1(y);
>k2 = h*f1(y+k1);
>y += (k1+k2)/2;

この部分を書き直せばいいのではないでしょうか?


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



Name: 南瓜  ..かけだし(1,129ポイント)   Date: 2009/11/27(金) 01:12   No:42715       
Title: 文字化けが起きてしまいます    
C言語の勉強をしたくてある問題のプログラムを書き込んだんですが
#include <stdio.h>

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

int main(void) {
int computer;

printf("[じゃんけんゲーム]\n");
srand(time(NULL));
computer = rand()%3+1;
printf("コンピュータは%d", computer);

return (0);
}

コンパイルはうまくいったんですが実行すると下のような文字化けをするんです。
[????񂯂?Q?[??]
?R???s???[?^??2
文字化けを解消するにはどうすればいいでしょうか?

OS:Mac OSX コンパイル:gcc?と思われます
以上が質問ですお願いします。


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


Name: たかぎ [URL]  ..ハッカー(124,482ポイント)   Date: 2009/11/27(金) 08:00   No:42721     
Title: Re:文字化けが起きてしまいます    
ちゃんと表示されましたよ。
ただ...
文字コードをSJISで保存すると、ほぼ同じ状態を再現できました。
SJISで保存してもかまいませんが、その場合は、-finput-charset=cp932オプションを指定してください。


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

Name: 南瓜  ..かけだし(1,255ポイント)   Date: 2009/11/27(金) 21:55   No:42762     
Title: Re:文字化けが起きてしまいます    
返信ありがとうございます。しかし、
gcc -finput-charset=cp932 2-1.cをしても
[????񂯂?Q?[??]
?R???s???[?^??1
と文字化けが起こります。
#include <stdio.h>


int main() {
printf("Hello!");
rewind(stdin);
getchar();
return 0;
}

このプログラムは、文字化けせずに済んだんですが。。。
文字コードは、ピクチャ2.pngのようにUTF-8になっていると思うんですが
何が悪いんでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(124,592ポイント)   Date: 2009/11/27(金) 23:04   No:42769     
Title: Re:文字化けが起きてしまいます    
GCCのバージョンを教えてください。
あと、問題のソースファイルを(本文中にペーストするのでなく)添付してください。


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

Name: 南瓜  ..かけだし(1,272ポイント)   Date: 2009/11/27(金) 23:38   No:42770     
Title: Re:文字化けが起きてしまいます    
ターミナル バージョン 2.0.2 (240.2)
です


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

Name: たかぎ [URL]  ..ハッカー(124,729ポイント)   Date: 2009/11/28(土) 00:44   No:42773     
Title: Re:文字化けが起きてしまいます    
-finput-charset=cp932 を付ければ問題は解消しました。

> ターミナル バージョン 2.0.2 (240.2)
> です

ターミナルではなく、GCCのバージョンです。
まさかとは思いますが、3.4より前のバージョンであれば、-finput-charsetオプションが効きませんので、文字化けすると思います。
当方では、4.0.1と4.4.0を試しましたが、どちらもうまくいきました。


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

Name: 南瓜  ..かけだし(1,334ポイント)   Date: 2009/11/28(土) 11:25   No:42781     
Title: Re:文字化けが起きてしまいます    
すみません
gcc -dumpversion
4.0.1
とでたのでバージョン4.0.1だと思います

コンパイルするときに
gcc -finput-charset=cp932 2-1.c とすればいいんですよね?


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

Name: 南瓜  ..かけだし(1,476ポイント)   Date: 2009/11/28(土) 13:19   No:42783     
Title: Re:文字化けが起きてしまいます    
たびたび済みません
viで同じプログラムを書いた所文字化けせずにコンパイルできました...
(今までmiでプログラムを書いててそのファイルをコンパイルすると上記の文字化けが起きたのですが)
使いやすさからいうと自分はmiでプログラムを書きたいんですが
あきらめてviでプログラムを書くしかないでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(124,762ポイント)   Date: 2009/11/28(土) 13:34   No:42784     
Title: Re:文字化けが起きてしまいます    
> (今までmiでプログラムを書いててそのファイルをコンパイルすると上記の文字化けが起きたのですが)
> 使いやすさからいうと自分はmiでプログラムを書きたいんですが

私もmiとXCodeで確認しましたが、どちらも問題ありませんでした。


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

Name: 南瓜  ..かけだし(1,518ポイント)   Date: 2009/11/28(土) 15:02   No:42785 解決!     
Title: Re:文字化けが起きてしまいます    
miの文字コードがSJISになっていたので
UTF-8にしたら文字化けが直りました!
ありがとうございます。そして、お騒がせしました!


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



Name: 五島  ..ぴよぴよ(89ポイント)   Date: 2009/11/25(水) 21:32   No:42657       
Title: sinとcosを求める    
xの値を0度から360度まで15度刻みで変化させ
sin(x)とcos(x)をwhile文を使って表示するプログラム
を作成中なのですがどうしてもエラーに
なってしまいます。

<math.h>を呼び出しているのですがいまひとつ
わかりません。

このプログラムを教えていただけないでしょうか?


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


Name: MNS  ..上級者(22,607ポイント)   Date: 2009/11/25(水) 22:04   No:42659     
Title: Re:sinとcosを求める    
まずは、そのエラーが出るコードと、エラーの内容を提示してください。
そうすれば、こちらから助言することが出来ます。


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

Name: toyo  ..熟練のプログラマー(45,445ポイント)   Date: 2009/11/26(木) 12:13   No:42673     
Title: Re:sinとcosを求める    
math.hで使われる角度は0-360度の角度ではなくて0-2πのラジアンという単位を使います
180度がπ(3.141592.....)なので例えばsin(30°)はsin(π * 30 / 180)で求められます
例はsin(30°)を表示するプログラムです

#include <stdio.h>
#include <math.h>
#define M_PI 3.14159265358979323846

int main (void){
printf("sin(30) = %f\n", sin(M_PI * 30 / 180));
return 0;
}

15度きざみのループはわかりますよね


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

Name: Naohiro19  ..かけだし(1,026ポイント)   Date: 2009/11/28(土) 08:38   No:42776     
Title: Re:sinとcosを求める    
toyoさんのC言語のプログラムをLuaというスクリプト言語で書くと以下のようになります。Luaにはセミコロン(;)は不要です。
local sin30 = math.sin(math.pi * 30 / 180)

local message = string.format("sin(30) = %f", sin30 )
print( message )
=================
結果
>lua -e "io.stdout:setvbuf 'no'" "30.lua"
sin(30) = 0.500000
>Exit code: 0


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

Name: TKOZ  ..プログラマー(39,793ポイント)   Date: 2009/11/28(土) 09:54   No:42778     
Title: Re:sinとcosを求める    
コンパイルして、確認してませんが、
こんな感じですかね。?

#include<stdio.h>
#include<math.h>
#define RAD (3.141592659/180)

int main(void)
{
while(angle<360)
{
printf("sin(%d)度は%f:cos(%d)度は%fです。\n",angle,sin(angle*RAD),angle,cos(angle*RAD));
angle+=15;

}
}


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

Name: 初級者  ..初心者(7,064ポイント)   Date: 2009/11/28(土) 10:39   No:42779     
Title: Re:sinとcosを求める    
どうせなら、angleの定義と初期化もしてあげましょう。

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

Name: dic  ..プログラマー(39,843ポイント)   Date: 2009/11/28(土) 11:13   No:42780     
Title: Re:sinとcosを求める    
ラジアンでしたっけ?
高校で習ってないのよねぇ・・・


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



Name: 9mm  ..ぴよぴよ(139ポイント)   Date: 2009/11/14(土) 21:51   No:42016       
Title: 計算プログラム    
太陽高度の計算プログラムとそれを利用して日射量を求めるというプログラムを作りたいのですが、まだCを始めて間もないのでどういう風に作っていけばいいかわかりません。
一応太陽高度を求める式は以下のようになっています。

sin(h)=sin(a)*sin(b)+cos(a)*cos(b)*cos(c)

h:太陽高度
a:日赤緯
b:北緯
c:時角

ここでそれぞれ

c=15*(T-12)+L-135+(e/4)

T:日本標準時 (単位:時間)
L:東経 (単位:度)
e:均時差 (単位:分)

w=360*N/366

a=0.362-23.3*cos(w+6.8)-0.337*cos(2*w-11.9)-0.185*cos(3*w+35.5)

e=-0.0167+7.37*cos(w+85.6)-9.93*cos(2*w-72.3)-0.321*cos(3*w-66.3)

N:1月1日から起算した日数

ここまでが太陽高度を求める計算です。

ここから日射量を求める計算です。

I'=I*(Pの1/sin(h)乗)

I:太陽定数=1353
P:大気透過率

これが日射量を求める計算式です。

この二つを利用して問題を解くプログラムを作成するという課題です。

1.N=1の時、1日の日射量(I')を一分毎に計算せよ。
2.毎日12時の日射毎(I')を1日毎に計算せよ。

かなり専門的な分野なので分かりにくいかと思います。すいません。

あとヒントをもらったんですが、これもよくわからないので一応乗せておきます。

m[1]=31
m[2]=28
m[3]=31
 ・
 ・
 ・
m[12]=31

month:月 読み込み
day:日 読み込み

M=0

for(i=1,i<month,i+t){
M=M+m[i]
}

N=M+day


さっぱりのヒントですww

分かりづらくてすいません。ぜひお願いします。


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


Name: 組木紙織  ..比類無きプログラマー(74,904ポイント)   Date: 2009/11/14(土) 22:44   No:42021     
Title: Re:計算プログラム    
なんか同じ学科のようなので、
まずはヒントから。

1: 1月1日正午の北緯0度、東経135度、での太陽高度角を求めるコードを作る。
1-1:上記のプログラムを関数化する。
2: 太陽高度角90度のときの日射量を求めるプログラムを書く。
2-1:上記のプログラムを関数化する。

ここまできちんとやってみてください


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

Name: non  ..熟練のプログラマー(69,555ポイント)   Date: 2009/11/15(日) 08:59   No:42069     
Title: Re:計算プログラム    
ヒントは月日を元に、1月1日からの日数を計算する考え方ですね。
閏年が考慮されていませんから、(年の入力がない)どうするのでしょうね。考慮しなくていいのかなぁ。



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

Name: 9mm  ..ぴよぴよ(173ポイント)   Date: 2009/11/15(日) 21:52   No:42111     
Title: Re:計算プログラム    
まだ初めて1か月もたってないのでまったく手の着けようがないのですが…

関数化というのもどういう意味か分からないんですけど…すいません。

いろんな教科書とか見たんですが書いてある意味がさっぱりわかりません。


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

Name: 組木紙織  ..比類無きプログラマー(75,065ポイント)   Date: 2009/11/15(日) 23:13   No:42118     
Title: Re:計算プログラム    
初めて一か月経ってなくても、入門書を見ながら入出力と演算を扱えるぐらいだと想定していたのですが。。

1: 1月1日正午の北緯0度、東経135度、での太陽高度角を求めるコードを作る。
はできますか?

もし出来なければ、何が問題であるのかを詳しく説明してください。

/***************/
追記

1:文章の意味がわからない。
2:コードを作るとはどのようなことであるかがわからない。
3:PC上でプログラムを作るとはどのようにすればよいかがわからない。
4:一応コードは書いたことがあるが、どのようにすれば動かせるかがわからない。
5:コードは書いて動かしたことがあるが、足し算引き算の方法がわからない。
といった感じで
自分自身の今の問題点を細かく説明してください。


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

Name: 9mm  ..ぴよぴよ(253ポイント)   Date: 2009/11/16(月) 03:00   No:42132     
Title: Re:計算プログラム    
何度も申し訳ないです。自分としては

1:計算式をプログラムで表せない。
2:コードとは何なのか?
3:プログラミングというものにほぼ初めて触れた。
4:参考書やサイトをみてどういう文字がどういう意味を表わすのか?は少しわかりかけているが、それをどう組み合わせて課題のようなプログラムを作成すればいいか分からない。

といった感じです。個人的にパソコンもあまりつかったことがなく、参考書などを見ても専門用語ばっかでさっぱり意味がわかりません…。先生たちもろくに教えてくれず、聞いても専門用語ばかり。。。

ほんとに無知で申し訳ないですね…。


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

Name: 組木紙織  ..比類無きプログラマー(75,447ポイント)   Date: 2009/11/16(月) 07:56   No:42139     
Title: Re:計算プログラム    
そのレベルだと掲示板で解決するのはなかなか難しいですね。
(答えだけなら簡単なんですが)

コード=ソースコード
=プログラムを作ることができる文字の集まり。かな。

何か文字を表示するプログラムを作ったことはありますよね。
その時に書いたものがコードです。
これがソースコードのサンプルです

#include <stdio.h>
int main(void)
{
printf("sample\n");
return 0;
}


まずは適切な入門書や入門サイトで実力をつけることが一番だと思いますが、
課題が出来るように順を追っていきましょう。


0-1:何もしないプログラムをつくる。
0-2:Hello Wordと表示するプログラムを作る。
0-3:数字を入力して表示をするプログラムを作る。
0-4:2つの数の四則演算をするプログラムを作る。
0-5:1から1000までを表示するプログラムを作る。
0-6:1から1000までを表示するプログラムを作る。(2種類)
0-7:三角関数を扱うプログラムを作る。
0-8:太陽高度角の計算式を使ったプログラムを作る。

このうちどれまでなら出来ますか?
そして最後の出来るとこのプログラムのソースコードを載せて下さい。その時は規約を見てください。




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

Name: もぐりん  ..ぴよぴよ(654ポイント)   Date: 2009/11/16(月) 09:44   No:42140     
Title: Re:計算プログラム    
掲示板の使い方に慣れていないのでしょうか?
同じ質問を複数の掲示板にするのは、あまりよくありません。
(マルチポストといいます。)
なるべく、1つの掲示板で済ませるようにしましょう。

http://www3.realint.com/cgi-bin/tarticles.cgi?pointc2+9744

http://bbs.wankuma.com/index.cgi?mode=al2&namber=43658

そのうち、答えるのが面倒になり質問しっぱなしになりますよ。

初心者には難しいプログラムですので、理解できるまで先生にしつこく聞きましょう。
学生として身につけるには、それが最短の方法です。


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

Name: 組木紙織  ..比類無きプログラマー(75,532ポイント)   Date: 2009/11/16(月) 10:00   No:42144     
Title: Re:計算プログラム    
マルチポストはあることを考えてしないと、ここも規約違反です。

答が欲しいだけなら、そういって課題出した人にもらってください。

自力で出来る実力が欲しいなら、お手伝いするつもりです。


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

Name: 9mm  ..ぴよぴよ(605ポイント)   Date: 2009/11/19(木) 00:04   No:42290     
Title: Re:計算プログラム    
マルチポスト…知りませんでした…。申し訳ないです。

一応自分で計算部分のプログラムを作ったんですが、うまく動きません。

以下

// test3.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "math.h"


int _tmain(int argc, _TCHAR* argv[])
{
float w,n,a,b,t,T,L,c,h;

n=1.0;
T=0.0;
L=131.62;
c=33.23;


w=(360*n)/366;
printf("%lf\n",w);
a=0.362-23.3*cos(w+8.8)-0.337*cos(2*w-11.9)-0.185*cos(3*w+35.5);
printf("%lf\n",a);
b=-0.0167+7.37*cos(w+85.8)-9.93*cos(2*w-72.3)-0.321*cos(3*w-66.3);
printf("%lf\n",b);
t=15*(T-12)+L-135+(b/4);
printf("%lf\n",t);
sin(h)=sin(c)*sin(a)+cos(c)*cos(a)*cos(t);
printf("%lf\n",sin(h));



return 0;
}




これではちゃんと計算できないんですが、どうすればいいんでしょうか?


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

Name: 組木紙織  ..比類無きプログラマー(75,412ポイント)   Date: 2009/11/19(木) 02:10   No:42298     
Title: Re:計算プログラム    
マルチポストもそうですが、規約は見ておいてください。

コンパイラはVisual Studioですか?
コードを投稿するときは<pre></pre>で囲んでください。

上のコードだと計算がちゃんと出来ない以前にコンパイル(意味わかりますよね)出来ません。
出来るだけ、コンパイル可能な状態のコードを載せるようにしてほしいと思います。

うまくいかないときは"どのように"うまくいかないかを書いてください。

と以上が上記のコメントを読んで気になったことです。


問題は"何故うまく動かないか?"ですよね。
一番大きな問題はコンパイル出来ないということです。
>sin(h)=sin(c)*sin(a)+cos(c)*cos(a)*cos(t);
ここの部分でエラーが起きます。
理由は'='の左側が変数でないからです。
C言語の'='は数学の'='とは意味が違います。'='使い方を確認しておいてください。

たぶんコンパイルが出来ても求める結果が出てこないと思います。
以下の(1),(5)を気にして書き直してみてください。

以下はコードできになったことです。わからなければ無視してもかまいません。
1:C言語の三角関数は度数法でなく孤度法で扱ってます。
2:宣言の型は"double"でなく、"float"なのか?通常の場合はdoubleを使うことが多いです。
3:コメントは書いてほしいです。見せるためだけではなく後々の自分のためにも。
4:今回の場合は、printf("%lf")でなく、printf("%f")でいいのでは?
5:最初にあげた式と、コード中の式が少し異なっているのは問題ないことなのか?






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

Name: 9mm  ..かけだし(1,346ポイント)   Date: 2009/11/19(木) 16:35   No:42328     
Title: Re:計算プログラム    

>コンパイラはVisual Studioですか?
  Visual Studioを使っています。

>コードを投稿するときは<pre></pre>で囲んでください。
  よく意味がわからないんですが…どうすればいいんですか?

>上のコードだと計算がちゃんと出来ない以前にコンパイル(意味わかりますよね)出来ません。出来るだけ、コンパイル可能な状態のコードを載せるようにしてほしいと思います。
  一応プログラムに入力した通りをそのままコピぺしたんですが、それじゃダメなんですかね?

>理由は'='の左側が変数でないからです。
  '='の意味は右辺に左辺を代入するというものではなかったでしょうか?確か…間違ってたらすいません。

>C言語の三角関数は度数法でなく孤度法で扱ってます。
  孤度法はπを使う方法ですか?どうやって未知数の部分を孤度法にすればいいんでしょうか?


自分で書きなおしてみましたが、やはり結果が上から3番目の式までしか出ませんでした…

以下
<pre>

// test3.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "math.h"


int _tmain(int argc, _TCHAR* argv[])
{
double w,n,a,b,t,T,L,c,h;

n=1.0;
T=0.0;
L=131.62;
c=33.23;


w=(360*n)/366;
printf("%f\n",w);
a=0.362-23.3*cos(w+8.8)-0.337*cos(2*w-11.9)-0.185*cos(3*w+35.5);
printf("%f\n",a);
b=-0.0167+7.37*cos(w+85.8)-9.93*cos(2*w-72.3)-0.321*cos(3*w-66.3);
printf("%f\n",b);
t=15*(T-12)+L-135+b/4;
printf("%f\n",t);
sin(h)=sin(c)*sin(a)+cos(c)*cos(a)*cos(t);
printf("%f\n",sin(h));




return 0;
}




</pre>


↑こんな感じで囲むんですか?


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

Name: dic  ..プログラマー(38,358ポイント)   Date: 2009/11/19(木) 16:55   No:42329     
Title: Re:計算プログラム    
>sin(h)=sin(c)*sin(a)+cos(c)*cos(a)*cos(t);
コンパイル通ります?


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

Name: non  ..比類無きプログラマー(70,576ポイント)   Date: 2009/11/19(木) 18:22   No:42332     
Title: Re:計算プログラム    
> >コードを投稿するときは<pre></pre>で囲んでください。
>   よく意味がわからないんですが…どうすればいいんですか?

規約に使い方はありますが、<>は半角です。 組木紙織さんは、説明の都合上全角で書いています。

> >理由は'='の左側が変数でないからです。
>   '='の意味は右辺に左辺を代入するというものではなかったでしょうか?確か…間違ってたらすいません。

そう、代入です。従って、プログラムの場合は左辺には、変数がきます。
求めたいのがhなら
h= に式を変形してください。

>
> >C言語の三角関数は度数法でなく孤度法で扱ってます。
>   孤度法はπを使う方法ですか?どうやって未知数の部分を孤度法にすればいいんでしょうか?

180:π=deg:rad です。
変形すると
rad=3.141592/180*deg になります




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

Name: 9mm  ..かけだし(1,454ポイント)   Date: 2009/11/20(金) 17:57   No:42378     
Title: Re:計算プログラム    
>求めたいのがhなら
h= に式を変形してください。

これはどういう風にすればいいんでしょうか?先生に聞いたらそのままsin(h)の式を書いていけばできるといわれたんですが…。

>180:π=deg:rad です。
変形すると
rad=3.141592/180*deg になります

これをどういう風に組み込めばいいんですか?できれば参考プログラムみたいなのがあればいいんですが…


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

Name: non  ..比類無きプログラマー(70,709ポイント)   Date: 2009/11/20(金) 18:30   No:42380     
Title: Re:計算プログラム    
sin(h)=a なら
h=asin(a) です。 asin はアークサインのこと。

cos(deg)なら ラジアンにしなくてはいけないので
cos(3.141592/180*deg)と書きましょうってこと。






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

Name: Jitta  ..ぴよぴよ(330ポイント)   Date: 2009/11/20(金) 20:22   No:42383     
Title: Re:計算プログラム    
http://bbs.wankuma.com/index.cgi?mode=al2&namber=43658
ほったらかしですか。こういう事をするから、「マルチスレッド禁止」といわれます。


> sin(h)=sin(a)*sin(b)+cos(a)*cos(b)*cos(c)
>
> h:太陽高度
> a:日赤緯
> b:北緯
> c:時角
>
> ここでそれぞれ
>
> c=15*(T-12)+L-135+(e/4)
>
> T:日本標準時 (単位:時間)
> L:東経 (単位:度)
> e:均時差 (単位:分)
>
> w=360*N/366
>
> a=0.362-23.3*cos(w+6.8)-0.337*cos(2*w-11.9)-0.185*cos(3*w+35.5)
>
> e=-0.0167+7.37*cos(w+85.6)-9.93*cos(2*w-72.3)-0.321*cos(3*w-66.3)
>
> N:1月1日から起算した日数

 この中で、e が2回出てきています。

> c=15*(T-12)+L-135+(e/4)
> e=-0.0167+7.37*cos(w+85.6)-9.93*cos(2*w-72.3)-0.321*cos(3*w-66.3)

 c を求めるための e と、三角関数で計算をしている e は、同じ物でしょうか?


> b=-0.0167+7.37*cos(w+85.8)-9.93*cos(2*w-72.3)-0.321*cos(3*w-66.3);
> printf("%lf\n",b);
> t=15*(T-12)+L-135+(b/4);
> printf("%lf\n",t);
> sin(h)=sin(c)*sin(a)+cos(c)*cos(a)*cos(t);

 ここで、最初に提示された式と異なっています。最初の式、
「c=15*(T-12)+L-135+(e/4)」が、
「t=15*(T-12)+L-135+(b/4)」になっています。ここは、b でしょうか、e でしょうか。
上の式は、「1時間あたりの自転角度は15度。1分あたりの自転角度は4度。南中時を0度として、日本標準時を基準に、求める時間の南中時からずれている角度を求める」式であるとわかります。
しかし、下の式は、bがなんなのか、わかりません。これは、何を表しているのでしょう?


> I'=I*(Pの1/sin(h)乗)
>
> I:太陽定数=1353
> P:大気透過率
 P の具体的な数値が提示されていません。


> L=131.62;
> c=33.23;
大分県ですね。


> 求めたいのがhなら
> h= に式を変形してください。
変形する必要はありません。最終的な I' は、「I'=I*(P^(1/sin(h))) 」です。
sin(h) そのものを S とすると、「I' = I * (P^(1/S))」です。


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

Name: 9mm  ..かけだし(1,961ポイント)   Date: 2009/11/20(金) 20:40   No:42384     
Title: Re:計算プログラム    
アドバイスのおかげで太陽高度のhまでは求められたと思います。

ありがとうございます。

次に日射量を求める計算式をプログラムの中に書き込んだんですが、結果の中に

<1.#INFOO>

というものが出てきました。これはどういうことなんでしょうか?

以下

// test3.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "math.h"


int _tmain(int argc, _TCHAR* argv[])
{
double w,n,a,b,t,T,L,c,h,I,i,P;

n=1.0;
T=0.0;
L=131.62;
c=33.23;
i=1353;
P=0,69;

w=(360*n)/366;
printf("%f\n",w);
a=0.362-23.3*cos((3.141592/180)*(w+8.8))-0.337*cos((3.141592/180)*(2*w-11.9))-0.185*cos((3.141592/180)*(3*w+35.5));
printf("%f\n",a);
b=-0.0167+7.37*cos((3.141592/180)*(w+85.8))-9.93*cos((3.141592/180)*(2*w-72.3))-0.321*cos((3.141592/180)*(3*w-66.3));
printf("%f\n",b);
t=15*(T-12)+L-135+b/4;
printf("%f\n",t);
h=asin(sin((3.141592/180)*c)*sin((3.141592/180)*a)+cos((3.141592/180)*c)*cos((3.141592/180)*a)*cos((3.141592/180)*t));
printf("%f\n",h);
I=i*(pow(P,(1/sin((3.141592/180)*h))));
printf("%f\n",I);




return 0;
}







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

Name: non  ..比類無きプログラマー(70,727ポイント)   Date: 2009/11/20(金) 23:09   No:42396     
Title: Re:計算プログラム    
まず、マルチポストを謝って回ることでしょう。


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

Name: 9mm  ..かけだし(2,158ポイント)   Date: 2009/11/21(土) 00:26   No:42399     
Title: Re:計算プログラム    
>「c=15*(T-12)+L-135+(e/4)」が、
「t=15*(T-12)+L-135+(b/4)」になっています。ここは、b でしょうか、e でしょうか。
上の式は、「1時間あたりの自転角度は15度。1分あたりの自転角度は4度。南中時を0度として、日本標準時を基準に、求める時間の南中時からずれている角度を求める」式であるとわかります。
しかし、下の式は、bがなんなのか、わかりません。これは、何を表しているのでしょう?

 b=eです。特に文字を決めてやっていなかったのでなんかごちゃごちゃになってしまいました…。

>P の具体的な数値が提示されていません。

 Pは元々与えられていません。

>まず、マルチポストを謝って回ることでしょう。

 放置してそのままでしたね…。助言ありがとうございます。


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

Name: 組木紙織  ..比類無きプログラマー(75,653ポイント)   Date: 2009/11/21(土) 01:06   No:42401     
Title: Re:計算プログラム    
>アドバイスのおかげで太陽高度のhまでは求められたと思います。

太陽高度角正しく求められていないはずです。
チェックをしてください。

日本付近で真夜中に太陽高度角が-1度そこらなんてありえないです。

aの日赤緯の計算のところですが
最後のコード中の式
a=0.362-23.3*cos(w+8.8)-0.337*cos(2*w-11.9)-0.185*cos(3*w+35.5)
最初に提示した式
a=0.362-23.3*cos(w+6.8)-0.337*cos(2*w-11.9)-0.185*cos(3*w+35.5)

のどちらが正しいのですか?



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

Name: 9mm  ..かけだし(2,218ポイント)   Date: 2009/11/21(土) 01:20   No:42402     
Title: Re:計算プログラム    
>太陽高度角正しく求められていないはずです。
 確かに。数値が出たので安心してました。どこが違うんですかね?

aについては最後に示した式が正しいです。

ほかの部分はあってるんですかね?


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

Name: 組木紙織  ..比類無きプログラマー(75,818ポイント)   Date: 2009/11/21(土) 01:29   No:42403     
Title: Re:計算プログラム    
>ほかの部分はあってるんですかね?

自分で確認してみてください。
自分で電卓を使って一つづつ計算した結果と、プログラムの結果を照らし合わせてみてください。

あ。一つ聞き忘れていました。
太陽定数の単位はどのような単位ですか?

#一応私のほうでプログラムは作っているので、それと照らし合わせることぐらいなら出来ます。


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

Name: 9mm  ..かけだし(2,330ポイント)   Date: 2009/11/21(土) 01:51   No:42405     
Title: Re:計算プログラム    
一応電卓で全部計算しました。

最後の太陽高度角のhはsin(h)のままで計算したら正確な数値っぽいのが出ました。

以下


S=sin((3.141592/180)*c)*sin((3.141592/180)*a)+cos((3.141592/180)*c)*cos((3.141592/180)*a)*cos((3.141592/180)*t);
printf("%f\n",S);



後はこれを利用した日射量だけです。


太陽定数はω/uというものです。



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

Name: 組木紙織  ..比類無きプログラマー(75,658ポイント)   Date: 2009/11/21(土) 02:22   No:42407     
Title: Re:計算プログラム    
日射量の計算式は
>I'=I*(Pの1/sin(h)乗)
これですね。

この式だと太陽が真上にあるときが一番日射量が少なくなるので変な感じなのですが、それは置いておきます。
もう出来ると思うのでやってください。


>太陽定数はω/uというものです。
ω(オメガ)でなくて、W(ワット)ですよね。
ということはSI単位系なので時間の単位は秒。

課題の一つ目は一日の日射量なので、時間の単位に気をつけて考えてみてください。



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

Name: 9mm  ..かけだし(2,358ポイント)   Date: 2009/11/21(土) 02:47   No:42410     
Title: Re:計算プログラム    
日射量の式をプログラムで表わすと

I=i*(pow(P,(1/S)));

という式で大丈夫ですよね?


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

Name: 組木紙織  ..比類無きプログラマー(75,788ポイント)   Date: 2009/11/21(土) 08:48   No:42414     
Title: Re:計算プログラム    
>I=i*(pow(P,(1/S)));
>という式で大丈夫ですよね?

プログラム中の式の問題ではなく、一番最初に提示された式のことです。
その式では太陽高度角が90度のときに最小となり、太陽高度角が0度のときに最大(無限大)となるように
なっており、私が想定している日射量の定義と異なるので、どうなのかなと思っているだけです。



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

Name: Jitta  ..ぴよぴよ(590ポイント)   Date: 2009/11/22(日) 15:58   No:42488     
Title: Re:計算プログラム    
> その式では太陽高度角が90度のときに最小となり、太陽高度角が0度のときに最大(無限大)となる
sin 関数のグラフを書けばわかるんですけどね。

sin(0度) = 0 → 「<1.#INFOO>」の理由
sin(90度) = 1

南中時→太陽高度が日本ではあり得ないが90度→sin(90度)=1
I' = I * pow(P, 1 / 1) → I * P

太陽高度が45度→sin(45度)=0.5
I' = I * pow(P, 1 / 0.5) → I * pow(P, 2) → I * P * P


「日射量 計算」で、検索した
http://www.es.ris.ac.jp/~nakagawa/met_cal/solar.html
http://sakura-tyo.com/haysan/autoac-71.htm
P は、月によって変わるらしい。
http://www.pu-kumamoto.ac.jp/~m-tsuji/kougi.html/ennsyu.html/ennsyu02.html/ennsyu0201.pdf
この PDF ファイル5ページ目に「ブーゲの式」として出てきている式のようですね。


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

Name: 9mm  ..かけだし(2,416ポイント)   Date: 2009/11/24(火) 19:17   No:42579     
Title: Re:計算プログラム    
自分でTの値を変えて確かめたのですが、日射量の結果が0.0000といったものになってしまいます。


なぜでしょうか?


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

Name: Jitta  ..ぴよぴよ(673ポイント)   Date: 2009/11/24(火) 22:09   No:42593     
Title: Re:計算プログラム    
> 自分でTの値を変えて確かめたのですが、日射量の結果が0.0000といったものになってしまいます。
 ほかの条件は?あるいは、T が何の時にですか?
 今の状態では、「コーディングミスでしょう」としか、言いようがありません。


> >P の具体的な数値が提示されていません。
>
>  Pは元々与えられていません。

 与えられていないなら、計算できません。P という不明な数として残すしかありません。


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

Name: 組木紙織  ..比類無きプログラマー(75,643ポイント)   Date: 2009/11/25(水) 02:09   No:42629     
Title: Re:計算プログラム    
>Jittaさん
PとIを入れ違えてて、勘違いしてしまいました。
9mmさんにも迷惑をかけたようですみませんでした。


>自分でTの値を変えて確かめたのですが、日射量の結果が0.0000といったものになってしまいます。
欲しい結果がその値なら問題ないと思います。

夜の間の日射量は定義できないとするか、0とするかだと思います。
なので夜の間の時間と考えているのなら0で問題ないかと思います。


#今までの範囲でコードを組んでみました。
#エラー処理は一切していません。



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

Name: 9mm  ..入門者(2,593ポイント)   Date: 2009/11/25(水) 12:59   No:42645     
Title: Re:計算プログラム    
組木紙織さん、ありがとうございます。


次の段階としてこれをループさせて1日の日射量の計算を行いたいんですが、ループの仕組みがいまいちわかりません…。

最初に提示していた
1.N=1の時、1日の日射量(I)を一分毎に計算せよ。
2.毎日12時の日射毎(I)を1日毎に計算せよ。

という条件をループでどういう風に表現するのでしょうか?

先生からは今作っている計算式のプログラムの前にすればいいということだったんですが…

何度も質問ばっかで申し訳ないです。


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

Name: Jitta  ..ぴよぴよ(0ポイント)   Date: 2009/11/25(水) 22:31   No:42662     
Title: Re:計算プログラム    
大きいので端折りますが、課題1は、こんな結果でよろしいでしょうか?

N = 1 1/ 1(11:51), Insolation = 888.910
N = 1 1/ 1(11:52), Insolation = 889.027
N = 1 1/ 1(11:53), Insolation = 889.134
N = 1 1/ 1(11:54), Insolation = 889.231
N = 1 1/ 1(11:55), Insolation = 889.318
N = 1 1/ 1(11:56), Insolation = 889.394
N = 1 1/ 1(11:57), Insolation = 889.460
N = 1 1/ 1(11:58), Insolation = 889.517
N = 1 1/ 1(11:59), Insolation = 889.563
N = 1 1/ 1(12:00), Insolation = 889.599
N = 1 1/ 1(12:01), Insolation = 889.625
N = 1 1/ 1(12:02), Insolation = 889.641
N = 1 1/ 1(12:03), Insolation = 889.647
N = 1 1/ 1(12:04), Insolation = 889.642
N = 1 1/ 1(12:05), Insolation = 889.628
N = 1 1/ 1(12:06), Insolation = 889.603
N = 1 1/ 1(12:07), Insolation = 889.569
N = 1 1/ 1(12:08), Insolation = 889.524
N = 1 1/ 1(12:09), Insolation = 889.469
N = 1 1/ 1(12:10), Insolation = 889.404

なお、場所は明石市役所(東経 134度59分, 北緯 34度28分)、
P は先の「日射計算詳細」ページより、1月の0.8を使用しました。

void PrintResult(const struct tm when, double insolation) {
// tm 構造体を使えば、m[1]=31のヒントは要らない
// でも、それを使うように作らないと、他の人に作ってもらったことがばれる
_tprintf(_T("N = %d %2d/%2d(%02d:%02d), Insolation = %8.3f\n")
, when.tm_yday + 1, when.tm_mon + 1, when.tm_mday
, when.tm_hour, when.tm_min, insolation);
}

void Exercise1(const double NorthLatitude, const double EastLongitude)
{
struct tm when, *dummy;
time_t now;
time(&now);
dummy = localtime(&now);
memcpy(&when, dummy, sizeof(struct tm));
when.tm_mon = 0;
when.tm_mday = 1;
when.tm_hour = 0;
when.tm_min = 0;
// メインはこのループだけ
for (int i = 0; i < 60 * 24; ++i) {
(void) mktime(&when);
double insolation = CalcInsolation(NorthLatitude, EastLongitude, when);
PrintResult(when, insolation);
when.tm_min += 1;
}
}


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

Name: 組木紙織  ..比類無きプログラマー(75,828ポイント)   Date: 2009/11/25(水) 22:41   No:42664     
Title: Re:計算プログラム    
>次の段階としてこれをループさせて1日の日射量の計算を行いたいんですが、ループの仕組みがいまいちわかりません…。


forやwhileやdoでループを作る方法がわからないということですか?
その場合は入門書に使い方があるはずなのでそれで使い方を覚えてください。

日射量の計算でループの回し方がわからない場合は、日射量の計算に必要な変数をじっくり見てください。
1分おきに計算する場合、変化する変数と変化しない変数があります。



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

Name: 9mm  ..入門者(2,751ポイント)   Date: 2009/11/26(木) 12:41   No:42674     
Title: Re:計算プログラム    
>forやwhileやdoでループを作る方法がわからないということですか?

 for文はわかります。ただ、その中身をどういう風に書き込めばいいかがわかりません。

>日射量の計算でループの回し方がわからない場合は、日射量の計算に必要な変数をじっくり見てください。
1分おきに計算する場合、変化する変数と変化しない変数があります。

1.の場合変化するのはT
2.の場合変化するのはN

だと思うんのですが・・・



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

Name: バグ  ..ハッカー(174,217ポイント)   Date: 2009/11/26(木) 13:47   No:42675     
Title: Re:計算プログラム    
>>for文はわかります。ただ、その中身をどういう風に書き込めばいいかがわかりません。

いや、こういうのを『分かっていない』というんでは…


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

Name: 組木紙織  ..比類無きプログラマー(75,834ポイント)   Date: 2009/11/26(木) 14:01   No:42676     
Title: Re:計算プログラム    
Jittaさんのコード見れば殆どそのまま答が乗っているとおもいます。



1から100迄順番に表示するプログラムとその和を表示するプログラムを書いてください


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

Name: 9mm  ..入門者(2,834ポイント)   Date: 2009/11/26(木) 14:44   No:42680     
Title: Re:計算プログラム    


>for (int i = 0; i < 60 * 24; ++i)

この部分はわかります。その後の

(void) mktime(&when);
double insolation = CalcInsolation(NorthLatitude, EastLongitude, when);
PrintResult(when, insolation);
when.tm_min += 1;

の部分がよくわからないんですが・・・


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

Name: 組木紙織  ..比類無きプログラマー(75,940ポイント)   Date: 2009/11/26(木) 19:59   No:42706     
Title: Re:計算プログラム    
その良く分からない部分は置いといて、(動作を説明しても意味が無いと思いますが、何をしたいかはわかりますよね。)
今までの流れと、ループをそこまで分かっていて何で出来ないかが分かりません。

今までに自分が書いたコードと、わたしがあげたコードきちんと理解していますか?

遠回りに思うかもしれませんが、先程のわたしがやってほしいと書いた事をやって貰えませんか?


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

Name: たいちう  ..プログラマー(36,993ポイント)   Date: 2009/11/26(木) 20:23   No:42707     
Title: Re:計算プログラム    
http://www3.realint.com/cgi-bin/tbbs.cgi?pointc2
http://www3.realint.com/cgi-bin/tarticles.cgi?pointc2+9745

こういうことをするからマルチは嫌われるんだけど、まだわかんないかな。


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

Name: Jitta  ..ぴよぴよ(295ポイント)   Date: 2009/11/26(木) 22:38   No:42714     
Title: Re:計算プログラム    
 わからないから、どうしました?
 私のコードは、組木紙織さんのコードを見て、課題1に相当する部分だけを持ってきました。
私は CalcInsolation 関数の中で、組木紙織さんのコードでは calcSunAngleSin に相当する関数を呼んでいます。

// イメージ
main() {
Exercise1();
}
void Exercise1() {
日射量 = CalcInsolation();
printf(日射量);
}
void CalcInsolation() {
太陽高度の正弦 = calcSunAngleSin();
return 日射量を計算;
}


ですから、下のコードから、 T, L, b, N に相当する物を抜き出せば良いでしょう。

for (int i = 0; i < 60 * 24; ++i) {
(void) mktime(&when);
double insolation = CalcInsolation(NorthLatitude, EastLongitude, when);
PrintResult(when, insolation);
when.tm_min += 1;
}

 この中で N に相当するのは、「when.tm_yday」です。tm_yday は、mktime の中で、tm_year, tm_mon, tm_mday から計算されます。
 T に相当するのは、「when.tm_hour」と「when.tm_min」から計算します。


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

Name: 9mm  ..入門者(3,272ポイント)   Date: 2009/11/27(金) 01:14   No:42716     
Title: Re:計算プログラム    
ここの書き込みと先生からのヒントを使って自分でそれらしいプログラムを作ってみました。値はおかしいことになってます…。Tの単位の問題だとは思うんですが…


#include "stdafx.h"
#include "math.h"


int _tmain(int argc, _TCHAR* argv[])

{
FILE *pf=fopen("test3.txt","w");
for(int T=0;T<=24;T+(1/60))
{
double w,n,a,b,t,L,c,S,I,d,P;

n=1.0;
L=131.62;
c=33.23;
d=1353;
P=0.7;

w=(360.0*n)/366.0;
//printf("%f\n",w);
a=0.362-23.3*cos((3.141592/180.0)*(w+8.8))-0.337*cos((3.141592/180.0)*(2.0*w-11.9))-0.185*cos((3.141592/180.0)*(3.0*w+35.5));
//printf("%f\n",a);
b=-0.0167+7.37*cos((3.141592/180.0)*(w+85.8))-9.93*cos((3.141592/180.0)*(2.0*w-72.3))-0.321*cos((3.141592/180.0)*(3.0*w-66.3));
//printf("%f\n",b);
t=15.0*(T-12.0)+L-135.0+b/4;
//printf("%f\n",t);
S=sin((3.141592/180.0)*c)*sin((3.141592/180.0)*a)+cos((3.141592/180.0)*c)*cos((3.141592/180.0)*a)*cos((3.141592/180.0)*t);
//printf("%f\n",S);
I=d*(pow(P,(1/S)));
fprintf(pf,"%f\n",I);




}
fclose(pf);

return 0;


}



tm構造体がいまいちよく分かんないですが、やはりこれを使わないとできないんでしょうか?


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

Name: 組木紙織  ..比類無きプログラマー(76,132ポイント)   Date: 2009/11/27(金) 01:25   No:42717     
Title: Re:計算プログラム    
Jittaさんが
>// tm 構造体を使えば、m[1]=31のヒントは要らない
と書いてあります。


>ここの書き込みと先生からのヒントを使って自分でそれらしいプログラムを作ってみました。値はおかしいことになってます…。Tの単位の問題だとは思うんですが…

ループごとのTの値を確認してみましたか?

Tは整数型なので、整数以外の値をとれません。
整数以外が扱いたいのなら別の型を使いましょう。


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

Name: Jitta  ..ぴよぴよ(973ポイント)   Date: 2009/11/27(金) 23:41   No:42771     
Title: Re:計算プログラム    
> 値はおかしいことになってます…。
 どの様な値を期待して、実際にはどの様な値が出力されるのでしょうか?
「おかしい」という言葉だけでなく、「どうなっているから」「おかしいと判断したのか」、判断の根拠を示して下さい。
判断の根拠があることによって、何を間違えているのか、判断が出来るようになります。

 とりあえず、「printf("%f\n", (1/60));」をしてみて下さい。"0.000000" になりませんか?
「整数 / 整数」は、「整数」です。答えを実数にするには、除数、被除数のどちらかを実数にします。
1 / 60 → 整数
1 / 60. または 1. / 60 または 1. / 60. → 実数


以下、余談

> //printf("%f\n",w);
 これは、こうしてみましょう。→ fprintf(pf, "w=%f\t", w);
1行に並んで入ります。

> for(int T=0;T<=24;T+(1/60))
 「T<=24」なので、24時、すなわち0時が2回カウントされます。
 また、実数の演算では誤差が蓄積します。「for (int wT = 0; wT < 24 * 60; ++wT)」としておき、ループ内で「double T = wT / 60.;」とした方が、誤差が少なくなるでしょう。
# w は work の意です。


 課題2の方も、コードを出しておきます。

void Exercise2(const double NorthLatitude, const double EastLongitude)
{
struct tm when;
time_t now = time(0);
memcpy(&when, localtime(&now), sizeof(struct tm));
when.tm_mon = 0;
when.tm_mday = 1;
when.tm_hour = 12;
when.tm_min = 0;
(void) mktime(&when);
do {
double insolation = CalcInsolation(NorthLatitude, EastLongitude, when);
PrintResult(when, insolation);
when.tm_mday += 1;
(void) mktime(&when);
} while(when.tm_yday > 0);
}

 太陽高度や日射量を計算する部分を関数として切り出しておくことで、再利用できるようにしています。

 mktime について、種明かしをしておきます。
 計算に必要なのは「1月1日からの積算日」です。これを計算するためには、各月が何日まであるかを意識しなければなりません。

 ところが、実際には、1〜365まで順番に回すだけなので、「m[1]=31」のヒントは必要ないのです。

 しかし、せっかくくれたヒントなので、何かに使いましょう。…と考えたところ、とりあえず、「x月x日(N日目)」と表示することを思いつきました。
 tm 構造体の tm_mon と tm_mday で、月日が出ます。tm_yday は、1月1日からの積算日が入っています。でも、tm_mon = 0; tm_mday = 2; としたからといって、tm_yday が 1 になったりしません。いつ計算されるのでしょう?その計算をするのが、mktime です。
 この関数は、1970年1月1日0時0分0秒からの経過秒数である、システム時間に変換するために使います。システム時間に変換するときに「1月33日」などを「2月2日」などに直してくれるんですね。その為に、使っています。
 また、mktime をしないと tm_yday が変わらないので、do-while 文を使いました。


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

Name: 9mm  ..入門者(3,317ポイント)   Date: 2009/11/28(土) 03:41   No:42775 解決!     
Title: Re:計算プログラム    
なんとかプログラムが完成しました。

結局tm構造体は使いませんでしたが…


協力してくださった方々ありがとうございました。


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



Name: 初心者  ..プログラマー(39,754ポイント)   Date: 2009/11/27(金) 15:27   No:42731       
Title: スタックオーバー    
いつもお世話になります
プログラムを実行していて、途中で止まってしまいます
変な止まりかただったので、タスクマネージャーを起動して調べると、
起動してからのパフォーマンスにおけるメモリ使用量があっという間に 750MBから1.95GBへ(約2分間)

コードは下に書きますが、自作関数、自作マクロがたくさんありまして、
そのまま載せても意味不明ですから、構造のみを書きます


#include "mine.h"
#include <stdio.h>

void funcX( int *A );
void funcY( int *A, int *B );
void funcZ( int *B, int *C, int *D, int *E );

void handle_array( void )
{
int A [6000];
int B [6000];
int C [6000];
int D [6000];
int E [6000];

int td, shif;

for( td = -24; td <= 24; td ++ )
{
printf( "td = %d\n", td );
if( td >= 0 )
{
for( shif = 0; shif <= 24 - td; shif ++ )
{
funcX( A );
funcY( A, B );
funcZ( B, C, D, E );
}
}
else // td < 0.
{
for( shif = -td; shif <= 24; shif ++ )
{
funcX( A );
funcY( A, B );
funcZ( B, C, D, E );
}
}
}
}

void funcX( int *A )
{
// A を定義
}

void funcY( int *A, int *B )
{
// A をベースに、B を作成
}

void funcZ( int *B, int *C, int *D, int *E )
{
// B をベースに、C, D, E を作成
}



調べたところ、
配列を引数として渡すとき、実引数のコピーオブジェが作成されて...
それが膨大なスタックを消費して...
などとありました
しかし、sizeof( int ) = 4 byte で * 6000 = 24,000 byte で = 24 KB...

たとえコピーオブジェが作成されたとしても、なんら問題がないとは思うのですが。

[6000]程度の配列を引数として渡すことは問題なのでしょうか?
よろしくお願いします



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


Name: 御津凪 [URL]  ..ハッカー(126,123ポイント)   Date: 2009/11/27(金) 15:43   No:42732     
Title: Re:スタックオーバー    
handle_array 関数が再帰的に呼ばれている、
あるいは handle_array 関数のように膨大なサイズのローカル変数が定義されている関数を再帰的に呼び出しているのであればメモリが著しく消費されるのは容易に想像できますが、
少なくとも上記のコードからでは著しくメモリを消費される処理は見当たりません。
(処理中にメモリリークが発生している可能性もあります)

> [6000]程度の配列を引数として渡すことは問題なのでしょうか?

膨大なサイズの配列であっても、関数に渡す時は先頭要素へのアドレスのみを渡しているので、
この場合は今回の原因にはなっていないと思います。


タイトルにある「スタックオーバー」とは、スタックオーバーフローが発生したということでしょうか?
そうなのであれば関数を再帰呼び出ししている原因の可能性が高いのですが。


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

Name: 初心者  ..熟練のプログラマー(40,253ポイント)   Date: 2009/11/27(金) 16:08   No:42733     
Title: Re:スタックオーバー    
>>御津凪 さま
 ご返事ありがとうございます
handle_array 関数を呼び出しているのは main ただ一つで他に無く、
handle_array 関数内で for していることもあり、呼び出しは 1 回きりで
再帰的に呼び出してはおりません

>>少なくとも上記のコードからでは著しくメモリを消費される処理は見当たりません。

そうですよね...
いつも td = 7 で重くなりだして、td = 8 でストップです。

>>膨大なサイズの配列であっても、関数に渡す時は先頭要素へのアドレスのみを渡しているので、

そうですよね...
しかし、御津凪 さまから見ても、[6000]は膨大ですか...
あちこちに「膨大」な配列を... とあっても、「膨大」を定義しているところはなかったので
疑問に思ってました。

>>タイトルにある「スタックオーバー」とは、スタックオーバーフローが発生したということでしょうか?

コンパイラが指摘したというものではなくて、メモリの増加からみて「スタックオーバーフロー」が起きているのではないか、と独自に推理しました。
OS : Vista Home;
CPU : Core 2 Duo;
Memory : 2GB;
使用メモリ量が 1.95GBで止まり、
int a; fscanf_s( "%d", a )で止まる時と同じメッセージでした。

なにはともあれ、
handle_array 関数内での構造的な問題ではなく、
また、配列を引数として渡すこと自体に問題はないことがわかりました。
あとは、funcX, Y, Z 内で問題がないか、index などを調べてみたいと思います。

ありがとうございます。



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

Name: 初心者  ..熟練のプログラマー(40,280ポイント)   Date: 2009/11/27(金) 16:11   No:42734     
Title: Re:スタックオーバー    
訂正 : int a; scanf_s( "%d", a )で止まる時と同じメッセージでした。

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

Name: softya  ..熟練のプログラマー(48,984ポイント)   Date: 2009/11/27(金) 16:29   No:42735     
Title: Re:スタックオーバー    
>コンパイラが指摘したというものではなくて、メモリの増加からみて「スタックオーバーフロー」が起きているのではないか、と独自に推理しました

それは勘違いです。
スレッドを大量に起動しない限りスタックを消費しても使用メモリは増えていきません。
スタックはプロセスやスレッド起動時に確保されてしまうからです。VC++の場合はデフォルトスタックのサイズは1MB程度でメモリを大量に消費するはずがありません。
徐々にメモリが増えていくのはnew演算子(C++)やmalloc()関数を使った場合です。


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

Name: 御津凪 [URL]  ..ハッカー(126,202ポイント)   Date: 2009/11/27(金) 16:37   No:42738     
Title: Re:スタックオーバー    
> しかし、御津凪 さまから見ても、[6000]は膨大ですか...
> あちこちに「膨大」な配列を... とあっても、「膨大」を定義しているところはなかったので
> 疑問に思ってました。

「膨大」な配列 かどうかのボーダーラインはプログラムによってさまざまなので、定義するものではありませんが、
単純なプログラムとしては 6000 個の int 型配列を5個スタック領域に確保するのは「膨大」かなと判断しただけです。


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

Name: 初心者  ..熟練のプログラマー(40,610ポイント)   Date: 2009/11/27(金) 16:50   No:42741     
Title: Re:スタックオーバー    
>>softya さま
ご返事ありがとうございます。
実はもともと heap を使っていたのですが、
二週間前ぐらいに、heap では遅い (遅いと言われて)ということもあり、
stack で確保するように書き換えたのですが、
関数内部で、知らないうちに、malloc を呼び出している関数を使っているのかもしれません

>>徐々にメモリが増えていくのはnew演算子(C++)やmalloc()関数を使った場合です。

これで原因がはっきりしました。
徐々に増えていっていますから、(だいたい 0.03GB 毎)
malloc に違いありません。
勉強になりました。
ありがとうございます。


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

Name: softya  ..熟練のプログラマー(49,223ポイント)   Date: 2009/11/27(金) 17:24   No:42746     
Title: Re:スタックオーバー    
えーと、大事な事が書かれていない事に気づきました。
>int a; fscanf_s( "%d", a )で止まる時と同じメッセージでした。
ってメモリ保護例外とかエラーメッセージが出たって事ですよね。
まず、出たエラーメッセージを正確に書いてください。
初心者さんがスタックオーバーフローと書いたため、回答者は無駄な検討をしちゃっている事になります。

VC++等のデバッガが一体化した開発環境を使っている場合はエラーが出たプログラムの行も分かるはずですので、それも教えてください。


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

Name: 初心者  ..熟練のプログラマー(40,880ポイント)   Date: 2009/11/27(金) 18:07   No:42750     
Title: Re:スタックオーバー    
>>softya さま
遅れてすいません
出たエラーメッセージといいましても、明確なエラー内容があるわけではありません。
malloc 以外のメモリにアクセスしたときや、
FILE* f = NULL ,fopen_s のときのような、「あのウィンドウ」が出てくるわけではありません。

td = 8 の段階になると、中央に比較的小さなウィンドウで、

< Microsoft Windows >

...exe は動作を停止しました
この問題の解決策を確認しています...

問題が発生したため、プログラムが正しく動作しなくなりました。
プログラムは閉じられ、解決策がある場合は Windows から通知されます。

以上のようなウィンドウが出てきます。
これは、
int a; scanf_s( "%d", a ); で数値を入力すると出てくるメッセージと同じだったので
書きました。こういうエラーをなんというのかわからず、表現があいまいであったこと、
お詫びいたします。
今、ご指摘いただいた malloc free をやっております。




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

Name: 初心者  ..熟練のプログラマー(40,999ポイント)   Date: 2009/11/28(土) 02:17   No:42774 解決!     
Title: Re:スタックオーバー    
 いや〜!
>>御津凪 さま
>>softya さま
ありがとうございました!!!!

メモリ使用量が増えません!!!

助かりました!!
ここで相談しなければ、
引数に配列を渡さないため、すべての関数をマクロ形式で書き直して...いや、逆にすべて heap に
書き直して... いや、いったんファイルに保管して... などと考え途方にくれていました。

malloc 関連ファイルをすべて削除したらうまくいきました。
しかし、いまさらですが、heap は怖いですね。



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



Name: P  ..かけだし(2,256ポイント)   Date: 2009/11/27(金) 19:34   No:42755       
Title: C言語エラーについて    
あるプログラムをコンパイルしていたところエラーが出たのですがエラーの意味がよくわからないので質問させていただきます。

そのプログラムの仕様は
・サイコロを振って目の大きいほうが勝ち(相手はコンピュータ)
・勝敗を記録(何勝何敗)
・eと打つと終了。エンターを押すと勝負。

・関数を使う。(サイコロの出た目、勝敗判定、勝敗記録)

というものですが勝敗記録の関数のところで
「関数定義情報(またはプロトタイプ情報)より、関数が少ないです。」
というエラーがでます。

実際の関数の部分は

int syouhai(int x,int y)
{
printf("あなたの勝ち:%d 私の勝ち:%d\n",x,y);
}

というものです。
何かが足りない、とは思っているのですがそれが何なのか見当もつかない状態です。
よろしければご指導お願いします。


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


Name: 初級者  ..初心者(7,042ポイント)   Date: 2009/11/27(金) 20:00   No:42756     
Title: Re:C言語エラーについて    
その関数を呼び出しているところを見せてください。

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

Name: conio [URL]  ..比類無きプログラマー(76,220ポイント)   Date: 2009/11/27(金) 20:45   No:42758     
Title: Re:C言語エラーについて    

----------------------------------------------------
int syouhai(int x,int y)
{
printf("あなたの勝ち:%d 私の勝ち:%d\n",x,y);
}
----------------------------------------------------
return文が無いですね。



return文で、int型の値を返すようにするか、
もしくはvoidにして戻り値を無くすべき だと思います。
----------------------------------------------------
int syouhai(int x,int y)
{
printf("あなたの勝ち:%d 私の勝ち:%d\n",x,y);
return(0); //適当に0を指定
}
----------------------------------------------------

----------------------------------------------------
void syouhai(int x,int y)
{
printf("あなたの勝ち:%d 私の勝ち:%d\n",x,y);
}
----------------------------------------------------


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

Name: P  ..入門者(2,702ポイント)   Date: 2009/11/27(金) 21:54   No:42761     
Title: Re:C言語エラーについて    
お返事ありがとうございます。
今回私が書いたプログラムです。

#include<stdio.h>
#include<stdlib.h>

int saikoro(void)/*サイコロを振っています*/
{
    int n;
    n=(int)(rand()/(RAND_MAX+1.0)*6.0);
    ++n;
    printf("%d",n);
}

int hantei(int x,int y)/*判定をしています*/
{
    int jg;
    if(x>y)
    {
        jg=1;
    }
}

void syouhai(int x,int y)/*勝敗記録の表示です*/
{
    printf("あなたの勝ち:%d 私の勝ち:%d\n",x,y);
}
void main(void)
{
    int player;
    int com;
    int jg;
    int x=0;
    int y=0;
    while(getchar()!='e')/*「e」と入力するまでループ*/
    {
        player=saikoro();
        com=saikoro();
        printf("私:%d あなた:%d\n",com,player);
        jg=hantei(player,com);
        if(jg==1)
        {
            printf("あなたの勝ちです\n");
            ++x;
        }
        else
        {
            printf("私の勝ちです\n");
            ++y;
        }
        syouhai(jg);
    }
}

conioさんが言われたとおりvoid文にしてみましたが同じエラーが出るだけでした。
ご指導お願いします。


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

Name: ぬんぬん  ..ぴよぴよ(3ポイント)   Date: 2009/11/27(金) 22:09   No:42764     
Title: Re:C言語エラーについて    
関数int saikoroとint hanteiも値を返す(return文をつける)必要があります。
conioさんの解説をみながら修正してみてください。


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

Name: conio [URL]  ..比類無きプログラマー(76,428ポイント)   Date: 2009/11/27(金) 22:10   No:42765     
Title: Re:C言語エラーについて    
とりあえず、main関数は
int main(void) の形にしておいた方が良いです。


>>conioさんが言われたとおりvoid文にしてみましたが同じエラーが出るだけでした。
全て直ってません。

hantei関数は、"int型の値を返す"と指定しているのにreturn文が無いですし、
saikoro関数も同じく、return文がありません。


一度、関数の引数とは何か、戻り値とは何か、を
把握しなおしてみた方が良いのではないのでしょうか。


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

Name: softya  ..熟練のプログラマー(49,466ポイント)   Date: 2009/11/27(金) 22:23   No:42767     
Title: Re:C言語エラーについて    
とりあえず、ここを読んでみてください。
http://www.geocities.jp/ky_webid/c/008.html
苦Cの11章関数の作り方も見てみてくださいね。
http://homepage3.nifty.com/mmgames/c_guide/


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

Name: P  ..入門者(2,801ポイント)   Date: 2009/11/27(金) 22:39   No:42768 解決!     
Title: Re:C言語エラーについて    
ありがとうございます。
難しいですね。自分の理解力が低いだけかもしれませんが・・・

解決はしていませんがもう一度最初からやってみることにします。
貴重な時間を使っていただきありがとうございました。

また何かあればお世話になるかもしれませんがよろしくお願いします。


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



Name: shevchenko  ..ぴよぴよ(531ポイント)   Date: 2009/11/27(金) 22:04   No:42763       
Title: プログラミング    
C言語で次の二つの微分方程式
y '=y の解をx=0〜1の範囲
y '=-4y の解をx=0〜4の範囲
を、Runge-Kutta法により求めるプログラムを作りたい。
初期条件はx=0,y=1で、また、間隔Δxを変えたときの解の変化も調べたい。
全く分からずお手上げ状態です。C言語は全くの初心者なので簡単に解説(回答)して頂ければありがたいです。
よろしくお願いします。


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


Name: softya  ..熟練のプログラマー(49,462ポイント)   Date: 2009/11/27(金) 22:20   No:42766     
Title: Re:プログラミング    
この掲示板の「規約と注意事項」に違反していますので、お答えできません。
「規約と注意事項」を隅から隅まで、よく読んでみてくださいね。
それと前の質問を放置しないでください。
http://www.play21.jp/board/formz.cgi?action=res&resno=42730&page=&id=dixq&rln=42745
マルチポストも禁止ですよ。
http://oshiete1.goo.ne.jp/qa5479736.html


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



Name: dic  ..プログラマー(38,685ポイント)   Date: 2009/11/21(土) 15:20   No:42434       
Title: ファイル出力がうまくいかない    
vector<wchar_t> vs2 の内容をテキストに出力する補助関数のコードを作りました
下がそうなのですが、ファイルのオープンには成功しているのですが、
書き込み処理で失敗しているようです。
VC++2008のデバッカで追うと「不適切なPtr」とでていてて何が原因か分かりません
原因の分かる方いらっしゃらないでしょうか?


/---------------------------------------------------------------
// vs2 の内容を step3.txt に出力する
void wCVectorStep3()
{
FILE *file = fopen( "wstep3.txt", "wt" );
if( file == NULL )
MessageBox( NULL, "error", "error", MB_OK );
int i;
for( i=0; i<vs2.size(); i++ )
{
wchar_t buf[10240];
memset( buf, 0, sizeof(buf) );
wcscpy( buf, vs2.at(i) );
int error = fputws( buf, file );
if( error < 0 )
printf( "error\n" );
}
}



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


Name: Justy  ..伝説なるハッカー(465,138ポイント)   Date: 2009/11/21(土) 15:57   No:42435     
Title: Re:ファイル出力がうまくいかない    
 vs2は std::vector<wchar_t>なのですから、vs2.at(i)の戻り値は
wchar_t型の参照になります。

 これはポインタではないので wcscpyの行でコンパイルエラーが
発生すると思われますが、実行できている……。

 何か情報が間違っていませんか?


 あと、処理が終わったら fcloseし、fopenに失敗しているのなら fputwsは
しないようにして下さい。


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

Name: ぽこ  ..かけだし(2,362ポイント)   Date: 2009/11/21(土) 16:14   No:42436     
Title: Re:ファイル出力がうまくいかない    
これ、コンパイルできないですよ。

vs2はvector<wchar_t>ではなくて、
vector<wchar_t*>では?

あと、問題となった関数だけじゃなくて、
問題を再現させるプログラムを載せていただけると助かるのですが。


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

Name: dic  ..プログラマー(38,838ポイント)   Date: 2009/11/21(土) 16:50   No:42437     
Title: Re:ファイル出力がうまくいかない    
すいません、イージーミスしてました
vector<wchar_t*> vs2 です
fclose も入れておきました

問題のソースコードと、処理するデータ(テキストファイル)を一緒にあげておきます
http://www1.axfc.net/uploader/He/link.pl?dr=1664324997&file=He_253347.zip

VC++6  VC++2008 Express  どちらでもコンパイルできて、実行もできます・・・


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

Name: Justy  ..伝説なるハッカー(465,210ポイント)   Date: 2009/11/21(土) 17:29   No:42440     
Title: Re:ファイル出力がうまくいかない    
 dic_SDKというのがないので、該当箇所がどこだかよくわからないのですが、
vs2.at(i)に 10240文字未満の正しい文字列へのポインタが入っていて、
最後に fcloseされているなら書き込まれると思いますが、
何がどう失敗しているのでしょう?


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

Name: dic  ..プログラマー(38,935ポイント)   Date: 2009/11/21(土) 18:49   No:42446     
Title: Re:ファイル出力がうまくいかない    
送付ミスしました
ミス続きですね 今日はちょっと休みます

GetLastErrorで調べたところ 183:既に存在するファイルを作成することはできません。

だったので

remove( "wstep3.txt" );

を前に挿入したところエラーはでなくなりました

うまくいってるか
今、結構ファイルあるんで、走らせてます


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

Name: Justy  ..伝説なるハッカー(465,610ポイント)   Date: 2009/11/21(土) 20:02   No:42447     
Title: Re:ファイル出力がうまくいかない    
 最初の投稿の「不適切なPtr」はキャプチャを見る限り Fileポインタとしては
値が入っていますので、気にする必要はありません。

 さてそうなると、「書き込み処理で失敗」というのはどこで何がどう失敗しているのか、
が問題になります。
 まだ問題がのこっているようでしたら、このあたりを補足して下さい。



>GetLastErrorで調べたところ 183:既に存在するファイルを作成することはできません

 何の関数を呼んだあとに GetLastErrorで調べたのですか?

 なんか直感的に fopenの後って気がするので、一応念のために書いておきますと
fopenのエラー内容は状況を調べる方法はその戻り値とグローバル変数 errnoで、
GetLastErrorではありません。


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

Name: dic  ..プログラマー(39,231ポイント)   Date: 2009/11/22(日) 18:07   No:42499     
Title: Re:ファイル出力がうまくいかない    
ソース一式
http://www1.axfc.net/uploader/He/so/253519


//---------------------------------------------------------------
// vs2 の内容を step3.txt に出力する
void wCVectorStep3()
{
remove( "wstep3.txt" );
FILE *file = fopen( "wstep3.txt", "wt" );
if( file == NULL ){
MessageBox( NULL, "error", "error", MB_OK );
return;
}
// ファイルのオープンには成功している

int i;



処理するファイルが600個あるのですが、509個目で必ず、fopenに失敗してました
OSの動作が不安定なのか再起動もしてみましたが、改善されませんでした
508個はfopen成功してるのですが・・・
VC++6.0です
これは・・・原因がつかめません


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

Name: softya  ..熟練のプログラマー(45,503ポイント)   Date: 2009/11/22(日) 18:36   No:42500     
Title: Re:ファイル出力がうまくいかない    
fopenの同時オープンの上限数制限に引っかかっています。
どうしてfcloseしていないのでしょうか?


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

Name: Justy  ..伝説なるハッカー(465,829ポイント)   Date: 2009/11/22(日) 18:39   No:42502     
Title: Re:ファイル出力がうまくいかない    
 vs2は std::vector<wchar_t*>なわけですが、問題はこのポインタです。
 vs2に対して push_backしているポインタは、例えば wCVectorStep2_1関数を見てみると

    wchar_t copy[10240];
    memset( copy, 0, sizeof(copy) );
    ...
    wcscat( copy, b2 );
    vs2.push_back( copy );

と、ローカル変数の配列に対するポインタを入れています。

 これでは関数を抜けた後、copy変数は破棄されますので、
push_backしたポインタも無効になってしまいます。

 無効になったポインタを fputws()すれば失敗してもおかしくはありません。


 std::vector<wchar_t*>はやめて、普通に std::vector<std::wstring>を
使うのがいいかと思います。


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

Name: dic  ..プログラマー(39,286ポイント)   Date: 2009/11/22(日) 21:32   No:42521     
Title: Re:ファイル出力がうまくいかない    
う、すいません、ソースの下の方でfclose()呼んでますけど載せてないですね

std::vector<wchar_t*> はこれの次に確認しようかなぁって思ってたんですよね
>std::wstring こんなのもあったんですね
いろいろ試してみます


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

Name: softya  ..熟練のプログラマー(45,662ポイント)   Date: 2009/11/22(日) 21:50   No:42523     
Title: Re:ファイル出力がうまくいかない    
>う、すいません、ソースの下の方でfclose()呼んでますけど載せてないですね

どちらにしても、fcloseまでの間にfopenしている数が多すぎます。
512-3(stdin,stdout,stderr)が上限ですので無理やり増やすか、
http://msdn.microsoft.com/ja-jp/library/6e3b887c(VS.80).aspx
そもそも処理を考え直すかしてください。


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

Name: dic  ..プログラマー(39,312ポイント)   Date: 2009/11/23(月) 15:45   No:42541     
Title: Re:ファイル出力がうまくいかない    
関数 wCVectorStep1( char *filename );
でfclose();してませんでした
これも原因ですね


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

Name: dic  ..プログラマー(39,344ポイント)   Date: 2009/11/27(金) 19:16   No:42752 解決!     
Title: Re:ファイル出力がうまくいかない    
続きの質問がありますが、別の話になるので解決押して起きます

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

Name: dic  ..プログラマー(39,368ポイント)   Date: 2009/11/27(金) 19:17   No:42753     
Title: Re:ファイル出力がうまくいかない    
ファイル出力もfclose()関数を適切に追加することで期待したどおりの動作をしました

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



Name: uu  ..ぴよぴよ(183ポイント)   Date: 2009/11/27(金) 09:07   No:42724       
Title: テーブル参照    
C言語で大きなデータがあるテーブル(行列)をファイルから読み込みたいと
思っています。どんなやり方があるのでしょう?
あまり知識がないので出来れば簡単な方法でお願いします。


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


Name: 朽木  ..中級者(11,057ポイント)   Date: 2009/11/27(金) 11:07   No:42726     
Title: Re:テーブル参照    
ファイルの中身がどんな形をしているのかがわかれば、探したいものをどうやって探せば良いか分かるんじゃないかな

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

Name: たかぎ [URL]  ..ハッカー(124,527ポイント)   Date: 2009/11/27(金) 17:20   No:42744     
Title: Re:テーブル参照    
CSVといいたいところですが、TSVが一番簡単だと思います。


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



Name: 黒ヤギ  ..ぴよぴよ(27ポイント)   Date: 2009/11/27(金) 12:18   No:42727       
Title: 落ちゲーのピースの作り方と落下のアルゴリズムについて    
初めまして、黒ヤギというものです。
私は現在学校の卒業制作でゲームを作ることになり、その作業に着手しているのですが、プログラムとアルゴリズムの壁にぶち当たっています。

作成したいのはテトリスのような落ちゲーです。
現在壁となっているのはピースの作成と作成したピースを落下させるためのアルゴリズムです。

タイトル通り、ピースの作成方法と落下のアルゴリズムをご教授していただきたいです。



Cは授業で基礎的なところ(ブロック崩しを製作)までは勉強しましたが、それでもあまり理解できていないレベルです。

使用ソフトはMicrosoft visual Studioです。

どうか、よろしくお願いします


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


Name: バグ  ..ハッカー(174,647ポイント)   Date: 2009/11/27(金) 12:48   No:42728     
Title: Re:落ちゲーのピースの作り方と落下のアルゴリズムについて    
今、まさに過去に作ったコンソールアプリのテトリスをDXライブラリを使用したものにリメイクしているところです(笑)
C++で組んだものでよければ、下記URLにソースを置いてありますので見てみてください。
あまりコメントを入れていないので、内容で分からない点があれば質問してくれても構いません(^_^;)

http://park.geocities.jp/bugbugbugbug2001/


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

Name: 朽木  ..中級者(11,045ポイント)   Date: 2009/11/27(金) 13:04   No:42729     
Title: Re:落ちゲーのピースの作り方と落下のアルゴリズムについて    
ブロックを落とす表現をするのに一番理解しやすいのは、レイヤを2枚(C言語的に言えば、2次元配列を2つ持つ3次元配列をひとつ)作って、一枚はブロックを落とすためのレイヤ、もう一枚は、既に落ちたブロック。例えば、ブロックが地面に着いたら、2つのレイヤをOR加算します。

画面がどうであれ、2つのレイヤをOR加算したものを表示するようにすれば、ブロックを落とすためには、ブロックを落とすために使用するレイヤの各行の値を、それぞれ一行下の1次元配列にコピーする処理をすれば良いだけになります。

ただし、この方法は、非常に処理が重くなるだけでなく、上に書いてあることをそのまま書くと、セグメンテーション違反を起こします。


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

Name: softya  ..熟練のプログラマー(49,029ポイント)   Date: 2009/11/27(金) 16:36   No:42737     
Title: Re:落ちゲーのピースの作り方と落下のアルゴリズムについて    
こちらにテキストだけで作るテトリスがありますので参考にしてください。
http://www.nhk.or.tv/kow/program/index.php


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

Name: 黒ヤギ   Date: 2009/12/03(木) 12:13   No:427271259810017     
Title: Re:落ちゲーのピースの作り方と落下のアルゴリズムについて    
返信が非常に遅くなってすみません。
皆さんのおかげで基礎的なところはなんとか理解できました。

それでまた質問なのですが、配列でブロックパターンを作ったところに画像を当てはめる(配列内で1のところに画像をあてる)ことは可能なのでしょうか?




Name: 天和  ..ぴよぴよ(928ポイント)   Date: 2009/11/26(木) 17:35   No:42691       
Title: コマンドプロンクト    
コマンドプロンクトをつかって
-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
""の間の言葉を
-nの分だけ繰り返すプログラムを作りなさい
上記の場合はhello hello helloと出てきたら成功です
とのことですがさっぱりわかりませんそもそも""のあいだ文章だけをいう認識をどうやってプログラムすればいいか・・・
一応ヒントでは
#include<stdio.h>
int main(int argc char **argv
{
while(argc--)printf("%s\n", *argv++);
return 0;
}
とのことですが・・・


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


Name: たかぎ [URL]  ..ハッカー(124,020ポイント)   Date: 2009/11/26(木) 17:40   No:42692     
Title: Re:コマンドプロンクト    
一応、尋ねます。

> コマンドプロンクトをつかって

コマンドプロンクトとは?


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

Name: softya  ..熟練のプログラマー(47,663ポイント)   Date: 2009/11/26(木) 17:46   No:42693     
Title: Re:コマンドプロンクト    
まず、ヒントのプログラムに-n 3 -s "hello" と入力して実行するとどうなりますか?
結果を書いてください。

それとポインタと文字列の比較は学習済みですか?
学習済みなら文字列の比較の関数名の例をあげてください。

規約にも有りますが、天和さんのC言語技術レベルがさっぱり伝わって来ないので何から説明してよいのか分からない状況です。必ず出来ること出来ない事を詳細に書いてください。


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

Name: 天和  ..かけだし(1,017ポイント)   Date: 2009/11/26(木) 19:11   No:42698     
Title: Re:コマンドプロンクト    
>>たかぎさん
失礼しましたコマンドプロンプトです
>>softya 一応習うには習ったんですがさっぱりわからなくて・・・
技術レベルは大体
ポインタで躓いてるところでしょうか・・・・


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

Name: 天和  ..かけだし(1,155ポイント)   Date: 2009/11/26(木) 19:35   No:42699     
Title: Re:コマンドプロンクト    
追記さらに詳しく
たとえば
void sum_diff(int n1, int n2, int sum, int diff)
{sum = n1 + n2;
diff = (n1 > n2)
}
int main
{
int na, nb;
int wa = 0, sa = 0;
puts("二つの整数を入力してください") ;
printf("整数A");scanf("%d"&na);
printf("整数B");scanf("%d"&nb);
sum_diff(na, nb,wa,sa)
printf("和は%dです。\nさは%dです。\n", wa, sa);
return 0;
}
とプログラミングしてもな正常に動かないのかわかりません
ちなみに参考にしている書籍は明解C言語です。


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

Name: non  ..比類無きプログラマー(71,324ポイント)   Date: 2009/11/26(木) 19:37   No:42700     
Title: Re:コマンドプロンクト    
>-n 3 -s "hello"
>-s"hello" -n 3
"hello"の前には必ず-sがあるのでしょうか?
-sの後にはスペースがある場合とない場合があるのでしょうか?


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

Name: softya  ..熟練のプログラマー(48,224ポイント)   Date: 2009/11/26(木) 19:37   No:42701     
Title: Re:コマンドプロンクト    
質問のしかたに問題ある方は、こちらのたずねた事に全て答えてくれない場合が多いで注意してくださいね。そのため、2度手間、3度手間になる上にこちらの回答が的外れな回答になる場合があります。必要だから聞いていますので、お願いします。

再度お尋ねします。

>まず、ヒントのプログラムに-n 3 -s "hello" と入力して実行するとどうなりますか?
>結果を書いてください。

>文字列の比較は学習済みですか? 学習済みなら文字列の比較の関数名の例をあげてください。

新しい質問
>ポインタで躓いてるところでしょうか・・・・
ポインタの分かっている事と、分かっている事でサンプルを書いてください。



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

Name: non  ..比類無きプログラマー(71,381ポイント)   Date: 2009/11/26(木) 19:40   No:42702     
Title: Re:コマンドプロンクト    
添付されているプログラムはエラーがあるから、動かないですよね。
ポインタで躓いている以前の問題のような・・・


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

Name: softya  ..熟練のプログラマー(48,587ポイント)   Date: 2009/11/26(木) 19:54   No:42704     
Title: Re:コマンドプロンクト    
規約に有ると思うのですが、<pre>を使ってくださいね。

これ、ポインタ使ってませんよね。
void sum_diff(int n1, int n2, int sum, int diff)
{sum = n1 + n2;
diff = (n1 > n2)
}
int main
{
int na, nb;
int wa = 0, sa = 0;
puts("二つの整数を入力してください") ;
printf("整数A");scanf("%d"&na);
printf("整数B");scanf("%d"&nb);
sum_diff(na, nb,wa,sa)
printf("和は%dです。\nさは%dです。\n", wa, sa);
return 0;
}
明解C言語を持っていませんが、ポインタの練習問題でしょうか?
diff = (n1 > n2)
って、この式そもそも差じゃないですよ。
関係演算子って演算結果が何になるかご存知ですか?
そこも危うい気がしますね。

これ見る限りポインタを使う前提な-s "hello" -n 3の問題は早すぎます。
まず、この問題を解けるようにならないと。
って事で、この問題からやり直ししませんか?


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

Name: softya  ..熟練のプログラマー(48,616ポイント)   Date: 2009/11/26(木) 19:55   No:42705     
Title: Re:コマンドプロンクト    
>-sの後にはスペースがある場合とない場合があるのでしょうか?
あるのが正しいです。


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

Name: 天和  ..かけだし(1,765ポイント)   Date: 2009/11/26(木) 20:46   No:42708     
Title: Re:コマンドプロンクト    
>>softyaさん
まずヒントのプログラムは<pre>
#include<stdio.h>
int main(int argc char **argv
{
while(argc--)printf("%s\n", *argv++);
return 0;
} </pre>
これを応用して(別に使わなくてもいいですが)作ったプログラムで
-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
hello hello helloとででてくれば正解です
もちろんhelloに限らず
-n 5 -s "good" と入力するか-s "good" -n 5と入力したら
good good good good good
と出力されます
>文字列の比較は学習済みですか? 学習済みなら文字列の比較の関数名の例をあげてください。
すいません習ってはいるんですがさっぱりわかってないので学習済みでないということにしておいてください
>ポインタの分かっている事と、分かっている事でサンプルを書いてください。
最初から躓いてます
<pre>void sum_diff(int n1, int n2, int sum, int diff)
{sum = n1 + n2;
diff = (n1 > n2) ? n1 - n2 : n2 - n1;
}
int main
{
int na, nb;
int wa = 0, sa = 0;
puts("二つの整数を入力してください") ;
printf("整数A");scanf("%d"&na);
printf("整数B");scanf("%d"&nb);
sum_diff(na, nb,wa,sa)
printf("和は%dです。\nさは%dです。\n", wa, sa);
return 0;
}
</pre>
(すいません写し間違えてました)
ですがこれは本ではこれを実行すると0となって正しい回答が出てこないのでこれを解決するには
ポインタが必要ですと冒頭の部分ですので・・・・。


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

Name: softya  ..熟練のプログラマー(48,824ポイント)   Date: 2009/11/26(木) 21:05   No:42709     
Title: Re:コマンドプロンクト    
>これを応用して(別に使わなくてもいいですが)作ったプログラムで
>-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
>hello hello helloとででてくれば正解です
>もちろんhelloに限らず
>-n 5 -s "good" と入力するか-s "good" -n 5と入力したら
>good good good good good
>と出力されます

応用する前に、ヒントのまま試してくださいって事です。
ヒントのプログラムに天和さんが思っている以上の意味があります。

>ですがこれは本ではこれを実行すると0となって正しい回答が出てこないのでこれを解決するには
ポインタが必要ですと冒頭の部分ですので・・・・。

明快C言語では、ポインタの学習はこの順番なんでしょうか?
1.冒頭の問題「helloなど任意も文字列を指定した数だけだす」
2.次に提示された問題「和と差を出す問題」
1が出来たら2って事ですか?
どう考えても1の方が難しいですけど。
もっと簡単なポインタの問題は無いんでしょうか?
簡単なのから始めないと1も2も解く事は無理だと思います。
無いなら作りますよ。


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

Name: たかぎ [URL]  ..ハッカー(124,428ポイント)   Date: 2009/11/26(木) 21:17   No:42710     
Title: Re:コマンドプロンクト    
とりあえず作ってみました。
いつものようにコメントは一切付けていませんので、自分で解析してください。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <stdbool.h>

bool str_to_ui(const char *s, unsigned int *pi)
{
while (isspace((unsigned char)*s))
++s;
if (!isdigit((unsigned char)*s))
return false;

char *endptr;
errno = 0;
unsigned long t = strtoul(s, &endptr, 10);
if (errno != 0 || t > UINT_MAX || *endptr != '\0')
return false;
*pi = (unsigned int)t;
return true;
}

int main(int argc, char *argv[])
{
unsigned int n = 0;
const char *s = "";

for (int i = 1; i < argc; i++)
{
const char *arg = argv[i];
if (arg[0] == '-')
{
switch (arg[1])
{
case 'n':
if (arg[2] != '\0')
{
if (!str_to_ui(&arg[2], &n))
return EXIT_FAILURE;
}
else if (++i >= argc || !str_to_ui(argv[i], &n))
{
return EXIT_FAILURE;
}
break;
case 's':
if (arg[2] != '\0')
{
s = &arg[2];
}
else if (++i >= argc)
{
return EXIT_FAILURE;
}
else
{
s = argv[i];
}
break;
default:
return EXIT_FAILURE;
}
}
else
{
return EXIT_FAILURE;
}
}

for (int i = 0; i < n; i++)
{
fputs(s, stdout);
fputc(i < n - 1 ? ' ' : '\n', stdout);
}
return EXIT_SUCCESS;
}

-nや-sを複数回指定した場合は、後勝ちにしています。


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

Name: 天和  ..かけだし(2,216ポイント)   Date: 2009/11/26(木) 22:10   No:42711 解決!     
Title: Re:コマンドプロンクト    
>softyaさん
文章下手で申し訳ありません
さっきsoftyaさんが自分は今技術はどのくらいのレベルなのかと聞いたので
ポインタの冒頭部分つまり最初から躓いているんです。そして下のコードは
<pre>void sum_diff(int n1, int n2, int sum, int diff)
{sum = n1 + n2;
diff = (n1 > n2) ? n1 - n2 : n2 - n1;
}
int main
{
int na, nb;
int wa = 0, sa = 0;
puts("二つの整数を入力してください") ;
printf("整数A");scanf("%d"&na);
printf("整数B");scanf("%d"&nb);
sum_diff(na, nb,wa,sa)
printf("和は%dです。\nさは%dです。\n", wa, sa);
return 0;
}
</pre>
は自分の持っている本のポインタの冒頭の部分なんです(つまりこれを解決するにはポイントが必要つまり
これからポインタを習っていきましょうという感じです)
そしてしばらく授業が進んで出た課題が
コマンドプロンクトをつかって
-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
""の間の言葉を
-nの分だけ繰り返すプログラムを作りなさい
ということなんです。だからまずポインタとはどういうものなのか自体わかってないんです
>>たかぎさん
ご親切にありがとうございますがんばって解析したいと思います


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

Name: softya  ..熟練のプログラマー(48,771ポイント)   Date: 2009/11/26(木) 22:19   No:42712     
Title: Re:コマンドプロンクト    
えーと、つまり「和と差を出す問題」が先なんですよね?
まだ「和と差を出す問題」が解けない状態では、「helloなど任意の文字列を指定した数だけだす」のたかぎさんの回答は理解できないと思いますよ。


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

Name: 天和  ..かけだし(2,240ポイント)   Date: 2009/11/26(木) 22:22   No:42713     
Title: Re:コマンドプロンクト    
>>softyaさん
時間はあるので順番にといていきます


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

Name: toyo  ..熟練のプログラマー(45,466ポイント)   Date: 2009/11/27(金) 09:03   No:42723     
Title: Re:コマンドプロンクト    
getopt( )が使えると楽なんですけどね
課題なら自作しろって事でしょうが


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



Name: ruru  ..ぴよぴよ(51ポイント)   Date: 2009/11/27(金) 03:14   No:42718       
Title: 高速フ−リエ    
私は、高速フーリエ変換(FFT)のプログラムを作っているのですがどうも上手くいきません。
私が作りたいプログラムは FFTを用いたパワースペクトル表示するプログラムでプログラムに入出力も加えたいと思っています。 Cで書かれていれば なんでもいいです。



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




Name: Ω  ..初心者(6,337ポイント)   Date: 2009/11/24(火) 20:57   No:42585       
Title: 当たり判定について    
今プチSTGを作っています。
当たり判定を実装しようとしたんですが、うまくいきません。
ゲームプログラミングの館のs11を参考にしましたが、反応がありません。
質問ばかりだとバグ取り能力が育たないんだろうな・・・orz
↓プログラムコード

//コードが長すぎて投稿できないので前板参照「弾の描画について 2」


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

Ziki.x =320; //自機に座標を代入
Ziki.y =240;
Ziki.hp =Zhp;
Ziki.Mhp=Zhp;
Teki[0].x =640;
Teki[0].y =120;
Teki[0].hp =Thp;
Teki[0].Mhp=Thp;

int Ziki_image[Z_image],Teki_image[T_image],Count;

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

/////////////////////////////////////////////////////////////////////////

SetDrawScreen(DX_SCREEN_BACK); //裏画面に設定
LoadDivGraph("Ziki.png",2,2,1,20,26,Ziki_image); //画像を読み込ませる
LoadDivGraph("Teki.png",2,2,1,20,26,Teki_image);

for(int i=0; i<Tamax; i++){
Tama[i].Flag =0;
Tama[i].x =Ziki.x;
Tama[i].y =Ziki.y;
T_Tama[i].TFlag=0;
T_Tama[i].x =Teki[0].x;
T_Tama[i].y =Teki[0].y;
}

int Range=Ziki.Range+Teki[0].Range;

/////////////////////////////////////////////////////////////////////////

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){

int X=Ziki.x-Teki[0].x,Y=Ziki.y-Teki[0].y;
int Red=GetColor(255,0,0),Blue=GetColor(0,255,255);


Ziki. Range=7;
Tama[Tamax]. Range=2;

Teki[0]. Range=7;
T_Tama[Tamax].Range=2;

fps(); //fpsを固定&表示
count++;
wait_fanc();

if(Teki[0].x> -30)Teki[0].x-=10;
if(Teki[0].x==-30)Teki[0].x=800;


if(Key[KEY_INPUT_LEFT]==1)
Ziki.x-=4;
if(Key[KEY_INPUT_UP]==1)
Ziki.y-=4;
if(Key[KEY_INPUT_RIGHT]==1)
Ziki.x+=4;
if(Key[KEY_INPUT_DOWN]==1)
Ziki.y+=4;

if(X*X+Y*Y<Range*Range){ //ココ
DrawCircle(30,30,100,Red,TRUE);
}

Shot_Tama();

for(int i=0; i<Tamax; i++){
if(Tama[i].Flag==1){
if(Tama[i].y>0)Tama[i].y-=T_Speed;
else Tama[i].Flag=0;

DrawCircle(Tama[i].x,Tama[i].y,ZRange,Blue,TRUE);
}
}

Shot_T_Tama();

for(int i=0; i<Tamax; i++){
if(T_Tama[i].TFlag==1){
if(T_Tama[i].y<500)T_Tama[i].y+=Teki_Speed;
else T_Tama[i].TFlag=0;

DrawCircle(T_Tama[i].x,T_Tama[i].y,TRange,Red,TRUE);
}
}

DrawCircle(Ziki.x+7,Ziki.y+11,Ziki.Range,Red,TRUE );
DrawCircle(Teki[0].x+7,Teki[0].y+10,Teki[0].Range,Red,TRUE);

//DrawBox (50,400,150,405,GetColor(255,255,255),FALSE); バグってるので放置してる
//DrawBox (51,400,51+Zhp*Ziki.hp/Ziki.Mhp,405,GetColor(255,255,255),TRUE );

DrawGraph (Ziki.x,Ziki.y,Ziki_image[0],TRUE );
DrawGraph (Teki[0].x,Teki[0].y,Teki_image[0],TRUE);

ScreenFlip();
}

/////////////////////////////////////////////////////////////////////////
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}



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


Name: softya  ..熟練のプログラマー(45,998ポイント)   Date: 2009/11/24(火) 21:19   No:42587     
Title: Re:当たり判定について    
それとデバッグ能力を育てたかったら、当たり判定処理でどうなって当たっていない事になっているか調べてみてください。調べ方が分からなかったら聞いてください。
ヒントは、
・ブレークポイントとステップ実行
・OutputDebugString
のどちらかを使う事。両方使っても可です。


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

Name: Ω  ..初心者(6,471ポイント)   Date: 2009/11/25(水) 17:44   No:42647     
Title: Re:当たり判定について    
すいません・・・
自分はC言語のコンソールアプリケーションより先にWindowsアプリケーションを始めた、
つまりC言語の予備知識なんて皆無なんです。
ブレークポイントの使い方とかステップ実行とか全然わかりません。
ブレークポイントは確か「/*」「*/」ですよね?


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

Name: Mist  ..比類無きプログラマー(72,200ポイント)   Date: 2009/11/25(水) 17:58   No:42649     
Title: Re:当たり判定について    
> ブレークポイントは確か「/*」「*/」ですよね?

ぜんぜん違います。
それはコメントアウトです。
知らない言葉はまずググってみるほうがいいです。
それだけで、解決することはよくあります。

http://cvwww.ee.ous.ac.jp/vc08prog.html
かなり下のほうの「ブレークポイントの設定」以降を読んでください。


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

Name: softya  ..熟練のプログラマー(46,996ポイント)   Date: 2009/11/25(水) 18:05   No:42650     
Title: Re:当たり判定について    
>ブレークポイントは確か「/*」「*/」ですよね?
それは残念ながらコメントですね。
C言語の基本文法は平行して勉強された方が良いです。今後絶対、それが原因でつまづきます。

と言うことで、今後のためにデバッグ講座です。
今から説明するのはC言語の予備知識と言うより、開発環境(VisualStudio)の使い方なんですけどね。
デバッグが出来ると質問してそのものズバリな回答を貰うよりもっと深い知識、考え方を身につけることが可能だと私は思います。まぁ、考え抜いて分からないなら質問したほう良いですけど。

まず、基本的なブレークポイントやステップ実行の知識です。
http://journal.mycom.co.jp/articles/2008/08/18/debug/index.html

OutputDebugStringの使い方。
http://marupeke296.com/DBG_No3_OutputDebugWindow.html
OutputDebugStringは通過する予定の場所や確認したい変数を調べるのに使います。
今回の場合は、当たり判定処理の何処で当たらないと見なされているかと、その時のあたり判定座標を確認してみると思います。
細かい点で、分からなかった聞いてください。


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

Name: YuO  ..プログラマー(37,868ポイント)   Date: 2009/11/25(水) 18:08   No:42651     
Title: Re:当たり判定について    
> 自分はC言語のコンソールアプリケーションより先にWindowsアプリケーションを始めた、
> つまりC言語の予備知識なんて皆無なんです。
> ブレークポイントの使い方とかステップ実行とか全然わかりません。

コンソールアプリケーションを作らなくても,デバッグの仕方をしらないと現実問題としてプログラムは作れません。

Visual Studioの使用を前提とすると,

・ブレークポイントの設定および解除
設定したい行に移動して[デバッグ] - [ブレークポイントの設定/解除]
※設定したい行の左端でクリックでも可。赤丸を右クリックしてブレークポイントの各種設定が可能。

ブレークポイントを設定すると,その行を実行する直前で実行が停止します。
ウォッチやスタックトレースと組み合わせて,オブジェクトの値や呼び出し順序を調べることが出来ます。
ただし,Windows メッセージの順序に注意してください。
# WM_PAINT中にブレークポイントを置いたりすると,WM_PAINTが延々と呼び出されたりします。

MSDN: ブレークポイントとトレースポイント
http://msdn.microsoft.com/ja-jp/library/ktf38f66.aspx


・ステップ実行
ブレークポイント等によって実行が一時停止状態になった後,[デバッグ]-[ステップイン] or [ステップオーバー] or [ステップアウト]

ステップ実行は一文ずつ実行していく機能です。
ステップインは関数呼び出し時に関数内までステップ実行します。
ステップオーバーは関数呼び出し時に関数内はステップ実行しません。
ステップアウトは関数から抜け出すまでステップ実行を飛ばします。

MSDN: コードのステップ実行の概要
http://msdn.microsoft.com/ja-jp/library/ek13f001.aspx


OutputDebugStringは,デバッグ出力として文字列を出力することが出きます。
Visual Studioを使っているのであれば,トレースポイントで代用した方が簡単だと思います。
MSDN: 方法 : トレースポイントとブレークポイントのアクションを指定する
http://msdn.microsoft.com/ja-jp/library/232dxah7.aspx

他にも,怪しげな場所で変数値をファイルに出力するようなことをしてみたり,というのも有効です。
# ログの出力はリリース版にも仕込まれていたりすることがあります。

> ブレークポイントは確か「/*」「*/」ですよね?

それはコメントです。


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

Name: Ω  ..初心者(6,504ポイント)   Date: 2009/11/25(水) 18:44   No:42652     
Title: Re:当たり判定について    
/* */ はコメントアウトなんですね・・・ 言い忘れましたけど、C++は少し出来ます。
環境はBCC Developerなので、デバッガのダウンロード等します。なので少し遅くなります


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

Name: softya  ..熟練のプログラマー(47,079ポイント)   Date: 2009/11/25(水) 19:21   No:42653     
Title: Re:当たり判定について    
>/* */ はコメントアウトなんですね・・・ 言い忘れましたけど、C++は少し出来ます。
C++でもコメントアウトですよ。

BCCの場合は、Turbo Debugger 5.5を使ってください。
http://www.plustarnet.com/aspil/Programming/c14.htm


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

Name: Ω  ..初心者(6,658ポイント)   Date: 2009/11/25(水) 19:42   No:42654     
Title: Re:当たり判定について    
紹介ありです。ダウンロードして、デバッガの設定をして試運転してみました。
すごく・・・やりづらいです・・・ これから慣れていこうと思います。
それはそうと、ブレークポイントの使い道がよく分かりません。設定した行に入るとプログラムを停止させて、
デバッガの方に制御権が移るのは分かりますが、そこからどうすればいいか分かりません。

>C++でもコメントアウトですよ。
ほぉー そうなんですか。そういえばCとC++は互換性があるらしいですね。


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

Name: softya  ..熟練のプログラマー(47,302ポイント)   Date: 2009/11/25(水) 21:16   No:42656     
Title: Re:当たり判定について    
>デバッガの方に制御権が移るのは分かりますが、そこからどうすればいいか分かりません。

Watchで変数の内容を見たり、F8でステップ実行したり、更に先のポイントにブレークポイントを設定(F2)してF9でそこまで進めるとかして、自分の思ったとおりプログラムが流れているか、変数の内容は思ったとおりかを確認します。
プログラムを組んだわけですから、この行に来たときは変数の値はどうなっていて、どのif文がどのタイミングで動作するとかイメージが出来ているはずですから、そのイメージと違う動作をする部分を見つけるのがデバッグです。


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

Name: Ω  ..初心者(6,847ポイント)   Date: 2009/11/26(木) 18:16   No:42696     
Title: Re:当たり判定について    
うーむ・・・ よく分かりませんね・・・   とりあえずデバッガの使い方を一通り勉強したいと思います。
どうしても解決しない場合はこの板を上げますので一時保留にしたいと思います。
いろいろと勝手ですいません;


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

Name: softya  ..熟練のプログラマー(48,015ポイント)   Date: 2009/11/26(木) 18:44   No:42697     
Title: Re:当たり判定について    
無理にデバッガじゃなくてもかまいませんよ。
BCCでOutputDebugStringAPIを使う場合は次のようなツールをご用意ください。
http://www.geocities.jp/kissy2005jp/documents/debug.html

それ以外の方法として、当たり判定の動作がちゃんと行われているか当たり判定関連の処理だけを抜き出して別のコンソールアプリにして当たり判定のパラメータを直接与えてしまえばprintfで情報を見る事もできます。こう言うのもデバッグのひとつの手法(ユニットテスト)なので活用してください。

デバッグテクニックの色々。参考↓
http://monoki.fc2web.com/diary/txt/computer/debugpatern.html

もしチェックするポイントやどの変数を見たら良いか分からないとしたらプログラムの流れや変数の役目を完全に理解できていないものと思われます。その場合は、何処を見ればよいの?って聞いてください。


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



Name: マーサ  ..ぴよぴよ(16ポイント)   Date: 2009/11/26(木) 15:41   No:42682       
Title: 無題    
実数値を入力してください: 2.2
実数値を入力してください: 3.5
実数値を入力してください: 4.3
実数値を入力してください: 8.1
実数値を入力してください: 9.0
実数値を入力してください: 0
(2.200000 + 3.500000 + 4.300000 + 8.100000 + 9.000000) / 5 = 5.420000
配列数値を使ってこの実行結果をだしたいんですけど、どうすればいいですか?
入力する数値はscanf数値です。
break文を使って0を入力すると終了します。


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


Name: softya  ..熟練のプログラマー(47,326ポイント)   Date: 2009/11/26(木) 16:09   No:42684     
Title: Re:無題    
まず、規約と注意事項を読んで頂いて、それに沿った質問をお願いします。


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

Name: non  ..比類無きプログラマー(71,192ポイント)   Date: 2009/11/26(木) 16:13   No:42685     
Title: Re:無題    
配列は静的に確保していいのでしょうか?その場合は何個?



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

Name: マーサ  ..ぴよぴよ(415ポイント)   Date: 2009/11/26(木) 16:41   No:42687     
Title: 演算問題    
えーと…初めてなのですみません。なるべく具体的に説明します。
C++です。
次のステップで実行されるプログラムを作成せよ.

Step 1.
要素数100のfloat型配列を宣言する.
Step 2.
scanf関数を用いてこの配列にデータを順に入力し,データ数が100に達するか,データとして0を入力すると,次の処理に進む.
ヒント: 入力できるデータの最大個数は100なので,データ数が100に達した場合,または,0を入力した場合にループを終了しなければならない.
Step 3.
ループをもう一度用いて,入力されたデータをすべて表示する。
Step 4.
入力されたデータの合計値を計算して表示する

実行例は次のとおり
実数値を一つ入力してください: 2.2
実数値を一つ入力してください: 3.5
実数値を一つ入力してください: 4.3
実数値を一つ入力してください: 8.1
実数値を一つ入力してください: 0
2.200000 + 3.500000 + 4.300000 + 8.100000 = 18.100000
Press any key to continue
っていうふうにしたいんですけどどうすればいいですか?
あと、この結果を使って

実数値を一つ入力してください: 2.2
実数値を一つ入力してください: 3.5
実数値を一つ入力してください: 4.3
実数値を一つ入力してください: 8.1
実数値を一つ入力してください: 9.0
実数値を一つ入力してください: 0
(2.200000 + 3.500000 + 4.300000 + 8.100000 + 9.000000) / 5 = 5.420000
Press any key to continue

ってやりたいんですけど。
まだ、なにか必要なことはありますか?


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

Name: Mist  ..比類無きプログラマー(72,225ポイント)   Date: 2009/11/26(木) 16:47   No:42688     
Title: Re:演算問題    
課題か何か知りませんが問題の丸投げは規約で禁止されています。
あなたができるところまでのプログラムを作製し提示してください。
そのうえで、何が分からないのかを質問してください。

何一つわからないのであれば、C++の学習サイトを見るなりして基礎の勉強からはじめてください。


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

Name: non  ..比類無きプログラマー(70,962ポイント)   Date: 2009/11/26(木) 17:28   No:42689     
Title: Re:演算問題    
作ってみました。

using namespace System;
int main(void)
{
float point[100];
float sum = 0;
int no = 0;
while (true)
{
Console::Write("実数値を一つ入力してください:");
point[no]=float::Parse(Console::ReadLine());
if (point[no] == 0)
break;
sum += point[no];
no++;
}
Console::Write("(");
for(int i = 0;i<no-1;i++)
Console::Write("{0,0:F6} + ", point[i]);
Console::Write("{0,0:F6}", point[no-1]);
float average = sum / no;
Console::WriteLine(") / {0} = {1,0:F6}", no, average);
return 0;
}



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

Name: non  ..比類無きプログラマー(71,205ポイント)   Date: 2009/11/26(木) 17:32   No:42690     
Title: Re:演算問題    
字下げを失敗したので、もう一度貼り付けます。

using namespace System;
int main(void)
{
float point[100];
float sum = 0;
int no = 0;
while (true)
{
Console::Write("実数値を一つ入力してください:");
point[no]=float::Parse(Console::ReadLine());
if (point[no] == 0)
break;
sum += point[no];
no++;
}
Console::Write("(");
for(int i = 0;i<no-1;i++)
Console::Write("{0,0:F6} + ", point[i]);
Console::Write("{0,0:F6}", point[no-1]);
float average = sum / no;
Console::WriteLine(") / {0} = {1,0:F6}", no, average);
return 0;
}



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

Name: softya  ..熟練のプログラマー(47,712ポイント)   Date: 2009/11/26(木) 17:53   No:42694     
Title: Re:演算問題    
nonさんにお願いです。
回答者も規約に沿っていただける様にお願いします。
って回答例がC++/CLIですか?


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

Name: non  ..比類無きプログラマー(71,256ポイント)   Date: 2009/11/26(木) 17:59   No:42695     
Title: Re:演算問題    
C++であれば、.NET Framework でも良いと判断しました。
流れはわかるだろうし、充分なヒントかと。


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



Name: フランドールの義兄  ..かけだし(1,692ポイント)   Date: 2009/11/20(金) 11:28   No:42366       
Title: 効果音が鳴らない...    
上記のとおりです。
僕のつくっているSTGは裏曲モードがあって、裏曲のモードにしていると、裏の効果音が使われる設定のために効果音を鳴らすPlaySoundFile関数ををswitch文で覆っていますが、一切効果音が鳴りません。どうすればいいんでしょうか。教えてください。


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


Name: 御津凪 [URL]  ..ハッカー(123,963ポイント)   Date: 2009/11/20(金) 15:23   No:42372     
Title: Re:効果音が鳴らない...    
・そのファイルがちゃんとした場所にない(あるいは無い)
・switch 文が正しくない(プログラムが正しく通っていない)

が、考えられますが、
コードが一切提示されていないので明確な原因も対処の仕方も分かりません。


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

Name: フランドールの義兄  ..かけだし(1,698ポイント)   Date: 2009/11/20(金) 18:18   No:42379     
Title: Re:効果音が鳴らない...    
コードを添付します。

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

Name: 御津凪 [URL]  ..ハッカー(124,662ポイント)   Date: 2009/11/20(金) 21:08   No:42387     
Title: Re:効果音が鳴らない...    
遅くなりましたが返信を。

第一に音がならないのは、mode 値を設定する条件がおかしいところになります。
if(Key[KEY_INPUT_F1] == 0 && Key[KEY_INPUT_F2] == 0 && Key[KEY_INPUT_F3] == 0 && mode == 0){

mode = 0; // 起動直後から何も押していない状態の時。 F1, F2, F3 のいずれかが押されたら以降 mode が 0 になるまでここには来ない。
}
else if(Key[KEY_INPUT_F1] == 1 || Key[KEY_INPUT_F1] == 1 && Key[KEY_INPUT_F2] == 1 && Key[KEY_INPUT_F3] == 1){
mode = 1; // F1 を押している間か、 F1, F2, F3 全てを押している間、ここに来る。
}
else if(Key[KEY_INPUT_F2] == 1){
mode = 2; // 上記条件以外で、 F2 を押している間、ここに来る。
}
else{
mode = 3; // 上記条件以外でここに来る。つまり F1, F2, F3 の何れかを押した後、何も押さなかったらここに来る。
}


つまり、 mode 値が F1, F2 のいずれかが押しっぱなしでないと、 3 の状態になる条件になっているので、サウンドを再生しようにも mode が 3 のサウンドが無いので再生されないということになります。
(F1, F2 のいずれかを押したままで操作すれば鳴ると思います)


あと、それとは別に自作関数を使って見やすくしておいた方が楽ですよ。


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

Name: フランドールの義兄  ..かけだし(1,874ポイント)   Date: 2009/11/21(土) 18:23   No:42443     
Title: Re:効果音が鳴らない...    
返信、ありがとうございました。一応試してみましたが、逆にキー操作が効かなくなり、BGMも再生されなくなってしまいましたので、そこについてはどうしようもありません。
でも、僕が聞きたいのは「BGMが鳴らない」ではなく、「効果音(SE)が鳴らない」方です。PlayMusic(Waveサウンド非対応)関数は働くのですが、PlaySoundFile(Waveサウンド対応)関数が働かない方です。
それから自作関数の件ですが、隔離する場合、どこに隔離すればいいのか分からなくて、今のところ座礁に乗り上げています。


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

Name: 御津凪 [URL]  ..ハッカー(124,747ポイント)   Date: 2009/11/21(土) 20:33   No:42448     
Title: Re:効果音が鳴らない...    
適当に自作関数に纏めてみたものを添付しておきますね。
こんな感じで纏めておけば、見やすくなりますし、変更するときも楽になります。

効果音(SE)が鳴らないのはきちんとした場所にファイルが無いからだと思っていますが、
実行中、 VC++ の出力ウインドウを確認していますか?
メニューにある「デバッグ」から「ウインドウ」、「出力」で表示できます。
ファイルを読み込めなかった場合、その旨のメッセージが表示されますので。


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

Name: フランドールの義兄  ..かけだし(1,973ポイント)   Date: 2009/11/24(火) 14:38   No:42571     
Title: Re:効果音が鳴らない...    
添付されていたコード、拝見しました。 確かにわかりやすいですね。ところでSEがならない件でファイルがアドレスで示したフォルダに入っているか確かめたところ、ちゃんとフォルダに入っていました("../"などを使わない絶対参照でもだめ)。ところで、VC++で一度デバッグをかけると生成される「Debug」フォルダ内にあるLog.txtの左端にかかれている数字が何を示しているのかわからないんです。VSをHDに入れようとしたあまりに、VSからのデバッグが出来ないもので・・・。よければLog.txtの左端の数字が何を示しているのかを教えていただけませんか?

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

Name: 御津凪 [URL]  ..ハッカー(124,910ポイント)   Date: 2009/11/24(火) 15:45   No:42572     
Title: Re:効果音が鳴らない...    
Log.txt の左端に書かれている数字は、プログラムが始まってからその行が出力された時点でのタイムスタンプです。
(ms 単位です)
このログに出力される情報と、上記に書いた VC++ でデバッグするときに出力ウインドウに表示される情報はほぼ同じなので、
ログファイルでも読み込みエラーなどがあれば随時記録されます。

ログファイルを最初から目で追って、ファイルの読み込みエラーなど怪しいところがないかチェックしてみてください。


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

Name: フランドールの義兄  ..かけだし(2,047ポイント)   Date: 2009/11/26(木) 15:07   No:42681     
Title: Re:効果音が鳴らない...    
添付されていた自作関数を含めたコードにある程度ファイルを追加して起動してみたところ、
SEは低確率でしか鳴らず、方向・決定キー操作も低確率でしか効かず、さらにBGMはウィンドウをつかんでいる(カーソルでドラッグしてウィンドウを移動している)ときにしか鳴りませんでした・・・。(ESCキーは普通)


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

Name: 御津凪 [URL]  ..ハッカー(125,809ポイント)   Date: 2009/11/26(木) 16:01   No:42683     
Title: Re:効果音が鳴らない...    
>SEは低確率でしか鳴らず、方向・決定キー操作も低確率でしか効かず、さらにBGMはウィンドウをつかんでいる(カーソルでドラッグしてウィンドウを移動している)ときにしか鳴りませんでした・・・。(ESCキーは普通)

これは、毎フレーム(きちんと条件を入れている部分を除く)全ての処理が行われているのが原因です。
これまで書いていませんでしたが、音楽を再生する処理(PlayMusic 関数)も毎フレーム実行され、
その度に再生しなおされているため、正しく再生されません。
何らかのタイミングで一回だけ実行するように変更する必要があります。

また、 LoadGraphScreen 関数は毎フレーム実行する場所では普通使用しません。
毎回ファイルからデータを読み取って処理するため、非常に非効率です。

そして、 PlaySoundFile("", DX_PLAYTYPE_NORMAL); や、 LoadGraphScreen(0, 0, "",TRUE); という、
意味不明な処理が入っています。
実行時に不要な処理が入っているとバグの元になります。

一度全体を見直し、きちんとしたデバッグを行う(ブレイクポイントを使うなどする)ようにしてください。



それと、フランドールの義兄さんはC言語の技術をどれほど持っているのでしょうか?
支援したい気持ちもあるのですが、今のままだとコード的に完成は難しいような気がします。


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

Name: フランドールの義兄   Date: 2009/12/03(木) 14:40   No:423661259818827 解決!     
Title: Re:効果音が鳴らない...    
返信がしばらくぶりになってしまいました。すみません。C言語暦約1年です。
ところで、効果音がならない件ですが、新たにeeflgという整数型変数を設け、自作関数から「モード選択」を抜いた代わりに、それをIf文(eeflg制御)で囲ってやると、解決しました。

御津凪さん、この問題を最後までアドバイスしていただき、ありがとうございました。




Name: ラッコ  ..ぴよぴよ(55ポイント)   Date: 2009/11/26(木) 14:07   No:42677       
Title: マップエディタについて    
初めまして。

マップエディタについてなんですが,

マップエディタは, C++.NETで作ることはできますか?
できないとしたらやはり, WIN32 API などを使って製作することとなるのでしょうか。


まだゲーム制作を始めたばっかりで, わからない点が多いかと思いますが
ご回答 よろしくお願いいたします。


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


Name: バグ  ..ハッカー(174,325ポイント)   Date: 2009/11/26(木) 14:27   No:42678     
Title: Re:マップエディタについて    
どういった形式のものを作成するかは分かりませんが、C++.NETで作成することは可能です。

仮にWINAPIに頼らなければいけない箇所(大抵のことは.NETだけでまかなえるはず…)があるにしても、.NETアプリケーション内でWINAPIを使用することもできない訳ではありません。


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

Name: ラッコ  ..ぴよぴよ(140ポイント)   Date: 2009/11/26(木) 14:32   No:42679 解決!     
Title: Re:マップエディタについて    
>どういった形式のものを作成するかは分かりませんが、C++.NETで作成することは可能です。

形式・・・?ちょっとわかりませんが, C++.NETでも作れるのですね!

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

これからもわからないことがあれば, また質問させていただくこともあるかもしれませんが
そのときはまたよろしくお願いいたします。


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



Name: 55  ..ぴよぴよ(34ポイント)   Date: 2009/11/26(木) 09:18   No:42671       
Title: ウィンドウの大きさ変更又は最大化    
タイトルどうりですが
DXライブラリでウィンドウの大きさ変更又は最大化ってできますか?
出来るならどのようにすればいいのか(例えば関数)を
指導してください。よろしくお願いいたします。


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


Name: kazuoni [URL]  ..ハッカー(115,433ポイント)   Date: 2009/11/26(木) 11:01   No:42672     
Title: Re:ウィンドウの大きさ変更又は最大化    
最大化はChangeWindowMode()で、
ウィンドウサイズ変更はSetGraphMode()で行えるかと思います。


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



Name: 通りすがり  ..上級者(17,885ポイント)   Date: 2009/11/23(月) 18:27   No:42547       
Title: 無題    
初心です。
     LoadGraphScreeでchar.pngを表示したいのですが、いくらやっても表示できません。
     保存場所もすべて確認しましたが無理でした・・・どういうことなの・・・
教えていただける方いましたらよろしくお願いします。


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


Name: チルチル  ..比類無きプログラマー(80,275ポイント)   Date: 2009/11/23(月) 18:54   No:42549     
Title: Re:無題    
ゲームプログラミングの館の3章あたりでしょうか?

情報が少なくて良くわかりませんが、1つ気になるとしたら

LoadGraphScreeの後に

ScreenFlip();

を入れると表示されるかもしれません


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

Name: ひよこ  ..比類無きプログラマー(73,890ポイント)   Date: 2009/11/23(月) 19:29   No:42550     
Title: Re:無題    
LoadGraphScreenではないでしょうか?

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

Name: Ω  ..初心者(6,764ポイント)   Date: 2009/11/25(水) 20:52   No:42655     
Title: Re:無題    
蛇足かも知れませんが
質問の題名はちゃんと記載しましょう。情報が伝わりにくいです。
どんなエラーがでるか、もしくはコードを載せるなりしましょう。返答に困ります。

とりあえず館の3章(?)のコードをコピペしてコンパイルしてみて下さい。エラーの原因が
タイプミスであれば解消されるはずです。

>チルチルさん
ScreenFlip(); は描画先を裏画面に設定したときに必要なので、通りすがりさんが
館の3章を参考にしているなら必要ないと思いますよ。


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

Name: チルチル  ..比類無きプログラマー(80,063ポイント)   Date: 2009/11/25(水) 22:29   No:42660     
Title: Re:無題    
>ScreenFlip(); は描画先を裏画面に設定したときに必要なので

う〜ん、まあそうなんですけど
私の所でもLoadGraphScreenで表示できなくて
ScreenFlip();を入れると表示できたので
同じように行くかもしれません


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



Name: あや  ..かけだし(1,508ポイント)   Date: 2009/11/25(水) 02:06   No:42628       
Title: 無題    
ポインタstrが文字列の先頭要素を指している時、その文字に含まれる英小文字を英大文字に変換する関数 void str_toupper(char *str) を作成しなさい。ただし、英小文字a〜zおよび英大文字A〜Zには、それぞれ昇順に、連続した1バイトの整数が割り当てられているものとする。

たとえば、Aには10進数65、Zには10進数の90割り当てられるといった感じです。

これをどうやるか教えてもらえませんか?


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


Name: 組木紙織  ..比類無きプログラマー(75,677ポイント)   Date: 2009/11/25(水) 02:13   No:42630     
Title: Re:無題    
この文章だけでは何が問題かわからないので、もう少し詳しく問題点を説明してくれませんでしょうか?


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

Name: non  ..比類無きプログラマー(71,225ポイント)   Date: 2009/11/25(水) 08:42   No:42637     
Title: Re:無題    
少しは自分で調べて、解くようにしましょう。
このままでは、身につきませんよ。
ちょっと、検索すれば見つかるはずです。
例えば、
http://www1.cts.ne.jp/~clab/hsample/Point/Point11.html


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

Name: あや  ..かけだし(1,556ポイント)   Date: 2009/11/25(水) 13:02   No:42646     
Title: Re:無題    
良い資料ですね。
参考にして頑張ってやってみます。


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



Name: たこやき  ..かけだし(2,370ポイント)   Date: 2009/11/25(水) 12:05   No:42638       
Title: rang()について    
龍神録の第28章聞きたいことがあるのですが。rang()関数で-ang*ang*2/GetRang(10000/10000.0)と載っていたのですが、
GetRang(1)ではダメなのでしょうか。あとGetRang()は-1〜1のランダム(0.1などは除く)という認識でよろしいの
しょうか?


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


Name: バグ  ..ハッカー(174,160ポイント)   Date: 2009/11/25(水) 12:08   No:42639     
Title: Re:rang()について    
rangではなく、randでは?

Name: たこやき  ..かけだし(2,385ポイント)   Date: 2009/11/25(水) 12:10   No:42640     
Title: Re:rang()について    
見直しましがやっぱりrangです。

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

Name: Dixq (管理人)  ..ウィザード(1,087,792ポイント)   Date: 2009/11/25(水) 12:22   No:42641     
Title: Re:rang()について    
ん‥、なんか色々おかしいですね。
もし本当にそう書かれていたならちゃんと動きません。
最後はgじゃなく、GetRandです。
また、関数に渡す数値は1万、それを1万の実数で割っているはずです。
さらに、引き数はかけるんじゃなく、足しているはずです。

が、本当に私が書き間違ってるならごめんなさい。
ただそれだと正常動作しないので、見間違いでは無いかと思います。


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

Name: softya  ..熟練のプログラマー(46,668ポイント)   Date: 2009/11/25(水) 12:28   No:42642     
Title: Re:rang()について    
私の知る限り
-ang + ang*2 * GetRand(10000)/10000.0
なんですが。
/10000.0が()の内側と外側では全然意味違いますよ。


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

Name: Dixq (管理人)  ..ウィザード(1,087,832ポイント)   Date: 2009/11/25(水) 12:33   No:42643     
Title: Re:rang()について    
rangはランダムな角度という意味ですが、
GetRandomAngIeとでも名前を付けた方が紛らわしくなくていいですね。


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

Name: たこやき  ..かけだし(2,403ポイント)   Date: 2009/11/25(水) 12:59   No:42644 解決!     
Title: Re:rang()について    
見間違いでした。納得です。すみませんでした。

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



Name: sisi  ..ぴよぴよ(745ポイント)   Date: 2009/11/24(火) 21:13   No:42586       
Title: ショットの打ち方。    
現在2Dのアクションゲームを作ろうと思いやっているのですが。
処理しやすいようにしたりするためにプログラムを分けて記述するようにしたのですが
キャラからショットを打たせたいのですがうまくできません。

キャラの座標がch.x、ch.yに入っていてそこから4方向にショットを打たせたいのですが
どのように記述すればいいのでしょうか?

プログラムの分け方はこのサイトを参考にさせていただいています。
旧サイトのほうでショットの打ち方の簡単な記述がありそれを実行するとちゃんと起動したのですが
プログラムをこの新しいサイトのように分けて書いた時に旧サイトのような簡単な
ショットを打つにはどうすればいいのでしょうか?




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


Name: softya  ..熟練のプログラマー(46,025ポイント)   Date: 2009/11/24(火) 21:20   No:42588     
Title: Re:ショットの打ち方。    
とりあえず、ソースコードを見せてもらうと早いのでお願いします。
長いなら、添付でお願いします。


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

Name: sisi  ..ぴよぴよ(909ポイント)   Date: 2009/11/24(火) 23:31   No:42611     
Title: Re:ショットの打ち方。    
どのファイルをあげればいいのかわからなかったので.cppと.hのファイルを圧縮してあげておきます
現在していることは

キャラの描写を八方向画像を2種類つかっている。
敵の描写 動きは今後付けていく

という感じですとりあえず今の段階ではショットを主人公
の座標からではなく下のほうから出せるかどうか試していたところです
とりあえず玉がボタンが押された時に表示されるのですが
飛んでいかないのです。

どうか原因を教えてください。


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

Name: softya  ..熟練のプログラマー(46,667ポイント)   Date: 2009/11/25(水) 01:09   No:42619     
Title: Re:ショットの打ち方。    
charshot()関数で

for(i=0;i<CSHOT_MAX;i++){
cshot[i].flag=0;
cshot[i].x=640/2;
cshot[i].y=480;
}

は無条件に実行されています。
これだと毎フレーム、ショットが初期化されますので弾が続けて飛ぶ事はありませんので1フレームだけ弾が表示される事になると思います。この処理はini.cpp側に移してください。

それと
if(counter<5)
counter++;
も意味がありません。
counterがローカル変数ですので、charshot()の入ってすぐint counter=0,i;で0に初期化されます。
なので、必ずcounter<5条件を満たしてcounter++でcounterは1になります。これは毎フレーム同じです。
他にcounterを参照しているコードも無いので、counterは他に一切影響を与えていません。

5フレームだけ連続発射を禁止したいのであれば、まずcounterをグローバル変数にして、counter<5の場合は今の処理のままでよいので、

if( counter < 5 ) {
counter++;
} else {
if(CheckStatePad(configpad.shot)>0){
counter=0; //カウンターを戻す
for(i=0;i<CSHOT_MAX;i++){
if(cshot[i].flag==0){ //発射していない玉を探し、
cshot[i].flag=1; //発射フラグを立てる
break;
}
}
}
}

for(i=0;i<CSHOT_MAX;i++){
if(cshot[i].flag==1){ //発射している玉なら
cshot[i].y-=8;
if(cshot[i].y < -32){ //もし画面外まで来たら
cshot[i].y=480; //初期値に戻し、
cshot[i].flag=0; //発射フラグを戻す }
}
}
}

としてください。


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

Name: sisi  ..ぴよぴよ(918ポイント)   Date: 2009/11/25(水) 02:51   No:42635 解決!     
Title: Re:ショットの打ち方。    
どうもありがとうございました。
おかげでちゃんと動きました。
なぜ今まで動かなかったのか理解できるような文章をありがとうございました


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



Name: ジャーニー  ..かけだし(1,200ポイント)   Date: 2009/11/24(火) 21:53   No:42590       
Title: DLLファイルが読み込まれない?    
お久しぶりです

大学の研究でとあるハードウェアを使うことになり、その製品のライブラリを導入しようとしているのですがうまくいきません。
おそらくDLLが正常に読み込まれていないだろうと思います。

同梱ファイルの中身は単純で、使っているものの最低限の動作確認のため、初期化を実行しようとしているだけです。

test.cpp 

#include <iostream>
#include "DxLib.h"
#include "HAROC2D.hpp"

/* ドライバの初期化 */
bool initializeDriver( void )
{
int status;
status = HAROC_InitDriver( 10+1 ); /* ドライバの初期化 */
if( status != 0 ) {
/* 初期化失敗処理 */
return false;
}
else {
/* 初期化成功処理 */
return true;
}
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
if( !HAROC2manager::loadDLL() ) return 0;/* HAROC2.DLLのロード */
if( !initializeDriver() ) return 0;

HAROC2manager::freeDLL(); /* HAROC2.DLLの解放 */

return 0;
}



上のソースのHAROC_InitDriverでエラーがでており、エラーは
「Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.」
とでております。調べたところDLLを読み込んだあと正常に関数呼び出しだされていないのではないかという感じです。

hppファイルはDLLの読み込みと解放を記述しているだけです。
hppとDLLは製品に同梱されていたものです。
どなたかわかる方がいましたら回答をお願いします


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


Name: 御津凪 [URL]  ..ハッカー(125,111ポイント)   Date: 2009/11/24(火) 22:19   No:42595     
Title: Re:DLLファイルが読み込まれない?    
その DLL を使ったことが無いので正確ではないかもしれませんが、
そのようなランタイムエラーは 関数の呼び出し規約 が異なる場合に出ることがあります。

製品にマニュアルなどがある場合、何か呼び出し規約についての記述が無いか確かめてみてください。
基本、呼び出し規約の指定は、ヘッダ側の関数宣言でするものなのですが、指定がされていない場合、
コンパイラオプションで指定した呼び出し規約(VC++ なら通常は __cdecl)を指定することになります。


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

Name: ジャーニー  ..かけだし(1,257ポイント)   Date: 2009/11/24(火) 22:27   No:42597     
Title: Re:DLLファイルが読み込まれない?    
このDLLは製品付属のものなので一般的にはないものです

呼び出し規約と決めるというのは初耳なのですが、どのように指定すればいいのでしょうか?


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

Name: 御津凪 [URL]  ..ハッカー(125,415ポイント)   Date: 2009/11/24(火) 22:40   No:42600     
Title: Re:DLLファイルが読み込まれない?    
VC++ の IDE であれば、
プロジェクトのプロパティから、「構成プロパティ」「C/C++」、「詳細」、「呼び出し規約」の順で設定にたどり着きます。
ここの設定を変更していって、DLL の関数を実行できるかどうかを確認していってみてください。
それぞれの呼び出し規約の機能については下記のページに書かれています。
http://msdn.microsoft.com/ja-jp/library/46t77ak2.aspx

なお、上記に書いたとおり、関数の宣言に呼び出し規約が指定されていたら設定を変更しても意味が無いので、
先にヘッダの該当する関数宣言の確認してください。
int DLLDECL dllfunc();


のように、戻り値の型と関数名の間に単語が入っていたらそれが呼び出し規約の指定です。
殆どの場合、マクロを使って指定しているので、元をたどればどんな呼び出し規約を指定しているかは確認できます。


ちなみに、今回発生しているランタイムエラーは、
「ESPの値が正しく関数呼び出しの間で保存されませんでした。
 これは、通常の関数呼び出しの結果は1つの関数ポインタで呼び出し規約を持つ別の呼び出し規約で宣言されたと宣言しました。」
(注:機械翻訳です)
となっています。
つまり、 ESP (スタックポインタ)が関数を呼び出した後、正しい位置に戻ってこなかったことを示しています。


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

Name: ジャーニー  ..かけだし(1,078ポイント)   Date: 2009/11/24(火) 22:54   No:42601     
Title: Re:DLLファイルが読み込まれない?    
できました!ありがとうございます
_stdcallにすれば動きました

ただ別の問題が発生しました
このDLLをもうひとつDXライブラリで作っているプログラムに入れるのですが、ためしにそっちで_stdcallになおしたときDXライブラリの関数が未解決の外部シンボルとなってしまいます
御津凪さんのいわれているマクロを使えば大丈夫なのでしょうが、リンク先を見てみたのですがいまいちよくわからなかったです
簡単な例などあれば教えていただきたいのですがよろしいでしょうか


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

Name: 御津凪 [URL]  ..ハッカー(125,698ポイント)   Date: 2009/11/24(火) 23:11   No:42604     
Title: Re:DLLファイルが読み込まれない?    
DXライブラリの関数宣言群には、先述した呼び出し規約を明示的に指定していないので、コンパイラ側で変更した呼び出し規約で外部参照(シンボル)名が一致しなくなったのが原因ですね。
(呼び出し規約ごとに外部参照名が変化するため)

問題の発生していた DLL のヘッダにのみ正しい呼び出し規約を指定する必要が出たので、ヘッダを修正する必要がありますね。
呼び出し規約は関数宣言の戻り値と関数名の間に記述するので、対象ヘッダ内のすべての関数宣言に呼び出し規約を入れる必要があります。
この場合はただ単に、
int _stdcall dllfunc();


を入れていってもいいのですが、
後でもし何か問題があって、呼び出し規約を変えたい時にすぐ対応できるように、
#define MY_DECL _stdcall


と対象ヘッダの先頭あたりに記述し、
後は _stdcall の代わりに指定したマクロ名を入れていけば大丈夫です。
(マクロ名はDLLの名前などにしておくといいかもしれません)

あと、コンパイラの設定を元の設定に戻しておくのを忘れないでください。
「<親またはプロジェクトの既定値から継承>」でデフォルトに戻せます。


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

Name: ジャーニー  ..かけだし(1,167ポイント)   Date: 2009/11/25(水) 00:05   No:42614     
Title: Re:DLLファイルが読み込まれない?    
詳しく回答していただきありがとうございます
ただ何度も申し訳ないのですが最初にアップロードしたhppファイルなのですが、ちょっと勉強不足でよくわからない方法で関数読み込みをしているため、そこでその方法を指定すればわからないのですがどのように指定すればいいのでしょうか


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

Name: ジャーニー  ..かけだし(1,245ポイント)   Date: 2009/11/25(水) 00:14   No:42615     
Title: Re:DLLファイルが読み込まれない?    
ってすいませんアップロードしわすれていたみたいです
大変申し訳ありません
ちゃんと見直せばよかったです

hppファイルだけですがこちらになります


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

Name: 御津凪 [URL]  ..ハッカー(125,738ポイント)   Date: 2009/11/25(水) 00:17   No:42616     
Title: Re:DLLファイルが読み込まれない?    
今回の場合であれば、 HAROC2D.hpp の中にある関数宣言文を対象に行えばいいのではないでしょうか。
恐らくそれだけで済むかと思います。
(HAROC2D.hpp の中に HAROC2 の他のヘッダをインクルードされていたらそれも対象に行ってください)


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

Name: 御津凪 [URL]  ..ハッカー(125,888ポイント)   Date: 2009/11/25(水) 00:21   No:42617     
Title: Re:DLLファイルが読み込まれない?    
添付していただいたヘッダの場合だと、
/* API関数型定義 */
の中の typedef 群ですね。
typedef int  ( *THAROC_InitDriver )( int );


のような感じになっている所を、
typedef int  (_stdcall *THAROC_InitDriver )( int );


のように入れていけばOKです。


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

Name: ジャーニー  ..かけだし(1,492ポイント)   Date: 2009/11/25(水) 01:02   No:42618     
Title: Re:DLLファイルが読み込まれない?    
今教えていただいた方法でやってみました

呼び出し規約を親またはプロジェクトから継承にし、

#define MY_DCEL _stdcall




typedef int (MY_DCEL *THAROC_InitDriver )( int );

のように変更してみたのですがESPがまた出てしまいました

プロジェクトファイルをあげようとしたのですがファイル制限をこえてしまったためソースのみあげさせていただきます
ただDLLファイルがどう圧縮しても120KB制限にひっかかったためアップロードできないみたいです
若干の改変(ヘッダファイルの移動くらいですが)を行ったものです
おそらく私が変なことをしただけだと思うのですが・・・
何度も質問してしまいお手数をおかけしますがよろしくお願いします


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

Name: 御津凪 [URL]  ..ハッカー(126,010ポイント)   Date: 2009/11/25(水) 01:16   No:42620     
Title: Re:DLLファイルが読み込まれない?    
コード自体にはそれらしいミスが無いので、実際に DLL を読み込んで試さないとわかりませんね…。
DLLを圧縮したものを下記のメルアドに送ってもらえませんか?
mitsunagistudio@gmail.com
(解決した後、受け取ったファイルは破棄いたします)


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

Name: ジャーニー  ..かけだし(1,510ポイント)   Date: 2009/11/25(水) 01:22   No:42621     
Title: Re:DLLファイルが読み込まれない?    
DLLファイルを送らせていただきました
お手数ですがよろしくお願いします


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

Name: 御津凪 [URL]  ..ハッカー(126,108ポイント)   Date: 2009/11/25(水) 01:28   No:42622     
Title: Re:DLLファイルが読み込まれない?    
さっそく受け取り、確認してみました。

結果はエラーが発生しませんでした。
(_stdcall を外して試すときちんとランタイムエラーが出ました)

エラーが出るということはきちんとビルドされていないのかもしれません。
リビルドして確かめてみましたか?


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

Name: ジャーニー  ..かけだし(1,635ポイント)   Date: 2009/11/25(水) 01:43   No:42623     
Title: Re:DLLファイルが読み込まれない?    
ソリューションのクリーンを行い、最初からビルドしてみましたが無理でした
エラーがでなかったということで、もう一度試してみたのですがやはりESPがでてしまいました
もしかするとプロジェクトの設定がまずかったのかもしれませんので、上記のアドレスにプロジェクトごと送らせていただいたので確認していただいてもよろしいでしょうか


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

Name: 御津凪 [URL]  ..ハッカー(126,130ポイント)   Date: 2009/11/25(水) 01:47   No:42624     
Title: Re:DLLファイルが読み込まれない?    
すいません。届いていないみたいです。
再度お願いできますか?
(圧縮したほうがいいです)


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

Name: ジャーニー  ..かけだし(1,654ポイント)   Date: 2009/11/25(水) 01:51   No:42625     
Title: Re:DLLファイルが読み込まれない?    
すいません途中でエラーがでてしまっていたみたいです
今送信完了しました


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

Name: 御津凪 [URL]  ..ハッカー(126,149ポイント)   Date: 2009/11/25(水) 01:58   No:42626     
Title: Re:DLLファイルが読み込まれない?    
エラーの原因を捕捉しました。
test.cpp では、
#include "../../../HAROCLIB/HAROC2D.hpp"
のファイルをインクルードしていますが、
変更を加えたヘッダファイルはこれではないので、エラーが出ます。

これを修正したヘッダファイルをインクルードするように直せばうまくいくはずです。


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

Name: ジャーニー  ..かけだし(1,719ポイント)   Date: 2009/11/25(水) 02:15   No:42632     
Title: Re:DLLファイルが読み込まれない?    
今確認したところ完全に間違えていましたorz
人間の思い込みって怖いですね

夜分遅くまでこのような質問にお答えいただいてありがとうございました
御津凪さんのサイトにもたくさんおもしろそうなものがありましたので参考にさせていただきます
ありがとうございました


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

Name: 御津凪 [URL]  ..ハッカー(126,218ポイント)   Date: 2009/11/25(水) 02:20   No:42633     
Title: Re:DLLファイルが読み込まれない?    
それでは解決したそうなので、メールにて受け取った各メール・ファイルは破棄しておきます。

あと、解決した場合は解決マークを付けてくださいね。(ニアミスでした)


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

Name: ジャーニー  ..かけだし(1,715ポイント)   Date: 2009/11/25(水) 02:20   No:42634 解決!     
Title: Re:DLLファイルが読み込まれない?    
解決にし忘れていました

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



Name: あや  ..かけだし(1,315ポイント)   Date: 2009/11/23(月) 19:32   No:42551       
Title: おねがいします!    
ポインタstrが文字列の先頭要素を表している時、その文字列に含まれる数字、符号+及びー以外の文字を削除する関数 void del_char(char *str) を作成しなさい。例えば、文字列が A-+1BC2+3D/0であれば-123とする。なお符号についても、数字より前にある最初のもの以外は、削除するものとする。
っていう問題なんですが、教えてもらえませんか?


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


Name: kazuoni [URL]  ..ハッカー(114,811ポイント)   Date: 2009/11/23(月) 20:57   No:42554     
Title: Re:おねがいします!    
先頭から順に見ていって、
1、現在対象の文字が符号かどうか(符号文字が出たかどうか)
2、現在対象の文字が数字かどうか→数字ならキューにpush
3、1、2を繰り返し、すべて終わったら、(あれば)符号文字とキューからpopしたものを組み合わせる

自分ならばそんな風にやるかもしれないです。



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

Name: AYA  ..ぴよぴよ(24ポイント)   Date: 2009/11/23(月) 21:13   No:42555     
Title: Re:おねがいします!    
すごいですね!!
1,2,3,を記号で書くとどうなりますか?


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

Name: kazuoni [URL]  ..ハッカー(114,874ポイント)   Date: 2009/11/23(月) 21:25   No:42556     
Title: Re:おねがいします!    
あ、名前は変えない方がいいです。誰が質問者さんかわからなくなってしまいますから。。

>1,2,3,を記号で書くとどうなりますか?

記号・・・?


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

Name: あや  ..かけだし(1,337ポイント)   Date: 2009/11/23(月) 21:37   No:42557     
Title: Re:おねがいします!    
すみません。。。
1,2,3をemacsに打ち込む時の文字です。。。


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

Name: mnkr  ..入門者(2,638ポイント)   Date: 2009/11/23(月) 21:41   No:42558     
Title: Re:おねがいします!    
記号・・・というのは恐らくソース(英字)のことかと思います。。。

kazuoniさんの書いていることを理解しようとしていますか?
宿題のまるなげな気がします。


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

Name: あや  ..かけだし(1,362ポイント)   Date: 2009/11/23(月) 21:54   No:42559     
Title: Re:おねがいします!    
宿題なのはあたりです。。。
やり方が全然わからなくて。。。
キューって何ですか?


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

Name: kazuoni [URL]  ..ハッカー(115,388ポイント)   Date: 2009/11/23(月) 22:12   No:42560     
Title: Re:おねがいします!    
っということは、まだC言語はほぼ入門ですかね^^;
まぁ、あえてキューなんて使わなくてもいいので、忘れてください。

この掲示板の規約の通り「宿題の丸投げ」は厳禁です。
なので、考え方の一つとして、自分はNo:42554の回答を書きました。

まず、授業でどこまでやっているかを見直してください。
一番最初にポインタをと書かれているので、文字列操作の一環の宿題かなと思います。
一番簡単な考え方は、
0、関数del_charに渡された文字列(のポインタ)strを関数del_charのローカル変数である文字列配列(変数名temp)にコピーする
1、tempを先頭から最後(\0)まで探査し、(初めに登場する)記号文字(+ or -)を見つけ、その文字をstr[0]に格納する
2、tempを先頭から最後(\0)まで探査し、登場した0〜9はstr[1]以降に順に格納していく
3、すべて終了したら、strの最後に'\0'を格納する

こんな感じでいいかと思います。


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

Name: あや  ..かけだし(1,398ポイント)   Date: 2009/11/23(月) 22:23   No:42561     
Title: Re:おねがいします!    
すみません。ありがとうございます。
順番通りにやって行ってみます!!!


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

Name: たかぎ [URL]  ..ハッカー(123,997ポイント)   Date: 2009/11/23(月) 22:38   No:42562     
Title: Re:おねがいします!    
こんな感じでは?

#include <stdio.h>
#include <ctype.h>

void del_char(char *str)
{
char *ss;

for (ss = str; *ss != '\0'; ss++)
{
int c = (unsigned char)*ss;

if (isdigit(c) || c == '+' || c == '-')
{
*str++ = c;
break;
}
}
for (; *ss != '\0'; ss++)
{
int c = (unsigned char)*ss;

if (isdigit(c))
*str++ = c;
}
*str = '\0';
}

int main(void)
{
char s[] = "A-+1BC2+3D/0";
del_char(s);
puts(s);
return 0;
}

ただし、文字列が"A-+1BC2+3D/0"のときの結果は"-1230"になります。
言外の仕様が潜んでいるかもしれませんね。


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

Name: あや  ..かけだし(1,536ポイント)   Date: 2009/11/25(水) 02:14   No:42631 解決!     
Title: Re:おねがいします!    
ありがとうございます!!!
よくわかりました。うれしいです!!!


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

Name: あや   Date: 2009/12/01(火) 23:46   No:425511259678781     
Title: Re:おねがいします!    
すみません。この答えてもらった文中でint型の変数cに代入するのに(unsigned char)とキャストしているのはどうしてですか?わかる方お願いします。



Name: たいやき  ..ぴよぴよ(77ポイント)   Date: 2009/11/24(火) 19:00   No:42576       
Title: for文やwhile文について    
for文やwhile文、関数は何バイトあるのでしょうか?

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


Name: softya  ..熟練のプログラマー(45,911ポイント)   Date: 2009/11/24(火) 19:06   No:42577     
Title: Re:for文やwhile文について    
意味が分かりません、機械語で何バイトという意味でしょうか?
そういう意味なら、使うコンパイラ、CPU、最適化レベル、書かれているソースコードの内容で変わるので質問自体が無意味です。


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

Name: たいやき  ..ぴよぴよ(92ポイント)   Date: 2009/11/24(火) 19:09   No:42578 解決!     
Title: Re:for文やwhile文について    
そうなんですか。わかりました。回答ありがとうございました!

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

Name: たいやき  ..ぴよぴよ(548ポイント)   Date: 2009/11/24(火) 19:29   No:42580     
Title: Re:for文やwhile文について    
すみません。質問変えて
int func(void)
{
   int i;

   int flag=1;

   int n;


   for(i=0;i<10;i++)

   {

         if(flag)

         {

<pre> n++;
          }

         if(i=i%2)

         {

             flag=0;

<pre> }
    

   }

}と
int func(void)
{
   int i;

   int n;


   for(i=0;i<10;i++)

   {

         if(i=i%2)

         {

            n++;

             break;

          }

         

<pre>
    

   }

   for(i=0;i<10;i++)

   {

         if(i=i%2)

         {

             n++;

          }

         

    

   }

}
とどちらが軽いとしたらどちらでしょうか?


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

Name: たいやき  ..かけだし(1,042ポイント)   Date: 2009/11/24(火) 19:33   No:42581     
Title: Re:for文やwhile文について    
文間違えました。
int func(void)
{
   int i;

   int flag=1;

   int n;


   for(i=0;i<10;i++)

   {

         if(flag)

         {

             n++;

          }

         if(i=i%2)

         {

             flag=0;

<pre> }
    

   }

}と
int func(void)
{
   int i;

   int n;


   for(i=0;i<3;i++)

   {

         if(i=i%2)

         {

            n++;

             break;

          }

         

   }

   for(;i<10;i++)

   {

         if(i=i%2)

         {

             n++;

          }

         

    

   }

}
とどちらが軽いとしたらどちらでしょうか?


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

Name: Mist  ..比類無きプログラマー(72,126ポイント)   Date: 2009/11/24(火) 19:47   No:42582     
Title: Re:for文やwhile文について    
どちらのプログラムもifの条件がおかしいんだけど。
> if(i=i%2)

正しくは"if(i==(i%2))"じゃないのかな?
何がしたいのかさっぱり分からないプログラムだけど、ループの実行回数も大差ないし一緒と考えてもいいと思いますけど。


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

Name: たいやき  ..かけだし(1,098ポイント)   Date: 2009/11/24(火) 19:52   No:42583     
Title: Re:for文やwhile文について    
回答有難うございます。
int flag;があるかないかで変わるのかと思ったのですが。それでも大差ないのでしょうか?


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

Name: softya  ..熟練のプログラマー(45,945ポイント)   Date: 2009/11/24(火) 20:52   No:42584     
Title: Re:for文やwhile文について    
プログラム実行効率の比較としては不適格なソースコードでしょうね。
そもそも、nの最終カウント数が違いますよ。


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

Name: たいやき  ..かけだし(1,187ポイント)   Date: 2009/11/24(火) 22:27   No:42598     
Title: Re:for文やwhile文について    
間違えました。
if(flag)


{


n++;
       flag=1;

}

二番目の関数の
if(i==i%2)
{
   n++;

}
です。


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

Name: たいちう  ..プログラマー(36,903ポイント)   Date: 2009/11/24(火) 22:55   No:42602     
Title: Re:for文やwhile文について    
コンパイルを通るように直して、それぞれ実行してみてください。
実行時間に差がありましたか?
現在のあなたにとっては、それ以上の差はありません。

もっと詳しく知りたいならば、もっと言語を理解してから質問しましょう。
また、処理が遅くて困っているプログラムがあるならば、それについて
具体的な質問をしてくれれば、回答のしようもあると思います。


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

Name: softya  ..熟練のプログラマー(46,234ポイント)   Date: 2009/11/24(火) 23:38   No:42613     
Title: Re:for文やwhile文について    
どんな機械語コードが出ているか見たければ、
「プロジェクト」→「xxxのプロパティ」→「構成プロパティ」→「C/C++」→「出力ファイル」→「アセンブリの出力」を「あり」にすればアセンブラソースが見れます。
それを見て効率的がコード出ているか判断すれば良いと思います(アセンブラは勉強してください)。
※ リリースビルドしないと最適化されないなので必ずリリースビルドで行ってください。

今のコードで比べても無意味なことが分かると思います。
生半可な知識で書き方を工夫してもコンパイラの最適化が上を行きます。あからさまに無駄な書き方、遅いアルゴリズムを選ばない限りはコンパイラにお任せしましょう。


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



Name: おかめ  ..ぴよぴよ(35ポイント)   Date: 2009/11/24(火) 21:48   No:42589       
Title: cのビルドができません    
課題に間に合うため誰か早急に助けてください。
プリコンパイル ヘッダー ファイルが旧バージョンのコンパイラで作成されています。また、C++ のプリコンパイル済みヘッダー ファイルを C で使用しています (その逆も考えられます)。

このエラーの解決方法を教えてください。
まづコンパイラーが古いといいますが、Visual C++自体がコンパイラーなので更新も何もないのでは?
と思ってしまいます。
Cの簡単なファイルをビルドしたのですが、どうすれば解決できるのでしょうか?


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


Name: softya  ..熟練のプログラマー(46,050ポイント)   Date: 2009/11/24(火) 21:59   No:42591     
Title: Re:cのビルドができません    
こちらを参考に。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200605/06050047.txt


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

Name: おかめ  ..ぴよぴよ(92ポイント)   Date: 2009/11/24(火) 22:12   No:42594     
Title: Re:cのビルドができません    
リビルトも意味ないのです。
コンパイラーが古いとかも意味がわかりません。
Visual Studio 2008なので最新なのでは?と思ってしまいます。


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

Name: softya  ..熟練のプログラマー(46,074ポイント)   Date: 2009/11/24(火) 22:20   No:42596     
Title: Re:cのビルドができません    
コンパイラが古いんじゃなくて、古いコンパイラでコンパイルされたプリコンパイルヘッダファイルが残っているって意味です。紹介したサイトでも、そう書かれているはずですが。
なので古いプリコンパイルヘッダ(pch)を削除してください。あるいはクリーンでビルドできるかもしれません(未確認)。


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

Name: 御津凪 [URL]  ..ハッカー(125,042ポイント)   Date: 2009/11/24(火) 22:28   No:42599     
Title: Re:cのビルドができません    
softya さんの方法で出来ないのであれば、以下のことが考えられます。

stdafx.cpp でプリコンパイルヘッダファイルを生成しているのなら、
プリコンパイルヘッダを利用するソースも *.cpp でなくてはなりません。
(stdafx.c で生成しているのなら、ソースも *.c でなくてはなりません。)

なので、拡張子をどちらかに統一にするか、stdafx.* と拡張子が違うソースファイルを、プリコンパイルヘッダを使用しないようにソースコンパイルの設定を変更してください。



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



Name: ベース  ..入門者(3,098ポイント)   Date: 2009/11/24(火) 17:11   No:42573       
Title: HWND_DESKTOPとNULLについて    
CreateWindowの第8引数で親ウィンドウを決めるのはわかるのですが、HWND_DESKTOPはデス
クトップを親ウィンドウにしてNULLは親ウィンドウ自体作っててどう違うのかいまいちよくわからないの
ですがどんな時に使い分ければいいのでしょうか?


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


Name: softya  ..熟練のプログラマー(45,835ポイント)   Date: 2009/11/24(火) 18:15   No:42574     
Title: Re:HWND_DESKTOPとNULLについて    
同じ意味だと私は思ってましたので、調べてみました。
WinUser.hに
#define HWND_DESKTOP ((HWND)0)
と書かれていますので、NULLと同じ扱いですね。
なので使い分けは必要ありません。

コードを読む側としてはHWND_DESKTOPの方が明確なので、HWND_DESKTOPをお勧めします。


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

Name: ベース  ..入門者(3,127ポイント)   Date: 2009/11/24(火) 18:28   No:42575 解決!     
Title: Re:HWND_DESKTOPとNULLについて    
回答ありがとうございます。そうなんですか。ではHWND_DESKTOPをなるべく使うように心がけます。

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



Name: TKOZ  ..プログラマー(38,736ポイント)   Date: 2009/11/22(日) 19:45   No:42508       
Title: ファミコンSTGを作ってみました。    
C言語で作ったので、処理速度は恐ろしく遅いですが、
一応、シューティングっぽいゲームに仕上がっています。
縦スクロールで、敵は3種類、ボスはスコアが5000以上で現れます。
サウンドは矩形波をメインサウンドとサウンドエフェックトに使用し、
ノイズ波を爆発音にしました。

※敵や敵の弾に当たると即ゲームオーバーです。

実行には、ファミコン(NES)エミュレータが必要です。

ハイスコアを競うゲームです。


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


Name: ひよこ  ..比類無きプログラマー(73,775ポイント)   Date: 2009/11/22(日) 21:23   No:42518     
Title: Re:ファミコンSTGを作ってみました。    
やってみましたが、意外と処理が重いです。自分のパソコンのメモリが少ないからですかね。
私がゲーム出来ないせいか、1200点くらいで負けます。ボスも見れません。
時間制のほうが私はいいと思います。

しかし、よく出来てました。制作お疲れ様です。
次回作、楽しみに待ってます。
環境
エミュレータ VirtuaNES
OS Windows Vista Home premium CPU Core 2Duo(2.1GHz)


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

Name: TKOZ  ..プログラマー(38,877ポイント)   Date: 2009/11/22(日) 21:46   No:42522     
Title: Re:ファミコンSTGを作ってみました。    
>>ひよこさん
プレイしていただき、ありがとうございます。

http://hp.vector.co.jp/authors/VA042397/nes/index.html
ファミコンのCPUは、1.79MHzで、メモリも2kByteしかないので、
このゲームが原因だと思います。

このゲームが重い原因は、安易に線形探索を行ってるからでしょう。
というか、それしか知らないです。→(探索アルゴリズム)


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

Name: ひよこ  ..比類無きプログラマー(73,877ポイント)   Date: 2009/11/22(日) 22:34   No:42524     
Title: Re:ファミコンSTGを作ってみました。    
メモリも2kByte
>>それしかないんですか、開発も大変ですね。
>>自分のSTGがメモリを無駄に使っているのを考えるとメモリの贅沢だと思いました。

3000点くらい、いったのでついでに言わせてもらえると、
ゲームの最初と、自機がやられた時の、画面のゆれ?絵のゆれみたいなものは仕様でしょうか?


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

Name: TKOZ  ..プログラマー(39,081ポイント)   Date: 2009/11/23(月) 12:30   No:42539     
Title: Re:ファミコンSTGを作ってみました。    
>>ひよこさんへ

>>3000点くらい、いったのでついでに言わせてもらえると、
おお、おめでとうございます。
アイテムが1000点に達した時と、3000点の時に上から降ってきます
ので、取っておいたほうがいいですよ。

>>ゲームの最初と、自機がやられた時の、画面のゆれ?絵のゆれみたいなものは仕様でしょうか?
これは、僕が一般的な画面の書き換え方を知らない為に起こる現象だと思います。

あと、このげームの高速化の為にもっと検索速度の速い、探索アルゴリズムを探してみたいと考えています。


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

Name: softya  ..熟練のプログラマー(45,834ポイント)   Date: 2009/11/23(月) 15:54   No:42542     
Title: Re:ファミコンSTGを作ってみました。    
遊んでみました。めちゃ重いです(^^ゞ
STGは苦手なので、ボスまでたどり着けません&あとEASYはなぜか選べません?
ファミコンでのシューティングなので懐かしい感じがしましたよ。

書き換えが見えるのは、裏で書き換えてから切り替えていないからでしょう。
別のネームテーブルに新しいパターンを作っておいて、コントロールレジスタ1 でネームテーブルアドレス指定を切り替えてやれば一瞬で切り替わりますよ。
それと背景のつなぎ目あたりで一瞬スクロールがおかしくなります。バグがあるかもしれません。






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

Name: klos  ..かけだし(1,394ポイント)   Date: 2009/11/23(月) 19:33   No:42552     
Title: Re:ファミコンSTGを作ってみました。    
なんだか懐かしかったです(*^^)

VirtuaNes 0.97
nesterJ 0.51b
NNNesterJ 0.23
で、遊んでみました。
FAMTASIA 5.1では不安定、というかほぼ動かない・・・古いエミュレータだから仕方ないかもです。
皆さん書かれてるように、やはり重いですね(^^; 弾を連射する時が・・・。

気になった点を。
(1)一定以上の点数になると、またゼロに戻るのでしょうか?
    正確な点数は分かりませんが、2万点近くは行けました。
    ただし、もっと高い点数になると、ゼロに戻って一周するようです。
(2)ボスに1度でも弾を当てるとボスの機体が常に爆発している状態になります。
    これは仕様でしょうか?
(3)画面の端にはみ出ると、反対側から現れる。
    バグのようにも思えますが、使い方次第ではゲームに面白みを加える事ができそうですね。
    左右や後ろ方向に発砲する機能を付ければ、反対側から現れて敵機を撃墜・・・
    なんて事もできそうです。
    シューティングゲーム、作る事もやる事もあまりないのですが、面白い機能という事で。
(4)ゲームが終わる時にハイスコアを表示してほしい
    1発当たると即ゲームオーバーなので、「あれ、今何点だったっけ?」なんて事があります。
    まだ開発途中のようなので、今処理は暫定的なものかもしれませんね。
    その場合はお節介失礼しました。

でも、懐かしのピコピコ音が聞けて良かったです(*^^)
ファミコンゲームの開発となると資料が少ないでしょうが、楽しみながら続けてくださいね。


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

Name: バグ  ..ハッカー(174,160ポイント)   Date: 2009/11/23(月) 19:56   No:42553     
Title: Re:ファミコンSTGを作ってみました。    
ボスを倒した瞬間にいきなりGameOverになるのはビックリしますw

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

Name: けんたろうちゃん  ..初心者(5,100ポイント)   Date: 2009/11/23(月) 23:42   No:42566     
Title: Re:ファミコンSTGを作ってみました。    
すごいですねー。ホントにすごいです。
C言語からファミコンプログラムができるなんて知りませんでした(アセンブラとかにも興味ありますが)。


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

Name: TKOZ  ..プログラマー(39,628ポイント)   Date: 2009/11/24(火) 06:18   No:42569     
Title: Re:ファミコンSTGを作ってみました。    
>>softyaさんへ
>EASYはなぜか選べません?
タイトル画面でセレクトボタンを押してください。

>書き換えが見えるのは、裏で書き換えてから切り替えていないからでしょう。
>別のネームテーブルに新しいパターンを作っておいて、
>コントロールレジスタ1 でネームテーブルアドレス指定を切り替えてやれば一瞬で切り替わりますよ。
そ、そうなんですか…。知りませんでした。

>それと背景のつなぎ目あたりで一瞬スクロールがおかしくなります。バグがあるかもしれません。
バグですね。0x2005辺りでの指定がまずかったんだと思います。

>>klosさんへ
>(1)一定以上の点数になると、またゼロに戻るのでしょうか?
そうです。実は、スコアにあてられている変数は、unsigned char型の8ビット変数です。だから、25500点が
最高点で、それを過ぎると、0に戻ります。10桁目と1桁目はダミーです。

>(2)ボスに1度でも弾を当てるとボスの機体が常に爆発している状態になります。
連射してるからそう見えるのかもしれませんが、実際は違います。
EASYとHARDだと、ボスとの当たり判定が変わってきます。
EASYだと、当たり判定で自機弾が消えません。
HARDだと、当たり判定で自機弾が消えます。
多分、EASYで、自機弾が消えない分のフレーム数だけダメージを与えている為、
そう見えるのでしょう。

>(3)画面の端にはみ出ると、反対側から現れる。
これは、あまり想定していなかった事です。単なる怠けです。

>(4)ゲームが終わる時にハイスコアを表示してほしい
これは考えておきます。

>>バグさんへ
>ボスを倒した瞬間にいきなりGameOverになるのはビックリしますw
そうですね。。音楽だけでも変えるべきだったでしょうか…。

>>けんたろうちゃんさんへ
>すごいですねー。ホントにすごいです。
>C言語からファミコンプログラムができるなんて知りませんでした
>(アセンブラとかにも興味ありますが)。
cc65という海外の6502(ファミコンのCPU名)の開発環境です。
http://www.cc65.org/
ブルジョアソフトウェア研究所というWebサイトでサンプルがダウンロードできるので
もし興味がおありなら、やってみてはいかがでしょうか?
http://hp.vector.co.jp/authors/VA042397/index.html



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



Name:  ..かけだし(1,279ポイント)   Date: 2009/11/17(火) 16:16   No:42210       
Title: 横スクロールアクションの衝突判定    
はじめまして、宮といいます。
このサイトのおかげで作り方の分からなかったゲームプログラミングに着手することができました。
ありがとうございます ^^

現在マリオ風横スクロールアクションのサンプルを作っているのですが、
プレイヤーとブロックの衝突判定がうまくいかずに困っています。

挙動がおかしいのは2箇所です。
@ブロックの斜め上から衝突すると横から進入しているのにブロックの上に乗ってしまう。
Aブロックを下から叩くとブロックのないところ(横一列に並ぶブロックの一番右側)まで移動させられる。
( 説明がヘタクソなのでアップローダーに実行ファイルとソースを添付しました。(汗) )
【key:act】
http://www1.axfc.net/uploader/He/so/252845

これらを修正するためにはどうすれば良いのでしょうか?
お力添えをお願いします。

以下が衝突判定のソースです。



================================================================================
--- Map.h ---
#define CHIP_SIZE 32 //マップチップのサイズ(キャラクター画像も32*32)

--- Charactor.h ---
#include "Map.h"

#define ACCEL_X 0.2 //X加速値
#define ACCEL_X_MAX 8.0 //X最大加速値
#define GRAVITY 0.2 //重力加速度
#define GRAVITY_MAX 10.0 //落下最大スピード
#define JAMP -6.0 //ジャンプによるY加速値

enum eDIR{//向き
eDIR_DOWN, eDIR_UP, eDIR_RIGHT, eDIR_LEFT,
};

struct rect_t{//矩形
int x,y,w,h;
};

//クラス定義
class Charactor{
int handle[16]; //画像ハンドル
int cnt; //カウンタ
double cx, cy; //座標
double vx, vy; //加速値
int dir; //向き
bool jump; //ジャンプフラグ
rect_t rect; //当たり範囲(例:cx + rect.x, cx + rect.w)
public:
void init(); //初期化
void input(); //入力処理
void collision(); //衝突処理
bool out(rect_t, int, int); //衝突判定
};

================================================================================
--- Charactor.cpp ---

//概要:初期化
void Charactor::init()
{
//キャラクターの判定領域(cx, cyから加算する値)
rect.x = 4;
rect.y = 2;
rect.w = 28;
rect.h = 32;
}

//概要:入力処理
void Charactor::input()
{
//キー入力あれこれ〜〜

//移動
vy += GRAVITY;
if(vy > GRAVITY_MAX) vy = GRAVITY_MAX;
cx += vx;
cy += vy;

collision(); //衝突処理
}

//概要:衝突処理
void Charactor::collision()
{
int x = ((int)cx + rect.x) / CHIP_SIZE;
int y = ((int)cy + rect.y) / CHIP_SIZE;

//座標取得
rect_t box = rect;
box.x += (int)cx; box.w += (int)cx;
box.y += (int)cy; box.h += (int)cy;

//位置補正(左右)
if(vx > 0.0){//右へ移動中
if(out(box, x+1, y)){ //壁との衝突
cx = x * CHIP_SIZE + rect.x; //位置調整
vx *= 0.0/*-0.8*/;
}
}
else{//左へ移動中
if(out(box, x, y)){ //壁との衝突
cx = (x+1) * CHIP_SIZE - rect.x; //位置調整
vx *= 0.0/*-0.8*/;
}
}

x = ((int)cx + rect.x) / CHIP_SIZE;
y = ((int)cy + rect.y) / CHIP_SIZE;
box = rect;
box.x += (int)cx; box.w += (int)cx;
box.y += (int)cy; box.h += (int)cy;

//位置補正(上下)
jump = true;
if(vy > 0.0){//下降中
if((out(box, x, y+1)) || (out(box, x+1, y+1))){ //地面と衝突
cy = (y-1) * CHIP_SIZE + rect.h; //位置調整
vy = 0.0;
jump = false;
}
}
else{//上昇中
if((out(box, x, y)) || (out(box, x+1, y))){ //天井と衝突
cy = (y+1) * CHIP_SIZE - rect.y; //位置調整
}
}
}

//概要:キャラとマップチップの衝突判定
bool Charactor::out(rect_t A, int _x, int _y)
{
if(Map::getMapChip(0, _x, _y) == 0) return(false); //マップチップが無ければ

if(Map::getMapChip(0, _x, _y) == 1){ //マップチップが壁なら
//マップチップ座標取得
rect_t B;
B.x = _x * CHIP_SIZE; B.y = _y * CHIP_SIZE;
B.w = B.x + CHIP_SIZE; B.h = B.y + CHIP_SIZE;

//矩形同士の当たり判定
if((A.x < B.w) && (B.x < A.w) && (A.y < B.h) && (B.y < A.h)){
return(true);
}
}
return(false);
}


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


Name: softya  ..熟練のプログラマー(42,577ポイント)   Date: 2009/11/18(水) 16:01   No:42257     
Title: Re:横スクロールアクションの衝突判定    
とりあえず衝突判定で左右と上下を別々に補正しているのが問題だと思います。

こんな感じで処理してみてください。
(1)将来の位置を上下左右のベクトル計算後の仮座標で衝突判定。衝突しなかった仮座標は正式な座標として、衝突判定を抜ける。衝突したら仮座標は捨てる。
(2)左右の移動量と上下の移動量のどちらが大きいか判定。左右なら(3)(4)と処理。上下なら(4)(3)と処理
(3)左右のマップチップの境界で補正した将来の位置の仮座標で衝突判定。衝突しなかった仮座標は正式な座標として、衝突判定を抜ける。衝突したら仮座標は捨てる。
※ ようは、左右の壁に衝突すると仮定して、衝突時上下はどの位置に移動しているかを計算して、その位置で壁に衝突しているか調べる。
(4)今度は上下で(3)と同様な処理を行う。

これで大丈夫なはずですが検証していないので、間違っていたらまた考えます。


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

Name:  ..かけだし(2,335ポイント)   Date: 2009/11/19(木) 08:18   No:42303     
Title: Re:横スクロールアクションの衝突判定    
softyaさんの意見を参考にAの問題は解決することができました。
ありがとうございます。

(3)(4)は、例えば左右の移動量の方が上下の移動量より多ければ横の座標を修正した後に縦をチェックする。
上下の方が多ければ縦座標を修正した後に横をチェックするという解釈でいいでしょうか?
何となくそんな感じかな〜とcollision()関数を修正してみました。

あとは@の問題と、もう一つおかしな所を見つけました。

■がブロック、●がプレイヤーだとします。

マップがこんな感じだとして


■  ●
■■■■

矢印に向かって跳ぶと、
■←

■  ●
■■■■

ブロックをすり抜けてしまいます。


 ■←
 ■
 ■
 ■■■■

こちらが変更したプログラムです。


================================================================================
--- Charactor.h ---

class Charactor{
bool collisionLR(); //衝突処理(左右)
bool collisionUD(); //衝突処理(上下)
rect_t addRect(int _x, int _y); //rect_t構造体の加算処理
};

================================================================================
--- Charactor.cpp ---

//衝突処理(左右)
bool Charactor::collisionLR()
{
int next_cx = cx + vx;
rect_t box = addRect(next_cx, cy);
int _x = (int)(cx + rect.x + vx) / CHIP_SIZE;
int _y = (int)(cy + rect.y) / CHIP_SIZE;

if(vx > 0.0){//右へ移動中
if(out(box, _x+1, _y)){//壁との衝突
cx = _x * CHIP_SIZE + rect.x;//位置調整
vx *= 0.0;
return(true);
}
}
else{//左へ移動中
if(out(box, _x, _y)){//壁との衝突
cx = (_x+1) * CHIP_SIZE - rect.x;//位置調整
vx *= 0.0;
return(true);
}
}
return(false);
}

//衝突処理(上下)
bool Charactor::collisionUD()
{
int next_cy = cy + vy;
rect_t box = addRect(cx, next_cy);
int _x = (int)(cx + rect.x) / CHIP_SIZE;
int _y = (int)(cy + rect.y + vy) / CHIP_SIZE;

//位置補正(上下)
if(vy > 0.0){//下降中
if((out(box, _x, _y+1)) || (out(box, _x+1, _y+1))){//地面と衝突
cy = (_y-1) * CHIP_SIZE + rect.h;//位置調整
vy = 0.0;
jump = false;
return(true);
}
}
else{//上昇中
if((out(box, _x, _y)) || (out(box, _x+1, _y))){//天井と衝突
cy = (_y+1) * CHIP_SIZE - rect.y;//位置調整
return(true);
}
}
return(false);
}

void Charactor::collision()
{
//変数定義
int next_cx, next_cy; //次の座標
rect_t box; //プレイヤーキャラの左上, 右下座標
bool fmove = false; //移動フラグ

next_cx = cx + vx; //次に移動する座標
next_cy = cy + vy;
box = addRect(next_cx, next_cy); //次のフレームの当たり判定

//衝突していたら
jump = true;
if(vx*vx > vy*vy){//横の移動量の方が大きい
collisionLR(); //左右の衝突チェック
fmove = collisionUD(); //上下の衝突チェック
}
else{//縦の移動量の方が大きい
fmove = collisionUD(); //上下の衝突チェック
collisionLR(); //左右の衝突チェック
}

//移動
cx += vx;
if(!fmove) cy += vy;
}

//rect_t構造体の加算処理
rect_t Charactor::addRect(int _x, int _y)
{
rect_t box = rect; //当たり判定を取得
box.x += (int)_x; box.w += (int)_x; //キャラの左座標, 右座標を取得
box.y += (int)_y; box.h += (int)_y; //キャラの上座標, 下座標を取得
return(box);
}


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

Name: softya  ..熟練のプログラマー(45,193ポイント)   Date: 2009/11/19(木) 11:03   No:42308     
Title: Re:横スクロールアクションの衝突判定    
残る問題はすり抜けだけですかね?
だとすると、簡単な方法は最初に移動ベクトルの半分の値でまず当たり判定を行うと良いと思います。
イメージ的には、AからCに移る移動処理で、途中のBポイントで当たり判定をしてみるって感じです。本当は1ドット毎にやりたいんですが処理時間が掛かるので中間点だけ調べるので代用します。
これでだいぶすり抜ける事は無くなると思います。

修正版です。(0)を追加しました。

(0)上下左右のベクトルの半分で計算した仮座標で衝突判定。衝突したら(2)へ。しなかったら(1)へ。
(1)将来の位置を上下左右のベクトル計算後の仮座標で衝突判定。衝突しなかった仮座標は正式な座標として、衝突判定を抜ける。衝突したら仮座標は捨てる。
(2)左右の移動量と上下の移動量のどちらが大きいか判定。左右なら(3)(4)と処理。上下なら(4)(3)と処理
(3)左右のマップチップの境界で補正した将来の位置の仮座標で衝突判定。衝突しなかった仮座標は正式な座標として、衝突判定を抜ける。衝突したら仮座標は捨てる。
※ ようは、左右の壁に衝突すると仮定して、衝突時上下はどの位置に移動しているかを計算して、その位置で壁に衝突しているか調べる。
(4)今度は上下で(3)と同様な処理を行う。


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

Name:  ..入門者(2,586ポイント)   Date: 2009/11/19(木) 21:55   No:42345     
Title: Re:横スクロールアクションの衝突判定    
なるほどです。
ただ実装してみたのですが、変化がありませんでした。

(0)で横を修正した後、縦を修正。
衝突していなかったら(2)の処理へ。


bool hit = false; //接触フラグ
if(collisionLR(vx/2, 0)){ //左右の衝突チェック
fmove = collisionUD(0, vy/2); //上下の衝突チェック
hit = true;
}

if(!hit){
collisionLR(vx, 0); //左右の衝突チェック
fmove = collisionUD(0, vy); //上下の衝突チェック
}


こんな感じにしてみたのですが・・・


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

Name: softya  ..熟練のプログラマー(45,221ポイント)   Date: 2009/11/19(木) 23:53   No:42352     
Title: Re:横スクロールアクションの衝突判定    
うまく伝わっていなかったと思うので、プログラムを直してみました。
ただし、未コンパイル&未デバッグです。
そのまま使うのではなく、アルゴリズムの参考として使ってください。
大丈夫だとは思うのですが、アクションゲームのアルゴリズムを書いたのは相当久しぶりなので少々自信がありません。そちらの関数の使い方を勘違いしている可能性もあります。


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

Name:  ..入門者(2,837ポイント)   Date: 2009/11/21(土) 01:35   No:42404     
Title: Re:横スクロールアクションの衝突判定    
遅くなってしまってすみません。

プログラム見させてもらいました。
参考になります。

x座標かy座標の片方だけずらして位置を補正するのではなく、
両方をずらし、当たり判定を取ってから壁際に移動させれば良かったのですね。

昨日は立て込んでしまい時間が取れませんでしたが、
また都合の良い時に修正案を試させていただきます!

きちんと動かすために少し手間取ってしまいそうなので、
ガッツリ考え込むかもしれません。

解決するか、煮詰まってしまったら再びコメントさせていただきます ^^


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

Name:  ..入門者(2,913ポイント)   Date: 2009/11/22(日) 04:51   No:42464     
Title: Re:横スクロールアクションの衝突判定    
粘りましたがアカンでした。
やればやるほどこんがらがってしまいました。
う〜ん、理解が足りてなかったようです。

申し訳ないのですが
実行可能なソースを添付しましたので、再度ご確認いただけるとありがたいです。
プログラムの問題点や解決案など、ご指摘お願いします。


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

Name: けんたろうちゃん  ..入門者(4,966ポイント)   Date: 2009/11/22(日) 09:53   No:42468     
Title: Re:横スクロールアクションの衝突判定    
私は同じように2Dアクションを作るとき、以下のサイトを参考にしました
http://javagame.skr.jp/index.php?%A5%D6%A5%ED%A5%C3%A5%AF%A4%C8%A4%CE%BE%D7%C6%CD


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

Name:  ..入門者(3,221ポイント)   Date: 2009/11/23(月) 16:06   No:42543 解決!     
Title: Re:横スクロールアクションの衝突判定    
解決しました。
けんたろうちゃんさんに紹介していただいたサイトの方法でうまくいきました。

今までは

縦よりも横のほうが移動量が大きい⇒ 横、縦の順に修正。
そうでなければ ⇒ 縦、横の順に修正。

というやり方で進めてきましたが、
何が問題だったのかようやくつきとめることができました。

□●←右側から □ に衝突する


■■■■

□ と衝突して一度はその右隣に修正はされるものの、
次にcollision()関数を通るときには縦の移動量(vy)の方が横移動量(vx)よりも大きくなってしまう。
(衝突時に(vx)が0に修正されるため)

すると次に □ にぶつかったときに
縦、横の順で座標修正されるので

●←この位置に来てしまう。



■■■■

というとこでした。
紹介サイトのやり方を試したら上記の問題もすり抜け問題も一気に解決しました。
けんたろうちゃんさん、ありがとうございます!

それと、softyaさん。
何度も手助けしていただき、感謝です!
処理の手順や関数の使い方など、かなり参考になりました。
ありがとうございます!


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

Name: softya  ..熟練のプログラマー(45,759ポイント)   Date: 2009/11/23(月) 16:13   No:42544     
Title: Re:横スクロールアクションの衝突判定    
とりあえずうまく行って良かったです。
けんたろうちゃんさん紹介のサイトの方法の方がシンプルで良いかと思います。
気になっているのは、落下速度の上限を決めておかないと変なすり抜けを起こすんじゃないかって事なんですが、落下距離次第なんで一度確認してみてください。ではでは。


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

Name: けんたろうちゃん  ..初心者(5,030ポイント)   Date: 2009/11/23(月) 23:39   No:42565     
Title: Re:横スクロールアクションの衝突判定    
いえいえどういたしまして〜
今度2Dアクションの坂で効率的な方法思いついたら教えてくださいなw


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



Name: ゲンタシン  ..ぴよぴよ(88ポイント)   Date: 2009/11/21(土) 21:51   No:42451       
Title: ポインタに関する質問です    
ポインタ型変数(文字列)に記憶された文字列の長さを求めよ。ただし文字列をscanf文で読み,関数を使わないこと。
上記の問題なのですが,
#include <stdio.h>
main(){
int i;
char a[128];
printf("文字列を入力してください → ");
scanf("%s",a);
for (i=0; a[i]!= 0; i++){}
printf("あなたの入力した文字列は<%s>で,文字数は%dです。\n",a, i);
}
と配列を用いたものは出来ました。
C言語を始めたばかりなので,ポインタというものがいまいちわかっておりません。その辺を含め,教えていただけると幸いです。


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


Name: たかぎ [URL]  ..ハッカー(123,568ポイント)   Date: 2009/11/21(土) 22:19   No:42454     
Title: Re:ポインタに関する質問です    
> ポインタ型変数(文字列)に記憶された文字列の長さを求めよ。

ポインタ型変数に文字列を記憶することはできません。

> ただし文字列をscanf文で読み,関数を使わないこと。

scanfも関数です。


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

Name: non  ..比類無きプログラマー(71,059ポイント)   Date: 2009/11/22(日) 09:07   No:42466     
Title: Re:ポインタに関する質問です    
たかぎさんの仰るとおり、学校の課題ならもう少し、正確に課題を載せてもらわないと、どうしたいのか
わかりませんね。
配列に格納した文字列の先頭アドレスを、ポインタで指して、文字数を求めるのに、strlenなどの組み込
み関数を使わずに、先ほどのポインタを使って解けということでしょうか。その場合に *(a+i)のような
使い方は可なのでしょうか?
さらに、丸投げは禁止されているのですから、わかるところまでは解いて、何がうまくいかないのか記し
てください。ポインタを使って文字数を求める例は、ほとんどのC言語の入門本や、ググれば載っています。





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

Name: ゲンタシン  ..ぴよぴよ(418ポイント)   Date: 2009/11/22(日) 11:33   No:42470     
Title: Re:ポインタに関する質問です    
回答ありがとうございます。学校の課題自体が「ポインタ型変数(文字列)に記憶された文字列の長さを求めよ。ただし文字列をscanf文で読み,関数を使わないこと。」となっています。

>配列に格納した文字列の先頭アドレスを、ポインタで指して、文字数を求めるのに、strlenなどの組み込
み関数を使わずに、先ほどのポインタを使って解けということでしょうか。
ポインタ型変数に文字列を記憶できないとなると,このやり方だと思われます。

>*(a+i)のような使い方は可なのでしょうか?
可です。

調べてはみたのですが,strlenを使っているものばかりで参考にはなりませんでした。オススメの入門本があれば教えていただけませんか?


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

Name: たかぎ [URL]  ..ハッカー(123,787ポイント)   Date: 2009/11/22(日) 12:32   No:42473     
Title: Re:ポインタに関する質問です    
> 関数を使わないこと。

とのことですが、scanfとprintfは使ってもよいのでしょうか?
それであれば...

#include <stdio.h>

int main(void)
{
char format[] = "%0s";
char *string;

for (size_t i = 0; i < sizeof(string); i++)
*((char*)&string + i) = 0;
format[1] += sizeof(string) - 1;
scanf(format, (char*)&string);

printf("あなたの入力した文字列は<");
int length = printf("%s", (char*)&string);
printf(">で,文字数は%dです。\n", length);

return 0;
}

入力できる文字数はポインタのサイズに依存します。
通常、32ビットの環境であれば3文字、64ビットの環境であれば7文字が上限です。


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

Name: non  ..比類無きプログラマー(71,128ポイント)   Date: 2009/11/22(日) 12:53   No:42475     
Title: Re:ポインタに関する質問です    
>>*(a+i)のような使い方は可なのでしょうか?
>可です。

じゃ、
for (i=0; *(a+i)!='\0'; i++){}
こうするのが一番簡単。


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

Name: ゲンタシン  ..ぴよぴよ(438ポイント)   Date: 2009/11/22(日) 20:54   No:42514     
Title: Re:ポインタに関する質問です    
回答ありがとうございます。

たかぎさん
scanfとprintfは使っても大丈夫です。書いていただいたプログラムをコンパイルした所,エラーが出てしまいました。

nonさん
参考にさせていただきます。


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

Name: たかぎ [URL]  ..ハッカー(123,795ポイント)   Date: 2009/11/22(日) 21:10   No:42517     
Title: Re:ポインタに関する質問です    
> 書いていただいたプログラムをコンパイルした所,エラーが出てしまいました。

処理系不明のため、C99で書いています。古い規格にしか対応していない処理系ではコンパイルできません。


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

Name: ゲンタシン  ..ぴよぴよ(453ポイント)   Date: 2009/11/23(月) 18:42   No:42548 解決!     
Title: Re:ポインタに関する質問です    
わかりました。色々とありがとうございました。

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



Name: klos  ..ぴよぴよ(790ポイント)   Date: 2009/11/23(月) 17:07   No:42545       
Title: モデルとマップの当たり判定    
モデルとマップの当たり判定を行いたいと思っています。

以下に載せるPlayerMove関数について説明します。
ポリゴン同士が接触した場合は「Hit」と表示され接触しているポリゴンの数が表示され、
接触しているポリゴンが水色で表示されるはずなのですが、
HitPolyDim.HitNumが常にゼロのまま変化しません。
モデルとマップが接触した場合は、HitPolyDim.HitNumが1以上にならなければなりません。

なぜ、接触しても表示が変わらないのでしょうか?


MV1CollCheck_Sphereを使う前にコリジョン情報の構築が必要なので、
その部分は別にある初期化用関数の中で次のようにしています。

	Floor.ModelHandle = MV1LoadModel( "floor.mqo" ) ;

if( MV1SetupCollInfo( Floor.ModelHandle , -1 , 8 , 8 , 8 ) ) return -1 ;



次の部分が実際の当たり判定部分です。
この関数で床のモデルとプレイヤーのモデルの接触判定をしたいのですが、
段階的に作って行こうと思い、現時点ではまず最初に「周りに障害物が無いか?」を調べるコードを書いています。
これが出来たら次は床があるのか無いのか。無ければ落下処理、あれば歩行するなどなど考えています。
開発環境はVistaでBCC、DXライブラリを使用しています。

ここが違うから思ってるように動かないんだ等、指摘ありましたらお教えください(_ _)


// プレイヤーの移動処理(あたり判定?)
int PlayerMove( void )
{
int i ;
MV1_COLL_RESULT_POLY_DIM HitPolyDim ;

// どこかのポリゴンと接触しているか調べる
HitPolyDim = MV1CollCheck_Sphere( Floor.ModelHandle , -1 , Player1.Position , 100.0f ) ;
DrawSphere3D( Player1.Position , 100.0f, 8, GetColor( 255,0,0 ), GetColor( 0,0,0 ), FALSE ) ; // デバッグ用の当たり判定検知範囲を表示

// 接触している場合
if( HitPolyDim.HitNum > 0 )
{
// 当たったポリゴンの数だけ繰り返し
for( i = 0 ; i < HitPolyDim.HitNum ; i ++ )
{
// 当たったポリゴンを描画
DrawTriangle3D(
HitPolyDim.Dim[ i ].Position[ 0 ],
HitPolyDim.Dim[ i ].Position[ 1 ],
HitPolyDim.Dim[ i ].Position[ 2 ], GetColor( 0,255,255 ), TRUE ) ;
}

}

// 接触しているポリゴンの数を表示
DrawFormatString( 0 , 55 , GetColor( 255 , 255 , 255 ) ,
"Hit: %d" , HitPolyDim.HitNum ) ;

// 画面の更新
ScreenFlip() ;

// 当たり判定情報の後始末
MV1CollResultPolyDimTerminate( HitPolyDim ) ;

return 0 ;
}



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


Name: Justy  ..伝説なるハッカー(466,316ポイント)   Date: 2009/11/23(月) 18:18   No:42546     
Title: Re:モデルとマップの当たり判定    

> HitPolyDim.HitNumが常にゼロのまま変化しません

 これはデバッガで確認した値ですか?
 もし表示されている値がそうなっているのだとしたら、本当の値とは
異なる可能性がありますので、デバッガを使うとかログに書き出す、
或いは HitPolyDim.HitNum > 0 の中でメッセージボックスを出してみる、などして
本当にそうなのか確認してみて下さい。



> 指摘ありましたらお教えください

 見た感じ3Dの処理的におかしなところは見あたらないですね。
 可能性としては実は半径 100程度では本当に接触していない、とか
Floor.ModelHandleが -1になっているなどソースからは見えない部分に
あるのかもしれません。

 3D処理以外の部分で見ますと、プレイヤー移動関数なのに ScreenFlip、
画面の更新をしているのが気になります。

 PlayerMove関数が1フレームの処理における最後の処理ならばいいのですが、
そうでないのなら、この関数の呼び出し元その他の処理如何によっては、
表示関連がおかしなことになりますので、ScreenFlipを適切な場所に
配置し直して下さい。


 その上で、まだ現象が起こるようなら再現可能なコードとデータを添付するのが
いいかと思います。


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



Name: たこやき  ..かけだし(2,185ポイント)   Date: 2009/11/22(日) 20:05   No:42511       
Title: Getmessageについて    
Getmessage()で渡されるDispatchMessageの中のWndProcの処理を通らないメッセージってどんなのがあるのでしょうか?

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


Name: たこやき  ..かけだし(2,239ポイント)   Date: 2009/11/22(日) 20:31   No:42513     
Title: Re:Getmessageについて    
質問文間違えました。「GetMessageで渡されるmsgでDispatchMessageの
中のWndProcの処理を通らないmsgってどんなのがあるのでしょうか?」です。


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

Name: tkmakwins15  ..比類無きプログラマー(98,655ポイント)   Date: 2009/11/22(日) 23:32   No:42527     
Title: Re:Getmessageについて    
WM_QUIT
とかが有ります。


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

Name: たこやき  ..かけだし(2,274ポイント)   Date: 2009/11/22(日) 23:38   No:42528     
Title: Re:Getmessageについて    
それはWndprocで処理されますよね?WndProcを通らない処理を聞きたいのです。


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

Name: YuO  ..プログラマー(37,251ポイント)   Date: 2009/11/22(日) 23:54   No:42531     
Title: Re:Getmessageについて    
WM_QUITは通常DispatchMessageに渡されませんね。

MSDNを読む限り,WM_TIMERは条件によってはウィンドウプロシージャに渡されません。
MSDN: DispatchMessage Function ()
http://msdn.microsoft.com/en-us/library/ms644934.aspx
そのほかは,原則としてウィンドウプロシージャに渡ると考えられます。

特殊な例としては,PostThreadMessageでそのメッセージが渡ってきた場合,
DispatchMessageはウィンドウプロシージャを呼び出しません (呼び出せません)。
SMDN: PostThreadMessage Function ()
http://msdn.microsoft.com/en-us/library/ms644946.aspx


なお,ウィンドウプロシージャのプレイスホルダ名はWindowProcであって,WndProcではありません。
MSDN: WindowProc Function ()
http://msdn.microsoft.com/en-us/library/ms633573.aspx


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

Name: たこやき  ..かけだし(2,297ポイント)   Date: 2009/11/23(月) 07:59   No:42537 解決!     
Title: Re:Getmessageについて    
わかりました。もやもやが解決しました。回答ありがとうございました!

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



Name: trx  ..中級者(10,501ポイント)   Date: 2009/11/22(日) 15:21   No:42485       
Title: 画像表示    
度々すみません。
すごく簡単な事ですが、
画像が出てきません。
いくら見ても、問題が見つかりません。
画像は、
Debug
場の、
Media、
に入っています。
ファイルの名前は、
don waku l.bmp
don waku r.bmp
ka waku l.bmp
ka waku r.bmp
です。
すごい簡単な事ですがよろしくお願いします。


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


Name: softya  ..熟練のプログラマー(45,455ポイント)   Date: 2009/11/22(日) 15:51   No:42487     
Title: Re:画像表示    
画像をLoadSoundMem で読み込んでいますが、LoadGraphが正解です。
1つ1つの関数には意味がありますので、ちゃんと意味を調べて使うようにしてください。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html



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

Name: trx  ..中級者(10,512ポイント)   Date: 2009/11/23(月) 03:32   No:42536 解決!     
Title: Re:画像表示    
有難うございます。
読み落としていました。


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



Name: 小夜  ..中級者(9,750ポイント)   Date: 2009/11/22(日) 15:17   No:42484       
Title: 永夜抄のスペルカード発動時の背景    
永夜抄以降の東方ゲームの、
敵のスペルカード発動時の背景についてお尋ねします。
あれは、所々を透過した画像の下で、
別の画像がスクロールされている、という解釈で良いのでしょうか?
画像2枚をAとBで説明しますと
(透過加工してあるのがBです)
Aをスクロールし、その上に固定したBを重ねる、
ということです。
これで良いのでしょうか?
アドバイスよろしくお願いします!


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


Name: チルチル  ..比類無きプログラマー(79,128ポイント)   Date: 2009/11/22(日) 17:08   No:42491     
Title: Re:永夜抄のスペルカード発動時の背景    
>永夜抄のスペルカード発動時の背景
>永夜抄以降の東方ゲームの

どちらなのか良くわかりませんが
「スペルカード発動時の背景」と言うのは
「発動した瞬間に出る文字とか」と「スペル中は背景が変わる」のどっちでしょうか?
どっちにしても基本はそんな感じで良いと思いますよ
場合によってはBの方を動かしたり、両方動かしたり
ブレンドしたり、輝度を変えたりも必要ですが・・


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

Name: 小夜  ..中級者(9,824ポイント)   Date: 2009/11/23(月) 01:05   No:42534     
Title: Re:永夜抄のスペルカード発動時の背景    
チルチルさん>
すみません、言葉が足りませんでした;
永夜抄、風神録あたりのことを言ってます。
あと、「スペル中は背景が変わる」ということです。
輝度を変えたりもするんですね。
ありがとうございます。


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



Name: banba  ..ぴよぴよ(652ポイント)   Date: 2009/11/22(日) 22:48   No:42525       
Title: for文で画像ハンドルを変数配列に代入したい・・が    
タイトル通りです。

gazou0.bmp gazou1.bmp.... といった連番の名前の画像のハンドルをfor文とLoadGraph関数で一気に代入したいのですが


int GrHandle[10]

for(i=0;i<10;i++){
GrHandle[i] = LoadGraph( "gazou[i].bmp" ) ;
}

コレじゃおかしいですよね?[i]が文字例の一つになってしまいますから。
こっから先解らないのです・・・

LoadDivGraphを使えよという声も聞こえてきそうですが、個人的にはこちらを利用したいのです。
容易い事かもしれませんが、僕は解らなくて困ってます(汗)
回答いただけたらありがたいです。


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


Name: kazuoni [URL]  ..ハッカー(114,768ポイント)   Date: 2009/11/22(日) 22:57   No:42526     
Title: Re:for文で画像ハンドルを変数配列に代入したい・・が    
こんな感じのことがやりたいのでしょうか?
char str[64];

for(int i=0 ; i<10 ; ++i)
{
sprintf(str,"gazou[%d].bmp",i);
GrHandle[i] = LoadGraph(str);
}


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

Name: banba  ..ぴよぴよ(687ポイント)   Date: 2009/11/22(日) 23:39   No:42530 解決!     
Title: Re:for文で画像ハンドルを変数配列に代入したい・・が    
早い回答ありがとうございます!
そうです、こんな感じです!sprintfを利用すればよかったんですね。
助かりました!


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



Name: 藍霧00  ..ぴよぴよ(802ポイント)   Date: 2009/11/21(土) 17:15   No:42439       
Title: 改造龍神録:7章『フィールドの広さ』と9章『低速移動時』にて    
こんにちは、こんばんは。
今回、いっきに二つ質問させて頂くのでとても長くなってしまうことを、先に言わせて頂きます。


CもSTGもヘタレ(初心者)なワタクシですが、自分で描いた「一枚絵」の自機を表示させながら龍神録を進めている途中の、『7章』と『9章』で困っています。


〜ソースコードの変更点〜

自機は、

  LoadDivGraph( "../dat/img/char/555[1].png" , 1 , 1 , 1 , 44 , 91 , img_ch[0] ) ;

で表示しています。


「GV.h」を

  //画像用変数宣言部
  GLOBAL int img_ch[1][1];   //「img_ch[2][12]」を「img_ch[1][1]」に

と変更。


また、「char.cpp」内「void calc_ch()」も、
  
  void calc_ch(){
    ch.cnt++;
    ch.img=(ch.cnt%24)/24;   //「(ch.cnt%24)/6;」を「(ch.cnt%24)/24;」に

の様にしてます。
これは、「void calc_ch()」を消すと、自機が点滅してしまうからです。


更に、同じ「char.cpp」内「void ch_move()」の、

  if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
         ch.img+=4*2;//画像を左向きに
     else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
         ch.img+=4*1;//画像を右向き

は"消して"います。一枚絵なので右向きとかはありませんからね。


と、以上の点が龍神録のソースと違うところです。
他には〜、無いと思ってますが、発見しだい報告します。


で、実際の困っている事ですが。


7章は「defile.h」の、
  //フィールドの広さ
  #define FIELD_MAX_X 384
  #define FIELD_MAX_Y 448
  //フィールドの左上の座標
  #define FIELD_X 32
  #define FIELD_Y 16
の部分の話だと思うのですが。ここで出てきた問題が、

「縦は平気なのですが、横の場合は『領域が設定されてないのか、横移動すると自機が画面外に出て行って表示されなくなって』しまう」

と更に、もう一つ。
「右に移動して、右側のボードと自機が触れ合うぐらいになると、『縦に移動できなくなって』しまう」

のです。



そして9章。
こちらは"低速移動"の時に、

「縦に移動する際のスピードが極端に遅くなる」
のと
「高速移動時に比べて、斜め移動する際の角度が少なくってしまっている」

が問題となっています。

下の問題は。たとえば高速移動時に斜めに「45度」移動しているとすると、低速移動時の場合は「30度」の方向に進んでしまっている。という感じです。




妙に長い上に読みにくく、稚拙な文章ですみませんでした。

ソースコードは何度も見直したり見比べたりしているので、写し間違い等は無いと思います。


なにとぞよろしくお願いします。


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


Name: ROM  ..ぴよぴよ(267ポイント)   Date: 2009/11/22(日) 01:17   No:42461     
Title: Re:改造龍神録:7章『フィールドの広さ』と9章『低速移動時』にて    
char.cppのvoid calc_ch()
if(CheckStatePad(configpad.left)>0)//左が押されていたら
ch.x-=3;//座標を左に
if(CheckStatePad(configpad.right)>0)//右が押されていたら
ch.x+=3;//座標を右に
を消しましょう
消してあるのであればもう一度ch_moveを見直してください
特に最後のfor文を。


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

Name: 藍霧00  ..ぴよぴよ(830ポイント)   Date: 2009/11/22(日) 23:38   No:42529 解決!     
Title: Re:改造龍神録:7章『フィールドの広さ』と9章『低速移動時』にて    
おお!!

両方とも解決しました。ありがとうございます。

これで先に進めます。


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



Name: オラウー  ..かけだし(2,485ポイント)   Date: 2009/11/22(日) 13:07   No:42476       
Title: 龍神録についてです    
龍神録プログラミングの13章のコードをコンパイルした
のですが

c:\project\1章\mydat\source\graph.cpp(27) : error C3861: 'graph_bullet': 識別子が見つかりませんでした

というエラーが出ます、どうすればいいでしょうか


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


Name: チルチル  ..比類無きプログラマー(79,156ポイント)   Date: 2009/11/22(日) 17:31   No:42494     
Title: Re:龍神録についてです    
graph.cppの中身を正規のものと見比べて抜けている所はありますか?

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

Name: オラウー  ..入門者(2,588ポイント)   Date: 2009/11/22(日) 17:49   No:42497     
Title: Re:龍神録についてです    
確認しましたが抜けているところはありませんでした
この正規のコードをコンパイルしてみたのですが
今度は新たに下のようなエラーがでました

enemy_act_pattern.obj : error LNK2005: "void __cdecl enemy_pattern0(int)" (?enemy_pattern0@@YAXH@Z) は既に enemy.obj で定義されています。

C:\project\1章\Debug\RyuJin.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。


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

Name: チルチル  ..比類無きプログラマー(79,350ポイント)   Date: 2009/11/22(日) 17:56   No:42498     
Title: Re:龍神録についてです    
抜けている所が無いのにエラーが変わりますか・・

見比べても全く同じでしょうか?


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

Name: オラウー  ..入門者(2,637ポイント)   Date: 2009/11/22(日) 18:39   No:42501     
Title: Re:龍神録についてです    
まったく同じです
チルチルさんのコードをそのままコンパイルしましたが
やっぱり上の二つのエラーがでます


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

Name: チルチル  ..比類無きプログラマー(79,427ポイント)   Date: 2009/11/22(日) 18:45   No:42504     
Title: Re:龍神録についてです    
前のエラーも残ってるんですか・・

まったく同じなのにエラーが変わるのは不可解ですが
元の方だと1個になるんですよね?

ちなみに
>龍神録プログラミングの13章のコードをコンパイルした
一括ダウンロードしたものですか?


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

Name: オラウー  ..入門者(2,841ポイント)   Date: 2009/11/22(日) 19:08   No:42505     
Title: Re:龍神録についてです    
いえ、チルチルさんのコードでコンパイルすると前のエラーは消える
のですが代わりに下二つのエラーが出ます

enemy_act_pattern.obj : error LNK2005: "void __cdecl enemy_pattern0(int)" (?enemy_pattern0@@YAXH@Z) は既に enemy.obj で定義されています。

C:\project\1章\Debug\RyuJin.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

プロジェクトは一括ダウンロードしたものです


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

Name: オラウー  ..入門者(2,882ポイント)   Date: 2009/11/22(日) 19:17   No:42506     
Title: Re:龍神録についてです    
ごめんなさい、enemy.cppに余計なコードが混じってたのでそれを
消したらエラーはなくなりました
しかしエラーはなくなったのですが、なぜか敵の弾幕がでないのです


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

Name: チルチル  ..比類無きプログラマー(79,540ポイント)   Date: 2009/11/22(日) 19:25   No:42507     
Title: Re:龍神録についてです    
enemy.cppが問題でしたか・・

・余計なコードとは具体的に何ですか?

・エラーが出ない今の状態で元のgraph.cppをコンパイルするとどうなりますか?

・一括ダウンロードしてからコンパイルまでに何かしましたか?

・敵の弾幕とはどれとどれですか?


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

Name: オラウー  ..入門者(3,900ポイント)   Date: 2009/11/22(日) 19:50   No:42509     
Title: Re:龍神録についてです    
enemy.cppに書き忘れのコードがあったのでそれも付け足しました


・余計なコードは以下のものです

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

//敵の移動パターン0での移動制御
void enemy_pattern0(int i){
int t=enemy[i].cnt;
if(t==0)
enemy[i].vy=2;//下がってくる
if(t==60)
enemy[i].vy=0;//止まる
if(t==60+enemy[i].wait)//登録された時間だけ停滞して
enemy[i].vy=-2;//上がっていく
}


・元のgraph.cppをコンパイルしたのですが

c:\project\1章\mydat\source\enemy.cpp(77) : error C3861: 'enter_shot': 識別子が見つかりませんでした
c:\project\1章\mydat\source\graph.cpp(26) : error C3861: 'graph_bullet': 識別子が見つかりませんでした

とでました

・一括ダウンロードしてからコンパイルまでには何もしてないです

>>・敵の弾幕とはどれとどれですか?
弾画像のファイルの事ですか
それなら以下の通りです

LoadDivGraph( "../dat/img/bullet/b0.png" , 5 , 5 , 1 , 76 , 76 , img_bullet[0] ) ;
LoadDivGraph( "../dat/img/bullet/b1.png" , 6 , 6 , 1 , 22 , 22 , img_bullet[1] ) ;
LoadDivGraph( "../dat/img/bullet/b2.png" , 10 , 10 , 1 , 5 , 120 , img_bullet[2] ) ;
LoadDivGraph( "../dat/img/bullet/b3.png" , 5 , 5 , 1 , 19 , 34 , img_bullet[3] ) ;
LoadDivGraph( "../dat/img/bullet/b4.png" , 10 , 10 , 1 , 38 , 38 , img_bullet[4] ) ;
LoadDivGraph( "../dat/img/bullet/b5.png" , 3 , 3 , 1 , 14 , 16 , img_bullet[5] ) ;
LoadDivGraph( "../dat/img/bullet/b6.png" , 3 , 3 , 1 , 14 , 18 , img_bullet[6] ) ;
LoadDivGraph( "../dat/img/bullet/b7.png" , 9 , 9 , 1 , 16 , 16 , img_bullet[7] ) ;
LoadDivGraph( "../dat/img/bullet/b8.png" , 10 , 10 , 1 , 12 , 18 ,img_bullet[8] ) ;
LoadDivGraph( "../dat/img/bullet/b9.png" , 3 , 3 , 1 , 13 , 19 , img_bullet[9] ) ;



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

Name: チルチル  ..比類無きプログラマー(79,946ポイント)   Date: 2009/11/22(日) 20:19   No:42512     
Title: Re:龍神録についてです    
>余計なコードは以下のものです

まあ確かにそれはenemy_act_pattern.cppの方で書くべきですね
しかしダウンロードした時点でenemy.cppにそれが書いてあるのはおかしいですね・・

では余計な部分はenemy_act_pattern.cppにも書いてあったんですよね?

あと正常に動いている私の方では#include "../include/GV.h"があるので
余計ではないと思いますが、何を持って余計だと判断したのでしょうか?

>元のgraph.cppをコンパイルしたのですが

エラーが増えるのも不可解ですね・・

試しに元の方から関数を私の方に1個ずつ置換して行ってエラーが変化するか見てみては?

>一括ダウンロードしてからコンパイルまでには何もしてないです

私の方でもやってみたんですが正常に動きました
そうなるとバージョンの変換時にデータが欠落するぐらいしか原因が浮かばないですね・・
環境は何でしょうか?

>敵の弾幕とはどれとどれですか?

あ〜そうではなくて弾幕番号です

何だか全体的にダウンロードしたファイルがおかしいですね
余計な部分があったらしいですが、私の方には無かったですし・・
ダウンロードしてから何もしてないのに内容が違うと言うのは結構重大な問題ですね

と言うより13章をコンパイルしているのに「c:\project\1章\mydat...」と出るのは何でですか?

それから他の章は全部コンパイル通るのでしょうか?


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

Name: オラウー  ..入門者(3,199ポイント)   Date: 2009/11/22(日) 21:07   No:42516     
Title: Re:龍神録についてです    
>しかしダウンロードした時点でenemy.cppにそれが書いてあるのはおかしいですね・・

いえ、ダウンロードしたとき既に書いてあったのではなく11章にenemy.cppにこう書くよう
指示があったので自分で書きました

>あと正常に動いている私の方では#include "../include/GV.h"があるので
余計ではないと思いますが、何を持って余計だと判断したのでしょうか?

ごめんなさい、#include "../include/GV.h"は間違えてこの掲示板
に書きこんでしましました

>試しに元の方から関数を私の方に1個ずつ置換して行ってエラーが変化するか見てみては?
やってみますね

環境はVisualStudio2008です

弾幕番号はshot[n].numのことですか、
もしnにはいるのが番号ならnとしか書いてないです


>何だか全体的にダウンロードしたファイルがおかしいですね
余計な部分があったらしいですが、私の方には無かったですし・・
ダウンロードしてから何もしてないのに内容が違うと言うのは結構重大な問題ですね
と言うより13章をコンパイルしているのに「c:\project\1章\mydat...」と出るのは何でですか?
それから他の章は全部コンパイル通るのでしょうか?


僕の説明が悪かったです
ダウンロードした13章自体はコンパイルしても正常に動きます
ですので内容はまったく一緒です
自分は第一章のフォルダのRyuJin.slnでこのサイトの
龍神録プログラミングの館の章を順番に見ながら
載っているコードをコンパイルしています

他の章はコンパイルは通ります

実に紛らわしい説明をして話を難しくしてすいません


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

Name: チルチル  ..比類無きプログラマー(80,082ポイント)   Date: 2009/11/22(日) 21:26   No:42519     
Title: Re:龍神録についてです    
あ〜なるほど、そういえば龍神録の館はそういう流れでしたね・・

だとすると解決方法は1つですね
13章のソース&ヘッダの中身で1章のソース&ヘッダの中身を1個ずつ上書きして
変化があった所はどこが違うのか見比べてください
次のを上書きする時は今のを元に戻した方が良いでしょうかね・・

そういえば過去ログで
「館の指示通りに作っても説明漏れがあるので最終的に60章と同じにはならない」
と言う話しがあったような気がするので
どうしてもうまく行かなかったら13章の方を使った方が良いかもしれません


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

Name: オラウー  ..入門者(3,213ポイント)   Date: 2009/11/22(日) 21:30   No:42520 解決!     
Title: Re:龍神録についてです    
解決しました、
13章のソースを見ながらいろいろ書き換えました
大変長い時間親切に教えてくれてありがとうございました


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



Name: TKOZ  ..プログラマー(38,646ポイント)   Date: 2009/11/22(日) 17:20   No:42492       
Title: 自作関数SetDrawの調子がおかしいです。    
ファミコンゲームをcc65で作っているTKOZです。
今回は、オセロゲームのBG書き換えの仕方について質問です。
BG書き換えは以下の関数で可能だと思うのです。
しかし、オセロのテーブルがうまく描画されず、
どうして、画面が上手く書き換わらないのですか?

もしかして、c言語以前の問題かもしれませんが、よろしくお願いします。

void SetDraw(char x,char y,char number)
{
int adr;
adr = (y-1)*32+x;
*(char*)0x2006 = 0x20+adr/256;
*(char*)0x2006 = adr;

*(char*)0x2007 = number;
}
void SetTable(char x,char y)
{
SetDraw(x,y,0x01);
SetDraw(x+1,y,0x02);
SetDraw(x,y+1,0x11);
SetDraw(x+1,y+1,0x12);
}

void Title(char *GameMode)
{
char i,j;
static char prev=0;

if((Pad & START) && !prev){


*(char*)0x2006=0x20;
*(char*)0x2006=0x00;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
SetTable(i*2,j*2);
}

*GameMode=GAME;
}
prev=(Pad & START);
}


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


Name: TKOZ  ..プログラマー(38,660ポイント)   Date: 2009/11/22(日) 17:21   No:42493     
Title: Re:自作関数SetDrawの調子がおかしいです。    
分かりにくいと思うので、ソースはこちらにアップしときます。

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

Name: TKOZ  ..プログラマー(38,736ポイント)   Date: 2009/11/22(日) 20:55   No:42515 解決!     
Title: Re:自作関数SetDrawの調子がおかしいです。    
すみません、自己解決しました。ご協力ありがとうございました。



Name: Ω  ..入門者(4,896ポイント)   Date: 2009/11/20(金) 21:53   No:42390       
Title: 弾の描画について 2    
※前にも同じようなのを投稿してるので「2」です。解決した板で話すのもどうかと思い・・・

現在小さなシューティングを作ってます。少し前までは弾は絵で描画してましたが、
当たり判定でいろいろ面倒なので、「DrawCircle」で描画することにしました。しかし、
なぜか敵の弾が規則的・瞬間的にでかくなります。代入位置とかいろいろ試してみましたが
検討がつきません。誰かお願いします。  以下プログラム

#include "DxLib.h"

#define Z_image 2 //自機画像の数 2
#define T_image 2 //敵機画像の数 2
#define Tamax 50 //弾の最大数 50
#define Zhp 100 //自機のHP 100
#define Thp 50 //敵機のHP 50
#define T_Speed 20 //自弾の速度 20
#define Teki_Speed 10 //敵弾の速度 15

typedef struct{
int x,y,hp,Mhp,Range; }Ziki_date;
typedef struct{
int x,y,hp,Mhp,Range; }Teki_date;
typedef struct{
int x,y,Flag,Range; }Tama_date;
typedef struct{
int x,y,TFlag,Range; }T_Tama_date;

char Key[256];
int count=0,C=0,TC=0;

Ziki_date Ziki;
Teki_date Teki[20];
Tama_date Tama[Tamax];
T_Tama_date T_Tama[Tamax];

//ここから関数宣言――――――――――――――――
//この辺Fps設定 長いので切る
//――――――――――――――――――――――――

int Seach_Tama(){ //使われてない弾のサーチ
int i;
for(i=0; i<Tamax; i++){
if(Tama[i].Flag==0)
return i;
}
return -1;
}

//――――――――――――――――――――――――

int Seach_T_Tama(){ //使われてない敵弾のサーチ
int i;
for(i=0; i<Tamax; i++){
if(T_Tama[i].TFlag==0)
return i;
}
return -1;
}

//――――――――――――――――――――――――

void Shot_Tama(){        //自機     
int i;
if(C<5)C++; //もしCが5以下だったらCに+1
else if(Key[KEY_INPUT_Z]==1){ //↑でCが5以上になったら起動
C=0;
if((i=Seach_Tama())!=-1){
Tama[i].Flag=1; //フラグを立てる
Tama[i].x =Ziki.x; //自機の座標代入
Tama[i].y =Ziki.y;
Tama[i].x +=7;
Tama[i].y +=10; //弾のx・y軸補正
}
}
}

//――――――――――――――――――――――――

void Shot_T_Tama(){          //敵機
int i;
if(TC<5)TC++;
else if(Teki[0].x>0){ //Tekiのx座標が0以上だった時起動
TC=0;
if((i=Seach_T_Tama())!=-1){
T_Tama[i].TFlag=1; //フラグを立てる
T_Tama[i].x =Teki[0].x; //自機の座標代入
T_Tama[i].y =Teki[0].y;
T_Tama[i].x +=7; //弾のx軸補正
T_Tama[i].y +=8; //弾のy軸補正
}
}
}

//――――――――――――――――――――――――

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

Ziki.x =320; //自機に座標を代入
Ziki.y =240;
Ziki.hp =Zhp;           //自機のHP
Ziki.Mhp=Zhp;
Teki[0].x =640;
Teki[0].y =120;
Teki[0].hp =Thp;
Teki[0].Mhp=Thp;

int Ziki_image[Z_image],Teki_image[T_image],Count; //自機画像を入れる箱とCountを宣言
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

/////////////////////////////////////////////////////////////////////////

SetDrawScreen(DX_SCREEN_BACK); //裏画面に設定
LoadDivGraph("Ziki.png",2,2,1,20,26,Ziki_image); //画像を読み込ませる
LoadDivGraph("Teki.png",2,2,1,20,26,Teki_image);

for(int i=0; i<Tamax; i++){
Tama[i].Flag =0;
Tama[i].x =Ziki.x;
Tama[i].y =Ziki.y;
T_Tama[i].TFlag=0;
T_Tama[i].x =Teki[0].x;
T_Tama[i].y =Teki[0].y;
}

/////////////////////////////////////////////////////////////////////////

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){

Ziki. Range=6;
Tama[Tamax]. Range=2;
Teki[0]. Range=6;
T_Tama[Tamax].Range=2;

fps(); //fpsを固定&表示
count++;
wait_fanc();

if(Teki[0].x> -30)Teki[0].x-=10;
if(Teki[0].x==-30)Teki[0].x=800;

if(Key[KEY_INPUT_LEFT]==1)
Ziki.x-=4;
//↑と似たような移動定義があと3つ

Shot_Tama();
for(int i=0; i<Tamax; i++){
if(Tama[i].Flag==1){
if(Tama[i].y>0)Tama[i].y-=T_Speed;
else Tama[i].Flag=0;

DrawCircle(Tama[i].x,Tama[i].y,Tama[Tamax].Range,GetColor(0,255,255),TRUE);
}
}

Shot_T_Tama();
for(int i=0; i<Tamax; i++){
if(T_Tama[i].TFlag==1){
if(T_Tama[i].y<500)T_Tama[i].y+=Teki_Speed;
else T_Tama[i].TFlag=0;

DrawCircle(T_Tama[i].x,T_Tama[i].y,T_Tama[Tamax].Range,GetColor(255,50,0),TRUE);
}
}
DrawGraph (Ziki.x,Ziki.y,Ziki_image[0],TRUE );
DrawGraph (Teki[0].x,Teki[0].y,Teki_image[0],TRUE);
ScreenFlip();
}

/////////////////////////////////////////////////////////////////////////
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}



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


Name: チルチル  ..比類無きプログラマー(78,247ポイント)   Date: 2009/11/22(日) 02:09   No:42462     
Title: Re:弾の描画について 2    
DrawCircle(T_Tama[i].x,T_Tama[i].y,T_Tama[Tamax].Range,GetColor(255,50,0),TRUE);

ここのT_Tama[Tamax].Rangeの所でTamaxを使っているからじゃないですか?


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

Name: Ω  ..初心者(5,002ポイント)   Date: 2009/11/22(日) 11:47   No:42471     
Title: Re:弾の描画について 2    
直してみましたが、今度は弾が小さくなり、ですがバグは直りませんでした。
他の Tama[i] の所を Tama[Tamax] にしてみたりしましたが、変化なしでした。
支障がなければ数字にする手もあるんですが、どうでしょうか?


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

Name: Cry  ..ぴよぴよ(108ポイント)   Date: 2009/11/22(日) 12:41   No:42474     
Title: Re:弾の描画について 2    
Tama[Tamax].RangeとかT_Tama[Tamax].Range
とアクセスしていますが数字に直すと
Tama[50].RangeとT_Tama[50].Range
としてるので配列のオーバーアクセスです。(宣言文でTama[50]だからTama[0 〜 49]までです。T_Tamaも同じく)

あとTeki_Speedの定義文がコメントと違っていますよ。


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

Name: Ω  ..初心者(5,055ポイント)   Date: 2009/11/22(日) 19:53   No:42510 解決!     
Title: Re:弾の描画について 2    
返答ありがとうございます。
Tama[Tamax] を Tama[0(数字)] にしたら直りました。

>>コメント
うっかりしてました。指摘ありです。


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



Name: post  ..ぴよぴよ(174ポイント)   Date: 2009/11/19(木) 15:18   No:42323       
Title: 自機ショットオプションの動きを作りたい    
【東方永夜抄→ttp://www16.big.or.jp/~zun/html/game.html】の「幻想の結界チーム「八雲紫」」
のオプションと同じ動きを再現したいと思っています。
オプションから発射されている弾ではなくて、オプション自体の動きです。

動きとしては、
1:自機の一定範囲に近づく敵を追尾させる
2:追尾目的箇所に近づくにつれて減速させる
3:追尾のタイミングを少しずらす

2,3の計算方法が解らなくて困っています。
3はボス戦だとよくわかるのですが、ボスが移動すると少し遅れる感じで追尾しています。

すごく悩んでいます。ご教授お願いします。


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


Name: チルチル  ..比類無きプログラマー(79,321ポイント)   Date: 2009/11/22(日) 17:35   No:42496     
Title: Re:自機ショットオプションの動きを作りたい    
>2:追尾目的箇所に近づくにつれて減速させる

本家に近づけるには試行錯誤が必要ですが
手っ取り早いのは物理的計算ではないでしょうか?

>3:追尾のタイミングを少しずらす

追尾の速度自体を下げるか
残像させる時のように敵の少し前の座標を記録しておくのはどうですか?


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +