C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   DXライブラリの互換性 ....   
     ・[53798] Justy 
     ・[53807] kiri 
     ・[53809] Dixq (管理人) 
     ・[53818] Justy 
     ・[53828] kiri 
   玉を直進させるには   
     ・[53819] シエル 
     ・[53824] ともこ 
   C言語超初心者です!   
     ・[53765] ムンバ 
     ・[53767] シエル 
     ・[53768] たかぎ 
     ・[53813] Dixq (管理人) 
   よくわからないエラー ....   
     ・[53786] Blue 
     ・[53792] バカ犬 
     ・[53812] Dixq (管理人) 
   画像パス   
     ・[53766] シエル 
     ・[53810] カヤ 
   スプライトの表示につ ....   
     ・[53759] シエル 
     ・[53763] ideyan 
     ・[53787] 七篠 
     ・[53788] シエル 
   選択画面について   
     ・[53774] ぽこ 
     ・[53776] バグ 
     ・[53777] シエル 
     ・[53783] 胡椒 
   ファイルの末尾をとら ....   
     ・[53781] asd 
     ・[537791276388191] かず 
   スーパーマリコ2 を ....   
     ・[53536] ムンバ 
     ・[53542] wing 
     ・[53585] ookami 
     ・[53612] wing 
     ・[53613] kai 
     ・[53614] wing 
     ・[53616] wing 
     ・[53617] wing 
     ・[53619] wing 
     ・[53662] wing 
     ・[53676] けんたろうちゃん 
     ・[53681] wing 
     ・[53752] けんたろうちゃん 
     ・[53761] wing 
   ゲームプログラムミン ....   
     ・[53744] たろう 
     ・[53749] wing 
     ・[53754] たろう 
     ・[53755] wing 
     ・[53756] たろう 
     ・[53758] wing 
     ・[53760] たろう 
   DXライブラリ関数の D ....   
     ・[53668] y 
     ・[53669] ムンバ 
     ・[53670] ムンバ 
     ・[53671] Mist 
     ・[53672] MNS 
     ・[53689] バグ 
     ・[53691] softya 
     ・[53695] ムンバ 
     ・[53696] ムンバ 
     ・[53728] バグ 
     ・[53731] ムンバ 
     ・[53740] ムンバ 
     ・[53741] y 
     ・[53745] ムンバ 
     ・[53746] softya 
     ・[53751] ムンバ 
   メニュー画面について   
     ・[53414] Dixq (管理人) 
     ・[53498] まる 
     ・[53501] まる 
     ・[53502] Dixq (管理人) 
     ・[53555] まる 
     ・[53735] ひよこ 
     ・[53739] まる 
   ウインドウの左上のア ....   
     ・[53723] ZASEA 
     ・[53727] たいちう 
   DXライブラリでの文字 ....   
   朝鮮語版のwarcraft 3 ....   
     ・[53725] たかぎ 
   DXライブラリの通信機 ....   
     ・[53710] ムンバ 
     ・[53712] DG 
     ・[53714] ideyan 
     ・[53715] Justy 
     ・[53718] DG 
     ・[53719] ムンバ 
     ・[53720] DG 
   static_castによるダウ ....   
     ・[53556] やんち 
     ・[53557] kaiten 
     ・[53558] Justy 
     ・[53559] たかぎ 
     ・[53597] pie 
     ・[53603] たかぎ 
     ・[53606] pie 
     ・[53632] kaiten 
     ・[53694] Justy 
     ・[53699] たかぎ 
     ・[53700] kaiten 
     ・[53707] たかぎ 
     ・[53717] kaiten 
   ファイルオープン方法 ....   
     ・[53573] ookami 
     ・[53575] あ〜る 
     ・[53599] ookami 
     ・[53711] あ〜る 
   DXライブラリを使っ ....   
     ・[53678] Justy 
     ・[53680] Ma 
     ・[53683] 山崎 
     ・[53687] softya 
     ・[53690] 山崎 
     ・[53701] YuO 
     ・[53708] 山崎 
   リソースエディター R ....   
   特定のディレクトリに ....   
     ・[53664] Justy 
     ・[53675] テトラ 
     ・[53677] Justy 
     ・[53679] テトラ 
     ・[53684] Justy 
     ・[53688] テトラ 
     ・[53693] Justy 
     ・[53697] テトラ 
   弾幕シューティング勉 ....   
     ・[53635] Ultimate 
     ・[53638] MNS 
     ・[53639] たいちう 
     ・[53640] Ultimate 
     ・[53641] ぽこ 
     ・[53643] Dixq (管理人) 
     ・[53645] Dixq (管理人) 
     ・[53673] Ultimate 
     ・[53682] Dixq (管理人) 
     ・[53685] Ultimate 
   LoadGraphについて外部 ....   
     ・[53659] 紅葉 
     ・[53660] 深黒 
     ・[53661] ぽこ 
     ・[53663] Justy 
     ・[53665] 深黒 
     ・[53666] Dixq (管理人) 
   13章・enter_shot関数 ....   
     ・[53654] ぽこ 
     ・[53655] Dixq (管理人) 
     ・[53656] Dixq (管理人) 
     ・[53657] ぽこ 
   龍神録プログラミング ....   
     ・[53646] Dixq (管理人) 
     ・[53647] ぽこ 
     ・[53648] Dixq (管理人) 
     ・[53649] ぽこ 
     ・[53651] Dixq (管理人) 
     ・[53653] ぽこ 
   【雑談】開発メンバー ....   
     ・[53582] ぽこ 
     ・[53587] ookami 
     ・[53588] たかぎ 
     ・[53590] ぽこ 
     ・[53591] Dixq (管理人) 
     ・[53592] ookami 
     ・[53595] ookami 
     ・[53598] Dixq (管理人) 
     ・[53601] ぽこ 
     ・[53602] たかぎ 
     ・[53604] ぽこ 
     ・[53605] たかぎ 
     ・[53622] ookami 
     ・[53625] dic 
     ・[53636] ookami 
     ・[53637] たいちう 
     ・[53642] Dixq (管理人) 
     ・[535641276645457] ookami 
     ・[535641280545501] Dixq (管理人) 
   LoadGraphについて   
     ・[53620] Tororo 
     ・[53628] 深黒 
     ・[53629] Tororo 
     ・[53630] Dixq (管理人) 
     ・[53631] 深黒 
   MIDIキーボードからMI ....   
     ・[53546] dic 
     ・[53627] ザヌオウ 
     ・[535441276340578] ザヌオウ 
   ステージ1だけの超簡 ....   
     ・[53572] ookami 
     ・[53610] dic 
     ・[53623] dic 
     ・[53624] ookami 
     ・[53626] dic 
   【雑談】 sizeofの評価 ....   
     ・[53576] 組木紙織 
     ・[53577] たかぎ 
     ・[53578] 組木紙織 
     ・[53579] ぽこ 
     ・[53580] たかぎ 
     ・[53581] ぽこ 
     ・[53583] 組木紙織 
     ・[53584] やんち 
     ・[53586] たかぎ 
     ・[53589] YuO 
     ・[53594] Dixq (管理人) 
     ・[53600] たかぎ 
     ・[53607] Ma 
     ・[53621] たかぎ 
   DXライブラリでSEを鳴 ....   
     ・[53535] シエル 
     ・[53539] みなと 
     ・[53540] ru 
     ・[53541] dic 
     ・[53543] wing 
     ・[53593] みなと 
     ・[53608] Ma 
     ・[53615] Dixq (管理人) 
   MSDN   
   ブロック崩し完成   
     ・[53507] ookami 
     ・[53514] ムンバ 
     ・[53516] Ultimate 
     ・[53533] Tororo 
     ・[53538] Dixq (管理人) 
     ・[53560] Ultimate 
     ・[53561] ookami 
     ・[53562] fr 
     ・[53596] しろ 
     ・[53609] Ultimate 
   cygwinのerrorについて ....   
     ・[53565] たかぎ 
     ・[53566] pon 
     ・[53567] たかぎ 
     ・[53570] pon 
     ・[53571] たかぎ 
   [龍神録]反射の回数の ....   
     ・[53554] T.J 
     ・[53568] ookami 
   三原則の一つ、カプセ ....   
     ・[53528] たかぎ 
     ・[53551] ookami 
     ・[53553] dic 
   DrawStringで文字が出 ....   
     ・[53548] dic 
   無題   
     ・[53335] ookami 
     ・[53336] たかぎ 
     ・[53338] Dixq (管理人) 
     ・[53345] 炎獄 
     ・[53386] ムンバ 
     ・[53547] たしかにあいた。 
   交換法のアルゴリズム   
     ・[53424] たいちう 
     ・[53426] ニート匿名 
     ・[53428] たいちう 
     ・[53429] ニート匿名 
     ・[53430] たいちう 
     ・[53431] ニート匿名 
     ・[53434] たいちう 
     ・[53435] ニート匿名 
     ・[53443] たいちう 
     ・[53445] ニート匿名 
     ・[53446] たいちう 
     ・[53469] ニート匿名 
     ・[53470] たいちう 
     ・[53537] ニート匿名 
   LoadDivGraph関数   
     ・[53142] lbfuvab 
     ・[53144] X 
     ・[53183] ookami 
     ・[53216] ムンバ 
     ・[53222] X 
     ・[53228] ookami 
     ・[53235] ムンバ 
     ・[53236] X 
     ・[53239] ムンバ 
     ・[53332] X 
     ・[53484] X 
     ・[53503] ookami 
     ・[53532] ムンバ 

Name: kiri  ..かけだし(1,690ポイント)   Date: 2010/06/09(水) 03:17   No:53775       
Title: DXライブラリの互換性?    
現在、龍神録プログラミングの館の16章まで進めていてるのですが、プロジェクトに同梱されていた
DXライブラリのバージョンが Ver 2.24c だったので Ver 3.02 に更新しようと思い"プロジェクトに追加すべきファイル_VC用"フォルダ内のファイルを"project/include"フォルダに上書きしたら下記のようなエラーが出るようになってしまいました。

1>key.obj : error LNK2019: 未解決の外部シンボル "int __cdecl GetHitKeyStateAll(char *)" (?GetHitKeyStateAll@@YAHPAD@Z) が関数 "int __cdecl GetHitKeyStateAll_2(void)" (?GetHitKeyStateAll_2@@YAHXZ) で参照されました。
1>key.obj : error LNK2019: 未解決の外部シンボル "int __cdecl GetJoypadInputState(int)" (?GetJoypadInputState@@YAHH@Z) が関数 "void __cdecl GetHitPadStateAll(void)" (?GetHitPadStateAll@@YAXXZ) で参照されました。
1>key.obj : error LNK2019: 未解決の外部シンボル "int __cdecl printfDx(char const *,...)" (?printfDx@@YAHPBDZZ) が関数 "int __cdecl CheckStatePad(unsigned int)" (?CheckStatePad@@YAHI@Z) で参照されました。
1>load.obj : error LNK2001: 外部シンボル ""int __cdecl printfDx(char const *,...)" (?printfDx@@YAHPBDZZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl printfDx(char const *,...)" (?printfDx@@YAHPBDZZ)" は未解決です。
1>enemy.obj : error LNK2001: 外部シンボル ""int __cdecl printfDx(char const *,...)" (?printfDx@@YAHPBDZZ)" は未解決です。
1>load.obj : error LNK2019: 未解決の外部シンボル "int __cdecl LoadSoundMem(char const *,int,int)" (?LoadSoundMem@@YAHPBDHH@Z) が関数 "void __cdecl load(void)" (?load@@YAXXZ) で参照されました。
1>load.obj : error LNK2019: 未解決の外部シンボル "int __cdecl LoadDivGraph(char const *,int,int,int,int,int,int *,int)" (?LoadDivGraph@@YAHPBDHHHHHPAHH@Z) が関数 "void __cdecl load(void)" (?load@@YAXXZ) で参照されました。
1>load.obj : error LNK2019: 未解決の外部シンボル "int __cdecl LoadGraph(char const *,int)" (?LoadGraph@@YAHPBDH@Z) が関数 "void __cdecl load(void)" (?load@@YAXXZ) で参照されました。
1>load.obj : error LNK2019: 未解決の外部シンボル "int __cdecl FileRead_close(int)" (?FileRead_close@@YAHH@Z) が関数 "void __cdecl load_story(void)" (?load_story@@YAXXZ) で参照されました。
1>load.obj : error LNK2019: 未解決の外部シンボル "int __cdecl FileRead_getc(int)" (?FileRead_getc@@YAHH@Z) が関数 "void __cdecl load_story(void)" (?load_story@@YAXXZ) で参照されました。
1>load.obj : error LNK2019: 未解決の外部シンボル "int __cdecl FileRead_open(char const *,int)" (?FileRead_open@@YAHPBDH@Z) が関数 "void __cdecl load_story(void)" (?load_story@@YAXXZ) で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl ClearDrawScreen(void)" (?ClearDrawScreen@@YAHXZ) が関数 "int __cdecl ProcessLoop(void)" (?ProcessLoop@@YAHXZ) で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl ProcessMessage(void)" (?ProcessMessage@@YAHXZ) が関数 "int __cdecl ProcessLoop(void)" (?ProcessLoop@@YAHXZ) で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl DxLib_End(void)" (?DxLib_End@@YAHXZ) が関数 _WinMain@16 で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl ScreenFlip(void)" (?ScreenFlip@@YAHXZ) が関数 _WinMain@16 で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl SetDrawScreen(int)" (?SetDrawScreen@@YAHH@Z) が関数 _WinMain@16 で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl DxLib_Init(void)" (?DxLib_Init@@YAHXZ) が関数 _WinMain@16 で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "int __cdecl ChangeWindowMode(int)" (?ChangeWindowMode@@YAHH@Z) が関数 _WinMain@16 で参照されました。
1>music.obj : error LNK2019: 未解決の外部シンボル "int __cdecl PlaySoundMem(int,int,int)" (?PlaySoundMem@@YAHHHH@Z) が関数 "void __cdecl music_play(void)" (?music_play@@YAXXZ) で参照されました。
1>enemy_act_pattern.obj : error LNK2019: 未解決の外部シンボル "int __cdecl GetRand(int)" (?GetRand@@YAHH@Z) が関数 "double __cdecl rang(double)" (?rang@@YANN@Z) で参照されました。
1>graph.obj : error LNK2019: 未解決の外部シンボル "int __cdecl DrawRotaGraphF(float,float,double,double,int,int,int)" (?DrawRotaGraphF@@YAHMMNNHHH@Z) が関数 "void __cdecl graph_enemy(void)" (?graph_enemy@@YAXXZ) で参照されました。
1>graph.obj : error LNK2019: 未解決の外部シンボル "int __cdecl DrawGraph(int,int,int,int)" (?DrawGraph@@YAHHHHH@Z) が関数 "void __cdecl graph_board(void)" (?graph_board@@YAXXZ) で参照されました。
1>graph.obj : error LNK2019: 未解決の外部シンボル "int __cdecl SetDrawBlendMode(int,int)" (?SetDrawBlendMode@@YAHHH@Z) が関数 "void __cdecl graph_bullet(void)" (?graph_bullet@@YAXXZ) で参照されました。
1>graph.obj : error LNK2019: 未解決の外部シンボル "int __cdecl SetDrawMode(int)" (?SetDrawMode@@YAHH@Z) が関数 "void __cdecl graph_bullet(void)" (?graph_bullet@@YAXXZ) で参照されました。

何か新たに設定すべきことがあるのでしょうか?
VisualC++ 2008 Express Edition を使用しています。 
よろしくお願いします。


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


Name: Justy  ..伝説なるハッカー(541,323ポイント)   Date: 2010/06/09(水) 18:52   No:53798     
Title: Re:DXライブラリの互換性?    
>何か新たに設定すべきことがあるのでしょうか? 
 参照しているDXライブラリのヘッダファイルだけが古い可能性が高いです。
 ヘッダファイルのバージョンを確認して下さい。

# IDE上で DxLib.hをインクルードしているところを探し、そこで右クリックして、
「ドキュメント〜 DxLib.hを開く」を選択すると確実かと。


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

Name: kiri  ..かけだし(1,780ポイント)   Date: 2010/06/09(水) 21:13   No:53807     
Title: Re:DXライブラリの互換性?    
DxDirectX.h DxLib.hのバージョンを確認したところ共にVer 3.02cでした。

># IDE上で DxLib.hをインクルードしているところを探し、そこで右クリックして、
というのは、ファイル>開く>ファイル...という事であっていますか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,202,440ポイント)   Date: 2010/06/09(水) 21:15   No:53809     
Title: Re:DXライブラリの互換性?    
以前プロジェクト全てを新しくしなおしましたのでよければダウンロードしなおしてみて下さい。
ライブラリもプロジェクトも新しくなっています。


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

Name: Justy  ..伝説なるハッカー(542,626ポイント)   Date: 2010/06/09(水) 21:40   No:53818     
Title: Re:DXライブラリの互換性?    
>プロジェクトに同梱されていた 
 いつ頃DLしたプロジェクトでしょうか?
 もし 5/23より以前でしたらもう一度DLしなおしてみて下さい。


>DxLib.hのバージョンを確認したところ共にVer 3.02cでした
 んー、ではプロジェクトのプロパティから「C/C++ → 詳細」の中の「インクルードファイルの表示」を「はい」にして
リビルドしてみて下さい。

 大量にビルドログが流れると思いますが、その中から DxLib.hを見つけて下さい。
 ..(略)..\龍神録プロジェクト\16章\mydat\include\../../../include/DxLib.h
のようなパスになっていますか?


># IDE上で DxLib.hをインクルードしているところを探し、そこで右クリックして、 
>というのは、ファイル>開く>ファイル...という事であっていますか?
 ちょっと判りづらかったですね。
 添付のようにエディタ上で includeしているところから右クリックです。


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

Name: kiri  ..かけだし(1,927ポイント)   Date: 2010/06/09(水) 22:30   No:53828 解決!     
Title: Re:DXライブラリの互換性?    
プロジェクトを新たにダウンロードして実行したら、問題なく動作することを確認しました。

ですが、以前のバージョンのどこに原因があるのかわからないので以前のバージョンで
>プロジェクトのプロパティから「C/C++ → 詳細」の中の「インクルードファイルの表示」を「はい」にして 
リビルド
してみたら、なぜかエラーも出ずにすんなり実行できました。
パスも \mydat\include\../../../include/DxLib.h とありました。

ものすごく原因も分からずスッキリしない結果になってしまいましたが、Justyさん、管理人さんありがとうございました。


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



Name: ともこ  ..かけだし(1,864ポイント)   Date: 2010/06/09(水) 21:25   No:53814       
Title: 玉を直進させるには    

初心者です。

インベーダーゲームのようなものを作ってみようと思っています。

考えた下記コードだと、玉を発射させた後、プレイヤーを左右に動かすと
玉も左右に動いてしまいます。

プレイヤーの位置に関係なく、玉を直進させるには
どうすればよいでしょうか?

アドバイスお願いいたしま〜す。

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

#include "DxLib.h"

#define PLAYER_Y 416

typedef struct{
        int x,y,img,muki,walking_flag;
}ch_t;

struct shot{
    int x,y;
    int flag;
};
struct shot tama[10];
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[16],counter=0;
    char Key[256];
    ch_t ch;
    ch.x    =320;
    ch.y    =PLAYER_Y;
    ch.walking_flag=0;
    ch.muki=3;
    for(int i=0;i<10;i++){
        tama[i].x=320;    
        tama[i].y=PLAYER_Y-32;
        tama[i].flag=0;
    }
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
     SetDrawScreen( DX_SCREEN_BACK ) ;                           //描画先を裏画面に設定
    LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

        ///////////////////////////////////////////////////////////////////////
        ////////////////////// プレイヤー位置操作  ////////////////////////////
        ///////////////////////////////////////////////////////////////////////

        if(ch.x%16==0 && ch.y%16==0){         //座標が16で割り切れたら入力可能
            ch.walking_flag=1;         //歩くフラグを立てる。
            if( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
                    ch.muki=3;         //右向きフラグを立てる
            else                                    //その他ボタンなら
                    ch.walking_flag=0; //歩かないフラグを立てる
        }
 
        if(ch.walking_flag==1){        //歩くフラグが立っていたら
            if(ch.muki==1)        //左向きならch.x座標を減らす
                    ch.x--;
                    if(ch.x < 0) ch.x=0;    //もし画面外まで来たら                   
            else if(ch.muki==3)        //右向きならch.x座標を増やす
                    ch.x++;
                    if(ch.x > 480-32) ch.x=480-32;    //もし画面外まで来たら    
        }
 
        ///////////////////////////////////////////////////////////////////////
        ////////////////////// 玉発射  ////////////////////////////
        ///////////////////////////////////////////////////////////////////////

        for(int i=0;i<1;i++){  //玉発射位置セット

            if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
            if(counter<5)                        //前にエンターを押してから5カウント未満なら
                counter++;                       //カウントアップ
            else if( Key[ KEY_INPUT_RETURN ]  == 1 ){//5カウント以上たっていたら
                counter=0;                       //カウンターを戻す
                tama[i].x=ch.x;
                for(int i=0;i<1;i++){
                    if(tama[i].flag==0)    {  //発射フラグを立てる
                        tama[i].flag=1;
                        break;
                    }
                }
            }
            if(tama[i].flag==1){
                tama[i].y-=1;             //座標を8減らす
                DrawGraph( tama[i].x , tama[i].y , image[6] , TRUE );//玉を描画
//                ScreenFlip();//裏画面を表画面に反映
                if(tama[i].y < -32){      //もし画面外まで来たら
                    tama[i].y=PLAYER_Y-32;    //初期値に戻し、
                    tama[i].flag=0;   //発射フラグを戻す
                }
            }
        }
        DrawGraph( ch.x , ch.y , image[0] , TRUE  ) ;
        ////////////////////////////////////////////////////////////////////////
                ScreenFlip();//裏画面を表画面に反映


    }

    DxLib_End();
    return 0;
}


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


Name: シエル  ..かけだし(2,269ポイント)   Date: 2010/06/09(水) 21:41   No:53819     
Title: Re:玉を直進させるには    
tama[i].x=ch.x

↑この弾の座標セットする時にはフラグがたっていない弾だけに対して
座標をセットする必要があるので

if(tama[i].flag==0)のif文の中で弾の座標をセットしてやればいいかと。

あとざっと見ただけですが、for文使ってる場所とかもなんか変な気がするので
下記のURLを参考にもう一度見直してみたほうがいいかもしれません。

http://dixq.net/g/29.html


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

Name: ともこ  ..かけだし(2,359ポイント)   Date: 2010/06/09(水) 22:02   No:53824 解決!     
Title: Re:玉を直進させるには    

こんなに直ぐにコメントいただけるなんて。

解決しました!

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





        ///////////////////////////////////////////////////////////////////////
        ////////////////////// 玉発射  ////////////////////////////
        ///////////////////////////////////////////////////////////////////////

        if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
        if(counter<10)                        //前にエンターを押してから5カウント未満なら
            counter++;                       //カウントアップ
        else if( Key[ KEY_INPUT_RETURN ]  == 1 ){//5カウント以上たっていたら
            counter=0;                       //カウンターを戻す
            for(int i=0;i<10;i++){
                if(tama[i].flag==0)    {  //発射フラグを立てる
                    tama[i].x=ch.x;
                    tama[i].flag=1;
                    break;
                }
            }
        }
        for(int i=0;i<10;i++){  //玉発射位置セット
            if(tama[i].flag==1){
                tama[i].y-=1;             //座標を8減らす
                DrawGraph( tama[i].x , tama[i].y , image[6] , TRUE );//玉を描画
//                ScreenFlip();//裏画面を表画面に反映
                if(tama[i].y < -32){      //もし画面外まで来たら
                    tama[i].y=PLAYER_Y-32;    //初期値に戻し、
                    tama[i].flag=0;   //発射フラグを戻す
                }
            }
        }
        DrawGraph( ch.x , ch.y , image[0] , TRUE  ) ;
        ////////////////////////////////////////////////////////////////////////


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



Name: much  ..ぴよぴよ(53ポイント)   Date: 2010/06/08(火) 22:05   No:53762       
Title: C言語超初心者です!    
四聖龍神録の事ですが

素材をまとめてダウンロードしたのですが
どの章もslnを開いたときに変換ウィザードが出て変換して
デバッグすると必ずビルドエラーになります。
どうすればよいのでしょうか?

超初心者ですいません。 編集済み


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


Name: ムンバ  ..熟練のプログラマー(63,238ポイント)   Date: 2010/06/08(火) 22:52   No:53765     
Title: Re:C言語超初心者です!    
こんばんは!

muchさんに、質問です。

<< 素材をまとめてダウンロードしたのですが

 と、ありますが
 「龍神録プログラミングの館」の素材をまとめてダウンロードしたのでは無く
 「四聖龍神録(Plus?)」の素材をまとめてダウンロードしたという事でしょうか?

<< どの章もslnを開いたときに

 私には「龍神録プログラミングの館」の素材をまとめてダウンロードして
 「龍神録プログラミングの館」の章を勉強し始めた。
 と解釈できるのですが、どうなのでしょうか?
 
もしも、「龍神録プログラミングの館」の素材をまとめてダウンロードして
「龍神録プログラミングの館」の章を勉強し始めていらっしゃるのなら


龍神録プログラミングの館
http://dixq.net/rp/

(利用規約 →) 0章〜2章までを、順番に試してみて下さい。
全て私の勘違いでしたら、このスレ無視して下さい。

PS:謹慎中の身でありますゆえ、勝手ながら、これにて失礼致します。(逃走


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

Name: シエル  ..かけだし(1,860ポイント)   Date: 2010/06/08(火) 22:56   No:53767     
Title: Re:C言語超初心者です!    
テンプレを使用して、質問して下さい。

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

Name: たかぎ [URL]  ..ハッカー(201,037ポイント)   Date: 2010/06/08(火) 22:56   No:53768     
Title: Re:C言語超初心者です!    
要するに、質問内容が具体性に欠けています。
規約と注意事項を熟読した上で、第三者に状況がわかるように質問してください。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,202,537ポイント)   Date: 2010/06/09(水) 21:23   No:53813     
Title: Re:C言語超初心者です!    
どのようなエラーが出てきますか?
そのエラーメッセージをコピーして貼り付けてみて下さい。


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



Name: バカ犬  ..ぴよぴよ(180ポイント)   Date: 2010/06/09(水) 14:30   No:53785       
Title: よくわからないエラーが・・・    
このサイトに来るのも、C言語も初心者なんですが

メイクすると

   PlaySoundMem(sound , DX_PLAYTYPE_BACK) ;
  ↑
エラー E2206 G:\borland\bccdev1221\c試作\DirectX_Templates - コピー\graph.cpp 52: 不正な文字 ' ' (0x8140)(関数 graph_main() )
*** 1 errors in Compile ***

** error 1 ** deleting Debug\graph.obj

と出るんですけど、見本をコピーしたものなので、何が間違ってるのかよくわかりません・・・

もしわかる方がいたら、教えてください。
質問が分かりづらかったら言ってください。


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


Name: Blue  ..中級者(12,493ポイント)   Date: 2010/06/09(水) 14:58   No:53786     
Title: Re:よくわからないエラーが・・・    
エラーの内容そのままなんですけど?

>不正な文字 ' ' (0x8140)
不正な文字(=全角空白)があってコンパイルできないと。


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

Name: バカ犬  ..ぴよぴよ(364ポイント)   Date: 2010/06/09(水) 17:03   No:53792 解決!     
Title: Re:よくわからないエラーが・・・    
あ、・・・不正な文字’ ’って全角空白のことだったんですか!

//探してみたら ; の後に空白あった・・・・。

つまんないことで手間とらせてしまってすみません。ありがとうです!


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,202,508ポイント)   Date: 2010/06/09(水) 21:22   No:53812     
Title: Re:よくわからないエラーが・・・    
最初はよく躓きますよね。
エラーで解らない事があれば、出てきたエラーコードやメッセージでググれば大抵解決策が出てきますよ。


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



Name: カヤ  ..ぴよぴよ(12ポイント)   Date: 2010/06/08(火) 22:27   No:53764       
Title: 画像パス    
現在プロジェクトのフォルダに直接画像を保存しているのですが、
画像フォルダを作ってそこに保存した場合、ファイルパスはどう記述すればいいんでしょうか?


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


Name: シエル  ..かけだし(1,848ポイント)   Date: 2010/06/08(火) 22:55   No:53766     
Title: Re:画像パス    
プロジェクトファイルがある階層に"abc"というフォルダを作って、その下にある"test.png"というファイルに
アクセスする場合は

"./abc/test.png"

でいいと思います。




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

Name: カヤ  ..ぴよぴよ(32ポイント)   Date: 2010/06/09(水) 21:17   No:53810 解決!     
Title: Re:画像パス    
できました。ありがとうございました。

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



Name: 七篠  ..ぴよぴよ(54ポイント)   Date: 2010/06/08(火) 16:37   No:53753       
Title: スプライトの表示について    
環境  
OS : Windows7 home
コンパイラ名 : VC++ 2008EE, Microsoft DirectX SDK (November 2008)

大きく分けて2点わからないので教えていただければ幸いです。
DirectX9ベースで個人勉強中です。

スプライト機能を使って複数枚のテクスチャ(それぞれ大きさが違う)をなるべくメモリ使用を押さえて一度で表示させたいと思っています。
一枚表示は成功しているのですが複数枚にしようとしたとき、メモリ領域のどこをテクスチャ枚数分確保したらいいのかわからない状態です。(どこをいじったらいいのかわからないです)


描写なのですが、g_pD3DDev->BeginScene()と g_pD3DDev->Release();は1フレーム中に何度も呼び出してよいものでしょうか。
単純に読み出し回数が多くなるとそれだけ遅くなるというだけなのでしょうか?
同フレーム中に呼び出したら前に描写したものは消えてしまうとかならないでしょうか?

添付が現在いじっているファイルになります。


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


Name: シエル  ..かけだし(1,933ポイント)   Date: 2010/06/08(火) 20:02   No:53759     
Title: Re:スプライトの表示について    
私も2週間ほど前から、DirectXを個人勉強中で、スプライトの描画を勉強中です。
もう拡大、回転、アルファブレンド等は出来るようになりました。

私の描画方法としては、LPDIRECT3DTEXTURE9型の変数を画像枚数分用意しておいて、
D3DXCreateTextureFromFileExで画像を枚数分読み込み表示しています。
PNG形式等でも読み込めるので、そんなにメモリは消費しないので、
一度読み込んだらゲームを終了するときまで、私はメモリから解放してません。

私の描画方法としては、
ゲーム起動時にIDirect3D9のインスタンスとIDirect3DDevice9のデバイスとD3DXCreateSpriteでスプライト作成

g_pD3DDev->Clear()とg_pD3DDev->BeginScene()とg_lpD3DXSprite->Begin()呼び出し

g_lpD3DXSprite->Drawでバックバッファに描画したいだけ描画

g_lpD3DXSprite->End()とg_pD3DDev->EndScene()呼び出し

g_pD3DDev->Present呼び出して、実際の画面に反映

ゲーム終了時に各スプライトと、デバイス、インスタンスをReleaseで解放。

というような、流れをループさせて処理させています。

BeginとかEndとか呼び出しすぎると、処理がかなり遅くなったので、
呼び出すのはループの最初と最後だけでいいと思います。
デバイスを解放もゲームの終了時だけで良いと思います。
テクスチャの読み込みとか、描画とかは毎回コードを書くのは面倒なので、
関数化したほうが効率良いです。

また、私はDirectXを勉強するにあたって、下記のサイト様を参考にさせていただきました。
http://toruweb.web.fc2.com/
http://sky.geocities.jp/kmaedam/directx9/directx9.htm

初心者でまとまりのない文章ですが、参考になれば幸いです。
 編集済み


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

Name: ideyan  ..初心者(5,576ポイント)   Date: 2010/06/08(火) 22:18   No:53763     
Title: Re:スプライトの表示について    
こんばんは。
私もDirectX9ベースで色々勉強中の人です^^

1ですが、私は
ループの開始でBeginScene()、ループの最後でEndScene()とPresent()を呼んでます。
スプライトのBegin(),End()は描画用の関数の中で毎回呼んでました^^;
複数枚用意したい場合は、シエルさんの方法で大丈夫だと思います。

2の方ですが、g_pD3DDev->Release();は
呼んだ時点でデバイスを解放してしまうので2回以上呼ぶと困ったことになります。
g_pD3DDev->BeginScene(),g_pD3DDev->EndScene()は、
計測したことないのでちゃんとしたことは言えませんが、
遅くなるような気がするので毎ループ1回ずつ呼ぶのがいいと思います。
複数回呼んでも、バックバッファをクリアしない限りは
前に描写したものが消えると言う事は無いと思います。


後、気になったことを一つ。
前の回答で、シエルさんが
>PNG形式等でも読み込めるので、そんなにメモリは消費しないので、
と仰っていますが、
これが、例えば「BMPに比べてPNGはサイズが小さいので、ロードしてもメモリ消費は小さい」、
といった趣旨の発言でしたら間違っているような気がします。
PNGであろうとBMPであろうと D3DXCreateTextureFromFileEx で画像を読み込むときに
D3DFMT_A8R8G8B8のフォーマットを指定したとすれば、
4バイト(ARGBそれぞれ1バイト)×縦のピクセル数×横のピクセル数 だけのメモリを消費します。
(ミップマップ等の設定もあるので、厳密にはもっと消費しますが、そこは割愛)
私の勘違いでしたら、ごめんなさい。


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

Name: 七篠  ..ぴよぴよ(346ポイント)   Date: 2010/06/09(水) 15:36   No:53787 解決!     
Title: Re:スプライトの表示について    
シエルさんideyanさんありがとうございました。不恰好ですが、複数表示のめどが立ちました。

具体的にわからなかったのはどの型を複数枚分持つかでしたが、シエルさんのおかげで検討がつきました。
IDirect3DTexture9 *pTex[枚数分]; で何とかなりそうです。



しかし不勉強でLPDIRECT3DTEXTURE9とIDirect3DTexture9の違いがいまいちわかっていないのでもっと文献よんで煮詰めていこうと思います。

画像データのメモリ上に上げたメモリ使用量はほかのゲーム作成ツールでも同じような事を言っていたのでideyanさんのほうがあっている気がします。ハードディスク上の容量ということなら確かにPNGは少ないですし半透明情報も持ってくれるので扱いやすいですね。

皆様も勉強がんばってください。重ねてありがとうございます。


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

Name: シエル  ..かけだし(2,081ポイント)   Date: 2010/06/09(水) 15:59   No:53788     
Title: Re:スプライトの表示について    
>>しかし不勉強でLPDIRECT3DTEXTURE9とIDirect3DTexture9の違いがいまいちわかっていないのでもっと文献よん>>で煮詰めていこうと思います。

IDirect3DTexture9のポインタ型がLPDIRECT3DTEXTURE9です。
別にIDirect3DTexture9 *pTex[枚数分]のようにIDirect3DTexture9へのポインタ変数を枚数分作って使用しても
問題なかったと思います。

メモリの件は私の知識不足です。。。もっと勉強します。。。



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



Name: 胡椒  ..初心者(8,946ポイント)   Date: 2010/06/09(水) 01:00   No:53773       
Title: 選択画面について    
ゲームの選択メニューを作っているのですが、詰まってしまいました。
http://dixq.net/g/36.html
ここを参考にして
void game_start(){
    int f;
    int num=4;//選択できる数
    int menu=0;
    if( CheckStatePad(configpad.up)   == 1 && menu > 0 )
        --menu;
    else if( CheckStatePad(configpad.up)   == 1 )
        menu = num-1;
    if( CheckStatePad(configpad.down) == 1 && menu < num-1 )
        ++menu;
    else if( CheckStatePad(configpad.down) == 1 )
        menu = 0;

というようにしたのですが、これを龍神録のプログラムの中に組み込むと、ループしているせいで常に
int menu=0;が出てきてしまいます。
これではupやdownのキーを押してもすぐに元に戻ってしまいます。

グローバル変数を使ってmenu=0という部分を別の場所で定義すれば正しく作動したのですが、なるべくグローバル変数は使いたくありません。
これはどのようにすれば解決できるのでしょうか?


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


Name: ぽこ  ..中級者(14,521ポイント)   Date: 2010/06/09(水) 01:11   No:53774     
Title: Re:選択画面について    
場当たり的な解決法ですが、

int menu=0; 

static int menu=0; 

としてみてはどうですか?


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

Name: バグ  ..ハッカー(197,771ポイント)   Date: 2010/06/09(水) 08:07   No:53776     
Title: Re:選択画面について    
ループの外で定義しといて、引数で渡せばよいのでは?もし、変更した内容が必要になりそうであればポインタを使用すればよいですよ。

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

Name: シエル  ..かけだし(1,898ポイント)   Date: 2010/06/09(水) 08:12   No:53777     
Title: Re:選択画面について    
int menu=0が呼ばれてしまうというか、自動変数なので消滅してしまって値が保存されないためだと思います。
staticを使って静的変数にするか、グローバル変数にするしかないと思います。

追記:
プログラム終了時まで消滅しないメインループの外で自動変数にしてもいいかも。 編集済み


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

Name: 胡椒  ..初心者(8,993ポイント)   Date: 2010/06/09(水) 12:36   No:53783 解決!     
Title: Re:選択画面について    
ありがとうございます。
ループの外で定義しようとも考えたのですが、複雑になってしまいそうで・・・

無事static int menu;にしたら出来ました。
ありがとうございました!


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



Name: かず  ..ぴよぴよ(449ポイント)   Date: 2010/06/09(水) 08:30   No:53779       
Title: ファイルの末尾をとらえて---とは?    
私は今あるプログラムを作っているのですが、少しわからないところがあり困っています。
例えば、
     1, 2, 3, 4, 5
          3, 6, 9, 12, 18
          7, 9, 20, 28, 30
          6, 13, 22, 29, 31     など デ−タファイルがあるとします。その時デ−タの末尾をとらえて
(このデ-タの場合は31)と言う表現ができなくて困っています。どなたかご指南ください。
 デ−タは追加があることを前提としています。


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


Name: asd  ..上級者(20,830ポイント)   Date: 2010/06/09(水) 09:55   No:53781     
Title: Re:ファイルの末尾をとらえて---とは?    
そのデータファイルが、
・カンマ区切りのCSVファイル
・ファイルの末尾とは、最終行の最後のカラムデータ

ということであれば、

1.ファイルから1行読み込む
2.読み込んだデータをカンマで分割して一番最後のデータを覚えておく
3.全ての行を読み込んだあと2.で最終的に覚えているデータがファイルの末尾

という処理でご希望のデータが取れないですか?
質問者様のいう「表現ができない」というのがプログラムが書けないのか、説明文が書けないのか
分からないので一般的な回答をさせていただきました。

プログラムが分からないということであれば、どこまでかけたのか、何ができないでいるのかを
補足するとよいと思いますよ^^


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

Name: かず   Date: 2010/06/13(日) 09:16   No:537791276388191 解決!     
Title: Re:ファイルの末尾をとらえて---とは?    
ありがとうございました。



Name: wing  ..初心者(8,743ポイント)   Date: 2010/06/04(金) 13:05   No:53527       
Title: スーパーマリコ2 を作りました。    
よかったら遊んでみてください。
また、ソースも一緒にアップしましたので、よかったらそちらも
見てください。

http://www1.axfc.net/uploader/Li/so/68591.zip

キー:7777

仕様
全部で11面です。
面のクリアーは、クリアーポイントにタッチ。
コインが100個でハートが一つ増えます。

操作方法
Sキーで決定(スタート)
矢印キーで移動
←、→ + X でスピードアップ
Zキー ジャンプ

感想をいただけるとうれしいです。


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


Name: ムンバ  ..熟練のプログラマー(58,107ポイント)   Date: 2010/06/04(金) 16:57   No:53536     
Title: Re:スーパーマリコ2 を作りました。    
こんにちは。

遊ばせて頂きました。
2面の中盤?くらいの、はしごを連発して飛ぶ所で何度も落ちてしまい
今の所は、そこまでしか行ってません。(自分、鈍いので。)
これを、繰り返すとハートマークが1つずつですが増えていきます。
ハートマークの無限増殖法?になりますね。^^
私的には、時間(タイム)が関係無いので楽しく遊べますし
職場のポンコツPCでも、動きがスムーズに見れました。
背景の動きとかも、ゆったりとしていてゆっくり遊べて楽しかったです。

正直な感想は「wingさん、すごいっ!」と思いました。
こちらの、管理人さんや他の方々の製作された作品をやるたびに
だんだん、自分に自身が無くなる今日この頃でした。^^;
ソース、今後の参考にさせて頂きます。ありがとうございます。
自分も、がんばらねばっ!w

製作お疲れ様でした。
意地でも全面クリアしてみます!



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

Name: wing  ..初心者(8,873ポイント)   Date: 2010/06/04(金) 18:33   No:53542     
Title: Re:スーパーマリコ2 を作りました。    
ムンバさん、ありがとうございます。
まだまだ初心者です。ソースやファイルを見ると分かりますが、
龍神録プログラミングの館で勉強し、それが分かる程度です。
みなさんも結構違和感なく読めるのではないでしょうか。

ゲーム全体にいえることですが、Xキーを押しながら走ったり
ジャンプしたりしなければならないところがたくさんあります。

私もゲームは苦手なんで、例えば3面でゲームオーバーしたら
1面に戻らなければならないというのは苦痛なので、どこからでも
やれるように自分の都合で作っています。

ぜひほかの面もやってみてください。


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

Name: ookami  ..上級者(23,610ポイント)   Date: 2010/06/05(土) 01:39   No:53585     
Title: Re:スーパーマリコ2 を作りました。    
全クリしました!ネタバレ含みます!

ステージにかならず1箇所難しいところ(プレーヤーを殺しにくるところ)があって、その直後にゴールがあるなど、なかなかスルドいレベルデザインですね。

動く床も、乗れたり潰されたり円を描いて動いていたり、作りこまれてるなと感じました。(潰される判定はちょっと厳しいかも?)

ソースコードですが、多くの処理がswitch(stage_num)で分岐する点が印象的でした。

似たパターンのソースコードが何度も出てくるので、私なら適当にまとめてしまいますね。ただ、このように冗長に書いておくのもメリットがあります (1面での修正が他の面に絶対に影響を及ぼさない。これは場合によってはすごいメリットになる) ので、好みの問題と言っていいと思います。


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

Name: wing  ..中級者(9,273ポイント)   Date: 2010/06/05(土) 10:19   No:53612     
Title: Re:スーパーマリコ2 を作りました。    
ookamiさん、ありがとうございます。

動く床は私はリフトと呼んでいますが、当たり判定は相当試行錯誤しました。
キャラが一番高いところからリフトの上に着地する時、キャラのスピードは
16.0f を少し超えます。キャラはリフトにめり込むのでそれをリフトの
上へ戻していますが、めり込んだ時に"キャラがリフトに横から当たった時の
当たり判定"されてしまうので、影響がなくなるまで判定を甘くしました。

graph.cppは、switch(stage_num)で分けました。
それぞれのstageでてんとう虫やハチ、リフトのMAXが違うので、
for文の効率がいいかなと思いました。

もうクリアされたんですか。
リフトが入り組んだところはテストプログラムを作って、何度も
位置調整をしてぎりぎりで通かできるようにしたつもりなんですが。

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


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

Name: kai  ..上級者(16,612ポイント)   Date: 2010/06/05(土) 10:32   No:53613     
Title: Re:スーパーマリコ2 を作りました。    
遊ばせてもらいました。
なかなか凝ってて面白かったです。

簡単なバグ報告のみしときます。

@敵にあたる瞬間にジャンプボタンを押して死ぬと
リトライ後(全滅してから、新しく面から始めた時も含む)、
スタート直後はキーが初期化されておらず、いきなりジャンプしてから始まるようです。

A四角い物体に挟まれた時に壁にめり込むバグがあります。(スクリーンショット参照)
抜け出せないのでゲームを強制終了するしかないです。

B非常に細かい点ですが、死んで画面がフェードアウトした瞬間、
恐らくDrawFormatStringで書かれたと思われる文字が消えてしまいます。
見た目的にも、消さないほうがよろしいかと。
また、その死んだ瞬間にライフも減ってるのが確認しましたので
フェードアウトして完全に画面が真っ暗になったときに
-1したほうがいいんじゃないかなぁ
なんて思いました。


制作お疲れさまでした。


>ムンバさん
>こちらの、管理人さんや他の方々の製作された作品をやるたびに 
>だんだん、自分に自身が無くなる今日この頃でした。^^; 
非常にその気持ち、よく分かりますw


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

Name: wing  ..中級者(9,319ポイント)   Date: 2010/06/05(土) 11:05   No:53614     
Title: Re:スーパーマリコ2 を作りました。    
kaiさん、バグの報告ありがとうごさいました。

ソースも見れると思いますので、、、。
lift.cpp の
// キャラの上にリフトがある場合:ジャンプしてリフトの下辺に当たった場合
    if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2 && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y >  *Y && ch.vy < 0.0f){        
        *Flag = 4;
        ch.y = *Y+CHIP_SIZE/2+CHAR_H/2;
        ch.vy = 1.0f;
        if(wallY == 1)
            ch.flag = 0;
    }

if文の中で
ch.vy < 0.0fをch.vy <= 0.0f で直りました。
最初はこうなっていたとはずなんですが、当たり判定を調整しているうちに不都合があったので
= を消したんだと思うので、もう一度当たり判定全体を検証してみたいと思います。


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

Name: wing  ..中級者(9,378ポイント)   Date: 2010/06/05(土) 11:37   No:53616     
Title: Re:スーパーマリコ2 を作りました。    
>ch.vy < 0.0fをch.vy <= 0.0f で直りました。
こうすると、リフトとキャラが横から当たった場合に
影響しますので、直りましたは間違いです。
もう少し検討してみたいと思います。


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

Name: wing  ..初心者(8,975ポイント)   Date: 2010/06/05(土) 12:53   No:53617     
Title: Re:スーパーマリコ2 を作りました。    
めり込むバグを修正しました。
http://www1.axfc.net/uploader/Li/so/68680.zip
キーは7777

修正したのは
    // キャラの上にリフトがある場合:ブロックとリフトに挟まれた時
    if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2 && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y > *Y && ch.vy == 0.0f){        
        if(wallY == 1 && MoveX == 0.0f)
            ch.flag = 0;
    }
    // キャラの上にリフトがある場合:ジャンプしてリフトの下辺に当たった場合
    if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2 && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y > *Y && ch.vy < 0.0f){        
        *Flag = 4;
        ch.y = *Y+CHIP_SIZE/2+CHAR_H/2;
        ch.vy = 1.0f;
        if(wallY == 1)
            ch.flag = 0;
    }

キャラの上にリフトがある場合:ブロックとリフトに挟まれた時 を
キャラの上にリフトがある場合:ジャンプしてリフトの下辺に当たった場合 の
上に足しました。

たいへん申し訳ありませんでした。


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

Name: wing  ..中級者(9,052ポイント)   Date: 2010/06/05(土) 14:37   No:53619     
Title: Re:スーパーマリコ2 を作りました。    
アップしなおしました。
http://www1.axfc.net/uploader/Li/so/68690.zip

キーは7777

リフトの判定はじっくり再考したいと思います。
とりあえずこの辺で妥協します。
興味のある方はリフトの当たり判定を変更してみてください。

もうしばらくアップしておきます。


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

Name: wing  ..中級者(9,371ポイント)   Date: 2010/06/06(日) 01:13   No:53662 解決!     
Title: Re:スーパーマリコ2 を作りました。    
lift_check関数を次のようにしたらうまくいきました。
void lift_check(float *X, float *Y, float MoveX, float MoveY, int *Flag){
    *Flag = 0;
    // キャラの右にリフトがある場合
    if(abs(ch.x-*X) < CHIP_SIZE-8.0f && abs(ch.y-*Y) < CHIP_SIZE/2+CHAR_H/2-8.0f && ch.x < *X && ch.vx >= 0.0f){
        *Flag = 2; // テストプレイの時、当たり判定があっているか調べる時に使った
        if(ch.vy < 6.0f){
            ch.x -= CHIP_SIZE-8.0f-abs(ch.x-*X)+MoveX;            
            if(wallX == -1)
                ch.flag = 0;
        }
    }    
    // キャラの左にリフトがある場合
    if(abs(ch.x-*X) < CHIP_SIZE-8.0f && abs(ch.y-*Y) < CHIP_SIZE/2+CHAR_H/2-8.0f && ch.x > *X && ch.vx <= 0.0f){
        *Flag = 3;
        if(ch.vy < 6.0f){
            ch.x += CHIP_SIZE-8.0f-abs(ch.x-*X)-MoveX;            
            if(wallX == 1)
                ch.flag = 0;
        }
    }
    // バグの修正:下のif分を追加して解決:-4.0fに注目
    // キャラの上にリフトがある場合:ブロックとリフトに挟まれた時
    if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2-4.0f && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y > *Y && ch.vy == 0.0f){        
        if(wallY == 1 && MoveX == 0.0f) //↑
            ch.flag = 0;
    }
    // キャラの上にリフトがある場合:ジャンプしてリフトの下辺に当たった場合
    if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2 && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y > *Y && ch.vy < 0.0f){        
        *Flag = 4;
        ch.y = *Y+CHIP_SIZE/2+CHAR_H/2;
        ch.vy = 1.0f;
    }
    // キャラの下にリフトがある場合
    if(abs(ch.x-*X) < CHIP_SIZE/2+CHAR_W/2-2.0f && ch.y+CHAR_H/2+1.0f > *Y-CHIP_SIZE/2 && ch.y < *Y && ch.vy >= 0.0f){
        *Flag = 1;
        ch.y = *Y-CHIP_SIZE/2-CHAR_H/2+MoveY; //ok
        ch.vy = 0.0f;
        ch.JumpFlag = 0;
        if(CheckStatePad(configpad.shot) == 1)
            ch.vy = -JUMP_SPEED;
        if(wallY == -1)
            ch.flag = 0;
    }
    if(*Flag == 1){
        if(CheckStatePad(configpad.left) == 0 || CheckStatePad(configpad.right) == 0){
            ch.vx = MoveX;
        }
    }
}


ダウンロードしてくれた方、ありがとうございました。
削除します。


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

Name: けんたろうちゃん  ..初心者(5,191ポイント)   Date: 2010/06/06(日) 10:58   No:53676     
Title: Re:スーパーマリコ2 を作りました。    
気になります。
やってみたかった・・・


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

Name: wing  ..中級者(9,556ポイント)   Date: 2010/06/06(日) 11:40   No:53681     
Title: Re:スーパーマリコ2 を作りました。    
けんたろうちゃんさん、またアップします。
よろしければ遊んでみてください。

リフトの当たり判定をまた変えたので、今度こそ大丈夫だと思うんですが。
kaiさんに指摘されたこともいくつか直しています。

また、ソースも一緒にアップしますので、ソースの分からないとこの質問も歓迎です。

http://www1.axfc.net/uploader/Li/so/68787.zip

キーは7777

data,include,map,sourceのそれぞれのフォルダを使えば、プロジェクトが
作れるので、もっといい作品に仕上げてもらえればうれしいです。


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

Name: けんたろうちゃん  ..初心者(5,221ポイント)   Date: 2010/06/08(火) 10:09   No:53752     
Title: Re:スーパーマリコ2 を作りました。    
ありがとうございました。
ソースコードとても参考になります。


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

Name: wing  ..中級者(10,499ポイント)   Date: 2010/06/08(火) 20:12   No:53761     
Title: Re:スーパーマリコ2 を作りました。    
けんたろうちゃんさん、DLありがとうございます。

ソースコードはもっと効率のいい方法を見つけたら
どんどん改良してください。

分かりにくいところの質問も歓迎します。


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



Name: たろう  ..上級者(22,222ポイント)   Date: 2010/06/08(火) 00:11   No:53742       
Title: ゲームプログラムミングの館24章について    
ゲームプログラミングの館の24章やっているのですが、
これを、移動を自動的に%32==0毎にするのではなく、移動距離を手動的に移動したいのですが、
どうすればよいでしょうか?
コード書いてみたのですが、
真ん中のL字のところがちゃんと通ってくれないのです。
外れたところでとまっていしまうのです。
ソースはこれです。
環境はVC++2005です。
よろしくお願いします。


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


Name: たろう  ..上級者(22,302ポイント)   Date: 2010/06/08(火) 01:10   No:53744     
Title: Re:ゲームプログラムミングの館24章について    
わけがわからないところで止まったり進んだり(手動的に)してしまいます。
ch.x%32==0 && ch.y%32==0毎にではなく、自分で好きなところに移動して(例えばch.x++;xh,y++;などして移動)やるにはどうしたらよいでしょうか?


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

Name: wing  ..中級者(9,577ポイント)   Date: 2010/06/08(火) 07:51   No:53749     
Title: Re:ゲームプログラムミングの館24章について    
説明するのが下手ですので、サンプルを作ってみました。
自分のと比べてみてください。


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

Name: たろう  ..上級者(23,044ポイント)   Date: 2010/06/08(火) 17:53   No:53754     
Title: Re:ゲームプログラムミングの館24章について    
回答とサンプルありがとうございます。
アップしたコードだとちゃんと通るのですが、
通路を変えてみたら、通らないところがありました。
int hantei[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0<==ここ,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,1,1,1,1,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};と言う風にやったらここのところが通りませんでした。

通るにはどうしたらよいでしょうか?


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

Name: wing  ..中級者(10,295ポイント)   Date: 2010/06/08(火) 18:48   No:53755     
Title: Re:ゲームプログラムミングの館24章について    
いま当たり判定は
    if(GetChipParam(ch.x-16.0f+ch.vx, ch.y-16.0f) == 1 ||
        GetChipParam(ch.x-16.0f+ch.vx, ch.y+16.0f) == 1){
            ch.vx = 0.0f;
    }
        
    // 右向き
    if(GetChipParam(ch.x+16.0f+ch.vx, ch.y-16.0f)==1 ||
        GetChipParam(ch.x+16.0f+ch.vx, ch.y+16.0f)==1){
        ch.vx = 0.0f;
    }

    // 上向き
    if(GetChipParam(ch.x-16.0f, ch.y-16.0f+ch.vy) == 1 ||
        GetChipParam(ch.x+16.0f, ch.y-16.0f+ch.vy) == 1){
            ch.vy = 0.0f;
    }
    // 下向き
    if(GetChipParam(ch.x-16.0f, ch.y+16.0f+ch.vy) == 1 ||
        GetChipParam(ch.x+16.0f, ch.y+16.0f+ch.vy) == 1){
            ch.vy = 0.0f;
    }

となっています。
ch.x-16.0fとかch.y-16.0fとかをすべてch.x-14.0fやch.y-14.0fとかにすれば
通れるようになります。

つまり、今の判定は、32の隙間に32では通らないので
少し判定を狭くして32の隙間を28のキャラなら通れるというわけです。



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

Name: たろう  ..上級者(23,014ポイント)   Date: 2010/06/08(火) 19:41   No:53756     
Title: Re:ゲームプログラムミングの館24章について    
回答ありがとうございます。
できたのですが、少し埋め込んだ感じになってしまうのですが、これは仕方がないのでしょうか?


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

Name: wing  ..中級者(10,489ポイント)   Date: 2010/06/08(火) 19:59   No:53758     
Title: Re:ゲームプログラムミングの館24章について    
当たり判定の微調整はしなければいけません。
実際に動かしてみて、一番良いところを見つけます。

上の回答は考え方を示したもので、適当な値を使いました。

私の作った superMariko2 では、キャラの画像は32x32ですが、
高さ28、幅22で当たり判定をしています。

superMariko2 は、まだアップしたままですので、ソースも
いっしょにアップしてあるので、よければ参考にしてください。


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

Name: たろう  ..上級者(23,062ポイント)   Date: 2010/06/08(火) 20:02   No:53760 解決!     
Title: Re:ゲームプログラムミングの館24章について    
そうですか。
superMariko2のソース拝見させていただきます。
ありがとうございました。


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



Name: ムンバ  ..熟練のプログラマー(59,093ポイント)   Date: 2010/06/06(日) 02:51   No:53667       
Title: DXライブラリ関数の DxLib_End 関数つきまして    
こんばんはっ!
夜分、申し訳け無いのですが、帰宅が遅くなってしまったもので。(_ _)

DXライブラリの DxLib_End 関数につきまして

 ・DXライブラリが使用していたメモリ領域を開放し、ウィンドウを閉じる。
  (↑とある本の、ご解説引用)

 ・DXライブラリの使用を終了する関数です。
  DXライブラリを使用しているソフトはすべてソフトを
  終了させる前にこの関数を呼ぶ必要があります。
  同時に、DXライブラリはソフトのウインドウの制御も しているので
  この関数を呼び出した後はなるべくすぐにプログラムを 終了させなければなりません。
  (↑DXライブラリ置き場のリファレンスマニュアルの、ご解説引用)

とあるのですが、例えば・・・

DXライブラリのメイン関数内で(DxLib_Init 関数 〜 DxLib_End 関数の間で)

malloc 関数でメモリを動的確保し、free 関数でメモリの解放をしなかった場合
もしくは
new 演算子でメモリを動的確保し、delete 演算子でメモリの解放をしなかった場合

つまり、両者(それぞれ)共に
動的確保したメモリを解放しなかった(し忘れてた時などの)場合なのですが

1:動的確保したメモリは、DxLib_End 関数により、全て解放される。

2:動的確保したメモリは、DxLib_End 関数により、全て解放されないが
  プログラムを終了すれば、動的確保したメモリは全て解放される。

3:動的確保したメモリは、DxLib_End 関数によって全て解放されないが
  プログラムを終了しても、動的確保したメモリは全て残るが
  パソコンを再起動(終了)すれば、全て解放される。

3-1:プログラムを終了しても、動的確保したメモリは全て残って
  パソコンを再起動(終了)しても、全て解放されない。(残る)

4:動的確保したメモリが全て残っていたとして
 「窓の手」というソフトの中の「掃除機」を使うと
  動的確保したメモリは、全て解放される。<窓の手、ご存知の方のみ

5:動的確保したメモリが全て残っていたとして
 「窓の手」というソフトの中の「掃除機」を使っても
  動的確保したメモリは、全て解放されない。<窓の手、ご存知の方のみ

6:DXライブラリを使用したプログラム内では
  動的確保したメモリは、自分で解放しないと何をしても全て解放されない。


上記、いずれのどれでしょうか?
詳しい方がいらっしゃいましたら、ご指導の程、宜しくお願い致します。

---編集・追伸---

7:本家で聞けっ!
 
 宜しくお願いします。
 今日は寝ます。すみません。
 おやすみなさい。
 編集済み


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


Name: y  ..初心者(5,069ポイント)   Date: 2010/06/06(日) 03:37   No:53668     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
先に申し上げておきますと、DXライブラリが使用していたメモリというのは
DXライブラリ内部で確保されたメモリのことで、
DXライブラリを使用したプログラム内で自分でmallocしたり、newしたメモリとは全く無関係です。

例えば、DxLib::LoadGraph関数内で動的にメモリを確保した場合は、そのメモリに関しては解放されますが、
main関数で自分で確保したメモリに関してはきちんと自分で解放すべきです。
(かならずfreeまたはdeleteすべきかどうかの論争は、筋違いなので割愛)

解放し忘れたメモリがどうなるかは、環境依存となります。
プログラムが終了した時点で全て解放される環境もあれば、
OSをシャットダウンして電源を切るまで解放されない環境もあります。

また、選択肢の内容から察するに、
メモリに関して勉強されていないようなので申し上げておきますと、
メモリの内容はメモリの特性上、電源を切った時点で全て消えます。

以上を踏まえると、提示して頂いた選択肢の中に的確な答えはございません。
しかし、Cとmallocとメモリリークについて勉強すれば、すぐに答えが出るかと思います。


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

Name: ムンバ  ..熟練のプログラマー(59,253ポイント)   Date: 2010/06/06(日) 03:56   No:53669     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
yさん、早速のご指導ありがとうございます。(_ _)

6:DXライブラリを使用したプログラム内では 
  動的確保したメモリは、自分で解放しないと何をしても全て解放されない。

という事で、宜しいでしょうか?

>>DXライブラリを使用したプログラム内で自分でmallocしたり、newしたメモリとは全く無関係です。

 DxLib_End 関数を使っても解放されない。で、良いのでしょうか?

 つまり、DXライブラリで使用するメモリとは別に
 mallocしたり、newしたりした時のメモリは、別に用意されるので
 DxLib_End 関数を使っても解放されず、それぞれは個別に解放しなければならない。

と、解釈して宜しいのでしょうか?
 
 
  編集済み


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

Name: ムンバ  ..熟練のプログラマー(59,661ポイント)   Date: 2010/06/06(日) 04:31   No:53670     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
>しかし、Cとmallocとメモリリークについて勉強すれば、すぐに答えが出るかと思います。

 初心者なりに勉強した上での、悩んだ上で質問させて頂いてるのですが・・・。
 本題は、タイトルの通り、DxLib_End 関数についてです。
 生意気な事言って、申し訳ないです。(謝
 環境依存ではなく、読んだ本に・・・
 の、せいにするのも良くないですね。<反省^^

>>メモリの内容はメモリの特性上、電源を切った時点で全て消えます。

=====↓編集・追加部位(自分の書き込み内容の変更は、あえてしません。)=====

 ↓ここからの文章は、yさんに対してでは無く、自分の解釈についての書き込みです。

 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
 記録は、ほぼハードディスクに残ります。
 記憶は、ほぼメモリに残ります。
 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが
 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

 ↑ここからの文章は、yさんに対してでは無く、自分の解釈についての書き込みです。

=====↑編集・追加部位=====


すみません。明るくなってしまったので、寝ますね。
おやすみなさい。(∪。∪)。。。zzzZZ
   編集済み


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

Name: Mist  ..比類無きプログラマー(83,998ポイント)   Date: 2010/06/06(日) 07:02   No:53671     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
> 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
> 記録は、ほぼハードディスクに残ります。
> 記憶は、ほぼメモリに残ります。
> 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが
> 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

自分の無知を棚に上げて他人をうそつき、泥棒呼ばわりはいかがなものかと。
休止やスリープのような特殊な終了を行った場合を除けば、メモリの内容は電源OFFで消えて復活なんてしませんよ。


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

Name: MNS  ..プログラマー(35,046ポイント)   Date: 2010/06/06(日) 08:04   No:53672     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
前提として、いわゆるRAMと呼ばれるパソコンの記憶装置として使われているメモリは、
電気の供給がなくなると内容が全て消えてしまう、という性質を持っています。
ゆえに、パソコンの電源をOFF、再起動などの作業を行うと、メモリの全内容は消えます。
これは誤りでも何でも無いでしょう。

つまり、再起動を行ってもメモリが解放されないという場合はありません。
次に、アプリケーションを終了した場合ですが、この時のメモリリークは、
OSが勝手に解放してくれることが多いです。これが環境依存ということですね。
もちろん解放してくれない環境も存在します。ですから一概に
「プログラムを終了すれば、動的確保したメモリは全て解放される。」
ということは出来ません。そういう意味で適切な選択肢とyさんは言われたのではないかと思います。

いずれにせよ、自ら確保したメモリを、DXライブラリが解放してくれることはありません。


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

Name: バグ  ..ハッカー(197,444ポイント)   Date: 2010/06/06(日) 13:46   No:53689     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
とりあえず、『自分が確保した領域は、自分で後始末をする!』と覚えておけばよいかと思います。

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

Name: softya [URL]  ..ハッカー(178,761ポイント)   Date: 2010/06/06(日) 14:14   No:53691     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
> 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
> 記録は、ほぼハードディスクに残ります。
> 記憶は、ほぼメモリに残ります。
> 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが
> 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。 

ありえません。
何処で誤解されたのか知りませんが、メモリ(SRAM、DRAM)を含めた揮発性メモリは電気が通じている間だけ情報を保持します。
※現代の主力メモリであるDRAM系は実際のところ数百msしか保持出来ないので一定周期でリフレッシュと言う書き直しまで行っています。
電源を切っても記憶を保持出来るのは、不摘発メモリと呼ばれていて一番有名なのはフラッシュメモリです。
商品としては、SSD、SDカード、USBメモリなどの商品ですね。
パソコンで休止した場合にメモリが復活するのはメモリの内容を全てハードディスクに書き出しているためです。スリープで復活するのはそもそもメモリの電源を遮断していないため。

DxLib_End()に関しては、DxLib関係で確保したメモリを記録していて、それを解放しているだけです。DxLibに関係ないところでメモリをmallocやNewされてもDxLibにとっては知ったことではありません。WindowsやLinuxなどのしっかりとしたOSが動いているプラットフォームを前提で書けばメモリはOSがプロセス単位で管理していますので、OSがmallocやNewの状況を把握しています。プロセスが終了するときにはOSが残ったメモリを全て解放しますので、残ることはありません。


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

Name: ムンバ  ..熟練のプログラマー(60,658ポイント)   Date: 2010/06/06(日) 14:45   No:53695 解決!     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
おはようございます。

<<Mistさん
 ご解説ありがとうございます。---←誤字・編集---
 >>「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
  すみません。うまくお伝えできなくて。
 自分の事を言おうとしたのですが、読み返してみると
 yさんに対して、言ってる様に読めますね。(汗

 <<yさん、ごめんなさい。私への言葉ですので
  お気を悪くされたら、大変申し訳御座いませんでした。

 >>休止やスリープのような特殊な終了を行った場合を除けば
  メモリの内容は電源OFFで消えて復活なんてしませんよ。

 特殊な終了を行った場合以外は、電源を切るとメモリの内容は全て消えるのですね。
 了解しました。
 文章の方も、ご指摘頂きましてありがとうございました。
 以後、気をつけます。すみませんでした。
 また何かありましたら、宜しくお願い致します。

<<MNSさん
 ご解説、ご指摘どうもありがとうございます。

 >>再起動を行ってもメモリが解放されないという場合はありません。 
 >>次に、アプリケーションを終了した場合ですが、この時のメモリリークは、 
 >>OSが勝手に解放してくれることが多いです。これが環境依存ということですね。 
 >>もちろん解放してくれない環境も存在します。ですから一概に 
 >>「プログラムを終了すれば、動的確保したメモリは全て解放される。」 
 >>ということは出来ません。そういう意味で適切な選択肢とyさんは言われたのではないかと思います。

 了解しました。
 DxLib_End 関数では、動的確保したメモリは解放されず
 プログラムを終了した場合に
 環境依存により、解放してくれる場合もあれば、してくれない場合もある。
 yさんのご解説、「電源を切れば全て解放される」も含めまして
 理解できました。
 どうもありがとうございました。

<<バグさん
 ご指導ありがとうございます。

 >>『自分が確保した領域は、自分で後始末をする!』
 電源を切れば、メモリの内容は全て消えるが
 お行儀?上(これも、言い方悪いかもです。)、自分できちんと後始末する。
 という事ですね。
 ありがとう御座います。理解できました。

<<yさんへ(ご解説頂いた皆様にも)
 せっかく、ご丁寧にご解説して頂いたにも関わらず
 私の至らぬ所で、大変、不愉快な思いをさせてしまいました事
 心からお詫び申し上げます。
 本当に申し訳御座いませんでした。
 以降、気を付けますので、誠に勝手ながらお許しいただけます様
 何とぞ宜しくお願い致します。(謝
 
 >>以上を踏まえると、提示して頂いた選択肢の中に的確な答えはございません。 
 >>しかし、Cとmallocとメモリリークについて勉強すれば、すぐに答えが出るかと思います。

 その前に、日本語の勉強が必要ですね。
 どうもありがとうございました。

皆さん、ご迷惑をおかけしました。
メモリの解放、自分なりに理解できました。
また何かありましたら、ご指導・ご指摘の程、宜しくお願い致します。
どうもありがとうございました!
失礼します。 編集済み


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

Name: ムンバ  ..熟練のプログラマー(61,030ポイント)   Date: 2010/06/06(日) 14:57   No:53696 解決!     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
すみません。softyaさんとかぶってしまいました。

>>softyaさん
 ご解説、どうもありがとうございます。
 > 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか? 
 > 記録は、ほぼハードディスクに残ります。 
 > 記憶は、ほぼメモリに残ります。 
 > 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが 
 > 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

 言い訳がましくて申し訳ないのですが、この文章は自分の事です。
 No:53695 の私のレスを読んで頂ければわかると思います。
 今、改めて何度も読み返しながら、深く反省している所です。

 今後の私自身のためにも、あえて編集はしませんので
 お気に触りましたら、どうかご勘弁下さい。
 申し訳御座いませんでした。

---↓編集追加---

改めまして、softyaさん
ご指摘・ご解説どうもありがとうございます。

 >>電源を切っても記憶を保持出来るのは、不摘発メモリと呼ばれていて
 >>一番有名なのはフラッシュメモリです。 
 >>商品としては、SSD、SDカード、USBメモリなどの商品ですね。 
 >>パソコンで休止した場合にメモリが復活するのはメモリの内容を
 >>全てハードディスクに書き出しているためです。
 >>スリープで復活するのはそもそもメモリの電源を遮断していないため。

了解しました。ありがとうございます。
今、まさに「穴があったら入りたい。」状態です。
いつも余計な事を書いてしまい、ご迷惑お掛けします。
また何かありましたら、ご指導・ご指摘の程、宜しくお願い致します。
失礼します。

---↑編集追加--- 編集済み


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

Name: バグ  ..ハッカー(197,713ポイント)   Date: 2010/06/07(月) 10:29   No:53728     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
>>電源を切れば、メモリの内容は全て消えるが 
>>お行儀?上(これも、言い方悪いかもです。)、自分できちんと後始末する。 
>>という事ですね。 
>>ありがとう御座います。理解できました。 


PCの電源は切らないけれど、ソフト自体は何度も再起動させるようなシステムだったら…
メモリを動的確保しているのに、解放していない関数を繰り返し呼び出すような仕様だったら…

というように、メモリリークしているとマズイ状態(逆に良い状況はあるのかな?(^_^;))というのは結構あります。

ですので、かならず確保と解放は1セットと覚えた方がよいですよ。予期せぬ不具合を引き起こしてデバッグで地獄を味わう事になりますので(笑)


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

Name: ムンバ  ..熟練のプログラマー(61,301ポイント)   Date: 2010/06/07(月) 12:23   No:53731 解決!     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
こんにちは。

バグさん、再度ご指導ありがとうございます!

>>予期せぬ不具合を引き起こしてデバッグで地獄を味わう事になりますので(笑)
 気を付けます。^^;

また何かありましたら、宜しくお願い致します。
失礼します!


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

Name: ムンバ  ..熟練のプログラマー(62,123ポイント)   Date: 2010/06/07(月) 23:04   No:53740     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
こんばんは。

解決ボタンを押した後に大変申し訳御座いません。
ご解説・ご指導頂いた「yさん」は、特にご気分を害された事と思います。
私の書き込みを読まれた方々にも、不愉快な思いをさせてしまいました。
本当に、申し訳御座いませんでした。(謝

<< 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?  
<< 記録は、ほぼハードディスクに残ります。  
<< 記憶は、ほぼメモリに残ります。  
<< 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが  
<< 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

言い訳がましくなる事、どうぞ、ご承知おき下さい。
自分なりに、お伝えしようかどうか悩みました。
今更、起こってしまった事を元に戻す事などできないのは承知の上なのですが
ご指摘があった、この私の文章なのですが・・・

私は掲示板に(他のサイトでも)書き込みする際 <特に、文章が長くなりそうな場合
メモ帳に、少しずつコピーを取りながら書き込みをしています。
何故かと言うと

・自分、キーを押し間違えて、時間をかけて書いた文章が全て消えてしまう事が多々ある。
・一時的にコピーした文章を読み返して極力、誤字脱字が無い様にしたいと思っている。
 (それでも、間違いありますが。)
・タグの間違いなどを、確認する。

=====ここからが、私の言い訳です。=====

メモ帳からコピーした文章を、こちらの掲示板に貼り付ける際に
コピーする箇所を間違えて(足りなくて)、眠かった事もあり
確認不足のまま、文章(挨拶)を添えて寝てしまいました。

コピーした、メモ帳の文章には

<< 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

の後に、「自分はこう思っていました。(その他)」
の様なカキコ(貼り付け)をしたつもりでいましたので
昼に起きて、こちらの掲示板を拝見させて頂いた所
自分で読み返して見ましたが、後の祭りだったのです。
本当に、ひどい文章でした。

yさん、ご指導・ご解説して下さった方々、管理人さん、このスレッドを読んで頂いた方々
私の至らぬ所で、申し訳御座いません。
図々しいお願いかと思うのですが、今後とも何か御座いましたら
もし宜しければ、ご指導・ご解説の程、何とぞ宜しくお願い致します。
ご迷惑をお掛けしました。
本当に、すみませんでした。(謝


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

Name: y  ..初心者(5,506ポイント)   Date: 2010/06/08(火) 00:08   No:53741     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
いえいえ、ご理解いただければ幸いです。
私も偉そうなことを言ってしまってすみません。

C言語の中でも、メモリ管理の分野は特に難しい問題です。
ですので動的確保したメモリがどうなるか、というのは気になるところだと思います。
ただ、質問の内容を見る限りまだ勉強不足であると勝手ながら判断させて頂いたので、
ああいう書き方になってしまいました。

質問する上で大事なのは、自分はどこまで知っていて、どこまで頑張ったかを明示することです。
質問の質はどうであれ、回答する側はそういう情報を加味すると回答しやすい場合があったり、
一件素人丸出しの質問でも(失礼)、知識の度合いによっては質問の意味が変わることもしばしばあります。

確保したメモリはどうなるの?といった、疑問や好奇心は大事にしてください。
なぜこうなるの?とか、どういう実装なの?という疑問は、私としても教え甲斐がありますし、
私自身が知りたいときもあります。
なので今回の件に懲りず、これからも是非質問をしてください。
私も、全力で回答したいと思います。




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

Name: ムンバ  ..熟練のプログラマー(62,962ポイント)   Date: 2010/06/08(火) 01:54   No:53745 解決!     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
yさん、こんばんは。
本当に、申し訳け御座いませんでした。(謝
(以降、yさんのレス文多用、お許し下さい。)

>>私も偉そうなことを言ってしまってすみません。

 その様には感じていません。
 今後とも、感じたままにご解説頂ければと思います。
 今までも、こちらの掲示板で色々な方々からの、ご指導やご解説で
 鍛えられていると思ってますので、その辺は大丈夫です。(自爆
 今回の、私の文章こそが偉そうな事を言っている。
 と、思って頂ければ幸いです。
 お心使い、感謝します。ありがとうございます。

これもまた、言い訳がましくなりますが

動的確保されたメモリは、バグさんがおっしゃられている
(他の方々の、ご指導・ご解説頂いたDXライブラリの関数などのレスも踏まえた上です。)

>>『自分が確保した領域は、自分で後始末をする!』

今回の私の疑問、スレッド No:53667 で質問させて頂きました内容は
今勉強してる本に

・DXライブラリが使用していたメモリ領域を開放し、ウィンドウを閉じる。

と、ありましたので
DXライブラリのソース内(main関数内)で使用された全ての関数、つまり
malloc 関数・new 演算子(←関数で無いのも疑問なのですが)を使用して
それぞれ解放する関数・演算子
(本によると、全ての関数となってますので、演算子は如何なるものか?と思いながら)
を、使用しなかった場合でも
DxLib_End 関数で、解放されるのかどうかお聞きしたかった次第です。
この時点で、質問の意図を、うまくお伝えできていませんでした。
申し訳御座いません。

>>確保したメモリはどうなるの?といった、疑問や好奇心は大事にしてください。
 はい。ありがとうございます!

>>ただ、質問の内容を見る限りまだ勉強不足であると勝手ながら判断させて頂いたので、
 おっしゃる通りです。
 趣味でプログラミングを始めたのですが、こちらのサイトや他サイト、本を読んだりして
 独学で勉強している中、不安に思った事は、いつもこちらの掲示板で質問させて頂いてます。
 こちらで、ご指導・ご解説頂けると、納得できると言うか安心できるんですよね。
 そこで今回も甘えてしまい、またまた余計な事を言ってしまい、大失態をしてしまいました。

>> なので今回の件に懲りず、これからも是非質問をしてください。 
>> 私も、全力で回答したいと思います。
 ありがとうございます!
 私は、全力でぶつからせて頂くとすると、また失態をしそうなので
 もう少し、気軽に <変な意味は、決して御座いません。
 質問させて頂きたいと思います。

yさん、お心使い・ご指導・ご解説、ありがとう御座いました。
再度お付き合い頂きまして、どうもありがとう御座います。
今後、また何か御座いましたら、勝手ながら宜しくお願い致します。

PS:今日は熟睡できそうです。ありがとうございます。
  お騒がせしました。
  おやすみなさい。


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

Name: softya [URL]  ..ハッカー(179,213ポイント)   Date: 2010/06/08(火) 02:39   No:53746     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
まぁ、出だしのところはミスだろうなとは思っていましたが、
 > 記録は、ほぼハードディスクに残ります。 
 > 記憶は、ほぼメモリに残ります。 
 > 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが 
 > 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。 
これを半分でも信じていたら怖いので書かせてもらいました。
みなさんにも誤解は伝わったと思いますので、気になさらないでください。

で、
>DXライブラリのソース内(main 関数内)で使用された全ての関数、つまり
>malloc 関数・new 演算子(←関数で無いのも疑問なのですが)を使用して
>それぞれ解放する関数・演算子
>(本によると、全ての関数となってますので、演算子は如何なるものか?と思いながら)
>を、使用しなかった場合でも
>DxLib_End 関数で、解放されるのかどうかお聞きしたかった次第です。 
は、まだ誤解がある様です。
DxLibが把握しているのはDxLib内部で呼び出したメモリアロケート(mallocやnew)などのメモリで、これはリスト構造など(詳しく調べておりませんので違う方法の可能性が高いです)で後で解放のために記録されています。DxLib外であるユーザープログラムが何をしているかは監視出来ませんので、ライブラリ利用者であるムンバさんがどんなメモリアロケートを行ったかはDxLibは情報を得ることが出来ません。つまり、ムンバさんが確保したメモリを解放する権利も情報もありません。
ちなみにnew演算子に関しては、C++の文法書をお読みください。


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

Name: ムンバ  ..熟練のプログラマー(63,412ポイント)   Date: 2010/06/08(火) 10:04   No:53751 解決!     
Title: Re:DXライブラリ関数の DxLib_End 関数つきまして    
おはようございます。

softyaさん、再度どうもありがとうございます。
お心使い、ありがとうございます。
了解しました。
もう少し、踏み込んで勉強してみます。

>>ユーザープログラムが何をしているかは監視出来ませんので、ライブラリ利用者であるムンバさんがどんなメ>>モリアロケートを行ったかはDxLibは情報を得ることが出来ません。つまり、ムンバさんが確保したメモリを>>解放する権利も情報もありません。

後始末も、自分が責任を持ってやる。(汗

本当にありがとうございました。
また何かあれば、その節は宜しくお願い致します。
失礼します!


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



Name: まる  ..かけだし(1,995ポイント)   Date: 2010/06/02(水) 22:34   No:53358       
Title: メニュー画面について    
はじめまして。私はc++を最近学び始めた初心者です。

ゲームのメニュー画面についてですが、C言語-ゲームプログラミングの館33章の「選択画面の作り方」を見て、
NEW GAMEなどの文字を、文字ではなく画像を使ってみたいなと思っています。

具体的には、選択されているときは周りが光った画像、選択されてないときは薄暗い画像と使い分けるようにしたいです。

17章「画像を分割して読み込む」を読んで画像は作ってみましたが、肝心のプログラミングは何をすればいいか
分からず困っています。アドバイスをいただけないでしょうか


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,197,577ポイント)   Date: 2010/06/03(木) 08:10   No:53414     
Title: Re:メニュー画面について    
メニュー項目の文字の部分に画像を表示すればいいだけではないでしょうか?

まずは画像そのものを明るい、暗いで表現してみてはどうでしょう。
明るいか暗いかは
http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R3N18

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R3N17
のαブレンド等で表現すると良いと思います。


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

Name: まる  ..かけだし(2,022ポイント)   Date: 2010/06/03(木) 21:16   No:53498     
Title: Re:メニュー画面について    
urlを参考にやってみたいと思います。
ありがとうございました。 編集済み


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

Name: まる  ..かけだし(2,139ポイント)   Date: 2010/06/03(木) 22:09   No:53501     
Title: Re:メニュー画面について    
urlを参考にint SetDrawBright()を使ってみたいと思います。

33章の「選択画面の作り方」では"■"という記号を動かして選択するようになっていますが、"■"を使わず、明るい画像・暗い画像を切り替えて選択しているところを示すには、どのようにしたらいいのでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,198,503ポイント)   Date: 2010/06/03(木) 22:19   No:53502     
Title: Re:メニュー画面について    
SetDrawBright関数の使い方は解りますか?

例えば半分の輝度で描画したければ

SetDrawBright(128,128,128);
DrawGraph( x, y, ImageHandle, TRUE );

です。これはMAX255に対して赤=128、緑=128、青=128を表しています。
通常描画は

SetDrawBright(255,255,255);
DrawGraph( x, y, ImageHandle, TRUE );

です。
詳細はリファレンスをご覧ください。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

赤っぽくしたいなら
SetDrawBright(255,128,128);

なんてこともできます。


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

Name: まる  ..かけだし(2,165ポイント)   Date: 2010/06/04(金) 21:35   No:53555     
Title: Re:メニュー画面について    
ありがとうございます。

SetDrawBrightの使い方は理解できました。

しかし、画像の切り替えのやり方が分かりません。 編集済み


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

Name: ひよこ  ..比類無きプログラマー(85,131ポイント)   Date: 2010/06/07(月) 19:30   No:53735     
Title: Re:メニュー画面について    
画像の切り替え
>>これって画像を変えるということですか?
>>そうだったらLoadGraphの引数を変えるか、違う画像ハンドルでLoadGraphを使うかの方法があります。

スタートか終了を選ぶメニュー画面を作ってみます。注意!そのまま使えません。
int gra_start,gra_end;//スタート、終了の画像ハンドル
gra_start=LoadGraph("Start.png");
gra_end=LoadGraph("End.png");

int menu=0;//メニュー番号 0(スタート) 1(終了)

if(menu==0){
SetDrawBright(256,256,256); //明るく
DrawGraph(x,y,gra_start,TRUE); 

SetDrawBright(128,128,128); //暗く
DrawGraph(x,y,gra_end,TRUE); 
}

if(menu==1){
SetDrawBright(256,256,256); //明るく
DrawGraph(x,y,gra_end,TRUE); 

SetDrawBright(128,128,128); //暗く
DrawGraph(x,y,gra_start,TRUE); 
}


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

Name: まる  ..かけだし(2,202ポイント)   Date: 2010/06/07(月) 22:11   No:53739 解決!     
Title: Re:メニュー画面について    
回答ありがとうございます。

上を参考にやってみたいと思います。


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



Name: コンバット  ..ぴよぴよ(78ポイント)   Date: 2010/06/06(日) 21:52   No:53716       
Title: ウインドウの左上のアイコンを変える方法    
本家をみてリソースをいじり実行用のexeのアイコンなどを変えることは出来ました。
ただしウインドウの左上のアイコンは変わってくれませんでした。

調べてみるとint SetWindowIconID( int ID ) ;という関数でできるということまでわかりました。
ただresource.hというものが自動的に作られると書いてあるのですがそのようなものは作られておりません。
Resource.rcは自分で作り
MAINICON ICON "icon.ico"
としか書いてありません。

どの様にすればアイコンを変えられるでしょうか?


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


Name: ZASEA  ..ぴよぴよ(327ポイント)   Date: 2010/06/07(月) 00:09   No:53723     
Title: Re:ウインドウの左上のアイコンを変える方法    
私が調べたところ、SetWindowIconID関数の引数にはあなたが使いたいアイコンの
リソースIDというものを指定するそうです。

あなたの開発環境がVisualC++ExpressEditionの場合は
Resource.hというファイルは自動生成されません。
しかも、リソースIDは通常Resource.hで定義されるので、
自分でファイルを作成してリソースIDを設定するしかありません。
Resource.hの作り方とリソースIDの設定のしかたを以下に示します。

まずはResource.hというファイルを作成し、
以下の一行を書きこみます。

#define MAINICON 101

これでリソースIDが101に設定されます。
そしてresource.rcの先頭と全てのソースファイルの先頭に
次の一行を加えます。

#include "Resource.h"

あとはSetWindowIconID関数の引数にMAINICONを指定すれば
ウィンドウのアイコンを変えられるはずです。

今後Resource.rcに他のリソースを入れるときには、
そのリソースに対しても同じようにリソースIDを設定してください。


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

Name: たいちう  ..比類無きプログラマー(92,808ポイント)   Date: 2010/06/07(月) 08:57   No:53727     
Title: Re:ウインドウの左上のアイコンを変える方法    
http://homepage2.nifty.com/c_lang/sdk/sdk_29.htm

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



Name: しろ  ..中級者(10,145ポイント)   Date: 2010/06/07(月) 07:41   No:53726       
Title: DXライブラリでの文字列の改行処理について    
DXライブラリの文字列の改行処理プログラムで質問です。

下記のサイト

http://karetta.jp/book-node/game-programming/235072


ここのメイン関数のwhile文内のプログラムがよくわかりません。

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


while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
if( g_message[currentCursor] != '\0' ) {
currentCursor++;
}

//画面クリア
ClearDrawScreen();

//MESSAGE_MAX_LENGTH まで文字を描画したら段落を切り替える
if( currentCursor % MESSAGE_MAX_LENGTH == 0 ) {
if( g_message[currentCursor] != '\0' ) {
currentLineCursor++;
}
}

for( i = 0; i < MESSAGE_MAX_LINE; i++ ) {
if( i == currentLineCursor ) {
//サウンドノベルメッセージ風に表示
writeSubstring( g_message, i * MESSAGE_MAX_LENGTH , 
currentCursor - MESSAGE_MAX_LENGTH * i,
50, 100 + MESSAGE_FONT_SIZE * i, whiteColor, i );
break;
}else {
//メッセージをそのまま表示
writeSubstring( g_message, i * MESSAGE_MAX_LENGTH , MESSAGE_MAX_LENGTH, 50, 100 + MESSAGE_FONT_SIZE * i, whiteColor, i );
}
}
Sleep( 100 );
ScreenFlip();
}

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

「MESSAGE_MAX_LENGTH まで文字を描画したら段落を切り替える」というのはわかるのですが、その後のfor文内の引数が複雑で理解できません。

どなたかご教授いただけませんでしょうか?よろしくお願いいたします。


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




Name: 千代田級駆逐艦  ..ぴよぴよ(83ポイント)   Date: 2010/06/07(月) 00:34   No:53724       
Title: 朝鮮語版のwarcraft 3 に日本語の漢字を表示させるには?    
添付された写真から見えるように、朝鮮語版のWarcraft 3には漢字が出来ません。

内部的に文字表部分何とかを編集すべきだと思っていますが。。。

非日本語版のゲームのどのファイルをどのプログラムで如何編集すれば日本語の漢字が出来るのですか。


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


Name: たかぎ [URL]  ..ハッカー(200,986ポイント)   Date: 2010/06/07(月) 00:56   No:53725     
Title: Re:朝鮮語版のwarcraft 3 に日本語の漢字を表示させるには?    
普通、そのような改変は許されないのですが...

http://www.cric.or.jp/db/article/a1.html#020
上記URLにある

三 特定の電子計算機においては利用し得ないプログラムの著作物を当該電子計算機において利用し得るようにするため、又はプログラムの著作物を電子計算機においてより効果的に利用し得るようにするために必要な改変

だと主張できなくもありません。
ただ、訴訟に発展した場合、受けて立つ覚悟がないならやめておくべきです。


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



Name: DG  ..かけだし(1,645ポイント)   Date: 2010/06/06(日) 18:58   No:53702       
Title: DXライブラリの通信機能    
DXライブラリの通信機能を使いたくて、本家のチャットプログラムのサンプル
http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html の21番)
をそのままコピペして実行ファイルをつくり、相手にそれを渡して通信を試みた
のですが接続に失敗してしまいます。

OSのファイアウォールやセキュリティソフトからは警告が出てブロックを解除しましたし、
ルーターのファイアウォールも無効にしてやってみたりしたのですが出来ませんでした。

IPアドレスはグローバルIPを入力しました。
(グローバルIPだけで端末を特定出来るのかな?と思いつつ)
送信側、受信側ともにルータを使っています。

環境は、Vista32bit(相手側も)、VC++2008EE です。

通信に関する知識はあまりないので簡単なことが原因かもしれませんが、どうしたものでしょうか。


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


Name: ムンバ  ..熟練のプログラマー(61,120ポイント)   Date: 2010/06/06(日) 20:52   No:53710     
Title: Re:DXライブラリの通信機能    
こんばんは。

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R13N1

こちらのサンプルソースは試されましたか?
私は、このサンプルソースを使って、同じLAN内のPC同士でつながる事は確認してます。

送信側 Vista(Ult32bit)  VC++2008EE
受信側 XP(pro)

宜しければ、試してみて下さい。


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

Name: DG  ..かけだし(1,582ポイント)   Date: 2010/06/06(日) 21:10   No:53712     
Title: Re:DXライブラリの通信機能    
前述のプログラムを試す前にそちらのプログラムを試してみたのですが、ダメでした。

同じLAN内で試してみたい所なのですが、PCが1つしかないのでできません。



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

Name: ideyan  ..初心者(5,456ポイント)   Date: 2010/06/06(日) 21:43   No:53714     
Title: Re:DXライブラリの通信機能    
LAN内ならばプライベートIPで相手が特定できますが、
ネット越しにグローバルIPで通信しようとすると
どのコンピュータに繋いでいいのかわからなくなります。

そこで、受け側はルータでポートマッピングをして
このポートにきた通信はこのPCに転送する、といった設定をしておく必要があります。


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

Name: Justy  ..伝説なるハッカー(540,971ポイント)   Date: 2010/06/06(日) 21:45   No:53715     
Title: Re:DXライブラリの通信機能    
>送信側、受信側ともにルータを使っています。
 このあたりはネットワークの習熟が進めば自ずとわかると思いますが、
2台ともルーター下にあると接続は一筋縄ではいきません。

 なので今は同一ルーター下にあるPCでテストするのがいいでしょう。


>同じLAN内で試してみたい所なのですが、PCが1つしかないのでできません
 アプリの多重起動を有効にすれば、PC1台でも一応テストは可能ですよ。
 アプリを2つ立ち上げて、片方は接続待ちに、もう片方は自分のプライベートIPアドレスを
接続先に指定すれば2つのアプリ間で接続でき、チャットも可能になるはずです。


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

Name: DG  ..かけだし(1,732ポイント)   Date: 2010/06/06(日) 22:25   No:53718     
Title: Re:DXライブラリの通信機能    
>>ideyanさん
なるほど。今作っているのが対戦型のゲームなのですが、わざわざポートの設定をしないと通信できないとなると、
遊んでもらう人たちにちょっと頑張ってもらわなければなりませんね・・・

>>Justyさん
PC1台で二重に起動し、チャットすることはできました。ありがとうございました。


できればプレイヤーがポートなどの設定をせずに通信できるようにしたいんですけどね・・・


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

Name: ムンバ  ..熟練のプログラマー(61,216ポイント)   Date: 2010/06/06(日) 22:26   No:53719     
Title: Re:DXライブラリの通信機能    
>>前述のプログラムを試す前にそちらのプログラムを試してみたのですが、ダメでした。
 紹介させて頂いたサンプルソースが、素人の私でもできたので
 もしかしたら、できるかもしれないと思い紹介させて頂きました。
 お役に立てず、余計な事ですみませんでした。

---編集・追記---
上からすみません。
お心使い、ありがとうございます。(_ _)
 
  編集済み


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

Name: DG  ..かけだし(1,824ポイント)   Date: 2010/06/06(日) 22:35   No:53720     
Title: Re:DXライブラリの通信機能    
>>ムンバさん
いえいえ、誠意を持って協力してくださったのに余計だなんてそんなことあるはず無いですから、
これからもちょっと思った事でも助言していただけるとうれしいです。(*´ ェ`)


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



Name: kaiten  ..中級者(10,434ポイント)   Date: 2010/06/04(金) 20:26   No:53550       
Title: static_castによるダウンキャスト(C++)    
 久しぶりにプログラムを組んでいたら分からない点があったので質問させていただきます。

 子クラスのメンバにアクセスしない保証があるという前提の場合、型が親クラスの変数のポインタを子クラスのポインタにstatic_castでダウンキャストしてもいいのでしょうか?

 親クラスのprotectedなメンバに子クラスの静的メンバ関数からアクセスしたいのですがこれが不可能らしいので子クラスのポインタに親クラスの変数のポインタをstatic_castで子クラスのポインタにダウンキャストして入れています。
 今のところ動いてはいるのですが単にバグが顕在化していないだけだと後々困るので確認したいのです。

以下やりたい事のコード
class A
    {
    protected:
        int test;
    };

class B
    : public A
    {
    public:
        static void Func(A* a)
            {
            B* ptr=static_cast<B*>(a);
            ptr->test=0;
            }
    };


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


Name: やんち [URL]  ..かけだし(1,841ポイント)   Date: 2010/06/04(金) 21:46   No:53556     
Title: Re:static_castによるダウンキャスト(C++)    
static_cast を使うよりも、dynamic_cast の方が、安全で簡単かも。

class A
    {
    public:
        virtual ~A()
            {
            }
    protected:
        int test;
    };

class B
    : public A
    {
    public:
        virtual ~B()
            {
            }
        
        static void Func(A* a)
            {
                B* p = 0;
                p = dynamic_cast<B*>(a);
                if (!p)
                    {
                        fprintf(stderr, "*** ダウンキャストに失敗。\n");
                    }
                else
                    {
                        p->test = 0;
                    }
            }
    };


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

Name: kaiten  ..中級者(10,339ポイント)   Date: 2010/06/04(金) 21:54   No:53557     
Title: Re:static_castによるダウンキャスト(C++)    
>>やんちさん
返信ありがとうございます。

 dynamic_castの方が安全なのはわかっているのですが、今回の場合親クラスの型の変数のポインタをキャストしているのでdynamic_castだとNULLが返ってくると思うのですがどうでしょう。


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

Name: Justy  ..伝説なるハッカー(538,226ポイント)   Date: 2010/06/04(金) 22:12   No:53558     
Title: Re:static_castによるダウンキャスト(C++)    
 A::SetTest(int value)を publicで作成するではダメなのでしょうか?


>static_castでダウンキャストしてもいいのでしょうか?
 B::Funcに与える引数が 100% Bか Bを継承したインスタンスのポインタ
であることを保証できるのなら。
 編集済み


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

Name: たかぎ [URL]  ..ハッカー(199,786ポイント)   Date: 2010/06/04(金) 22:13   No:53559     
Title: Re:static_castによるダウンキャスト(C++)    
dynamic_castを使うには、多相オブジェクトへのポインタか参照をオペランドにとらなければなりません。
今回の場合、クラスAには仮想関数がひとつもありませんので、dynamic_castを使うことはできません。

static_castでダウンキャストを行う場合には、正しくキャストできることを自分で保証しなければなりませんが、それができるのであれば一応問題はありません。


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

Name: pie  ..ぴよぴよ(700ポイント)   Date: 2010/06/05(土) 02:48   No:53597     
Title: Re:static_castによるダウンキャスト(C++)    
AとBの関係が密であれば、
class Aの中でfriend class Bを宣言すれば
a->testにアクセスできるので無意味なダウンキャストは避けられるかな。

ところで、
「派生クラスのメンバ関数から、thisでない基本クラスオブジェクト(のポインタや参照)のprotectedなメンバにアクセスできない。
でも自クラスであれば、thisじゃなくてもprotectedやprivateメンバにアクセスできる。」
という言語仕様に今さらながら少し驚きました。
整合性がとれてない気がします。

つまり、kaitenさんの例では
「a->testにアクセスできてもよさそうだし、
それが許されないのならptr->testも許されないべき」
な気が俺はするんですが。

便乗質問になってしまいますが、
こんな仕様になってるのには何かわけがあるんでしょうか?

ちなみにJavaで似たようなコードを書いて試したところ、
B.Func内でa.testに直接アクセスしてもコンパイルエラーにはなりませんでした。


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

Name: たかぎ [URL]  ..ハッカー(200,286ポイント)   Date: 2010/06/05(土) 03:15   No:53603     
Title: Re:static_castによるダウンキャスト(C++)    
> こんな仕様になってるのには何かわけがあるんでしょうか? 

こうしておかないと、Aから派生したCを作れば、Bの部分オブジェクトをCから破壊できることになります。


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

Name: pie  ..ぴよぴよ(841ポイント)   Date: 2010/06/05(土) 04:44   No:53606     
Title: Re:static_castによるダウンキャスト(C++)    
なるほど。たしかに。

Javaの場合はprotectedの制限が少し緩くて
同一パッケージ内からは全然関係ないクラスからでもアクセスできてしまう以上、
もともとその危険性は覚悟の上でprotectedにしてるんでしょ、ってことですね。

然るに、kaitenさんの状況は本来あってはならない状況ってことですね。
でも絶対ないかっていうとありえなくもないような・・・?
そうなるようなクラス設計がそもそもおかしいのでしょうかね。
まあ滅多にない状況ではあると思うので、
もし自分が直面したらその時また考えることにします。


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

Name: kaiten  ..中級者(10,650ポイント)   Date: 2010/06/05(土) 20:36   No:53632     
Title: Re:static_castによるダウンキャスト(C++)    
Justyさん、たかぎさん、pieさん、返信ありがとうございます。

>>Justyさん
正道できちんとやるならA::SetTest(int value)を作るべきだとは思うのですが、確実に親クラスのポインタである保証がある場合はstatic_castでどうにかならないかと思った次第です。親クラスを子クラスの静的メンバ関数内で操作したかったのでpublicなアクセス関数を用意しようとなると変数の数だけ作らなければならなくなるので……
ところで、BではなくAのポインタなのですが、これはつまり不可ということですか?

>>たかぎさん
デストラクタを仮想関数にしていたのですがうっかり書き忘れていました。たしかにこれではdynamic_castは使えませんね。
この場合、
A a;
B* b=static_cast<B*>(&a);

が正しいキャストであるならばよいということでしょうか。Aのメンバにしかアクセスしない前提の場合これは正しいと言えるのか知らないのでよろしければ教えていただけないでしょうか。

>>pieさん
私もポインタから直接アクセスできるものだと思っていました。その結果コンパイルエラーになったのでかなり慌てました。
確かに、仕様上できないことを無理に行おうとするのは設計がおかしいと言わざるを得ませんね。仕事でも課題でもないのをいいことに出来るか試すような書き方をしているので人には見せられないようなものになってます。


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

Name: Justy  ..伝説なるハッカー(540,767ポイント)   Date: 2010/06/06(日) 14:44   No:53694     
Title: Re:static_castによるダウンキャスト(C++)    
>ところで、BではなくAのポインタなのですが、これはつまり不可ということですか
 実際のところこのサンプルの範囲内であれば動くことは動くと思いますが、
この方法は潜在的な問題を抱えることになり、幾つか別の要素が入ってきたときに
問題になるかもしれません。

 それを承知の上であれば可です。


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

Name: たかぎ [URL]  ..ハッカー(200,499ポイント)   Date: 2010/06/06(日) 15:16   No:53699     
Title: Re:static_castによるダウンキャスト(C++)    
> A a;
> B* b=static_cast<B*>(&a);
> が正しいキャストであるならばよいということでしょうか。

正しいはずがありませんね。
強引なキャストをするつもりなら、いっそのこと、

A a;
int* p = reinterpret_cast<int*>(&a);
*p = 0;

とでもすればどうですか?
このほうが、やっていることの危険性がよくわかります。


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

Name: kaiten  ..中級者(10,527ポイント)   Date: 2010/06/06(日) 15:50   No:53700     
Title: Re:static_castによるダウンキャスト(C++)    
>>Justyさん
Bには静的メンバ関数以外追加しないのでこのサンプルの範囲内で収まると思います。なにか問題が起きたらその際に設計事見直そうと思います。

>>たかぎさん
確かに強引で危険なキャストであることを明示するためにreinterpret_castを使った方が良さそうですね。


今回は危険な方法であることを肝に銘じてreinterpret_castにして終了します。
これにて解決とします。ありがとうございました。


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

Name: たかぎ [URL]  ..ハッカー(200,550ポイント)   Date: 2010/06/06(日) 20:03   No:53707     
Title: Re:static_castによるダウンキャスト(C++)    
> 今回は危険な方法であることを肝に銘じてreinterpret_castにして終了します。

reinterpret_castでint*にするなど、凶悪さを強調しておきべきですよ。
念のため繰り返しておきます。



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

Name: kaiten  ..中級者(10,652ポイント)   Date: 2010/06/06(日) 22:22   No:53717 解決!     
Title: Re:static_castによるダウンキャスト(C++)    
>>たかぎさん
私が想定していたより遥かに凶悪な行動のようなのでアクセス関数を設けることにします。
少なくとも楽をするためにとっていい方法ではなく、全力を尽くして避けるべき方法だと認識しておきます。
普通に組めば直面しない状況でも有りますし。



終了宣言だけして解決押し忘れてました。すみません。今度こそ解決とします。


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



Name: あ〜る  ..上級者(20,593ポイント)   Date: 2010/06/04(金) 23:59   No:53569       
Title: ファイルオープン方法について    
今回、東方や龍神録のように、タイトルからリプレイボタンを選ぶとリプレイファイルの難易度情報(EasyやHardなど)一覧を表示する、といった処理を実装しようと思いました
以下がそのソースなんですが


char replay_name[64];
for(i=0;i<20;i++){
    memset(replay_name,0,sizeof(char));
    sprintf(replay_name,"media/replay/replay%d.dat",i+1);
    FILE *fp;
    if((fp=fopen(replay_name,"rb"))==NULL){//ファイルが無かったら
        //printfDx("ファイルオープンエラー\n");
        replay_game_mode[i]=-1;//難易度情報に-1を入れる
        //break;
        fclose(fp);
    }
    if((fp=fopen(replay_name,"rb"))!=NULL){//あったら
        fread( replay_info, sizeof(unsigned char),10,fp); 
        fread( &replay, sizeof(replay_t), 1, fp ) ; 
        fread( replay_save_key, sizeof(unsigned char), REPLAY_MAX_TIME, fp ); 
        fclose( fp );
        replay_game_mode[i]=replay_info[4];//難易度情報にリプレイの難易度情報を入れる
    }
}
というようにファイルを開くと、ファイルが無い場合の処理は上手くいくのですが、ファイルがある場合、番号が存在するファイルの中で一番大きいファイル(replay1.dat,replay3.dat,replay15.datがある場合はreplay15.dat、一番最後に開かれたファイル?)の情報が存在しているファイルの番号のreplay_game_mode全てに入れられてしまいます。 すごくわかりにくくてすいません・・・ それで、ソースコードを以下のように書き換えました
for(i=0;i<20;i++){
    memset(replay_name,0,sizeof(char));
    sprintf(replay_name,"media/replay/replay%d.dat",i+1);
    FILE *fp = fopen( replay_name, "rb" ); 
    if(!fp){
    replay_game_mode[i]=-1;
    fclose(fp);
    }else{
    fread( replay_info, sizeof(unsigned char),10,fp); 
          fread( &replay, sizeof(replay_t), 1, fp ) ; 
        fread( replay_save_key, sizeof(unsigned char), REPLAY_MAX_TIME, fp ); 
    fclose( fp );
    replay_game_mode[i]=replay_info[4];
    }
}


このようにしたところ、しっかり番号通りのreplay_game_modeに、対応した番号のリプレイファイルの難易度情報が入れられました。

ただ最初と変えた後とでやってる事は変わらないように思えるのですが、どこにどう違いがあるのでしょうか?
正しい処理は出来るようになったのですが原因がわからないので不安です
状況が分かりづらくてすいません
どなたかご教授よろしくお願いします。

環境はWindousXP
BorlandC++でBCCDeveropperを使っています
DXライブラリを使っています
 編集済み


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


Name: ookami  ..上級者(23,348ポイント)   Date: 2010/06/05(土) 00:41   No:53573     
Title: Re:ファイルオープン方法について    
気づいた点を指摘させていただきます。
・前者だと、ファイルが存在する場合、fopenを2回連続で行っていますね。5行目と14行目です。
・ファイルが無い場合はfcloseする必要はありません。前者でも後者でもそうなっていますね。

参考になれば幸いです。


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

Name: あ〜る  ..上級者(20,762ポイント)   Date: 2010/06/05(土) 00:46   No:53575     
Title: Re:ファイルオープン方法について    
ookamiさん返信ありがとうございます

>>前者だと、ファイルが存在する場合、fopenを2回連続で行っていますね。5行目と14行目です。
これはこの掲示板にソースをコピペする際にミスってしまいました。編集で直しておきます。

>>ファイルが無い場合はfclose する必要はありません。前者でも後者でもそうなっていますね。
そうだったんですか、知りませんでした。
教えて頂きありがとうございます^^

他に問題点ございましたら指摘などお願いします。


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

Name: ookami  ..上級者(24,456ポイント)   Date: 2010/06/05(土) 03:01   No:53599     
Title: Re:ファイルオープン方法について    
なんと。コピーミスでしたか。すると...ちょっと私も「やってる事は変わらないように思える」ですね...^^:

あとはステップ実行してみるくらいしかないと思います。


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

Name: あ〜る  ..上級者(20,877ポイント)   Date: 2010/06/06(日) 21:05   No:53711     
Title: Re:ファイルオープン方法について    
返信遅なってすいません・・・
この掲示板携帯でフィルタリングにかかるようになっちゃいました・・・(泣)

やっぱり変わらないですよね。
何なんでしょうか・・・
ステップ実行が何なのかわかりませんが、調べてやってみようと思います。
ありがとうございました!


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



Name: 山崎  ..熟練のプログラマー(42,803ポイント)   Date: 2010/06/06(日) 09:24   No:53674       
Title: DXライブラリを使った通信の速度などについて    
いつもお世話になっております。山崎です。
今回は、DXライブラリの通信の機能を使った場合の通信速度などについて、
伺いに参りました。

XPでVisualStudio2010を使ってます。

ただいま、ネット対戦可能な格闘ゲームを作ろうと模索しており、
その通信を司る部分を今作っています。
そこで、次の処理を行って簡単に通信にかかる時間を計ってみました。
なお、60fpsで動いてますので1フレームで大体0.016ミリ秒かかってます。

自分をA、接続相手をBとしたとき、
1、あるデータをBに送信する
2、そのデータを受け取ったBは、受け取ったデータをそのままAに送信し返す
3、Aはデータを送信してから返ってくるまでのフレーム数を求める

ネットの知り合いに頼んでこのプログラムのテストに付き合って頂き
データを送ってから戻ってくるまでのフレーム数を測ったところ、
大体4〜6フレームかかっておりました。

同期をするためのカウントと、コントローラの入力を毎フレームやり取りしあうような
通信部分にしようと考えています。

相手からのデータが届くのを待つのに2〜3フレームかかるとすると、
ゲームの進行速度は半分から3分の1になってしまい、
1フレームの入力が勝敗を分ける格闘ゲームは
ゆっくり過ぎてゲームにならなくなるのではないか、と懸念しております。

DXライブラリを使って通信しあうプログラムでは、
送受信に2〜3フレームかかるのは仕方のないことなのでしょうか?
格闘ゲームを60fpsで動かそうとするのは無謀なのでしょうか。


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


Name: Justy  ..伝説なるハッカー(538,621ポイント)   Date: 2010/06/06(日) 11:30   No:53678     
Title: Re:DXライブラリを使った通信の速度などについて    
>DXライブラリを使って通信しあうプログラムでは、 
>送受信に2〜3フレームかかるのは仕方のないことなのでしょうか? 
 DXライブラリじゃなくても仕方がないです。
 ネットワークとはそういうものです。
 2〜3フレームというのも環境によって変動しますし、環境が同じなら一定と
いうこともありません。

 なので多少ラグがあっても大丈夫なように設計するしかありませんね。


>格闘ゲームを60fpsで動かそうとするのは無謀なのでしょうか。
 そこに十分な時間がかけられるなら無謀ということはないです。
 簡単にはいかないでしょうが、同期するタイミングをXフレームおきにし、
データが来ない間は推測して動かして、データが来たらつじつまを合わせる、
とかやりようはありますので。


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

Name: Ma  ..ハッカー(104,263ポイント)   Date: 2010/06/06(日) 11:35   No:53680     
Title: Re:DXライブラリを使った通信の速度などについて    
毎フレーム入力状態を得ようとしてたら、おっしゃるとおり全体が遅くなって格闘ゲームには不向きでしょう。
でも、そもそも待つ必要はあるんでしょうか?
データがこない間は前の入力状態を継続すればOKです。(つまりホスト側がかなり有利になります。)
つまり、60fpsにできます。

ホスト側が有利になるのがいやであれば、自分の入力情報の更新を対戦相手の入力を受信した時のみにすればある程度平等になるんじゃないでしょうか。
(あるいはホストサーバーを作るか。) 編集済み


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

Name: 山崎  ..熟練のプログラマー(43,110ポイント)   Date: 2010/06/06(日) 11:47   No:53683     
Title: Re:DXライブラリを使った通信の速度などについて    
Justyさん
ご返信、誠にありがとうございます。
どうしてもラグは避けられないものなのですね。
データが来ない間は推測…ですか、そういう手法もあるんですね。
いやいや、非常に勉強になりました。

Maさん
ご返信誠にありがとうございます。
なるほど、データの来ない間は前の入力状態を継続させる、のですね。
今私の作ろうとしている設計には当てはまるかもしれません、
その手法でとりあえずやらせて頂きますね。
1フレームでも入力を早く受け付けるとおそらく格闘ゲームではかなり有利になると思うので、
おっしゃるように受信したときに処理するようにしてみます。

ところで、「ホストサーバ」とは、どういったものかちょっと聞かせて頂いてもよろしいですか?


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

Name: softya [URL]  ..ハッカー(178,244ポイント)   Date: 2010/06/06(日) 13:12   No:53687     
Title: Re:DXライブラリを使った通信の速度などについて    
DXライブラリじゃなくても、インターネットを使った通信の場合はパケットの遅延は当たり前に起こります。
メーカー製の格闘ゲームの通信をパケットキャブチャしてみると良い勉強になると思いますが、推測でどのようなことをしているか書いてみると、メインの通信は非同期通信を使っていると思います。同期型の通信は、ゲームの場合遅延が相当ネックになります。それと相手との双方向に情報を送り合うと言うよりは、一方的に必要な情報を相手に送信していると言うイメージかなと。パケットを送って返事を待つ時間がすごいロスですからね。
コマンドや当たり判定もそのまま送るのではなく、少ない情報で済むように加工していると思います。
ここら辺はノウハウの塊と言っても良いので、かなり経験を必要とします。

プロトコル的に有利なUDPを使っているという話も聞いたことがありますが、パケットロストをどうしているかネットワークゲームを組んだことが無いので適当な話ですいません。

この本が参考になるかと。
http://www.amazon.co.jp/dp/4797328460
※ サーバーの参考にはならない本みたいです。

>ところで、「ホストサーバ」とは、どういったものかちょっと聞かせて頂いてもよろしいですか? 
ホストサーバには色々ありますが、Maさんの言う方法はゲームの進行というか当たり判定も含めてホストサーバーが行うイメージだと思います。つまり仮想的な対戦システムはサーバー上に有り、パソコンは画の表示とキーの入力を行うシステムだけを搭載しているイメージです。これはサーバー側の負荷がとても大きです。
PC(A)⇔サーバー⇔PC(B)
ですね。


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

Name: 山崎  ..熟練のプログラマー(43,319ポイント)   Date: 2010/06/06(日) 14:03   No:53690 解決!     
Title: Re:DXライブラリを使った通信の速度などについて    
softyaさん
ご返信誠にありがとうございます。
メーカー製のは非同期通信が多いのですか。
うーん、てっきり、同期して矛盾がないように気を配っているものとばかり思っていました。
いやぁ、ホント勉強になります。
VBを使ったネットワークゲームなら組んだことがあるのですが、
C++を使って通信をするプログラムは初めてなので、経験をつんでいこうと思います。

あ、その本は、ちょうど昨日 本屋で立ち読みしてた奴です〜!(笑)
サーバに関する技術書を探し回っておりました。
パラパラッと読んですぐに置いてしまったので、ちゃんと読み直しますかな…。

ホストサーバ…主な処理をサーバで行っちゃうんですね。
いいパソコンを私は持ってないので、そのシステムだとサーバの負荷に耐えられないですかも。

いろいろ丁寧にお教え頂き、ありがとうございました。


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

Name: YuO  ..熟練のプログラマー(45,927ポイント)   Date: 2010/06/06(日) 18:47   No:53701     
Title: Re:DXライブラリを使った通信の速度などについて    
解決となっていますが……。

MicrosoftのXbox360およびWindowsで使用可能なXNAではUDPを使っています。
XNA自体の通信系はXbox360そのもののはずですから,Liveネットワーク自体UDPで動作しているはずです。
使っているのがXNAではないにしろ,ひにけにXNA (XNA開発チーム伊藤さんのBlog) の記事は参考になるのではないでしょうか。
Blog: Browse by Tags - ひにけにXNA - Site Home - MSDN Blogs
http://blogs.msdn.com/b/ito/archive/tags/_cd30c330c830ef30fc30af30_/
# 「タグ:ネットワーク」の一覧です。

あと,XNA Forumでのひげねこさん (伊藤さん) の回答の付いたスレッドです。
こちらには,ひげねこさんがいくつか方法を提示してくれています。
Site: ネットワーク対戦 - XNA Community Forums
http://forums.xna.com/forums/t/38945.aspx


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

Name: 山崎  ..熟練のプログラマー(43,363ポイント)   Date: 2010/06/06(日) 20:25   No:53708     
Title: Re:DXライブラリを使った通信の速度などについて    
YuOさん、ご返信誠にありがとうございます。
解決はつけておりますが、もちろん常に回答受付中ですのでっ!

いやぁ貴重な情報ありがとうございます。
こういうコラム的な記事をこれから読まなきゃなぁと思っていたところなのでした。
私も、こんなコラムをかけるくらいの技術者にならなければ。
紹介していただいたサイト、お気に入りに登録させて頂きました。

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


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



Name: RRSS  ..ぴよぴよ(236ポイント)   Date: 2010/06/06(日) 15:03   No:53698 解決!       
Title: リソースエディター ResEdit    
質問じゃないんだけどごめんなさい。
VC++をやる上においてWinアプリを作る場合、ある程度知識が上がるとリソースファイル(ウィンドウのデザインやアイコン定義などの視覚部分デザイン記述ファイル)を使う方が楽なのに……と感じる場合があります。

断念ながらVC++ Expressにはリソースエディターが付属されていません。しかし、幸い下記フリーツールが使用できます。
ttp://gurigumi.s349.xrea.com/programming/visualcpp/resedit.html
ttp://www.resedit.net/

このツールは外国製ですが、Japanese設定により日本語:英語=8:2の割合で日本語化できます。
頭の片隅に置いておいても損は無いと思います。


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




Name: テトラ  ..ぴよぴよ(93ポイント)   Date: 2010/06/05(土) 22:49   No:53652       
Title: 特定のディレクトリにあるwavファイルだけを全て読み込む    
DXライブラリを使ってゲームを作っております。
特定のディレクトリにあるwavファイルだけを
全て読み込むことをしたいのですがどの様にすればよいのでしょうか?

特定のディレクトリにある拡張子がwavのタイトル名を全て取得したいです。


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


Name: Justy  ..伝説なるハッカー(538,288ポイント)   Date: 2010/06/06(日) 01:34   No:53664     
Title: Re:特定のディレクトリにあるwavファイルだけを全て読み込む    
 Windowsなら WinAPIのFindFirstFileと FindNextFileを使うのがいいかと思いますが、
DXライブラリにそれと似たような関数がありますのでそちらを使ってもいいかもしれません。


http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=434
----- ヘッダから抜粋
// 指定のファイル又はフォルダの情報を取得し、ファイル検索ハンドルも作成する( 戻り値: -1=エラー  -1以外=ファイル検索ハンドル )
extern  int FileRead_findFirst( const char *FilePath, FILEINFO *Buffer ) ;
// 条件の合致する次のファイルの情報を取得する( 戻り値: -1=エラー  0=成功 )
extern  int FileRead_findNext( int FindHandle, FILEINFO *Buffer ) ;
// ファイル検索ハンドルを閉じる( 戻り値: -1=エラー  0=成功 )
extern  int FileRead_findClose( int FindHandle ) ;



 WinAAPIを使うならこちら。

FindFirstFile
http://nienie.com/~masapico/api_FindFirstFile.html

FindFirstFile
http://yokohama.cool.ne.jp/chokuto/urawaza/api/FindFirstFile.html
FindNextFile
http://yokohama.cool.ne.jp/chokuto/urawaza/api/FindNextFile.html
WIN32_FIND_DATA
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/WIN32_FIND_DATA.html


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

Name: テトラ  ..ぴよぴよ(273ポイント)   Date: 2010/06/06(日) 10:08   No:53675     
Title: Re:特定のディレクトリにあるwavファイルだけを全て読み込む    
URLありがとうございます。

URLを見たのですがイマイチわかりません・・・。
DXライブラリなので搭載されている関数を使おうと思っております。
ただ関数の使い方がよくわかりません。

例えば指定されたパスに5個のwavファイルがあるとします。
それを読み込む為にあらかじめサウンド用のハンドル5個以上用意しとかなければいけませんよね?
しかし5個以上あったら5個しか用意していなかったら配列が壊れてしまうかと思います。
soundにそれぞれのハンドルを入れたいです。

// 現在のソース
int Sound[5];

〜main関数↓〜

FILEINFO lp;
int hFind = FileRead_findFirst( "DATA/SOUND/BGM/DIR" ,  &lp );
FileRead_findClose(hFind);


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

Name: Justy  ..伝説なるハッカー(538,407ポイント)   Date: 2010/06/06(日) 11:01   No:53677     
Title: Re:特定のディレクトリにあるwavファイルだけを全て読み込む    
>しかし5個以上あったら5個しか用意していなかったら配列が壊れてしまうかと思います
 十分大きな配列を用意しておいて、格納した数をカウントしながら溢れそうになったら
処理を打ち切る or エラーにするか、std::vectir<int>のような動的に伸張するコンテナを使えばいいかと。


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

Name: テトラ  ..ぴよぴよ(419ポイント)   Date: 2010/06/06(日) 11:33   No:53679     
Title: Re:特定のディレクトリにあるwavファイルだけを全て読み込む    
なるほど・・・。
あらかじめ用意しておくことにします。

又、〜ここ〜と書いてある所にどんな処理を書けばよいのかがわかりません・・・。
どうか教えては頂けないでしょうか?

FILEINFO lp; 
int hFind = FileRead_findFirst( "DATA/SOUND/BGM/DIR" ,  &lp ); 
〜ここ〜
FileRead_findClose(hFind);


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

Name: Justy  ..伝説なるハッカー(539,158ポイント)   Date: 2010/06/06(日) 12:13   No:53684     
Title: Re:特定のディレクトリにあるwavファイルだけを全て読み込む    
 今回は wavファイルだけ探しますので、FileRead_findFirstの末尾は "*.wav"とした方がいいでしょう。

 シンプルに書くとこんな感じです(DATA/SOUND/BGM/DIRディレクトリ内にある wavファイルが対象)。


    FILEINFO fileInfo;
    int hFind = FileRead_findFirst("DATA/SOUND/BGM/DIR/*.wav", &fileInfo);
    if(hFind != -1)
    {
        do
        {
            if(fileInfo.DirFlag)
                continue;
            
            int soundHandle = LoadSoundMem(fileInfo.Name);
            if(soundHandle != -1)
                // ← ここで配列に格納する
            
        } while(FileRead_findNext(hFind, &fileInfo) == 0);
        
        FileRead_findClose(hFind);
    }



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

Name: テトラ  ..ぴよぴよ(691ポイント)   Date: 2010/06/06(日) 13:22   No:53688     
Title: Re:特定のディレクトリにあるwavファイルだけを全て読み込む    
何度も何度も本当にありがとうございます。
本当に助かっております。

Sound.Wave[1] = LoadSoundMem( "DATA/SOUND/BGM/DIR/over2.wav" );
PlaySoundMem( Sound.Wave[1], DX_PLAYTYPE_LOOP );
等と書くと正常になるので音自体は問題が御座いません。

fileInfo.Nameを見てみるとファイル名しか入っていないので
LoadSoundMem(fileInfo.Name)だけだと音が正常に読み込めておりませんでした。
又、ファイル名(パスを含まない)だけをSound.Name[0]等に格納しておきたいです。

下記の様に試してみたのですが駄目でした・・・。


typedef struct{
    int Wave[LOAD_MAX];
    char Name[128][LOAD_MAX];
}SOUND;

static SOUND Sound;

〜メイン↓〜
    if(hFind != -1){ 
        int cnt = 0;
        do{ 
            if(fileInfo.DirFlag) continue; 
            int soundHandle = LoadSoundMem(fileInfo.Name);
            char name[128];
            strncpy(name, fileInfo.Name, sizeof(fileInfo.Name));

            // ← ここで配列に格納する 
            if(soundHandle != -1){
                Sound.Wave[cnt]    = soundHandle ;
                //ここでエラーが起こる//Sound.Name = strncpy(Sound.Name[cnt], name, sizeof(name));
                cnt++;
            }
            
        } while(FileRead_findNext(hFind, &fileInfo) == 0); 

        FileRead_findClose(hFind); 
    } 



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

Name: Justy  ..伝説なるハッカー(540,686ポイント)   Date: 2010/06/06(日) 14:31   No:53693     
Title: Re:特定のディレクトリにあるwavファイルだけを全て読み込む    
>fileInfo.Nameを見てみるとファイル名しか入っていないので 
 おっと、ごもっともです。
 ディレクトリパスとファイル名を(sprintf等で)結合したものを LoadSoundMemに渡す必要がありますね。

 そうですねぇ、さすがにその SOUNDクラスはちょっとどうかと思います。
 Wave(ハンドル)と Nameの対応が対になっておらず、しかも数も違うというおかしな状態になっています。
 
 最低でも

struct SoundInfo
{
    int handle;
    char name[MAX_PATH];
};

struct SoundList
{
    int         size;
    SoundInfo   list[LOAD_MAX];
};
ようにその2つの情報を対にして対応が取りやすいクラスにした方がいいでしょう。

 で、この前提で書くとこんな感じになります。

static SoundList soundList;

〜メイン↓〜

    static const char basePath[] = "DATA/SOUND/BGM/DIR/";   // 対象となるディレクトリ
    char path[MAX_PATH];
    
    FILEINFO fileInfo;
    sprintf(path, "%s%s", basePath, "*.wav");               // 探すパターンをディレクトリ名込みで作成する
    int hFind = FileRead_findFirst(path, &fileInfo);
    if(hFind == -1) return;
    
    int index = 0;
    do
    {
        if(fileInfo.DirFlag)
            continue;
        
        sprintf(path, "%s%s", basePath, fileInfo.Name);     // ディレクトリパスとファイル名を結合
        int soundHandle = LoadSoundMem(path);
        if(soundHandle != -1)
        {
            SoundInfo &soundInfo = soundList.list[soundList.size];
            soundInfo.handle = soundHandle;
            strcpy(soundInfo.name, fileInfo.Name);          // ファイル名だけをコピー
            ++soundList.size;
        }
        
    } while(FileRead_findNext(hFind, &fileInfo) == 0 && soundList.size < LOAD_MAX);    // 次のファイルが無いかリストの空きが無くなったら終了
    
    FileRead_findClose(hFind);



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

Name: テトラ  ..ぴよぴよ(731ポイント)   Date: 2010/06/06(日) 15:00   No:53697 解決!     
Title: Re:特定のディレクトリにあるwavファイルだけを全て読み込む    
出来ました!!!!
Justy様、本当にありがとうございます。
わざわざサンプルソースまで頂いて本当に感謝しております。
ありがとうございました!!


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



Name: Ultimate [URL]  ..ぴよぴよ(688ポイント)   Date: 2010/06/05(土) 21:05   No:53633       
Title: 弾幕シューティング勉強方法    
Ultimateです。

ブロック崩しが終わったところで、シューティングを作りたいと書きました。

そのシューティングですが、ただのシューティングではつまらないので、弾幕のようにしたいです。

龍神録プログラミングの館で勉強しようと思ったら、それはVisual Studioが前提のようでした。

僕のパソコンは、なぜかたくさんのエラーがでて、Visual Studio C++ Expressがインストールできません。
(エラーコードからたくさん調べましたが、一向に解決しなさそうです。)

なので、BCCを使ってプログラミングをやっています。

どのように勉強すべきでしょうか?

ただのシューティングなら、割とすぐにできそうな気がします。
 編集済み


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


Name: Ultimate [URL]  ..ぴよぴよ(429ポイント)   Date: 2010/06/05(土) 21:08   No:53635     
Title: Re:弾幕シューティング勉強方法    
なぜかぴよぴよに戻ってしまったのですが、なぜでしょうか?

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

Name: MNS  ..プログラマー(34,939ポイント)   Date: 2010/06/05(土) 21:40   No:53638     
Title: Re:弾幕シューティング勉強方法    
べつにBCCでも問題ないと思います。
ただし、VC++に依存する機能を使わなければ、ですが。
まあ、恐らく管理人さんもあまり多用はされてないと思いますし、
仮に問題が起きたとしても、解決はそれほど難しくないと思います。

>なぜかぴよぴよに戻ってしまったのですが、なぜでしょうか?
ポイントを落としたからです。


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

Name: たいちう  ..比類無きプログラマー(92,796ポイント)   Date: 2010/06/05(土) 21:42   No:53639     
Title: Re:弾幕シューティング勉強方法    
> どのように勉強すべきでしょうか?

> ただのシューティングなら、割とすぐにできそうな気がします。

そういう時は、まず出来ること・出来そうなことから始めてみましょう。
ただのシューティングからです。


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

Name: Ultimate  ..ぴよぴよ(459ポイント)   Date: 2010/06/05(土) 21:52   No:53640     
Title: Re:弾幕シューティング勉強方法    
ポイントを1500も落とした覚えはありませんが・・・

一度普通のシューティングをやった方がいいのですね。


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

Name: ぽこ  ..中級者(13,770ポイント)   Date: 2010/06/05(土) 22:04   No:53641     
Title: Re:弾幕シューティング勉強方法    
> ポイントを1500も落とした覚えはありませんが・・・

名前を変えたからでは?



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

Name: Dixq (管理人) [URL]  ..ウィザード(1,201,125ポイント)   Date: 2010/06/05(土) 22:14   No:53643     
Title: Re:弾幕シューティング勉強方法    
ハナブオオオトカゲさんの時からですか?
ID登録をしたりログインして書きこんだりしているわけではないので、
名前を変更するとランクポイントもリセットされてしまいます。


ところで、普通のシューティングと弾幕シューティングってプログラム違いますか・・?

ただ弾の出し方が大げさになって弾が沢山出てくるだけではないかと思いますが。

大げさに弾を出してもせいぜい同時に500個位でしょうし、
弾の軌道計算や当たり判定を効率化しないと処理しきれないなんてことはないので、
同じ計算式で十分だと思います。

やりたければエリア分割して当たり判定を計算すれば効率化出来るかも知れませんが、
これ位なら力任せでも出来てしまうレベルですよね。
(エリア分割して当たり判定を計算することについては館で触れていませんが)


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,201,202ポイント)   Date: 2010/06/05(土) 22:20   No:53645     
Title: Re:弾幕シューティング勉強方法    
ちなみに、ポイントは掲示板上メニューの「昇進状態」から確認出来ます。

しかしすごい人の数になりましたね・・。


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

Name: Ultimate  ..ぴよぴよ(625ポイント)   Date: 2010/06/06(日) 09:18   No:53673     
Title: Re:弾幕シューティング勉強方法    
BCCで龍神録プログラミングの館で勉強は可能ですか?

ファイルをダウンロードしましたが、Visual Studio用のファイルだったので・・・

Visual StudioのエラーはNET Frameworkが関係しそうですが、ファイルを修復してもどうしてもうまくいかないので、BCCでやっていきます。(今後も、Visual Studioのエラーの原因を探していく予定です。うまくインストールされ次第Visual Studioに変えたいと思います。)


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,201,380ポイント)   Date: 2010/06/06(日) 11:42   No:53682     
Title: Re:弾幕シューティング勉強方法    
プロジェクト一式用意できないのを除けば
コンパイラが何かは問題ではないです。

ですので、BCCでも可能ですよ。


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

Name: Ultimate  ..ぴよぴよ(683ポイント)   Date: 2010/06/06(日) 12:36   No:53685 解決!     
Title: Re:弾幕シューティング勉強方法    
ありがとうございました。

プロジェクトが用意できないのは残念ですが、龍神録プログラミングの館でやってみます。

ここで解決にします。


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



Name: 深黒  ..かけだし(2,222ポイント)   Date: 2010/06/06(日) 00:15   No:53658       
Title: LoadGraphについて外部変数に出来ますか?    
タイトルの通りです。

#include "DxLib.h"

int fie=LoadGraph( "field.bmp" ) ;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ 
    ChangeWindowMode(TRUE); // ウインドウモードに変更
    SetGraphMode(800,600,32);
    DrawGraph(0,0,fie,FALSE);
    その他諸々の処理;
}
こんな感じに外部変数を使っているのですが、画像が表示されません。
LoadGraphは外部変数だと使えないのでしょうか?


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


Name: 紅葉  ..上級者(15,469ポイント)   Date: 2010/06/06(日) 00:26   No:53659     
Title: 無題    
あまり詳しくないので違ってたら申し訳ないのですが
DX_Initを呼ばないとライブラリを使えなかったような気が・・・
それとInit後にLoadを呼ばなかった行けなかった気がします。


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

Name: 深黒  ..入門者(2,526ポイント)   Date: 2010/06/06(日) 00:30   No:53660     
Title: Re:無題    
すみません、書き忘れです・・・
見せるプログラムを減らすとよく何かを書き忘れてしまいます・・・
#include "DxLib.h" 

int fie=LoadGraph( "field.bmp" ) ; 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){  
    ChangeWindowMode(TRUE); // ウインドウモードに変更 
    SetGraphMode(800,600,32);
  if( DxLib_Init()==-1) return -1;// DXライブラリ初期化処理 エラーが起きたら終了 
    DrawGraph(0,0,fie,FALSE); 
    その他諸々の処理; 
  DxLib_End() ;           // DXライブラリ使用の終了処理
  return 0;
}


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

Name: ぽこ  ..中級者(14,434ポイント)   Date: 2010/06/06(日) 00:30   No:53661     
Title: Re:LoadGraphについて外部変数に出来ますか?    
> LoadGraphは外部変数だと使えないのでしょうか?

上記のような使い方では、使えないと思った方が良いです。

グローバル変数はmain()関数が始まる前に初期されます。
フローバル変数の初期化順序は処理系依存です。
LoadGraph()はDxLib_Init()が呼ばれるまでは正常に動作しません。

以上を踏まえて、深黒さんがやりたい事を実現するには、
「初期化順序が不定であるグローバル変数が初期される前に、DxLib_Init()を呼び出す。」
必要があります。矛盾してますね。
 編集済み


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

Name: Justy  ..伝説なるハッカー(538,675ポイント)   Date: 2010/06/06(日) 01:19   No:53663     
Title: Re:LoadGraphについて外部変数に出来ますか?    
>LoadGraphは外部変数だと使えないのでしょうか?
 出来るか出来ないかで言えば出来ます。

 同一翻訳単位の中であれば関数外の静的オブジェクトは定義順に初期化されますので、

int inited = (ChangeWindowMode(TRUE) == DX_CHANGESCREEN_OK && SetGraphMode(800,600,32) == DX_CHANGESCREEN_OK && !DxLib_Init())? TRUE: FALSE;
int fie= inited? LoadGraph( "test.jpg" ): -1;

と同一ファイルに書くか、いっそのことまとめて

int fie= (ChangeWindowMode(TRUE) == DX_CHANGESCREEN_OK && SetGraphMode(800,600,32) == DX_CHANGESCREEN_OK && !DxLib_Init())? LoadGraph( "test.jpg" ): -1;  

とすれば理論的には可能です。

 しかし、このようなコードはいろいろな問題を引き起こしかねないのでお勧めは出来ません。

 普通に WinMain関数が実行されてから各種初期化・ロードを行うようにした方がいいでしょう。
 編集済み


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

Name: 深黒  ..入門者(2,560ポイント)   Date: 2010/06/06(日) 01:46   No:53665 解決!     
Title: Re:LoadGraphについて外部変数に出来ますか?    
返信ありがとうございました。
うーん、結構面倒ですね・・・
無理に外部変数にするのはやめとこうと思います


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,201,437ポイント)   Date: 2010/06/06(日) 02:19   No:53666     
Title: Re:LoadGraphについて外部変数に出来ますか?    
いやいや、単に代入を後にすればいいだけでは・・。

ゲームプログラミングにおいて、宣言と同時に変数に画像のロードをしたりすることはあまりないと思います。

初期化やロードの関数やコンストラクタがあり、その中でロードするのが普通だと思います。

別に宣言と同時に代入しないといけない事は無いのですから、面倒だと思う事は無いと思いますよ。


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



Name: ab  ..ぴよぴよ(34ポイント)   Date: 2010/06/05(土) 22:44   No:53650       
Title: 13章・enter_shot関数について    
こんばんは。
13章のところで質問があります。

敵の弾発射処理として、

@enemy[i].bltime==enemy[i].cnt時にenter_shot(i)を呼び出し
Aenter_shot関数でshot[j].flagの立っていないものを調べて空いていたら登録

といった処理を行っていますがこの時、渡した変数"i"をshot配列の添え字(shot[i])にし、for,if文を削除し
て同様の処理をしても特に問題がなさそうな気がします。
void enter_shot(int i){
                        shot[i].flag=1;//フラグをたてる
                        shot[i].knd=enemy[i].blknd;//弾の種類
                        shot[i].cnt=0;
                        return ;
}
このような処理だと何か不都合があるのでしょうか?
(shot[j].num=iの処理を気持ち的に削除したかったので…)

以上、宜しくお願い致します。


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


Name: ぽこ  ..中級者(14,212ポイント)   Date: 2010/06/05(土) 22:58   No:53654     
Title: Re:13章・enter_shot関数について    
> void enter_shot(int i){
>                         shot[i].flag=1;//フラグをたてる
>                         shot[i].knd=enemy[i].blknd;//弾の種類
>                         shot[i].cnt=0;
>                         return ;
> }
> このような処理だと何か不都合があるのでしょうか?
> (shot[j].num=iの処理を気持ち的に削除したかったので…)


これってenemy[i]が撃った弾が、必ずshot[i]に格納されるって事を意味していますよね?
敵が弾を2発撃てなくなりますよ。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,201,269ポイント)   Date: 2010/06/05(土) 23:00   No:53655     
Title: Re:13章・enter_shot関数について    
結果として同じ事をするプログラムでも担当を明確にしたいという事があります。

この場合、enter_shotは純粋に「ショットを登録する」という仕事をしてくれる関数です。
しかし上記のようなプログラムにするためには、関数呼び出し元で、登録可能な配列要素を探すという処理が必要になり、
ショットを登録する為に役割が2つの関数を隔てる事になります。

ところで、enemyの添え字iとshotの添え字iは意味が違います。
0番の敵が0番のショットを使用しているとは限りません。
1対多や多対1でも対応できるようにしたかったのですが、敵と弾幕は1対1で所有の関係にした方がわかりやすかったですね。

しかし関数の引数をなるべく少なくしたい為とは言え、こんな関数は見るにたえないですね我ながら・・。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,201,316ポイント)   Date: 2010/06/05(土) 23:01   No:53656     
Title: Re:13章・enter_shot関数について    
shotはbulletを所有しているので、

shot=弾幕(弾の親分。弾Managerみたいな感じ)
bullet=弾

という関係ですね。

enemyは必要な時どれかあいているshotを利用する事になります。


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

Name: ぽこ  ..中級者(14,280ポイント)   Date: 2010/06/05(土) 23:11   No:53657     
Title: Re:13章・enter_shot関数について    
> shot=弾幕(弾の親分。弾Managerみたいな感じ)
> bullet=弾

> という関係ですね。

っをう、すみません、ミスリードですね。

てことは、abさんが示したような変更をすると、ある弾幕が完全に終わらない限り
次の弾幕が張れないことになりますね。


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



Name: ぽこ  ..中級者(13,861ポイント)   Date: 2010/06/05(土) 22:20   No:53644       
Title: 龍神録プログラミングの館第22章    
管理人さんへ。

掲題に箇所に関する修正要望です。

graph.cppの修正部分にgraph_effect()を追加してください。

#オリジナルのソースコードを確かめない人間がイケないのはわかっていますが、
#1章からの説明で一番嵌った部分だったので、取り敢えず要望を出しておきます。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,201,401ポイント)   Date: 2010/06/05(土) 22:23   No:53646     
Title: Re:龍神録プログラミングの館第22章    
ご要望ありがとうございます。

22章でgraph_effect関数に変更があったのにその旨書かれていないという事ですね?

最初は変更点を全て書くと書く量が大変な事になってしまうので、要点だけにしていたんです。

しかしそれでは解りにくいとの声を受けて、変更点を書くようにしたのですが、
後から追加したので、漏れが沢山あって・・。

ですのでこのように言って下さるのはとてもありがたいです。
これからも似たような事があれば教えて頂けると幸いです。


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

Name: ぽこ  ..中級者(14,099ポイント)   Date: 2010/06/05(土) 22:32   No:53647     
Title: Re:龍神録プログラミングの館第22章    
回答ありがとうございます。

> これからも似たような事があれば教えて頂けると幸いです。

お言葉に甘えて、2点ほどおかしな点を報告させていただきます。
ともに17章です。

・キャラクターに関する構造体ch_tにメンバshot_cntが存在しない。
 サンプルコードの17章以降には定義されているのですが、
 1章から順に自分でコードを追加・修正していった場合に、コンパイル
 エラーが発生します。
 構造体ch_tは4章で登場しますが、メンバshot_cntが存在していないことが
 原因です。

・画像ファイルのパスがおかしいため、自弾が表示されない。
 ×img_cshot[0]=LoadGraph("dat/img/char/bl_00.png");
 ×img_cshot[1]=LoadGraph("dat/img/char/bl_01.png");

 ○img_cshot[0]=LoadGraph("../dat/img/char/bl_00.png");
 ○img_cshot[1]=LoadGraph("../dat/img/char/bl_01.png");


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,201,403ポイント)   Date: 2010/06/05(土) 22:38   No:53648     
Title: Re:龍神録プログラミングの館第22章    
情報ありがとうございます。
22章、17章ともに修正終わりました。
もしよろしければご確認いただけると幸いです。

http://dixq.net/rp/17.html

http://dixq.net/rp/22.html


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

Name: ぽこ  ..中級者(14,151ポイント)   Date: 2010/06/05(土) 22:43   No:53649     
Title: Re:龍神録プログラミングの館第22章    
> 22章、17章ともに修正終わりました。
> もしよろしければご確認いただけると幸いです。

何て迅速な対応。。

確認しました。
22章、どうでもいい誤字がありました。

×---- graph.cpp の graph_man を変更 ----
○---- graph.cpp の graph_main を変更 ----


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,201,444ポイント)   Date: 2010/06/05(土) 22:47   No:53651     
Title: Re:龍神録プログラミングの館第22章    
う、、全く、、早くやるより確実にやれと・・

修正しました。
情報ありがとうございました。


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

Name: ぽこ  ..中級者(14,195ポイント)   Date: 2010/06/05(土) 22:51   No:53653 解決!     
Title: Re:龍神録プログラミングの館第22章    
迅速に対応していただき、ありがとうございます。

修正内容を確認しました。
これで解決としたいと思います。


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



Name: ookami  ..上級者(22,866ポイント)   Date: 2010/06/04(金) 23:41   No:53564       
Title: 【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
こんばんは。いつも勉強させていただいております。ookamiです。

前スレで、ちょっとそれた話で「どうしたらダメリーダーがダメじゃなくなるか」というのがありました。
http://www.play21.jp/board/formz.cgi?action=res&resno=52130&page=&lognum=160&id=dixq&rln=52271

(表現があまりにアレなので、「叩かれるような募集をしてしまう」という言い方にさせてもらいます。)
実はその後も、それを考えておりましたのです。

大変失礼ながら挙げさせていただきますが、以下のように「叩かれちゃう募集というのは後を絶たないんだな」という感じがしています。
http://www.freem.ne.jp/cgi-bin/bbs/party/osiete.cgi/mode_view/no_1026/
http://www.freem.ne.jp/cgi-bin/bbs/party/osiete.cgi/mode_view/no_1019/

で、これって、投稿フォームの「本文」の代わりに、「ジャンル」「ターゲット(プレイ時間や年齢層など)」「世界観」「画面構成」「キャラクター」「BGM」...「開発の背景・意気込み」... (項目は検討中ですが) など、記入項目を明確にすれば(もちろん開発の段階に応じた入力のさせ方みたいな工夫がいりますが)、かなり防げるんじゃないかと思うんです。


ということで、まずは骨格となる掲示板を、php, mySqlで作り始めました。さくらのレンタルサーバを使っています。結局、現段階では 投稿フォームには「本文」しかないのですが、今のところ、以下のようになっています。
http://oookami.sakura.ne.jp/integ/?a=thread&t=1&nca64mek

ここまでは、なんちゃってで作ったのですが、上記の構想が果たして有効かどうか...あるいは、「そんなコンセプトのものは既にある」など、ご意見いただきたく、雑談の投稿をさせていただきました。

また別の視点なのですが、広く一般に、掲示板にあったらいいなと思う機能があったら、あわせて教えていただきたく思っています。

■実装した機能
・アップロード機能(容量制限くらいはつけるべきか)
・画像へのURLならimgタグで表示。大きければサムネイル表示
・mp3へのURLなら yahoo media player で再生
・それ以外のURLはただのリンクにする。GWT表示もできる (ケータイ向け将来対応を見越して)
・preタグで囲めば 等角フォントで表示(この掲示板を参考にさせていただきました)
・クッキーで「名前」を記憶する
・誰でもスレッドを作成できる
・レスがつくと、一番上に表示される(いわゆるアゲ)

■いらないかなと思っている機能
・編集機能(時々、文脈がかわるほど編集する人がいるので)
・メール通知機能(メール通知したらうっとうしいくらい繁盛してほしい)

■あったほうがいいかなと思っている機能
・ログイン機能(なりすましを防止できる。スパム対策になる。)
・検索機能

テスト状態なので、適当なタイミングで全スレ消しますので、今は気軽にテスト投稿していただいてかまいません。というか、極端な投稿の方がテストになってありがたいです。

よろしくお願いします。


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


Name: ぽこ  ..中級者(13,276ポイント)   Date: 2010/06/05(土) 01:25   No:53582     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
> ここまでは、なんちゃってで作ったのですが、上記の構想が果たして有効かどうか...

全く無意味だと思いますよ。

ダメリーダ的な人に提供側の意図を汲みとって使うことは期待できないです。
意図を汲み取れる人にはこの手のツールは必須ってわけではありません。

#私がダメリーダだとすると、全ての記入項目に
#「××(ゲームタイトル)みたいな〇〇(世界観、BGM、画面構成、etc)」
#て書きますよ。
#こういう書き方で人が集まりますかね?


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

Name: ookami  ..上級者(23,740ポイント)   Date: 2010/06/05(土) 01:48   No:53587     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
お返事ありがとうございます。

たしかに、「何でそんな解釈すんの」って人がいることは確かですね^^;

ただ、全部の項目に、
#「××(ゲームタイトル)みたいな〇〇(世界観、BGM、画面構成、etc)」
と書かれれば、それはそれで具体的だと思います。まるっきりそのまんまパクりなんだということがハッキリしますから。仰るとおり人は集まらないと思いますけど。

# 否定的なご意見でも遠慮なく書いていただいて結構です。まだ方向転換できる段階ですし、挑戦的な内容だというのは前スレから認識しています。


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

Name: たかぎ [URL]  ..ハッカー(200,086ポイント)   Date: 2010/06/05(土) 01:52   No:53588     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
私も無意味だと思います。

定形の書式を与えられなければ必要な情報を提供できないようでは、仮に募集の投稿ができてもその後が続きません。
逆に、素晴らしい投稿フォームができたとした場合、応募者が募集者の無能さを見分ける機会を奪うことになるため、かえってトラブルの原因になりそうです。


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

Name: ぽこ  ..中級者(13,489ポイント)   Date: 2010/06/05(土) 02:13   No:53590     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
目的を確認させて欲しいのですが、
「ダメリーダをまともなリーダに教育する」
じゃないですよね?
あくまで、
「叩かれる募集をなくすには?」
ですよね?

前者の目的に対して、ookamiさんの構想では「足りません」。
プロジェクトの入り口だけまともになるだけで、むしろ被害が大きくなりそうな気がします。
#失敗しそうなプロジェクトは「走らせない」ことが一番重要かと。
#走ってこけるとケガしますし。

後者の目的に関しては、ここの掲示板のように、「住人に寛容さを要求する」くらいしか
思いつきません。
つまり、叩かれる内容でも皆が叩かない環境、雰囲気を作り上げることに注力する。
技術じゃどうしようもないですね。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,199,579ポイント)   Date: 2010/06/05(土) 02:21   No:53591     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
たかぎさんの意見は手厳しいようで的を得ているような気がするところは何とも^^;

私は何でも取り組みに対しては肯定的になりたいと思っているので応援したいですが、
募集する為の文章もまともに書けない人が募集しても結局破綻するだけになってしまいそうな気もしますね・・。

募集を見れば大体信用できそうな人かどうかわかるってこともありそうです。

しかしやる気と実力がある人の募集をよりよく、解りやすく明確に、人が集まりやすくするという意味では良い試みだと思います。
応募者が欲しい情報がはっきり募集者に伝わっていれば無駄なやり取りも減りますものね。

必要な機能にはそうですね〜、コミュニケーションのバックアップをするようなものがあるといいですね。
スカイプ、メッセンジャー、mixi、ツイッターなどの情報が入力出来てアイコンクリックでサイトに飛んだり連絡出来たり。

見ず知らずの団体がメールだけでプロジェクトを完遂するなんてこととても困難だと思うので、コミュニケーションが円滑に取れるような仕組みが何かあるといいですね。


しかし掲示板作成いいですね〜私も早く何とかしようと思っているのに・・。
http://dixq.net/phpBB/
やっつけでこんなもの用意してみたものの、ここにあるランクポイントのシステムやらなんやらを統一する作業が面倒で全然進んでいません・・。

21style掲示板は高機能なんですが、ファイルアップ制限が厳しく、過去ログに落ちると消える、過去ログ検索が酷いなどなど色々問題があるので早く自前のものに移行したいと思っている今日この頃です。


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

Name: ookami  ..上級者(24,302ポイント)   Date: 2010/06/05(土) 02:25   No:53592     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
連投失礼します。

なぜ私がこの話題にこだわっているか、ちょっと補足します。

http://comm.takabosoft.com/edgebbs/edgebbs.cgi
ご存知の方も多いと思いますが、このドット絵掲示板では自然と「指南お願いします」とか、それに対する返答があり、非常に ... 健全? ... というか、利用者同士が高めあう、よいコミュニティになっていると思います。

この「C言語何でも質問掲示板」でもそうだと思います。(管理人様、今後ともよろしくお願いしますw)

私は、このような健全な掲示板は総じて、「利用規約」がとても具体的に書かれている、という印象を持っています。(ふりーむさんのところは逆の印象です。)

提供者側の意図は、少なからず質問者に影響し、事実、テンプレートにしたがって質問される方(少なくとも、そうしようと努力される方)がいらっしゃるわけです。


なので、(外枠はただの掲示板でも) 規約や、動的に変化するテンプレートを充実させることで、ある程度、提供者側が意図するコミュニティにできると思っています。



あと、ちょうどぽこさんの「人が集まりますかね?」という書き込みがあるので便乗しますが、タイミングを見計らって、「事前にメンバーを決めないゲーム作り」についても論じてみたいと思っています。

事実、いわゆるダメプロジェクトではメンバーが入り乱れて、ある人は期待した報酬を得られずに離脱し、ある人は人間関係に幻滅して離脱し、ということがあると思います。

これを逆に捕らえて、ハナから「これは誰々にお願いする」と先に決めない、というスタイルは実現可能か、ということです。上記のドット絵掲示板では、「指南」してくれる人を指名するケースはめったにありません。その時通りがかった誰かが要望に答え、クオリティの高いものができあがっているのです。

もちろん、ドット絵とゲーム作りは違いますから、「やっぱりダメだね」という結論もあると思いますが...
とりあえず、このスレでは、引き続き「掲示板の機能」について考えたいと思います。


補足の域をハミ出してしまいました;; いつもヘンな雑談スレを立てて申し訳ないです。引き続きよろしくお願いいたします。


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

Name: ookami  ..上級者(24,401ポイント)   Date: 2010/06/05(土) 02:33   No:53595     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
あ、連投と思ってたら既にお三方かたの返答が; すみません。前後してしまいました、ということだけ先に書きます。

お返事は明日になるかもです。

先行して一点、

> プロジェクトの入り口だけまともになるだけで、むしろ被害が大きくなりそう...
> 募集の投稿ができてもその後が...

とのことですが、

> (もちろん開発の段階に応じた入力のさせ方みたいな工夫がいりますが)
の一言で書いてしまったので、スルーされたと思いますが、入り口だけのつもりはないです。ゲームの企画から完成までのいろいろなステップに対応した入力フォームを提供します。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,200,406ポイント)   Date: 2010/06/05(土) 02:54   No:53598     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
良い試みだと思いますよ。頑張って下さい。
ただ、

>プロジェクトの入り口だけまともになるだけで、むしろ被害が大きくなりそう...

の言葉の意味合いとしては募集者の実力を120%のように見せるだけで、
結局制作が始まったらリーダーに幻滅してしまうのではないか(それなら早いうちに見切りが付けられるような方がいいんじゃないか)という意味合いなのではないかと感じました。



以前「初心者潰しだ」のようなコメントがありましたが、
私はやる気がある人はドンドン行動に移した方がいいと思います。

失敗した経験のある者、失敗した人たちを見てきた者、あるいはもっと効率的な方法を知っている者からみると、
「あぁあ、そんなことじゃ失敗するのに・・」と思えてしまうのかもしれません。
結果的に初心者潰しのように受け取られてしまうような流れが出来たかもしれませんが、
仕事でもなければ多額の借金を背負うわけでもないのだから、沢山失敗して経験を積むのもいいと思います。

「愚者は経験から学び、賢者は歴史から学ぶ」とは言いますが、
手取り足とり意見をもらって成長するより失敗から学んだ方が解る事も多いような気がします。
(もちろんアドバイスを受けることは大事な事ですが)

それに人にやめておけと言われてやめるより、自分が思う通りに一度やってみてやはりダメだった方がずっと諦めも付くと思いますしね。
・・ってなんだか失敗すること前提みたいですけど・・。
(今は明らかに力不足で失敗するだろう呼びかけをしている人に対して言っているので)

私がこのサイトを作ったのはCを学び始めたころ上級者に「初心者は黙れ」と言われたことが発端で、
初心者でも上級者に遠慮することなくみんなが自由に楽しく意見交換出来る場を作りたいと思ったからなので、
やる気のある人なら誰でも応援したいと思っています。
募集をかける人が言葉足らずだったり経験不足だったり知識不足だったりしたとしても、きっと学んでいくと思います。
なので、ookamiさんの掲示板も応援しています。

>管理人様、今後ともよろしくお願いしますw

こちらこそよろしくお願いします^^

>このスレでは、引き続き「掲示板の機能」について考えたいと思います。 

あ、完全に脱線しちゃった・・


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

Name: ぽこ  ..中級者(13,736ポイント)   Date: 2010/06/05(土) 03:04   No:53601     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
> > (もちろん開発の段階に応じた入力のさせ方みたいな工夫がいりますが)
> の一言で書いてしまったので、スルーされたと思いますが、入り口だけのつもりはないです。
> ゲームの企画から完成までのいろいろなステップに対応した入力フォームを提供します。

失礼しました。「開発の段階」を「企画の具現度」と勝手に読み替えていました。
完成まで面倒をみるのであれば、Dixqさんも仰ってますが、「ゲーム開発向けコミュニケーションツール」と
いうのはどうでしょうか?

ぱっと思いつくのは、素材のバージョン管理、問題管理、情報共有のためのWiki辺りでしょうか。

#オープンソースプロジェクトのホスティング環境みたいですね。
#というかTracやRedmineとかががあれば十分な気がしてきました。。
#この辺のフリーソフトにゲーム向けテンプレートを用意する/埋め込むという形で提供するのはどうでしょうか?


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

Name: たかぎ [URL]  ..ハッカー(200,262ポイント)   Date: 2010/06/05(土) 03:10   No:53602     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
> ゲームの企画から完成までのいろいろなステップに対応した入力フォームを提供します。

入力フォームを介してしかメンバーとコミュニケーションをとらなくて済むならともかく、現実には無理ですよね。
例えば、企画を立てる際に、入力フォームの範疇しか自由度がなければ、まったく前に進まないと思います。
おそらくそういうことをいっているのではないと思いますが、募集の文章すらまともに書けないようでは、進めていくうちに遭遇するであろう事象に適切に対応するのはまず無理だと思います。

もちろん、これは初心者潰しでいっているのではありません。
下手くそな募集をかけて叩かれたらそれでいいのではないですか?
悔しい思いをすれば、次はどうすればよいか真剣に考えますし、そうやって人間は成長するもんだと思います。

あと、掲示板にせよ他の機能にせよ、使い勝手のよいサービスを提供しようというのは、それはそれでよいことです。
システムだけで完全に問題が解消するとは思いませんが、試行錯誤を行って、現実的な落とし所を見つけていけばそれでよいと思います。



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

Name: ぽこ  ..中級者(13,757ポイント)   Date: 2010/06/05(土) 03:20   No:53604     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
> >プロジェクトの入り口だけまともになるだけで、むしろ被害が大きくなりそう...

> の言葉の意味合いとしては募集者の実力を120%のように見せるだけで、
> 結局制作が始まったらリーダーに幻滅してしまうのではないか(それなら早いうちに見切りが付けられるような方がいいんじゃないか)という意味合いなのではないかと感じました。

言葉足らずですみません。
Dixqさんに補足して頂いた内容が、私の意図しているところです。

> 「愚者は経験から学び、賢者は歴史から学ぶ」とは言いますが、
> 手取り足とり意見をもらって成長するより失敗から学んだ方が解る事も多いような気がします。
> (もちろんアドバイスを受けることは大事な事ですが)

これには全面的に賛成です。
初心者には賢者はいません。そして、初心者からいきなり賢者になれるとも思いません。
まずは、愚者になれるだけの経験を稼ぐことが重要だと思います。


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

Name: たかぎ [URL]  ..ハッカー(200,300ポイント)   Date: 2010/06/05(土) 03:24   No:53605     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
> まずは、愚者になれるだけの経験を稼ぐことが重要だと思います。 

そうですね。
愚者なら成長が見込めます。
最悪なのは、怠け者と他人のせいにする者です。


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

Name: ookami  ..上級者(24,132ポイント)   Date: 2010/06/05(土) 17:21   No:53622     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
一晩のうちに 実にたくさんのご意見、まことにありがとうございます。

「規約や、動的に変化するテンプレートを充実させることで、ゲーム開発募集の掲示板は改善されるか」という点については、以下のように、ほとんどが否定的なご意見でした。

> ダメリーダ的な人に提供側の意図を汲みとって使うことは期待できないです(ぽこさん)
> 募集の投稿ができてもその後が続きません(たかぎさん)
> 結局破綻するだけになってしまいそうな気もしますね(Dixq(管理人)さん)
> 入力フォームの範疇しか自由度がなければ、まったく前に進まないと思います(たかぎさん)



また、肯定的とは言わずとも「こんな機能があればベター」という感じで、以下のようなご意見をいただきました。

> スカイプ、メッセンジャー、mixi、ツイッターなどの情報が入力出来てアイコンクリックでサイトに飛んだり連絡出来たり。(Dixq(管理人)さん)
> 完成まで面倒をみるのであれば 〜 「ゲーム開発向けコミュニケーションツール」というのはどうでしょうか? (ぽこさん)
> TracやRedmineとかががあれば十分な気がしてきました。(ぽこさん)

外部ツールとの連携や、既存ツールにテンプレートを埋め込むというのは、考え付きませんでした。検討してみます。



一方、「人は失敗して学ぶ」的なご意見も頂戴しました。

> やる気がある人はドンドン行動に移し 〜 沢山失敗して経験を積むのもいいと思います(Dixq(管理人)さん)
> 「愚者は経験から学び、賢者は歴史から学ぶ」(Dixq(管理人)さん)
> 下手くそな募集をかけて叩かれ 〜 悔しい思いをすれば、次はどうすればよいか真剣に考えますし、そうやって人間は成長するもんだと思います。 (たかぎさん)
> 初心者からいきなり賢者になれるとも思いません。まずは、愚者になれるだけの経験を稼ぐことが重要だと思います。 (ぽこさん)

この点については、確かに仰るとおりです。掘り下げれば、初心者への応援メッセージ的な方向になると思います。

(が、これは掲示板の機能ウンヌンより一歩下がった 別の視点だと思うので、ひとまず このスレッドでは 収束していいかなと思っています。)



皆様のご意見を元に再度、考えてみます。

( ちょっと作っても意味ナイ感じが濃厚になってきましたが... 身内でサンプルプロジェクト的に何か作りながら、掲示板に機能を追加していって、「でもやっぱり意味ないね ジャンジャン」になる気がしてきました。)


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

Name: dic  ..比類無きプログラマー(70,913ポイント)   Date: 2010/06/05(土) 17:43   No:53625     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
動機は素晴らしいですが
先先のことまで考えて意味ないねとまで言っていたら
本当に考えることすら意味なくなりますね

作った結果を考えるより
作ることを考えた方がいいと思うというのが私ひとりの勝手な意見です


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

Name: ookami  ..上級者(24,343ポイント)   Date: 2010/06/05(土) 21:13   No:53636 解決!     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
dicさん 返信ありがとうございます。

すみません、表現がちょっと良くなかったですね; 否定的なご意見が多かった「今現在の構想のままでは」作っても意味ないだろうな、ということでありまして、意味なくないように、構想を練っていくつもりです。

> 作った結果を考えるより 作ることを考えた方がいい

私もそう思います。仕事ではなく趣味でやってるんですもんね^^

ここで「解決!」とさせていただきます。

皆様、ご意見ありがとうございました!


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

Name: たいちう  ..比類無きプログラマー(92,747ポイント)   Date: 2010/06/05(土) 21:40   No:53637     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
私も、テンプレートがなければまともに募集できないように人が、
リーダーとして役に立つとは思えませんし、募集時の入力フォームを工夫するよりも、
↓のようなリンクを貼っておくほうがよっぽど有意義だと思います。
http://sinsin2006.web.fc2.com/omake/omake04.html
http://sinsin2006.web.fc2.com/omake/omake05.html


ookamiさんが何を目指しているのかが、まだわかりません。

Dixqさんが「素人でも安心してゲームを作り始められるように」と考えて、
このサイトを作ったように、「素人でも安心してゲーム作りの募集をできるように」
と考えているのでしょうか?

一般論としては1人で作るよりもチームで作った方が良いものができますが、
それにはいくつかの前提があります。有能なリーダーの存在というのは、
必須に近いのではないでしょうか。初めから経験豊富な人はいないですが、
まともな募集ができる、というのが足切りの役目を果たしているのでしょう。

最悪のケースとして、ookamiさんのサイトから駄目リーダーが量産され、
甚大な被害を被るメンバーがたくさん発生する、というようなことが万一起こっても、
人は経験から学習する、という観点からはメンバーも貴重な体験をしたことになるわけです。

私は協力らしい協力などできないと思いますので、現時点でも今後も反対することは
ないでしょうが、できればookamiさんの目指している方向を理解したいと思っています。


# 書いているうちに解決!してしまったが折角書いたので投稿


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,200,935ポイント)   Date: 2010/06/05(土) 22:07   No:53642     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
私は賛成の立場で応援したいと思っていますが、
仮にお作りになる掲示板が現時点でマイナスの面を多く持ってしまっていたとしても
ookamiさんの動機が素晴らしいので、間接的に良い効果をもたらすことは多いと思います。

ookamiさんは前述のダメリーダーの為に手取り足とりしなくてはならない義務も無ければ筋合も無いのにボランティアでこのような活動をしようと思われていますよね。

以前掲示板で
「こんなに親切に回答して下さって感謝しています。私も早く回答できる位の知識を付けて誰かを助けてあげたいと思います」
と言って下さった方を何人か拝見しました。
受け取った恩はいつか返したいと思うのが人間というものだと思いますし、
恩を受けた人は違う誰かにまた良い行動をしてくれる・・というように、良い循環になるように思います。
なのでookamiさんのような動機で作られたサイトは、そのサイト自体の雰囲気が良い方向に流れていくように思いますよ。

トピ投稿文のリンク先のような酷い言い方をするような人が沢山いる場では、
そのような循環は生まれにくいですよね・・。


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

Name: ookami   Date: 2010/06/16(水) 08:44   No:535641276645457     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
すみません、「解決!」直後のコメントもすぐに読んだのですが、お礼のコメントをつけたつもりで付けていませんでした;; とっくに過去ログに落ちてるし...

参考にさせていただきます。
ご意見ありがとうございました!


Name: Dixq (管理人) [URL]   Date: 2010/07/31(土) 12:05   No:535641280545501     
Title: Re:【雑談】開発メンバー募集掲示板で、投稿フォームは本文だけでいいのか    
おや、過去ログに落ちてからのレスを見つけたのは初めてでした^^;



Name: 深黒  ..かけだし(2,236ポイント)   Date: 2010/06/05(土) 14:30   No:53618       
Title: LoadGraphについて    
DXライブラリにて、LoadGraphScreenで何回も同じ画像を表示を出すより、
LoadGraphで読み込んでおいて、DrawGraphで何回も表示する方が良いそうですが、
それは2回以上表示するならLoadGraph+DrawGraphにした方が良いという事でしょうか?
あと、複数回表示する必要のある画像が複数ある場合は片っ端からLoadGraphする方針でもいいのでしょうか? 編集済み



Name: Tororo [URL]  ..初心者(7,428ポイント)   Date: 2010/06/05(土) 15:29   No:53620     
Title: Re:LoadGraphについて    
二回ではなくても、
LoadGraph, DrawGraphの方が軽いです。

複数表示の物が複数なら、
最初の複数分ハンドルを用意すればいいじゃないんですか?

また、同じ縦と横のサイズで絵が違う纏まった物(背景など)を扱うなら
小さな画像の集合の大きなファイルをLoadDivGraphで分割とかでも、
いいと思います。


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

Name: 深黒  ..かけだし(2,374ポイント)   Date: 2010/06/05(土) 19:05   No:53628     
Title: Re:LoadGraphについて    
返信ありがとうございます。
メモリを使用して使うとの事だったので、
あまりLoadGraphしすぎるのは良くないのかと考えて質問してしまいました・・・

あと、ついでに質問です、これは外部変数で宣言して複数の関数(mainやプロトタイプ等)で使用できるようにするのと、各関数内で宣言して使用するのとではどちらが判断として正しいのでしょう? 編集済み


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

Name: Tororo [URL]  ..初心者(7,508ポイント)   Date: 2010/06/05(土) 19:18   No:53629     
Title: Re:LoadGraphについて    
各関数内に宣言していたら、その関数内でしか使えません。(違う場合もあったと思いますが・)
逆にいろんな関数で使いたい場合には外部定義のほうが良いと思います。

龍神録の館の5,6章を見てみると分かりやすいかもしれません。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,200,602ポイント)   Date: 2010/06/05(土) 19:33   No:53630     
Title: Re:LoadGraphについて    
1回しか描画しないことなんて通常無いと思います。
ですので、LoadGraphScreenを使う機会はテスト用以外に無いと思います。

データのロードでメモリを食い過ぎる問題があるなら、使う時のみロードして節約するように設計をする必要があります。
例えばRPGで言えば
ダンジョンを歩くシーンで使うデータと切り替わった戦闘画面で使うデータは異なるはずですから、
不必要なものをそのたびに解放、ロードするようにします。


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

Name: 深黒  ..かけだし(2,410ポイント)   Date: 2010/06/05(土) 19:41   No:53631 解決!     
Title: Re:LoadGraphについて    
返信ありがとうございます。
全体的にLoadGraph, DrawGraphに変える方針を取る事にします


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



Name: ザヌオウ  ..入門者(2,575ポイント)   Date: 2010/06/04(金) 18:55   No:53544       
Title: MIDIキーボードからMIDI INしたのを検知したい    
こんにちは、1ヶ月以上前に、
14歳からはじめるC言語ゲームプログラミングを見ながらDXライブラリを使用して、
十字キーでキャラを左右に動かすプログラムを書いたのですが、これをキーボード等から単音のMIDIデータを入力することで、
例えばドを入力したら左に歩くといった感じに動かせるようにしたいと考え、
まずはどうすれば入力されたMIDIデータを認識できるようになるのかを教えていただきたい
と質問をしてさらにわざわざプログラムを書いてもらったのですが、返事が遅くなってしまった者です。

そしてそのプログラムのコンパイルをしてみて、
LINK : warning LNK4199: /DELAYLOAD:OleAcc.dll は無視されます。OleAcc.dll にインポートがありません。
>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数___tmainCRTStartup で参照されました。
といったものが出てきてうまく行きません。

これらのことを解決しようといろいろ考え、
未解決の外部シンボル〜というのが出るからどこか書きミスがあると思って
色々と試していたのですが、
解決できずに一ヶ月以上返事もしないで時間を消費してしまいわざわざ教えてくれた方々に大変失礼してしまったと感じていますが、
今一度お力を貸していただけないでしょうか?


書いていただいたソースは次の通りです

#include <windows.h>
#ifndef __MIDI_IN_H__
#define __MIDI_IN_H__
#ifdef __HEADER_ITSELF__
#define EXT
#else
#define EXT extern
#endif

#pragma comment(lib, "winmm.lib")

EXT int OpenMidiIn(int id);
EXT void CloseMidiIn();
EXT void StartMidiIn();
EXT void StopMidiIn();

#endif //__MIDI_IN_H__
#define MIDI_IN_BUFF_SIZE 1024

static HMIDIIN hMidiIn = NULL;
static MIDIHDR* MidiHdr;

// MIDI イベントを受信
void CALLBACK MidiInProc(HMIDIIN hMidiIn, UINT wMsg, DWORD dwInstance,DWORD dwParam1, DWORD dwParam2);

// 受信開始
void StartMidiIn(){
    midiInPrepareHeader(hMidiIn, MidiHdr, sizeof(MIDIHDR));
    midiInAddBuffer(hMidiIn, MidiHdr, sizeof(MIDIHDR));
    midiInStart(hMidiIn);
}

// 受信終了
void StopMidiIn(){
    midiInStop(hMidiIn);
    midiInReset(hMidiIn);
    midiInUnprepareHeader(hMidiIn, MidiHdr, sizeof(MIDIHDR));
}

// MIDI IN デバイスを閉じる
void CloseMidiIn(){
    HeapFree(GetProcessHeap(), 0, MidiHdr->lpData);
    HeapFree(GetProcessHeap(), 0, MidiHdr);

    midiInClose(hMidiIn);

    hMidiIn = 0; 
}

// MIDI IN デバイスを開く
int OpenMidiIn(int id){
    UINT rc;  

    StopMidiIn();

    rc = midiInOpen(&hMidiIn,id,(DWORD)MidiInProc,0,CALLBACK_FUNCTION);

    if(rc != MMSYSERR_NOERROR){
        char msg [255];
        midiInGetErrorText(rc,msg,sizeof(msg));
        return 0;
    }

    MidiHdr = (MIDIHDR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MIDIHDR));
    MidiHdr->lpData = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MIDI_IN_BUFF_SIZE);
    MidiHdr->dwBufferLength = MIDI_IN_BUFF_SIZE;

    return 1;
}

#include <stdio.h>

void CALLBACK MidiInProc(HMIDIIN hMidiIn,  UINT wMsg, DWORD dwInstance,    DWORD dwParam1,  DWORD dwParam2 )
{    static dp2;
    if(dp2 == dwParam2){
        return;
}else{
        dp2 = dwParam2;}
    switch(dwParam1 & 0xf0){
    case 0x90:    {
            if((dwParam1 >> 16) == 0)break;
            printf("key:%02x\n", (dwParam1 >> 8) & 0xff);
            printf("vel:%02x\n", (dwParam1 >> 16) & 0xff);
        }
        break;
    default:
        break;}}

int main(){
    int n,i;

    MIDIINCAPS InCaps;
    n = midiInGetNumDevs();

    for(i = 0; i < n; i++){
        midiInGetDevCaps(i, (LPMIDIINCAPS)&InCaps,sizeof(InCaps));
        printf("%d:%s\n", i, InCaps.szPname);
    }

    if(!OpenMidiIn(0))return -1;

    StartMidiIn();
    getchar();
    StopMidiIn();
    CloseMidiIn();

    return 0;
}

OS:Windows XP
開発環境:Visual c++
ライブラリ:DXライブラリ

大変あつかましいとは思いますが、どうかよろしくお願いします。


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


Name: dic  ..比類無きプログラマー(70,113ポイント)   Date: 2010/06/04(金) 19:08   No:53546     
Title: Re:MIDIキーボードからMIDI INしたのを検知したい    
win32コンソールアプリケーションでプロジェクトを作ってないでしょうか?
win32 Applicationでプロジェクトを作らないとリンクできないです

win32 Application は WinMain で始まります
win32 コンソールアプリケーションは main で始まります


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

Name: ザヌオウ  ..入門者(2,762ポイント)   Date: 2010/06/05(土) 18:48   No:53627     
Title: Re:MIDIキーボードからMIDI INしたのを検知したい    
>dicさん
助言ありがとうございます。
自分は今まで確かにwin32コンソールアプリケーションでプロジェクトでつくっていたので、
dicさんのおっしゃる通りにwin32 Applicationでプロジェクトを作り直してmainをWinMainに直してみたのですが、
それでもコンパイルをしてみるとやはり、
msvcrtd.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
 fatal error LNK1120: 外部参照 1 が未解決です。
と出てしまうのですが、どうすればいいでしょうか?


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

Name: ザヌオウ   Date: 2010/06/12(土) 20:02   No:535441276340578     
Title: Re:MIDIキーボードからMIDI INしたのを検知したい    
オプションのツールでライブラリファイルの設定や、プロパティでリンカの設定を色々変えて試したりもしたのですが、どれもうまくいかなくて悩んでおります。
どなたかお助けおねがいします。




Name: dic  ..比類無きプログラマー(70,624ポイント)   Date: 2010/06/04(金) 20:52   No:53552       
Title: ステージ1だけの超簡単なものができました    
開発スタイルやら、汎用性やら色々悩んでいましたが、
何も気にすることなくひたすら完成させることだけ集中して
プログラムを組んだところ2日でステージ1だけですができました

前に公開したものとは違ってますが
(ソースコード消えたので)
DxLibも使わせてもらいました

ソースコードも付属しているので
興味ある方は見てください

ダウンロードは
http://www1.axfc.net/uploader/Sc/so/120541
となります

ゲームもしくはソースコードに関して感想ありましたら
書き込んでくれるとありがたいです
 編集済み


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


Name: ookami  ..上級者(23,272ポイント)   Date: 2010/06/05(土) 00:20   No:53572     
Title: Re:ステージ1だけの超簡単なものができました    
プレイしました。絵がwwww いいwwww ご自分で描かれたんですか?

ソースコードも読ませていただきました。気になったところを挙げさせていただきます。ご存知かもしれませんが...
・gMode(Move( int *mode )関数ではmode)はゲーム全体に関わるパラメータなので、グローバル変数でもいいかなと思いました。(好みの問題もありますが)
・画面ごとにクラスを分けるスタイルも美しいと思いますが、逆に見えなくなってしまう事もありますね。GetHitKeyStateAllをムダに呼んでしまっているところがあります。(好みの問題もありますが)
・LoadSoundMemでmp3を読み込ませる時、ロード時間がもし気になったら、SetCreateSoundDataTypeでストリームにすることができます。
・プリコンパイル済みヘッダを使うとコンパイルが早くなります。


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

Name: dic  ..比類無きプログラマー(70,758ポイント)   Date: 2010/06/05(土) 08:44   No:53610 解決!     
Title: Re:ステージ1だけの超簡単なものができました    
>ookamiさん
絵はひろいもので、私が描いたものではないです

ソースコードは・・・好みの問題のようですね
感想ありがとうございました


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

Name: dic  ..比類無きプログラマー(70,840ポイント)   Date: 2010/06/05(土) 17:31   No:53623     
Title: Re:ステージ1だけの超簡単なものができました    
ここで、ひとつ質問があるのですが
ある程度完成してますが、今回のように画像データがゲームのご褒美の場合
画像データがむき出しでおいてあるとゲームをやる意味がなくなってしまいます
そこで画像データをなんらかの形式で変換もしくはexeファイルに埋め込みたいのですが
どのようにすればいいのでしょうか?
Visual C++ 6.0 でリソースの追加までは分かるのですが
対応ファイル形式がbmpのみなのと、どうあつかっていいのか
あまりにも昔なので忘れてしまっているのです


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

Name: ookami  ..上級者(24,181ポイント)   Date: 2010/06/05(土) 17:43   No:53624     
Title: Re:ステージ1だけの超簡単なものができました    
DXライブラリなら、こんなのがあります。
http://homepage2.nifty.com/natupaji/DxLib/dxtec.html#T11

フォルダを圧縮して、パスワードをかけることもできます。


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

Name: dic  ..比類無きプログラマー(70,931ポイント)   Date: 2010/06/05(土) 17:48   No:53626     
Title: Re:ステージ1だけの超簡単なものができました    
>ookamiさん
こんな機能があったんですね
利用させてもらいます


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



Name: たかぎ [URL]  ..ハッカー(199,895ポイント)   Date: 2010/06/05(土) 00:43   No:53574       
Title: 【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
性懲りもなく、また雑談スレです。
タイトルの通りなのですが...

sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

例えば、

printf("%d\n", sizeof(int));

のようにしている人はどれぐらいいますか?
皆さん自身と周りの方の状況を教えてください。


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


Name: 組木紙織  ..比類無きプログラマー(86,557ポイント)   Date: 2010/06/05(土) 00:58   No:53576     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
>printf("%d\n", sizeof(int)); 
はいしてます。(でも最近はC++ばっかりなので、使ってないかな)
今まで見た限りではほかの方法で表示したのをみたことないですね。

#sizeof()の返す型は知ってるので、変数に入れるときはそれを使ってますけど。


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

Name: たかぎ [URL]  ..ハッカー(199,924ポイント)   Date: 2010/06/05(土) 01:01   No:53577     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
> はいしてます。(でも最近はC++ばっかりなので、使ってないかな) 
> 今まで見た限りではほかの方法で表示したのをみたことないですね。 

この方法が正しいと考えていますか?
それとも本来は別の方法が正しいけれども、何らかの事情でこの方法を使っていますか?


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

Name: 組木紙織  ..比類無きプログラマー(86,654ポイント)   Date: 2010/06/05(土) 01:11   No:53578     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
>この方法が正しいと考えていますか? 
sizeof()は符号なし整数であるのに、"%d"で符号付き整数とみなしているので、
正しいとは考えていません。

>それとも本来は別の方法が正しいけれども、何らかの事情でこの方法を使っていますか?
理由は最初にみたサンプルがこの方法を使っていたからであることと、
正しい方法を示した記事やサンプルを見たことがなかったからです。


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

Name: ぽこ  ..中級者(13,156ポイント)   Date: 2010/06/05(土) 01:14   No:53579     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
> sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?

使っています。
負値を表示しそうなくらい大きな値になりそうな場合、%uにしています。


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

Name: たかぎ [URL]  ..ハッカー(199,913ポイント)   Date: 2010/06/05(土) 01:17   No:53580     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
組木紙織さん、ぽこさんともに、符号の有無に関して正しくないので、本来であれば%uにすべきというご意見ですね。


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

Name: ぽこ  ..中級者(13,164ポイント)   Date: 2010/06/05(土) 01:23   No:53581     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
> 本来であれば%uにすべきというご意見ですね。
Yesです。


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

Name: 組木紙織  ..比類無きプログラマー(86,684ポイント)   Date: 2010/06/05(土) 01:32   No:53583     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
私は少し違います。
%uか%huか%luのいづれかが正しいだろうという考えです。


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

Name: やんち [URL]  ..かけだし(1,877ポイント)   Date: 2010/06/05(土) 01:37   No:53584     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
> printf("%d\n", sizeof(int));
sizeof(int) の 結果が int の表現範囲に収まる事がわかっている場合に限り、
これは、問題ないと考えています。


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

Name: たかぎ [URL]  ..ハッカー(199,999ポイント)   Date: 2010/06/05(土) 01:42   No:53586     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
> sizeof(int) の 結果が int の表現範囲に収まる事がわかっている場合に限り、 
> これは、問題ないと考えています。 

なるほど。
組木紙織さんのご意見とも関係するのですが...
LLP64の環境では、size_tは64ビット、intやlongは32ビットです。
sizeof(int)は4になるのでintの表現範囲に収まります。
この場合、問題ないでしょうか?


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

Name: YuO  ..熟練のプログラマー(46,209ポイント)   Date: 2010/06/05(土) 02:11   No:53589     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
C90の名残で,
printf("%d", (int)sizeof(int));
または
printf("%u", (unsigned)sizeof(int));
とはやります (キャストは必須)。
必要そうならば%ldや%luでlong系を使います。
そもそも普段はC#使っていて,数少ないsizeofの出力機会があってもCよりC++を使うためにstd::cout << sizeof(int)で済んでしまうので,fprintf系への出力はあまりないですね。
# VC++使用なので,%zuは未対応が前提。

ただし,使い捨てでVC++専用の場合は,
printf("%d", sizeof(int));
を使うこともあります。

C99使える処理系でも,%zuとか%tiとかは (特にptrdiff_t用の後者) すっかり忘れていることが多いです。
ただ,「size_tがunsigned intとは限らない」ことは忘れないので,キャストで見かけの安全を確保している感じです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,199,678ポイント)   Date: 2010/06/05(土) 02:29   No:53594     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
私はよほどの事が無い限りその状況で%uは使わないですね〜。
何かのサイズを得るのに符号ビットが変わるほどの大きさになるような事ってあるのでしょうか?
2バイトで表現しているならあると思いますが。
4バイトにおいて、あったとしても私の使用範囲としてはレアなので、そういう時はそういう時でまた考えると思います。
仕様と厳密に合わせる事は必要だとは思いますが、そこまでの必要性が無いと思うところはいつも適当です。


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

Name: たかぎ [URL]  ..ハッカー(200,424ポイント)   Date: 2010/06/05(土) 03:01   No:53600     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
YuOさんのご意見のように、キャストするのがおそらく最も移植性のある現実解だと私も思います。
私の場合、C99限定なら%zdや%zuも使いますが...

> Dixqさん
> 仕様と厳密に合わせる事は必要だとは思いますが、そこまでの必要性が無いと思うところはいつも適当です。

これは仕様と厳密に合わせるだけでなく、結構現実的な問題だったりします。
早い話が、32ビット環境と64ビット環境の互換性の問題なのです。
Windowsしか相手しないような人でも、これは大きな問題だと思います。

(手元のMacでしか試していませんが)64ビット環境の場合、可変個の実引数は32ビットのint値を渡してもスタックには64ビットで積まれます。
ですので、本来、%luとか%lluとすべきところを%uとしても、リトルエンディアンであれば問題ないでしょう。
けれども、最近は環境も多様化していまして、モバイル環境ではCPUがARMだったりしてビッグエンディアンに遭遇することも少なくないのです。
これらは現在のところ32ビットだとは思いますが、近い将来64ビット化することは十分考えられます。
こうした場合にはやはり現実に問題が顕在化します。

わずかな努力で将来の問題を回避できるならそうすべきですよね。
このことは、今書いたコードが問題が顕在化するぐらい将来に再利用されるだけでなく、今身に付けている癖が問題が顕在化するぐらい将来まで尾を引くことも含めて考えるべきではないでしょうか。


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

Name: Ma  ..ハッカー(103,940ポイント)   Date: 2010/06/05(土) 05:42   No:53607     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
%d が絶対的に正しいと思っていました。
とりあえず、認識を改めます。


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

Name: たかぎ [URL]  ..ハッカー(200,303ポイント)   Date: 2010/06/05(土) 15:57   No:53621 解決!     
Title: Re:【雑談】 sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか?    
> Maさん
> %d が絶対的に正しいと思っていました。 

このように書く人は結構いますからね。

とりあえず、ここでいったん解決にしたいと思います。
また、類似の雑談スレを立てますが、よろしくお願いします。


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



Name: みなと  ..ぴよぴよ(878ポイント)   Date: 2010/06/04(金) 16:26   No:53534       
Title: DXライブラリでSEを鳴らすとおかしくなる    
敵と当たったらSEを鳴らしたいのですが音声がループしてしまいます。
直す方法はないのでしょうか?

int sound;

main~{
  sound = LoadSoundMem( "DATA/SOUND/SE/death.wav" ) ;
  while(1){
     if(当たったら)PlaySoundMem( sound , DX_PLAYTYPE_BACK ) ; // NORMALでも駄目でした・・・。
  }
}


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


Name: シエル  ..かけだし(1,456ポイント)   Date: 2010/06/04(金) 16:36   No:53535     
Title: Re:DXライブラリでSEを鳴らすとおかしくなる    
当たり判定は間違ってませんか?

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

Name: みなと  ..ぴよぴよ(935ポイント)   Date: 2010/06/04(金) 18:06   No:53539     
Title: Re:DXライブラリでSEを鳴らすとおかしくなる    
シエル様
判定はおかしくないです・・・。
whileの中に書いている為、while回数分再生されてしまうのかと・・・。
これを回避したいのですがDXライブラリではSEには対応していないのでしょうか?


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

Name: ru  ..入門者(4,772ポイント)   Date: 2010/06/04(金) 18:20   No:53540     
Title: Re:DXライブラリでSEを鳴らすとおかしくなる    
if(当たったら)を消したら鳴るか?
death.wav読み込めているか?
>これを回避したいのですがDXライブラリではSEには対応していないのでしょうか?
SEとか関係ないです


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

Name: dic  ..熟練のプログラマー(69,419ポイント)   Date: 2010/06/04(金) 18:31   No:53541     
Title: Re:DXライブラリでSEを鳴らすとおかしくなる    
if(当たったら)
の条件を満たしている間再生さる設計ですが
一回のみ鳴らしたいので2回目以降は鳴らさないようにフラグが必要ではないでしょうか?


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

Name: wing  ..初心者(8,995ポイント)   Date: 2010/06/04(金) 18:41   No:53543     
Title: Re:DXライブラリでSEを鳴らすとおかしくなる    
私もゲームを作っていてSEがなりっぱなしになったことがありました。

    while(ProcessLoop()==0){//メインループ
        for(int i=0; i<SE_MAX; i++)
            se_flag[i] = 0;
        switch(gstate){
            case GAME_INIT:
                first_init();
                load();
                gstate = GAME_TITLE;
                break;

私の場合は、上記のコードで
 for(int i=0; i<SE_MAX; i++)
   se_flag[i] = 0;
の書き忘れでした。


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

Name: みなと  ..かけだし(1,095ポイント)   Date: 2010/06/05(土) 02:29   No:53593     
Title: Re:DXライブラリでSEを鳴らすとおかしくなる    
皆様ご回答ありがとうございます。

ゲームの開始時に一回だけ実行する関数をテストで作り
そこで鳴らすと問題なくなってくれているので音の読み込みは出来ております。

SEを鳴らす場合、そのSEごとにFlagを用意する必要があるのですか・・・。
少々、面倒ですね・・・。

ただFlagを用意しても問題があるかと思います。
そのFlagを鳴ってない時に限り毎フレームfalseにしたとしても
当たり判定にいる間はない続けてしまいますよね?


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

Name: Ma  ..ハッカー(104,100ポイント)   Date: 2010/06/05(土) 05:50   No:53608     
Title: Re:DXライブラリでSEを鳴らすとおかしくなる    
フラグなんてつくる必要ないです。

念のため以下を確認してください。


if(当たったら)PlaySoundMem( sound , DX_PLAYTYPE_BACK ) ; 

if(当たったら){PlaySoundMem( sound , DX_PLAYTYPE_BACK ) ; }

でなおるかどうか。


毎フレーム ProcessMessage() を呼んでいるか確認してください。


if文内にbreak point をいれるか、printfDx 等をいれて、必要なときにしかif文内に入っていないか確認してください。


*追記:本題とは関係ないとおもいますが・・・

dicさんも言っていますが、当たっている間再生しなおす設計になっているので
if(当たり && CheckSoundMem(sound) == 0){PlaySoundMem( sound , DX_PLAYTYPE_BACK ) ; }

等の処置をいれるといいかと。
あるいは、前フレームであたっていたか確認するためのフラグを作るなどの方法でも可。

*本来の問題はループ再生してしまうことであって、再生のしなおしではないのでこれが原因ではないはずです。
(これが問題だったとしたら、ループというよりずっと最初の音がなり続ける事になると思います。) 編集済み


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,200,424ポイント)   Date: 2010/06/05(土) 11:13   No:53615     
Title: Re:DXライブラリでSEを鳴らすとおかしくなる    
プログラムコードをアップした方が早そうな気がするのですがどうでしょう?

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



Name: ターボ  ..入門者(3,463ポイント)   Date: 2010/06/05(土) 08:58   No:53611       
Title: MSDN    
おはようございます。

先日はVisual Studio 2010 Expressのダウンロードの仕方を教えて頂き誠にありがとうございます。

そこで、以前Visual Studio 2008 Express Editionをダウンロードした時はMSDN Library for Visual Studio 2008 SP1 日本語版とかいうヘルプのようなものも別にダウンロードしたのですが、私はVisual Studio 2010 ExpressのMSDNはまだダウンロードして無いのですが、これは、どこかでダウンロード出来るのでしょうか?

それともまだ公開されてないのでしょうか?誰か親切な方ご教授お願いします。


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




Name: Ultimate [URL]  ..ぴよぴよ(718ポイント)   Date: 2010/06/03(木) 21:54   No:53499       
Title: ブロック崩し完成    
旧ハナブトオオトカゲです。
名前を変えてUltimateにしました。
これからも、少しでもUltimate(究極)に近付くよう頑張りたいと思います。

ところで、本題ですが、ついにhttp://www.play21.jp/board/formz.cgi?action=res&resno=53238&page=&lognum=163&id=dixq&rln=53249id=dixq&rln=53238でもらった回答を参考に、自力でブロック表示と当たり判定などをやってブロック崩しができました。

次は、中級編に進むべきでしょうか?
それとも初級編までの知識を使って自分で何かを作って練習した方がいいでしょうか?

ちなみに、ブロック崩しのソースは以下のとおりです。
よかったらやってみて感想を教えてください。(多分1分もあれば終わります。)
特殊効果は
Iキーでバーが長くなる。
XとY同時押しでボール復活。
はじめてのDXライブラリの作品です。(初めて約1週間半と少しくらい)

#include "DxLib.h" 

typedef struct

    int x;    //ボールX座標
    int y;    //ボールY座標
    int dx;    //Xスピード
    int dy;    //Yスピード
    int r;    //円の直半径
    int flag;    //発射フラグ
}ch_t; 
  
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    ChangeWindowMode(TRUE);
    DxLib_Init();
    SetDrawScreen(DX_SCREEN_BACK);

    ch_t ball;                        
    ball.dx = 0;
    ball.dy = 0;
    ball.r = 5;
    ball.flag = 0;

    int blocksum=0;                                  //壊したブロック合計
    int block[4][8],blockflag[4][8],blockcolor[4][8];//ブロック表示のための配列
    int bx = 270;                                    //バーX座標
    int by = 460;                                    //バーY座標
    int blong=100;                                   //バーの長さ
    int color = GetColor(255, 255, 255);             //バー、ボールの色
    char key[256];                                   //キー入力の配列
    int ballmax=0,wcount=0,scount=0;             //ボール発射関係
    ball.x = 320;                                    //ボールX座標
    ball.y = 455;                                    //ボールY座標
        int i,j;                                         //for文用
    
    
//ブロックの色設定
for(i=0;i<4;i++){
    for(j=0;j<8;j++){
        blockcolor[i][j]=GetColor(GetRand(255),GetRand(255),GetRand(255));
        }
    }
//ブロック初期化 表示フラグを1に
for(i=0;i<4;i++){
        for(j=0;j<8;j++){
        blockflag[i][j]=1;
        }
    }

    while(ProcessMessage() != -1)
    { 
        ClearDrawScreen();
        GetHitKeyStateAll(key);
    SetDrawBright( 255 , 255 , 255 );
    

    
    
        if(key[KEY_INPUT_ESCAPE])
        {
            break;
        }

        // 発射
        if(key[KEY_INPUT_SPACE]&&scount==0)
        {
            ball.flag=1;
            ball.dx = 7;
            ball.dy = -7;
        scount=1;
        wcount=0;
        }
        // バー移動と発射前ボール移動
        if(key[KEY_INPUT_RIGHT])
        {
            if(ball.flag==0) ball.x += 8;
        bx += 8;
        }
        if(key[KEY_INPUT_LEFT])
        {
            if(ball.flag==0) ball.x -= 8;
        bx -= 8;
        }
    
        // バー移動範囲と発射前ボール範囲
        if(bx > 640-blong)
        {
            if(ball.flag==0) ball.x = 640-blong/2;
        bx = 640-blong;
        
        }
        if(bx < 0)
        {
            if(ball.flag==0) ball.x = blong/2;
        bx = 0;
        
        }
    //特殊効果 Iキーでバーの長さを伸ばす
    if(key[KEY_INPUT_I]==1) blong=200;
    //特殊効果 XとY同時押しでボール数リセット
    if(key[KEY_INPUT_X]==1&&key[KEY_INPUT_Y]==1){
        ballmax=0;
        SetDrawBright( 255 , 255 , 0 );
        } 
        // ボールの移動 壁との当たり判定
        if(ball.flag==1)
        {
            // 移動距離計算
            ball.x += ball.dx;
            ball.y += ball.dy;
            // 移動範囲
            if(ball.x < 5 || ball.x > 640 - 5)
            {
                ball.dx *= -1;
            }
            if(ball.y < 0)
            {
                ball.dy *= -1;
            }
            if(by <= ball.y && by + 10 >= ball.y && bx <= ball.x && bx + blong >= ball.x)
            {
                ball.dy *= -1;
            }
        
        }
    //ブロックとの当たり判定
    
    for(i=0;i<4;i++){
        for(j=0;j<8;j++){
            if(blockflag[i][j]==1&&ball.y-5<=i*30+30&&ball.y-5>=i*30&&ball.x>=j*82&&ball.x<=j*82+64){
                blockflag[i][j]=0;
                ball.dy *= -1;
                blocksum+=1;
                }
            }
        }
    //ボールが下に落ちた時
        if(ball.y>480&&wcount==0&&ballmax<3){
                ballmax += 1;
                wcount = 1;
                ball.flag = 0;
                ball.y = 455;
                ball.x = bx+blong/2;
                scount=0;
                }
    if(ball.y>480&&wcount==0&&ballmax==3) ballmax+=1;
    //ブロック絵画
    for(i=0;i<4;i++){
        for(j=0;j<8;j++){
            if(blockflag[i][j]==1){
                DrawBox(j*82+5,i*30+10,j*82+64,i*30+30,blockcolor[i][j],TRUE);
                }
            }
        }
    //その他絵画
        DrawBox(bx, by, bx + blong, by + 10, color, TRUE); // バー絵画
        DrawCircle(ball.x, ball.y, ball.r, color, TRUE); // ボール絵画

    if(ballmax<=3)DrawFormatString(0,460,color,"ボール残り%d",3-ballmax);//ボール残り数表示
    if(ballmax==4&&blocksum!=32)DrawString(0,460,"GAME OVER",color,TRUE);
    if(blocksum==32){
        ClearDrawScreen();
        DrawString(250,230,"ゲームクリアー",color,TRUE);
        }
    ScreenFlip();
    }

    DxLib_End();
    return 0;
}


 編集済み


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


Name: ookami  ..上級者(20,672ポイント)   Date: 2010/06/03(木) 23:07   No:53507     
Title: Re:ブロック崩し完成    
ブロック崩しやってみました。

オーソドックスな感じで楽しめました!昔(windowsが無かったころ)、似たようなゲームを誰かからフロッピーでもらってプレイした記憶がよみがえって参りました。

しかし、ゲーム内容よりも、ソースコードが読みやすいのが印象的でした!
別スレで「見辛い」と書かれている方がいらっしゃいますが、私はとてもすんなり読めました。スタイルが近い感じがするのもあるでしょうが...
(強いて言えば、「絵画」でなく「描画」でしょうねwwww)

しかもリンク先を見ると中2だとか。
DXライブラリは1週間との事ですが、C++はいつからやっているのですか、とか聞いていいですかwwww
あと、このブロック崩しを作るにあたって、参考にされたサイトなどありましたら教えてもらえますか?



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

Name: ムンバ  ..熟練のプログラマー(57,667ポイント)   Date: 2010/06/04(金) 00:58   No:53514     
Title: Re:ブロック崩し完成    
こんばんは。

やらせて頂きました。
鈍(にぶ)いので1回目、30秒位でゲームオーバーになってしまいました。^^;
ブロック崩し、懐かしいですね〜♪
出回った当時から、へたくそでした。(自爆

私が初めてやったブロック崩しは、駄菓子屋(だがしや)の中に置いてあるテーブルゲームで
1回、100円だったと思います。
ゲームセンターにもありました。

インベーダーなどのテーブルゲームが
当時、中古でも1台購入するのに、99万円とか?だった事を思い出しました。w

>>次は、中級編に進むべきでしょうか?

 このプログラミングが出来た時点で、既に中級以上ではないかと私には思えます。
 私的なランク付けとなってしまいますが
 スキー検定や、そろばん検定に例えさせて頂くと、2級以上
 習字検定や剣道・柔道などですと、初段以上ではないかと思います。

遊んでて、楽しかったです!^^

---追記・希望---

GameOver になった時に
もう一度、最初からやり直せる「ボタン」(キー)が欲しいです。
クリアできないのが、悔しいので・・・。(笑 編集済み


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

Name: Ultimate [URL]  ..ぴよぴよ(902ポイント)   Date: 2010/06/04(金) 06:22   No:53516     
Title: Re:ブロック崩し完成    
感想ありがとうございました。

参考にしたのはhttp://wiki.game-develop.com/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%2F%BD%E9%BF%B4%BC%D4%B8%FE%A4%B1%2F%A5%C1%A5%E5%A1%BC%A5%C8%A5%EA%A5%A2%A5%EB%2F%C3%CA%B3%AC%C5%AA%B3%D8%BD%AC%2F%A5%D6%A5%ED%A5%C3%A5%AF%CA%F8%A4%B7%A4%F2%BA%EE%A4%EC#m5d7e44fで、プログラムする流れだけが載っているサイトなので、内容は自力で頑張ってみました。

Cは大体1か月くらいですね。

Cの勉強は「明解C言語 入門編」で勉強して、ゲームプログラミングの館だけでやりました。

次はインベーダーに挑戦しようと思います。


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

Name: Tororo [URL]  ..初心者(7,325ポイント)   Date: 2010/06/04(金) 16:06   No:53533     
Title: Re:ブロック崩し完成    
面白いですね^^
自分もこれくらい面白いゲームを作れるといいんですけど・・難しいですねw
年は中二だそうですね、自分より一つ上の先輩ですか・・

近い年齢同士頑張っていきたいです。


これからも頑張ってください!
インベーダー期待しています!


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

Name: Dixq (管理人)  ..ウィザード(1,198,925ポイント)   Date: 2010/06/04(金) 17:56   No:53538     
Title: Re:ブロック崩し完成    
携帯からなので見れていませんが、
中級編はちょっとややこしそうに見える関数について説明してたりするだけのところが多いので、ザッと目を通すだけで、
後からめぼしいとこをよく読んだらそれでいいと思いますよ。


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

Name: Ultimate [URL]  ..ぴよぴよ(901ポイント)   Date: 2010/06/04(金) 22:13   No:53560     
Title: Re:ブロック崩し完成    
それなら、次は「龍神録プログラミングの館」に行くべきでしょうか?

ミニテクニックは必要に応じて見て、物理編はもう少し学校で物理をやってからというので大丈夫ですよね?





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

Name: ookami  ..上級者(21,699ポイント)   Date: 2010/06/04(金) 22:34   No:53561     
Title: Re:ブロック崩し完成    
53516のリンク先を見てみました。ホントに流れだけなんですね。 Ultimate さんすごいっすwwww

> 物理編はもう少し学校で物理をやって

「学校で」という意味では、物理と、微積分と、代数(ベクトル)と...と、いろいろあるにはありますが、習っていないからといって、プログラミングの「物理編」の理解の妨げには、ならないと思いますよ。さわりだけでもやってみてはいかがでしょうか。

放物線(...は中3でしたっけ?)はたぶん理解できるんじゃないかな...

円をえがく動きは、高校(かな?)で三角関数をやってからの方がいいかもしれませんね。ただ、理解はともかく円をえがく動きをとにかく実装したければ、授業よりプログラミングが先でも全く問題ないと思います。


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

Name: fr  ..ぴよぴよ(27ポイント)   Date: 2010/06/04(金) 22:36   No:53562     
Title: Re:ブロック崩し完成    
将来有望で素晴らしい!
学校でという制限をかけずにひたすら突き進むべきですよ。


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

Name: しろ  ..中級者(9,460ポイント)   Date: 2010/06/05(土) 02:43   No:53596     
Title: Re:ブロック崩し完成    
すごいですね。1ヶ月でここまで作れるようになることに驚きです。私はこの域まで達していないので、まだまだがんばらないといけませんね。

物理と数学は高校でやると思うので、そっちできちんと勉強するといいですね。もちろん先取りするのもOKです。三角関数は数IIなので、有名私立以外では高校2年生で学習するはずです。

もし教科書があれば、さらっと読んでみるのもいいと思います。高校数学の教科書は(微積などで論理的にごまかしている部分も一部ありますが)基本的には初学者にわかりやすく書いていますよ。


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

Name: Ultimate [URL]  ..かけだし(1,004ポイント)   Date: 2010/06/05(土) 05:51   No:53609 解決!     
Title: Re:ブロック崩し完成    
物理は、いつか横スクロールのものも作ってみたいのですが、その時にジャンプなどを勉強しようと思います。

次は、インベーダーなどのシューティング系がいいので。

龍神録プログラミングの館をやってから、シューティングを作ってみたいと思います。

たくさんの回答ありがとうございました。

ここで解決にします。


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



Name: pon  ..かけだし(2,402ポイント)   Date: 2010/06/04(金) 23:39   No:53563       
Title: cygwinのerrorについて    
expected identifier or '(' before 'for'
expected '=' , ',' , ';' , 'asm' or '__attribute__' before '<' token

この2つは何を意味しているのですか?


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


Name: たかぎ [URL]  ..ハッカー(199,724ポイント)   Date: 2010/06/04(金) 23:44   No:53565     
Title: Re:cygwinのerrorについて    
そのままの意味です。

> expected identifier or '(' before 'for' 

forの前には識別子か(があるはず(なのに無い)

> expected '=' , ',' , ';' , 'asm' or '__attribute__' before '<' token 

<の前には=か,か;かasmか__attribute__があるはず(なのに無い)


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

Name: pon  ..かけだし(2,452ポイント)   Date: 2010/06/04(金) 23:46   No:53566     
Title: Re:cygwinのerrorについて    
forの前にあるべき識別子なんてありますか?
また<の前に=があったりするのはおかしいと思うのですが…


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

Name: たかぎ [URL]  ..ハッカー(199,756ポイント)   Date: 2010/06/04(金) 23:55   No:53567     
Title: Re:cygwinのerrorについて    
元のソースも言語も不明ですので、これ以上は何ともいえません。


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

Name: pon  ..かけだし(2,473ポイント)   Date: 2010/06/05(土) 00:16   No:53570     
Title: Re:cygwinのerrorについて    
contestの問題なのでソースを挙げるのは問題な気がするのですが、言語はCです

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

Name: たかぎ [URL]  ..ハッカー(199,770ポイント)   Date: 2010/06/05(土) 00:18   No:53571     
Title: Re:cygwinのerrorについて    
> ソースを挙げるのは問題な気がするのですが

それなら自己解決するしかないと思います。


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



Name: T.J  ..かけだし(1,351ポイント)   Date: 2010/06/04(金) 20:22   No:53549       
Title: [龍神録]反射の回数の指定の仕方がわからない    
龍神録で、全方向の弾をそれぞれ一回だけ壁に当たったら反射する
というプログラムの作り方が分かりません。
プログラムは
void boss_shot_bulletH002(){
#define TM002 200
    int i,k=0,t=boss_shot.cnt%TM002,t2=boss_shot.cnt;
    int a=GetRand(FMX);
    int b=GetRand(FMY/3);
    static int cnum=0;//ターンのカウンタ
    if(t==0){//1ターンごとの初期化
        move_boss_pos(40,70,FMX-40,120,60,200);
        delete_boss_assist(0);
        if(cnum%5==0){
            assist_way(boss.x,boss.y,0,PI2/10,2,10,0,0,1);
            bullet_way(boss.x,boss.y,0,PI2/10,2,10,0,0,1);
        }
        if(cnum%5==1){
            assist_way(boss.x,boss.y,0,PI2/12,2,12,0,0,1);
            bullet_way(boss.x,boss.y,0,PI2/12,2,12,0,0,1);
        }
        if(cnum%5==2){
            assist_way(boss.x,boss.y,0,PI2/8,2,8,0,0,1);
            bullet_way(boss.x,boss.y,0,PI2/8,2,8,0,0,1);
        }
        if(cnum%5==3){
            assist_way(boss.x,boss.y,0,PI2/15,2,15,0,0,1);
            bullet_way(boss.x,boss.y,0,PI2/15,2,15,0,0,1);
        }
        if(cnum%5==4){
            assist_way(boss.x,boss.y,0,PI2/16,4,16,0,0,0);
            bullet_way(boss.x,boss.y,0,PI2/16,4,16,0,0,0);
        }
        se_flag[4]=1;
    }
    for (i=0;i<BOSS_BULLET_MAX;i++){
        if (boss_shot.bullet[i].flag > 0&&boss_shot.assist[i].state==1&&boss_shot.bullet[i].state==1) {
            double x=boss_shot.bullet[i].x;
            double y=boss_shot.bullet[i].y;
            double state=boss_shot.bullet[i].state;
            double state2=boss_shot.assist[i].state;
            // 横の壁
            if ( x < 9 || x > FMX-9 ){
                boss_shot.bullet[i].angle = PI - boss_shot.bullet[i].angle;
                boss_shot.assist[i].angle = PI - boss_shot.assist[i].angle;
            }
            // 上の壁
            if ( y < 9){
                boss_shot.bullet[i].angle = PI2 - boss_shot.bullet[i].angle;
                boss_shot.assist[i].angle = PI2 - boss_shot.assist[i].angle;
            }
        }
    }
    //ここから先はアシストからの弾登録などです。
    for (i = 0; i < BOSS_ASSIST_MAX; i++) {
        if (boss_shot.assist[i].flag > 0) {
            int state = boss_shot.assist[i].state;
            double x = boss_shot.assist[i].x;
            double y = boss_shot.assist[i].y;

            switch(state){
            case 0:
            case 1:
            // アシストから弾幕登録
                if (t%20 == 0){
                    bullet_way(x,y,bossatan3(k,a,b),0,0,1,1,0,2);
                    se_flag[0]=0;
                    break;
                }
            default:
                break;
            }
        }
    }
    for(i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet[k].flag>0){
            int state = boss_shot.bullet[i].state;
            switch(state){
            case 2:
            //速度変更
                if(t>=150 && boss_shot.bullet[i].spd<=1)
                boss_shot.bullet[i].spd +=0.05;
            break;
            default:
                break;
            }
        }
    }
    if(t==TM002-1)
        cnum++;
}
このようになっていて、stateが1のものだけ反射するようにしてあります。だから反射したらstateを0にすればいいと思ったんですが、そうしたらそれ以降のものが一回も反射しなくなってしまいました。
どうすればいいのでしょうか?教えてください。
ちなみに、assist_wayとbullet_wayの引数はそれぞれ
(発射するx座標,y座標,発射角度,弾の間隔,スピード,何way弾か,弾の画像,色,状態(state))となっています。


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


Name: T.J  ..かけだし(1,376ポイント)   Date: 2010/06/04(金) 21:01   No:53554 解決!     
Title: Re:[龍神録]反射の回数の指定の仕方がわからない    
すいません、どうやったかは分かんないんですけど自己解決しました(笑)


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

Name: ookami  ..上級者(22,966ポイント)   Date: 2010/06/04(金) 23:56   No:53568     
Title: Re:[龍神録]反射の回数の指定の仕方がわからない    
私もよくありますwwww 「解決!」のところすみませんが、「どうやったかは分かんないんですけど」に補足します。定期的にソースコードのバックアップ(単にファイルコピー)をとって、テキスト差分比較ツールで比較することです。今回は時すでに遅しですが、ぜひ試してみてください。

http://www.vector.co.jp/vpack/browse/pickup/pw6/pw006482.html


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



Name: im  ..ぴよぴよ(281ポイント)   Date: 2010/06/04(金) 11:12   No:53521       
Title: 三原則の一つ、カプセル化の利点    
こんにちは、オブジェクト指向三原則の一つ、カプセル化についてお聞きします。

たとえば、クラスを以下のように定義します。C++です。

class クラス名
{
private:        // 〜〜非公開部分〜〜

    データメンバ
    ・・・
        
public:         //~〜公開部分〜〜
    
    メンバ関数    
    ・・・
}


とすると、privateで宣言した変数はクラスのメンバ関数とフレンドでしか使用することはできなかったと思います。
よって、privateで宣言した変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわかり、結果としてバグが減る。

ということがカプセル化の利点の一つと解釈してよろしいでしょうか。

また、カプセル化がプログラムの信頼性の向上につながる例を示してほしいのですが、お願いできますか。できるだけ短く、わかりやすいものがいいです。



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


Name: たかぎ [URL]  ..ハッカー(199,587ポイント)   Date: 2010/06/04(金) 13:50   No:53528     
Title: Re:三原則の一つ、カプセル化の利点    
> よって、privateで宣言した変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわかり、結果としてバグが減る。 

というか、おかしな値が入ること自体が間違いでは?
おかしな値が入るような操作ができないようにするのが、利点の一つかと思います。

あとは、クラスの内部表現に依存せずにユーザーが利用できるように、抽象化できることも大きな利点です。


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

Name: ookami  ..上級者(21,414ポイント)   Date: 2010/06/04(金) 20:44   No:53551     
Title: Re:三原則の一つ、カプセル化の利点    
> privateで宣言した変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわかり、結果としてバグが減る

これはカプセル化には関係ないと思いますよ。例えば、
private:
    int x;
public:
    void setX(int _x){x=_x;}
と、
public:
    int x;
では、「変数におかしな値が入った場合、このクラスをじっくりみれば、その理由がわか」るかどうかに違いはないですよね。(もしかしてこれはカプセル化とは言わない?)

> カプセル化がプログラムの信頼性の向上につながる例

「カプセル化でなければ得られない信頼性」というのは無いんじゃないかなと。プログラムの信頼性は、結局どんなケースを想定してテストしたかに尽きると思います。

信頼性ではなくて利点、という意味では、たかぎさんのおっしゃる通りと思います。


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

Name: dic  ..比類無きプログラマー(70,683ポイント)   Date: 2010/06/04(金) 20:59   No:53553     
Title: Re:三原則の一つ、カプセル化の利点    
カプセル化ということは外部からアクセスできなくすることですが
間違った値が入力されないよう以下のようにして実装できます

#include <iostream>

class A
{
private:
    int    m_x;
public:
    void    SetX( int x );
};

void    A::SetX( int x )
{
    if( x < 0 )
    {
        printf( "error セットする値がマイナスです\n" );
        return;
    }
    if( x > 1000 )
    {
        printf( "error セットする値が想定より大きいです\n" );
        return;
    }

    m_x = x;
    printf( "%dをセットしました\n", m_x );
}

int main()
{
    A    a;

    a.SetX( -999 );
    a.SetX( 10000 );
    a.SetX( 200 );

    return 0;
}



公開されたメンバ関数 SetX のところに入力の値をチェックする機能を追加すれば
m_x 非公開なメンバ変数におかしな値が入ることを防げます


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



Name: dic  ..比類無きプログラマー(70,044ポイント)   Date: 2010/06/04(金) 19:02   No:53545       
Title: DrawStringで文字が出力できない    
ちょっと長くなるのではしょりますが
以下のコードで int CStage1::stageClear() 関数内の DrawString( m_x2, m_y2,"ステージ1クリアー", RGB(255,0,0) );
が画面に反映されないです
ブレークポイントで止めると画面に出力してるんですが、
ブレークポイント入れないと画面に出力されないです

どこか問題点などあるでしょうか?


//-------------------------------------------------
static    CTitle        gTitle;
static    CStage1        gStage1;
static    CCommonData    gCommonData;
static    int            gMode;

//-------------------------------------------------
        switch( gMode )
        {
        case 0:
            break;
        case 10:
            gTitle.Draw();
            gTitle.Move( &gMode );
            break;
        case 20:
            gStage1.Draw();
            gStage1.Move( &gMode );
            break;
        case 30:
            break;
        default:
            break;
        }

//-------------------------------------------------
void    CStage1::Init( CCommonData *data )
{
    m_img02 = LoadGraph( "02.jpg" );
    m_x = (800/2)-(32/2);
    m_y = (int)(600*0.75);
    m_x2 = def_window_size_x;
    m_y2 = (int)def_window_size_y * 0.25;
    _data = data;

    _data->InitTile();
}


//-------------------------------------------------
void    CStage1::Move( int *mode )
{

    //    クリアー条件を満たした
    if( _data->CheckClear() == 1 )
    {
        int    r = stageClear();
        if( r == 1 )
            *mode = 10;
    }
}

//-------------------------------------------------
int        CStage1::stageClear()
{

    DrawString( m_x2, m_y2, "ステージ1クリアー", RGB(255,0,0) );

    m_x2 = m_x2 - 5;

    if( m_x2 == -10 )
        return 1;

//ここにブレークポイントを設定してみると出力されているのが確認できる
    return 0;
}


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


Name: dic  ..比類無きプログラマー(70,144ポイント)   Date: 2010/06/04(金) 19:51   No:53548 解決!     
Title: Re:DrawStringで文字が出力できない    
//------------------------------------------------- 
void    CStage1::Move( int *mode ) 
{ 

    //    クリアー条件を満たした 
    if( _data->CheckClear() == 1 ) 
    { 
        int    r = stageClear(); 
        if( r == 1 ) 
            *mode = 10; 
    } 
} 

なにか上のところの挙動が変でしたので
別の方法で解決しました


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



Name: 炎獄  ..ぴよぴよ(21ポイント)   Date: 2010/06/02(水) 20:03   No:53333       
Title: 無題    
2番で出てくるmain.cppの出し方がわかりません(汗)
初心者なんでどうか教えてください_。_。


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


Name: ookami  ..上級者(18,407ポイント)   Date: 2010/06/02(水) 20:14   No:53335     
Title: Re:無題    
お困りのようですが、2番とはなんですか?

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

Name: たかぎ [URL]  ..ハッカー(196,032ポイント)   Date: 2010/06/02(水) 20:17   No:53336     
Title: Re:無題    
「出し方」というのもわかりません。

> 初心者なんで

国語まで初心者ではないですよね?
(外国人ならそういってください。)


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,196,130ポイント)   Date: 2010/06/02(水) 21:00   No:53338     
Title: Re:無題    
2番でmain.cppということは龍神録プログラミングの館の2章のことではないでしょうか。

龍神録のプロジェクトは一式ダウンロード出来るので、自分でプロジェクトを作るのが面倒でしたらそちらでダウンロードして下さい。
トップページなどからダウンロード出来ます。

2章が実行したければ2章フォルダのプロジェクトファイルを開いて下さい。F5を押せば実行できます。
ファイルはソリューションエクスプローラーから選択できます。



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

Name: 炎獄  ..ぴよぴよ(127ポイント)   Date: 2010/06/02(水) 21:32   No:53345     
Title: Re:無題    
アプリケーションはインストールされていませんっと、でました。
どうしたらいいですか??


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

Name: ムンバ  ..熟練のプログラマー(56,996ポイント)   Date: 2010/06/03(木) 00:53   No:53386 解決!     
Title: Re:無題    
No:53341 に、炎獄さんのご質問が移行された様ですので
解決マークを勝手に押させて頂きますが
差し障りあれば、ご指摘の程、宜しくお願い致します。

PS:今日は、ここでリタイヤです。おやすみです。(o_ _)o


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

Name: たしかにあいた。  ..ぴよぴよ(787ポイント)   Date: 2010/06/04(金) 19:39   No:53547     
Title: Re:無題    
#include<stdio.h>
#include<math.h>

#define G 9.8
#define K 1
#define M 1

double f1 (double r0,double y3,double y5, double y0, double y2,double y1,double rr){
  double  f_1;
  f_1 =(y5*rr*y5*sin(y0)*cos(y0)-G*sin(y0)-2*y3*y1)/(r0+y2); 
  
  return f_1;
}

double f5 (double r0,double y2,double y5,double y1,double y0, double y3){
  double  f_5;
  f_5 = -2*(y3*y5*sin(y0) +(r0+y2)*(y1)*(y5)*cos(y0))/(r0+y2)*sin(y0);
  
  return f_5;
}

double f3 (double r0,double y2,double y5,double y1,double y0){
  double  f_3;
  f_3 = (r0+y2)*(y1)*(y1) + (r0+y2)*y5*y5*sin(y0)*sin(y0) + G*cos(y0) - K*y2/M;
  
  return f_3;
}
/*f_1(y_0~y_5)*/


double fd1 (double r0,double y3[],double y5[],double y0[],double y2[],double y1[],int j,double rr){/*(r_0,_0, yb_2,i*/
  double fd_1;
  fd_1 =(rr*y5[j]*y5[j]*sin(y0[j])*cos(y0[j])- G*sin(y0[j])-2*y3[j]*y1[j])/(r0+y2[j]);

  return fd_1;
}

double fd5 (double r0,double y2[],double y5[],double y1[],double y0[],double y3[] ,int j){
  double  fd_5;
  fd_5 = (-2*(y3[j]*y5[j]*sin(y0[j]) +(r0+y2[j])*y1[j]*y5[j]*cos(y0[j])))/(r0+y2[j])*sin(y0[j]);  
  
  return fd_5;
}

double fd3 (double r0,double y2[],double y5[],double y1[],double y0[], int j){
  double  fd_3;
  fd_3 = (r0+y2[j])*y1[j]*y1[j] + (r0+y2[j])*y5[j]*y5[j]*sin(y0[j])*sin(y0[j]) + G*cos(y0[j]) - K*y2[j]/M;
  
  return fd_3;
}



/*f(yd_0~yd_5)*/
int main(void){
  
  double yb_0[200];
  double yb_1[200];
  double yb_2[200];
  double yb_3[200];
  double yb_4[200];
  double yb_5[200];/*ybar*/
  
  double yd_0[200];
  double yd_1[200];
  double yd_2[200];
  double yd_3[200];
  double yd_4[200];
  double yd_5[200];/*ydotbar*/
  
  double ys_0[200];
  double ys_1[200];
  double ys_2[200];
  double ys_3[200];
  double ys_4[200];
  double ys_5[200];/*最後の答え*/
  
  int i;
  double y_0=0.1, y_1=0, y_2=0.2, y_3=0.3 ,y_4=0.4, y_5=0,h=0.01,r_0=0.1,r=1;

 
  

  for(i=0;i<=200;i++){
    yb_0[i]= y_0 + h*y_1;
    yb_1[i]= y_1 + h*f1(r_0, y_3, y_5,y_0,y_2,y_1,r);
    yb_2[i]= y_2 + h*y_3;
    yb_3[i]= y_3 + h*f3(r_0, y_2, y_5, y_1, y_0);
    yb_4[i]= y_4 + h*y_5;
    yb_5[i]= y_5 + h*f5(r_0, y_2, y_5, y_1, y_0, y_3);



    ys_0[i]= y_0 + h*(y_1 + yb_1[i])/2;
    ys_1[i]= y_1 + h*(f1(r_0, y_3, y_5, y_0,y_2,y_1,r) + fd1(r_0, yb_3, yb_5, yb_0, yb_2,yb_1,i,r))/2;
    ys_2[i]= y_2 + h*(y_3 + yb_3[i])/2;
    ys_3[i]= y_3 + h*(f3(r_0, y_2, y_5, y_1, y_0) + fd3(r_0, yb_2, yb_5, yb_1, yb_0, i))/2;
    ys_4[i]= y_4 + h*(y_5 + yb_5[i])/2;
    ys_5[i]= y_5 + h*(f5(r_0, y_2, y_5, y_1, y_0, y_3) +fd5(r_0, yb_2, yb_5, yb_1, yb_0, yb_3, i))/2;
  
    y_0=ys_0[i];
    y_1=ys_1[i];
    y_2=ys_2[i];
    y_3=ys_3[i];
    y_4=ys_4[i];
    y_5=ys_5[i]; 
}

  for(i=0;i<=200;i++){
    printf("%f\n",ys_0[i]);
    printf("%f\n",ys_1[i]);
    printf("%f\n",ys_2[i]);
    printf("%f\n",ys_3[i]);
    printf("%f\n",ys_4[i]);
    printf("%f\n",ys_5[i]);
  }

  return 0;
}


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



Name: ニート匿名  ..かけだし(1,002ポイント)   Date: 2010/06/03(木) 09:08   No:53420       
Title: 交換法のアルゴリズム    
 以下のプログラムは交換法を使って降順に並べるプログラムです。

具体的には、以下のようなアルゴリズムです。

@ 添え字a[0]〜a[4]から最大値をみつけて、a[0]と交換する。

A 添え字a[1]〜a[4]から最大値をみつけて、a[1]と交換する。

B 添え字a[2]〜a[4]から最大値をみつけて、a[2]と交換する。

C 添え字a[3]〜a[4]から最大値をみつけて、a[3]と交換する。

D a[4]が必然的にひとつに決まる。



 #include <stdio.h> 

      int main (void)
      {
         int i,j,k,w;
         
         int a[5]={2,5,3,1,4};

         for(i=0;i<4;i++){
            
             k=i;/*交換する場所*/

         for(j=i+1;j<5;j++){

          if(a[i]<a[j]){
 
     
               i=j;/*最大値の添え字の設定*/

                       }
                            }

            w=a[i]; a[i]=a[k];a[k]=w; /*要素の交換*/

                             
                                    }


       return 0;
      }
このプログラムを応用して、次のような自分なりのアルゴリズムをプログラムとして実現したいのですが、どのようにプログラムにしたらよいか、紙や鉛筆を使ってトレースして何度も考えまくったのですが、なかなかいい方法がなさそうなのです。自分で考えたプログラムの途中を示します。 @ 添え字a[0]〜a[4]のなかの最大値を見つけたら、その要素を最後尾の要素(つまり、a[4])と交換する。(これでa[4]の値が確定する) A 添え字a[0]〜a[3]のなかの最小値を見つけたら、その要素を先頭の要素(つまり、a[0])と交換する。 (これで、a[0]の値が確定する。) B 添え字a[1]〜a[3]のなかの最大値を見つけたら、その要素をa[3]と交換する。  (これで、a[3]の値が確定する。) C 添え字a[1]〜a[2]のなかから最小値を見つけたら、その要素をa[1]と交換する。 (これで、a[1]が確定し、a[2]は必然的に決まる。)
 #include<stdio.h>

      int main(void)
{
  int i,j,k,l,saisho,saidai;

  int a[5]={2,5,3,1,4};

saisho=0;
saidai=0;
 for(i=4;i>0;i--){

                 k=i;
                 l=4-k;/*最大値と交換する要素の添え字*/

for(j=i-1;j>-1;j++){

if(a[i]<a[j]){
i=j; saidai=a[i];
}

if(a[i]>a[j]){

i=j;  saisho=a[i]
}
......



return 0;
}




どのように改良すればよいのでしょうか。

どなたかご教授願います。


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


Name: たいちう  ..比類無きプログラマー(90,588ポイント)   Date: 2010/06/03(木) 09:35   No:53424     
Title: Re:交換法のアルゴリズム    
> どのように改良すればよいのでしょうか。

改良という言葉は、現時点でも最低限のものができている場合に使います。
現時点のプログラムはコンパイルすらできないようですが、
もしも正常に動作するものができているならばそれを貼り付けてください。

【冒頭の問題?】
(1) 添え字a[0]〜a[4]から最大値をみつけて、a[0]と交換する。

【途中の方針】
(1) 添え字a[0]〜a[4]のなかの最大値を見つけたら、
その要素を最後尾の要素(つまり、a[4])と交換する。(これでa[4]の値が確定する)

冒頭と途中とで逆になっています。
ソートが目的ならば逆でも構わないので、
逆だと言うことだけはしっかり意識しておいてください。


以下は正常に動作するものが出来上がっていないという前提での方針です。

全部をソートしようと思わずに、(1)だけ行うプログラムを作ってください。
その後に、必ず配列全部を表示して、意図したとおりの結果であることを
確認します。

これができたら、(1)の後に(2)を行い結果を表示するプログラム、
(1)〜(3)を行い、、、と順に作成し、最後に(1)〜(5)までを行うプログラムを作成します。
必要に応じて途中経過を表示すると、デバッグが楽です。

ここまでできたら、プログラムの「改良」という作業に入れます。
必要ならばその時に再度質問してください。


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

Name: ニート匿名  ..かけだし(1,274ポイント)   Date: 2010/06/03(木) 09:52   No:53426     
Title: Re:交換法のアルゴリズム    
 早速のご返信をありがとうございました。

たいちうさんのアドバイスどおりプログラムを逆からみていく(最後尾の要素と交換する)ものに直してみました。(1)だけできました。

<pre> #include<stdio.h>

     int main(void){

         int i,j,k,w;
         
         int a[5]={2,5,3,1,4};


         for(i=4;i>0;i--){

                     k=i;

        for(j=i-1;j>-1;j--){

          if(a[i]<a[j]){
                  i=j;
                       }

                            }

w=a[i]; a[i]=a[k]; a[k]=w;

}



            return 0;
                     }





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

Name: たいちう  ..比類無きプログラマー(90,786ポイント)   Date: 2010/06/03(木) 09:55   No:53428     
Title: Re:交換法のアルゴリズム    
結果を表示していません。

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

Name: ニート匿名  ..かけだし(1,340ポイント)   Date: 2010/06/03(木) 10:05   No:53429     
Title: Re:交換法のアルゴリズム    
 そうですね。結果は1回目なので、
 2 5 3 1 4から

2 4 3 1 5になっていました。

以下同様に2 4 3 1 5から 2 1 3 4 5 

となっていました。


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

Name: たいちう  ..比類無きプログラマー(90,949ポイント)   Date: 2010/06/03(木) 10:13   No:53430     
Title: Re:交換法のアルゴリズム    
結果を表示する機能をプログラムに追加してください、
という意味だったのですが、まぁいいや。

> 以下同様に2 4 3 1 5から  2 1 3 4 5 

これの意味がわかりません。
以下同様とは?
(1)から(5)まで全部やったつもりだけど1と2が逆のまま、ということですか?

やっぱり状況が分かりませんので、表示する機能を付けたプログラムを
貼り付けてください。そのプログラムがどこまでできているつもりかも
書いてください。
(1)までとか、(5)まで書いたつもりだけどバグあり、とか。
後者の場合は、(1)まで正しく動くプログラムもお願いします。


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

Name: ニート匿名  ..かけだし(1,605ポイント)   Date: 2010/06/03(木) 10:27   No:53431     
Title: Re:交換法のアルゴリズム    
 以下同様という書き方が不十分でした。

a[0]からa[4]までを見ていくと、a[1]が最大値なのでそれを最後の要素a[4]と交換 2 4 3 1 5

a[4]=5が確定したのでa[0]からa[3]までを見ていくと、a[1]が最大値なのでそれを要素a[3]と交換 2 1 3 4 5

a[3]=4が確定したのでa[0]からa[2]までを見ていくと、a[2]が最大値なのでそれを要素a[2]と交換 2 1 3 4 5 
                                                                                         (ここでは、最初から最大値になっているので変化なし。)

a[2]=3が確定したのでa[0]からa[1]までを見ていくと、a[0]が最大値なのでそれを要素a[1]と交換 1 2 3 4 5

a[1]=2が確定したので残り1つは必然的に確定  1 2 3 4 5
 

ということなのです。プログラムは正常に動いていますし、結果も正しくなっております。。


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

Name: たいちう  ..比類無きプログラマー(91,037ポイント)   Date: 2010/06/03(木) 10:36   No:53434     
Title: Re:交換法のアルゴリズム    
> ということなのです。プログラムは正常に動いていますし、結果も正しくなっております。。

自力で作成できたようで何よりです。
それで、質問はまだありますか?
無いなら解決!マークをチェックしてください。

あるならば具体的に書いてください。
例えば改良したいならば、改良元のソースコードを。

保留ならば当面このままでも良いですが、数日中には解決か追加の質問かをお願いします。


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

Name: ニート匿名  ..かけだし(1,824ポイント)   Date: 2010/06/03(木) 10:40   No:53435     
Title: Re:交換法のアルゴリズム    
早速の返信をありがとうございます。私の実現したいアルゴリズムは以下の流れです。

@ 添え字a[0]〜a[4]のなかの最大値を見つけたら、その要素を最後尾の要素(つまり、a[4])と交換する。(これでa[4]の値が確定する)
 A 添え字a[0]〜a[3]のなかの最小値を見つけたら、その要素を先頭の要素(つまり、a[0])と交換する。(これで、a[0]の値が確定する。)
 B 添え字a[1]〜a[3]のなかの最大値を見つけたら、その要素をa[3]と交換する。 (これで、a[3]の値が確定する。) 
C 添え字a[1]〜a[2]のなかから最小値を見つけたら、その要素をa[1]と交換する。 (これで、a[1]が確定し、a[2]は必然的に決まる。) 

やはり難しいでしょうか。


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

Name: たいちう  ..比類無きプログラマー(91,463ポイント)   Date: 2010/06/03(木) 11:00   No:53443     
Title: Re:交換法のアルゴリズム    
# インターネットで丸付き数字等(環境依存文字)の使用は控えましょう。

(1)と(2)を同時に行うのですね。
どうせ最大値を探すのならば、最小値も一緒に探すことで、
配列を見る回数が半分になる、というコンセプトでいいですか?

別に難しいことは無いと思います。
まずは(1)と(2)の部分だけ作ってみてはいかがですか。


難しく感じるようでしたら、応用の前に基本をしっかり確認しておくという意味で、
普通のソートを改良するのが有効かもしれません。
No:53420やNo:53426を見る限りは、改良の余地がありそうです。
完成形が完璧なのかもしれませんが。


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

Name: ニート匿名  ..かけだし(1,886ポイント)   Date: 2010/06/03(木) 11:21   No:53445     
Title: Re:交換法のアルゴリズム    
早速のご返信をありがとうございます。質問の意味がわからない箇所がありました。 
> (1)と(2)を同時に行うのですね。
> どうせ最大値を探すのならば、最小値も一緒に探すことで、
> 配列を見る回数が半分になる、というコンセプトでいいですか?
とありますが、配列を見る回数が半分になるとはどういうことでしょうか。

何度もすみません。ご返信をお願いします。



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

Name: たいちう  ..比類無きプログラマー(91,630ポイント)   Date: 2010/06/03(木) 11:33   No:53446     
Title: Re:交換法のアルゴリズム    
> とありますが、配列を見る回数が半分になるとはどういうことでしょうか。

ニート匿名さんの意図を私が誤解したものですので、
回数が半分にならないのならばそれで結構です。

No:53435のままの仕様でしたら、普通のソートを変更して作りましょう。
奇数回目は最大を見つけて未確定範囲の最後に、
偶数回目は最小をみつけて未確定範囲の先頭に置き換えれば良いでしょう。

具体的な説明は、ソースコードを元にして行ったほうがわかり易いと思います。


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

Name: ニート匿名  ..かけだし(2,100ポイント)   Date: 2010/06/03(木) 15:20   No:53469     
Title: Re:交換法のアルゴリズム    
ご返信をありがとうございます。

今度はアルゴリズムを実現する以前の質問です。

for文の中に最大値と最小値両方を求めることは可能でしょうか。

最大値だけ、もしくは最小値だけを求めるということはできるのですが。

for(i=0;i<4;i++){

for(j=i+1;j<5;j++){

if(a[i]<a[j]){

i=j;
}

else if(a[i]>a[j]){
j=i;
}



上の場合、iがありえない値をとってしまい、間違っているということはわかるのですが。




ご返信をお願いします。


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

Name: たいちう  ..比類無きプログラマー(91,786ポイント)   Date: 2010/06/03(木) 15:35   No:53470     
Title: Re:交換法のアルゴリズム    
> for文の中に最大値と最小値両方を求めることは可能でしょうか。

もちろん可能ですが、その前に普通のソートをちゃんと作りましょう。
下記の問題点は最初のプログラムからありました。


> 上の場合、iがありえない値をとってしまい、間違っているということはわかるのですが。

forの内側でループ変数に代入することはやめた方が良いでしょう。
文法的に間違いではないですが、バグの温床になりますよ。
最大値や最小値を保持するための変数を別に用意しておきましょう。

for(i=0;i<4;i++){  // この内側でiを変更してはいけない
    for(j=i+1;j<5;j++){ // この内側でjを変更してはいけない
        if(a[i]<a[j]){
            i=j;             // i を 変更している!
        }
        else if(a[i]>a[j]){
            j=i;             // j を 変更している!
        }
        ...
    }
}


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

Name: ニート匿名  ..かけだし(2,151ポイント)   Date: 2010/06/04(金) 17:47   No:53537 解決!     
Title: Re:交換法のアルゴリズム    
返事遅れて申し訳ありませんでした。例の質問は解決できました。
本当にありがとうございます。


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



Name: X  ..ぴよぴよ(114ポイント)   Date: 2010/05/31(月) 12:33   No:53140       
Title: LoadDivGraph関数    
LoadDivGraph関数を使って、画像を分割して読み込み表示しようとしたのですが、"グラフィックファイルを読み込めません"と出てきて、うまく表示できませんでした。どうすればうまく読み込めるでしょうか。

OS:WindowsXP HomeEdition 
VisualC++2008ExpressEdition


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


Name: lbfuvab  ..プログラマー(26,863ポイント)   Date: 2010/05/31(月) 15:46   No:53142     
Title: Re:LoadDivGraph関数    
このままでは満足のいく回答は得られないでしょう。せめてソースを載せましょう。

どう質問したら良いか分からないならテンプレを使うと良いですよ。


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

Name: X  ..ぴよぴよ(465ポイント)   Date: 2010/05/31(月) 17:16   No:53144     
Title: Re:LoadDivGraph関数    
すみません m(__)m 初心者なのでうっかりしてました。
ソースは、

#include "DxLib.h"

 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int main_char[36];
    char Key[256];
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; 
 
  
    SetDrawScreen( DX_SCREEN_BACK ) ;                                             
    LoadDivGraph("../dat/image/mainchar.png",36,4,9,32,32,main_char);


    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){

 
        DrawGraph( 320 , 240 , main_char[1] , TRUE ) ;

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

です。
よろしくお願いします (>人<) なにかあれば教えてください m(>_<)m 編集済み


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

Name: ookami  ..上級者(17,649ポイント)   Date: 2010/05/31(月) 22:42   No:53183     
Title: Re:LoadDivGraph関数    
ソースコードには問題は見当たりませんです。

フォルダの指定は合っていますか?例えば、
LoadDivGraph("../dat/image/mainchar.png",36,4,9,32,32,main_char);

LoadDivGraph("dat/image/mainchar.png",36,4,9,32,32,main_char);
で解決しませんか?


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

Name: ムンバ  ..熟練のプログラマー(54,677ポイント)   Date: 2010/06/01(火) 16:04   No:53216     
Title: Re:LoadDivGraph関数    
こんにちは。

昨日から、私も気になって悩んでいたのですが
ookamiさんがおっしゃってる通りか

>DrawGraph( 320 , 240 , main_char[1] , TRUE ) ;
 ↑
>LoadDivGraph("../dat/image/mainchar.png",36,4,9,32,32,main_char);

割り切れない数値(y座標)で分割されてる様にも見受けられるんです。
勘違いでしたら、申し訳ございません。

---↓追記---
<<割り切れない数値(y座標)で分割されてる様にも見受けられるんです。

違いますね!やはりookamiさんがおっしゃってる様に
画像までのパスが違っているか、ファイル名が違っているなどが原因だと思います。 編集済み


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

Name: X  ..ぴよぴよ(588ポイント)   Date: 2010/06/01(火) 17:42   No:53222     
Title: Re:LoadDivGraph関数    
ムンバさんやookamiさんに言われたとおりに

LoadDivGraph("../dat/image/mainchar.png",36,4,9,32,32,main_char); 
↓ 
LoadDivGraph("dat/image/mainchar.png",36,4,9,32,32,main_char); 

としてみると、"グラフィックファイルが読み込めません"という表示は消えたのですが、

"グラフィックの分割に失敗しました in CreateDivGraphFromGraphImage"

と出てきてしまいます。
何度もすみませんが、何かあったら教えてください。m(__)m 編集済み


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

Name: ookami  ..上級者(18,137ポイント)   Date: 2010/06/01(火) 18:52   No:53228     
Title: Re:LoadDivGraph関数    
ちょっと進展したようでよかったです。
が、"グラフィックの分割に失敗..."というのは... 分からないです...

とりあえず、以下を確認してもらえますか?

・pngのかわりにbmpならうまくいくか?
・画像のサイズは?
・PCを再起動したらうまくいったりして? 編集済み


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

Name: ムンバ  ..熟練のプログラマー(54,833ポイント)   Date: 2010/06/01(火) 21:28   No:53235     
Title: Re:LoadDivGraph関数    
私も少し確認させて頂きたい事があるのですが
お手数ですが、もし宜しければ添付させて頂いた添付ファイル
 char_red.png ファイルをダウンロードして頂いて(ウィルスチェック済み)
mainchar.png と同じ場所(フォルダ)に char_red.png ファイルを置いて(移動して)

ソース内の

LoadDivGraph("dat/image/mainchar.png",36,4,9,32,32,main_char);

↑の行の mainchar.png → char_red.png に変更して頂き
同じ行の 36,4,9,32,32,main_char の 9 を 4 に・・・つまり

LoadDivGraph("dat/image/char_red.png",36,4,4,32,32,main_char);

にして、再度デバッグしてみて頂けないでしょうか? ---←誤字編集箇所---
赤い四角が出れば、成功です。

もし、赤い四角が出なければ、ookamiさんがおっしゃっている
>・pngのかわりにbmpならうまくいくか?
>・PCを再起動したらうまくいったりして?
 を試してみて下さい。

もし、赤い四角が出れば、分割に失敗?している
ん〜?そうですよね〜。割り切れなくても出るはずなんですが・・・。^^;
とりあえず、宜しければ試してみて頂けますか?

---追記---
添付ファイル、ダウンロードする時ファイル名が変わっちゃうと思うので
ダウンロードしたファイル名を char_red.png に変更してから試してみて下さい。 編集済み


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

Name: X  ..ぴよぴよ(588ポイント)   Date: 2010/06/01(火) 22:14   No:53236     
Title: Re:LoadDivGraph関数    
ありがとうございます!分かりました。
明日学校から帰ったらやってみたいと思います。


Name: ムンバ  ..熟練のプログラマー(55,255ポイント)   Date: 2010/06/02(水) 00:02   No:53239     
Title: Re:LoadDivGraph関数    
Xさん、ぜひぜひ分割画像を表示できる様、がんばって下さいねっ!

以前に単細胞なRPGゲームを作った時に、フリー画像の分割表示で悩みました。
その時には、「グラフィックの分割に失敗しました in CreateDivGraphFromGraphImage」
の様なエラーは出なかったので、ちょっと気になったので
このエラーが出る様に試してみたところ

txtファイルで添付させて頂いた各ソース内でのメイン関数内のコメント // の様にすると
(4つのソースで試してますので、各ソースの /* 〜 */ を削除して、それぞれ試してみて下さい。
 他のソースを試す時は、元の状態 /* 〜 */ に戻して下さい。←解りにくいかも。)

グラフィックの分割に失敗しました in CreateDivGraphFromGraphImage
のエラーが出る値を試行錯誤しながら試してみました。

OS:Win7(Pro)
VC++2008(SP1)

ちなみに---追加ソース、すみません。---
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    int main_char[32];
    char Key[256];
    
    if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
    
    SetDrawScreen(DX_SCREEN_BACK);

    LoadDivGraph("char_red.png", 32, 123456789, 123456789, 2, 16, main_char);
    
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key) && !Key[KEY_INPUT_ESCAPE])
    {
        DrawGraph(320, 240, main_char[0], TRUE);
        ScreenFlip();
    }
    
    DxLib_End();
    
    return 0;
}


これでも、画像は表示されました。エラーも出ませんでした。
根本的に、私が理解できてないのかもしれません。^^;
---↑追加ソース、すみません。---

明日(今日)、別のPC
OS:WinXP(Home SP3?)
VC++2008(SP1)
でも、このソース試してみますね。

>>ookamiさん
 もしも、宜しければで申し訳御座いませんが
 お時間あれば、試して頂けませんでしょうか?
 私の環境でも
 グラフィックの分割に失敗しました in CreateDivGraphFromGraphImage
 が出てしまいました。(汗

誤字・脱字など御座いましたら、ご指摘の程、宜しくお願い致します。
おやすみなさい!(∪。∪)。。。zzzZZ

---↓追記・編集---
何度も編集しまして、申し訳御座いません。
このtxtファイルが、文字化けしてた場合は
ブラウザIEでしたら、「表示」→「エンコード」→「日本語(自動選択)」で
うまく表示されるかと思います。
長文、すみませんでした。

---職場での結果---
同じでした。^^; 編集済み


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

Name: X  ..ぴよぴよ(634ポイント)   Date: 2010/06/02(水) 19:58   No:53332     
Title: Re:LoadDivGraph関数    
ムンバさん、ookamiさん、頑張って悩んでくださってありがとうございます!!

今日学校から帰って、まずchar_red.pngにして、実行してみました。
するとちゃんと赤い四角が表示されて、エラーも消えました。
分割するときの数値が合っていなかったから正常に分割できなくて、表示も出来なかったのでしょうか??
 編集済み


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

Name: X  ..ぴよぴよ(527ポイント)   Date: 2010/06/03(木) 18:05   No:53484 解決!     
Title: Re:LoadDivGraph関数    
今後、自分で考えて、無事解決しました!!

これまで協力してくださった、ムンバさん、ookamiさん、lbfuvabさん、

本当に私のために必死で尽くしてくださって、ありがとうございます!!

本当に感謝します!!  m(_ _*)m


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

Name: ookami  ..上級者(20,427ポイント)   Date: 2010/06/03(木) 22:19   No:53503     
Title: Re:LoadDivGraph関数    
> Xさん
解決したようで何よりです!

> ムンバさん

No. 53239 の件、
やってみましたよwwww

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    int main_char[32];
    char Key[256];
    
    if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
    
    SetDrawScreen(DX_SCREEN_BACK);

    LoadDivGraph("char_red.png", 32, 2, 2, 64, 127, main_char);
    
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key) && !Key[KEY_INPUT_ESCAPE])
    {
        DrawGraph(320, 240, main_char[0], TRUE);
        ScreenFlip();
    }
    
    DxLib_End();
    
    return 0;
}

/*

    ☆のところを次のように変更して確認しました。
    LoadDivGraph("char_red.png", 32, 4, 4, 32, 32, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 5, 4, 32, 32, main_char); → グラフィックの分割に失敗しました
    LoadDivGraph("char_red.png", 32, 4, 5, 32, 32, main_char); → グラフィックの分割に失敗しました
    LoadDivGraph("char_red.png", 32, 8, 8, 16, 16, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 9, 8, 16, 16, main_char); → グラフィックの分割に失敗しました
    LoadDivGraph("char_red.png", 32, 8, 9, 16, 16, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 8, 123456789, 16, 16, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 2, 2, 64, 64, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 2, 2, 65, 64, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 2, 2, 96, 64, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 2, 2, 112, 64, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 2, 2, 120, 64, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 2, 2, 127, 64, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 2, 2, 128, 64, main_char); → グラフィックの分割に失敗しました
    LoadDivGraph("char_red.png", 32, 2, 2, 64, 127, main_char); → 問題なし
    LoadDivGraph("char_red.png", 32, 2, 2, 64, 128, main_char); → グラフィックの分割に失敗しました

*/

まとめ:
元画像の画像サイズをOrigXSize,OrigYSizeとすると、
LoadDivGraph(FileName,AllNum,XNum,YNum,XSize,YSize,HandleBuf);
で、
( (XNum-1)*XSize>=OrigXSize || 
  (YNum-1)*YSize>=OrigYSize )
では「グラフィックの分割に失敗しました」になるような感じですね。ただし、YNumはあらかじめAllNum/XNum以下になるように切り捨てられている感じですと...
...ていうか、ここまで踏み込まなくても(ノリで踏み込みましたが)、元画像をはみ出さないように設定するのが大前提ですね;


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

Name: ムンバ  ..熟練のプログラマー(57,773ポイント)   Date: 2010/06/04(金) 15:57   No:53532 解決!     
Title: Re:LoadDivGraph関数    
こんにちは。

Xさん、良かったです。^^

<<ookamiさん

お手数お掛けします。w
>>...ていうか、ここまで踏み込まなくても(ノリで踏み込みましたが)
 踏み込まないと気が済まない性格でして。^^;
>>元画像をはみ出さないように設定するのが大前提ですね
 その様ですね。お騒がせしました。

私も勉強になりました。失礼します。



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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +