C言語何でも質問掲示板

Total hit  今日  昨日  



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

 
   割れたように絵を分割 ....   
     ・[39683] Justy 
     ・[39714] 山崎 
   マウスクリックでボタ ....   
     ・[39706] koburouuu 
     ・[39709] kazuoni 
     ・[39710] kazuoni 
   セーブさせるには   
     ・[39567] kazuoni 
     ・[39574] koburouuu 
     ・[39595] kazuoni 
     ・[39605] koburouuu 
     ・[39607] koburouuu 
     ・[39608] koburouuu 
     ・[39614] kazuoni 
     ・[39615] koburouuu 
     ・[39699] koburouuu 
   自動化ソフトの作り方   
     ・[39673] 御津凪 
     ・[39696] sun 
   ダウンロードしたプロ ....   
     ・[39556] kazuoni 
     ・[39678] natu 
     ・[39684] natu 
   20章について   
     ・[39659] Dixq (管理人) 
     ・[39664] ft 
   ゲームのシステムにつ ....   
     ・[39649] mnkr 
     ・[39650] Justy 
     ・[39651] チルチル 
     ・[39653] Ones 
     ・[39654] sage 
     ・[39655] Ones 
     ・[39658] Dixq (管理人) 
     ・[39661] Ones 
   ロード中のアニメーシ ....   
     ・[39565] バグ 
     ・[39570] zwi 
     ・[39572] Ma 
     ・[39585] Dixq (管理人) 
     ・[39587] Justy 
     ・[39590] lbfuvab 
     ・[39593] Justy 
     ・[39602] Ma 
     ・[39617] Justy 
     ・[39625] Ma 
     ・[39638] situmon 
     ・[39656] Ma 
   ウィンドウが非アクテ ....   
     ・[39640] yu 
     ・[39647] Oip 
   PSRL(W)の挙動について ....   
     ・[39633] Justy 
     ・[39636] kazuoni 
     ・[39637] sizuma 
   cppファイルとhファイ ....   
     ・[39611] ねこ 
     ・[39613] チルチル 
   循環リストについてな ....   
     ・[39535] kazuoni 
     ・[39539] ひよこ 
     ・[39541] kazuoni 
     ・[39543] ひよこ 
     ・[39544] ひよこ 
     ・[39548] ひよこ 
     ・[39557] kazuoni 
     ・[39562] ひよこ 
     ・[39566] kazuoni 
     ・[39577] ひよこ 
     ・[39579] kazuoni 
     ・[39584] ひよこ 
     ・[39597] kazuoni 
     ・[39603] ひよこ 
     ・[39604] kazuoni 
     ・[39609] ひよこ 
   DirectXでカメラ視点を ....   
     ・[39364] でんすけ 
     ・[39370] Justy 
     ・[39377] でんすけ 
     ・[39568] 問い合わせ 
     ・[39606] 問い合わせ  
   placement newの再配置 ....   
     ・[39596] Justy 
     ・[39598] array 
     ・[39599] YuO 
     ・[39601] array 
   ボスの最大弾幕回数を ....   
     ・[39270] situmon 
     ・[39307] kai 
     ・[39506] kai 
     ・[39524] yu 
     ・[39594] kai 
   リプレイ実装の際の乱 ....   
     ・[39542] nayo 
     ・[39576] mugi 
     ・[39592] mugi 
   画像の表示がうまくい ....   
     ・[39555] kazuoni 
     ・[39558] mik 
     ・[39563] conio 
     ・[39591] mik 
   初歩的な質問すみませ ....   
     ・[39554] kazuoni 
     ・[39589] 鈴仙優曇華院イナバ 
   実行時の階層の設定方 ....   
     ・[39583] Justy 
     ・[39586] チルチル 
   unique関数について   
     ・[39580] MNS 
     ・[39582] dic 
   メニュー選択画面につ ....   
     ・[39449] s-rush 
     ・[39489] 茶くれ爺 
     ・[39521] Ace 
     ・[39526] 茶くれ爺 
     ・[39528] Mato 
     ・[39536] conio 
     ・[39550] 茶くれ爺 
     ・[39575] s-rush 
   たびたびすいませんが ....   
     ・[39340] ねこ 
     ・[39341] conio 
     ・[39571] マウ 
   適当にいじってたら出 ....   
     ・[39316] Dixq (管理人) 
     ・[39320] でんすけ 
     ・[39322] situmon 
     ・[39324] でんすけ 
     ・[39329] ひよこ 
     ・[39331] でんすけ 
     ・[39337] situmon 
     ・[39353] ひよこ 
     ・[39450] Tatu 
     ・[39569] situmon 
   WINAPIで加算減算ブレ ....   
     ・[39286] Justy 
     ・[39287] kazuoni 
     ・[39290] Justy 
     ・[39355] kazuoni 
     ・[39359] 御津凪 
     ・[39515] kazuoni 
     ・[39520] Justy 
     ・[39551] kazuoni 
     ・[39560] Justy 
   自機が勝手に被弾扱い ....   
     ・[39426] pooka 
     ・[39538] yrao 
   Visual studio2005のプ ....   
     ・[39532] 小夜 
     ・[39534] SB 
     ・[39537] 小夜 
   敵が出てきません!   
     ・[39507] mnkr 
     ・[39509] 小夜 
     ・[39510] mnkr 
     ・[39513] 小夜 
     ・[39516] mnkr 
     ・[39517] mnkr 
     ・[39523] でんすけ 
     ・[39533] 小夜 
   双方向リストの課題   
     ・[39470] non 
     ・[39494] 初心者 
     ・[39505] non 
     ・[39512] box 
     ・[39514] 初心者 
     ・[39518] Ace 
     ・[39525] 初心者 
     ・[39530] 初心者 
   プログラムとは関係の ....   
     ・[39511] Justy 
     ・[39522] でんすけ 
   再描画がされない理由   
     ・[39476] Ace 
     ・[39479] Justy 
     ・[39481] uwlover 
     ・[39482] Justy 
     ・[39498] Ace 
     ・[39508] uwlover 
   doubleの比較について   
     ・[39499] box 
     ・[39500] Ace 
     ・[39501] えーや 
     ・[39502] MNS 
   10章でつまづいていま ....   
     ・[39484] 小夜 
     ・[39487] 小夜 
     ・[39488] でんすけ 
     ・[39490] 小夜 
     ・[39491] でんすけ 
     ・[39492] MNS 
     ・[39496] 小夜 
     ・[39497] Tatu 
   ライブラリの競合につ ....   
     ・[39493] nayo 
   はじめまして   
     ・[39478] Ace 
     ・[39480] Mist 
     ・[39486] ナイス総理大臣 
   C++ 定義されていない ....   
     ・[39462] ねこ 
     ・[39464] MNS 
     ・[39465] Justy 
     ・[39466] yu 
     ・[39467] yu 
     ・[39468] MNS 
     ・[39472] yu 
   5章でつまづいていま ....   
     ・[39432] でんすけ 
     ・[39445] 小夜 
     ・[39446] でんすけ 
     ・[39453] 小夜 
     ・[39455] Tatu 
     ・[39456] 小夜 
     ・[39457] Justy 
     ・[39458] Tatu 
     ・[39459] Tatu 
     ・[39460] Justy 
     ・[39461] 小夜 
   無題   
     ・[39452] でんすけ 
   自機の当たり判定とメ ....   
     ・[39419] situmon 
     ・[39447] kyamori 
   3Dダンジョンタイピン ....   
     ・[39440] mnkr 
     ・[39442] Tatu 
     ・[39443] てつ 
   選択画面   
     ・[39354] kazuoni 
     ・[39365] ディア 
     ・[39369] でんすけ 
     ・[39388] kazuoni 
     ・[39441] ディア 
   終了するとエラー   
     ・[39434] MNS 
     ・[39435] situmon 
     ・[39436] situmon 
     ・[39437] ねこ 
     ・[39438] Justy 
     ・[39439] situmon 
   インベーダーゲームを ....   
     ・[39400] ねこ 
     ・[39402] TKOZ 
     ・[39404] MNS 
     ・[39405] TKOZ 
     ・[39408] TKOZ 
     ・[39411] バグ 
     ・[39413] TKOZ 
     ・[39418] MNS 
     ・[39430] TKOZ 
   コンソールとWindowsア ....   
     ・[39424] Justy 
     ・[39425] Mist 
     ・[39427] たかぎ 
     ・[39428] MNS 
   クラスメソッドの並列 ....   
     ・[39415] Justy 
     ・[39416] nayo 
   7章について   
     ・[39345] あ〜る 
     ・[39346] 此ノ夜 
     ・[39347] あ〜る 
     ・[39348] 此ノ夜 
     ・[39349] あ〜る 
     ・[39350] 此ノ夜 
     ・[39356] conio 
     ・[39357] mats 
     ・[39385] 此ノ夜 
     ・[39386] MNS 
     ・[39387] 此ノ夜 
     ・[39401] MNS 
     ・[39406] Tatu 
     ・[39414] 此ノ夜 
   座標と除算   
     ・[39412] MNS 
   【龍神録プログラミン ....   
     ・[39394] kazuoni 
   マップの当たり判定   
     ・[39374] garugaru 
     ・[39393] kazuoni 

Name: 山崎  ..プログラマー(26,952ポイント)   Date: 2009/09/27(日) 18:29   No:39676       
Title: 割れたように絵を分割、新たなグラフィックハンドルを作る    
毎度お世話になっております、山崎です。
今回は、グラフィックを分割する方法についてお伺いに参りました。

現在、「物が割れて砕け散る」というプログラムを作ろうとしております。
添付した画像のように、一枚のグラフィックを割れたように分割して、
かけらのような複数のグラフィックを新たに作りたいと考えています。
このとき、割れ方の中心はXとYで指定した座標で、
いくつのグラフィックに分割されるかも指定できるようにしたいと考えています。(3〜7枚程度に)
割れ方の方向(亀裂の角度)も割れるたびにランダムにしたいと思っています。

そこで、どうやって実現しようと思い悩んだ末私が考えたのが、
@LoadSoftImageで分割したいイメージを読みこんでおく。このイメージをAとします。
 分割後のイメージ用にMakeARGB8ColorSoftImageで分割数だけハンドルを用意。これらをBとします。
A亀裂の直線の式を求め、DrawPixelSoftImageでAに亀裂の中心からイメージの端まである色で線を引いておく。
BGetPixelSoftImageでAの左上のピクセルから順に色を取得していき、
取得した色をBの同じ座標にDrawPixelSoftImageで書き込んでいく。
このとき、取得した色がさきほどDrawPixelSoftImageで線を引いた際の色ならば
そこからは違うBに色を写していく。

実際にこのアルゴリズムをコーディングしてみたところ、
分割したい画像に線を引くところまではできたのですが、
どの画素をどのイメージハンドルに写すのか?という判別の方法がわからず、
頓挫してしまいました。

添付した画像のように、あるひとつのグラフィックを
割れたように複数のグラフィックに分割する方法はどういったものがあるでしょうか。
私が挙げた方法にはこだわっておりません。
また、このグラフィックの分割を1フレームで行いたいと思っているのですが、可能でしょうか。


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


Name: Justy  ..伝説なるハッカー(431,391ポイント)   Date: 2009/09/27(日) 19:49   No:39683     
Title: Re:割れたように絵を分割、新たなグラフィックハンドルを作る    

>添付した画像のように、あるひとつのグラフィックを
>割れたように複数のグラフィックに分割する方法はどういったものがあるでしょうか

 同じくらい面倒かもしれませんが、DrawPolygon / DrawPolygonBaseで数分だけ分割して、
それぞれを空ハンドルに描画、でどうでしょう?


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

Name: 山崎  ..プログラマー(27,107ポイント)   Date: 2009/09/28(月) 08:17   No:39714     
Title: Re:割れたように絵を分割、新たなグラフィックハンドルを作る    
>Justyさん
ご返信、誠にありがとうございます。

ただいま、JustyさんのDrawPolygonを使った方法を試そうとしております。
しかしなぜか、ポリゴンに貼り付けるグラフィックを指定すると
ポリゴンが表示されないという状況に陥っており、
本家DXライブラリの掲示板の方で質問させて頂いています。

Justyさんの方法を実装できるのは少し先になりそうです。
お教えいただきありがとうございました。


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



Name: うすさく  ..ぴよぴよ(38ポイント)   Date: 2009/09/28(月) 00:48   No:39705       
Title: マウスクリックでボタンを押したい    
はじめて投稿させて頂きます、プログラム初心者です。
C言語での質問です。

例えば、RPGにあるメニューコマンドのような"ボタン"を
キーボードではなくマウスクリックで押すことができるように
したいのですが、どんなやり方があるでしょうか?

ボタン画像の位置を指定して、ボタン画像の幅*長さの範囲で
マウスクリックされた時にイベントが起こる、というものを
考えてはいるのですが、何かしっくりこないような。。。

他にもっといい方法があるようでしたら教えてください。


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


Name: koburouuu [URL]  ..かけだし(1,219ポイント)   Date: 2009/09/28(月) 01:00   No:39706     
Title: Re:マウスクリックでボタンを押したい    
ゲームプログラミングの館の40a章を使ってみてはどうでしょう。

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

Name: kazuoni [URL]  ..ハッカー(109,641ポイント)   Date: 2009/09/28(月) 01:59   No:39709     
Title: Re:マウスクリックでボタンを押したい    
C言語+winapiでやると仮定します。

>ボタン画像の位置を指定して、ボタン画像の幅*長さの範囲で
>マウスクリックされた時にイベントが起こる

自作ならば、基本、それでいいと思います。
winapiならばウィンドウプロシージャで
case WM_LBUTTONDOWN:

x = LOWORD(lp);
y = HIWORD(lp);


とでも簡単にクリックされた時の座標を取得できます。

自作に魅力を感じない(?)時には
CreateWindowで子ウィンドウとして作成すれば、
ウィンドウズでよく見るボタンができますよ。


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

Name: kazuoni [URL]  ..ハッカー(109,701ポイント)   Date: 2009/09/28(月) 02:02   No:39710     
Title: Re:マウスクリックでボタンを押したい    
あ、http://www.play21.jp/board/formz.cgi?action=res&resno=39672&page=&id=dixq&rln=39696
でも同じような話題が・・・


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



Name: koburouuu [URL]  ..ぴよぴよ(5ポイント)   Date: 2009/09/24(木) 02:13   No:39561       
Title: セーブさせるには    
セーブデータを作って保存させるプログラムソースがt1でありますよね。あれってどうやって前のソースとくっつけるのですか?それと33とt1を関連づけたいのですが、、、33からt1みたいな指令はどのような形になりますか?

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


Name: kazuoni [URL]  ..ハッカー(107,669ポイント)   Date: 2009/09/24(木) 10:11   No:39567     
Title: Re:セーブさせるには    
>33からt1みたいな指令

書き方ってことですか?
例えばですが、以下みたいに切り替えるとかですかね。

switch(main_flag)

{
case 0:
if(menu()) // メニュー画面
main_flag=1; // 選択されたらメインフラグ切り替え
break;
case 1:
if(save()) // セーブ画面
main_flag=2; // セーブ終了したらメインフラグ切り替え
break;
case 2:
....
}


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

Name: koburouuu [URL]  ..ぴよぴよ(89ポイント)   Date: 2009/09/24(木) 12:20   No:39574     
Title: Re:セーブさせるには    
そんな感じです。
仮にメインメニューを33だとするとニューゲームのところでエンターを押すとゲームがすぐににスタートされ、ある章をクリアしたらセーブしますか?と出てきます。それでセーブした後終了して再会するときメインメニューを表示させるようなものを教えてください。


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

Name: kazuoni [URL]  ..ハッカー(108,297ポイント)   Date: 2009/09/24(木) 23:16   No:39595     
Title: Re:セーブさせるには    
とりあえず、文字列を編集するらしきものを作ってみました。
FPS.cpp
FPS.h
Button.cpp
Button.h
は無視してください。
今回はロードとセーブ回答の中心なので。
以前にボタンクラスを生成したものをそのまま流用しているので、
本題とは無縁な行が増えてしまいましたが・・・。

見てほしいのは
main関数 // Menu,mainFun関数の分岐
Menu関数 // はじめから、つつきから(ロード)、終わりの分岐
mainFunc関数 // 文字列の編集、文字列のセーブ、メニュー(Menu)に戻るの分岐
です。

コメントだけみればとりあえずの内容は把握できます。
mainFuncの中での文字列(入力)の処理はパスしてください。
(本題と関係ないので)

とりあえず、Buttonの仕様だけ書いときます。
基本、Button::Update(int *Key)とvoid Button::Draw()の二つです。
生成されている分だけ、押された、選択されているの監査をUpdateで行っています。
これはボタンがあるときは毎ループ読んでください。
あとちょっと注意ですが、例えば、
・メニュー画面でボタン3つ
・ゲーム画面でボタン5つ
とし、メニュー画面→ゲーム画面と進む時に、
メニュー画面のボタンをDeleteし忘れると、
ゲーム画面ではボタンが8つとカウントされてしまい、
恐らくどこかで止まります^^;
自動解放等はしてませんのであしからず。。

Updateで戻り値が-1以外の時は、押されたボタン番号が返ってきます。

また、Drawでボタンの描写をします。選択されていれば
枠が赤で塗りつぶされて表示されます。

↑は別に理解しなくていいです。
恐らく理解しがたいですから^^;
用は、Updateを毎ループ読んで、ボタンの状態を監査し、
Drawでボタンを描写している
だけ理解しておけばokです。


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

Name: koburouuu [URL]  ..ぴよぴよ(105ポイント)   Date: 2009/09/25(金) 09:04   No:39605     
Title: 無題    
実践してみたいと思います。

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

Name: koburouuu [URL]  ..ぴよぴよ(193ポイント)   Date: 2009/09/25(金) 14:55   No:39607     
Title: わかりません・・・    
Buttonの仕様は分かりました。

しかし、

編集するらしきものの 
main関数
Menu関数
mainFunc関数
をどこに入力すればいいか
分かりません。
下にファイルをアップするので見てください。
順番はそのままでつなげたいと思っています。


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

Name: koburouuu [URL]  ..ぴよぴよ(211ポイント)   Date: 2009/09/25(金) 15:07   No:39608     
Title: 下    
編集-つなげ方を教えてください。

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

Name: kazuoni [URL]  ..ハッカー(108,670ポイント)   Date: 2009/09/25(金) 21:35   No:39614     
Title: Re:下    
作っておいていうのもなんですが・・・
ボタンクラスは使わないほうがいいです。
あくまで見るだけということで^^;
理由は、今の段階では必要ないと思うので。
また、他人の書いたコードは理解するのにかなり苦労します。
もちろん、自分のものも然りです。
自分がなぜ↑にUPしたのかというと、
流れを見てほしかっただけなんです。
main関数
Menu関数
mainFunc関数
すべて同様です。
なので、組み換えやすいようには作っていません。
コピペはやめたほうが良いです。
あとあと詰まります。おそらく。

test.cppを見ましたが、プログラミングは始めたばかりですか?
・同じファイルで3回もDxLib.hをインクルードしている
・同じファイルにWinMainが数回宣言されている
あたりから見て判断しました。
一気にやろうとしないで、まずひとつづつやっていきましょう。
選択画面が作れた(33章)ということですので、
次に選んだらそれぞれの関数に飛ぶことをやってみてください。

重ねて言いますが、「私が作ったコードのコピペはやめたほうがいいです」
本当に困惑させてしまいすみません・・・。


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

Name: koburouuu [URL]  ..ぴよぴよ(397ポイント)   Date: 2009/09/25(金) 22:14   No:39615 解決!     
Title: ありがとうございます    
分かりました。
コピペは止めます。
ただの参考にします。

プログラミングは本当にはじめてで超初心者です。
友達をびっくりさせてやりたいと思って本格的に取り組みました。
関数などについては初めて手をつけますから・・・。


#が頭に付く列は最初だけというのは分かったんですけど
#のあとボタン数を設定されていたので消すと動かなくなるかと思ってそのままにしときました。
それと、一番最初に超初心者ということを言わなくてすいませんでした。


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

Name: koburouuu [URL]  ..ぴよぴよ(896ポイント)   Date: 2009/09/27(日) 23:25   No:39699     
Title: cpp    
私のcppファイルを見たい人は上の投稿から探してください。
最新の投稿は別のほうにあります。


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



Name: sun [URL]  ..ぴよぴよ(249ポイント)   Date: 2009/09/27(日) 17:42   No:39672       
Title: 自動化ソフトの作り方    
はじめまして。
まだまだ初心者ですが、調子に乗って「Free Macro!」のような自動化ソフトが作ってみたいと思っています。

しかし、
  「キーが押されたことにする方法」
  「マウスの座標を受け取る方法」
という最も重要なことが何一つわかっていませんww

無謀なことはわかっています。しかし、これからの自信とモチベーションの為にも、作ってみたいと思っています。


ネットでも調べようにもどういうキーワードを使えばいいのかわかりませんでした。


お手数をおかけしますが、よろしくお願いします。m(_ _)m


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


Name: 御津凪 [URL]  ..ハッカー(114,381ポイント)   Date: 2009/09/27(日) 17:50   No:39673     
Title: Re:自動化ソフトの作り方    
> 「キーが押されたことにする方法」

SendInput か、keybd_event で検索すれば使い方はわかると思います。
(これらは関数名です)
SendInput 関数でマウスを操作することもできます。

> 「マウスの座標を受け取る方法」

これは GetCursorPos 関数を使います。
こちらも同様に関数名で検索すれば使い方を調べることが出来ます。

※ ほとんどの検索サイトでは、検索オプションがあるので、目的のものが見つからない場合は、それを駆使してみるのもいいと思います。


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

Name: sun [URL]  ..ぴよぴよ(302ポイント)   Date: 2009/09/27(日) 22:52   No:39696 解決!     
Title: Re:自動化ソフトの作り方    
回答ありがとうございます!

検索オプション、いいですね。
それも使って、また調べてみます^^


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



Name: natu  ..ぴよぴよ(856ポイント)   Date: 2009/09/22(火) 16:11   No:39469       
Title: ダウンロードしたプログラムについて    
久し振りにプログラミングを始めようと思い、こちらで公開されているサンプルプログラムをダウンロードし、VC++ 2008EEで数か月ぶりにデバッグをしたところ、小窓が出た後、黒い画面のままなにも起きず、
画面が乱れた後、  
  RyuJin.exe の 0x75e39b30 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x055d8000 に書き込み中にアクセス違反が発生しました。 
  と表示されるのですがどうすればいいのでしょうか?数か月前と違うのはグラフィックボードを付け変えたことだと思うのですが...まだプログラミングは始めたばかりでまともに組めないです。osはwindowsVistaです。


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


Name: kazuoni [URL]  ..ハッカー(107,073ポイント)   Date: 2009/09/24(木) 00:13   No:39556     
Title: Re:ダウンロードしたプログラムについて    
どこのコードを抜粋しましたか?

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

Name: natu  ..ぴよぴよ(891ポイント)   Date: 2009/09/27(日) 18:54   No:39678     
Title: Re:ダウンロードしたプログラムについて    
ダウンロードして実行したものすべてに同じエラーが出ているんです。

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

Name: natu  ..ぴよぴよ(914ポイント)   Date: 2009/09/27(日) 19:53   No:39684     
Title: Re:ダウンロードしたプログラムについて    
28章を実行してエラーが起こるとはこんな風になるんです。ただ新しく作ったものやDXライブラリの中にあったサンプルプログラムはなにも問題なく実行できるんです。

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



Name: ft  ..ぴよぴよ(8ポイント)   Date: 2009/09/26(土) 20:48   No:39634       
Title: 20章について    
背景の流れる速度をもう少し遅くしたり、
妖々夢の1面の入りのように若干右からカメラを移動させてみたのですが、
どうのようにすればいいのでしょうか?
よろしくお願いします


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,059,511ポイント)   Date: 2009/09/27(日) 09:50   No:39659     
Title: Re:20章について    
>背景の流れる速度をもう少し遅くしたり、

背景の描画を始める基準点の移動をゆっくりにすればいいだけです。
今基準点がyだとして

y += 1;

のように設定しているならば

y += 0.5f;

のようにすることで速度は半分になるでしょう。
ただし実数計算はint型ではできないので、floatにするなど行う計算によって型を変えるべきことに注意してください。

>妖々夢の1面の入りのように若干右からカメラを移動させてみたのですが

>妖々夢の1面の入りのように若干右からカメラを移動させてみたのですが

という解釈でよかったですよね?
これも同じように描画を始める基準点の位置をずらせばいいと思います。
ただし、この場合、背景を描画サイズより少し大きめに書いておく必要があるかと思います。
あと、等速移動をして、ある位置でピタッととまるのはやすっぽい動きになってしまいます。
ここで結構便利なのがsinまたはcosで、この波を座標の位置に使ってやることで滑らかに動かすことができますよ。


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

Name: ft  ..ぴよぴよ(50ポイント)   Date: 2009/09/27(日) 13:20   No:39664 解決!     
Title: Re:20章について    
脱字済みません。
再現することができました
ありがとうございました!


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



Name: Ones  ..ぴよぴよ(404ポイント)   Date: 2009/09/27(日) 01:43   No:39648       
Title: ゲームのシステムについて    
今、私は、ある、ゲームを作り終えたところです。

そのゲームは、「今まで見たことのないような独自の新しいシステム」のゲームになっています。
自信作のつもりです。
なので、たくさんの人に楽しんでもらいたいので、私の持っているWebサイトで公開しようと思っています。

ですが、今、私は独自のシステムのゲームだからこそ、公開することをためらっています。
といいますのが、
もし、誰かに私の考えたシステムを真似をされたとします。
そして、そのゲーム(真似されたもの)が有名になったとします。
すると、私の長い時間をかけて悩んで苦労して作ったゲームが「ありきたりなゲーム」だとか「パクリだ」とか、そのような扱いを受けてしまう気がするんです。

今、市販で売られているゲームも昔のゲームを参考にして作られたものだとは分かっています。
別に、私は真似をするということが悪いことだとは思いません。

ですが、私が長い時間をかけて悩んで苦労して作ったゲームの「独自のシステム」が私のものでは無くなるかもしれないという恐怖で公開できません。

たくさんの人に遊んでもらいたいのに公開できない。
このジレンマに悩まされています。

独自のシステムを守りつつ、ゲームを公開し、たくさんの人に遊んでもらうにはどうしたらいいのでしょうか。

回答宜しくお願いします。


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


Name: mnkr  ..かけだし(2,201ポイント)   Date: 2009/09/27(日) 02:13   No:39649     
Title: Re:ゲームのシステムについて    
素人目線でですが。。。

ゲームの中やreadmeテキストに一言、
「このシステムは○年○月○日○○によって作られました」
とか記載するのはどうでしょう?
一番最初に作った人です、とアピールすることはできそうです。。。

それか、自信があるのなら特許申請するのはどうでしょうか?

これぐらいしか思いつきません。。。


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

Name: Justy  ..伝説なるハッカー(431,111ポイント)   Date: 2009/09/27(日) 02:17   No:39650     
Title: Re:ゲームのシステムについて    
 まぁ、特許でしょうね。

 特許を申請してからゲームを公開して、ついでにHPやマニュアルとかに
「特許出願中」とでも書いておく、ってのはどうでしょうか。


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

Name: チルチル  ..熟練のプログラマー(52,089ポイント)   Date: 2009/09/27(日) 02:58   No:39651     
Title: Re:ゲームのシステムについて    
確かにそういうジレンマを感じる事はありますよね・・

私は自分の作ったゲームにあまり愛着が無いのでジレンマを感じる事は少ないですが
周りが自分のシステムを1個パクる間に自分は周りから2個パクれば良いやとポジティブに考えますかね・・


ここから完全に自論になりますが、別に悪意があるわけではありません

特許だの何だのと言っても結局は自分が最初に考えたから後の奴は自重しろって事ですよね
でも他の人が真似できるようなシステムだとしたら他の人だってそのうち思い付いたはずだし
自分が最初に思い付いたのはただ運が良かっただけって事になります
別にエジソンが電球を発明しなくてもライト兄弟が飛行機を発明しなくても
いつかは誰かが思い付いただろうし、自分が最初だという理由だけで権利を独占しても良いのでしょうか?
自分が偶然思い付いたシステムは自分の物なのでしょうか?
電球や飛行機は世界中で真似されていますが、最初に思い付いたのが誰かは伝わっています
真似される事で誰が最初に考えたのか分からなくなるならその程度のシステムだという事ではないでしょうか?

言い換えれば他の人に真似をされるという事は
その人が自分で思い付く可能性を奪う事ではないでしょうか?
他の人が真似をするという事はシステムが優れていると
認めているという事でもあると思いますし
自分が先に思い付いていれば良かったな〜
とか考えているのかもしれません

他の人が真似したとすれば自分はその人に勝った事になるし
それが有名になれば全部自分のおかげだと思う事もできるのではないでしょうか?
自分が考えたシステムが世界中に広がって行ったとしたら
それを一番喜ぶのは自分ではないでしょうか?


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

Name: Ones  ..ぴよぴよ(977ポイント)   Date: 2009/09/27(日) 04:42   No:39653 解決!     
Title: Re:ゲームのシステムについて    
質問したあと寝たので遅くなりました。

三人方、丁寧な回答ありがとうございました。
特許、調べてみたらとても、費用がかかるようですね。



>>確かにそういうジレンマを感じる事はありますよね・・

私は自分の作ったゲームにあまり愛着が無いのでジレンマを感じる事は少ないですが
周りが自分のシステムを1個パクる間に自分は周りから2個パクれば良いやとポジティブに考えますかね・・


ここから完全に自論になりますが、別に悪意があるわけではありません

特許だの何だのと言っても結局は自分が最初に考えたから後の奴は自重しろって事ですよね
でも他の人が真似できるようなシステムだとしたら他の人だってそのうち思い付いたはずだし
自分が最初に思い付いたのはただ運が良かっただけって事になります
別にエジソンが電球を発明しなくてもライト兄弟が飛行機を発明しなくても
いつかは誰かが思い付いただろうし、自分が最初だという理由だけで権利を独占しても良いのでしょうか?
自分が偶然思い付いたシステムは自分の物なのでしょうか?
電球や飛行機は世界中で真似されていますが、最初に思い付いたのが誰かは伝わっています
真似される事で誰が最初に考えたのか分からなくなるならその程度のシステムだという事ではないでしょうか?

言い換えれば他の人に真似をされるという事は
その人が自分で思い付く可能性を奪う事ではないでしょうか?
他の人が真似をするという事はシステムが優れていると
認めているという事でもあると思いますし
自分が先に思い付いていれば良かったな〜
とか考えているのかもしれません

他の人が真似したとすれば自分はその人に勝った事になるし
それが有名になれば全部自分のおかげだと思う事もできるのではないでしょうか?
自分が考えたシステムが世界中に広がって行ったとしたら
それを一番喜ぶのは自分ではないでしょうか?



そうですね。私の考えが未熟でした。あなたの考えを聞かせていただいて、
私の考え方が180°変わった気がします。

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


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

Name: sage  ..ぴよぴよ(49ポイント)   Date: 2009/09/27(日) 05:49   No:39654     
Title: Re:ゲームのシステムについて    
プロ視点から言わせてもらうと
そういう場合は"体験版"として一般公開するのが一番良いと思いますけど・・
もっとも、たとえそれが独自の要素があってオリジナルのゲームであったとしても
ユーザー様が楽しんでやってくれるだけで私はそれで十分ですけど。
ゲームをやってくださるユーザーなんてどうでもよくて、ただの自己満足、
もしくは商業用でゲームを作成したのなら特許をとればいいと思います。
非常にめんどくさい手続きがありますが


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

Name: Ones  ..ぴよぴよ(986ポイント)   Date: 2009/09/27(日) 05:56   No:39655     
Title: Re:ゲームのシステムについて    
わかりました。参考になります。

sageさん。
ところで、体験版として公開するというのはなぜですか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,058,917ポイント)   Date: 2009/09/27(日) 09:39   No:39658     
Title: Re:ゲームのシステムについて    
技術やアイディアを奪われないようにするためにはやはり特許しかないでしょうね。
ただ知り合いが特許の仕事をしているので、よくそういう話をしますが、
素人が特許を申請するときはよほど自信があるか、お金をもうけが出来ると考えられるか、今後何らかの考えがあるかでしょうね。
何しろ多額なお金がかかりますから・・・。

ゲーム会社などに売り込んで、アイディアを買ってもらえる自信があるなら特許を申請してもいいと思いますが、
よほど革新的なものでない限り難しいですよね。
さらに、ゲームシステムは特許を取ることが難しいようです。
パズルゲームのアルゴリズムなどの特許の取りやすい分野はあると思いますが、
分野によっては難しいこともあると思います。

Onesさんのアイディアがどのようなものかわからないので、何とも言えませんが、
ご自身の自信やこれからの考えを考慮して行動を選ばれるしかないと思います。

しかし、別に権利を守りたいわけではなく、パクリだのなんだの言われるのが嫌なだけならば、
公開しているwebサイトに作成年月日を書いておけばいいと思いますよ。
「このアイディアいいな」と思ってからゲーム制作を始め、完成するまで時間がかかると思いますし、
その年月日がパクられ先のものと近くなることもないと思います。

仮にパクられたその先のソフトが有名になったとしても、有名になればなるほど、
その元のオリジナルは尊重されると思いますよ。
逆に言えば、パクリ先が「これは俺のオリジナルだ!」って態度だとそちらの方がたたかれると思います。

また、公開時に規約を作り、
「このゲームシステムを使って、または参考にしてゲームを製作する場合、当サイトのURLを公開サイトに含めてください」
など書いておくことで、オリジナルが何かわからなくなる可能性が減らせるかもしれません。
規約なんて読まない人は多いと思いますが、少々鬱陶しくても起動時に毎回その旨の警告を出すとか、
色々と伝える方法はあると思います。



では、よいリリースが出来るといいですね☆


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

Name: Ones  ..かけだし(1,070ポイント)   Date: 2009/09/27(日) 12:21   No:39661     
Title: Re:ゲームのシステムについて    
管理人さん
お忙しい所、ご丁寧にお答え頂き、有難うございます。

そうですよね。特許はとてもお金が掛かりますよね。手間も掛かります。
なので、作成年月日をサイトに書いて、規約も作っておくことにします。

こうすれば安心だったのですね。

初めて、ゲームを公開するので、どのように公開したら良いのか分からず困っていたので、
本当に助かりました。

みなさんには本当に感謝です。
ありがとうございました。


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



Name: Ma  ..中級者(10,742ポイント)   Date: 2009/09/24(木) 08:54   No:39564       
Title: ロード中のアニメーション表示    
ふと思った疑問です。

よく市販のPCゲームなどで、ロード中に表示されるアニメーションが、まったく止まらないものがあります。
これは、データをロードしながら画面を更新しているのだ。

と今までは納得していたのですが、最近そうとは思えなくなりました。

まずひとつ、あまりにも画面更新が早く、gifアニメファイルを張っているだけのような気がしてくるのです。

二つ目に、あるゲームのこのロード表示中に Alt+Tab でタスクを切り替えた後、
もう一度切り替えてゲームに戻ってきたときに、
ロード中の画像が表示されなくなっていた(おそらくタスク切り替えでデータが消えた)のです。
つまり、毎フレーム更新していたわけではない、と思えてきたのです。


実際に、このようなゲームではアニメgifファイルのようなもので、実装していたとしたら、
DXライブラリではアニメgifはサポートされていないので、実装不可能でしょうか?

似せるとしたら、やはりひとつひとつのデータを読み込む合間に画面を更新する方法だけでしょうか?


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


Name: バグ  ..ハッカー(170,713ポイント)   Date: 2009/09/24(木) 09:24   No:39565     
Title: Re:ロード中のアニメーション表示    
マルチスレッドという方法がポピュラーじゃないかと思いますよ(^-^)

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

Name: zwi  ..入門者(4,748ポイント)   Date: 2009/09/24(木) 11:11   No:39570     
Title: Re:ロード中のアニメーション表示    
やはり、スレッドを普通使うと思います。
ロードをスレッド行いながら、画面表示はメインループで行います。


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

Name: Ma  ..中級者(10,772ポイント)   Date: 2009/09/24(木) 11:56   No:39572     
Title: Re:ロード中のアニメーション表示    
ありがとうございます。
まだ、未知の領域ですが時間あるときに調べてみます^^


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,058,020ポイント)   Date: 2009/09/24(木) 20:42   No:39585     
Title: Re:ロード中のアニメーション表示    
マルチスレッドを使いたくないならこんな方法もあるのでは?
ということでサクサクっと作ってみました。

簡単なバージョン
http://dixq.net/zip/bbs/SampleLoad.zip

アニメーションも付けられますよということでアニメーションを付けてみたバージョン
http://dixq.net/zip/bbs/SampleLoad2.zip

LoopProcess関数はメイン以外から呼ぶのはちょっと反則な気もしますけど、ここだけ例外扱いで。
エラー処理は別途必要ですね。
まぁ適当に作ったのでいいかどうかはわかりませんけどね^^;
ちなみにScreenFlip関数がある為、どんなに早くロードが終わってもロード関数一つに対して
1/60秒待機してしまいます。
簡単バージョンで画面の書き換えを行わなければScreenFlipを排除することでロードは早くなると思います。

逆にロード関数から処理が帰ってくるまで描画出来ないので、
音楽データなど処理が帰ってくるまでに時間のかかる関数があるとアニメーションがきれいに見えません。
そういうデータは最初にまとめて読み込むなどの工夫が必要かもしれません。


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

Name: Justy  ..伝説なるハッカー(429,400ポイント)   Date: 2009/09/24(木) 20:59   No:39587     
Title: Re:ロード中のアニメーション表示    

>ScreenFlip関数がある為、どんなに早くロードが終わってもロード関数一つに対して
>1/60秒待機してしまいます

 多少画面に線が入るかもしれませんが SetWaitVSyncFlagとか使って
垂直同期待ちをしない、というのも手もありますね。


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

Name: lbfuvab  ..上級者(21,846ポイント)   Date: 2009/09/24(木) 21:19   No:39590     
Title: Re:ロード中のアニメーション表示    
違うスレッドでデータを読み出して、パーセントを表す変数を増加させていけば良いかと(排他処理を忘れず)

くわしくは猫でものC言語編を99章辺りから見れば良いと思います。

http://www.kumei.ne.jp/c_lang/intro/no_99.htm


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

Name: Justy  ..伝説なるハッカー(430,258ポイント)   Date: 2009/09/24(木) 22:40   No:39593     
Title: Re:ロード中のアニメーション表示    
 えーと、ちょっとDXライブラリ下のマルチスレッドと、ロード中のアニメーションの方法に
ついて考えてみました。
 正しいとは限らないので、何かおかしな点がありましたら指摘して下さい。


 一般的にはこの手の処理はマルチスレッドで処理するのが自然ですが、
DXライブラリとマルチスレッドはあまり親和性がよくないように思います

 しかもバージョンによって挙動が異なります。

 2.25a以前は DXライブラリの大半の関数には異なるスレッドで同時に実行できないよう
排他処理が入っていましたが、2.25b以降は入っておらずマルチスレッド非対応と
なりました。

 つまり、2.25a以前は別のスレッドでそのまま LoadGraph関数を呼ぶと
一時的に画面が止まることはあっても動きますが、2.25b以降は危険です。

 3.00cで多少改善されたような感じがしますが、タイミングによっては
ロードに失敗するなど、問題があると思われます(あやふや)。


 そうなるとどのバージョンでも使える手としては

1 別スレッドでファイルをメモリに読み込む。
2 その間メインスレッドでアニメーションをする。
3 別スレッド側で読み込みが終わったらメインスレッドに通知。
4 メインスレッドでメモリからDXライブラリのハンドル化する。


というのが考えられるのですが、ファイルをメモリに読み込む際に
DXライブラリのファイル読み込み関数が使えるかどうかが微妙です。

 非 DXライブラリの読み込み関数を使うのが確実ですが、
そうなるとアーカイブの機能が使えなくなります。


 そんなこんなで結局のところ、自前でロードスレッドを用意するのではなく
DXライブラリの機能のロードスレッドを使う方法、

1 DXライブラリの非同期読み込み関数を使ってファイルをメモリに読み込む指示を出す。
2 読み込み完了待ちしつつアニメーションを行う
3 読み込みが完了したらメモリから各種 DXライブラリの関数を
使ってハンドル化する


がベストな気がします。


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

Name: Ma  ..中級者(10,871ポイント)   Date: 2009/09/25(金) 05:42   No:39602     
Title: Re:ロード中のアニメーション表示    
(もう少し聞く事がありそうだったので、解決をOFFにしました。)

>Dixq
サンプルありがとうございます!

チェックさせていただきました。
見たところ、これは「データをロード⇔画面の更新」を繰り返していますよね?
LoadGraphを使っているところから、データひとつひとつの重さが重い場合、待ち時間が発生します。
そうすると、常に動くロード中の表示ができません。
これではだめなのです。
アニメーションの方も同様でした。
それにしても、アニメーション綺麗ですね〜!


>lbfuvab
>違うスレッドでデータを読み出して、パーセントを表す変数を増加させていけば良いかと(排他処理を忘れず)
排他処理については、これから調べますが、私も別スレッドから変数を増加させる方法が良いのではないかと。



>Justy

>3.00cで多少改善されたような感じがしますが、タイミングによっては
>ロードに失敗するなど、問題があると思われます(あやふや)。
これが起きるのは困りますね・・・。


>DXライブラリの非同期読み込み関数
申し訳ない、その関数がどれか分からないのですが、具体的に関数名を教えていただけませんか?


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

Name: Justy  ..伝説なるハッカー(430,654ポイント)   Date: 2009/09/25(金) 22:53   No:39617     
Title: Re:ロード中のアニメーション表示    

>具体的に関数名を教えていただけませんか

 FileRead関数群がそうです。
 FileRead_open関数の第二引数で同期するか非同期にするかを指定します。

 他にどんな関数があるかはDXライブラリのヘッダファイルを調べてみて下さい。


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

Name: Ma  ..中級者(10,910ポイント)   Date: 2009/09/26(土) 09:51   No:39625 解決!     
Title: Re:ロード中のアニメーション表示    
おぉ、非同期指定できますね。
これさえあれば、いろいろ工夫できそうです。
ありがとうございました!


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

Name: situmon  ..熟練のプログラマー(46,934ポイント)   Date: 2009/09/26(土) 22:30   No:39638     
Title: Re:ロード中のアニメーション表示    
横レス失礼します。管理人さんのを見せていただいた(サンプルを)のですが、
外部参照・・・とでて実行できません。(ビルドが失敗します。)なぜでしょう。


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

Name: Ma  ..中級者(10,929ポイント)   Date: 2009/09/27(日) 09:29   No:39656     
Title: Re:ロード中のアニメーション表示    
>situmon
ライブラリのパスをあなたの設定に直す必要があります。

私の場合、

#include "DxLib.h"

で直りました。


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



Name: Oip  ..ぴよぴよ(183ポイント)   Date: 2009/09/26(土) 23:00   No:39639       
Title: ウィンドウが非アクティブ時にもゲームが動くようにするには?    
初めまして、Oipと申します。現在、高校に通いながら当HPを参考にしつつゲームプログラミングをしております。
質問ベタなので、少々わかりづらいかもしれません。

さっそくですが、質問に移ります。といってもタイトル通りです。

ゲームを起動している時、他のウィンドウをいじっている時も「ちゃんと動いている状態」を維持するにはどうすればいいのでしょうか?
四聖龍神録Plusをプレイしてみたのですが、他ウィンドウをアクティブにしている状態でも止まることなくしっかり動いていました。
しかし、龍神録プログラミングの館やゲームプログラミングの館で作ったゲームはそうはいかないみたいです。
これはどういう理屈で出来ているのでしょう?
ゲームプログラミングの館をだいたいやった後に、龍神録プログラミングの館をざっと読んでみているのですが、どうすればいいのかわかりません。

どうか、ご援助いただけたらありがたいです。
ちなみにC++への理解は林 晴比古さん著の「新C++言語入門 ビギナー編」を読み終えたぐらいです。要するにビギナーです。クラス等に関しては理解は薄いです・・・


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


Name: yu  ..プログラマー(39,490ポイント)   Date: 2009/09/26(土) 23:04   No:39640     
Title: Re:ウィンドウが非アクティブ時にもゲームが動くようにするには?    
初めまして

DXライブラリに
int SetAlwaysRunFlag( int Flag );
という関数が用意されています

DXライブラリ - リファレンスページ
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R15N22


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

Name: Oip  ..ぴよぴよ(183ポイント)   Date: 2009/09/27(日) 01:11   No:39647 解決!     
Title: Re:ウィンドウが非アクティブ時にもゲームが動くようにするには?    
早い回答ありがとうございます!
そんな関数があったんですか。もっとリファレンスに目を通すべきでした。




Name: kazuoni [URL]  ..ハッカー(109,171ポイント)   Date: 2009/09/26(土) 18:22   No:39632       
Title: PSRL(W)の挙動について    
お邪魔します。

今回は、psrl(w)の挙動についてちょっと納得がいかなかったので
質問に来ました。

例えばですが、

0x48b749b64ab54bb4

をpsrlw 8で右論理シフトする(256で割る)と答えは


0x00480049004a004b

となるわけですが、これを
for(i=0;i<8;++i)
psrlw 1

で実行し、各値を見ていくと、添付ファイルのようになりました。
(上は16進数、下は2進数で結果を表記しています)
初めの状態から一回シフトすると自分の考えでは
以下のようになると思いました。

(2バイト単位で改行します)
0100100010110111
0100100110110110
0100101010110101
0100101110110100

0010010001011011
0010010011011011
0010010101011010
0010010111011010

結果を予想と比較してみます。

予想:0010010001011011001001001101101100100101010110100010010111011010
結果:0010010001011111001001001101111000100101010111010010010111011100

これが微妙に違っています。
異なるのは、シフトによって消えていく部分なので、
今回の結果には影響しないのですが、なんだかしっくりきません。
右論理シフトはMSB=0,すべて一つ右にシフトと記憶していますが・・・
動作がPSRL(W)ではちょっと違うのでしょうか?

よろしくお願いします。


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


Name: Justy  ..伝説なるハッカー(431,030ポイント)   Date: 2009/09/26(土) 19:34   No:39633     
Title: Re:PSRL(W)の挙動について    

>これが微妙に違っています

 最初の値 48B749B64AB54BB4を1回 psrlwで 1ソフトした値は
「予想」の 245B24DB255A25DAで合ってますよ。

48B749B64AB54BB4: 0100100010110111 0100100110110110 0100101010110101 0100101110110100
245B24DB255A25DA: 0010010001011011 0010010011011011 0010010101011010 0010010111011010




>各値を見ていくと、添付ファイルのようになりました

 従って、「添付ファイル」の計算が何かおかしいと思われます。


1回目
 245F24DE255D25DC
->245B24DB255A25DA ?

2回目
 122F126F12AE12EE
->122D126D12AD12ED ?

3回目
 0917093709570977
->0916093609560976 ?

4回目
 048B049B04AB04BB
->048B049B04AB04BB ○

5回目
 0245024D0255025D
->0245024D0255025D ○

6回目
 01220126012A012E
->01220126012A012E ○

7回目
 0091009300950097
->0091009300950097 ○

8回目
 00480049004A004B
->00480049004A004B ○

 上が添付の txtにあった値、下が実際の値です。
 1〜3回目がおかしいようですね……。


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

Name: kazuoni [URL]  ..ハッカー(109,227ポイント)   Date: 2009/09/26(土) 21:58   No:39636 解決!     
Title: Re:PSRL(W)の挙動について    
Justyさん、ご回答ありがとうございます!

違う値で今試したところ・・・バッチシできてました^^;
・・・すみません。。どこでミスしたか分からないですorz

無駄な時間を浪費させてしまい、大変申し訳ありませんでした。


とりあえず、挙動は自分の予想していた通り
(っというか当たり前でした・・・)
ということで解決にさせていただきます。

次回もよろしくお願いします。

#なんであんな結果を得たんだろうか・・・


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

Name: sizuma  ..上級者(15,928ポイント)   Date: 2009/09/26(土) 22:08   No:39637     
Title: Re:PSRL(W)の挙動について    
全然関係ないことですが失礼します。

>無駄な時間を浪費させてしまい
貴重な時間を、ではないでしょうか。
なんかすごい違和感があったんで・・・

どうでもいいことにつっこんで、申し訳ないです^^;
まぁスルーしてくださいー


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



Name: チルチル  ..熟練のプログラマー(51,530ポイント)   Date: 2009/09/25(金) 19:06   No:39610       
Title: cppファイルとhファイルの置き場所を正しく変更?    
前回と同じような質問なのですが
「Microsoft Visual C++ 2008 Express Edition」に環境を変更したのを機会に
分割コンパイルを試してみたのですが
cppファイルとかhファイルがslnファイルとかと混在していると見にくいので
プロジェクトフォルダ内にフォルダを作って入れておこうと思ったのですが
hファイルはインクルードする時に相対パスを指定すれば良いのですが
main.cppはインクルードする訳ではないのでうまく行きません
あと相対パスは見栄えが悪いのであまりやりたくないです・・

色々やってみるとプロジェクトに追加しないでフォルダ内に手動で作成してドロップすると行けるんですが
それをやるとソリューションエクスプローラの中身が空になって寂しいです・・

何か良い方法は無いでしょうか?


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


Name: ねこ  ..熟練のプログラマー(43,243ポイント)   Date: 2009/09/25(金) 20:27   No:39611     
Title: Re:cppファイルとhファイルの置き場所を正しく変更?    
ソース用フォルダにcpp入れたら動かなくなったという事でしょうか?
slnファイルは作成や追加したcppファイルの位置(パス)を覚えているのでプロパティウィンドウでファイルパスを修正するか、
一度「削除」⇒「クリア」で参照情報を消した後「既存の項目を追加」でパスが修正されます。

<cppファイルとかhファイルがslnファイルとかと混在していると見にくいので
<プロジェクトフォルダ内にフォルダを作って入れておこうと思ったのですが

<あと相対パスは見栄えが悪いのであまりやりたくないです・・
は凄く矛盾するのですが・・・インクルードのパスに相対の階層パスを入れたくないって事でしょうか。
C++設定の追加のインクルードディレクトリってとこにヘッダ入れているフォルダパスを指定するとファイル名だけでいけますが、フォルダの数だけ増えるのであまりお勧めはできません。


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

Name: チルチル  ..熟練のプログラマー(51,581ポイント)   Date: 2009/09/25(金) 20:40   No:39613 解決!     
Title: Re:cppファイルとhファイルの置き場所を正しく変更?    
ソリューションエクスプローラで追加していたのが原因だったようです
「新しい項目の追加」でフォルダを指定して作成したらそこから読み込んでくれました

どうもありがとうございます


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



Name: ひよこ  ..熟練のプログラマー(49,593ポイント)   Date: 2009/09/23(水) 14:24   No:39529       
Title: 循環リストについてなんですが・・    
最近興味を持ったことについて勉強をしています。
循環リストについてなんですが・・
「ためになるホームページ」のサンプルを改造していて
なぜ下のソースの実行結果の一番最後がbullet.x,bullet.yの内容なのでしょうか?
C言語はほとんどできません。

#include <stdio.h>
#include <malloc.h>

struct bullet_t{
struct bullet_t *next; /* 次の構造体変数のアドレス */
int x;
int y;
};

bullet_t bullet;

void List_print(bullet_t *head){
bullet_t *p, *tmp;
for(p=head->next;p!=head;)
{
tmp=p;
p=tmp->next;
printf("%d\n",p->x);
printf("%d\n",p->y);
}
}

int bullet_data_set(bullet_t *p,int x,int y){
bullet_t *tmp;
tmp = (bullet_t*)malloc(sizeof(bullet_t));
//要素が存在した場合
if(p->next!=NULL)
{
tmp->next=p->next;
p->next=tmp;
tmp->x=x;
tmp->y=y;
}
else//要素がない場合
{
tmp->next=p;//pのアドレスをtmp->nextへ
p->next=tmp;//tmpのアドレスをp->nextへ
tmp->x=x;
tmp->y=y;
}
return 0;
}

int main(){
bullet.next=NULL;

bullet.x=0;

bullet.y=0;

bullet_data_set(&bullet,80,90);//一番最後,後ろに行くほど先描く

bullet_data_set(bullet.next,60,80);

bullet_data_set(bullet.next,80,120);

List_print(&bullet);//リスト内容を描く

getchar();//一時停止

return 0;
}



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


Name: kazuoni [URL]  ..ハッカー(106,954ポイント)   Date: 2009/09/23(水) 16:49   No:39535     
Title: Re:循環リストについてなんですが・・    
>なぜ下のソースの実行結果の一番最後がbullet.x,bullet.yの内容なのでしょうか?



そのように関数が組んであるからですが・・・?

たぶんこういうことがやりたいのでは?っと勝手に予想してみます^^;

void List_print(bullet_t *head){


bullet_t *p, *tmp;

for(p=head->next;p!=head;p=p->next)

{

tmp=p;

printf("%d\n",p->x);

printf("%d\n",p->y);

}

}


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

Name: ひよこ  ..熟練のプログラマー(50,743ポイント)   Date: 2009/09/23(水) 19:05   No:39539     
Title: Re:循環リストについてなんですが・・    
kazuoniさん
たぶんこういうことがやりたいのでは?っと勝手に予想してみます^^;
>>実行結果が自分のおもったとおりになってます。ありがとうございます。
やりたいことは、弾の表示負荷を減らすため、リストを勉強しています。
弾を描き、その弾を全部一度に消す。そしてまた弾を描くということがしたいです。

kazuoniさんのすばらしいコードを変えていっているのですが、
リスト.exe の 0x6485c2b2 で初回の例外が発生しました: 0xC0000005: 場所 0xfeeefee8 を読み込み中にアクセス違反が発生しました。
リスト.exe の 0x6485c2b2 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfeeefee8 を読み込み中にアクセス違反が発生しました。というエラーが出てきました。
どういう原因なんでしょうか?
下ソースです。

#include <stdio.h>
#include <malloc.h>

struct bullet_t{
struct bullet_t *next; /* 次の構造体変数のアドレス */
int x;
int y;
};

bullet_t bullet;

void List_print(bullet_t *head){
bullet_t *p, *tmp;

for(p=head->next;p!=head;p=p->next)
{
tmp=p;
printf("%d\n",p->x);
printf("%d\n",p->y);
}
}

int bullet_data_set(bullet_t *p,int x,int y){
bullet_t *tmp;
tmp = (bullet_t*)malloc(sizeof(bullet_t));
//要素が存在した場合
if(p->next!=NULL)
{
tmp->next=p->next;
p->next=tmp;
tmp->x=x;
tmp->y=y;
}
else//要素がない場合
{
tmp->next=p;//pのアドレスをtmp->nextへ
p->next=tmp;//tmpのアドレスをp->nextへ
tmp->x=x;
tmp->y=y;
}
return 0;
}/*
int deletebullet(bullet_t* p)
{
bullet_t *tmp;
if(p->next==NULL)
return -1;
tmp = p->next;
p->next = tmp->next;
free(tmp);
return 0;
}*/
void allDeletebullet(bullet_t *head)
{
bullet_t *p, *tmp;

for (p=head->next;p!=head;p=p->next)
{
tmp = p;
free(tmp);
}

}

int main(){
bullet.next=NULL;

bullet.x=0;

bullet.y=0;

bullet_data_set(&bullet,80,90);//一番最後,後ろに行くほど先描く

bullet_data_set(bullet.next,60,80);

bullet_data_set(bullet.next,80,120);

List_print(&bullet);//リスト内容を描く
allDeletebullet(&bullet);
List_print(&bullet);//リスト内容を描く
getchar();//一時停止

return 0;
}



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

Name: kazuoni [URL]  ..ハッカー(106,571ポイント)   Date: 2009/09/23(水) 19:48   No:39541     
Title: Re:循環リストについてなんですが・・    
>どういう原因なんでしょうか?

えっと、原因は、tmpにpのノードのアドレスを代入し、
freeしてしまうと、pのアドレス先を解放したのと同じになるので、
解放後、pをnextすると、不正のアドレスを指すことになり、
そのアドレスを解放するときに解放ができていないのが原因です。

こんな感じになるかと
void allDeletebullet(bullet_t *head)

{
bullet_t *p, *tmp;
for (p=head->next;p!=head;)
{
tmp = p;
p=p->next;
free(tmp);
}

p->next=NULL;
}



あと、リストはまず紙に書いて考えることをお勧めします。
そして、組み、あとはひたすらデバッグで状況を追って行ってください。
そうすれば早くリスト構造の仕組みが理解でき、
はかどるかと思いますよ。
ネットでいろいろ調べてみてもいいかも知れません。


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

Name: ひよこ  ..熟練のプログラマー(50,768ポイント)   Date: 2009/09/23(水) 20:46   No:39543     
Title: Re:循環リストについてなんですが・・    
そうですね、紙に書いていくことから始めたいと思います。
kazuoniさんありがとうございました。


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

Name: ひよこ  ..熟練のプログラマー(50,774ポイント)   Date: 2009/09/23(水) 20:49   No:39544 解決!     
Title: Re:循環リストについてなんですが・・    
解決押し忘れました。

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

Name: ひよこ  ..熟練のプログラマー(51,729ポイント)   Date: 2009/09/23(水) 23:10   No:39548     
Title: Re:循環リストについてなんですが・・    
ただいま勉強してたところなんですが、(backを使わないけれど入れてみたりしてリストの勉強してました。)allDeletebullet関数直後にList_printがとおると、
不正なアドレスを指定するのでList_printにif(p->next!=NULL)をいれたら
Run-Time Check Failure #3 - The variable 'p' is being used without being initialized.
きっと初期化されてないpが使われているって意味なんだと思うのですが、
どう初期化すればいいでしょうか?

#include <stdio.h>
#include <malloc.h>

//注意!「/*:*/」は*backのアドレス関係の行であることを表します。
struct bullet_t{
struct bullet_t *next; /* 次の構造体変数のアドレス */
struct bullet_t *back;
int x;
int y;
};

bullet_t bullet;

void List_print(bullet_t *head){
bullet_t *p;
if(p->next!=NULL){//allDeletebullet関数直後に描かないようにする
for(p=head->next;p!=head;p=p->next)
{
//printf("%d\n",p->back);
printf("%d\n",p->x);
printf("%d\n",p->y);
}
}
}

int bullet_data_set(bullet_t *p,int x,int y){
bullet_t *tmp;
tmp = (bullet_t*)malloc(sizeof(bullet_t));
//要素が存在した場合
if(p->next!=NULL)
{
tmp->next=p->next;

/*:*/tmp->back=p;

p->next=tmp;

/*:*/p->back=tmp->next;

tmp->x=x;

tmp->y=y;

}
else//要素がない場合
{
tmp->next=p;//pのアドレスをtmp->nextへ

/*:*/tmp->back=p;

p->next=tmp;//tmpのアドレスをp->nextへ

/*:*/p->back=tmp;

tmp->x=x;

tmp->y=y;

}
return 0;
}
void allDeletebullet(bullet_t *head)
{
bullet_t *p, *tmp;
for (p=head->next;p!=head;)
{
tmp = p;
p=p->next;
free(tmp);
}

p->next=NULL;//pがheadと一緒のアドレスになったときにその先のアドレスを
//NULLにする。
}

int main(){
bullet.next=NULL;

bullet.x=0;

bullet.y=0;

bullet_data_set(&bullet,80,90);//一番最後,後ろに行くほど先描く

bullet_data_set(bullet.next,60,80);

bullet_data_set(bullet.next,80,120);

List_print(&bullet);//リスト内容を描く

allDeletebullet(&bullet);

List_print(&bullet);//リスト内容を描く
getchar();//一時停止

return 0;
}


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

Name: kazuoni [URL]  ..ハッカー(107,103ポイント)   Date: 2009/09/24(木) 00:20   No:39557     
Title: Re:循環リストについてなんですが・・    
if(p->next!=NULL)

if(head->next!=NULL)
の間違えじゃないですか?


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

Name: ひよこ  ..熟練のプログラマー(51,742ポイント)   Date: 2009/09/24(木) 06:28   No:39562     
Title: Re:循環リストについてなんですが・・    
できました。なんで、引数が初期化(bullet_t *head;)されて、中で同じようなこと(
bullet_t *p;)をしているのに、pじゃ、だめなんですか?


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

Name: kazuoni [URL]  ..ハッカー(107,283ポイント)   Date: 2009/09/24(木) 10:03   No:39566     
Title: Re:循環リストについてなんですが・・    
※以下のコードは例えであって、
有効な関数ではないので、使わないでください。

void func(int a)

{
int b;

printf("a=%d",a);
printf("b=%d",b);
}


上に示した関数でaとbは等しいですか?
とは限らないですよね。
bは初期化されていないintです。
bullet_tは構造体ですが、intやcharと同じ「型」と思ってください。


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

Name: ひよこ  ..熟練のプログラマー(51,760ポイント)   Date: 2009/09/24(木) 16:50   No:39577     
Title: Re:循環リストについてなんですが・・    
headは引数で初期化されているけど、pはつくっただけみたいなことですか?

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

Name: kazuoni [URL]  ..ハッカー(107,723ポイント)   Date: 2009/09/24(木) 19:58   No:39579     
Title: Re:循環リストについてなんですが・・    
そういうことですね。

入門サイトの「関数」の項目を見ておいたほうがいいかも知れません。
まだ、理解できていないor知らない事があるかもしてません。


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

Name: ひよこ  ..熟練のプログラマー(52,588ポイント)   Date: 2009/09/24(木) 20:34   No:39584     
Title: Re:循環リストについてなんですが・・    
そうだったんですか、ただいま、もし画面外に出たら弾を消すという作業をやっているのですが、
deletebullet(bullet_t *head)//外に出た弾を消すという関数を使ったとたんにアクセス違反となるのですが
どうすればいいでしょうか?おそらくアドレス関係だと思いますがどうすればいいでしょうか?

#include "DxLib.h"
#include <string.h> /* memsetを使うため */
#include <math.h>

//円周率
#define PI 3.14159265358979323846

int Key[256];
int image[16];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
struct bullet_t{
struct bullet_t *next; /* 次の構造体変数のアドレス */
struct bullet_t *back; /* 前の構造体変数のアドレス(代入はしているけど未使用) */
double x,y; //座標
double spd;//スピード
double angle;//角度
int flag;
};
bullet_t bullet;

void Bullet_draw(bullet_t *head){
bullet_t *p;
if(head->next!=NULL){//allDeletebullet関数直後に描かないようにする
for(p=head->next;p!=head;p=p->next)
{
if(p->flag==1){//アクセス違反が発生
p->x+=cos(p->angle)*(p->spd);
p->y+=sin(p->angle)*(p->spd);
DrawRotaGraphF( (float)p->x , (float)p->y , 1.0 , p->angle, image[8] , TRUE );
}
}
}
}
void allDeletebullet(bullet_t *head)
{
bullet_t *p, *tmp;
if(head->next!=NULL){
for (p=head->next;p!=head;)
{
tmp = p;
p=p->next;
free(tmp);
}
p->next=NULL;//pがheadと一緒のアドレスになったときにその先のアドレスを
//NULLにする。
}
}
void deletebullet(bullet_t *head)//外に出た弾を消す
{
bullet_t *p, *tmp;
//pはhead->nextからpと同じアドレスになるまでループ
if(head->next!=NULL){
for(p=head->next;p!=head;){
if(p->flag==1){
if(p->x<0 || p->x<=640 || p->y<=0 || p->y>=640){
tmp = p;//tmpをpのアドレスに
p=p->next;//pのアドレスをp->nextにする。
free(tmp);//tmp(昔のp)を解放
}
}
}
}
}

int bullet_data_set(bullet_t *p,double x,double y ,double angle,double spd){
bullet_t *tmp;
tmp = (bullet_t*)malloc(sizeof(bullet_t));
//要素が存在した場合
if(p->next!=NULL)
{
tmp->next=p->next;

/*:*/tmp->back=p;

p->next=tmp;

/*:*/p->back=tmp->next;

tmp->flag=1;

tmp->x=x;

tmp->y=y;

tmp->spd=spd;

tmp->angle=angle;

}
else//要素がない場合
{
tmp->next=p;//pのアドレスをtmp->nextへ

/*:*/tmp->back=p;

p->next=tmp;//tmpのアドレスをp->nextへ

/*:*/p->back=tmp;

tmp->flag=1;

tmp->x=x;

tmp->y=y;

tmp->spd=spd;

tmp->angle=angle;
}
return 0;
}
void ini(){
memset(&bullet,0,sizeof(bullet_t));
bullet.next=NULL;
bullet.back=NULL;
bullet_data_set(&bullet,80,90,PI,0);
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image );//画像を分割してimage配列に保存
ini();
bullet_data_set(bullet.next,240,77,PI/2,3);
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない

if(Key[KEY_INPUT_Z]==1)
deletebullet(&bullet);
if(Key[KEY_INPUT_X]==1)
allDeletebullet(&bullet);
Bullet_draw(&bullet);

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


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

Name: kazuoni [URL]  ..ハッカー(108,362ポイント)   Date: 2009/09/24(木) 23:59   No:39597     
Title: Re:循環リストについてなんですが・・    
とりあえず、データは二つ入っていますが、
zを押すと、データは二つとも消えます。(解放)
(逸れますが、p->x<0 || p->x<=640 ...はおかしくないですか?)
その次に、データが先頭のノードのみになります。(このノードのnextは解放後何もされていない。)
そのまま、Drawするので、head->nextにアクセスし、
p->flagとすると不正なアドレスのアクセスになり、止まります。

あと、今のままだと、例ですが
A→B→C→D→A....
のリストでBのみ削除対象になると、
本体のリストはAだけになります。
A->next=C
の処理をしていないので。

今一度、リスト構造の基礎を見直してみてください。


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

Name: ひよこ  ..熟練のプログラマー(52,938ポイント)   Date: 2009/09/25(金) 06:53   No:39603     
Title: Re:循環リストについてなんですが・・    
ただいま試行錯誤でやっています。

p->x<0 || p->x<=640 ...はおかしくないですか?)
>>おかしいですね、直しました。

デバックでZでdeletebulletを使うとなぜかフリーズするのですが、どうしてでしょうか
一回もprintfDxが動いた跡がありません。

void deletebullet(bullet_t *head)//外に出た弾を消す
{
bullet_t *p, *tmp;
//pはhead->nextからpと同じアドレスになるまでループ
if(head->next!=NULL){
for(p=head->next;p!=head;){
printfDx("一回きました");
if(p->flag==1){//アクセス違反
printfDx("一回きました");
if(p->x <=0 || p->x >=640 || p->y <=0 || p->y >=480){//xが0以下640以上だったら,yが0以下480以上だったら
printfDx("一回きました");
tmp = p;//tmpをpのアドレスに
p=p->next;//pのアドレスをp->nextにする。
free(tmp);//tmp(昔のp)を解放
}
}
}
}
}


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

Name: kazuoni [URL]  ..ハッカー(108,439ポイント)   Date: 2009/09/25(金) 08:57   No:39604     
Title: Re:循環リストについてなんですが・・    
とまる理由、アクセス違反が起こる理由は
自分で調べれるようにならないと、
この先辛いのでまずはそれから。
環境が何か分かりませんが、VC++と仮定します。
とりあえず、止まる場所がだいたいどのあたりか、
目星をつけます。(止まるところがどこかはデバッグすればわかりますよね?)
あとはその前をひたすら追っていきます。
VC++でいう、ブレークポイントです。
行の左に赤丸が出ます。そこでは条件停止、無条件停止などさまざまな止め方があるので、
これで今は十分プログラム停止の原因がつかめます。

今回の件ですが、
ブレークポイントをはれば分かる通り、
無限ループに陥る場合があります。
(キャラが画面内にいるとき)
if(p->x <=0 || p->x >=640 || p->y <=0 || p->y >=480)
に初めがヒットせず、そのまま無限ループです。
ScreenFlipにたどり着かないので、
表示がされることはありません。
解決策は、
p=p->next;//pのアドレスをp->nextにする。
を外に出してください。

また前回も書きましたが、これだと、
deleteには不十分な構造です。
今一度、設計を見なおしてください。


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

Name: ひよこ  ..熟練のプログラマー(53,003ポイント)   Date: 2009/09/25(金) 18:58   No:39609     
Title: Re:循環リストについてなんですが・・    
もう一回勉強したらできました。
これから少しずつリストについて勉強しようと思います。
kazuoniさんありがとうございました。


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



Name: 問い合わせ  ..ぴよぴよ(55ポイント)   Date: 2009/09/19(土) 01:50   No:39360       
Title: DirectXでカメラ視点を動かすには??    
DirectXでカメラで写す被写体の位置は変えずにカメラ位置を動かすには
どのような方法があるのでしょうか?

環境はVisual C++ 2008 Express Edition
OSはwindows XPです。


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


Name: でんすけ  ..かけだし(2,480ポイント)   Date: 2009/09/19(土) 08:19   No:39364     
Title: Re:DirectXでカメラ視点を動かすには??    

D3DXMatrixIdentity(&view, &D3DXVECTOR3( 10.0f, 5.0f, 10.0f ), // カメラの位置
&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), // カメラの向き
&D3DXVECTOR3( 0.0f, 0.0f, 1.0f ) ); // カメラの傾き


カメラの位置のD3DXVECTOR3( 10.0f, 5.0f, 10.0f )の値をいじる。


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

Name: Justy  ..伝説なるハッカー(427,005ポイント)   Date: 2009/09/19(土) 10:45   No:39370     
Title: Re:DirectXでカメラ視点を動かすには??    
 質問の意図が2種類に見えるのですが……。


 カメラの位置を動かしたい場合は D3DXMatrixLookAtLH関数か D3DXMatrixLookAtRH関数で
ビュー行列を生成、IDirect3DDevice9のメンバ SetTransformの D3DTS_VIEWでセットします。

 スクリーン座標系的に見ているオブジェクトの位置を変えたくない場合は
この D3DXMatrixLookAt?H関数の第3引数に常にオブジェクトの位置を指定すれば
どの位置にカメラがあってもカメラはオブジェクトの方向を向きます。


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

Name: でんすけ  ..入門者(3,537ポイント)   Date: 2009/09/19(土) 14:43   No:39377     
Title: Re:DirectXでカメラ視点を動かすには??    
すみません。
D3DXMatrixIdentityではなく、D3DXMatrixLookAtLHでした。


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

Name: 問い合わせ  ..ぴよぴよ(71ポイント)   Date: 2009/09/24(木) 10:11   No:39568     
Title: Re:DirectXでカメラ視点を動かすには??    
Justyさんのおっしゃるとおりの質問です。
被写体からの一定距離でカメラ視点を回転させるプログラムに取り組んでいます。
今のソースの状態は下のとおりです。

ソースコード
D3DXVECTOR3 viewvecE(0.0f, 1.0f, -5.0f), viewvecL(0.0f, 2.0f, 4.0f);
D3DXVECTOR4 viewvec;
D3DXVec3Transform( &viewvec, &viewvecE, &matWorld2 );
D3DXVECTOR3 vEyePt( mypos.x + viewvec.x,
mypos.y + viewvec.y,
mypos.z + viewvec.z );
D3DXVec3Transform( &viewvec, &viewvecL, &matWorld2 );
D3DXVECTOR3 vLookatPt( mypos.x + viewvec.x,
mypos.y + viewvec.y,
mypos.z + viewvec.z );
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );

D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView,&cameraangle.x, &cameraangle.y, &cameraangle.z );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );


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

Name: 問い合わせ  ..ぴよぴよ(25ポイント)   Date: 2009/09/25(金) 10:22   No:39606 解決!     
Title: Re:DirectXでカメラ視点を動かすには??    
諸氏のアドバイスのもと、無事解決することができました。
ありがとうございました。


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



Name: array [URL]  ..熟練のプログラマー(56,138ポイント)   Date: 2009/09/24(木) 21:02   No:39588       
Title: placement newの再配置について    
C++ についての質問です。
指定したメモリアドレスに領域を確保でき、失敗した際には単純にNULLを返すという事なので
placement newを使って、双方リストを作ろうかと考えています。

本題ですが、「placement new」を使用する際、同じアドレスを指定してインスタンス化を行っても
良いのでしょうか。

実際に実行してみると、とくにエラーになることも無く、上書きされる形でインスタンス化できています。
下記が、用途を簡略化してみたプログラムです。
#include <iostoream>

#include <new>

int spase[5];

int main() {
int *p;

// 配置領域を指定する
p = new( &spase[0] ) int;

*p = 100;

std::cout << *p << std::endl;

// 再度同じ領域を指定する
p = new( &spase[0] ) int;

*p = 50;

std::cout << *p << std::endl;

return 0;
}


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


Name: Justy  ..伝説なるハッカー(430,498ポイント)   Date: 2009/09/24(木) 23:59   No:39596     
Title: Re:placement newの再配置について    

>失敗した際には単純にNULLを返すという

 それは new(std::nothrow) のことでないですか?
 placement newは定したアドレスが返ってくるので、明示的に NULLを指定しない限り
NULLは戻ってきません。



>同じアドレスを指定してインスタンス化を行っても良いのでしょうか。

 大丈夫です。
 ただ、2回目以降でその領域に前にあったオブジェクトが
デストラクタを持っているなら、それを実行しておかないとマズイです。


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

Name: array [URL]  ..熟練のプログラマー(56,389ポイント)   Date: 2009/09/25(金) 00:33   No:39598 解決!     
Title: Re:placement newの再配置について    
いつも有難うございます

> それは new(std::nothrow) のことでないですか?

勉強不足でした。こうすることでも、NULLが返ってくるんですね。
(この場合でも例外処理を入れたほうが良いのか気になりましたが時間を見つけて調査します。)
私が一番勉強に用いたサイトでは、operator newは、NULLが返ってくると書いてあったので
placement newも同じ動作だろうと思っていました^^;
参考URL:http://www.geocities.jp/ky_webid/cpp/language/036.html


>> 同じアドレスを指定してインスタンス化を行っても良いのでしょうか。

> 大丈夫です。
> ただ、2回目以降でその領域に前にあったオブジェクトが
> デストラクタを持っているなら、それを実行しておかないとマズイです。

よかったです。とりあえずは今考えている方向でプログラムを組んで行こうと思います。


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

Name: YuO  ..プログラマー(33,692ポイント)   Date: 2009/09/25(金) 00:50   No:39599     
Title: Re:placement newの再配置について    
解決とはなっているのですが,ちょっと気になったので……。

> 勉強不足でした。こうすることでも、NULLが返ってくるんですね。

new演算子が失敗したときに確実にNULLが返る<new>にあるoperator newの形式は,
>void* operator new(std::size_t size, const std::nothrow_t&) throw();
以外にあり得ません。

>void* operator new(std::size_t size, void* ptr) throw();
は確かにptrを返すとされていますが (IS 18.4.1.3 Placement forms / Paragraph.2),
new (NULL) fooはoperator newの後のオブジェクトの構築処理で空ポインタへの参照が発生し,未定義の振る舞いとなる可能性があります。
# new(NULL) foo();とか致命的。

なので,記憶域の割り付けに失敗した場合にNULLを返したいのであれば,const std::nothrow_t&を引数に取る物を使うべきです。

なお,operator newが例外を発生させないからと行って,new演算子が例外を発生させないとは限りません。
new演算子は,
・operator newによる例外
・構築されるインスタンスのコンストラクタによる例外
の2種類の異なる理由による例外を発生させます。
たとえconst std::nothrow_t&を引数に取るバージョンでも後者は発生しうるので,例外に対する対策は必要になります。
# だからvoid operator delete (void * ptr, const std::nothrow_t&) throw();が定義されている。


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

Name: array [URL]  ..熟練のプログラマー(56,442ポイント)   Date: 2009/09/25(金) 01:52   No:39601     
Title: Re:placement newの再配置について    
YuOさん、有難うございます。

注意してもらった事項を頭にいれてプログラミングしていきたいと思います。
もしかしたら、また同じような内容で悩む事があるかもしれないので、その時はまた
よろしくお願いします


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



Name: kai  ..初心者(5,264ポイント)   Date: 2009/09/16(水) 15:29   No:39258       
Title: ボスの最大弾幕回数を表示させる処理(龍神録)    
を実装してみようとしてるのですが
弾幕回数の部分がどこなのか分からなく、うまくいきません。
for(i=0;i<boss.knd;i++){
    DrawGraphFd(3+14*i,10,img_etc[8],TRUE);
}
どうしたらうまくいくでしょうか?アドバイスお願いします><



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


Name: situmon  ..熟練のプログラマー(45,226ポイント)   Date: 2009/09/16(水) 20:29   No:39270     
Title: Re:ボスの最大弾幕回数を表示させる処理(龍神録)    
もう少し詳しく書くといいと思います。
最大弾幕回数とはなんでしょう。
東方で言うhistoryでしょうか?
それとものこりの弾幕の数(東方で言う左上の★マーク)
でしょうか?


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

Name: kai  ..初心者(5,273ポイント)   Date: 2009/09/17(木) 17:07   No:39307     
Title: Re:ボスの最大弾幕回数を表示させる処理(龍神録)    
のこりの弾幕の数です。

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

Name: kai  ..初心者(5,282ポイント)   Date: 2009/09/22(火) 23:19   No:39506     
Title: Re:ボスの最大弾幕回数を表示させる処理(龍神録)    
のこりの弾幕の数です。

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

Name: yu  ..プログラマー(39,411ポイント)   Date: 2009/09/23(水) 07:59   No:39524     
Title: Re:ボスの最大弾幕回数を表示させる処理(龍神録)    

for(i = 0; i < boss.danmaku_num[0] - boss.knd + 1; i++)
{
...
}



こんな感じですかね?
ただ、これは中ボス限定なので
分岐させるか、中ボスか後のボスかを判定する変数を作るかして
boss.danmaku_num[1]
も処理しなければいけませんね

boss.danmaku_num[] じゃなくて他の変数に弾幕回数の値を入れてもいいと思います


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

Name: kai  ..初心者(5,299ポイント)   Date: 2009/09/24(木) 22:53   No:39594 解決!     
Title: Re:ボスの最大弾幕回数を表示させる処理(龍神録)    
分岐させることによって無事出来ました
yuさん分かりやすいアドバイスありがとうございました!


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



Name: mugi  ..ぴよぴよ(308ポイント)   Date: 2009/09/23(水) 19:34   No:39540       
Title: リプレイ実装の際の乱数の調整について    
こんばんわ。いつもプログラミングの館にはお世話になっています。

今回リプレイ機能を実装しようと思ったのですが、乱数が通常プレイとリプレイの場合とで異なるため上手くいきません…。
rang関数を

double rang(double ang){
if(rep_flag==0)
random[rep_cnt]=GetRand(10000)/10000.0;
return ( -ang + ang*2 * random[rep_cnt] );
}
(rep_flag は0ならば通常プレイ、1ならばリプレイを再生)

とし、stage_countとは別にrep_cntというステージ開始からの時間をカウントする変数を使い、
通常プレイ時にrandomという配列に乱数を格納し、リプレイ再生時には格納されている値を用いていている
のですが、何故か通常プレイとリプレイでは値が異なります。

どうすれば通常プレイとリプレイの時に同じ値が返ってくるようにできるのでしょうか?
また、他に方法がありましたらご教授下さい。
よろしくお願い致します。


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


Name: nayo  ..中級者(13,750ポイント)   Date: 2009/09/23(水) 19:58   No:39542     
Title: Re:リプレイ実装の際の乱数の調整について    
乱数は乱数の種によって出る値が変わるのでリプレイファイルには乱数の種を保存しておけばいいのではないでしょうか

int seed = GetRand( 1000 );
SRand( seed );

リプレイファイルにseedを保存し、次リプレイファイル再生時にSrandに保存した乱数の種を入れてやると
以前と同じ乱数が発生するようになります
各ステージ開始時に毎回乱数の種を設定するようにすればリプレイファイルを途中のステージから再生できるので便利かと思います
もちろんDXライブラリを初期化した後すぐ時間などでSRandに乱数の種を設定するのを忘れずに


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

Name: mugi  ..ぴよぴよ(368ポイント)   Date: 2009/09/24(木) 16:11   No:39576     
Title: Re:リプレイ実装の際の乱数の調整について    
回答有難うございます。nayoさんの方法で試してみました。
龍神録プログラミングの館に沿ってプログラムをしているのですが、
まず、first_ini() の中でseed=GetRand(1000)でseedに値を入れ、ini()の中でSRand(seed)で初期化しています。
そして、敵が弾を撃つ時に

double rang(double ang){

return ( -ang + ang*2 * GetRand(10000)/10000.0 );
}

を呼び出して、弾の角度を決めています。
ところが、同じseedの値で初期化しているにも関わらず弾の角度が毎回異なります…。

例えば、試しに seed=5 のように定数で実行しても毎回弾の角度が変わります。
SRandの使い方やタイミングが間違っているのでしょうか?
分かりにくい文章で申し訳ありませんが、よろしくお願い致します。




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

Name: mugi  ..ぴよぴよ(399ポイント)   Date: 2009/09/24(木) 22:34   No:39592 解決!     
Title: Re:リプレイ実装の際の乱数の調整について    
解決しました。初期化に問題があったようです。
有難うございました。


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



Name: mik  ..ぴよぴよ(670ポイント)   Date: 2009/09/23(水) 23:26   No:39553       
Title: 画像の表示がうまくいかない    
こんばんは。
龍神録プログラミングの館の龍神録を改造しながらSTGをつくっていたんですが、
アイテムの処理を追加し終わった後にビルドしてみると、フラグは1になってるんですが、アイテムの画像が表示されませんでした。
それで、アイテムの処理をいじっていると、なぜかボード?も表示されなくなりました。
ロードはできているみたいです。
誤字脱字を調べましたが特に見つからず、困っています。
いったい何が原因なのでしょうか?

よろしくお願いします。


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


Name: kazuoni [URL]  ..ハッカー(107,061ポイント)   Date: 2009/09/24(木) 00:08   No:39555     
Title: Re:画像の表示がうまくいかない    
>フラグは1
>アイテムの処理をいじっていると、なぜかボード?も表示されなくなりました。

自分は龍神録プログラミングの館を
熟読していませんが、情報が少なすぎるかと思います。
どのように改造しているかも分からないのでなおさらです^^;

うまく行った時と、いかなかったときの違う部分を
デバッガで追ってみてください。
または、プロジェクトごとUPすれば
より求めている回答が得られるかも知れません。


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

Name: mik  ..かけだし(1,057ポイント)   Date: 2009/09/24(木) 00:21   No:39558     
Title: Re:画像の表示がうまくいかない    
すいません。いろいろと書き忘れていました。

>>フラグは1

アイテムの出現フラグです。
printfDx関数で龍神録プログラミングのitem[0].flagを表示させると、敵を一匹倒したら、今まで0だったのが1になりました。でも、アイテムの画像は表示されませんでした。
わかりにくくてすいません;;

>>アイテムの処理をいじっていると

自機からでるアイテムの種類をいじったりしていましたが結局戻したのでここはあまり関係ないかもしれません。

>>どのように改造しているか

画像を変えたり弾の種類をふやしたりしているだけです。
これでは改造といえないかもですね^^;すいません。

>>うまくいった時と、いかなかったとき

うまくいった時のデータがのこってないのでよくわかりませんでした。
バックアップはとっておくべきですね;





言葉足らずですいませんでしたorz
以後気をつけます。


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

Name: conio [URL]  ..熟練のプログラマー(50,016ポイント)   Date: 2009/09/24(木) 08:38   No:39563     
Title: Re:画像の表示がうまくいかない    
-------------------------------------------------------------------------------------
【1】描画する順番を間違えている (アイテム → 背景など)
【2】画像の読み込みに失敗している
【3】描画する関数が呼ばれていない
【4】描画する座標が、-100など、範囲外になっている
-------------------------------------------------------------------------------------

理由は色々と考えられますが、ブレークポイントを設置していけば多分分かると思います。
画像を差し替えたりしているようなので、【2】あたりが怪しいような気もします。
(LoadDivGraphの失敗)


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

Name: mik  ..かけだし(1,422ポイント)   Date: 2009/09/24(木) 21:23   No:39591 解決!     
Title: Re:画像の表示がうまくいかない    
回答ありがとうございます!

描画する順番は間違えてないようです。
読み込みについては、printfDx("%d",LoadGraph("board.png"))とやってみると画面にたくさんの数字が羅列したので、成功していると思われます(数字が羅列するのは関係ないのかもしれません;;;)。
描画する関数については、変数a=0をおいて、ボードを描画するための関数内にa++をいれて、メイン関数内でprintfDx("%d",a)としておいたところ、画面に01234とたくさんでてきたので、よばれてるみたいです
描画する座標は0,0にしておきましたが、表示しませんでした。

原因がよくわからなかったので適当に画像を入れる変数を変えてみると直りました。
お手数かけさせてしまってすいませんでしたorzil

なんで変数を変えると直ったのかはわかりませんが、
お二方、ありがとうございました。


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



Name: 鈴仙優曇華院イナバ  ..ぴよぴよ(14ポイント)   Date: 2009/09/23(水) 22:14   No:39545       
Title: 初歩的な質問すみません10章についでですが…    
DrawRotaGraphFという描画関数についてです。
DXライブラリの関数リファレンスのページを見ても
のっていませんでした。
どういう関数なのでしょうか?


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


Name: kazuoni [URL]  ..ハッカー(106,900ポイント)   Date: 2009/09/24(木) 00:04   No:39554     
Title: Re:初歩的な質問すみません10章についでですが…    
DrawRotaGraphの引数の座標を指定する部分が floatになったバージョンです。

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

Name: 鈴仙優曇華院イナバ  ..ぴよぴよ(36ポイント)   Date: 2009/09/24(木) 21:06   No:39589 解決!     
Title: Re:初歩的な質問すみません10章についでですが…    
そうなんですか〜!
本当にありがとうございます


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



Name: チルチル  ..熟練のプログラマー(51,219ポイント)   Date: 2009/09/24(木) 20:13   No:39581       
Title: 実行時の階層の設定方法    
「Microsoft Visual C++ 2008 Express Edition」に環境を変更して画像の表示を試してみました
そうすると予想はしていたんですが
「デバックなしで実行」を行う時はプロジェクトフォルダの中で実行され
「プロジェクトフォルダ内のReleaseフォルダ内のexe」で実行する時はそこで実行されます
これでは素材の配置が面倒なので
「デバックなしで実行」の時もexeファイルの階層で実行するようにしたいです
設定する所があると言う話を聞いたのですが、どこで設定できるのでしょうか?


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


Name: Justy  ..伝説なるハッカー(429,353ポイント)   Date: 2009/09/24(木) 20:31   No:39583     
Title: Re:実行時の階層の設定方法    

>「デバックなしで実行」の時もexeファイルの階層で実行するようにしたいです

 プロジェクトのプロパティの「構成プロパティ -> デバッグ」の作業ディレクトリの
項目に絶対パスか相対パスを指定してすることで、そのディレクトリを
カレントディレクトリとして実行してくれますので、そこに「exeファイルの階層」を
指定すればOKです。

 が、個人的にはそんな Debugだとか Releaseだとか何かの拍子にさくっと消してしまう
可能性がありそうなフォルダの中にリソースを配置するより、リソース用のフォルダを掘り
「ビルド後のイベント」を使って実行ファイルだけを自動的にそのフォルダにコピーする方が
いいかと思います。


カスタム ビルド ステップとビルド イベントについて
http://msdn.microsoft.com/ja-jp/library/e85wte0k.aspx

ビルド イベントの指定
http://msdn.microsoft.com/ja-jp/library/h7dhf0ty.aspx


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

Name: チルチル  ..熟練のプログラマー(51,346ポイント)   Date: 2009/09/24(木) 20:49   No:39586 解決!     
Title: Re:実行時の階層の設定方法    
うまく行きました、どうもありがとうございます。

リソース用のフォルダを作るのも便利そうですが
新しい環境に慣れていない段階で応用的な事をやると自爆しそうなので
とりあえず作業ディレクトリでやってみます
Releaseフォルダには素材を入れているので削除する事は多分無いと思いますし
消してしまっても素材さえ残っていれば復旧できると思うので・・


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



Name: dic  ..プログラマー(33,537ポイント)   Date: 2009/09/24(木) 19:48   No:39578       
Title: unique関数について    
unique関数についてですが
以下のように実装するのですが、重複した要素が取り除かれません
どこが間違っているのでしょうか?


#pragma warning( disable: 4786 )
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;


static vector<string> gvSrc;


void sub()
{
char *mes[] = { "this", "this", "this", "this" };
int i;
for( i=0; i<4; i++ )
gvSrc.push_back( mes[i] );

unique( gvSrc.begin(), gvSrc.end() );

for( i=0; i<gvSrc.size(); i++ )
cout << gvSrc.at(i).c_str() << endl;
}

void main()
{
sub();

}



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


Name: MNS  ..上級者(16,863ポイント)   Date: 2009/09/24(木) 20:09   No:39580     
Title: Re:unique関数について    
unique関数のような、削除関係のアルゴリズム関数は、
実際には値を削除せず、値を末尾へと移動させます。

よって、末尾には値が残ったままになるので、これを削除しなければいけません。
以下のようなコードになります。

#pragma warning( disable: 4786 )
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;


static vector<string> gvSrc;


void sub()
{
char *mes[] = { "this", "this", "this", "this" };
int i;
for( i=0; i<4; i++ )
gvSrc.push_back( mes[i] );

vector<string>::iterator it = unique( gvSrc.begin(), gvSrc.end() );

gvSrc.erase(it, gvSrc.end());

for( i=0; i<gvSrc.size(); i++ )
cout << gvSrc.at(i).c_str() << endl;
}

void main()
{
sub();

}


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

Name: dic  ..プログラマー(34,211ポイント)   Date: 2009/09/24(木) 20:24   No:39582 解決!     
Title: Re:unique関数について    
>unique関数のような、削除関係のアルゴリズム関数は、
>実際には値を削除せず、値を末尾へと移動させます。
そのようですね
なんともややこしい説明だ・・・

MNSさんの回答を参考に改良し、解決しました


#pragma warning( disable: 4786 )
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;


static vector<string> gvSrc;


void sub()
{
char *mes[] = { "this", "there", "this", "this", "there", "there" };
int i;
for( i=0; i<6; i++ )
gvSrc.push_back( mes[i] );

vector<string>::iterator p, p_end;

sort( gvSrc.begin(), gvSrc.end() );
p_end = unique( gvSrc.begin(), gvSrc.end() );

// 改良前
cout << "改良前" << endl;
for( i=0; i<gvSrc.size(); i++ )
cout << gvSrc.at(i).c_str() << endl;

cout << "改良後" << endl;
// 改良後
cout << "gvSrc.size:" << gvSrc.size() << endl;
for( p=gvSrc.begin(); p!=p_end; p++ )
cout << *p << endl;

// MNSさんの回答を参考に
cout << "改良後 その2" << endl;
gvSrc.erase( p_end, gvSrc.end() );
cout << "gvSrc.size:" << gvSrc.size() << endl;
for( i=0; i<gvSrc.size(); i++ )
cout << gvSrc.at(i).c_str() << endl;

}

void main()
{
sub();
}


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



Name: 茶くれ爺  ..ぴよぴよ(223ポイント)   Date: 2009/09/21(月) 21:47   No:39444       
Title: メニュー選択画面について    
初歩的な質問なのかもしれませんが
33章の選択画面で選んだとき
次のページ(新しいページ?)に飛ぶまた戻るの感覚がわからないのですが
どのように考えればばよいのでしょうか
よろしくお願いします


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


Name: s-rush  ..熟練のプログラマー(56,823ポイント)   Date: 2009/09/22(火) 01:07   No:39449     
Title: Re:メニュー選択画面について    
switch文でうまくできそうではないですか?

たとえば、

#include "DxLib.h"

int state = 0;
int Key[256];
int White , y=100; //色とy座標の宣言

int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}

void char_disp(int White,int y){
DrawString( 150 , y , "■" , White );
DrawString( 170 , 100 , "NEW GAME" , White );
DrawString( 170 , 120 , "CONTINUE1" , White );
DrawString( 170 , 140 , "CONTINUE2" , White );
DrawString( 170 , 160 , "CONTINUE3" , White );
DrawString( 170 , 180 , "CONTINUE4" , White );
DrawString( 170 , 200 , "CONTINUE5" , White );
DrawString( 170 , 220 , "CONTINUE6" , White );
DrawString( 170 , 240 , "LOG OUT" , White );
}

/*キー入力制御関数*/
void key_calc(){
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y+=20;
if(y==260) // y座標が260なら(選択が一番下なら)
y=100; // 選択座標を一番上に
}

if(Key[KEY_INPUT_Z]==1){
switch (y) {
case 100: state=1; break;
case 120: state=2; break;
case 140: state=3; break;
case 160: state=4; break;
case 180: state=5; break;
case 200: state=6; break;
case 220: state=7; break;
case 240: state=8; break;
default: state=0; break;
}
}
}

void func1(){
DrawString(170, 160, "初めからだよ〜ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}

void func2(){
DrawString(170, 160, "メニュー1だよ〜ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}

void func3(){
DrawString(170, 160, "メニュー2だよ〜ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}

void func4(){
DrawString(170, 160, "メニュー3だよ〜ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}

void func5(){
DrawString(170, 160, "メニュー4だよ〜ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}

void func6(){
DrawString(170, 160, "メニュー5だよ〜ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}

void func7(){
DrawString(170, 160, "メニュー6だよ〜ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}

void func8(){
DrawString(170, 160, "ほんとにおわっちゃうの?", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}


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


ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

White = GetColor( 255 , 255 , 255 ) ; //色の取得


while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存       ↑ESCが押されていない


key_calc();

/*メニュー画面制御*/
switch(state){
case 0: char_disp(White,y); break; //メインメニュー
case 1: func1(); break;
case 2: func2(); break;
case 3: func3(); break;
case 4: func4(); break;
case 5: func5(); break;
case 6: func6(); break;
case 7: func7(); break;
case 8: func8(); break;
default : state = 0; break;
}


ScreenFlip();//裏画面反映
}

DxLib_End();
return 0;
}




途中のfunc関数は適当に作ってあります^^;
このように、ステートのようなもので制御してあげれば、
(プログラム中ではswitch文のところです)
次のページに飛ぶ(?)ようなことができますよ^^

短時間で作ったものなので、改善の余地はたくさんあるかとは思いますが、
基本的な考えはこれで十分かと思います。

(余談)
無駄に関数を作りすぎちゃいました(笑)


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

Name: 茶くれ爺  ..ぴよぴよ(259ポイント)   Date: 2009/09/22(火) 21:05   No:39489     
Title: Re:メニュー選択画面について    
なるほどーーこういいう考え方ができるんですねー
とても助かりましたありがとうございました

もう一つ質問なんですけど実行してみて 下キーを押しながらZキーを押すとページが
移ってしまうんですけどどう改善すればよろしいんでしょうか

たびたび申し訳ありませんよろしくお願いします


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

Name: Ace  ..入門者(3,511ポイント)   Date: 2009/09/23(水) 02:46   No:39521     
Title: Re:メニュー選択画面について    
Zキー判定のところを

if (![矢印キーが押されているか] && [Zキーが押されているか]) {
// 移動
switch () {
...
}
}

のようにすればよいと思います。
もっとも、矢印キー押しているときも決定ができる(ランダム選択な感じ)というのも有りかもしれませんけどね。


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

Name: 茶くれ爺  ..ぴよぴよ(286ポイント)   Date: 2009/09/23(水) 13:04   No:39526     
Title: Re:メニュー選択画面について    
ありがとうございます
やってみたところ矢印を押しながらZを押すと移動する
現象は改善されましたが
下 を押したのち Zを押すと移動してしまいます
どうしたらよいでしょうか


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

Name: Mato  ..ぴよぴよ(67ポイント)   Date: 2009/09/23(水) 14:18   No:39528     
Title: Re:メニュー選択画面について    
初めまして。

その“移動”と言うのは、貴方の要望であった「次のページ(新しいページ?)に飛ぶ」ことではないのでしょうか。
ですから、「移動してしまいます」と言われますと、何がしたかったのか謎くなってしまいますw

私の勘違いでしたらすいません。


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

Name: conio [URL]  ..熟練のプログラマー(49,381ポイント)   Date: 2009/09/23(水) 17:30   No:39536     
Title: Re:メニュー選択画面について    

上記のプログラムでは、キー入力判定をする関数をswitch文の外に出してしまっているため、
状態遷移しても↓を押せばカーソルが移動してしまう仕様になってますね。

【1】初期状態
------------------
■NEW GAME
CONTINUE1
CONTINUE2
CONTINUE3
CONTINUE4
CONTINUE5
CONTINUE6
LOG OUT
------------------


【2】Zキーを押す
-----------------

初めからだよ〜ん

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


【3】この状態のまま↓キーを押す
-----------------

初めからだよ〜ん

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


【4】Xを押してメインに戻ると、カーソルが移動している。
------------------
 NEW GAME
CONTINUE1
CONTINUE2
CONTINUE3
CONTINUE4
CONTINUE5
CONTINUE6
LOG OUT
------------------

key_calc();は、case0のところに入れたほうが良いのではないのでしょうか。




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

Name: 茶くれ爺  ..ぴよぴよ(311ポイント)   Date: 2009/09/23(水) 23:23   No:39550 解決!     
Title: Re:メニュー選択画面について    
無事この問題はずべて解決いたしました。
皆さんありがとうございました


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

Name: s-rush  ..熟練のプログラマー(57,069ポイント)   Date: 2009/09/24(木) 12:27   No:39575     
Title: Re:メニュー選択画面について    
最近忙しくて返事が返せませんでした。
本当に申し訳ないです><

上記のプログラムは、ゲームプログラミングの館33章をそのまま流用し、
ページ移動のプログラムを付け足しただけなので、
下キーを押したままでもZキーに反応してしまいます。

Aceさんのおっしゃるように変更すれば、改善されます
(すでに確認済みですね^^;)


>conioさん
解説とご指摘ありがとうございます^^
一応、上記のプログラムを改造してキー入力をすべてのcaseにも反映できるようにと、
switchの外に出しちゃいました^^;
ここではkey_calc();はcase 0に入れた方がよかったですねorz


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



Name: マウ  ..入門者(3,689ポイント)   Date: 2009/09/18(金) 14:20   No:39338       
Title: たびたびすいませんが質問です。    
自分は今矢印キーで選択し、Zで決定するという動作を作っています。
ですが、矢印キーで選択した項目をZで決定すると、選択した項目の場所に定まらないで上の項目に行ったりしてしまいます。
この原因がいまいちわからないです。
Cは最近はじめたばかりです。
原因の場所はたぶんこのプログラムだと思うんですが・・・・
前の質問時は規約をみないですいませんでした。

//カーソル移動処理
const int HEAD = 0;
const int TAIL = 3;

while(ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
while(ProcessMessage() == 0 && CheckHitKeyAll() == 0 ){}
//カーソル描画
DrawBox( 43 , 60 + cursorPos * 30 , 59 , 60 + cursorPos * 30 + 16 , GetColor( 255 , 255 , 0 ),TRUE ) ;
if( KeyBuf[KEY_INPUT_UP] ==1 )
cursorPos = (cursorPos == HEAD) ? TAIL : (cursorPos - 1);
else if( KeyBuf[KEY_INPUT_DOWN] ==1 )
cursorPos = (cursorPos == TAIL) ? HEAD : (cursorPos + 1);

if( KeyBuf[KEY_INPUT_Z] != 0 ) // 決定処理
{
switch( cursorPos )
{
case 0: setState( 5 ); break;
case 1: setState( 6 ); break;
case 2: setState( 7 ); break;
case 3: setState( 8 ); break;
//
default: break;
}
}


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


Name: ねこ  ..熟練のプログラマー(41,123ポイント)   Date: 2009/09/18(金) 15:49   No:39340     
Title: Re:たびたびすいませんが質問です。    
while(ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
while(ProcessMessage() == 0 && CheckHitKeyAll() == 0 ){}
これはどうしても必要ですか?
この処理だとそれぞれボタンを押した時に処理するため、わざわざ止める必要はないと思いますが。


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

Name: conio [URL]  ..熟練のプログラマー(48,266ポイント)   Date: 2009/09/18(金) 17:26   No:39341     
Title: Re:たびたびすいませんが質問です。    

全体的にプログラムがおかしい部分があるので、
一から作り直したほうが上手く行くかもしれませんよ。

一応簡単に作ってみたのですが、カーソルで選択するというのは、こんな感じですかね?
(分岐処理への移動はエンターキーになってます)
-----------------------------------------------------------------------------------------------
#include "DxLib.h"

int Key[256];
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}

enum StateID{
STATE_START,
STATE_CONTINUE,
STATE_OPTION,
STATE_EXIT,
STATE_SELECT,
STATE_END
};

StateID state = STATE_SELECT;

enum ColorID{
COLOR_RED,
COLOR_BLUE,
COLOR_YELLOW,
COLOR_GREEN,
COLOR_CYAN,
COLOR_WHITE,
COLOR_MAX
};

int Color[COLOR_MAX];

typedef struct{
const int r;
const int g;
const int b;
}COLOR;

COLOR CList[COLOR_MAX] = { { 255, 0, 0},
{ 0, 0, 255},
{ 255, 255, 0},
{ 0, 255, 0},
{ 100, 255, 255},
{ 255, 255, 255}};

typedef struct{
int PtX;
int PtY;
char* str;
ColorID c;
const StateID next;
}CHOICES;

CHOICES choices[] = { {100, 100, "START", COLOR_WHITE, STATE_START},
{100, 120, "CONTINUE",COLOR_WHITE, STATE_CONTINUE},
{100, 140, "OPTION",COLOR_WHITE,STATE_OPTION},
{100, 160, "EXIT",COLOR_WHITE, STATE_EXIT}};

void Start(void)
{
if(Key[KEY_INPUT_Z] == 1){
state = STATE_SELECT;
}
DrawString( 100, 100 , "Start画面です。" , Color[COLOR_CYAN]);
DrawString( 100, 120 , "※Zキーで戻ります。" , Color[COLOR_WHITE]);
}
void Continue(void)
{
if(Key[KEY_INPUT_Z] == 1){
state = STATE_SELECT;
}
DrawString( 100, 100 , "Continue画面です。" , Color[COLOR_BLUE]);
DrawString( 100, 120 , "※Zキーで戻ります。" , Color[COLOR_WHITE]);
}
void Option(void)
{
if(Key[KEY_INPUT_Z] == 1){
state = STATE_SELECT;
}
DrawString( 100, 100 , "Option画面です。" , Color[COLOR_GREEN]);
DrawString( 100, 120 , "※Zキーで戻ります。" , Color[COLOR_WHITE]);
}
void Exit(void)
{
static int count = 150;

if((--count) == 0)
state = STATE_END;
DrawString( 100, 100 , "Exit画面です。" , Color[COLOR_RED]);
DrawString( 100, 120 , "※プログラムを終了します。" , Color[COLOR_WHITE]);
}

void Select(void)
{
static int NowPt = 0;
static const int ChoiceNum = sizeof(choices)/sizeof(choices[0]);

if(Key[KEY_INPUT_DOWN] == 1 || (Key[KEY_INPUT_DOWN] > 10 && Key[KEY_INPUT_DOWN] % 10 == 0)){
choices[NowPt].c = COLOR_WHITE;
NowPt = (NowPt + 1) % ChoiceNum;
}else if(Key[KEY_INPUT_UP] == 1 || (Key[KEY_INPUT_UP] > 10 && Key[KEY_INPUT_UP] % 10 == 0)){
choices[NowPt].c = COLOR_WHITE;
NowPt = (NowPt + ChoiceNum - 1) % ChoiceNum;
}

for(int i = 0; i < ChoiceNum; i++){
if(i == NowPt)
choices[i].c = COLOR_YELLOW;
DrawString( choices[i].PtX , choices[i].PtY , choices[i].str , Color[choices[i].c]);
}
DrawString( choices[NowPt].PtX - 20, choices[NowPt].PtY , "⇒" , Color[COLOR_CYAN]);

if(Key[KEY_INPUT_RETURN] == 1){
state = choices[NowPt].next;
choices[NowPt].c = COLOR_WHITE;
NowPt = 0;
}
}

void SetColor(void)
{
for(int i = 0, count = sizeof(CList) / sizeof(CList[0]); i < count; i++)
Color[i] = GetColor(CList[i].r, CList[i].g, CList[i].b);
}

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

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

SetColor();
typedef void(*Func)();
Func fc[] = {Start, Continue, Option, Exit, Select};

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 && state != STATE_END){

fc[state]();

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


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

Name: マウ  ..入門者(3,703ポイント)   Date: 2009/09/24(木) 11:40   No:39571 解決!     
Title: Re:    
ありがとうございました。本当にためになりました。

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



Name: でんすけ  ..かけだし(2,294ポイント)   Date: 2009/09/17(木) 15:59   No:39305       
Title: 適当にいじってたら出来た弾幕    

void shot_bullet_H005( int n )
{
int t = shot[n].cnt;
int k;

// 角度計算
double angle1 = 5.0 + PI / 90;
double angle2 = 5.0 + PI / 180;

// 720カウント中1カウントに1回
if( t >= 0 && t < 720 && t%1 == 0 )
{
// 敵が倒されていなくて、探した登録可能な弾番号が有効なら
if( shot[n].flag != 2 && ( k = shot_search( n ) ) != -1 )
{
shot[n].bullet[k].knd = 2; // 弾の種類
shot[n].bullet[k].angle = angle1 * t; // 角度
shot[n].bullet[k].flag = 1; // フラグ
shot[n].bullet[k].x = enemy[shot[n].num].x; // 座標
shot[n].bullet[k].y = enemy[shot[n].num].y;
shot[n].bullet[k].col = 5; // 色
shot[n].bullet[k].cnt = 0; // カウンタ
shot[n].bullet[k].spd = 2; // スピード
}

if( shot[n].flag != 2 && ( k = shot_search( n ) ) != -1 )
{
shot[n].bullet[k].knd = 2; // 弾の種類
shot[n].bullet[k].angle = angle2 * t; // 角度
shot[n].bullet[k].flag = 1; // フラグ
shot[n].bullet[k].x = enemy[shot[n].num].x; // 座標
shot[n].bullet[k].y = enemy[shot[n].num].y;
shot[n].bullet[k].col = 6; // 色
shot[n].bullet[k].cnt = 0; // カウンタ
shot[n].bullet[k].spd = 2; // スピード
}
se_flag[0] = 1; // 弾の発射音フラグを立てる
}
}


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,057,717ポイント)   Date: 2009/09/17(木) 19:39   No:39316     
Title: Re:適当にいじってたら出来た弾幕    
キレイですね^^
弾幕って綿密に考えて実装するのもいいですけど、
案外適当にあれこれ値をいじってみて出来てしまう弾幕もあるんですよね。

私も龍神録を作っている時計算式を間違えてしまった事があって、実行してみたら予想していたものよりいいものが出来たってことがありました^^;
弾幕は作っていると楽しいですよね☆


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

Name: でんすけ  ..かけだし(2,273ポイント)   Date: 2009/09/17(木) 21:02   No:39320     
Title: Re:適当にいじってたら出来た弾幕    
いろいろイジって遊ばせてもらってます^^
やっぱり弾幕は楽しいですw


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

Name: situmon  ..熟練のプログラマー(45,208ポイント)   Date: 2009/09/17(木) 21:19   No:39322     
Title: Re:適当にいじってたら出来た弾幕    
わからなくてあきらめていた東方の弾幕が、
ある日突然、ぱっとひらめいて、
やってみたらその弾幕に!!ってときがありそのときは楽しかったです。
製作(!?)がんばってください。


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

Name: でんすけ  ..かけだし(2,299ポイント)   Date: 2009/09/17(木) 21:25   No:39324     
Title: Re:適当にいじってたら出来た弾幕    
situmonさん。
「マウスを使ったショット 続き」ではお世話になりましたw


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

Name: ひよこ  ..熟練のプログラマー(48,863ポイント)   Date: 2009/09/17(木) 23:48   No:39329     
Title: Re:適当にいじってたら出来た弾幕    
実行してみたら、とってもきれいでした。
偶然できた弾幕って自分の考えを超えてきれいです。

でんすけさん
>>この弾幕を改造?したいです。


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

Name: でんすけ  ..かけだし(2,314ポイント)   Date: 2009/09/18(金) 00:38   No:39331     
Title: Re:適当にいじってたら出来た弾幕    
どうぞどうぞw
いいの出来たら教えてくださいw


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

Name: situmon  ..熟練のプログラマー(45,373ポイント)   Date: 2009/09/18(金) 13:38   No:39337     
Title: Re:適当にいじってたら出来た弾幕    
いえいえ、製作がんばってください。
あと今作っているゲームの難易度が以上に高くなりすぎて困ってるんですよね・・・笑
これでも通常弾幕です。


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

Name: ひよこ  ..熟練のプログラマー(48,934ポイント)   Date: 2009/09/18(金) 23:09   No:39353     
Title: Re:適当にいじってたら出来た弾幕    
situmonさん
>>situmonさんのスナップショットの弾幕は
>>自分的にノーマルとしては難しそうに見えます。
>>自分ならスペルにします。

でんすけさん
>>いい弾幕になったのでスナップショット、置いておきます。(そんな変えてませんけど


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

Name: Tatu  ..中級者(10,036ポイント)   Date: 2009/09/22(火) 02:19   No:39450     
Title: Re:適当にいじってたら出来た弾幕    

弾幕を作ってみました。
最初の3つは魔法陣の動きに合わせて(count依存)弾をうちます。
難易度は普通・やさしい・難しいの順になっています。
4つめはボスの左右からレーザー型の弾をうちます。

//弾発射関数
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=0,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;
if(sflag==1)se_flag[0]=1;
}
}
}

void boss_shot_bulletT073(){
int cnt=count;
int t1=boss_shot.cnt,t2=boss_shot.cnt%150;
int i;
int col1[5]={0,4,3,1,5};
int col2[5]={1,2,3,0,6};
double ang1,ang2,ang3;
double length=70*((0.4+0.05*sin(PI2/360*(cnt%360)))*3);

if(t1==0) boss.hp_max=30000,boss.hp=boss.hp_max;

i=t2/30;
ang1=t1*PI2/1200-PI/2;
ang2=-PI/10+PI2/5*i+PI2*(cnt%580)/580;
ang3=atan2(ch.y-(boss.y+length*sin(ang2)),ch.x-(boss.x+length*cos(ang2)))+PI+t2*PI2/30;

boss.x=FMX/2+120*cos(ang1);
boss.y=FMY/2+120*sin(ang1);
boss_bullet_on(1,1,col1[i],boss.x+length*cos(ang2),boss.y+length*sin(ang2),ang3,0,2,0,0,0,0);
if(t1%60==0){
for(i=0;i<5;i++){
ang2=-PI/10+PI2/5*i+PI2*(cnt%580)/580;
ang3=atan2(ch.y-(boss.y+length*sin(ang2)),ch.x-(boss.x+length*cos(ang2)));
boss_bullet_on(1,7,col2[i],boss.x+length*cos(ang2),boss.y+length*sin(ang2),ang3,0,3,0,0);
}
}
}

void boss_shot_bulletT074(){
int cnt=count;
int t1=boss_shot.cnt,t2=boss_shot.cnt%150;
int i;
int col1[5]={0,4,3,1,5};
int col2[5]={1,2,3,0,6};
double ang1,ang2,ang3;
double length=70*((0.4+0.05*sin(PI2/360*(cnt%360)))*3);

if(t1==0) boss.hp_max=25000,boss.hp=boss.hp_max;

i=t2/30;
ang1=t1*PI2/1200-PI/2;
ang2=-PI/10+PI2/5*i+PI2*(cnt%580)/580;
ang3=atan2(ch.y-(boss.y+length*sin(ang2)),ch.x-(boss.x+length*cos(ang2)))+PI+t2*PI2/30;

boss.x=FMX/2+120*cos(ang1);
boss.y=FMY/2+120*sin(ang1);
if(t2%3==0) boss_bullet_on(1,1,col1[i],boss.x+length*cos(ang2),boss.y+length*sin(ang2),ang3,0,2,0,0,0,0);
}

void boss_shot_bulletT075(){
int cnt=count;
int t1=boss_shot.cnt,t2=boss_shot.cnt%150;
int i,j;
int col1[5]={0,4,3,1,5};
int col2[5]={1,2,3,0,6};
double ang1,ang2,ang3;
double length=70*((0.4+0.05*sin(PI2/360*(cnt%360)))*3);

if(t1==0) boss.hp_max=30000,boss.hp=boss.hp_max;

i=t2/30;
ang1=t1*PI2/900-PI/2;
ang2=-PI/10+PI2/5*i+PI2*(cnt%580)/580;
ang3=atan2(ch.y-(boss.y+length*sin(ang2)),ch.x-(boss.x+length*cos(ang2)))+PI+t2*PI2/30;

boss.x=FMX/2+120*cos(ang1);
boss.y=FMY/2+120*sin(ang1);
if(t1%2==1){
boss_bullet_on(1,1,col1[i],boss.x+length*cos(ang2),boss.y+length*sin(ang2),ang3,0,2,0,0,0,0);
boss_bullet_on(1,1,col1[i],boss.x+length*cos(ang2),boss.y+length*sin(ang2),ang3,0,2.5,0,0,0,0);
boss_bullet_on(1,1,col1[i],boss.x+length*cos(ang2),boss.y+length*sin(ang2),ang3,0,3,0,0,0,0);
}
if(t1%30==0){
for(j=0;j<9;j++){
boss_bullet_on(1,7,col2[i],boss.x+length*cos(ang2),boss.y+length*sin(ang2),ang3+PI*(7.0+rang(1.0))/6,0,2.5+rang(1),0,0);
}
}
}

void boss_shot_bulletT076(){
int t=boss_shot.cnt;
if(t%6==0){
boss_bullet_on(5,2,6,boss.x-150,boss.y,t,PI2/5,5,0,0,1);
boss_bullet_on(5,2,0,boss.x+150,boss.y,PI-t,PI2/5,5,0,0,1);
}
}



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

Name: situmon  ..熟練のプログラマー(46,857ポイント)   Date: 2009/09/24(木) 11:00   No:39569     
Title: Re:適当にいじってたら出来た弾幕    
4番目がきれいですね。
やってはいないのですが、
見ててそう思いました。
レーザー形は当たり判定をなくせば(長方形だから)きれいですよね!!


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



Name: kazuoni [URL]  ..ハッカー(105,590ポイント)   Date: 2009/09/15(火) 23:26   No:39249       
Title: WINAPIで加算減算ブレンド    
お邪魔します。

題名の通り、WINAPIのみでDXライブラリの
加算減算ブレンドを行いたいと考えているのですが・・・
アルファブレンドはAlphaBlend()で、
乗算ブレンドは背景色白の画像をラスタオペレーションSRCAND、マスク画像なし
できそうなのですが、(この時点で間違っていたらそれも指摘してください・・・。)
加算減算はどうやって行えばよいのでしょうか?

よろしくお願いします。

#あと一応ブレンドさえできれば、
自作DXライブラリグラフィック関連は完成なのですが・・・
これによっては、かなりの修正が必要かも・・・


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


Name: Justy  ..伝説なるハッカー(426,251ポイント)   Date: 2009/09/16(水) 22:34   No:39286     
Title: Re:WINAPIで加算減算ブレンド    

>加算減算はどうやって行えばよいのでしょうか?

 多分 GetObject()とか GetDIBits()でビットマップの中身にアクセスして
自分で加算・減算をするしかないんじゃないかと思いますよ。


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

Name: kazuoni [URL]  ..ハッカー(105,665ポイント)   Date: 2009/09/16(水) 23:04   No:39287 解決!     
Title: Re:WINAPIで加算減算ブレンド    
Justyさん、ご回答ありがとうございます!

>自分で加算・減算
やはりですかっ^^;
こんなの毎ループ行ったらめちゃくちゃ重っ(ry
了解しました。何とか工夫して実装してみたいと思います。

ご回答ありがとうございました!
次回もよろしくお願いします。


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

Name: Justy  ..伝説なるハッカー(426,335ポイント)   Date: 2009/09/17(木) 01:30   No:39290     
Title: Re:WINAPIで加算減算ブレンド    
 MMXをうまく使えばそれなりにパフォーマンスが上がることが期待できるはずです。
 
 最悪、コンパイラの最適化に任せっきりではなく、出力されたコードを
見ながらパフォーマンス調整が必要になるかもしれませんね。


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

Name: kazuoni [URL]  ..ハッカー(106,336ポイント)   Date: 2009/09/18(金) 23:24   No:39355     
Title: Re:WINAPIで加算減算ブレンド    
返事が遅れて申し訳ありませんでした。。
とりあえず、挑戦してみました。

が、正直、何をやったらいいかがちんぷんかんぷんです。。
Win32 MASM プログラミング入門
ttp://www7.plala.or.jp/keny01/asm/win32/index.html#sub8-4
のサイトで、加算ブレンドを発見したのですが、
頭の中では、
1、GetDIBits()で二つの画像のデータを全行抜き出す
2、MMXを用いて、オール加算

みたいな雰囲気だと思うのですが・・・
どのように組んだらいいかさっぱりなのですが・・・


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

Name: 御津凪 [URL]  ..ハッカー(114,211ポイント)   Date: 2009/09/19(土) 00:47   No:39359     
Title: Re:WINAPIで加算減算ブレンド    
そちらに載っている関数を流用するだけで、 lpDestBuf に lpSrcBuf1 と lpSrcBuf2 の各バイトごとに加算ブレンドされたデータが入るようになっています。
(ただし、関数説明にあるようにデータは8の倍数のサイズである必要があります)

関数の中身はアセンブラで書かれている(MMX 命令を使用している)ので少し慣れないと分かりにくいかと思います。
ちょうどリンク先の上に MMX 命令の表が載っているので、アセンブラを少し調べたら関数の中身もわかるかと思いますよ。

中身を理解した上で後は関数を組み込んで、8の倍数で余った部分の計算をしておくように処理を追加すれば万全かと。


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

Name: kazuoni [URL]  ..ハッカー(106,907ポイント)   Date: 2009/09/23(水) 00:34   No:39515     
Title: Re:WINAPIで加算減算ブレンド    
持ち上げごめんなさい。。
そして、御津凪さん、ご回答ありがとうございます!
返事がかなり遅れてしまいました。申し訳ありませんでした。。

その後、なんとか、もぞもぞとやっているのですが、
肝心のMMXの前の段階のビットマップRGBの取得に悪戦苦闘しています。。

COLORREFの取得まではなんとかなりそうなのですが、
それの各要素10進化(unsigned char化)
するのに、どのようなアルゴリズムを組めば
一番効率がいいのか悩んでおります。
Get〇Valueを使えば、RGB取得は可能ですが、
画像が二つあり、しかもある程度の範囲(400×300等)
があると、これを全ビットするのも結構の負担になるのではないかと思いまして・・・。
アセンブラで描くとすればどのようなアルゴリズムになるのでしょうか?
右シフトを24回繰り返してそれぞれを記録すれば
一つの関数でBGRの順に取得できるのでは?なんて思ったりしていますが・・・。。
はたまた、そのままGet○Valueでいけるのか・・・。


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

Name: Justy  ..伝説なるハッカー(428,986ポイント)   Date: 2009/09/23(水) 02:08   No:39520     
Title: Re:WINAPIで加算減算ブレンド    

>MMXの前の段階のビットマップRGBの取得に悪戦苦闘しています
>アセンブラで描くとすればどのようなアルゴリズムになるのでしょうか

 いいサンプルを見つけました。

MMX de Alpha Blending
ttp://www.fides.dti.ne.jp/~tokai/vc/mmxab1.html

MMX de Alpha Blending 2
ttp://www.fides.dti.ne.jp/~tokai/vc/mmxab2.html

MMX de Alpha Blending 3
ttp://www.fides.dti.ne.jp/~tokai/vc/mmxab3.html

MMX de Alpha Blending 4
ttp://www.fides.dti.ne.jp/~tokai/vc/mmxab4.html

 4のページにも書かれていますが、あきらかにストールしている箇所が
ありますし、ループの組み方などまだまだ最適化できそうですね。


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

Name: kazuoni [URL]  ..ハッカー(106,871ポイント)   Date: 2009/09/23(水) 23:25   No:39551     
Title: Re:WINAPIで加算減算ブレンド    
Justyさn、ご回答ありがとうございます!

>あきらかにストールしている箇所

ストールという言葉が初耳で、
具体的にどこと指していただけるとありがたいのですが・・・
ペアリングとかそのあたりですか?

とりあえず、一通りのアセンブラの使い方を
学習し、最適化へと進みたいのですが、
そのペアリングでちゃんと最適化されているのか
がいまいち分かりません(汗)
なので、今ずっとどの組み合わせでやると
いい速度が出るのか淡々と実験していますw
まだ自分のなかで、「この組み合わせが有効」っとかあまり見えていませんが。。
命令表をみて、これならいけるだろっと思ったものが、
意外な組み合わせのほうが速かったり・・・
なんてこともありますが。。(CPU依存もあるでしょうし・・・)

「実際、こんなプロセスで最適化の訓練積んだよ」ッというのがありましたら、
是非レスお願いします^^;

このスレはこれ以上いくとタイトルの内容から逸脱するので、
今回はこのあたりでやめておきます^^;
おそらく近いうちに新スレがたちそっ(ry

Justyさん、御津凪さんご回答ありがとうございました!
何度も返事が遅れて申し訳ありませんでした。。

次回もよろしくお願いします。

#パック、アンパックの動作を理解したら
カラー取得は解決しました!ありがとうございました!


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

Name: Justy  ..伝説なるハッカー(429,173ポイント)   Date: 2009/09/24(木) 00:45   No:39560     
Title: Re:WINAPIで加算減算ブレンド    
 画像処理の部分なのである程度の高速化は必須だとは思いますが、
今の段階では最適化とかあまり考えず、とりあえず C/C++でいいので
普通に動くものを目指した方がいいかと思います。

 このあたりはやり始めるとキリがないですし、C/CPP -> SIMD化は
ある程度やれば効果はありますが、引き替えにメンテナンス性など
失ったりしますので。



>ストールという言葉

 データの依存関係などで CPUのパイプラインが進まなくなることを
意味しています。
 そのあたりはCPUの解説書・マニュアルを見るなり検索をしてみてください。

ストール - 通信用語の基礎知識
ttp://www.wdic.org/w/SCI/%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

 でも、今はあまり気にする必要はないかと。



>これならいけるだろっと思ったものが、
>意外な組み合わせのほうが速かったり・

 これはもうマニュアル見たり、サンプルコードなど他人が書いたコードを解析したり、
実際に書いて動かしてレジスタの中身がどう変化したのか見て……を
繰り返して慣れるしかないですね。


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



Name: yrao  ..初心者(5,124ポイント)   Date: 2009/09/20(日) 00:46   No:39389       
Title: 自機が勝手に被弾扱いになってしまいます    
こんばんは。
龍神録プロジェクトを参考にしてゲーム作りを進めているのですが、不具合が生じてしまいました。
昨日から悩んでいるのですが、自分ではどうにも解決できそうにないため質問させていただきます。

不具合というのは、
ボス又は雑魚敵が弾を発射しようとすると、自機が被弾扱いになってしまう
というものです。
 
いろいろと試してみたところ、
ini.cpp
boss_shot.cpp
enemy.cpp
graph.cpp
char.cpp
辺りに原因がありそうなので、添付しておきました。

アバウトな質問で申し訳ないのですが、どうかよろしくお願いします。


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


Name: pooka [URL]  ..上級者(17,479ポイント)   Date: 2009/09/21(月) 10:09   No:39426     
Title: Re:自機が勝手に被弾扱いになってしまいます    
>ボス又は雑魚敵が弾を発射しようとすると、自機が被弾扱いになってしまう
ということなので、当たり判定の処理を行っている部分が怪しいと思うので
確認してみてはどうでしょうか?


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

Name: yrao  ..初心者(5,184ポイント)   Date: 2009/09/23(水) 18:35   No:39538 解決!     
Title: Re:自機が勝手に被弾扱いになってしまいます    
返答遅れてしまい申し訳ないです。
 
out.cppをもう一度コピぺして、少しいじってみたところ、正常に動作しました!
 
ありがとうございました。


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



Name: SB  ..ぴよぴよ(157ポイント)   Date: 2009/09/23(水) 14:53   No:39531       
Title: Visual studio2005のプロジェクトを2008で扱う    
初めまして。シューティングゲームを製作したく調べていたところこの素晴らしいサイトに出会いました。

さっそくプロジェクトファイルをダウンロードしました。私が使っているのはVisual studio2008です。
プロジェクトファイルは2005で作成されたものでしたので RyuJin.sln を開くと変換ウィザードが出てきたので変換しました。すると変換レポート画面が出てきてそこから先に進めません。ローカルの IIS サーバーへの Web 配置はサポートされなくなりました。Web 配置ビルド ツールはプロジェクト設定から削除されました。などと書いてあります。どうしたら2008で2005のプロジェクトファイルを扱うことができるのでしょうか?

初歩的で色々間違った質問だと思います・・・。詳しく教えていただければ幸いです。


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


Name: 小夜  ..初心者(7,271ポイント)   Date: 2009/09/23(水) 16:03   No:39532     
Title: Re:Visual studio2005のプロジェクトを2008で扱う    
こんにちは!
私も最初、それでかなり悩みました!
ここからの回答は私が勝手に見つけたものなので、
もしかしたら出来ないかもしれませんが、参考までに、と回答させて頂きます。

まず、変換をした後に、「開く」のマークをクリックします。
(図の赤い丸で囲ってある所です。)
すると、「○章」と書かれたフォルダがたくさん出て来ると思います。
(○というのは、一とか二とかの章の数字です)
その中の「一章」をクリックします。
そしたら、「mydat」というフォルダがあると思います。
それをクリックすると「include」というフォルダと、「PSD」というフォルダ、「source」というフォルダがあります。
「include」には「〜.h」という形式のファイルが入っており、
「source」には「〜.cpp」というもの、「PSD」は空です。

なので、「このソースをmain.cppに〜」と言われたら、
「source」の中にある「main.cpp」というものを開いて貼り付ければ出来ます。

説明下手なので分かりにくかったと思います。すみません^^;
こんな回答でもお役に立てば幸いです。


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

Name: SB  ..ぴよぴよ(229ポイント)   Date: 2009/09/23(水) 16:17   No:39534 解決!     
Title: Re:Visual studio2005のプロジェクトを2008で扱う    
こんなに丁寧に説明していただき本当にありがたいです。
小夜さんのおっしゃる通りにやってみたら無事にファイルを開くことができました!
本当にありがとうございます。

まだまだ全くの初心者ですがこれからも宜しくお願いします。


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

Name: 小夜  ..初心者(7,456ポイント)   Date: 2009/09/23(水) 18:33   No:39537 解決!     
Title: Re:Visual studio2005のプロジェクトを2008で扱う    
こちらこそ宜しくお願いします!!
お互い頑張っていきましょう^^
私も全くの初心者ですから(;^ω^)


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



Name: 小夜  ..初心者(6,193ポイント)   Date: 2009/09/22(火) 22:31   No:39503       
Title: 敵が出てきません!    
只今、「エクセルを使って敵の出現データを作ってみよう」をやっています。
しかし、ビルドすると 正常にウィンドウは出てくるのですが、敵が出てこず
黒い背景に左寄せの白い字で「不明なfunc_state」と 29回 表示されます。
やはりソースに問題があるんですよね…;
どこに問題があるのでしょうか?
私が もしかしてここ? と思っている所は「main.cpp」です。
main.cppの変更後のソースを見てください。


#define GLOBAL_INSTANCE
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
GetHitPadStateAll(); //現在のパッド入力処理を行う
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessLoop()==0){//メインループ
switch(func_state){
case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
calc_ch(); //キャラクタ計算
ch_move(); //キャラクタの移動制御
enemy_main();//敵処理メイン
graph_main();//描画メイン
stage_count++;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
}
DxLib_End();//DXライブラリ終了処理
return 0;
}


変更、と書いてあったので変更してみました;

あと、エクセルのデータをdatフォルダに保存というのは
「mydat」の中に「csv」というフォルダを作って保存するんですよね?

かなり分からない事だらけです…(-_-;)
よろしくお願いします!


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


Name: mnkr  ..かけだし(2,152ポイント)   Date: 2009/09/22(火) 23:32   No:39507     
Title: Re:敵が出てきません!    
わたしも今そのあたりを勉強中です。

11章でしょうか。。。

11章フォルダ(ryujin.slnが入っているフォルダ)と同じ階層に
datっていうフォルダがありませんか?

わかりづらいですが、こんな感じです。

親フォルダ
   +---11章
   +---dat
      +---csv
      +---font
      +---img
      +---music
      +---se


mydatの中にcsvフォルダを作るのではありません。


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

Name: 小夜  ..初心者(6,280ポイント)   Date: 2009/09/22(火) 23:58   No:39509     
Title: Re:敵が出てきません!    
あ、そうなんですか!?
勘違いしてました;
datフォルダありました^^
でも 最初からフォルダがあるのですが…
また新しく作るのでしょうか?
画像はdatフォルダの中身です。


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

Name: mnkr  ..かけだし(2,235ポイント)   Date: 2009/09/23(水) 00:01   No:39510     
Title: Re:敵が出てきません!    
datフォルダの中のcsvフォルダに
storyH0.csvを置きます。

csvフォルダにある11章とか14章とかは、
11章になったら、11章フォルダにあるstoryH0.csvを
csvフォルダのstoryH0.csvに置き換えて(上書きして)使ってね、ってことだと思います。


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

Name: 小夜  ..初心者(6,339ポイント)   Date: 2009/09/23(水) 00:09   No:39513     
Title: Re:敵が出てきません!    
なるほど〜!!!
やってみます!
mnkrさんはそれで上手く行きましたか?
(参考にさせて頂きたいな と^^;)


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

Name: mnkr  ..かけだし(2,334ポイント)   Date: 2009/09/23(水) 00:49   No:39516     
Title: Re:敵が出てきません!    
わたしはstoryH0.csvは講座の中に「ダウンロード」というものがあればそれを優先して利用しています。
「ダウンロード」が無かったら先ほど記載した通り、
今している講座○○章フォルダのstoryH0.csvをcsvフォルダのstoryH0.csvに置き換えています。


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

Name: mnkr  ..かけだし(2,336ポイント)   Date: 2009/09/23(水) 00:52   No:39517     
Title: Re:敵が出てきません!    
動作は今のところ問題なく動いていると思います。。。

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

Name: でんすけ  ..入門者(4,697ポイント)   Date: 2009/09/23(水) 06:37   No:39523     
Title: Re:敵が出てきません!    
最初にプロジェクトのダウンロードを行っていますよね?
ダウンロードしたフォルダ内に10章と書かれたフォルダがあるはずです。
その中のRyuJin.slnを開いてください。

それは管理人さんが10章まで進めたものです。

開いたら自分が作ってきたものと見比べてください。
必ず間違いがあるはずです。


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

Name: 小夜  ..初心者(7,415ポイント)   Date: 2009/09/23(水) 16:09   No:39533     
Title: Re:敵が出てきません!    
皆様回答ありがとうございます!!!
色々とイジっていたら敵が出てくるようにはなったのですが、動きがバラバラです。
そこで、後から直そう、と11章に進んだら 10章のときになるはずの実行結果になりました。
これはなんででしょうか…?
11章と10章のソースを入れ替えればいいでしょうか?
質問ばかり申し訳ありません。;


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



Name: 初心者  ..プログラマー(36,601ポイント)   Date: 2009/09/22(火) 14:21   No:39463       
Title: 双方向リストの課題    
学校でこのような課題が出されました。
自分でこの課題に取り組んでみたところ、構造体の基本的な使い方(値や文字列を入れること等)と自己参照構造体の使い方がよく分からなく、うまく単語別に分けることができなかったので質問させていただきました。

他のサイトでも調べたのですがよく分りません。
ご指導よろしくお願いします。

「問題文」
キーボードから英文(単語数120個以内)を入力し、その英文に含まれる単語を個数と共に出力しなさい。ただし、アルファベット順(辞書順)とする。
 単語と単語の間には、空白、コンマ(,)、ピリオド(.)があり、入力英文は複数のセンテンスから構成されているものとする。
 なお、a,an,andは別の単語とする。単数形と複数形を別の単語として区別してよい。
また、大文字と小文字は区別しない。
 英文の入力は、一度に全英文を入力しても、センテンスごとに区切って入力してもよい。
 各単語は、双方向リストに格納すること。左ポインタはアルファベット順でその単語より小さい単語を、右ポインタは大きい単語を示すようにする。なお、そのような単語がない場合はNULLポインタとする。

以下の構造体を用いて作成すること。

struct data{
char *word; /*単語*/
   int cnt; /*個数*/
struct data *left /*左ポインタ*/
   struct data *right /*右ポインタ*/
}tango[120];



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


Name: non  ..熟練のプログラマー(62,804ポイント)   Date: 2009/09/22(火) 17:35   No:39470     
Title: Re:双方向リストの課題    
>うまく単語別に分けることができなかったので質問させていただきました。

うまく、単語別に分けるというのはアルファベット順に繋ぐことでしょうか?
それ以外の部分(例えば、リストの先頭か最後尾につなぐ)のプログラムを添付して
ください。一から作るのは面倒なので。





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

Name: 初心者  ..プログラマー(37,196ポイント)   Date: 2009/09/22(火) 21:47   No:39494     
Title: Re:双方向リストの課題    
英大文字をすべて英小文字に変換してから、単語に分けるとは思ったのですが、入力した英文を単語に分けるという部分からよく分らなくなってしまいました。
そして、その単語を構造体に格納するという書き方がわかりません。格納したあとの表示の仕方も教えていただけたらありがたいです…
アルファベット順にはリストのポインタを入れ換えればいいとは思っていますが、よく分かりません。
初歩の部分ですが、よろしくお願いします。

//自分で作ったのはここまでです。

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

struct data{
char *word;
int cnt;
struct data *left;
struct data *right;
}tango[120];

int main(void)
{
char buf1[256],buf2[256][256],w;
int i,j,sum,l=0,k=0,mojisu=0,a;
/*struct data *head,*free; 使い方が不明*/


while(1){
printf("英文 を入力して下さい.-999で終了:");
gets(buf1);
if(!strcmp(buf1, "-999")){
break;
}
else{ //?
sum+=strlen(buf1);
if(k>255){
k++;
sum=sum-256;
}
strcat(buf2[k], buf1);
}
}

printf("[入力英文]\n"); //そのまま変換なしで出力
for(i=0;i<=k;i++){
printf("%s",buf2[i]);
}
/*ここからよく分らないです…*/
for(i=0;i<=k;i++){
for(a=0;a<256;a++){
buf1[a]='\0';
}
for(j=0;j<256 && buf2[i][j]!='\0';j++){
if(buf2[i][j]>='A' && buf2[i][j]<='Z'){ //英大文字だったら英小文字へ
buf2[i][j]+=32;
}
w=buf2[i][j];
if((mojisu==0) && !(islower(w))){ //初めの英小文字が来るまで
continue;
}
else if((islower(w))){ //英小文字だったら
buf1[l++]=w;
mojisu++;
}
//特にこの部分
else if(!(islower(w))){ //英小文字ではなかったら



}
}
}

printf("\n\n[英文の中の英単語別出力]\n");
/*〜
* a・・・7
* an・・・3
* and・・・5 などの出力〜*/
return(0);
}


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

Name: non  ..熟練のプログラマー(63,280ポイント)   Date: 2009/09/22(火) 22:45   No:39505     
Title: Re:双方向リストの課題    
もっと、前の段階からみたいですね。ちょっと、そこからだと私に時間がないので、
ここでも読んで勉強してみてください。

単語への分解はここを参考に
http://www005.upp.so-net.ne.jp/h-masuda/cl/CAlgo/lex01.html

リスト構造は
http://www005.upp.so-net.ne.jp/h-masuda/cl/CAlgo/lex01.html

>アルファベット順にはリストのポインタを入れ換えればいいとは思っていますが
ノードを追加するときにアルファベット順になるようにします。
後で、繋ぎ変えるのは面倒です。




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

Name: box  ..ハッカー(144,167ポイント)   Date: 2009/09/23(水) 00:06   No:39512     
Title: Re:双方向リストの課題    
双方向リストの配列というデータ構造が、何だかユニークに思えます。

入力した英単語を辞書順に並べ替えて出力したいのであれば、
 ・リスト構造を使うなら、リストに挿入するときに辞書順にしておく
 ・配列を使うなら、ランダムに並んでいる要素を後からソートする
という方法があります。

リスト構造を使う(配列は使わない)か、
配列を使う(リスト構造にはしない)かの
どちらかだろうと思うのです。

出題されたかたがどういうお考えでそのデータ構造を使うように
指示されたのか、聞いてみたい気がします。


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

Name: 初心者  ..プログラマー(37,261ポイント)   Date: 2009/09/23(水) 00:19   No:39514     
Title: Re:双方向リストの課題    
nonさん、ありがとうございます。
今の自分では、この課題は出来そうもないので、勉強し直してきます。
リンクをよく見ましたが、まだよく分かりません…

単語分解プログラム、作れる方いましたら、是非書きよろしくお願いします。


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

Name: Ace  ..入門者(3,419ポイント)   Date: 2009/09/23(水) 01:00   No:39518     
Title: Re:双方向リストの課題    
つくってみた。


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

#define MAX_WORD_NUM (120)
#define MAX_WORD_LEN (20)

struct data {
char* word; // これやめませんかね…
//char word[MAX_WORD_LEN];
int cnt;
struct data* left;
struct data* right;
} tango[120];


typedef struct tagData{
// 大きな勘違いをしていたためこうなってしまった。
// でもまぁそれならそれでいっかーという感じ。
char* word;
int len;
} Data;

// qsortで使用
int word_cmp(const Data* a, const Data* b) {
int len = a->len > b->len ? b->len : a->len;
int ret = memcmp(a->word, b->word, len);
if (ret > 0) {
return 1;
} else if (ret == 0) {
// 文字数多い方が後
return a->len > b->len ? 1 : -1;
} else {
return -1;
}
}

int main(int argc, char* argv[])
{
int i, k;
int wordNum = 0;
Data words[MAX_WORD_NUM] = {0};
int tangoNum = 0;

if (argc < 2) return 0; // 一応

// wordsにひたすら突っ込む
for (i = 0; i < MAX_WORD_NUM * MAX_WORD_LEN; ++i) {
char* t = &argv[1][i]; // 一々打つの面倒なので
if (*t == '\0') break;
// 一文字目発見
if ('A' <= *t && *t <= 'z') {
words[wordNum].word = t;
// 終端の探索
for (k = 1; k < MAX_WORD_LEN; ++k) {
char* t2 = t + k; // さらに面倒なので
if (*t2 == ' ' || *t2 == ',' || *t2 == '.') {
words[wordNum].len = k;
++wordNum;
i += k;
break;
}
}
}
}

#ifdef _DEBUG
for (i = 0; i < wordNum; ++i) {
char t[20] = {0};
sprintf(t, "%%.%ds\n", words[i].len);
printf(t, words[i].word);
}
printf("-------------------------------------------\n");
#endif

// 大文字を抹殺する
for (i = 0; i < wordNum; ++i) {
for (k = 0; k < words[i].len; ++k) {
char* t = &words[i].word[k];
if ('A' <= *t && *t <= 'Z') {
*t += 0x20; // ANCII
}
}
}

// まぁとにかくソート
qsort(words, wordNum, sizeof(words[0]), (int (*)(const void*, const void*))word_cmp);

// 適当に双方向リストに入れる
for (i = 0; i < wordNum; ++i) {
struct data* t = &tango[tangoNum]; // 相変わらず面倒なので
for (k = 1; k < MAX_WORD_LEN; ++k) {
if (words[i].len == words[i + k].len) {
if (!memcmp(words[i].word, words[i + k].word, words[i].len)) {
// 一致してた
++i;
} else break;
} else break;
}
// しょうがないのでmalloc
t->word = (char*)malloc(sizeof(char) * (words[i].len + 1));
if (!t->word) return -1;
memcpy(t->word, words[i].word, sizeof(char) * words[i].len);
t->word[words[i].len] = '\0'; // これ入れなきゃいけないの忘れてた
t->cnt = k;
++tangoNum;
}

#ifdef _DEBUG
// 結果
printf("単語\t: 個数\n");
for (i = 0; i < tangoNum; ++i) {
printf("%s\t: %d\n", tango[i].word, tango[i].cnt);
}
printf("-------------------------------------------\n");
#endif

// さて、双方向にするか。
for (i = 0; i < tangoNum; ++i) {
if (i == 0) {
tango[i].left = 0;
tango[i].right = &tango[i + 1];
} else if (i == tangoNum - 1) {
tango[i].left = &tango[i - 1];
tango[i].right = 0;
} else {
tango[i].left = &tango[i - 1];
tango[i].right = &tango[i + 1];
}
}

printf("単語\t: 個数\n");
// 一応双方向で実験。一応この結果が本命で。
{
struct data* next = tango;
while (1) {
printf("%s\t: %d\n", next->word, next->cnt);
next = next->right;
if (!next) break;
}
}

// フリー
for (i = 0; i < tangoNum; ++i) free(tango[i].word);

return 0;
}


ふぅ。いい勉強になりました(私が勉強になってもしょうがないですが(笑))。
しかし、関数に分割もしてないし、双方向リスト?だから?
という出来になってますので、微妙かもですね。

せっかくリストなので(何故、双方向なのか分かりませんが…)、リストで作った後に、色々いじろうかとも思ったのですが、結局かぶった単語を消さないといけないので、リストにしても面倒くさいだけなような気がしてきて、こんな感じになっちゃったという感じです。

まぁ参考になればいいですが、超汚いので。
そんなに自信ないので、もし間違ってたらすみません。
おつかれさま、私。


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

Name: 初心者  ..プログラマー(37,383ポイント)   Date: 2009/09/23(水) 09:14   No:39525     
Title: Re:双方向リストの課題    
Aceさん、ありがとうございます。

勉強になります。
ソートの部分ですが、辞書順にすることはできますか?
ソートの部分、どのようにして辞書順にするのか、よく分かりません…

単語分解プログラム、作れる方まだまだいましたら、是非書きよろしくお願いします。


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

Name: 初心者  ..プログラマー(37,497ポイント)   Date: 2009/09/23(水) 14:36   No:39530 解決!     
Title: Re:双方向リストの課題    
nonさん、Aceさん
ありがとうございました。

無事に英文の単語分けのプログラムできました。
わからないことが出てきたら、また質問をすると思いますが、その時はよろしくお願いします。

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


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



Name: でんすけ  ..入門者(4,548ポイント)   Date: 2009/09/22(火) 22:41   No:39504       
Title: プログラムとは関係のない質問です    
グラフィックカード?の質問です。

今、SimCity4デラックスを買おうと思っています。
必要動作環境に

グラフィック:ビデオRAM 32MB以上

と書いてあるのですが、自分のPCが適正なのかわかりません。
DirectX診断ツールを使って調べましたが、

「ディスプレイ」タグ内
チップの種類:Intel(R) GMA 3100
メモリの合計:256.0MB

とあります。
これって適正でしょうか?


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


Name: Justy  ..伝説なるハッカー(428,825ポイント)   Date: 2009/09/23(水) 00:05   No:39511     
Title: Re:プログラムとは関係のない質問です    
 確かなことは言えませんが、オンボードでも動くとの話は聞いたことがありますし、
動作環境的にはグラフィックの部分だけを見ると、スペックは満たしているので動くことは
動くと思います。

 ただ、設定を変えてレンダリング負荷を下げることが必要になる
(特に人口が増えオブジェクトが多くなってきたときとか)かもしれませんし
それでも快適に遊べるかどうかは微妙なところです。


 心配でしたら、メーカーに問い合わせるのがいいかと思います。


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

Name: でんすけ  ..入門者(4,566ポイント)   Date: 2009/09/23(水) 06:21   No:39522 解決!     
Title: Re:プログラムとは関係のない質問です    
回答ありがとうございました。

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



Name: uwlover  ..入門者(3,161ポイント)   Date: 2009/09/22(火) 19:25   No:39475       
Title: 再描画がされない理由    
こんばんは。
現在、左クリックすると左上に、右クリックすると右下に円が移動するプログラムを作っているのですが、
クリックしても再描画されず、ウィンドウを最小化することで再描画されます。以下のプログラムです。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rc;
static int x1,x2,y1,y2;

switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
break;

case WM_CREATE:
x1 = 0;
y2 = 0;
x2 = 20;
y2 = 20;
break;

case WM_LBUTTONDOWN:
x1 -= 1;
y1 -= 1;
x2 -= 1;
y2 -= 1;
if(x1 < 0 || y1 < 0)
{
x1 += 1;
y1 += 1;
x2 += 1;
y2 += 1;
}
InvalidateRect(hWnd,&rc,TRUE);
break;

case WM_RBUTTONDOWN:
x1 += 1;
y1 += 1;
x2 += 1;
y2 += 1;
if(x2 > 30 || y2 > 30)
{
x1 -= 1;
y1 -= 1;
x2 -= 1;
y2 -= 1;
}
InvalidateRect(hWnd,&rc,TRUE);
break;

case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
Ellipse(hdc,x1,y1,x2,y2);
EndPaint(hWnd,&ps);
break;

default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}

クリックの際にInvalidateRect関数を使って無効領域を意図的に生成し、再描画命令を出すようにしている
はずなのですが…


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


Name: Ace  ..かけだし(1,376ポイント)   Date: 2009/09/22(火) 19:37   No:39476     
Title: Re:再描画がされない理由    
InvalidateRect()の後にUpdateWindow()を呼びましょう。
そうでないとWM_PAINTメッセージが呼ばれないので、再描画がされません。


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

Name: Justy  ..伝説なるハッカー(428,532ポイント)   Date: 2009/09/22(火) 19:44   No:39479     
Title: Re:再描画がされない理由    

>クリックの際にInvalidateRect関数を使って無効領域を意図的に生成

 InvalidateRect関数の第二引数に何を入れていますか?
 コードの通りだと未初期化変数を入れているように見えるのですが。


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

Name: uwlover  ..入門者(3,263ポイント)   Date: 2009/09/22(火) 19:58   No:39481     
Title: Re:再描画がされない理由    
>JUSTYさん
あ、RECT構造体を初期化していなかった…GetClientRect関数を使ってどこかで初期化しないといけないですね。
でも、一応プログラムとしては問題なく動くんですよね…初期化してないよ警告もありませんでしたし。というか、
Windowsプログラミングではどこで初期化したの?って思うようなオブジェクトがしばしば現れる気がします。

>ACEさん
残念ながら、その方法では上手くいきませんでした。


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

Name: Justy  ..伝説なるハッカー(428,598ポイント)   Date: 2009/09/22(火) 20:30   No:39482     
Title: Re:再描画がされない理由    

>GetClientRect関数を使ってどこかで初期化しないといけないですね

 クライアント領域全体を対象にするのであれば、RECT構造体のポインタではなく
NULLを入れてもいいですよ。


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

Name: Ace  ..かけだし(1,563ポイント)   Date: 2009/09/22(火) 22:12   No:39498     
Title: Re:再描画がされない理由    
言葉足らずでした。すみません。

Justyさんも回答していますが、一般的に全体を再描画したい場合は

InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);

とすればよいと思います。

余談ですがダブルバッファならウィンドウの背景を消去する必要はないのでInvalidateRectの第三引数をFALSEにしたりします(代わりにバッファを塗りつぶすことになります)。


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

Name: uwlover  ..入門者(3,202ポイント)   Date: 2009/09/22(火) 23:33   No:39508 解決!     
Title: Re:再描画がされない理由    
お二人方、どうもありがとうございました。引数にNULLを指定することで上手く行きました。
しかし、自分の本に一応載ってはいました…もっとちゃんと読まないといけないな…


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



Name: えーや  ..ぴよぴよ(205ポイント)   Date: 2009/09/22(火) 21:51   No:39495       
Title: doubleの比較について    
あまり重要なことではないかもしれませんが
少し悩んでしまったのでみなさんのお力をお借りしたくて質問させていただきたいと思います。

テンプレに従うと
1.自分は何がしたくて
->後述するソースから、cppにおける比較はあまり精度が信頼できないのかどうかを聞きたいです。
こういう場合はどう対処するのが妥当か(妥当というのは誤差値として極小さな値をあらかじめ加算しておくなど)
2.どう取り組んで
Visual C++ 2008 EE で作ったプログラムでdouble値の比較でおかしな部分が出てきたので
後述のサンプルコードを作ってみました。

3.トラブル
同じ値なのですが比較がうまくいっていません。

4.何が知りたいか
2番と同じくです。対処法など。

5.知識量
C++とC言語を中途半端に6年程度しています。初歩的な質問で申し訳ないです。

コード

#include"iostream"

int main()
{
double h = 1.0;
double v = 0.0;
for(int i=0;i<10;i++)
v += (double)0.1;
printf("h:%.10lf\nv:%.10lf\n",h,v);
if(v >= h)
std::cout << "OK\n";
else
std::cout << "NG\n";
return 0;
}

出力結果 :
h:1.0000000000
v:1.0000000000
NG

といったように同じ値なのに"vのほうが小さい"と判断されてしまいます。
比較を行なう前にきわめて小さな値(0.0000000001など)をvに足しておくと結果はvのほうが大きいと判断されます。

何かに困るというわけではないのですが
これはこちら側のミスというよりはコンパイラ側の精度が問題なのでしょうか?
よろしくお願いします(変な質問で申し訳ございません)



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


Name: box  ..ハッカー(144,386ポイント)   Date: 2009/09/22(火) 22:16   No:39499     
Title: Re:doubleの比較について    
コンピュータで浮動小数点数を扱う際には誤差を生じます。
0.1を10回足し合わせたとき、「正確に」1.0になるとは限りません。
printfで出力する際、小数点以下の桁数を増やしてみると
違いがわかるかもしれません。

なお、iostreamはC++の標準ヘッダーのはずです。
#include <iostream> と書くのが一般的ではないでしょうか。
""で囲むことに違和感があります。


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

Name: Ace  ..かけだし(1,635ポイント)   Date: 2009/09/22(火) 22:22   No:39500     
Title: Re:doubleの比較について    
ちなみに、コンピュータの小数点数の計算の誤差についてのネタは「プログラムはなぜ動くのか」という本に載ってます。
この本で上げてある例は、0.1を100回足しても10にならない、というお話です。
立ち読みしてみるとよいかもしれません。


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

Name: えーや  ..ぴよぴよ(352ポイント)   Date: 2009/09/22(火) 22:26   No:39501 解決!     
Title: Re:doubleの比較について    
回答ありがとうございます。
やはり近似だったのですか
(やはりという言い方はあまりよくないのですが回答を得られるまで考察や実験をしていました)。

>iostream
そうですね。私も違和感を感じながら使っておりました。
アドバイスありがとうございます。今後は気をつけて直していきたいと思います。

小さな疑問でしたが回答していただいたおかげですっきりしました。
本当にありがとうございます。


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

Name: MNS  ..上級者(17,263ポイント)   Date: 2009/09/22(火) 22:27   No:39502     
Title: Re:doubleの比較について    
言語というよりは、コンピュータの問題だと思います。
コンピュータで値は二進法で表すため、十進法で正確に表せる小数も、
循環小数などになってしまう場合があり、うまく表すことができません。
(0.1も二進法では無限小数になってしまいます)
これを『丸め誤差』などといったりしますが、これは演算では必ず出るものです。
例に出されているプログラムでは、10回ほど小数の足し算を行われていますが、
私の環境では、0.00000000000000011の誤差が発生しました。
ですから、例えば>=演算を行いたい時は、
if(v >= h)

if(v+(1e-10) > h)
などに変える、などの手立てがあると思います。
(1e-10は1の-10乗という意味です)


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



Name: 小夜  ..かけだし(1,676ポイント)   Date: 2009/09/22(火) 20:47   No:39483       
Title: 10章でつまづいています    
度々すみません。
先日、5章でつまずき 質問をさせて頂いた者です。
前回の質問ではload.cppの中がgraph.cppと全く同じになっていた、
という確認すれば気が付く簡単なミスだったので、今回はきっちり見直して質問をさせて頂きます。

今回は10章でつまずいてしまいました;
「敵を表示させる」の所です。

まず、変更後のソースを貼ります。


【function.h】

//char.cpp
GLOBAL void calc_ch();
GLOBAL void ch_move();

//graph.cpp
//描画メイン
GLOBAL void graph_main();

//ini.cpp
GLOBAL void first_ini();

//key.cpp
//現在のキー入力処理を行う
GLOBAL int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
GLOBAL int CheckStateKey(unsigned char Handle);

//現在のパッド入力処理を行う関数
GLOBAL void GetHitPadStateAll();
//受け取ったパッド番号の現在の入力状態を返す
GLOBAL int CheckStatePad(unsigned int Handle);

//laod.cpp
//データのロード
GLOBAL void load();
GLOBAL void enemy_main();
GLOBAL void ini();



【GV.h】


#include "../../../include/DxLib.h"
#include "define.h"
#include "math.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include "function.h"

//画像用変数宣言部
GLOBAL int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)
GLOBAL int img_board[40]; //ボードにつかう画像

//フラグ・ステータス変数
GLOBAL int func_state; //関数制御用変数

//構造体変数宣言部
GLOBAL ch_t ch; //キャラクタデータ宣言
GLOBAL configpad_t configpad;//コンフィグで設定したキー情報

GLOBAL int stage_count;
GLOBAL int img_enemy[3][9];//敵画像9枚分 X3体分
GLOBAL enemy_t enemy[ENEMY_MAX];


【struct.h】


//キャラクターに関する構造体
typedef struct{
int flag; //フラグ
int cnt; //カウンタ
int power; //パワー
int point; //ポイント
int score; //スコア
int num; //残機数
int mutekicnt; //無敵状態とカウント
int shot_mode; //ショットモード
int money; //お金
int img;
int slow; //スローかどうか
double x,y; //座標
}ch_t;

//パッドに関する構造体
typedef struct{
int key[PAD_MAX];
}pad_t;

//コンフィグに関する構造体
typedef struct{
int left,up,right,down,shot,bom,slow,start,change;
}configpad_t;

//敵に関する構造体
typedef struct{
//フラグ、カウンタ、移動パターン、向き、敵の種類、HP最大値、落とすアイテム、画像
int flag,cnt,pattern,muki,knd,hp,hp_max,item_n[6],img;
//座標、速度x成分、速度y成分、スピード、角度
double x,y,vx,vy,sp,ang;
//弾幕開始時間、弾幕の種類、弾の種類、色、状態、待機時間、停滞時間
int bltime,blknd,blknd2,col,state,wtime,wait;
}enemy_t;


【define.h】


//フィールドの広さ
#define FIELD_MAX_X 384
#define FIELD_MAX_Y 448
//フィールドの左上の座標
#define FIELD_X 32
#define FIELD_Y 16
//パッドキーの最大数
#define PAD_MAX 16

#include "struct.h"

//敵の同時表示最大数
#define ENEMY_MAX 30



メッセージが長すぎる、とエラーになったので一旦きらせて頂きますね^^;


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


Name: 小夜  ..入門者(3,366ポイント)   Date: 2009/09/22(火) 20:51   No:39484     
Title: Re:10章でつまづいています    
上記の続きです。


【main.cpp】


#define GLOBAL_INSTANCE
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
GetHitPadStateAll(); //現在のパッド入力処理を行う
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessLoop()==0){//メインループ
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=99;
break;
case 99://STGを始める前に行う初期化
ini();
func_state=100;
break;
case 100://通常処理
calc_ch(); //キャラクタ計算
ch_move(); //キャラクタの移動制御
enemy_main();//敵処理メイン
graph_main();//描画メイン
stage_count++;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
}
DxLib_End();//DXライブラリ終了処理
return 0;
}


【graph.cpp】


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

void graph_enemy(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].flag==1){
DrawRotaGraphF(enemy[i].x+FIELD_X,enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[0][enemy[i].img],TRUE);
}
}
}

void graph_ch(){
DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
}

void graph_board(){
DrawGraph( 0, 0,img_board[10],FALSE);
DrawGraph( 0, 16,img_board[11],FALSE);
DrawGraph( 0,464,img_board[12],FALSE);
DrawGraph(416, 0,img_board[20],FALSE);
}

void graph_main(){
graph_enemy();
graph_ch();
graph_board();
}


【enemy.cpp】


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

//敵の移動パターン0での移動制御
void enemy_pattern0(int i){
if(enemy[i].cnt<60){
enemy[i].y+=2.0;
}
if(enemy[i].cnt>60+240){
enemy[i].y-=2.0;
}
}

//敵データの登録
void enemy_enter(){
if(stage_count==100){//ゲームが始まって100カウントで登録
enemy[0].cnt =0;
enemy[0].muki =1;
enemy[0].flag =1;
enemy[0].bltime =150;
enemy[0].hp =1000;
enemy[0].hp_max =enemy[0].hp;
enemy[0].pattern=0;
enemy[0].x =FIELD_MAX_X/2;
enemy[0].y =-20;
}
}

//敵の行動制御
void enemy_act(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].flag==1){//その敵のフラグがオンになってたら
enemy_pattern0(i);
enemy[i].cnt++;
enemy[i].img=enemy[i].muki*3+(enemy[i].cnt%18)/6;
//敵が画面から外れたら消す
if(enemy[i].x<-50 || FIELD_MAX_X+50<enemy[i].x || enemy[i].y<-50 || FIELD_MAX_Y+50<enemy[i].y)
enemy[i].flag=0;
}
}
}

//敵処理メイン
void enemy_main(){
enemy_enter();
enemy_act();
}



またエラー出ました;
次に残り全部を書きます。(何度もすみません!)



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

Name: 小夜  ..入門者(3,954ポイント)   Date: 2009/09/22(火) 20:54   No:39487     
Title: Re:10章でつまづいています    
【ini.cpp】


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

//一番最初の初期化
void first_ini(){
configpad.down=0;
configpad.left=1;
configpad.right=2;
configpad.up=3;
configpad.bom=4;
configpad.shot=5;
configpad.slow=11;
configpad.start=13;
configpad.change=6;
}

//ゲームの初期化
void ini(){
stage_count=1;
memset(&ch,0,sizeof(ch_t));//自機データの初期化
ch.x=FIELD_MAX_X/2;
ch.y=FIELD_MAX_Y*3/4;
memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);//敵データの初期化
}



【load.cpp】


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

void load(){
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;



続いて、エラーメッセージです。
ビルドしますと、「ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?」と出ます。
出力先の表示の所には、


1>c:\users\○○\desktop\○○\project\project\9章\mydat\source\load.cpp(10) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\users\○○\desktop\○○\project\project\9章\mydat\source\load.cpp(10) : error C2365: 'LoadDivGraph' : 再定義; 以前の定義は '関数' でした。
1> c:\users\○○\desktop\○○\project\project\include\dxlib.h(1594) : 'LoadDivGraph' の宣言を確認してください。
1>c:\users\○○\desktop\○○\project\project\9章\mydat\source\load.cpp(10) : error C2078: 初期化子の数が多すぎます。
1>c:\users\○○\desktop\○○\project\project\9章\mydat\source\load.cpp(10) : error C2440: '初期化中' : 'int [9]' から 'int' に変換できません。
1> この変換が可能なコンテキストはありません。


と表示されます。


今回は何度か確認したのでファイルの内容が同じだった、という事は無いと思います^^;
前回は皆様ありがとうございました!
今回もご指摘ほど よろしくお願い致します。


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

Name: でんすけ  ..入門者(3,979ポイント)   Date: 2009/09/22(火) 20:57   No:39488     
Title: Re:10章でつまづいています    
とりあえず、わかるところから
load.cpp内の
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ); は
void load()内に入れてください。


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

Name: 小夜  ..入門者(4,148ポイント)   Date: 2009/09/22(火) 21:22   No:39490     
Title: Re:10章でつまづいています    
回答ありがとうございます。
またお世話になりそうですね^^;


load.cpp内の 〜 void load()内に入れてください。

>えぇと、それは
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] );
をvoid load()内に入れる つまり、
void load(LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ); )
という事でしょうか?
初歩的な質問ですみません;


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

Name: でんすけ  ..入門者(4,194ポイント)   Date: 2009/09/22(火) 21:37   No:39491     
Title: Re:10章でつまづいています    
以下のようにしてください。

void load(){
  img_board[10] = LoadGraph("../dat/img/board/10.png");
  img_board[11] = LoadGraph("../dat/img/board/11.png");
  img_board[12] = LoadGraph("../dat/img/board/12.png");
  img_board[20] = LoadGraph("../dat/img/board/20.png");
  LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] );
  LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] );
}


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

Name: MNS  ..上級者(17,063ポイント)   Date: 2009/09/22(火) 21:37   No:39492     
Title: Re:10章でつまづいています    
void load(){
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;



void load(){
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;
}

こういうことだと思いますが


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

Name: 小夜  ..入門者(4,219ポイント)   Date: 2009/09/22(火) 22:02   No:39496 解決!     
Title: Re:10章でつまづいています    
出来ました!!
そういう事だったんですね!
本当に助かりました。
でんすけさん、MNSさん どちらもありがとうございました!
またつまずくと思いますので、その時はお力添えお願い致します。


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

Name: Tatu  ..中級者(10,017ポイント)   Date: 2009/09/22(火) 22:05   No:39497     
Title: Re:10章でつまづいています    

>>小夜 さん
皆さんが回答しているので、同じことは書きません。

龍神録プログラミングの館ではプロジェクトを一括ダウンロードすることも可能なので、

ダウンロードしたものと見比べるという方法もとってはいかがでしょうか。

あと、ソースコードを乗せるときには

<pre>
コード
</pre>

というようにpreタグで囲ってください。

ただし、タグは半角で入力してください。

複数のレスを使う場合は各レスごとにpreタグで囲ってください。

規約に一通り目を通しておくとよいでしょう。


>>Dixq(管理人)さん

前にも同じ質問内容を見かけたきがするので、

10章のページを見てみましたが、

敵の画像の追加について以下のようになっていたのが問題だと思います。

--load.cppに以下を追加--

LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;

このかきかただと、load.cppの最後に追加すると思ってしまい、

この文をload関数の外にかくようです。

--load.cppのload関数内に以下を追加--と書き直してはいかがでしょうか。

あと、些細なことですがfunction.hの注釈に//laod.cppとあるのが気になりました。



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



Name: nayo  ..中級者(13,605ポイント)   Date: 2009/09/22(火) 17:44   No:39471       
Title: ライブラリの競合について    
またも質問失礼します

先日質問したプロジェクトなのですがReleaseモードでビルドすると以下のエラーが発生しました

1>libcmtd.lib(dbgheap.obj) : error LNK2005: __heap_alloc は既に LIBCMT.lib(malloc.obj) で定義されています。
1>libcmtd.lib(dbgheap.obj) : error LNK2005: __recalloc は既に LIBCMT.lib(recalloc.obj) で定義されています。
(中略)
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>LIBCMT.lib(crt0init.obj) : warning LNK4098: defaultlib 'libcmtd.lib' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。

調べてみるとリンクされるライブラリとプロジェクトのランタイムライブラリの設定が違うと起きるようなのですが解決策が分からない状況です
どのようにすれば上記のエラーを回避することができるでしょうか
どなたかご回答お願いします

環境はVisual C++ 2008 Express Edition
使っているマルチスレッドは以下のような感じのものです

---------------------------------------------------
#include <windows.h>
#include <process.h>

unsigned __stdcall threadFirstLoad( void *lpx );
---------------------------------------------------


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


Name: nayo  ..中級者(13,663ポイント)   Date: 2009/09/22(火) 21:47   No:39493 解決!     
Title: Re:ライブラリの競合について    
失礼いたしました
単にデバッグモードか、リリースモードかでリンクするライブラリを分け忘れていたという単純なものでした
以後気をつけます…


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



Name: ナイス総理大臣  ..ぴよぴよ(70ポイント)   Date: 2009/09/22(火) 19:13   No:39474       
Title: はじめまして    
初めて投稿させてもらいます。

今現在WINAPIでアクションゲームを作ってる者ですが、
WINAPIにはない関数がDXライブラリにあって、その関数だけを今のプログラムに取り入れて
使いたいと考えているんですが、そういうことは可能なのでしょうか?

もし可能ならば、

if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}

DxLib_End() ; // DXライブラリ使用の終了処理

return 0 ; // ソフトの終了
}


この部分を入れなければいけないと思うのですが、どこに入れればいいんでしょうか?

たとえばWM_CREATEやWM_TIMERの所かとか・・・。

環境は
VISTAで
コンパイラはBorlandC++compiler、BCCdeveloperです。

説明が下手ですがよろしくお願いします。


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


Name: Ace  ..かけだし(1,436ポイント)   Date: 2009/09/22(火) 19:42   No:39478     
Title: Re:はじめまして    
描画などをWin32APIでしているのであれば、おそらく無理だと思います。
DxLibはDirectXを使っているため描画の仕組みが全然違いますので。

DxLibを使うのでしたら、素直にDxLibだけで作るのがよいかと思います。


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

Name: Mist  ..熟練のプログラマー(68,364ポイント)   Date: 2009/09/22(火) 19:45   No:39480     
Title: Re:はじめまして    
DXライブラリはWinAPIとの相性がさほどよくありません。
DXライブラリはWinAPIの知識がなくても使えるように自身がウィンドウを作ったり、メッセージ処理をしてくれたれたりしています。
そのため、WinAPIベースのプログラムにDXライブラリを組み込むには隠し関数などをいろいろ使う必要があり、かなり面倒です。
主にはWinMainの中を修正する必要があります。


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

Name: ナイス総理大臣  ..ぴよぴよ(165ポイント)   Date: 2009/09/22(火) 20:54   No:39486 解決!     
Title: Re:はじめまして    
ありがとうございました。

WINAPIならWINAPIで、DXライブラリならDXライブラリでやるのが
妥当ということですね。

もやもやしてた感じがすっきりしました。

お二人ともわざわざありがとうございました!!


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



Name: yu  ..プログラマー(38,720ポイント)   Date: 2009/09/22(火) 11:09   No:39454       
Title: C++ 定義されていない基本クラス    
こんにちは
最近 C++ を弄ってます。
ですが、C++のクラスを使おうとするとファイルのインクルードが大変で困っています orz
自分の持っている参考書とかにはインクルードについて書いてなかったのでそこら辺のことは Web で探してます;
(重複定義、循環参照とか)

今、エラーが出てしまっているのですが
色々試しても全く駄目だったので質問にきました。


error C2504: 'IObjectShot' : 定義されていない基本クラスが宣言されています。

このようなエラーが突然たくさん出てきました
多分ですがファイルのインクルードとかの問題だと思うのですが...
無暗にインクルードしまくってるせいですかね;

エラーが起こっているファイルは
Main.cpp, Board.cpp, StgFrame.cpp, PlayerShot.cpp, Enemy.cpp, EnemyManage.cpp, EnemyMove.cpp,
EnemyShot.cpp, EnemyTex.cpp
です

エラーが出てしまっているプロジェクトファイルとソースファイルを添付しました
かなり初歩的なミスだと思いますが、どうかご教授お願いします m(_ _)m

ソースコードが大変なことになっているのでいつか書き直します;
とても見難いです。すみません orz
処理も訳のわからないことをしているかもしれません...(命名規則皆無ですし)

VC++2008EE , DXライブラリ


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


Name: ねこ  ..熟練のプログラマー(43,039ポイント)   Date: 2009/09/22(火) 13:37   No:39462     
Title: Re:C++ 定義されていない基本クラス    
原因までは分からなかったのですが、恐らく「source\EnemyShot.h」をどこかのincludeで循環参照してクラス情報を読み込んでいます。
そのため継承のために定義が必要な「IObjectShot」クラスがincludeされていないためエラーが出ているようです。

ここまで複雑だとちょっと読み解く自信がないので、自分が使ってる手法を記載してみます。
僕もちゃんとしたクラス定義の参考書で学習したわけではないので間違った事を書くかもしれません、ご了承下さい。
1.相互参照を行うクラス構成は継承単位で1ヘッダにまとめる
継承順に矛盾が無いように継承されるクラスから読み込んでおく
#include "GameObject.h"
#include "Enemy.h"
...

#include "IObjectShot.h"
#include "EnemyShot.h"
#include "PlayerShot.h"
...

2.各クラスで1で作成したヘッダファイルをincludeする
1で作るものは継承単位で分けても良いですし、少々無駄にincludeしても良いなら一つのヘッダにすべて記述して書いても良いと思います。
あらかじめ、必要なクラス情報が定義されたヘッダを読み込むので定義の循環参照は起きません。

3.メンバ変数・引数・戻り値等にクラスポインタを使用し、使用するクラスは「class XXX」定義
タイトル通りですが、変数や引数は全てポインタにしておいて、クラス宣言前にclassでそれぞれ定義しておくと
2で必ず実体定義があるはずなのでコンパイル時には問題ありません。


1,2,3の手順だと必ず無駄にincludeする定義が出来てしまいますが、ゲーム等では複雑な相互参照が起こりやすいため、クラスの仕組みを変えたり新しい相互参照が出来るたびにinclude順を手直しする手間に比べたら大分楽だと思います。

また、この手順を使用するとcpp1個のコンパイルコストもがんがん上がってしまうので、プリコンパイル済みヘッダーを使用するとリビルドしてもすぐ終わると思います。


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

Name: MNS  ..上級者(16,374ポイント)   Date: 2009/09/22(火) 14:26   No:39464     
Title: Re:C++ 定義されていない基本クラス    
基底クラスとして使われているIObjectShotクラスを定義しているヘッダをインクルードしていないのが問題です。
エラーが発生するヘッダの全てに、#include "ObjectShot.h"を書き加えればエラーは消えると思います。

基本的に、ヘッダ内で他のヘッドをインクルードするべきではありません。
なるべくソースファイル内でインクルードしてください。


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

Name: Justy  ..伝説なるハッカー(428,452ポイント)   Date: 2009/09/22(火) 15:39   No:39465     
Title: Re:C++ 定義されていない基本クラス    

>無暗にインクルードしまくってるせいですかね

 まぁそうですね、しまくっているというか、各ファイルに必要なインクルードの区別がついておらず
闇雲にインクルードしているようにみえます。

 少し整理が必要ですね。



>ソースコードが大変なことになっているのでいつか書き直します;

 いつか、と言わずいい機会ですので今見直してみてはいかかでしょうか。
 綴りミスとか、予約済み識別子の使用とか、潜在的バグとかが見つかるかもしれませんし。


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

Name: yu  ..プログラマー(38,988ポイント)   Date: 2009/09/22(火) 15:48   No:39466     
Title: Re:C++ 定義されていない基本クラス    
返信ありがとうございます m(_ _)m

>>ねこ様

わざわざ詳しく教えて頂き、ありがとうございます
その方法だったら一つのヘッダファイルを変更するだけでいいんですね。非常に参考になりました
今度、その方法で書き直してみます。(実体を持ってしまっているクラスがあるので変更が大変そうです;
後、プリコンパイル済みヘッダーというものがあったんですね・・・
こちらもかなり参考になりました。本当にありがとうございます


>>MNS様
>エラーが発生するヘッダの全てに、#include "ObjectShot.h"を書き加えればエラーは消えると思います。

全てのヘッダファイルに書いてみたんですが消えませんでした;

>ヘッダ内で他のヘッドをインクルードするべきではありません。

参考にしていたソースコードがヘッダファイルでインクルードしていたので
てっきりヘッダファイルでインクルードしないといけないのかと思っていました;
今度から変えようと思います。ありがとうございます。


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

Name: yu  ..プログラマー(39,191ポイント)   Date: 2009/09/22(火) 16:07   No:39467     
Title: Re:C++ 定義されていない基本クラス    
返信ありがとうございます m(_ _)m

>>Justy様
>闇雲にインクルードしているようにみえます。 少し整理が必要ですね。

StgFrame がシューティングゲームを管理しているんですが
敵が自機の位置を知るためにStgFrameをインクルードすると(StgFrame内にプレイヤーのポインタがあるので)
ほとんどのヘッダがインクルードされてしまっています;
構造上問題がありそうですね・・・

正直あまりヘッダ、及びインクルードについて理解できていません;


>いつか、と言わずいい機会ですので今見直してみてはいかかでしょうか。

そうですね、確かに良い機会ですので今一度見直した方がいいですね。
ご助言ありがとうございます m(_ _)m


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

Name: MNS  ..上級者(16,716ポイント)   Date: 2009/09/22(火) 16:09   No:39468     
Title: Re:C++ 定義されていない基本クラス    
そうですね。確かに全てのファイルでインクルードしてもエラーが消えませんね。

「定義されていない基本クラスが宣言されています。」
というエラーは、基底クラスの定義の前に派生クラスが定義されているため発生するエラーです。

例えば、

<---A.h--->
#include "C.h"
class A
{
//...
};

<---B.h--->
#include "A.h"
class B :public A
{
//...
};

<---C.h--->
#include "B.h"



このようなコードがあるとしましょう。
このとき、もし最初にA.hがインクルードされたとしても、
Aクラスを定義する前にC.hをインクルードしてしまい、
また、C.hがB.hをインクルードするため、
結果的にBクラスの定義がAクラスの前に行われてしまうのです。

yuさんのコードのエラーはこれが原因ですが、
今のプログラムコードは非常にわかりにくいものと成っています。

ですから、一旦全てのヘッダのインクルードを消してみましょう。
そして、インクルードするファイルを整理しましょう。
ヘッダ内でインクルードするファイルは、
そのヘッダで定義するクラスで利用しているクラスを定義しているヘッダのみにしましょう。
クラスがポインタの場合には、インクルードする必要はありません。
それ以外は、全てソースファイルでインクルードするようにしましょう。

そうすることによって、各ヘッダ同士の関係がわかりやすくなるだけではなく、
コンパイル時間を大幅に短縮することが出来ます。


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

Name: yu  ..プログラマー(39,285ポイント)   Date: 2009/09/22(火) 18:08   No:39472 解決!     
Title: Re:C++ 定義されていない基本クラス    
返信ありがとうございます m(_ _)m

>>MNS様

なるほど・・・よく理解できました
ありがとうございます。非常に参考になります


おかげさまでエラーが消えました。
エラーが消えたことより、皆様からコメントで学べたことが非常にうれしいです
本当にありがとうございました m(_ _)m


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



Name: 小夜  ..ぴよぴよ(260ポイント)   Date: 2009/09/21(月) 15:54   No:39431       
Title: 5章でつまづいています    
こんにちは。
只今、「龍神録プログラミングの館」にて龍神録を作っているのですが、
第5章の「宣言の仕方を工夫しよう」の所でつまづいています。

function.h、GV.hを変更した所までは良いのですが、最後に
"「main.cpp」「graph.cpp」「load.cpp」にある変数の宣言部と、extern宣言を全て消してください。"
というのが どこを消せばいいのか分からず つまづいています。
extern宣言というのは最初にexternとついているやつで、
変数の宣言部は一番最初のやつですよね?(違ったでしょうか;)
それは分かるのですが、どこまで消せばいいのか分からず悩んでます。
どこを消せばいいのでしょうか?
具体的にお願いします!


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


Name: でんすけ  ..入門者(3,613ポイント)   Date: 2009/09/21(月) 16:45   No:39432     
Title: Re:5章でつまづいています    
load.cppの場合

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

extern int img_ch[2][12];

void load(){
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}

とあると思います。
それを


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

void load(){
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}


とすればいいんです。


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

Name: 小夜  ..ぴよぴよ(677ポイント)   Date: 2009/09/21(月) 22:12   No:39445     
Title: Re:5章でつまづいています    
御回答ありがとうございます!
しかし やってみたのですが、なぜだか上手くいきません…
変更した後のを貼りますので、違う所をご指摘ください。

まず 【main.cpp です。】

#define GLOBAL_INSTANCE
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

load();//データロード

while(ProcessLoop()==0){//メインループ

graph_main();//描画メイン

if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
}

DxLib_End();//DXライブラリ終了処理
return 0;
}





【次に load.cpp】

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

void load(){
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}




【最後にgraph.cpp】

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

void graph_ch(){
DrawRotaGraphF(ch.x,ch.y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
}

void graph_main(){
graph_ch();
}



よろしくお願い致します!


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

Name: でんすけ  ..入門者(3,874ポイント)   Date: 2009/09/21(月) 22:55   No:39446     
Title: Re:5章でつまづいています    
どんなエラーメッセージでますか?
ソースは見たところ問題ないと思います。

あと以下のソースも確認してみてください。

「GV.h」

#include "../../../include/DxLib.h"
#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include "function.h"

//画像用変数宣言部
GLOBAL int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)

//構造体変数宣言部
GLOBAL ch_t ch; //キャラクタデータ宣言




「function.h」

//graph.cpp
//描画メイン
GLOBAL void graph_main();

//key.cpp
//現在のキー入力処理を行う
GLOBAL int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
GLOBAL int CheckStateKey(unsigned char Handle);

//laod.cpp
//データのロード
GLOBAL void load();


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

Name: 小夜  ..ぴよぴよ(922ポイント)   Date: 2009/09/22(火) 10:16   No:39453     
Title: Re:5章でつまづいています    
GV.hもfunction.hはどちらも問題ありませんでした。
エラーメッセージは、ビルドした時に
「ビルド エラーが発生しました。続行して、最後に成功したビルドを実行しますか?」
と なり、出力先の表示(?)という所に、

graph.obj : error LNK2005: "void __cdecl graph_ch(void)" (?graph_ch@@YAXXZ) は既に load.obj で定義されています。
1>graph.obj : error LNK2005: "void __cdecl graph_main(void)" (?graph_main@@YAXXZ) は既に load.obj で定義されています。
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl load(void)" (?load@@YAXXZ) が関数 _WinMain@16 で参照されました。
1>C:\Users\○○\Desktop\○○\project\project\4章\Debug\RyuJin.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と表示されます。
うーん…難しいです^^;


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

Name: Tatu  ..中級者(10,191ポイント)   Date: 2009/09/22(火) 11:09   No:39455     
Title: Re:5章でつまづいています    
そのエラーメッセージはデバッグ時にビルドを行い、失敗したときに出ます。

そのビルドのときには、ヘッダファイルの変更が反映されないことがあるので、

一回デバッグ>デバッグ開始ではなく、

ビルド>ソリューションのリビルドを選んでみてください。

それでもだめなら、GV.hとfunction.hの中身を見せてください。



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

Name: 小夜  ..かけだし(1,201ポイント)   Date: 2009/09/22(火) 11:22   No:39456     
Title: Re:5章でつまづいています    
やってみたのですがダメでした…;
GV.hとfunction.hの中身ですね。


【GV.h】


#include "../../../include/DxLib.h"
#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include "function.h"

//画像用変数宣言部
GLOBAL int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)

//構造体変数宣言部
GLOBAL ch_t ch; //キャラクタデータ宣言





【function.h】


//graph.cpp
//描画メイン
GLOBAL void graph_main();

//key.cpp
//現在のキー入力処理を行う
GLOBAL int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
GLOBAL int CheckStateKey(unsigned char Handle);

//laod.cpp
//データのロード
GLOBAL void load();


ちゃんと出来ていると思ってはいるのですが....
ご指摘よろしくお願いします。


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

Name: Justy  ..伝説なるハッカー(427,949ポイント)   Date: 2009/09/22(火) 11:53   No:39457     
Title: Re:5章でつまづいています    
 load.cppの中に load関数がなく、代わりに graph_ch関数や graph_main関数が
定義されていませんか?


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

Name: Tatu  ..中級者(10,224ポイント)   Date: 2009/09/22(火) 12:16   No:39458     
Title: Re:5章でつまづいています    
>>Justy さん
今、5章のプロジェクトでload.cppとgraph.cppの名前を入れ替えて試しましたが

正常に動きました。


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

Name: Tatu  ..中級者(10,335ポイント)   Date: 2009/09/22(火) 12:36   No:39459     
Title: Re:5章でつまづいています    
>>Justyさん
すみません。勘違いしました。
load.cppとgraph.cppが入れ替わっているのではなく、
load.cppの中身がgraph.cppとまったく同じものだということですね。

そのようにしたら確かに小夜さんと同じ状態になりました。


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

Name: Justy  ..伝説なるハッカー(428,209ポイント)   Date: 2009/09/22(火) 13:00   No:39460     
Title: Re:5章でつまづいています    

>load.cppの中身がgraph.cppとまったく同じものだということですね

 エラーメッセージからそのまま読み取ったのが上記のものだったのですが、
端的に纏めるとまさにそういうことになりますね。


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

Name: 小夜  ..かけだし(1,204ポイント)   Date: 2009/09/22(火) 13:10   No:39461 解決!     
Title: Re:5章でつまづいています    
皆様ありがとうございました!!!
よく確認すると、load.cppの中がgraph.cppと同じになっていました;
変更してビルドすると4章と同じようになりました。
皆様本当にありがとうございました!
また助けてくださいますよう、よろしくお願い致します^^;


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



Name: 玄p  ..ぴよぴよ(176ポイント)   Date: 2009/09/22(火) 03:02   No:39451       
Title: 無題    
10章の敵を出現させるのが、load.cppのエラーでできません。
どなたか教えてください

load.cpp↓

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

void load(){
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;


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


Name: でんすけ  ..入門者(3,908ポイント)   Date: 2009/09/22(火) 04:52   No:39452     
Title: Re:無題    
一番下のLoadDivGraph関数が悪いです。
同じload関数の中に入れてください。


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



Name: kyamori  ..ぴよぴよ(98ポイント)   Date: 2009/09/20(日) 21:37   No:39417       
Title: 自機の当たり判定とメニュー画面    
龍神録のプログラムは難しいのでシューティングゲームの館の方で学ばせて頂いている者です。
DXライブラリとC言語を使っています。
そこで、自機の当たり判定のプログラムを教えていただきたいです。

・自機と敵の接触の当たり判定
・敵弾と自機の当たり判定

この二つの判定が分かりません。
別々に当たり判定を管理すると大変と聞いていますが、できれば別々に処理したいです。
ご協力お願いします。


また、簡単なメニュー画面を作ろうと思っています。
エンターを押したらゲームが始まる程度のものです。
これも教えていただければ嬉しいです。


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


Name: situmon  ..熟練のプログラマー(45,469ポイント)   Date: 2009/09/20(日) 23:22   No:39419     
Title: Re:自機の当たり判定とメニュー画面    
まず当たり判定ですが、画像つきで詳しいプログラミングの館のs11を見てみましょう。
つぎにメニュー画面もプログラミングの館の33をみてみましょう。
わからなければ自分のわかる範囲でお教えします。


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

Name: kyamori  ..ぴよぴよ(238ポイント)   Date: 2009/09/21(月) 23:08   No:39447     
Title: Re:自機の当たり判定とメニュー画面    
回答ありがとうございます!
プログラミングの館を読んで頑張ってみましたが中々うまくできませんでした。
メニュー画面はお陰さまで何とかなりそうです。
当たり判定の説明をお願いします。

敵の弾は大きさが3種類ほどあるのでそれはswitch文で分けるのでしょうか。
敵弾と自機の当たり判定の場合、rangeにはどちらの半径を代入すればいいのでしょうか。
その他もろもろ私も書きだせない疑問があるので…。
お願いします!


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



Name: てつ [URL]  ..入門者(4,570ポイント)   Date: 2009/09/21(月) 13:20   No:39429       
Title: 3DダンジョンタイピングRPG作りました    
久しぶりに書き込みます。

場違いな書き込みかもしれませんが、より多くの方にプレイしてもらいたいので
書き込ませてください。

3DダンジョンタイピングRPG作りました。その名も

Sword Finger V2

以前、管理人さんにプレイしていただいたタイピングゲームの完成版です。

前のバージョンは私が通ってた専門学校のかなり古いライブラリで作ったので
「動かない」「動作が変」とかなり叩かれました。

でも今回は動きます。Easy3Dで作られています(DXライブラリじゃないのかよ!
という突っ込みはなしです)。「最新」のDirectX9.0cが必要です。

実は今回は私プログラム担当してません。デザイン、脚本のみです。
機動戦士パンダムさんという方と協力して作りました。

プレイ時間は2時間程度なのでよろしければプレイしてください。

【紹介ページ】
http://www.boreas.dti.ne.jp/~tetsuaki/sword_finger_v2.html

ちなみに次回作はまた私がDXライブラリで作る予定です。


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


Name: mnkr  ..かけだし(2,017ポイント)   Date: 2009/09/21(月) 19:38   No:39440     
Title: Re:3DダンジョンタイピングRPG作りました    
プレイさせて頂きました。
問題なく快適に動作しました。
面白かったです。

気になった点をいくつか。。。
レベルアップ、宿屋で1泊で1レベルしかあがりませんね。。。
2〜3レベル分稼いだら、そのぶん何泊もしないといけませんね。。。

タイピングする文字:研修医の資格(だったかな・・?)
資格なのに、「SIGOTO」となっていた気がします。(うろ覚え)

それと、設定ではSHE→SYE、SHA→SYAがあるのにSHO→SYOがないので
HをYに設定していたので、
「野球少年」等のSHOをSYOと思って入力につまづくことがあったり。。。

文字を入力するたびにバシバシ攻撃エフェクトが表示するので
結構気持ちよかったです!


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

Name: Tatu  ..初心者(7,718ポイント)   Date: 2009/09/21(月) 20:25   No:39442     
Title: Re:3DダンジョンタイピングRPG作りました    
>>てつ さん
プレイしました。タイピングごとに攻撃するというシステムは
やっていて気持ちのいいものでした。
3Dダンジョンゲームですが、複雑な謎解きや、暗闇、落とし穴
ターンテーブル、罠付きの宝箱、面倒な育成システムなどといったものはないので、
そういったものが嫌いな人でも楽しめると思います。
そちらの掲示板にも書きこみましたので、見てください。

>>mnkr さん
確か薬剤師の資格の読みが「やくざいしのしごと」になっていたと思います。


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

Name: てつ [URL]  ..入門者(4,694ポイント)   Date: 2009/09/21(月) 21:06   No:39443     
Title: Re:3DダンジョンタイピングRPG作りました    
プレイありがとうございます!!

>mnkrさん
面白かったですか!!良かった!!

宿屋は低レベルクリアしたい方のためにあえてそうしました。
バグ報告感謝です。


>Tatuさん
良心的な感想ありがとうございます!!
私のところの掲示板にも書き込んでくださるとは!!感激です!!

「薬剤師の資格」、了解しました。



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



Name: ディア  ..かけだし(2,075ポイント)   Date: 2009/09/18(金) 20:04   No:39343       
Title: 選択画面    
たびたび質問すみません。

現在、ゲームプログラミングの館 33章を見ながら、
メインメニュー画面を付けようと思っています。

ソース等は大体解ったのですが、
どのcpp内に入れればよいのでしょうか?

また、特定の項目が選択されたとき、
そこに移動するにはどうしたらよいのでしょうか。

なんか聞いてばっかりですが、
答えて頂けないでしょうか




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


Name: kazuoni [URL]  ..ハッカー(106,176ポイント)   Date: 2009/09/18(金) 23:11   No:39354     
Title: Re:選択画面    
>どのcpp内に入れればよいのでしょうか?

どのように分割されているのかが把握できないので
もう少し、現在の状態を詳しく書いてください。

>特定の項目が選択されたとき、
>そこに移動するにはどうしたらよいのでしょうか。

そことは選択された場所ですか?
例えばですけど、

switch(main_flag)

{
case 0:
Menu();
case 1:
Game();

...
}

でフラグの変化をつければ、プログラムの通る場所が変わります。


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

Name: ディア  ..かけだし(2,395ポイント)   Date: 2009/09/19(土) 09:21   No:39365     
Title: Re:選択画面    
現在、龍神録プログラミングの館にて進めています。
main.cpp
char.cpp
ini.cpp
key.cpp
load.cpp
music.cpp
effect.cpp
out.cpp
cshot.cpp
graph.cpp
graph_back.cpp
enemy.cpp
enemy_act_pattern.cpp
shot.cpp
shotH.cpp
DrewPixel.cpp

があります。
もちろん、必要なら新しく追加もします。

さらに細かいことも書いた方がいいでしょうか。

>そことは選択された場所ですか?
そうです。
説明不足ですみません...




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

Name: でんすけ  ..入門者(3,503ポイント)   Date: 2009/09/19(土) 10:25   No:39369     
Title: Re:選択画面    
33章のコード

#include "DxLib.h"

int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}

void char_disp(int White,int y){
DrawString( 150 , y , "■" , White );
DrawString( 170 , 100 , "NEW GAME" , White );
DrawString( 170 , 120 , "CONTINUE1" , White );
DrawString( 170 , 140 , "CONTINUE2" , White );
DrawString( 170 , 160 , "CONTINUE3" , White );
DrawString( 170 , 180 , "CONTINUE4" , White );
DrawString( 170 , 200 , "CONTINUE5" , White );
DrawString( 170 , 220 , "CONTINUE6" , White );
DrawString( 170 , 240 , "LOG OUT" , White );
}


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

int Key[256];
int White , y=100; //色とy座標の宣言

ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

White = GetColor( 255 , 255 , 255 ) ; //色の取得


while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存       ↑ESCが押されていない

char_disp(White,y); // 文字を描画

if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y+=20;
if(y==260) // y座標が260なら(選択が一番下なら)
y=100; // 選択座標を一番上に
}

ScreenFlip();//裏画面反映
}

DxLib_End();
return 0;
}


をどこに書けばいいかってことでしょうか?

もしそうならmain.cpp内でいいと思います。
もちろん新しくcppを作ってそこに書いてもいいですよ。


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

Name: kazuoni [URL]  ..ハッカー(106,465ポイント)   Date: 2009/09/19(土) 23:02   No:39388     
Title: Re:選択画面    
まず、どのようにゲーム画面の分岐をしているのかがわからないので、
これまたなんとも言えないのですが・・・

main.cppにゲーム処理を書いているのですかね?
それなら、ゲーム処理を関数化し、別ファイルで作り、
main.cppでは、ゲームフローを処理するようにすれば
いいかと思います。(前のスレで書いたswitch文の分岐みたいに)



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

Name: ディア  ..かけだし(2,415ポイント)   Date: 2009/09/21(月) 19:45   No:39441 解決!     
Title: Re:選択画面    
回答有難うございます。

頑張ってみます。


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



Name: situmon  ..熟練のプログラマー(45,670ポイント)   Date: 2009/09/21(月) 18:02   No:39433       
Title: 終了するとエラー    
なぜか終了すると(ゲームを終わると)
Shooting Game.exe の 0x00d547b7 で初回の例外が発生しました: 0xC0000005: 場所 0xfeeeff4e を読み込み中にアクセス違反が発生しました。
Shooting Game.exe の 0x00d547b7 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfeeeff4e を読み込み中にアクセス違反が発生しました。
と出てきて正常に終われません。
どうしてなのでしょうか?
お願いします。


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


Name: MNS  ..上級者(16,223ポイント)   Date: 2009/09/21(月) 18:04   No:39434     
Title: Re:終了するとエラー    
情報が少なすぎますが、
おそらく解放処理などで、不正なポインタなどにでもアクセスしたのではないでしょうか?


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

Name: situmon  ..熟練のプログラマー(46,595ポイント)   Date: 2009/09/21(月) 18:07   No:39435     
Title: Re:終了するとエラー    
MNSさん回答ありがとうございます。
コードは

#include "DxLib.h"
#include "Global.h"

extern int GetHitKeyStateAll_2();
extern int CheckStateKey(unsigned char Handle);
extern void GetHitPadStateAll();
extern int CheckStatePad(unsigned int Handle);

void message_box(){
int flag;
flag=MessageBox(
NULL ,
TEXT("フルスクリーンモードで起動しますか?") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
}
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;
if(ClearDrawScreen()!=0)return -1;
GetHitKeyStateAll_2();
GetHitPadStateAll();
return 0;
}

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

//初期化
extern void Bgm_se_load();
extern void load();
extern void initial();
//省略

//o→
extern void FpsTimeFanction();
int RefreshTime=0;
//o←

SetOutApplicationLogValidFlag( FALSE );

message_box();

if( DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK ) !=0) return -1;

//初期化処理
save_data_load();
load();
Bgm_se_load();

while(ProcessLoop()==0){

switch(main_flag){

case 99://タイトル用

initial();

main_flag=0;

break;

case 0://タイトル用

Title_Draw();

Music_Play();

t_count++;

break;

case 1://レベル選択

Choose_level_Draw();

t_count++;

break;
//省略
}

FpsTimeFanction();//old
ScreenFlip();//裏画面を表画面に反映
while(GetNowCount() - RefreshTime < 17);//old
}

DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}




具体的な解決法なんでしょう。


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

Name: situmon  ..熟練のプログラマー(46,611ポイント)   Date: 2009/09/21(月) 18:19   No:39436     
Title: Re:終了するとエラー    
どうやら、ゲームパッドをつないでいるときだけ起こるようです...

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

Name: ねこ  ..熟練のプログラマー(42,137ポイント)   Date: 2009/09/21(月) 18:39   No:39437     
Title: Re:終了するとエラー    
とりあえずどこで落ちるのかトレースしてみてはどうでしょうか?
DxLib_End内だとどうしようもないですし。


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

Name: Justy  ..伝説なるハッカー(427,911ポイント)   Date: 2009/09/21(月) 18:48   No:39438     
Title: Re:終了するとエラー    

>どうやら、ゲームパッドをつないでいるときだけ起こるようです

 似たような症例は聞いたことがありますが、状況を整理するために
何の関数を呼び出した後落ちているのか、0x00d547b7がどのモジュールが
管理するメモリなのか調べてみて下さい。

 デバッガでステップ実行したり、モジュールウインドウで該当するアドレスを
調べれば何か判るはずです。


 その結果、DxLib_End関数内で、且つジョイパッドが使用しているモジュールの中で
落ちているとなると

C言語何でも質問掲示板
ttp://www.play21.jp/board/formz.cgi?action=res&resno=26114&page=&lognum=82&id=dixq&rln=26163

と同様の現象であることが疑われます。

 これらは結局真の原因は判っていないので、ジョイパッドを抜くしか
現状回避策がありません。
 
 その場合、本家で聞いた方がいいかと思います。


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

Name: situmon  ..熟練のプログラマー(46,790ポイント)   Date: 2009/09/21(月) 19:36   No:39439 解決!     
Title: Re:終了するとエラー    
よくしらべていませんが、エレコムの結構昔?というより、生産販売終了されたのつかっているので、相性があわないのかもしれません。若干違うかもしれませんが、URL先の質問者と同じ症状です。
しょうがないのですね。
バグであったら(こちらのプログラムによる)よくないな、と思いましたので・・・
ですが多分抜けばいいですね。
みなさまどうもありがとうございました。


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



Name: TKOZ  ..プログラマー(31,263ポイント)   Date: 2009/09/20(日) 10:52   No:39398       
Title: インベーダーゲームを作っているのですが…    
毎度、お世話になっています。TKOZです。
Move_Interval(敵の移動間隔)というグローバル変数を敵の数が減少するごとに下げると、
敵がとんでもない動きをします。
その処理を行っている関数は、SpeedUp()関数です。
原因不明で、BorlandC++Compiler5.5でも、VisualC++でも全く同じ動きをします。
とりあえず、今は、VisualC++で動かしていますが、誰か原因が分かる方や、こうすれば
大丈夫のようなアドバイスください。よろしくお願いします。


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


Name: ねこ  ..熟練のプログラマー(41,827ポイント)   Date: 2009/09/20(日) 11:28   No:39400     
Title: Re:インベーダーゲームを作っているのですが…    

timer++;
if(timer>Move_Interval)
{
timer=0;
Enemy[i][j].x+=Enemy[i][j].movex;
static int count=0;
count++;
if(count>Move_Interval*2)
{
count=0;
PlaySoundMem(SoundHandle[3] , DX_PLAYTYPE_BACK ) ;
//ズクズク音を再生する
}
}

この処理、敵の数だけループしている中に記述したらまずいんでは?
外にある必要があると思いますが


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

Name: TKOZ  ..プログラマー(31,419ポイント)   Date: 2009/09/20(日) 12:39   No:39402     
Title: Re:インベーダーゲームを作っているのですが…    
>>ねこさん
>この処理、敵の数だけループしている中に記述したらまずいんでは?
>外にある必要があると思いますが

ズクズク音(敵が動く音)の再生処理の事でしょうか?
このままでも、動きますが、一応、ループの外で処理するようにしました。
他にもおかしい所がありましたら、よろしくお願いします。


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

Name: MNS  ..上級者(15,120ポイント)   Date: 2009/09/20(日) 12:50   No:39404     
Title: Re:インベーダーゲームを作っているのですが…    
ねこさんが言っているのはtimerに対する加算処理のことでは?
この仕組みでは、毎ステップごとに敵の数だけtimerに加算されてしまいますが、
それは望まれることなのでしょうか?


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

Name: TKOZ  ..プログラマー(31,502ポイント)   Date: 2009/09/20(日) 13:08   No:39405     
Title: Re:インベーダーゲームを作っているのですが…    
>>MSNさん
>>ねこさん
timerでしたか…。全く気づきませんでした。
そうですね。良くソースコードを見ると、確かに敵の数だけ加算されてしまいますね。
timerをstatic int timer[5][11]={0};と宣言し直しました。
そうすると、上手く動きました。ありがとうございました。


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

Name: TKOZ  ..プログラマー(31,539ポイント)   Date: 2009/09/20(日) 15:38   No:39408     
Title: Re:インベーダーゲームを作っているのですが…    
先ほどはありがとうございました。
しかし、また悩んでいる問題があります。

壁敵敵敵
壁敵敵
壁敵 敵
移動方向←

とか、
敵敵敵壁
敵 敵壁
 敵 壁
移動方向→

等の場合、
どうすれば、一回だけ全体をY方向に32足して、移動方向を変えるのですか?

現状のコードでは、うまくいかないです。


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

Name: バグ  ..ハッカー(170,684ポイント)   Date: 2009/09/20(日) 17:26   No:39411     
Title: Re:インベーダーゲームを作っているのですが…    
移動させる前に、次に移動したら壁に重なる敵がいるかどうかを判定し1匹でも見つかったならば、移動量にマイナス1を掛ける…という方法で如何でしょうか?

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

Name: TKOZ  ..プログラマー(31,636ポイント)   Date: 2009/09/20(日) 19:33   No:39413     
Title: Re:インベーダーゲームを作っているのですが…    
>>バグさん
どうすれば、そのようなコードを書くことができるのか、
分かりません。

とりあえず、movex*=-1;としましたが、条件があいまいで、
if(Enemy[i][j].x<0 || Enemy[i][j].x>640-32)としました。
それ専用の関数でも作る必要がありそうでしたが、あまりメリットが
感じられなかったので、削除しました。

とりあえず、今日は、ここまでにしておきます。


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

Name: MNS  ..上級者(15,937ポイント)   Date: 2009/09/20(日) 22:28   No:39418     
Title: Re:インベーダーゲームを作っているのですが…    
いまいちわかりかねるのですが、
敵一個体ではなく、敵全体の動きを反転させたい、ということでしょうか?

前提として、全ての敵はmovexを敵のx座標に加算させることによって動いている、という認識のもとで話を進めます。
間違っている場合は以下の話は全く的外れな回答となりますので、参考にしないでください。

movexが正の場合、全ての敵で最も右に存在する敵を探します。
これは、全ての敵の座標を比較し、最もx座標が大きいものの座標を何かに記憶させればよいです。
そして、その座標が(640-敵の大きさ)の以上かどうかを調べます。
もし、それが真であった場合、movexの値を負にし、全ての敵のy座標に対し32をプラスします。

moveyが負の場合、全ての敵で最も左に存在する敵を探します。
これは、全ての敵の座標を比較し、最もx座標が小さいものの座標を何かに記憶させればよいです。
そして、その座標が0以下かどうかを調べます。
もし、それが真であった場合、movexの値を正にし、全ての敵のy座標に対し32をプラスします。

実際の擬似コードは以下のようなものになります。

if(movex > 0)
{
int maximum_x = -65535;

for(int i = 0; i < 敵の最大数; ++i)
{
if(敵[i].x > maximum_x)
{
maximum_x = 敵[i].x;
}
}

//敵の大きさが均一でない場合は、
//最も右にいる敵の大きさも記憶する必要があります
if(maximum_x >= (640 - 敵の大きさ))
{
movex *= -1;
for(int i = 0; i < 敵の最大数; ++i)
{
敵[i].y += 32;
}
}
}
else
{
int minimum_x = 65535;

for(int i = 0; i < 敵の最大数; ++i)
{
if(敵[i].x < minimum_x)
{
minimum_x = 敵[i].x;
}
}

//敵の大きさが均一でない場合は、
//最も右にいる敵の大きさも記憶する必要があります
if(minimum_x <= 0)
{
movex *= -1;
for(int i = 0; i < 敵の最大数; ++i)
{
敵[i].y += 32;
}
}
}


この擬似コードを、あなた自身のプログラムに使えるようアレンジしてみてください。


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

Name: TKOZ  ..プログラマー(31,729ポイント)   Date: 2009/09/21(月) 13:29   No:39430 解決!     
Title: Re:インベーダーゲームを作っているのですが…    
MNSさんとこのスレッドのみなさんへ

ありがとうございました。
無事、インベーダーゲームは完成しました。
まだ、微調整が必要ですが、ほぼ完成となりました。

いろいろなご意見、アドバイスなど、とても参考になりました。

また、機会があれば、お話しましょう。それでは失礼します。


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



Name: MNS  ..上級者(16,110ポイント)   Date: 2009/09/21(月) 06:41   No:39421       
Title: コンソールとWindowsアプリケーションを同時に起動させる方法    
VC++2008EEを利用し、ゲームを製作しているのですが、
DXライブラリを使うに当たり、printfDxなどの関数を使い、デバッグを行うのに限界を感じはじめました。

たまに、Windowsアプリケーションと、コンソールアプリケーションを一度に起動するプログラムを見ます。
VC++2008EE+DXライブラリで同じようなことは出来ないでしょうか?

具体的にいえば、一つのプログラム内でコンソールとWindowsアプリケーションを起動し、
標準のゲームはWindowsアプリケーションで処理を行い、
デバッグ関連の処理で、出力などはコンソールアプリケーションに対し行いたいと思っています。

可能ならば、是非方法を教えて下さい。よろしくお願いします。


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


Name: Justy  ..伝説なるハッカー(427,523ポイント)   Date: 2009/09/21(月) 09:56   No:39424     
Title: Re:コンソールとWindowsアプリケーションを同時に起動させる方法    

>Windowsアプリケーションと、コンソールアプリケーションを一度に起動するプログラムを見ます

 そういうプログラムは大抵、コンソールプログラムとして作って、
普通にウインドウを表示しているだけだと思いますが、
デバッグ用途としてそういうのを作るのであれば Windowsアプリケーションとして作って、
コンソールウインドウを表示する方がよさそうですね。

 まず Windowsアプリケーションとしてプロジェクトを作ります。
 続いて、AllocConsole関数を呼び出します。
 この関数の呼び出しに成功した段階でコンソールウインドウが表示されますので、


    freopen("CONOUT$", "w", stdout);
    freopen("CONIN$", "r", stdin);

を呼んで、標準の入出力をそのコンソールに割り当てれば普通に printf scanf などの関数が
機能するようになります。


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

Name: Mist  ..熟練のプログラマー(68,255ポイント)   Date: 2009/09/21(月) 10:04   No:39425     
Title: Re:コンソールとWindowsアプリケーションを同時に起動させる方法    
DXライブラリを使用しているならAppLogAddを使うと便利ですよ。
VCの出力ウィンドウに文字列を出力してくれます。


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

Name: たかぎ [URL]  ..ハッカー(111,228ポイント)   Date: 2009/09/21(月) 11:34   No:39427     
Title: Re:コンソールとWindowsアプリケーションを同時に起動させる方法    
コンソールアプリケーションとして(デバッグ用の)プロジェクトを作って、main関数からWinMainを呼び出すというのもありです。
それなら、freopenを使わなくても普通にstd::printfやstd::coutなどが使えます。

手前味噌ですが、
http://www.kijineko.co.jp/tech/reinvwheel/20090729-1
を使えば、std::ostreamの派生クラスで出力ウィンドウへの書き込みができるようになりますので、std::coutやstd::cerrと切り替えて使うのもよいでしょう。


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

Name: MNS  ..上級者(16,179ポイント)   Date: 2009/09/21(月) 12:16   No:39428     
Title: Re:コンソールとWindowsアプリケーションを同時に起動させる方法    
みなさん様々な回答ありがとうございます。

いろいろな方法があるようなので、
使ってみて自分に一番合うものを使用したいと思います。

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


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



Name: nayo  ..中級者(12,993ポイント)   Date: 2009/09/20(日) 12:48   No:39403       
Title: クラスメソッドの並列処理について    
こんにちは、お久しぶりです
今回は麻雀ゲームを作成しているのですがちょっと困った壁にぶつかってしまいました

CPの思考は並列処理にしたいと考えているのですがエラーが出てしまいました
プログラムは大雑把にこんな感じです


class CPlayer
{
protected:
DWORD m_thID;
HANDLE m_hTh;
unsigned __stdcall cpRoutine(void *);
public:
void tumo();
};


スレッドの呼び出しはtumoメソッドでCPの場合

m_hTh = (HANDLE)_beginthreadex( NULL, 0, CPlayer::cpRoutine, NULL, 0, (unsigned *)&m_thID );

といった感じで呼び出そうとしています

エラーの内容は

error C3867: 'CPlayer::cpRoutine': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&CPlayer::cpRoutine' を使用してください

といったものです
そこでエラーのメッセージ通り&CPlayer::cpRoutineに変更すると

error C2664: '_beginthreadex' : 3 番目の引数を 'unsigned int (__stdcall CPlayer::* )(void *)' から 'unsigned int (__stdcall *)(void *)' に変換できません。(新しい機能 ; ヘルプを参照)

といったエラーメッセージが出てきます

そもそもクラスメソッドを並列処理することはできないのでしょうか
せっかくの休みですがどなたか回答お願いします

書き忘れていましたが環境はVisual C++ 2008 Express Editionです


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


Name: Justy  ..伝説なるハッカー(427,117ポイント)   Date: 2009/09/20(日) 20:50   No:39415     
Title: Re:クラスメソッドの並列処理について    

>そもそもクラスメソッドを並列処理することはできないのでしょうか

 直接 beginthreadexで非staticなメンバ関数を指定することは出来ません。

 下記のページを参考にしてみて下さい。

staticでないクラスメンバ関数を_beginthreadで実行させる方法。 - かせいさんとこ
ttp://d.hatena.ne.jp/kasei_san/20070612/p1


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

Name: nayo  ..中級者(13,063ポイント)   Date: 2009/09/20(日) 21:31   No:39416 解決!     
Title: Re:クラスメソッドの並列処理について    
Justyさんありがとうございます
なるほど非スタティックなメンバ関数を指定することはできなかったのですね
staticにすることで解決できました
紹介していただいたページも非常に参考になりました
また質問したときは宜しくお願いします


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



Name: 此ノ夜  ..ぴよぴよ(261ポイント)   Date: 2009/09/18(金) 20:37   No:39344       
Title: 7章について    
初投稿です。
すごい初心者なので、いまさらな事をお聞きする事もあると思いますが、宜しくお願いします。

私は龍神録シューティングゲームの根本の部分、
つまり、戦闘のプログラムを作成しているのですが、
7章のボードの描画の所なんですが、
かれこれ、10回位になりますが、
いくら書き直しても結果は同じになってしまいます。
ためしに、やってみたのですが、
何所を、如何に消そうと、
例え、全てのプログラムを消したとしても、
同じ結果になってしまいます。

足らない頭ながらに、考えたのですが、
プログラムのせいではないと思うのですが、
これは、どうしてなのですか?

プログラムを見ないとわからない場合は、
お手数ですが、書いてくれと、
書き込みを、お願い出来ますか?

未熟者で、申し訳ありませんが、
お分かりになる方は、是非、お願い致します。


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


Name: あ〜る  ..中級者(11,755ポイント)   Date: 2009/09/18(金) 21:07   No:39345     
Title: Re:7章について    
プログラムを書き直してるだけでメイクしてない……とかは?

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

Name: 此ノ夜  ..ぴよぴよ(300ポイント)   Date: 2009/09/18(金) 21:48   No:39346     
Title: Re:7章について    
すみませんが、メイクってどうすればいいのですか?
本当に、はじめたばかりなので、全くわからないのですが
お手数お掛けします。


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

Name: あ〜る  ..中級者(11,822ポイント)   Date: 2009/09/18(金) 22:04   No:39347     
Title: Re:7章について    
すいません、自分の環境を基準にして書いてました;;
要するにコンパイルはしましたか?って事です。
コンパイルをしないと、ソースコードを変えても結果には反映されない筈なので。


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

Name: 此ノ夜  ..ぴよぴよ(350ポイント)   Date: 2009/09/18(金) 22:16   No:39348     
Title: Re:7章について    
ビルドとはやっぱり違うんですか?

よくわからないもので、
どうすれば、いいんですか?
すみません
未熟者で


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

Name: あ〜る  ..中級者(11,862ポイント)   Date: 2009/09/18(金) 22:19   No:39349     
Title: Re:7章について    
いやビルドでも合ってます
やったのに変わんないなら…わかりません……すいません…


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

Name: 此ノ夜  ..ぴよぴよ(409ポイント)   Date: 2009/09/18(金) 22:54   No:39350     
Title: Re:7章について    
ありがとうございました。
わざわざ、すみませんでした。

他に誰かわかる方が、いらっしゃいましたら、
是非、お願い致します。


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

Name: conio [URL]  ..熟練のプログラマー(48,478ポイント)   Date: 2009/09/18(金) 23:29   No:39356     
Title: Re:7章について    
同じ名前のソースファイルが2つ以上別のディレクトリなんかに存在していて、
ビルドとは関係の無い 同名のファイルを書き換えているとか。


具体的にどんなソースファイルがあって、どこをどう書き換えているのか、開発環境は何なのかが
不明なので 良く分からないですが。


とりあえず、VisualC++2008という環境での仮定をしますが、
----------------------------------------------------------
【1】一旦プロジェクトから全てのソースファイルをクリア
【2】追加→既存の項目→ソースファイル追加
【3】リビルドする
----------------------------------------------------------
みたいにしてみてはどうでしょう?
「リビルド」は、「ビルド」項目の真下にあるかと。


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

Name: mats  ..かけだし(1,244ポイント)   Date: 2009/09/18(金) 23:33   No:39357     
Title: Re:7章について    
うーん…
プログラムを全部消しても同じ結果になるのなら,確かにプログラムは関係ないかもしれないですね.

的外れかもしれませんが…

同じ結果になる,とはどのような結果になるのですか?
それと,此ノ夜さんがどのようにビルド,実行しているのかを教えていただけますか?


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

Name: 此ノ夜  ..かけだし(2,351ポイント)   Date: 2009/09/19(土) 21:30   No:39385     
Title: Re:7章について    
以前書いていた問題は、ソフトの誤作動らしくて、
再インストールすることで解決しました。
main.cppを消したところ、プログラムが起動しなかったので、
そちら、はいいのだと思われます。
お騒がせしてしまい、すみませんでした。

ですが、次の問題が発生しました。
1>char.cpp
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(14) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(14) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(14) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(14) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(14) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(14) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(14) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(14) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(14) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(15) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(15) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(15) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(15) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(15) : error C2146: 構文エラー : ';' が、識別子 '    GLOBAL' の前に必要です。
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(15) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(15) : error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\include\function.h(15) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
    
     (中略)

1>コードを生成中...
1>ビルドログは "file://c:\Users\月宵此ノ夜\Desktop\project\1章\Debug\BuildLog.htm" に保存されました。
1>RyuJin - エラー 694、警告 3
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

このような、表示がずらりと並び、
ボードの描画の結果になるはずなのに、
キャラクターの描画の結果になってしまいます。
これは、なぜですか?

ちなみに、function.hは下記のようになっています。

//graph.cpp
//描画メイン
GLOBAL void graph_main();

//key.cpp
//現在のキー入力処理を行う
GLOBAL int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
GLOBAL int CheckStateKey(unsigned char Handle);

//laod.cpp
//データのロード
GLOBAL void load();
GLOBAL void first_ini();         //メインループから呼ぶ関数(6章)
    GLOBAL void calc_ch();          // (7章)


もし、ほかのプログラムが必要な場合は、
お手数ですが、必要なプログラムの内容を
書き込みお願い出来ますか?

テンプレートの名前は、龍神録のプログラムのままで、
使用させて頂いています。

あと、龍神録のプログラムから、自分なりの加工は、
一切、行っていません。

なお、私の開発環境は、VisualC++2008です。
すみません。
利用規約を、読んでいませんでした。
次からは、気をつけたいと思っています。

皆さんを、振り回してしまい、本当に申し訳ないと思っています。
ずうずうしいかもしれなせんが、皆さんの知恵をお貸しください。
お願い致します。


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

Name: MNS  ..上級者(15,038ポイント)   Date: 2009/09/19(土) 21:40   No:39386     
Title: Re:7章について    
「    GLOBAL void calc_ch();          // (7章) 」
と書いてある場所に、全角スペースが存在します。
全角スペースがあるとコンパイル出来ませんので、消してださい。


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

Name: 此ノ夜  ..入門者(4,217ポイント)   Date: 2009/09/19(土) 22:28   No:39387     
Title: Re:7章について    
全ての全角スペースを消しました。
ある程度は消えたのですが、下記のものだけどうしても出来ません。


ini.cpp

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

//一番最初の初期化
void first_ini(){
ch.x=FIELD_MAX_X/2;
ch.y=FIELD_MAX_Y*3/4; //キャラクターの初期座標
}


graph.cpp

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

void graph_ch(){
DrawRotaGraphF(ch.x+FIELD_X,ch.y+FIELD_Y,1.0f,0.0f,img_ch[0][ch.img],TRUE);
}

void graph_board(){
DrawGraph( 0, 0,img_board[10],FALSE);//(0,0)の座標にimgの中のboardの中の[10]という
DrawGraph( 0, 16,img_board[11],FALSE);//ファイルを貼り付ける
DrawGraph( 0,464,img_board[12],FALSE);
DrawGraph(416, 0,img_board[20],FALSE);
}

void graph_main(){
graph_ch();
graph_board();
}

出力の所には、下記のように表示されます。


1>------ ビルド開始: プロジェクト: RyuJin, 構成: Debug Win32 ------
1>コンパイルしています...
1>cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。
1>ini.cpp
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\ini.cpp(5) : error C3872: '0x3000': この文字を識別子で使用することはできません

    (中略)

1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\ini.cpp(5) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\ini.cpp(5) : error C2146: 構文エラー : ';' が、識別子 '         ' の前に必要です。
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\ini.cpp(5) : error C2065: '         ' : 定義されていない識別子です。
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\ini.cpp(6) : error C3872: '0x3000': この文字を識別子で使用することはできません

     (中略)

1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\ini.cpp(6) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\ini.cpp(6) : error C2146: 構文エラー : ';' が、識別子 '         ' の前に必要です。
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\ini.cpp(6) : error C2065: '         ' : 定義されていない識別子です。
1>graph.cpp
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\graph.cpp(4) : error C3872: '0x3000': この文字を識別子で使用することはできません

    (中略)

1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\graph.cpp(4) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\graph.cpp(4) : error C2146: 構文エラー : ')' が、識別子 '          ' の前に必要です。
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\graph.cpp(4) : error C2660: 'DrawRotaGraphF' : 関数に 2 個の引数を指定できません。
1>c:\users\月宵此ノ夜\desktop\project\1章\mydat\source\graph.cpp(4) : error C2059: 構文エラー : ')'
1>コードを生成中...
1>ビルドログは "file://c:\Users\月宵此ノ夜\Desktop\project\1章\Debug\BuildLog.htm" に保存されました。
1>RyuJin - エラー 36、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========


そして、今度は、起動時にエラーを起こしてしまい、プログラム自体起動しません。
どうすればいいのですか?
教えていただけませんか?

中略の中には、同じ文がいくつか入ります。


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

Name: MNS  ..上級者(15,062ポイント)   Date: 2009/09/20(日) 12:34   No:39401     
Title: Re:7章について    
'0x3000': この文字を識別子で使用することはできません

このエラーは、" "で囲まれた文字列や、コメント以外で全角スペースが存在する時に発生するエラーです。
つまり、ソースコードのどこかに全角スペースが存在していることになります。
ですから、全ての全角スペースを取り除き、先ほどのエラーが除かれた上で、
さらにエラーが発生する場合は再びご質問ください。


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

Name: Tatu  ..初心者(7,562ポイント)   Date: 2009/09/20(日) 14:00   No:39406     
Title: Re:7章について    
全角スペースの探し方は、ウィンドウの上にあるメニューから

編集>検索と置換>クイック検索とえらんで(Ctrl+Fでも可)、

検索する文字列の欄に全角スペースを一つ入力して検索してください。

一つ一つ検索して修正するのが面倒で、全角スペースがいらないのなら、

クイック置換(ショートカットはCtrl+H)をえらび、

検索する文字列に全角スペースを、置換する文字列に半角スペースを

いれて置換してください。

あと、改行するときに入るスペースはTabスペースと呼ばれているものです。

その名の通り、Tabキーで入力できます。


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

Name: 此ノ夜  ..入門者(4,284ポイント)   Date: 2009/09/20(日) 19:45   No:39414 解決!     
Title: Re:7章について    
ありがとうございました。
おかげさまで、問題を克服することが出来ました。

改行方法に問題が、あったようです。

本当に助かりました。


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



Name: kms  ..入門者(2,837ポイント)   Date: 2009/09/20(日) 17:25   No:39410       
Title: 座標と除算    
すみません。どうしてもわからない箇所があるので質問させて頂きます。

(以下ゲームプログラミングの館より抜粋)

区間の大きさは1つ32ピクセルですから
現在のx座標を32で割れば、現在いる区間の配列要素番号になります。
次に進もうとする方向の区間の配列要素が1ならば進めない、
そんな判定をする関数を書いてみましょう。


int can_or_cannot(int x,int y,int muki){
  if(muki==1)
    if(hantei[x/32+1]==1)
      return 1;
  if(muki==3)
    if(hantei[x/32-1]==1)
      return 1;
  return 0;
}


リターン1は進めない、リターン0は進める事を意味します。


この、「現在のx座標を32で割れば、現在いる区間の配列要素番号になります。」という箇所が、
お恥ずかしながらどうしても理解できません。
「x座標を32で割る」という意味が頭のなかでうまく把握できていないのです。


if(muki==1)
    if(hantei[x/32+1]==1)
      return 1;
  if(muki==3)
    if(hantei[x/32-1]==1)
      return 1;


の部分になります。


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


Name: MNS  ..上級者(15,370ポイント)   Date: 2009/09/20(日) 19:04   No:39412     
Title: Re:座標と除算    
上図をご覧ください。

32×32の四角、これを区間としますが、それが4つあります。
それぞれの座標は緑色の字で表しています。

ここで、青点がありますが、これがプレイヤーの座標とします。
これが(15, 43)であった場合、これを32で割ると、結果が整数になるのはお分かりでしょうか?
C言語では、整数を整数で割ったとき、その商の小数点以下は切り捨てられます。

よって、32で割った結果は(0,1)となり、これは区間の座標と一致するのが分かるでしょうか

これが一応私が出来る限りの説明ですが、理解できますでしょうか・・


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



Name: 酢NEO  ..ぴよぴよ(268ポイント)   Date: 2009/09/17(木) 21:12   No:39321       
Title: 【龍神録プログラミング】define.hで灰色が    
はじめまして。酢NEOと申します。

只今、龍神録プログラミングの館を見ながら実装しているのですが、
define.hでexternをつけるかどうかのマクロ文ありますよね?
あれを張り付けたところ、2行目の#define GLOBALだけが灰色に表示されたんです。

</font>#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif


↑こんなかんじ

このあとからビルドエラーになって困っています。
原因と改善方法を教えていただければ幸いです。


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


Name: kazuoni [URL]  ..ハッカー(106,534ポイント)   Date: 2009/09/20(日) 03:22   No:39394     
Title: Re:【龍神録プログラミング】define.hで灰色が    
開発環境ってなんですか?
visual C++なら、何も色の設定をいじらなければ
マクロ未定義って意味だった気がします。(違ってたらごめんなさい。。)

>このあとからビルドエラーになって困っています。
そのあとがどのように書かれているのか分からないので、
エラー内容も含めて追加説明してください。


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



Name: garugaru  ..かけだし(1,581ポイント)   Date: 2009/09/19(土) 13:34   No:39373       
Title: マップの当たり判定    
主人公がいける場所といけない場所を作ろうとしています。
マップの大きさ(横)は、960なので、

int yoko[30] = { 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 };


if(c_character.chief_right==1)
if(yoko[c_character.chief_x/32+1]==1)
return;

960/32=30なのでyoko[30]です。(主人公の歩幅は1ピクセル(?)なので、すり抜ける・・・?)

添付したファイルで、実行すると構文エラーが出てできません・・・。
どうすれば解決するでしょうか?
また、上の方法で2Dバンも出来ますか?



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


Name: garugaru  ..かけだし(1,858ポイント)   Date: 2009/09/19(土) 13:36   No:39374     
Title: Re:マップの当たり判定    
ヘッダファイルです

-----------------マップ------------------

#include "DxLib.h"

struct map{
int x;
int y;

}s_map;

-------------------主人公----------------------------

#include "DxLib.h"

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

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




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

Name: kazuoni [URL]  ..ハッカー(106,424ポイント)   Date: 2009/09/20(日) 03:08   No:39393     
Title: Re:マップの当たり判定    
一度管理人様のゲームプログラミングの館
http://dixq.net/g/
を参考にしてみてください。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +