C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   選択画面の拡張   
     ・[47574] kazuoni 
     ・[47576] yrao 
     ・[47577] softya 
     ・[47579] kazuoni 
     ・[47595] yrao 
     ・[47598] yrao 
     ・[47600] kazuoni 
     ・[47601] yrao 
     ・[47602] softya 
     ・[47603] kazuoni 
     ・[47608] conio 
     ・[47633] 少年X 
     ・[47675] yrao 
     ・[47679] kazuoni 
     ・[47681] yrao 
     ・[47683] kazuoni 
     ・[47685] yrao 
     ・[47691] softya 
     ・[47724] yrao 
     ・[47725] kazuoni 
   三角関数のテーブル化   
     ・[47678] kazuoni 
     ・[47686] Justy 
     ・[47688] 少年X 
     ・[47721] 少年X 
   実行速度とコード重複 ....   
     ・[47682] Justy 
     ・[47684] ぬっち 
     ・[47687] Justy 
     ・[47720] ぬっち 
   無題   
     ・[47717] サンタクロース 
     ・[47719] Tatu 
   かなり初歩で躓いてい ....   
     ・[47718] MNS 
   初めてのゲームプログ ....   
     ・[47556] ちゃお 
     ・[47562] Ma 
     ・[47564] dic 
     ・[47587] あいろん 
     ・[47612] Ma 
     ・[47613] softya 
     ・[47614] Mikan 
     ・[47698] あいろん 
     ・[47713] softya 
     ・[47714] kazuoni 
   【雑談】ゲーム作りま ....   
     ・[47038] ベリ工 
     ・[47039] 宮 
     ・[47041] mnkr 
     ・[47043] Tatu 
     ・[47054] SooA 
     ・[47082] 通りすがり 
     ・[47088] ひよこ 
     ・[47090] dic 
     ・[47091] sizuma 
     ・[47095] 宮 
     ・[47096] 宮 
     ・[47110] Tatu 
     ・[47112] shilfia 
     ・[47122] array 
     ・[47125] kazuoni 
     ・[47179] 宮 
     ・[47187] Tatu 
     ・[47189] array 
     ・[47191] shilfia 
     ・[47192] SooA 
     ・[47203] 宮 
     ・[47211] DVDM 
     ・[47245] 宮 
     ・[47273] Tatu 
     ・[47279] DVDM 
     ・[47325] Tatu 
     ・[47329] DVDM 
     ・[47344] Tatu 
     ・[47348] DVDM 
     ・[47351] array 
     ・[47352] DVDM 
     ・[47393] Tatu 
     ・[47395] DVDM 
     ・[47420] Tatu 
     ・[47425] lbfuvab 
     ・[47446] Tatu 
     ・[47462] DVDM 
     ・[47465] lbfuvab 
     ・[47477] Tatu 
     ・[47519] 宮 
     ・[47524] array 
     ・[47551] Tatu 
     ・[47553] lbfuvab 
     ・[47707] DVDM 
   二つの数列の比較につ ....   
     ・[47697] box 
     ・[47705] はじめたばかり 
   Cでの計算プログラム   
     ・[47704] Dixq (管理人) 
   教えて優しい人!   
     ・[47367] box 
     ・[47369] softya 
     ・[47422] ひで 
     ・[47427] Ma 
     ・[47693] ひで 
   パズルゲームのロジッ ....   
     ・[47663] 御津凪 
     ・[47665] たいちう 
     ・[47667] dic 
     ・[47670] バグ 
     ・[47690] 猫旅 
   残機   
     ・[47677] yrao 
   初級の配列問題   
     ・[47672] ひよこ 
     ・[47673] はじめたばかり 
     ・[47674] はじめたばかり 
   弾幕計算の高速化   
     ・[47620] conio 
     ・[47621] たいちう 
     ・[47626] lbfuvab 
     ・[47631] 少年X 
     ・[47632] 少年X 
     ・[47634] Dixq (管理人) 
     ・[47635] 少年X 
     ・[47638] 少年X 
     ・[47640] Dixq (管理人) 
     ・[47642] 少年X 
     ・[47644] ft 
     ・[47645] Dixq (管理人) 
     ・[47646] 少年X 
     ・[47647] 少年X 
     ・[47648] 少年X 
     ・[47649] ft 
     ・[47668] 少年X 
   最初からつまづいてい ....   
     ・[47461] たかぎ 
     ・[47476] non 
     ・[47651] 超初心者 
     ・[47652] たかぎ 
     ・[47655] Ma 
     ・[47656] Dixq (管理人) 
     ・[47657] non 
   画像のランダム表示に ....   
     ・[47542] Ma 
     ・[47554] wm 
     ・[47558] 猫旅 
     ・[47636] wm 
     ・[47653] ランド 
     ・[47654] Ma 
   newの例外処理について ....   
     ・[47639] たかぎ 
     ・[47641] ひよこ 
   分割コンパイル   
     ・[47630] たかぎ 
   RPGで言う村人と動くマ ....   
     ・[47605] softya 
     ・[47615] AO 
     ・[47618] softya 
     ・[47627] AO 
   コントロールパスにつ ....   
     ・[47539] Ma 
     ・[47625] デジキャメ 
   ゲームを作りました。   
     ・[47565] dic 
     ・[47566] 紅葉 
     ・[47573] kerotan0820 
     ・[47575] バグ 
     ・[47591] dic 
     ・[47599] ひよこ 
     ・[47611] Dixq (管理人) 
   課題研究   
     ・[47593] softya 
     ・[47610] Dixq (管理人) 
   「ゲームプログラミン ....   
     ・[47607] Dixq (管理人) 
     ・[47609] ムンバ 
   無題   
     ・[47580] fatens 
     ・[47582] 匿名 
     ・[47583] kazuoni 
     ・[47584] 匿名 
     ・[47585] softya 
     ・[47586] 匿名 
     ・[47588] fatens 
     ・[47589] softya 
     ・[47590] 匿名 
     ・[47594] SooA 
     ・[47596] 匿名 
     ・[47597] 匿名 
   リンクエラーが起きる   
     ・[47570] さかまき 
     ・[47581] dic 
   デバック用の関数   
     ・[47464] デバック用 
     ・[47482] たいちう 
     ・[47492] non 
     ・[47500] デバック用 
     ・[47501] non 
     ・[47502] たいちう 
     ・[47503] デバック用  
     ・[47512] non 
     ・[47516] デバック用 
     ・[47520] たいちう 
     ・[47526] ST 
     ・[47528] softya 
     ・[47529] non 
     ・[47533] ST 
     ・[47538] YuO 
     ・[47540] たかぎ 
     ・[47544] SooA 
     ・[47557] 西村 
     ・[47559] たかぎ 
     ・[47561] ST  
     ・[47567] たかぎ 
     ・[47568] non 
     ・[47569] たいちう 
     ・[47571] non 
   初歩的な事ですが・・ ....   
     ・[47549] バグ 
     ・[47550] softya 
     ・[47552] 入門者以下 
   皆様だったらどっちで ....   
     ・[47506] softya 
     ・[47507] 御津凪 
     ・[47547] バグ 
   ダンジョン風ゲームの ....   
     ・[47253] MNS 
     ・[47254] PG初心者 
     ・[47256] MNS 
     ・[47261] PG初心者 
     ・[47270] MNS 
     ・[47278] PG初心者  
     ・[47295] softya 
     ・[47349] PG初心者 
     ・[47363] SooA 
     ・[47365] softya 
     ・[47375] PG初心者 
     ・[47380] softya 
     ・[47388] PG初心者 
     ・[47397] softya 
     ・[47411] PG初心者 
     ・[47418] softya 
     ・[47435] PG初心者 
     ・[47436] PG初心者 
     ・[47440] softya 
     ・[47444] PG初心者  
     ・[47447] softya 
     ・[47454] PG初心者 
     ・[47485] softya 
     ・[47499] PG初心者 
     ・[47505] softya 
     ・[47514] PG初心者 
     ・[47523] softya 
     ・[47525] PG初心者 
     ・[47527] softya 
     ・[47530] PG初心者 
     ・[47531] softya 
     ・[47532] PG初心者 
     ・[47534] PG初心者 
     ・[47546] softya 
   多次元配列の渡し方   
     ・[47510] たかぎ 
     ・[47513] memory_swan 
     ・[47515] たかぎ 
     ・[47517] バグ 
     ・[47545] バグ 
   複雑な形の図形を3D描 ....   
     ・[47135] たいちう 
     ・[47136] Ma 
     ・[47137] Ma 
     ・[47139] たいちう 
     ・[47143] Ma 
     ・[47212] Ma 
     ・[47214] たいちう 
     ・[47221] Ma 
     ・[47222] Ma 
     ・[47223] たいちう 
     ・[47224] Ma 
     ・[47297] Ma 
     ・[47355] Ma 
     ・[47414] たいちう 
     ・[47417] Ma 
     ・[47419] Ma 
     ・[47421] Ma 
     ・[47424] Ma 
     ・[47430] Ma 
     ・[47452] Ma 
     ・[47481] たいちう 
     ・[47484] たいちう 
     ・[47487] Ma 
     ・[47490] たいちう 
     ・[47491] Ma 
     ・[47495] たいちう 
     ・[47543] Ma 
   画像が読み込まれてい ....   
     ・[47537] kazuoni 
   ファイルを読み込まな ....   
     ・[47511] ひよこ 
     ・[47522] dom 
   3Dでの2D描画につ ....   
     ・[47434] KS 
     ・[47437] kms 
     ・[47439] softya 
     ・[47497] kms 
     ・[47498] softya 
   別ファイルの変数を参 ....   
     ・[47489] non 
     ・[47496] uni 
   .exeファイルについて   
     ・[47493] Ma 
     ・[47494] Mist 
     ・[474481267021166] no 
   fprintfについて   
     ・[47479] non 
     ・[47480] Mist 
     ・[47486] デジキャメ 
   math.hをインクルード ....   
     ・[47470] たかぎ 
     ・[47471] 東西南北 
     ・[47472] Ma 
     ・[47483] 御津凪 
   アクセス違反の原因が ....   
     ・[47473] Ma 
     ・[47474] Ma 
     ・[47478] Ma 
   C++言語を用いたチャ ....   
     ・[47252] MNS 
     ・[47258] たかぎ 
     ・[47292] Dixq (管理人) 
     ・[47296] softya 
     ・[47345] 言語苦手 
     ・[47350] array 
     ・[47353] 言語苦手 
     ・[47357] mnkr 
     ・[47366] softya 
     ・[47368] 言語苦手 
     ・[47370] 言語苦手 
     ・[47371] dic 
     ・[47372] softya 
     ・[47390] 言語苦手 
     ・[47396] softya 
     ・[47399] バグ 
     ・[47467] 言語苦手 
     ・[47468] lbfuvab 
     ・[47475] mnkr 
   DXライブラリで描画時 ....   
     ・[47453] kazuoni 
     ・[47455] チック 
     ・[47456] kazuoni 
     ・[47457] kazuoni 
     ・[47459] チック  
   3Dマップのマウスでの ....   
     ・[47442] softya 
     ・[47449] YAMABUKI 
     ・[47450] softya 

Name: yrao  ..上級者(22,820ポイント)   Date: 2010/02/03(水) 12:36   No:47572       
Title: 選択画面の拡張    
こんにちは。

(先日質問させていただいたスペルプラクティスの実装については、自己解決できました。)
 
 
ゲームの選択画面についての質問です。
現在メニュー画面の作成をしているのですが、次の三つのことについて知りたいです。
 
@ 「GAME START」や、「OPTION」などのような、選択する項目それぞれに座標を設定する方法
A 添付画像のように、選択項目が一画面に入りきらない場合、次のページを用意して、残りの項目を表示する  方法
B 現在、選択項目には文字を使っているのですが、画像を項目として使用することはできるのでしょうか。
 
 
 
選択画面のプログラムは、龍神録プログラミングの支館のものを使っています(以下記載)。



<pre>
void MenuDraw( int x , int y , char title[] , char **str , int *menu ){
    int num=0,i=0;
    int dx=0,len=0;
    char **str2 = str;

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

    //タイトル表示
    dx =  x - GetDrawFormatStringWidthToHandle( font[1] , title ) / 2;
    DrawFormatStringToHandle(dx,y,color[0],font[1],"%s",title);
    y += 30;    //改行

    //情報の取得
    while ( *str2 ){
        if( len < GetDrawFormatStringWidthToHandle( font[0] , *str2 ) ){
            len = GetDrawFormatStringWidthToHandle( font[0] , *str2 );
        }
        ++num;
        *str2++;

        if( i++ > 50 )    break;    //無限ループ防止
    }
    dx =  x - len / 2;

    //選択制御
    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;

    y += *menu * 30;  
    SetDrawBlendMode( DX_BLENDMODE_ALPHA , 100 ) ;
    DrawBox( dx-10 , y , dx+10 + len , y + 18 , color[0] , TRUE ) ;    //選択位置の表示
    SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
    y -= *menu * 30;    

    //項目の表示
    i=0;
    while ( *str ){
        dx = x - GetDrawFormatStringWidthToHandle( font[0] , *str ) / 2;
        DrawFormatStringToHandle(dx,y,color[0],font[0],"%s",*str++);
        y += 30; 

        if( i++ > 50 )    break;    //無限ループ防止
    }
}


//表示例
void menu_game(){//タイトル画面
    char *str[10]={
        {"GAME START"},
        {"SPELL PRACTICE"},
        {"REPLAY"},
        {"GALLERLY"},
        {"RESULT"},
        {"OPTION"},
        {"QUIT"}
    };
    static int menu;

    MenuDraw( 520 , FY+FMY/3 , "" , str , &menu);

    if( CheckStatePad(configpad.shot) == 1 ){
        switch(menu){
            case 0:
                func_state = 90;    //難易度選択へ
                break;
            case 1:
                func_state = 20;    //SPELL PRACTICEへ
                break;
            case 2:
                func_state = 30;    //REPLAYへ
                break;
            case 3:
                func_state = 40;    //GALLERLYへ
                break;
            case 4:
                func_state = 50;    //RESULTへ
                break;
            case 5:
                func_state = 60;    //OPTIONへ
                break;
            case 6:
                DxLib_End();
                break;
            default:
                printfDx("不明なメニューが選択されました\n");
                break;
        }
        menu=0;
    }
}


以上のようなプログラムで表示をしています。
 
龍神録や東方では、これらの項目は、斜めに並べて表示されたりしているので、@の方法が知りたいです。
また、例えばスペルプラクティスの選択画面では、項目が一画面に入りきらず、画面の下端を越えて表示されてしまうので、Aを実装したいと考えています。
 
アドバイスよろしくおねがいします。
 


     編集済み


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


Name: kazuoni [URL]  ..ハッカー(133,155ポイント)   Date: 2010/02/03(水) 13:34   No:47574     
Title: Re:選択画面の拡張    
1,「GAME START」や、「OPTION」などのような、選択する項目それぞれに座標を設定する方法 

例えばDrawStringでx,yを指定する、
DrawGraphでx,yを指定するという回答では不足でしょうか?^^;
構造体などで、選択文字、座標、色などをまとめて管理するとよいかと。


2, 添付画像のように、選択項目が一画面に入りきらない場合、次のページを用意して、残りの項目を表示する方法

添付画像がないので分かりませんが・・・
例えば、メニュー画面で右を押したら次のメニューが表示されるとかですかね。
これも選択画面と同じように右キーが押されたらメニュー欄更新
とすればよいかと。

3, 現在、選択項目には文字を使っているのですが、画像を項目として使用することはできるのでしょうか。 
DrawStringをDrawGraphに変えればよいです。

#丸1などは環境依存文字ですので、なるべく避けた方が良いようです。


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

Name: yrao  ..上級者(23,078ポイント)   Date: 2010/02/03(水) 16:33   No:47576     
Title: Re:選択画面の拡張    
kazuoniさんどうもです。
(画像添付ミス、すいませんでした)
 
A、Bについては解決することができたのですが、
@の、

>DrawStringでx,yを指定する
>構造体などで、選択文字、座標、色などをまとめて管理する。

について、よく分からないので詳しく教えてくださいm(__)m

今のところ、表示する文字列のみ個々に指定できるようになっているのですが、座標、色なども個別に設定できるようにするには、どのように書きかえればよいのでしょうか。
文字列と同じように、x座標、y座標の配列を用意し指定する、ということはできるのでしょうか。



 

 



 




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

Name: softya  ..ハッカー(113,634ポイント)   Date: 2010/02/03(水) 16:40   No:47577     
Title: Re:選択画面の拡張    
>今のところ、表示する文字列のみ個々に指定できるようになっているのですが、座標、色なども個別に設定できるようにするには、どのように書きかえればよいのでしょうか。
>文字列と同じように、x座標、y座標の配列を用意し指定する、ということはできるのでしょうか。

出来ます。
敵やボスキャラクタは、すでに構造体配列で管理されているなら難しいところはありません。

出来ないと考える理由はなんでしょうか?
今後の回答の参考になりますので、ぜひ聞かせて下さい。
※ 責めているわけありません。敵を構造体で管理出来て、この処理が出来ないのが純粋に不思議なだけです。 編集済み


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

Name: kazuoni [URL]  ..ハッカー(133,363ポイント)   Date: 2010/02/03(水) 16:49   No:47579     
Title: Re:選択画面の拡張    
> 座標、色なども個別に設定できるようにするには、どのように書きかえればよいのでしょうか。
> 文字列と同じように、x座標、y座標の配列を用意し指定する、ということはできるのでしょうか。

ごめんなさい。よく現状が把握できません。
自分が言いたかったのは、

DrawString(x1,y1,str1,color1);
DrawString(x2,y2,str2,color1);
DrawString(x3,y3,str3,color1);
よりは
typedef struct
{
    int x,y,color;
    char *str;
}MenuData;

MenuData mData[3];

// 各データをmDataにセット

for(int i=0 ; i<3 ; ++i)
    DrawString(mData[i].x,mData[i].y,mData[i].str,mData[i].color);

のほうが管理しやすいですよって事です。

# 丸1などは環境依存文字ですので、なるべく避けた方が良いようです。
# 丸1などは環境依存文字ですので、なるべく避けた方が良いようです。 編集済み


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

Name: yrao  ..上級者(23,505ポイント)   Date: 2010/02/03(水) 20:20   No:47595     
Title: Re:選択画面の拡張    
>softyaさん

できないと考える理由ですか・・・
記載した選択画面の処理の意味を完全に理解できていないからだと思います。(ポインタの部分など特に)
そのため、構造体を作ったとしても、プログラムのどの部分をどのように変更すればいいのか分からないのです;


>kazuoniさん

> DrawString(x1,y1,str1,color1);
> DrawString(x2,y2,str2,color1);
> DrawString(x3,y3,str3,color1);
> よりは
> typedef struct
> {
>     int x,y,color;
>     char *str;
> }MenuData;

> MenuData mData[3];

> // 各データをmDataにセット

> for(int i=0 ; i<3 ; ++i)
>     DrawString(mData[i].x,mData[i].y,mData[i].str,mData[i].color);
> のほうが管理しやすいですよって事です。
 

自分がやりたかったのはそういうことです。
 
kazuoniさんのソースを参考に、とりあえずx座標、y座標を個別に設定できるようにしてみようと思い、
 

--strct.h--

typedef struct{
    int x,y;
}MenuData;


--define.h--

//メニュー項目の最大数
#define MENU_MAX 30

--Gv.h--

GLOBAL MenuData mData[MENU_MAX];

ここまでは書いてみたのですが、
//項目の表示
    
i=0;
while ( *str ){         
    dx = x - GetDrawFormatStringWidthToHandle( font[0] , *str ) / 2;    DrawFormatStringToHandle(dx,y,color[0],font[0],"%s",*str++);
    y += 30; 
    if( i++ > 50 )break;    //無限ループ防止
}
    



この部分をどう書きかえればよいか分かりません・・・
 
まず、赤文字にした部分ですが、x,y座標はmData[i].x,mData[i].yでそれぞれ設定するので、これらの処理はいらないですよね?

次に、青文字にした部分ですが、この部分はどのように変更すればよいでしょうか。
for(int i=0;i<MENU_MAX;i++){
・・・
}
と書きかえればよいのでしょうか?


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

Name: yrao  ..上級者(23,620ポイント)   Date: 2010/02/03(水) 20:25   No:47598     
Title: Re:選択画面の拡張    
すいません文字に色がつきません・・・

赤文字の部分というのは、

  dx = x - GetDrawFormatStringWidthToHandle( font[0] , *str ) / 2;    
    y += 30; 
    i=0;

で、青文字の部分というのは


while ( *str ){ 
 
  ・・・ 

    if( i++ > 50 )break;    //無限ループ防止
     }

です。


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

Name: kazuoni [URL]  ..ハッカー(133,468ポイント)   Date: 2010/02/03(水) 21:23   No:47600     
Title: Re:選択画面の拡張    
> x,y座標はmData[i].x,mData[i].yでそれぞれ設定するので、これらの処理はいらないですよね?
初期化の際にこれを行いますが、毎ループ求める必要はないですね。
よって、ここでは必要ありません。

> 青文字にした部分ですが、この部分はどのように変更すればよいでしょうか。 
> for(int i=0;i<MENU_MAX;i++){ 
> と書きかえればよいのでしょうか?
おっしゃる通りです。
とりあえず、試してみてください。


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

Name: yrao  ..上級者(24,211ポイント)   Date: 2010/02/03(水) 22:05   No:47601     
Title: Re:選択画面の拡張    
試してみました。

     //項目の表示
    for(int i=0;i<MENU_MAX;i++){
        DrawFormatStringToHandle(mData[i].x,mData[i].y,color[0],font[0],"%s",*str++);
    }

void menu_game(){//タイトル画面
    char *str[10]={
        {"GAME START"},
        {"SPELL PRACTICE"},
        {"REPLAY"},
        {"GALLERLY"},
        {"RESULT"},
        {"OPTION"},
        {"QUIT"}
    };
    for(int i=0;i<MENU_MAX;i++){
        mData[i].x=20+i*20;
        mData[i].y=50+i*5;
    }    
    //mData[10].x={50,55,60,65,70,75,80}
    //mData[10].y={50,70,90,110,130,150,200}
    static int menu;

    MenuDraw( 520 , FY+FMY/3 , "" , str , &menu);

    if( CheckStatePad(configpad.shot) == 1 ){
        switch(menu){
            case 0:
                func_state = 90;    //難易度選択へ
                break;
            case 1:
                func_state = 20;    //SPELL PRACTICEへ
                break;
            case 2:
                func_state = 30;    //REPLAYへ
                break;
            case 3:
                func_state = 40;    //GALLERLYへ
                break;
            case 4:
                func_state = 50;    //RESULTへ
                break;
            case 5:
                func_state = 60;    //OPTIONへ
                break;
            case 6:
                DxLib_End();
                break;
            default:
                printfDx("不明なメニューが選択されました\n");
                break;
        }
        menu=0;
    }
}
しかしこれだと、『ハンドルされていない例外が発生しました』というメッセージがでてしまいます。 それと、今の座標の設定の仕方では、座標を等間隔にずらすことしかできていません;
char *str[10]={
    {"GAME START"},
    {"SPELL PRACTICE"},
    {"REPLAY"},
    {"GALLERLY"},
    {"RESULT"},
    {"OPTION"},
    {"QUIT"}
};

のような方法で座標も設定したいのですが。。。


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

Name: softya  ..ハッカー(113,986ポイント)   Date: 2010/02/03(水) 22:26   No:47602     
Title: Re:選択画面の拡張    
とりあえず、メニューだけので動くプロジェクトを作ってみた方が良いでしょう。
良く分からないまま、いじっていても良く分からないプログラムが出来るだけです。
プログラムで将来変更したくなったときに自分で変更出来無いものが出来ても仕方がありません。ここは、じっくり機能が理解出来るようにシンプルな物を組んでみてはどうでしょう?
いや、そんな事はないと言うなら私は止めませんが。


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

Name: kazuoni [URL]  ..ハッカー(133,566ポイント)   Date: 2010/02/03(水) 22:51   No:47603     
Title: Re:選択画面の拡張    
softyaさんと同意見です。

とりあえず、これ辺が怪しいというところを。

> *str++
これって、ポインタ進めてしまって大丈夫ですか?


> それと、今の座標の設定の仕方では、座標を等間隔にずらすことしかできていません;
> のような方法
「のような方法」という方法が、どういうことかよくわかりません。
一つずつ座標設定すればよいのでは?


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

Name: conio [URL]  ..比類無きプログラマー(78,304ポイント)   Date: 2010/02/04(木) 00:10   No:47608     
Title: Re:選択画面の拡張    
>>char *str[10]={
>>    {"GAME START"},
>>    {"SPELL PRACTICE"},
>>    {"REPLAY"},
>>    {"GALLERLY"},
>>    {"RESULT"},
>>    {"OPTION"},
>>    {"QUIT"}
>>};
>>のような方法で座標も設定したいのですが。。。


↓こんな感じでしょうか?
-------------------------------------------------------------------------------
typedef struct{
    char* Name;
    int ptX;
    int ptY;
}MENU;


const MENU m[] = {    {"aiueo", 30, 0},
                    {"kakikukeko", 30, 30},
                    {"sasisuseso", 30, 60}    };
-------------------------------------------------------------------------------


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

Name: 少年X  ..ぴよぴよ(868ポイント)   Date: 2010/02/04(木) 17:45   No:47633     
Title: Re:選択画面の拡張    
僕はtitle_selectという関数を作り、中身は
int Key_count;
という変数を用意して、

if(上ボタンが押されたら){
    Key_count--;
    if(Key_count==-1)Key_count=5;
}

if(下ボタンが押されたら){
    Key_count++;
    if(Key_count==6)Key_count=0;
}

あとは、Key_countの値から座標を決めるなり、配列の番号を指定して画像を切り替えたりできると思います。
説明不足ですみません。


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

Name: yrao  ..プログラマー(25,240ポイント)   Date: 2010/02/05(金) 20:35   No:47675     
Title: Re:選択画面の拡張    
返答遅れてしまって申し訳ないです。
 
>conioさん
>少年Xさん
 
回答どうもありがとうございます。とても参考になりました。
 
>softyaさん
>kazuoniさん

確かにシンプルなプログラムから作って理解していくのが正統法で、確実な勉強法だと思います。

今現在のプログラムを理解するというのは駄目でしょうか?(すみません今回あまり時間がないのです・・・)

どうもこのプログラムはポインタについて勉強しないと理解できなさそうだと思ったので、一応、基礎的な部分だけですが勉強してきました。
 
そこで改めて書いてみたのが以下のプログラムなのですが、エラーが幾つか発生してしまっています。
改善方法だけでもアドバイスいただければ幸いです。

_________________________________________________


void MenuDraw(int x[],int y[] , char title[] , char **str , int *menu ){
    int num=0,i=0;
    int dx=0,len=0;
    char **str2 = str;
    

    
    //情報の取得
    while ( *str2 ){
        if( len < GetDrawFormatStringWidthToHandle( font[0] , *str2 ) ){
            len = GetDrawFormatStringWidthToHandle( font[0] , *str2 );//文字列の長さ所得
        }
        ++num;
        *str2++;
        

        if( i++ > 50 )    break;    //無限ループ防止
    }
    

    //選択制御
    if( CheckStatePad(configpad.up)   == 1 && *menu > 0 )        
        --*menu;//選択を一つ上に
    else if( CheckStatePad(configpad.up)   == 1 )                
        *menu = num-1;//上端なら、一番下の選択(num-1)へ
    
    if( CheckStatePad(configpad.down) == 1 && *menu < num-1 )    
        ++*menu;//選択を一つ下に
    else if( CheckStatePad(configpad.down) == 1 )                
        *menu = 0;    //下端なら、一番上の選択(0)へ

      
    
    
    SetDrawBlendMode( DX_BLENDMODE_ALPHA , 100 ) ;//四角描画用にアルファブレンド
    DrawBox( &x[num],&y[num],&x[num]+10+len,&y[num]+ 18,color[0],TRUE) ;    //選択位置の表示
    SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;//描画もどす
    
    
    i=0;
    while ( *str ){
        DrawFormatStringToHandle(&x[num],&y[num],color[0],font[0],"%s",*str++);
    if( i++ > 50 )    break;    //無限ループ防止
    }
    

}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void menu_game(){//タイトル画面
    char *str[10]={
        {"GAME START"},
        {"SPELL PRACTICE"},
        {"REPLAY"},
        {"GALLERLY"},
        {"RESULT"},
        {"OPTION"},
        {"QUIT"}
    };
    int x[10]={
        200,250,200,200,200,200,200
    };
    int y[10]={
        100,130,160,190,220,250,280
    };
    int* xP=x;
    int* yP=y;
    
    static int menu;

    MenuDraw( &xP , &yP , "" , str , &menu);

    if( CheckStatePad(configpad.shot) == 1 ){
        switch(menu){
            case 0:
                func_state = 90;    //難易度選択へ
                break;
            case 1:
                func_state = 20;    //SPELL PRACTICEへ
                break;
            case 2:
                func_state = 30;    //REPLAYへ
                break;
            case 3:
                func_state = 40;    //GALLERLYへ
                break;
            case 4:
                func_state = 50;    //RESULTへ
                break;
            case 5:
                func_state = 60;    //OPTIONへ
                break;
            case 6:
                DxLib_End();
                break;
            default:
                printfDx("不明なメニューが選択されました\n");
                break;
        }
        menu=0;
    }
}


 
_________________________________________________

*エラー内容*

DrawBox( &x[num],&y[num],&x[num]+10+len,&y[num]+ 18,color[0],TRUE) ;

DrawFormatStringToHandle(&x[num],&y[num],color[0],font[0],"%s",*str++);
の部分で、

1 番目の引数を 'int *__w64 ' から 'int' に変換できません。(新しい機能 ; ヘルプを参照)
 
というエラー
 
MenuDraw( &xP , &yP , "" , str , &menu);
の部分で、

1 番目の引数を 'int **__w64 ' から 'int []' に変換できません。(新しい機能 ; ヘルプを参照)
 
というエラー
 
 
以上3つのエラーです。

調べてみたところ、
'int *__w64 ' から 'int' に変換できません
というエラーは、データにアドレスを代入しているためにおこるらしいのですが・・・
ポインタについて勉強不足なゆえ、改善方法が分かりません;
ご教授お願いします。


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

Name: kazuoni [URL]  ..ハッカー(133,623ポイント)   Date: 2010/02/05(金) 20:59   No:47679     
Title: Re:選択画面の拡張    
引数に座標の配列を渡す必要があるかどうかは置いておいて・・・

> MenuDraw( &xP , &yP , "" , str , &menu);
ではなく
> MenuDraw( x , y , "" , str , &menu);
でコンパイルは通るのではないでしょうか。



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

Name: yrao  ..プログラマー(25,415ポイント)   Date: 2010/02/05(金) 21:13   No:47681     
Title: Re:選択画面の拡張    
kazuoniさんどうもです。
 
エラーのでていた三つの処理を、kazuoniさんがおっしゃったように変更したところ、コンパイルは通りました。
 
ですが、項目すべてが(0,0)の位置に表示されてしまいます。。。


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

Name: kazuoni [URL]  ..ハッカー(133,812ポイント)   Date: 2010/02/05(金) 21:44   No:47683     
Title: Re:選択画面の拡張    
DrawBoxの渡す引数で&x[num]...等ととしていますが、ここも修正しましたか?

まだポインタの基礎が理解できていないようです。
> 今現在のプログラムを理解する
と書いていますが、現在のプログラムが正しくないので、
理解する以前の問題になります。
時間がないとのことですが、このまま曖昧で進めば、
いずれまたポインタで躓くかと思われます。
もう一度基礎を固めることをお勧めします。
その方がここで返事を待つ時間が経り、最終的に早く開発がすすめられます。

また、0になぜなっているのかデバッガで順に追ってみてください。
VC++ならブレークポイントを張るなど。
 編集済み


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

Name: yrao  ..プログラマー(25,563ポイント)   Date: 2010/02/05(金) 21:57   No:47685     
Title: Re:選択画面の拡張    
> DrawBoxの渡す引数で&x[num]...等ととして「ますが、ここも修正しましたか?

x[num]...
の用に変更しました。
[num]がまちがっているのでしょうか?

> > 今現在のプログラムを理解する
> と書いていますが、現在のプログラムが正しくないので、
> 理解する以前の問題になります。

すみませんこれは、プログラミングの支館の選択画面のプログラムを理解する、という意味でした・・・
 

> まだポインタの基礎が理解できていないようです。
> 時間がないとのことですが、このまま曖昧で進めば、
> いずれまたポインタで躓くかと思われます。
> もう一度基礎を固めることをお勧めします。
> その方がここで返事を待つ時間が経り、最終的に早く開発がすすめられます。

分かりました。
具体的に、今回ポインタについてこの部分を理解した方が良い、という所はありますでしょうか。


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

Name: softya  ..ハッカー(115,307ポイント)   Date: 2010/02/05(金) 22:58   No:47691     
Title: Re:選択画面の拡張    
>今現在のプログラムを理解するというのは駄目でしょうか?(すみません今回あまり時間がないのです・・・) 

これは初耳ですね。課題か何かですか?
いつがリミットでしょうか?

>すみませんこれは、プログラミングの支館の選択画面のプログラムを理解する、という意味でした・・・ 

支館の何処の部分が理解できないか分からないので答えようが無いです。

>具体的に、今回ポインタについてこの部分を理解した方が良い、という所はありますでしょうか。 

ポインタを使わなくて良い所で使わない事。今回のメニュー処理で文字列ポインタ以外は必要ないと思うんですが。配列はちゃんと配列として使いましょう。
慣れないポインタや配列の引数で苦労するぐらいなら、初めから配列やポインタを引数としてなるべく使わないで済ませる様工夫をしてください。
今回ごちゃごちゃしているのは、ポインタ以前に関数や関数の引数、構造体や変数の初期化など基本的なことが分かっていない事がほぼ原因です。なので問題点は全般的と言えると思います。


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

Name: yrao  ..プログラマー(27,042ポイント)   Date: 2010/02/07(日) 00:56   No:47724     
Title: Re:選択画面の拡張    
>課題か何かですか?

課題ではないです。趣味での制作です。
 
 

>ポインタを使わなくて良い所で使わない事。今回のメニュー処理で文字列ポインタ以外は必要ないと思うんですが。配列はちゃんと配列として使いましょう。
>慣れないポインタや配列の引数で苦労するぐらいなら、初めから配列やポインタを引数としてなるべく使わないで済ませる様工夫をしてください。
>今回ごちゃごちゃしているのは、ポインタ以前に関数や関数の引数、構造体や変数の初期化など基本的なことが分かっていない事がほぼ原因です。なので問題点は全般的と言えると思います。

softyaさんのご指摘どおり、ポインタを使わずにプログラムを書いてみました。
今回は、項目も指定した座標で表示することができたのですが、やはり不具合が出てしまっています。
アドバイスよろしくお願いしますm(__)m
 
__________________________________________________

struct.h に、以下を追加
typedef struct{
  int MenuNum;
}MenuData;
GV.h に、以下を追加 GLOBAL MenuData mData; ini.cpp内、ini()に、以下を追加 memset(&mData,0,sizeof(MenuData)); control.cpp内に、以下を追加
void MenuDraw(int x[50],int y[50] , char title[] , char **str , int *menu){
    int num=0,i=0;
    int dx=0,len=0;
    char **str2 = str;
    
    
    

    
    //情報の取得
    while ( *str2 ){
        if( len < GetDrawFormatStringWidthToHandle( font[0] , *str2 ) ){
            len = GetDrawFormatStringWidthToHandle( font[0] , *str2 );//文字列の長さ所得
        }
        
        ++num;
        *str2++;
        

        if( i++ > 50 )    break;    //無限ループ防止
    }
    
    
    //選択制御
    if( CheckStatePad(configpad.up)   == 1 && *menu > 0 ){        
        --*menu;//選択を一つ上に
        mData.MenuNum--;
    }
    else if( CheckStatePad(configpad.up)   == 1 ){                
        *menu = num-1;//上端なら、一番下の選択(num-1)へ
        mData.MenuNum=num-1;
    }
    
    if( CheckStatePad(configpad.down) == 1 && *menu < num-1 ){    
        ++*menu;//選択を一つ下に
        mData.MenuNum++;
    }
    else if( CheckStatePad(configpad.down) == 1 ){                
        *menu = 0;    //下端なら、一番上の選択(0)へ
        mData.MenuNum=0;
    }
    
    
    
    if ( *str ){
        
        SetDrawBlendMode( DX_BLENDMODE_ALPHA , 100 ) ;//四角描画用にアルファブレンド
        DrawBox(x[mData.MenuNum],y[mData.MenuNum],x[mData.MenuNum]+10+len,y[mData.MenuNum]+ 18,color[0],TRUE) ;    //選択位置の表示
        SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;//描画もどす
    }
    
    
    
    i=0;
    while ( *str ){
        DrawFormatStringToHandle(x[i],y[i],color[0],font[0],"%s",*str++);
        
        
    if( i++ > 50 )    break;    //無限ループ防止
    }
    

}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void menu_game(){//タイトル画面
    char *str[10]={
        {"GAME START"},
        {"SPELL PRACTICE"},
        {"REPLAY"},
        {"GALLERLY"},
        {"RESULT"},
        {"OPTION"},
        {"QUIT"}
    };
    int x[10]={
        100,110,122,136,152,170,190
    };
    int y[10]={
        200,230,260,290,320,350,380
    };
    
    static int menu;

    MenuDraw( x , y , "" , str , &menu);

    if( CheckStatePad(configpad.shot) == 1 ){
        switch(menu){
            case 0:
                func_state = 90;    //難易度選択へ
                break;
            case 1:
                func_state = 20;    //SPELL PRACTICEへ
                break;
            case 2:
                func_state = 30;    //REPLAYへ
                break;
            case 3:
                func_state = 40;    //GALLERLYへ
                break;
            case 4:
                func_state = 50;    //RESULTへ
                break;
            case 5:
                func_state = 60;    //OPTIONへ
                break;
            case 6:
                DxLib_End();
                break;
            default:
                printfDx("不明なメニューが選択されました\n");
                break;
        }
        menu=0;
    }
}

以上のように書いてみたのですが、mData.MenuNumの値が毎回リセットされないので、例えば、二つ目の項目(SPELL PRACTICE)を選択した場合、次の画面、つまりスペルプラクティスの選択画面では、最初から二つ目の項目にカーソルが合っている状態になってしまいます。また、それによって、選択項目の文字列と実際の結果もずれてしまいます。
case 0:
    mData.MenuNum=0;
         func_state = 90;    //難易度選択へ
    break;
case 1:
    mData.MenuNum=0;
         func_state = 20;    //SPELL PRACTICEへ
    break;
・
・
・
・
・


のようにしたところ、解決はしたのですが、すべての条件分木でこの処理を書かなくてはならないのは効率が悪い気がします・・・



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

Name: kazuoni [URL]  ..ハッカー(133,948ポイント)   Date: 2010/02/07(日) 02:18   No:47725     
Title: Re:選択画面の拡張    
> 二つ目の項目(SPELL PRACTICE)を選択した場合、次の画面、
>つまりスペルプラクティスの選択画面では、
>最初から二つ目の項目にカーソルが合っている状態になってしまいます。

menu=0;
の下に
mData.MenuNum=0;
と付け加えればよいだけの様に思いますが。

> 効率が悪い気がします・・・ 
それをいうと、menuとmData.MenuNumってなにが違うの?
そもそもmDataって必要なの?何のための構造体なの?
などという考え方も出てきてしまうのですが。。


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



Name: 少年X  ..かけだし(1,656ポイント)   Date: 2010/02/05(金) 18:22   No:47669       
Title: 三角関数のテーブル化    
三角関数のテーブル化について悩んでいます。
for(i=0;i<360;i++)Sin[i]=sin(PI/180*i);  //cosの計算時に[]内を+90する
のようにしましたが問題点として、

1、Sin[i]を呼ぶときにiは整数なので、ラジアンの場合(実数)困る。具体的には龍神録では角度をatan2で求めて
  いるのでうまくいかない。atan2に180/πをかけてint型にしたけれど、あまり良くない・・・
2、atan2のテーブル化がわからない

簡単にまとめると配列よりもポインタでやる方がいいのだけれど、やり方がわかりません。教えてください。
Googleで調べてもよくわかりませんでした・・・


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


Name: kazuoni [URL]  ..ハッカー(133,594ポイント)   Date: 2010/02/05(金) 20:51   No:47678     
Title: Re:三角関数のテーブル化    
> atan2に180/πをかけてint型にしたけれど、あまり良くない・・・ 

あまりよくないとは?
満足いかないということですか?
正当な方法かとは思いますが。


> atan2のテーブル化
sinのテーブル化同様にすればよいのでは?
っといっても、|±PI/2|になるのは無限大なので、ある値を超えたら
PI/2とするように調節する(有限長でテーブル化する)事が必要でしょうね。

> 配列よりもポインタでやる方がいいのだけれど
この一文がとても不可解です。
もう少し追記をよろしくお願いします。


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

Name: Justy  ..伝説なるハッカー(498,329ポイント)   Date: 2010/02/05(金) 22:02   No:47686     
Title: Re:三角関数のテーブル化    
>ラジアンの場合(実数)困る
 ラジアンな角度をX倍してから整数化すればいいのでは?
 Xが幾つなのは、テーブルがどれだけあるのかで変わってきますが。


 あと、今の段階で言っても詮無いことですが、工夫すればテーブルは1周360度分ではなく 
90度分だけあれば足りますよ。


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

Name: 少年X  ..かけだし(1,690ポイント)   Date: 2010/02/05(金) 22:25   No:47688     
Title: Re:三角関数のテーブル化    
過去記事でも同じなおようがあり、ある程度解決しました。

でも、いろいろと修正する点があるので、もしわかんなかったら質問します。


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

Name: 少年X  ..かけだし(1,713ポイント)   Date: 2010/02/06(土) 22:05   No:47721 解決!     
Title: Re:三角関数のテーブル化    
先人の知恵を持って解決しました。
ありがとうございました。


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



Name: ぬっち  ..中級者(9,895ポイント)   Date: 2010/02/05(金) 21:04   No:47680       
Title: 実行速度とコード重複の関係について    
こんばんは。
現在作っているDirectXライブラリで悩んでいることがあるので質問させていただきます。

例えば、読み込んだ画像をVector2で表した特定の場所に表示する以下のような関数があったとします。
Vector2は2次元ベクトルを表す自作クラスです。
void drawImage( Vector2& vPos )
また他には画像を拡大縮小・回転・拡大縮小+回転を行ってから表示させるような関数があるとします。 (実際には、任意軸周りの回転などの変形も作成する予定です)
void drawScaleImage( Vector2& vPos, Vector2& vScale )
void drawRotateImage( Vector2& vPos, float angle )
void drawScaleRotateImage( Vector2& vPos, Vector2& vScale, float angle )
このような関数が例えばImageというクラスのメンバ関数であったとします。
class Image
{
    ...
public:
    drawImage(...);
    drawScaleImage(...);
    drawRotateImage(...);
    drawScaleRotateImage(...);
};
この場合、それぞれのメンバ関数の定義は特定の部分を除き、互いにコードが重複してしまい、重複した部分を変更するとき全てのメンバ関数の定義を変更しなくてはならなくメンテナンスが大変です。 これに対してdrawImageというメンバ関数だけを考え、その引数に列挙型(TransformMethod)を与えて変形の種類を決めるという方法を考えました。 例えば、
void drawImage( Vector2& vPos, Vector2& vScale, float angle, TransformMethod tm )
といった感じです。 使い方は、拡大縮小なら
drawImage( vP, vS, 0, TRANSFORM_SCALING )
回転なら
drawImage( vP, vS, 0.3f, TRANSFORM_ROTATION )

といった感じです。
これだとメンテナンスもしやすく、コードの重複も起こらないのですが、引数の数が多く関数の内部で余計な処理を行う必要があり実行速度が遅くなってしまいます。

現在は前者の方法を用いているのですが、後のことを考えると後者にしたほうがよいのか迷ってます。

皆さんだったらどちらを選びますか?
また選んだ理由は何でしょうか?
それとも何かよりよい方法があるのでしょうか?
よろしくお願いします。


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


Name: Justy  ..伝説なるハッカー(498,206ポイント)   Date: 2010/02/05(金) 21:23   No:47682     
Title: Re:実行速度とコード重複の関係について    
>互いにコードが重複してしまい
 その重複した部分を別の関数に纏めるなど、上手く共通化できないのでしょうか?


>引数の数が多く関数の内部で余計な処理を行う必要があり実行速度が遅くなってしまいます
 引数の件はともかく、実行速度がおそくなるというのはどの程度遅くなるのでしょうか?
 そんなに速度が気になるほど複雑な処理をしている、ということでしょうか?


>それとも何かよりよい方法があるのでしょうか?
 個人的には位置や角度、スケール情報はメンバ関数から設定しメンバ変数に持たせて
drawメソッド一発で表示できた方が何かと楽な気がしますよ。
 ニュアンス的には Imageクラスというよりかは Spriteクラス的なものですね。


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

Name: ぬっち  ..中級者(10,150ポイント)   Date: 2010/02/05(金) 21:53   No:47684     
Title: Re:実行速度とコード重複の関係について    
Justyさん返信ありがとうございます。

>共通化
描画開始、描画終了の処理の間に変形処理を行っているので、出来るとすれば描画開始の処理をdrawBegin、描画終了の処理をdrawEndといった関数を用意して、その間に変形処理を記述するという感じには出来そうです。

>実行速度と引数
受け取った列挙型の値をswitchで判定する予定です。
何度も呼ばれる関数なので実行速度にどのくらい影響を与えるのか気になってしまったので・・・。

>よりよい方法
そうですね、正しくはSpriteクラスですね。
メンバ変数に持たせる方法ですか・・・。
確かにそうすればいろいろと便利そうですね。
参考になります^^;

とりあえず重複しているところを関数にまとめてみようと思います。


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

Name: Justy  ..伝説なるハッカー(498,605ポイント)   Date: 2010/02/05(金) 22:18   No:47687     
Title: Re:実行速度とコード重複の関係について    
>switchで判定する予定です。 
>何度も呼ばれる関数
 実際のところ見てみないと正確なところはわかりませんが、一般的に想像できる範囲内の処理であれば
多分そんなに気にすることはないかと思います。

 むしろ描画に絡む DirectX内の処理やレンダリング処理そのものの方が処理負荷が高そうですし。


>メンバ変数に持たせる方法ですか・・・
 位置、角度などのパラメータを直接メンバに持ってもいいですし、行列を持つだけにして移動・回転などのメソッドが呼ばれる度に行列を更新していく方式でもいいですね。


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

Name: ぬっち  ..中級者(10,227ポイント)   Date: 2010/02/06(土) 20:27   No:47720 解決!     
Title: Re:実行速度とコード重複の関係について    
やはりswitchのやり方だと無駄に引数の数が結構多くなってしまいますね。
簡単に考えただけでも、回転軸・回転角・位置・拡大倍率・・・
普通に表示したいだけでも位置以外の変数を指定するのは面倒ですね。
そう考えるとメンバ変数に持たせるほうが一番楽なのかもしれませんね。
いろいろ参考になりました。ありがとうございます。


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



Name: サンタクロース  ..入門者(3,759ポイント)   Date: 2010/02/06(土) 18:05   No:47716       
Title: 無題    
こんばんわ。今、風神録のにとりの「光り輝く水底のトラウマ」という弾幕を作っています。
sin波が左右から迫ってくるというものです。
今のところは左からのみを実装したのですが、どうも垂直方向の弾の変化がないのです

void boss_shot_bulletH011(){//「光り輝く水底のトラウマ」
#define TM011 400
    int n,k,k2,cnt,state,t0=boss_shot.cnt%TM011;
    float angle;
    angle=0;
    
    for(n=0;n<8;n++){
        if(t0%10==0){
            if((k=search_boss_shot())!=-1){
                    boss_shot.bullet[k].knd       =2;
                    boss_shot.bullet[k].cnt       =0;
                    boss_shot.bullet[k].angle     =0;
                    boss_shot.bullet[k].flag      =1;
                    boss_shot.bullet[k].x         =0;
                    boss_shot.bullet[k].y         =0;
                    boss_shot.bullet[k].x0        =0-n*15;
                    boss_shot.bullet[k].y0        =30+n*30;
                    boss_shot.bullet[k].col       =6;
                    boss_shot.bullet[k].spd       =0;
                    boss_shot.bullet[k].till      =100;
                    boss_shot.bullet[k].state     =1;
                    boss_shot.bullet[k].eff_detail=1;
            }    
    se_flag[0]=1;
        }
    }
    
    if(t0%10==0){//
         for(n=0;n<8;n++){ 
            if((k=search_boss_shot())!=-1){
                  boss_shot.bullet[k].knd       =2;
                  boss_shot.bullet[k].cnt       =0;            
                  boss_shot.bullet[k].angle     =0;
                  boss_shot.bullet[k].flag      =1;
                  boss_shot.bullet[k].x         =0;
                  boss_shot.bullet[k].y         =0;
                  boss_shot.bullet[k].x0        =0-n*15;
                  boss_shot.bullet[k].y0        =30+n*30;
                  boss_shot.bullet[k].col       =6;
                  boss_shot.bullet[k].spd       =0;    
                  boss_shot.bullet[k].till      =100;
                  boss_shot.bullet[k].state     =-1;
                  boss_shot.bullet[k].eff_detail=1;
            }
        se_flag[0]=1;
        }
    }
    
    
    for(k2=0;k2<BOSS_BULLET_MAX;k2++){
    state=boss_shot.bullet[k2].state;
    
        if(boss_shot.bullet[k2].flag>0){
            boss_shot.bullet[k2].x=boss_shot.bullet[k2].x0+cosf(angle)*(boss_shot.bullet[k2].cnt*1.0)+cosf(angle+state*PI/2)*sinf(boss_shot.bullet[k2].cnt*0.02)*20;           
            boss_shot.bullet[k2].y=boss_shot.bullet[k2].y0+sinf(angle)*(boss_shot.bullet[k2].cnt*1.0)+sinf(angle+state*PI/2)*sinf(boss_shot.bullet[k2].cnt*0.02)*20;          
        }
    }
}
        
    
 編集済み


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


Name: サンタクロース  ..入門者(3,786ポイント)   Date: 2010/02/06(土) 18:35   No:47717 解決!     
Title: Re:無題    
ごめんなさい。とてもくだらないミスをしていたようです
 boss_shot.bullet[k].state     =-1が抜けていました。


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

Name: Tatu  ..上級者(24,516ポイント)   Date: 2010/02/06(土) 20:14   No:47719     
Title: Re:無題    
「光り輝く水底のトラウマ」をみて弾幕関数を作ってみました。

/*
弾発射関数
way個のknd番目の種類のcol番目の色の弾を座標(x,y)からb_angleの方向を中心に発射角度をそれぞれd_angleだけずらし、
(ただし、偶数弾などb_angleの方向に撃ちたくないときはb_angleの値をd_angle/2.0だけ大きくする)
angle方向に速度をspd,vxの値をvx,vyの値をvyに(vx,vyはそのままでは機能しない),
状態をstateにしてとばす。この弾はtillまで画面外に出ても消えず、
effが1ならば加算ブレンドして描画され、sflagが1ならば発射音がなる。
*/
void boss_bullet_on(int way,int knd,int col,int cnt,double x,double y,double b_angle,double d_angle,double spd,double vx,double vy,int state,int till,int eff=0,int sflag=1){
    int i=0,k;
    for(i=0;i<way;i++){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].flag  = 1;
            boss_shot.bullet[k].knd   = knd;//弾の種類
            if(knd==7) boss_shot.bullet[k].kaiten=1;
            else boss_shot.bullet[k].kaiten=0;
            boss_shot.bullet[k].col   = col;//弾の色
            boss_shot.bullet[k].cnt   = cnt;
            boss_shot.bullet[k].x     = x;//座標
            boss_shot.bullet[k].y     = y;
            boss_shot.bullet[k].angle = b_angle+d_angle*(i - way/2);//角度:bが基準、dが間隔
            boss_shot.bullet[k].spd   = spd;//angle方向のスピード
            boss_shot.bullet[k].vx    = vx;//x方向の速度
            boss_shot.bullet[k].vy    = vy;//y方向の速度
            boss_shot.bullet[k].state = state;//弾の状態
            boss_shot.bullet[k].till  = till;//弾が画面外に出ても消えない時間
            boss_shot.bullet[k].eff      = eff;
            if(sflag==1)se_flag[0]=1;
        }
    }
}

void boss_shot_bulletT125(){
    int i,t=boss_shot.cnt%600;
    double y=boss_shot.base_angle[0];//正弦波状に動く弾の発射位置調整用

    if(t==0){
        boss_shot.base_angle[0]=rang(15);
    }

    if(t>=60 && t<540 && t%20==0){
        for(i=0;i<8;i++){
            boss_bullet_on(1,1,1,0,-60*i,y+60*i,0,0,1,0,0,1,1200);
            boss_bullet_on(1,1,1,0,FMX+15+60*i,y+30+60*i,PI,0,1,0,0,1,1200);
            boss_bullet_on(1,1,1,0,-60*i,y+60*i,0,0,1,0,0,2,1200);
            boss_bullet_on(1,1,1,0,FMX+15+60*i,y+30+60*i,PI,0,1,0,0,2,1200);
        }        
    }

    if(t==440){
        move_boss_pos(64,64,FMX-64,150,FMX/3.0,60);
    }
    if(t>=500 && t%10==0){
        boss_bullet_on(9,1,1,0,boss.x,boss.y,bossatan2(),PI/11,2,0,0,0,0);
    }

    for(i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet[i].flag==1){
            switch(boss_shot.bullet[i].state){
                case 1:
                    boss_shot.bullet[i].y+=PI2/13*sin(boss_shot.bullet[i].cnt*PI2/360.0);
                    break;
                case 2:
                    boss_shot.bullet[i].y-=PI2/13*sin(boss_shot.bullet[i].cnt*PI2/360.0);
                    break;
            }
        }
    }
}
 編集済み


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



Name: エイン  ..ぴよぴよ(640ポイント)   Date: 2010/02/06(土) 16:47   No:47715       
Title: かなり初歩で躓いています    
初めまして、C言語学んで半年なんですが無謀にもゲームを作ってみたいなと思いまして作りはじめました
1] 質問文
 [1.1] 自分が今行いたい事は何か
勉強としてまず龍神録プログラミングの館のプログラムを作っているのですがうまくいかないのでどうすればよいのか
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
11章のところでできなくて詰まっています。下のエラー表示からfunction.hに異常があると思ったのですが
//enemy.cpp
    GLOBAL void enemy_main();

//char.cpp
    GLOBAL void calc_ch();
    GLOBAL void ch_move();

//graph.cpp
    //描画メイン
    GLOBAL void graph_main();

//ini.cpp
    GLOBAL void first_ini();
    GLOBAL void ini();

//key.cpp
    //現在のキー入力処理を行う
    GLOBAL int GetHitKeyStateAll_2();
    //受け取ったキー番号の現在の入力状態を返す
    GLOBAL int CheckStateKey(unsigned char Handle);

    //現在のパッド入力処理を行う関数
    GLOBAL void GetHitPadStateAll();
    //受け取ったパッド番号の現在の入力状態を返す
    GLOBAL int CheckStatePad(unsigned int Handle);

//laod.cpp
    //データのロード
    GLOBAL void load();
    GLOBAL void load_story();


[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
こんなのが出て起動できません
 ビルド開始: プロジェクト: RyuJin, 構成: Debug Win32 ------
1>コンパイルしています...
1>cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。
1>char.cpp
1>d:\dxlib_vc\project\project\1章\mydat\include\function.h(2) : error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。
1>d:\dxlib_vc\project\project\1章\mydat\include\function.h(2) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>d:\dxlib_vc\project\project\1章\mydat\include\function.h(5) : error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。
1>d:\dxlib_vc\project\project\1章\mydat\include\function.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>d:\dxlib_vc\project\project\1章\mydat\include\function.h(5) : error C2086: 'int GLOBAL' : 再定義されました。

 [1.4] 今何がわからないのか、知りたいのか
エラーが出たときの改善策、エクセルのCSVの意味
      
[2] 環境  
 [2.1] OS : WindowsXP
 [2.2] コンパイラ名 : VC++ 2008EE
[3] その他 
 学校でならったC言語は本当に基礎的なことであまりゲームプログラミングに役に立ってないかんじです
ほぼ度素人といっても大差は無い感じです


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


Name: MNS  ..プログラマー(30,664ポイント)   Date: 2010/02/06(土) 18:37   No:47718     
Title: Re:かなり初歩で躓いています    
"GLOBAL"(定数でしょうか?)は定義されていますか?

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



Name: あいろん  ..ぴよぴよ(250ポイント)   Date: 2010/02/02(火) 23:28   No:47555       
Title: 初めてのゲームプログラミング    
はじめまして、私は大学でCとC++を一年間学んできました
分からないところや躓いた所は、別途本を買って復習をしたりして何とか分かる程度までは勉強してきました

そろそろゲームプログラミングができないかと思いこのサイトを参考にさせてもらっています
一応目標は横シューが作りたいなとは思っています
勉強の仕方としましては、ゲームプログラミングの館で上半分を見てアルゴリズムを考えCに書き
実際に動くかチェックして詰まれば下のソースを見るという形で勉強しているのですが
まだまだ自分自身の脳みそが硬い為か中々きちんと動くプログラムができません
私自身はアルゴリズム等を考えたりするのが苦手で、Cもまだまだおぼつかないところがありますので
やはりゲームプログラミングをするよりはCやC++の復習をした方がいいのでしょうか?
一応自作関数の作り方(たまに引数が分からなくなる)や、多重配列の使い方、ポインタの基本、構造体
あたりは使えるように抑えてありますが、それをいっぺんに使うと頭がパンクしてしまったりしますw


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


Name: ちゃお  ..入門者(3,825ポイント)   Date: 2010/02/03(水) 00:32   No:47556     
Title: Re:初めてのゲームプログラミング    
ゲームプログラミングしながら躓いたら、C/C++の参考書籍を読んで、理解を深めるでいいんじゃないでしょうか?
C/C++をマスターしたら、ゲームプログラミングをするっていう流れ出なくても、同時並行で学んでいけばいいと思います。

ゲームプログラミングの中で、具体的にアルゴリズムを組んだり、ここのサイトのアルゴリズムを理解することで、C/C++の理解がさらに深まったり、C/C++の書籍で学んだことの具体的な使い道を覚えていくと思います。

ポインタや構造体などいっぺんに使って頭がパンクするってことは、まだまだ使い慣れていない証拠だと思います。なので、ここのサイトのゲームプログラミングの中で、ソースを一つ一つ読み解いていく訓練をしていけばいいと思います。

ちなみにここのサイトはC++言語のクラスやオブジェクトを扱ったプログラムはしておらず、C言語のみによるゲームプログラミングを解説してくれています。


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

Name: Ma  ..熟練のプログラマー(43,450ポイント)   Date: 2010/02/03(水) 04:57   No:47562     
Title: Re:初めてのゲームプログラミング    
同意です。
分からないところがでたら、調べる。それで十分だと思います。
特にDXライブラリを使ってシューティングを作るなら三角関数の基本さえわかっていればできちゃいます。

つまり、かちかちになって勉強してから実践するべきだなんて考えなくて良いとおもいます。
中には小学生からや中学生からシューティングゲームを作るなんて人もよくみかけます。

そりゃ、効率は言語を把握している人より劣りますが、行き詰ればそのつど調べるか聞けばいいので、そのせいで完成できないなんてことはないとおもいます。


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

Name: dic  ..熟練のプログラマー(50,759ポイント)   Date: 2010/02/03(水) 05:42   No:47564     
Title: Re:初めてのゲームプログラミング    
月並みな回答ですいませんで

どこまでできたのか?
何ができないのか?
を明確にしていけば
それを解決していくと作成は容易であります


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

Name: あいろん  ..ぴよぴよ(491ポイント)   Date: 2010/02/03(水) 17:24   No:47587     
Title: Re:初めてのゲームプログラミング    
どうもありがとうございます。
皆さんの言葉を励みに頑張りたいと思います。
ただ私はアルゴリズムの考え方が非常に下手で、例えば
DrawGraph( a, b , haikei , FALSE );//背景を表示
a=a-2;if(a<-640)a=0;//背景のスクロール
 DrawGraph( c, d , haikei2 , TRUE );//背景2の表示 
 c=c-2;if(c<0)c=640;//背景2のスクロール
繰り返しで自動スクロール画面を作ってみましたが
龍神録さんのサンプルプログラムと全然違うので、もしかしたら
自分のスクロールプログラムは後々問題になるのではないかなどと考えてしまいます。
最初の頃はあまりそういうのに気にしない方がいいんでしょうか?


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

Name: Ma  ..熟練のプログラマー(44,068ポイント)   Date: 2010/02/04(木) 11:26   No:47612     
Title: Re:初めてのゲームプログラミング    
最初に質問に答えると、気にしなくて良いです。


まずひとつ、プログラミングは十人十色だと私は思います。
同じ処理をするのにもいくつもの方法があり、正しい答えというのはあまりないとおもいます。
(しいて言えば処理時間がはやいのがベストぐらいですかね。)

だから、他人とプログラムが違っても自分が意図したとおりに動けば、それでいいとおもいます。


それからもうひとつの点を一言で言えば、あなたがどのような事をしたいのか明確に記されていないので、
コードがあっている間違っているとは答えられません。
あなたが、その結果に満足しているのならば、それでOKじゃないでしょうか?

ただ、見せていただいた擬似プログラムは、目的を勝手に想像すれば、いろいろ指摘できる可能性があります。
(チップ化しろだとか、大きい背景はできるだけ避けろだとか。)

 結論
机上の空論では困る。
どう改良したいのか自分で完成図を固めてから相談するといいとおもう。
すすめているうちに今のままでは何ができなくて、何をしたいのかが見えてくると思います。


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

Name: softya  ..ハッカー(114,747ポイント)   Date: 2010/02/04(木) 11:50   No:47613     
Title: Re:初めてのゲームプログラミング    
>自分のスクロールプログラムは後々問題になるのではないかなどと考えてしまいます。
>最初の頃はあまりそういうのに気にしない方がいいんでしょうか?

とりあえず、やるだけやってみる。破綻したら、分からなくなったところからやり直せば良いです。
2回目に作ったものは、前に作ったものよりも確実に良くなります。
金をもらってたり、期限のあるものじゃないので、何度でもやり直しましょう。
色々無茶をやってつまずいた方が学ぶものがあります。ただし、失敗したらその原因はちゃんと追求しましょう。
なんとなく動いてて、予定していたイメージと違うんだけど、原因が良く分からないけど、まぁ良いかって放置するのが一番良くないですね。

>私自身はアルゴリズム等を考えたりするのが苦手で、Cもまだまだおぼつかないところがありますので
>やはりゲームプログラミングをするよりはCやC++の復習をした方がいいのでしょうか? 

アルゴリズムは慣れもあります。これは作って慣れのが一番ですね。
基本的なアルゴリズムは知っていると何かと便利なので、ゲームで使われるアルゴリズムを含めてサイトをご紹介しておきます。一般的なアルゴリズムは大学でも学ばれると思うんですけどね。

http://www2.starcat.ne.jp/~fussy/algo/index.htm
http://www.geocities.jp/ky_webid/algorithm/index.html
http://www.codereading.com/algo_and_ds/
http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?FrontPage
http://www.ic-net.or.jp/home/takaken/pz/index.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20070109/258278/?ST=develop
http://www5c.biglobe.ne.jp/~ecb/algorithm/algorithm00.html
http://d.hatena.ne.jp/seikenn/20090627/1246028707
http://s-endo.skr.jp/gameprog_analysis.html

ちなみにゲームアルゴリズムを考えるのに、一番私が良く使うのは紙です。
紙に図を書いて、色々あたり判定やら動きやら数式やらを書いてみるってを良くやります。
それで、まとまったらプログラムしてみて、ダメだったらまた紙に戻るっての繰り返します。
まぁ、人それぞれなんで一番良い方法を見つけてください。 編集済み


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

Name: Mikan [URL]  ..中級者(10,716ポイント)   Date: 2010/02/04(木) 12:37   No:47614     
Title: Re:初めてのゲームプログラミング    
自分の作りたいゲームやソフトを作っていけば自然と身に付きますよ。
次作るときに、自分の作ったアルゴリズムを参考にするなんてよくありますし。

自分の作ったアルゴリズムと他の人の作ったアルゴリズムを比較するとさらに勉強になります。
ただ、人の作ったアルゴリズムをコピペするだけだと、アルゴリズムは身に付きませんので、
作りたいものを作って、良いところは採用し悪いところは改良を重ねていけばいいものできますよ。

作ってみてどうしてもわからなければ、また質問すればいいだけです。
基礎学習を長く続けてもあんまりおもしろくないですからね^^;

結局のところ、試行錯誤の繰り返しなんですが
とりあえず作りたいものを作ってみてはどうでしょうか?


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

Name: あいろん  ..ぴよぴよ(613ポイント)   Date: 2010/02/06(土) 00:48   No:47698 解決!     
Title: Re:初めてのゲームプログラミング    
ゲームプログラミングを通して実践的なアルゴリズムやプログラムの練習などに
役立てていきたいかなと思います。
分からない時や、詰まったときには、こちらの方にまたご迷惑になるかもしれませんが
そのときはよろしくお願いします。
皆さん本当にありがとうございました。

>一般的なアルゴリズムは大学でも学ばれると思うんですけどね
大学で学んだアルゴリズムが即座に応用できないほど硬い頭なんですw
ドモルガンの法則とか何に使うんだろうなぁとか思って授業聞いてました


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

Name: softya  ..ハッカー(115,376ポイント)   Date: 2010/02/06(土) 11:25   No:47713     
Title: Re:初めてのゲームプログラミング    
>ドモルガンの法則とか何に使うんだろうなぁとか思って授業聞いてました
http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20020809/1/
ってif分の条件式を書く時に大事ですね。




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

Name: kazuoni [URL]  ..ハッカー(133,937ポイント)   Date: 2010/02/06(土) 11:46   No:47714     
Title: Re:初めてのゲームプログラミング    
最近思うんですけど、やはり授業って結構大事ですよね。
論理演算はもちろん、数値解析や符号化等、

「こんなもん卓上の議論に過ぎないでしょ・・・」

なんて初めは思っていた(この時点で甘い)のですが、
これが、実際にプログラムに組み込んでみると

「これすごいな・・・。」

と最近改めて実感しています。
やはり先人の知恵とはすごいものです。


っという脱線でした。失礼しました^^;


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



Name:  ..入門者(3,564ポイント)   Date: 2010/01/25(月) 19:20   No:47035       
Title: 【雑談】ゲーム作りました。    
5分程度で終わるミニゲームを作りました。
よければプレイしてみてください。
感想など、お待ちしてます。

http://www1.axfc.net/uploader/He/so/262244
キーワード【yamanaka】


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


Name: ベリ工  ..入門者(2,619ポイント)   Date: 2010/01/25(月) 21:07   No:47038     
Title: Re:【雑談】ゲーム作りました。    
レベル1とレベル5をやりました。
ミニゲーム的な感じですね。私は好きですよ。

要望言うなら

・ジャンプ中にジャンプできる(これは仕様っぽいですが)
・敵キャラが欲しい
・フルスクリーンモードが欲しい
・ちょっといぢわるしてbesttime.datファイルの中身をいじると
 ベストタイムがぐちゃぐちゃに(笑

でも、こうゆう感じからゲームを発展させると良いものに仕上がってくると
思いますよ。がんばってください。


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

Name:  ..入門者(3,382ポイント)   Date: 2010/01/25(月) 22:13   No:47039     
Title: Re:【雑談】ゲーム作りました。    
ベリ工さん、プレイありがとうございます!

説明が無かったですね、すみません。
ジャンプし放題なのは仕様となっております。

敵キャラはいたほうが幅が広がりそうですね。
フルスクリーンモードは私のPCではうまく表示できなかったので
とりあえずウインドウモードで我慢してます。

besttime.datなどのファイルの暗号化は勉強しておらず妥協した
ところではありますが、しっかりと学んでおいたほうがよさそうですね。

今後の良い参考になりました。
感謝です!


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

Name: mnkr  ..入門者(3,526ポイント)   Date: 2010/01/25(月) 23:10   No:47041     
Title: Re:【雑談】ゲーム作りました。    
プレイしましたー
なんというか。。。よく出来てるなぁと。

あまり突っ込みどころが無いなぁ。。。
そうですねー。。。
いくつかのコインを上下か左右に少し動かしてみてはどうでしょう?
あとは通り抜けできるブロックの壁とか、一定時間毎に消えたり出たりする壁とかコインとか。。。


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

Name: Tatu  ..上級者(22,815ポイント)   Date: 2010/01/25(月) 23:39   No:47043     
Title: Re:【雑談】ゲーム作りました。    
プレイしてみました。
記録は
00:14:75
00:17:59
00:43:45
00:43:50
00:54:67
です。

タイトル画面のメッセージの種類がたくさんありますね。

宮さんの記録はどれくらいですか?


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

Name: SooA [URL]  ..プログラマー(27,991ポイント)   Date: 2010/01/26(火) 09:13   No:47054     
Title: Re:【雑談】ゲーム作りました。    
気になった点を二点。

其の一
タイムアタックがメイン?だと思うので、
ステージ選択後、カウントを入れると良いかも、

其の二
ぱっと見で実行ファイルが何処にあるのか分かりにくい。
下記のような構成で、なるべく親フォルダ等の上部フォルダに
実行ファイルがあった方が良いのではないかと思います。
<yamanaka>
 └ <game>
    ├ action_test.exe
    ├ 使用素材.txt
    └ <data>
      ├ <map>
      ├ <music>
      ├ <pic>
      └ <sound>



タイトルが凝ってて良い感じ、
おみくじっぽいコメントもいいですね。


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

Name: 通りすがり  ..上級者(18,936ポイント)   Date: 2010/01/26(火) 16:22   No:47082     
Title: Re:【雑談】ゲーム作りました。    
やらせていただきました。
もしも、このgraphicがデフォならば、
カウンタの色か、壁の色を変えたほうがいいですね。
壁の色とカウンタの色が被って見づらかったので。
あとは、何らかのアニメーションはほしいですね。


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

Name: ひよこ  ..比類無きプログラマー(78,465ポイント)   Date: 2010/01/26(火) 17:16   No:47088     
Title: Re:【雑談】ゲーム作りました。    
遊んでみました。
よく出きててルールもシンプルでいいと思います。
タイトルが独特でいいですね。
制作お疲れ様でした。


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

Name: dic  ..熟練のプログラマー(49,186ポイント)   Date: 2010/01/26(火) 17:41   No:47090     
Title: Re:【雑談】ゲーム作りました。    
やらせてもらいました

ジャンプ操作の調整が難しいですね
 編集済み


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

Name: sizuma [URL]  ..プログラマー(33,629ポイント)   Date: 2010/01/26(火) 17:53   No:47091     
Title: Re:【雑談】ゲーム作りました。    
プレイさせていただきました。
やまなか君って誰ですか?(笑

僕が下手くそだからって理由もありますけど、爽快感がないかな?と思いました
はまる、っていうより、イライラする感じでした。

ちょっとしたミニゲーム、ということだったのですが、タイトルきれいでいいと思います。


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

Name:  ..入門者(3,740ポイント)   Date: 2010/01/26(火) 18:29   No:47095     
Title: Re:【雑談】ゲーム作りました。    
みなさん、遊んでいただいてありがとうございます。

mnkrさん、
点滅する壁とコインって面白そうですね。
コインが移動するのもタイムアタックにいい影響を与えそうです。
アイデアいただきます。

Tatuさん、
全面負けてましたw
くやしかったので頑張ってベストを更新しました。
00:13:63
00:18:45
00:41:16
00:40:93
00:56:74
以上がその結果です。

SooAさん、
なるほど納得です。
実行ファイルは分かりやすいところに置き直したいと思います。
それと、スタート前のカウントダウンもタイムアタックにはつきものですね。

通りすがりさん、
確かにカウンタが見えないのは考え物ですね。修正します!
アニメーション、いいですね。アニメさせる良い方法が思いつきませんが
検討させていただきます。

ひよこさん、
ねぎらいの言葉ありがとうございます。
こんなショボゲーですが、製作期間が長かったので救われました。


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

Name:  ..入門者(3,893ポイント)   Date: 2010/01/26(火) 18:41   No:47096     
Title: Re:【雑談】ゲーム作りました。    
dicさん、
マリオみたいに細かいジャンプが出来たほうが良かったかもですね。

sizumaさん、
タイトルは何も閃きが来なかったので、いいかげんに名づけました(爆
「爽快感がない」「イライラする」というのはアクションゲームではマズいかもしれませんね。
何か打開策を考えてみます。

お二人ともありがとうございます!


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

Name: Tatu  ..上級者(22,921ポイント)   Date: 2010/01/26(火) 22:40   No:47110     
Title: Re:【雑談】ゲーム作りました。    
>>記録更新
私も更新しました。
ステージ3はルートのとり方でかなりタイムが変わりますね。

00:12:90
00:15:72
00:33:39
00:37:78
00:51:33

ワープがあるとルート選択の幅がもっと広がるのではないでしょうか。


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

Name: shilfia  ..入門者(4,231ポイント)   Date: 2010/01/26(火) 23:02   No:47112     
Title: Re:【雑談】ゲーム作りました。    
プレイしました。
シンプルでちょっと遊ぶのに良いですね。
遊んでて楽しかったです。
今後いろいろ発展させられそうですね。
そして自分のベストタイムがしょぼすぎるっ・・・!
あとBGMの選択センスが個人的に好きです。

>イライラ
1枚の孤立したコインを取るのにやや集中力がいるからですかね?
自キャラをもう少し大きくしたりして、コインを取りやすくしたらよくなるかもしれません。


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

Name: array [URL]  ..熟練のプログラマー(62,595ポイント)   Date: 2010/01/27(水) 00:51   No:47122     
Title: Re:【雑談】ゲーム作りました。    
私も遊ばせて貰いました。とても面白かったです。

5面は、1分以内とかでも無理ですよw

悔しかったので1面だけでも記録更新しようと思ったのですが、13秒でコインを半分取るのが精一杯・・・12秒90のプレイ動画あげて欲しいですw

操作にゲーム感があってとても楽しめました。

(タイムスコアを競うのもシンプルですが、なかなか楽しめるゲームなんですね。勉強になります) 編集済み


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

Name: kazuoni [URL]  ..ハッカー(131,169ポイント)   Date: 2010/01/27(水) 02:55   No:47125     
Title: Re:【雑談】ゲーム作りました。    
3面に1分30秒ぐらいかかった...orz

とてもシンプルで良い作品だと思います。
オープニング画面のちょっと昔みたいな感じはいい味出してるかと思います。

制作お疲れ様でした!


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

Name:  ..入門者(4,151ポイント)   Date: 2010/01/27(水) 20:40   No:47179     
Title: Re:【雑談】ゲーム作りました。    
Tatuさん、
記録、早すぎます!orz
それとワープいいですね。
ワープ後のカメラワークの調整で手間取りそうですが、
あったら面白くなりそうです。

shilfiaさん、
キャラを大きくすれば良かったんですね。
それなら1枚のコインにまごつくことも少なくなりそうです。
アドバイス、ためになりました。

arrayさん、
楽しんでいただけたのなら幸いです。
これからの励みになります!
12秒90はホント早いです…

kazuoniさん、
タイトルにこだわったかいがありました。
プレイありがとうございました。


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

Name: Tatu  ..上級者(23,011ポイント)   Date: 2010/01/27(水) 21:54   No:47187     
Title: Re:【雑談】ゲーム作りました。    
プレイ動画(wmv)をアップロードしました。

http://www1.axfc.net/uploader/N/so/93201
パス Yama

記録は
00:12:12
00:14:38
00:29:91
00:32:63
00:48:49
です。


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

Name: array [URL]  ..熟練のプログラマー(62,940ポイント)   Date: 2010/01/27(水) 22:02   No:47189     
Title: Re:【雑談】ゲーム作りました。    
すごいですねw

操作力がありすぎです・・・あのすべるような動きをここまで制御できるんですね。

勝てる気がしません。 編集済み


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

Name: shilfia  ..入門者(4,297ポイント)   Date: 2010/01/27(水) 22:19   No:47191     
Title: Re:【雑談】ゲーム作りました。    
プレイ動画見ました。
自分には無理な領域です・・・。
制御がうますぎますよw


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

Name: SooA [URL]  ..プログラマー(28,370ポイント)   Date: 2010/01/27(水) 22:28   No:47192     
Title: Re:【雑談】ゲーム作りました。    
凄杉w
カーソル移動並の自在さに感動した。


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

Name:  ..入門者(4,170ポイント)   Date: 2010/01/28(木) 00:31   No:47203     
Title: Re:【雑談】ゲーム作りました。    
観させていただきました。
脱帽です・・・


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

Name: DVDM [URL]  ..熟練のプログラマー(50,828ポイント)   Date: 2010/01/28(木) 03:16   No:47211     
Title: Re:【雑談】ゲーム作りました。    
>>宮さん
遊ばさせて頂きました。
凄く難しいですが、凄く楽しかったです(笑)
操作キャラのスピード調整が面白いです。
また、操作キャラとコインの当たり判定が絶妙で、
今取ったはずのコインが取れてないことがしょっちゅう起きるのも楽しかったです。
せっかくなので、五面までのリザルトを載せておきます^^

制作お疲れ様でした^^
とてもシンプルですが奥が深いいいゲームだと思います!
ファミコン・スーファミのゲーム性に似てるなぁ〜と感じました♪


>>Tatuさん
書き込みしようと思ってたところにTatuさんの動画があったので見てみましたがうまいっす;
三面と五面とかどう頑張っても勝てそうにないです;


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

Name:  ..入門者(4,324ポイント)   Date: 2010/01/28(木) 19:46   No:47245     
Title: Re:【雑談】ゲーム作りました。    
>>DVDMさん

1,2面すごいです…

>ファミコン・スーファミのゲーム性に似てるなぁ〜と感じました♪ 
もともとはマリオっぽい2Dスクロールのサンプルだったものですので、
ファミコン、スーファミの操作性に似てるというのはそういうことなんだと
思います。

楽しんでいただいてありがとうございます。
素直に嬉しいです。


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

Name: Tatu  ..上級者(23,032ポイント)   Date: 2010/01/29(金) 00:01   No:47273     
Title: Re:【雑談】ゲーム作りました。    
DVDMさんに1、2面の記録が抜かれていたので、また記録を更新しました。 編集済み

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

Name: DVDM [URL]  ..熟練のプログラマー(50,858ポイント)   Date: 2010/01/29(金) 01:06   No:47279     
Title: Re:【雑談】ゲーム作りました。    
Tatuさんに1、2面の記録が抜かれてしまったので、また記録を更新しました。
ようやく一面を10秒切れました。


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

Name: Tatu  ..上級者(23,081ポイント)   Date: 2010/01/29(金) 20:06   No:47325     
Title: Re:【雑談】ゲーム作りました。    
>>DVDMさん
更新されましたか。では、これならどうでしょう?
00:08:87
00:09:88
00:26:97
00:30:84
00:44:94


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

Name: DVDM [URL]  ..熟練のプログラマー(50,913ポイント)   Date: 2010/01/29(金) 22:24   No:47329     
Title: Re:【雑談】ゲーム作りました。    
>>Tatuさん
むむ・・・早い。
二・三面は負けていますが、まだ縮められそうです。
一応貼っときます。

00:07:71
00:10:47
00:29:15
00:30:78
00:44:20


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

Name: Tatu  ..上級者(23,127ポイント)   Date: 2010/01/30(土) 01:20   No:47344     
Title: Re:【雑談】ゲーム作りました。    
>>DVDM さん
どこまで縮められるでしょうか?
とりあえず現在の記録です。

00:07:28
00:09:57
00:24:80
00:30:28
00:41:99


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

Name: DVDM [URL]  ..熟練のプログラマー(51,015ポイント)   Date: 2010/01/30(土) 02:51   No:47348     
Title: Re:【雑談】ゲーム作りました。    
>>Tatuさん
やはり更新してきましたか・・・さすがです。
記録を全部塗り替えられたと思ったら、2面で負けましたか。
ですが、このタイムはどうでしょう?

00:06:97
00:09:59
00:24:61
00:28:86
00:40:56 編集済み


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

Name: array [URL]  ..熟練のプログラマー(63,192ポイント)   Date: 2010/01/30(土) 03:04   No:47351     
Title: Re:【雑談】ゲーム作りました。    
なんだこの記録塗り替え合戦w

やまなか君の人気に嫉妬しそうw


ちなみに、自分はやっとで1面が15秒台にのせれました。
初め50秒以上だったのがここまで縮まったので大満足です。


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

Name: DVDM [URL]  ..熟練のプログラマー(50,846ポイント)   Date: 2010/01/30(土) 03:36   No:47352     
Title: Re:【雑談】ゲーム作りました。    
>>arrayさん
メダル泥棒しすぎてぶっちゃけ、手が痛いです(笑)

おそらく、Tatuさんは更に記録を塗り替えてくるでしょう。
三〜五面はまだ改善の余地はあるのですが、
一面・二面とかこれ以上早くなったらどうしましょレベルです><


>ちなみに、自分はやっとで1面が15秒台にのせれました。
おめでとうございます!
自分も最初50秒ほどかかって、操作のしにくさがネックでした・・・。
しかし、取る順番・方法で何秒も縮まっちゃうゲームなので色々試してみると10秒なんてすぐ切れますよ(笑)


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

Name: Tatu  ..上級者(22,975ポイント)   Date: 2010/01/30(土) 15:48   No:47393     
Title: Re:【雑談】ゲーム作りました。    
>>DVDM さん
記録を塗り替えようとしてくるではなく塗り替えてくる
と書いていたので期待にこたえて更新しました。
1,5面は自己ベストのみ更新。

00:07:21
00:09:40
00:24:52
00:28:45
00:41:41

>>arrayさん
>>記録塗り替え合戦
まあ、タイトルがメダル泥棒ですし、
できるなら金メダルを取りたいでしょう?

最初はコツがつかめなくて時間がかかってしまいますが、
操作に慣れてくるといろんな道が見えてきますよ。


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

Name: DVDM [URL]  ..熟練のプログラマー(50,927ポイント)   Date: 2010/01/30(土) 16:30   No:47395     
Title: Re:【雑談】ゲーム作りました。    
>>Tatuさん
バイト前にちらっと覗いてみましたが、やはり更新してきましたか。
帰ってきたらまたチャレンジしてみます。
私の負けが2・3・4と、3面分だったので、とりあえず四面だけ一秒ほど更新しました。

00:27:70


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

Name: Tatu  ..上級者(22,992ポイント)   Date: 2010/01/31(日) 02:04   No:47420     
Title: Re:【雑談】ゲーム作りました。    
4面の記録を更新しました。

00:27:52


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

Name: lbfuvab  ..上級者(24,765ポイント)   Date: 2010/01/31(日) 06:29   No:47425     
Title: Re:【雑談】ゲーム作りました。    
時に、mp3まわりで不具合が起こったのは私だけでしょうか?



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

Name: Tatu  ..上級者(23,064ポイント)   Date: 2010/01/31(日) 21:17   No:47446     
Title: Re:【雑談】ゲーム作りました。    
1,5面の記録を更新しました。

00:06:95
00:09:40
00:23:94
00:27:52
00:39:79

>>lbfuvabさん

音が鳴らなくなったことはありませんが、
不具合とはどのようなものでしょうか?


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

Name: DVDM [URL]  ..熟練のプログラマー(50,972ポイント)   Date: 2010/02/01(月) 01:31   No:47462     
Title: Re:【雑談】ゲーム作りました。    
>>Tatuさん
2面・4面の記録のみ更新しておきました。
精密な動きが要求されるので凄くやりこみ要素がありますね。

1面はさすがに抜かれないだろう〜とたかを括ってました・・・さすがです。
しかし、負けませんよ。
更新してくれば更新し返さないといけませんからね。

00:06:97
00:09:18
00:24:61
00:27:19
00:40:56


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

Name: lbfuvab  ..上級者(24,815ポイント)   Date: 2010/02/01(月) 02:46   No:47465     
Title: Re:【雑談】ゲーム作りました。    
そもそも立ち上がりませんでした。
MP3をWAVEに変換し、バイナリエディタでプログラム内のMP3をWAVEに変更すると動いたのでそう判断しました。


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

Name: Tatu  ..上級者(23,116ポイント)   Date: 2010/02/01(月) 09:09   No:47477     
Title: Re:【雑談】ゲーム作りました。    
2面の記録を更新しました。

00:06:95
00:08:92
00:23:94
00:27:52
00:39:79

>>やりこみ
他の人が自分より少しだけ良い記録だと
記録を更新したくなります。
DVDMさんが更新してこなかった場合は
おそらくここまでやりこみはしなかったと思います。


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

Name:  ..入門者(4,842ポイント)   Date: 2010/02/01(月) 21:30   No:47519     
Title: Re:【雑談】ゲーム作りました。    
>>lbfuvabさん
サウンドカードが刺さってないPCでDXライブラリ製のゲームを
しようとしたら起動しなかったことがありました。
(音楽を再生できるようにしたら無事起動するようになりました。)

全くの無知なので あくまで推測になりますが、
同様にmp3が再生できない環境でmp3ファイルを読みこんだりすると
起動しないようになってるとか…ですかね?

mp3のファイル自体はプレイヤーで再生できるのでしょうか?
それとも、ゲームで使われる曲だけ再生できないとか?

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

音楽にまつわるトラブルって結構多いんですかね?
ゲーム作っても「出来ない」「聴けない」では勿体無いですよね。
こういう時の対処ってどういう方法が効果的なんですかね?


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

Name: array [URL]  ..熟練のプログラマー(63,712ポイント)   Date: 2010/02/01(月) 22:18   No:47524     
Title: Re:【雑談】ゲーム作りました。    
> こういう時の対処ってどういう方法が効果的なんですかね?

私にも具体的には分からないし、レベルの高い人達向けだと思いますが

エラーの発生が予想される部分にエラー処理を入れて、エラーのログをテキスト形式で出力させるのが
一般的なのではないでしょうか。

ユーザは異常動作はわかっても、原因が分からない場合が多いので エラーを出力しログテキストを送付してもらえれば
原因の特定できるような処理がプログラムで組めれば手っ取り早く原因を追究する事ができると思います。

ちなみに、Dxライブラリだと、ゲームを実行すると同じ階層に Log.txt が吐き出されるのでそれを元に
原因を解析してみるのも手だと思います。


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

Name: Tatu  ..上級者(23,150ポイント)   Date: 2010/02/02(火) 17:08   No:47551     
Title: Re:【雑談】ゲーム作りました。    
4面の記録を更新しました。

00:06:95
00:08:92
00:23:94
00:26:75
00:39:79


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

Name: lbfuvab  ..プログラマー(25,013ポイント)   Date: 2010/02/02(火) 20:47   No:47553     
Title: Re:【雑談】ゲーム作りました。    
>> 宮さん

USBオーディオインターフェース(UA-1EX)を使っているのが原因かもしれません。
ちなみにLame ACM codecが入っているのでmp3を再生できます。
念のためLame ACMを切ってffdshowにしても同じでした。

>> arrayさん

Log.txtを読んでみるとやはりmp3が読み取りに失敗していました。
予想では

@読み込みに失敗
A無効なハンドルが代入される
B無理矢理再生しようとする
Cエラーが出てプログラム終了

という感じかと思います。


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

Name: DVDM [URL]  ..熟練のプログラマー(51,031ポイント)   Date: 2010/02/06(土) 02:07   No:47707     
Title: Re:【雑談】ゲーム作りました。    
一面と五面以外のタイムを更新しましたが、全部まけてました;

00:06:97
00:09:06
00:24:28
00:26:84
00:40:56

なるほど、もう少し縮めなければならない訳ですか。


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



Name: はじめたばかり  ..ぴよぴよ(352ポイント)   Date: 2010/02/06(土) 00:11   No:47696       
Title: 二つの数列の比較について    
[問題]二つの数列を配列a[],b[]を使って表わしてそれらを比較し、等しい数の個数を調べるため、同じ数があ   る時は count の値を1増やします。   a[]の配列要素は6コで、b[]の配列要素は30コです。                          数列の数は100未満とします。

以下の様に比べる為の Check(*a,*b)関数 を作り、試しに使ってみたところcountの値が180になってしまいます
コードで間違っている場所を指摘してもらえるでしょうか? よろしくお願いします。

nはaの要素数で6
Nはbの要素数で30

int Check(int *a, int *b){
    int i,j;
    for(i=0;i<n;i++){
      for(j=0;j<N;j++){
        if(a[i]=b[j]){
        count++;
      }
     }
    }
  return 0;
}


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


Name: box  ..ハッカー(150,791ポイント)   Date: 2010/02/06(土) 00:29   No:47697     
Title: Re:二つの数列の比較について    
>         if(a[i]=b[j]){

a[i]にb[j]を代入しています。比較してはいません。


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

Name: はじめたばかり  ..ぴよぴよ(391ポイント)   Date: 2010/02/06(土) 01:48   No:47705 解決!     
Title: Re:二つの数列の比較について    
ご指摘ありがとうございました。
a[i]==b[j]で無事解決することができました。


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



Name: しげ  ..ぴよぴよ(27ポイント)   Date: 2010/02/06(土) 01:24   No:47701       
Title: Cでの計算プログラム    
初めまして。お世話になります。
昨年よりC言語を学んでいますが、今回、このような課題を提出されました。
数学のクイズみたいなものです。
1234567890の数字の並びに+-*/()を用いて=1000が成り立つ計算式を求めよというものでした。
解はいくつかあるみたいなのですが、攻略のきっかけがつかめません。
アルゴリズムを含めて、どうかヒントをください。
よろしくお願いします。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,146,325ポイント)   Date: 2010/02/06(土) 01:33   No:47704     
Title: Re:Cでの計算プログラム    
ん・・この問題・・。
某社の新入社員向けの宿題だったりしません?^^;
私も去年全く同じ問題を宿題として出されたものですから・・(提出締め切りも今頃だったし・・
しかも投稿者ネームが私のリアル名前と同じというなんという偶然。

違ってたらすみません、気にしないでください^^;

関係のない話が長くなりましたが、
今どのあたりまで検討が付いています?
また、どの位Cの知識があります?
例えば総当たりで試してみるって力技なら出来ますか?


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



Name: ひで  ..入門者(2,683ポイント)   Date: 2010/01/30(土) 04:50   No:47354       
Title: 教えて優しい人!    
以下のプログラム(成功している)で、int iを2回使っているのに、2回目のiの増減で最初のfor内が実行されないのはどうしてでしょうか??

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

main(){
  char n[5][100];
  int p[5];
  double a[5];
  ifstream pref;

  pref.open("prefecture.txt");
  pref.width(100);
  for(int i=0;i<5;i++){                    ←ここです!
    pref>>n[i];
    pref>>p[i];
    pref>>a[i];
  }
  pref.close();
  for(int i=0;i<5;i++){
    cout<<n[i]<<","<<p[i]<<","<<a[i]<<"\n";
  }
}


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


Name: box  ..ハッカー(150,789ポイント)   Date: 2010/01/30(土) 11:33   No:47367     
Title: Re:教えて優しい人!    
> int iを2回使っているのに、2回目のiの増減で最初のfor内が実行されないのはどうしてでしょうか??

そのプログラムは、
open
width
iによる5回のループ(1回目)
close
iによる5回のループ(2回目)
を上から順に実行している、ということはわかりますか?
 編集済み


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

Name: softya  ..ハッカー(110,608ポイント)   Date: 2010/01/30(土) 11:41   No:47369     
Title: Re:教えて優しい人!    
まず、変数のスコープを理解して下さい。
 for(int i=0;i<5;i++){        
こうやって宣言された変数iはforループ内しか有効ではありません。
なので2番目のforループの変数iとは名前が一緒でもC++にとっては別変数です。

>以下のプログラム(成功している)で、int iを2回使っているのに、2回目のiの増減で最初のfor内が実行されないのはどうしてでしょうか?? 

これの意味が良く分からないのですが、プログラムの実行順序と言うのが良く分かっていないって事でしょうか?
特殊なものを除いて、プログラム言語は逐次実行と言って上から順に命令が実行されていきますので2つのforループが同時に実行されることなどありえません。つまり、1つ目のforループが終了しない限り2つめのforループは実行されませんし2つめのループ中に1つ目のループに戻ることはありません。


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

Name: ひで  ..入門者(2,793ポイント)   Date: 2010/01/31(日) 03:14   No:47422 解決!     
Title: Re:教えて優しい人!    
boxさん

ご返信ありがとうございます!!
大丈夫です!それは一応わかります。


softyaさん

ご返信ありがとうございます!!
成る程!スコープ内(?)の変数宣言はその変数内でしか適用されないのですね!!
それと逐次実行ですね!覚えておきます!ありがとうございます!



解決しました。
御二方、本当にありがとうございます。


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

Name: Ma  ..熟練のプログラマー(40,464ポイント)   Date: 2010/01/31(日) 06:37   No:47427     
Title: Re:教えて優しい人!    
もう解決してしまったみたいですが。
>成る程!スコープ内(?)の変数宣言はその変数内でしか適用されないのですね!! 
間違ってますよ。

スコープ内で宣言した変数はそのスコープ内でしか使えないって意味ですよ。

{
  int a = 2;

}
としたら、{} の中がスコープで、その外側ではaは参照(使えない)できないということです。
 編集済み


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

Name: ひで  ..入門者(2,809ポイント)   Date: 2010/02/05(金) 23:06   No:47693     
Title: Re:教えて優しい人!    
Maさん

成る程、そうなんですね!
まだまだ勉強しないと!
ありがとうございます!


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



Name: 猫旅  ..ぴよぴよ(417ポイント)   Date: 2010/02/05(金) 14:14   No:47660       
Title: パズルゲームのロジック    
DXライブラリで落ち物パズルを作ろうとしております。
ただ一点どうしても思いつかないロジックがあります。

よくぷよぷよ等で次に落ちてくるぷよが見えますよね?
あれってお互いが続く限り無限にランダムで出続けるかと思います。
しかも同じ回数なら同じぷよが・・・。

あれが完全ランダムな筈なのに1P側と2P側でどうやって同じようにしているのでしょうか?
rand関数の値を保持するやり方にするとしたらデータを保持できなくないでしょうか?

例えば1P側では9999個目ぷよが落ちてきて2P側では2個目のぷよが落ちてくるとします。
※そんな状況はないですが

そんな時でも1P側で出た2個目と2P側で落ちてくるぷよは同じですよね?
値を9999個も保持しておくとかなり効率も悪く無駄ではないでしょうか・・・?
しかも無限にデータの保持が必要なのでしょうか?

わかりづらいですが表にしてみました。
番目    1    2    3    4    ・・・9999
1P    RR    RB    BB    GB        RR
2P    RR    RB    まだ落ちていない


説明が下手で申し訳御座いません。


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


Name: 御津凪 [URL]  ..ハッカー(139,638ポイント)   Date: 2010/02/05(金) 14:43   No:47663     
Title: Re:パズルゲームのロジック    
C 標準関数の rand 関数ではシード値などの乱数生成に必要な情報が内部に一つしかないので、これを使って上記のようなことを実現するには、
シード値を記憶し、シード値が与えられてから何回目の呼び出しかでその分 rand 関数を呼ぶことです。
簡単な例を示すと、下記のようになります。
int get_rand( int seed, int count ){
    int r = 0;
    srand(seed);
    while(count > 0){
        r = rand();
        --count;
    }
    return r;
}

これでは count が増えていくにつれ、処理が重くなり、非常に効率が悪いことが分かります。

そこで、シード値など乱数生成に必要な情報を外部で保存できる乱数生成関数を用意し、
それぞれに同じシード値を与えれば、実現することができます。

つまり、乱数生成アルゴリズムを乱数生成情報が複数持てるようにしたものであればOK
ということになります。


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

Name: たいちう  ..熟練のプログラマー(55,553ポイント)   Date: 2010/02/05(金) 14:47   No:47665     
Title: Re:パズルゲームのロジック    
解決方法は3通り思いつきます。

1つは自前の擬似乱数を使う方法。
1つの値から次の値が一意に決まるならば、
1pと2pでそれぞれ独立に計算しても、同じ乱数列が得られます。
詳しくは「擬似乱数」について調べてください。

もう1つは1万でも100万でもメモリ上に記憶しておく方法です。
ぷよの色ならば1バイトで2つ分を表せるでしょう。
DirectXが動く環境で10KBや1MB余分に使っても誰も困らないでしょう。

最後は100個だけ覚えておく方法。
100個も差がついたら、違いに気付く人はまずいないでしょう。


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

Name: dic  ..熟練のプログラマー(50,921ポイント)   Date: 2010/02/05(金) 17:34   No:47667     
Title: Re:パズルゲームのロジック    
無駄とか効率とかよくわかりませんが
ぷよぷよは同じ順番で同じ組み合わせが落ちてきてますよ


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

Name: バグ  ..ハッカー(189,146ポイント)   Date: 2010/02/05(金) 18:35   No:47670     
Title: Re:パズルゲームのロジック    
効率度外視ならば、たいちうさんの書き込まれている2番目の方法が簡単かつ確実かな?


>>dicさん
おそらく、落としたぷよの個数に10000や20000などの大差がつくことは想定していないでしょうし、そこまで差が開くことはありえないでしょうから、記憶できる個数に限界はあるんじゃないかと思われます。あくまでも推測ですけどね(^_^;)


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

Name: 猫旅  ..ぴよぴよ(8ポイント)   Date: 2010/02/05(金) 22:39   No:47690     
Title: Re:パズルゲームのロジック    
皆様ご回答ありがとうございます。

皆様の回答を参考にして色々考えてみたのですが
あらかじめ50個の配列にランダムしたものを書き出し
その配列をループさせる様なロジックにします。

1⇒2⇒・・・50⇒1⇒みたいな感じです。
これなら問題ない気がします。

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


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



Name: 星史朗  ..ぴよぴよ(13ポイント)   Date: 2010/02/05(金) 12:00   No:47658       
Title: 残機    
龍神録プログラミングの館のほうで上げられているソースを参考にいじらせていただいています。
残機が0になったときにプログラムを終了させたいと思っています。
ですがうまくいかずよくわかりません。
ご教授お願いします。


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


Name: yrao  ..プログラマー(25,330ポイント)   Date: 2010/02/05(金) 20:48   No:47677     
Title: Re:残機    
>星史郎さん
 
こんばんは。
 
キャラクタの構造体内に、残機数がありますよね。(確かch.numだったかと) 
 
自機が被弾するごとにch.numを一つずつ減らしていって、ch.num<0となったら、プログラム終了処理をしてやればよいのではないでしょうか。
 
自機被弾関係の処理は、char.cpp内の、calc_ch関数で行っていると思うので、そこに処理を追加すればOKだと思います。


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



Name: はじめたばかり  ..ぴよぴよ(23ポイント)   Date: 2010/02/05(金) 18:38   No:47671       
Title: 初級の配列問題    
[問題] 6個の要素に自分の好きな数字を入れた配列を作ってください。

以下の様に自分で書いたのですが、結果として出力される数がおかしな数字となります。
どこを直せばよいのでしょうか? 回答よろしくお願いします。

#include <stdio.h>
#define n 6

int NumberMAN(int *MAN);

int main(void){
    int MAN[n];
    int i,z;
    for(i=0;i<n;i++){
     printf("%d",MAN[i]);
    }
}

int NumberMAN(int *MAN){
 int i;
 printf("自分の好きな数を選んで要素数が6つの配列を作ります");
 printf("\n");
 for(i=0;i<n;i++){
  printf("%d文字目の数を入力してください:",i+1);
  scanf("%d",&MAN[i]);    
 }
}


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


Name: ひよこ  ..比類無きプログラマー(79,541ポイント)   Date: 2010/02/05(金) 18:51   No:47672     
Title: Re:初級の配列問題    
NumberMANを使っていないのが原因に見えます。


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

Name: はじめたばかり  ..ぴよぴよ(53ポイント)   Date: 2010/02/05(金) 19:15   No:47673     
Title: Re:初級の配列問題    
あああなんとしたことか・・・恥ずかしいです。

ひよこさん本当にありがとう御座いました。


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

Name: はじめたばかり  ..ぴよぴよ(65ポイント)   Date: 2010/02/05(金) 19:18   No:47674 解決!     
Title: Re:初級の配列問題    
ありがとうございました。

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



Name: 少年X  ..ぴよぴよ(656ポイント)   Date: 2010/02/04(木) 15:44   No:47619       
Title: 弾幕計算の高速化    
こちらのサイトを参考にシューティングゲームを作っています。そして、今の課題が高速化です。
PSPでもできるようにと作っているのですが、できるだけ高速化したいです。あたり判定は、二次元配列化することにより軽くなりました。しかし、弾幕の計算で重くなってしまします。いい案や、アイデアを教えてください。


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


Name: conio [URL]  ..比類無きプログラマー(78,364ポイント)   Date: 2010/02/04(木) 16:06   No:47620     
Title: Re:弾幕計算の高速化    
三角関数をテーブル化してみてはどうでしょうか。

予め、cosやsinの計算結果を配列などに代入しておき、
後は計算をせずに、直接 計算した後の値を引っ張り出すという方式です。


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

Name: たいちう  ..熟練のプログラマー(55,303ポイント)   Date: 2010/02/04(木) 16:16   No:47621     
Title: Re:弾幕計算の高速化    
1.処理速度の評価のために処理時間を実測しましょう。
2.実測した時間を元にボトルネックを見つけましょう。

弾幕の計算がボトルネックだと思い込んでいるようですが、
これが正しいかもしれませんし間違っているかもしれません。
時間を計るまでは、これは単なる思い込みです。
もしもまだならば、必ず計ってください。
処理時間はマシンスペック等と単純な相関があるとは限らないので、
ターゲットとなる環境で測定するのが望ましいです。
環境が変わるとボトルネックの場所が変わる可能性があります。

弾幕の計算がボトルネックだとすると、弾幕の計算を省略した場合、
劇的に高速化されるはずです。弾幕を移動させないとか、全弾幕を
一律で上方向に等速で移動させるとか、計算の負荷がかからないと
思われる方法で試してみてください。

もしも期待した効果が得られないならば、
弾幕の計算を効率化させることは無駄ということです。


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

Name: lbfuvab  ..プログラマー(25,024ポイント)   Date: 2010/02/04(木) 16:54   No:47626     
Title: Re:弾幕計算の高速化    
まずは時間を測定してみましょう。

方法としては
@処理の最初と終わりの時間の差を出す
A今までの平均をdAveTimeとし回数をCntとし今回の計測結果をTimeとすると
dAveTime += (Time-dAveTime)/(++Cnt);

として平均を更新し、表示する 編集済み


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

Name: 少年X  ..ぴよぴよ(669ポイント)   Date: 2010/02/04(木) 17:36   No:47631     
Title: Re:弾幕計算の高速化    
>>たいちう

計測方法がわからないので、FPSで計算してみました。プログラムは龍神とほとんど一緒です。
1、out_main(あたり判定)なしの場合   62FPS
2、out_main(あたり判定)ありの場合   60FPS
3、shot_main(弾幕メイン)なしの場合   62FPS
4、defineのSHOT_BULLET_MAXを400まで減らす  62〜33FPS
5、shot_main(弾幕メイン)ありの場合   62〜33FPS
 
 * 4,5ではミシャクジさまのところで33FPSぐらいになります。

SHOT_BULLET_MAXは、弾幕計算のループ回数なので、減らすことにより速くなりました。
しかし、これから多くの弾を出す場合はきつくなってしまいます。7次元様は「気ロちゃん風雨に負けず」でも
60FPS出してましたし・・・何とかならないか考えてます。

>>lbfuvab

そうやって計算するのですか。ありがとうございます。
さっそくやってみます。


>>conio
配列に入れるとは
float sin[180] = {0 , 0.0175 , 0.0349 ,,,}
float cos[180] = {1 , 0.9998 , 0,9994 ,,,}
のようなことでしょうか?


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

Name: 少年X  ..ぴよぴよ(688ポイント)   Date: 2010/02/04(木) 17:37   No:47632     
Title: Re:弾幕計算の高速化    
連続ですみません。
FPSの計算は62FPSが図れる最大値でした。


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

Name: Dixq (管理人)  ..ウィザード(1,145,798ポイント)   Date: 2010/02/04(木) 17:52   No:47634     
Title: Re:弾幕計算の高速化    
PSPのアーキテクチャを知らないのですが、浮動小数点を計算することがボトルネックなら全てintで計算したらどうですか?
640x480ピクセルを64000x48000ピクセルとして計算し、表示するときに100で割れば高速化出来そうな気がします。
サインコサインテーブルもintにし、計算過程に浮動小数計算が含まれないようにしてはどうでしょう


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

Name: 少年X  ..ぴよぴよ(915ポイント)   Date: 2010/02/04(木) 17:59   No:47635     
Title: Re:弾幕計算の高速化    
そういう手がありましたか・・・
大変そうですがやってみます。学生なものですから、実装は遅れそうです(涙)



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

Name: 少年X  ..ぴよぴよ(975ポイント)   Date: 2010/02/04(木) 18:28   No:47638     
Title: Re:弾幕計算の高速化    
sin,cosの値を配列にするですが、

float sin[181],cos[181]; //0°も含めるため
for(i=0 ; i<=181 ; i++){
    sin[i] = sin(i);
    cos[i] = cos(i);
}

でもできますか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,146,013ポイント)   Date: 2010/02/04(木) 18:39   No:47640     
Title: Re:弾幕計算の高速化    
まず、孤度法と度数法ってご存知ですか?
180°は円周率で表せるというやつです。
もし解らなければググってみれば出てきます。
180°はπです。ですから龍神録でも

#define PI 3.141592654f

for(i=0;i<180;i++)
   .x = sin(PI/180*i);

みたいに使っていると思います。
180°がPIなのですから、1°はPI/180ですよね。それを基準に計算してみてください。
後、1°ずつのテーブルでは誤差が大きすぎると思います。せめてその10倍は欲しいところです。

また、お書きになっているプログラムは181になっていますが、
これではオーバーフローしてしまいます。180でいいと思います。

ところで、int型で計算するのは無しになったのですか?


皆さん仰る通り、実装する前にまずボトルネックを探す方がいいと思います。


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

Name: 少年X  ..かけだし(1,262ポイント)   Date: 2010/02/04(木) 19:37   No:47642     
Title: Re:弾幕計算の高速化    
すみません。ボ〜っとしてたせいですっかり孤度法と度数法を忘れていました。
やはり、プログラムの高速化のためにはsin,cos,atan2の計算を少なくさせるのがいいですよね・・・
他には何が必要か考えてみます。

>>int型で計算するのは無しになったのですか? 
部分的にint型に直してみようと思います。ですが、どれほど速くなるかわかりませんが・・・

>>皆さん仰る通り、実装する前にまずボトルネックを探す方がいいと思います
その通りですね。やってみることにします。
スレと違う質問なのですが、処理時間の計測は
@処理の最初と終わりの時間の差を出す
A今までの平均をdAveTimeとし回数をCntとし今回の計測結果をTimeとすると
dAveTime += (Time-dAveTime)/(++Cnt);
とありますが、具体的には

int Time[2],time;
int dAveTime;
int Color = GetColor( 255 , 255 , 255 ) ;

void main(){
    Time[0] = GetNowCount;

    本体

    Time[1] = GetNowCount;
    time = Time[1]-Time[0];
    dAveTime += (time-dAveTime)/(++Cnt);
    DrawFormatString(x,y,Color,"dAveTime%d",dAveTime); 
    DrawFormatString(x,y,Color," time %d" , time) 
}
ということでしょうか?
プログラムで、どうやって計測させるかよくわかりません。


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

Name: ft [URL]  ..中級者(11,975ポイント)   Date: 2010/02/04(木) 21:10   No:47644     
Title: Re:弾幕計算の高速化    
こんばんは。私もDXPを使ってPSP上による動作を目指している者です。
PSPにおける再現にあたっていくつか述べられそうな箇所があるので綴りたいと思います。
ちなみに現在は最新版でなくDXP ver0.5.5を使用しています。

1.三角関数をテーブル参照にする 
 これをしないで何が高速化か!ってくらい速くなりました。
 といっても弾道計算と弾幕処理(boss_shotHとか)以外もテーブル参照させると何故か遅くなるため、その他はfastmathの関数を使っています。 

2.除算,剰余計算を取り払う 
 シフトやビット演算による計算ができる箇所は変えました。

3.良く使う関数はinline修飾 
 ただし、よく使う関数以外も修飾すると遅くなったりするのでシラミ潰しに調べた方がいいです。 

4.double→float

5.画像をVRAMに置く + 画像サイズを小さくして画像最適化サイトでサイズ削減 + 画像を16ビット画面モードも16ビットに  
 PSPのVRAMには2MByteまでしか置けませんが、メインメモリと比べて画像転送速度が速いという点と、 
 転送が直ぐ終わるように画像サイズをギリギリまで小さくするという事で、
 PSPのメモリアクセスが遅いという欠点を補います。 
 画像の最適化は次のサイトを使っています→ttp://www.gracepointafterfive.com/punypng/
 透過が重要でないPNG画像は思い切ってパレット画像にしてしまうというのも手です。
 画面モードと画像を16ビットにすることで軽く出来ます。
 これはSetDisplayFormatやConvertGraphFormat関数で指定出来ます。
 またテクスチャの選択処理を減らすために512*512ピクセル以内にできるだけ纏めて、テクスチャ数を減らした方がいいです。

6.垂直同期を待たないようにする
 変わります。またそちらで確認されているか分かりませんが、バグでもある画面のチラつきがなくなりました。

7.333MHzにクロックアップ
 変わります。


主に以上の事をしただけですが、浮動小数のままでもケロちゃん弾幕や反魂蝶八分咲が60fps安定しました。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,146,056ポイント)   Date: 2010/02/04(木) 21:15   No:47645     
Title: Re:弾幕計算の高速化    
時間計測するのは計算したい処理の前後で時間はかって引けばいいだけではないでしょうか?
fprintf出力するなり、printfDxで結果を確認するなりすればいいと思います。


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

Name: 少年X  ..かけだし(1,279ポイント)   Date: 2010/02/04(木) 22:05   No:47646     
Title: Re:弾幕計算の高速化    
計測に関しては自己解決しました。
只今測定中です。


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

Name: 少年X  ..かけだし(1,349ポイント)   Date: 2010/02/04(木) 22:45   No:47647     
Title: Re:弾幕計算の高速化    
>>ft
いろいろ参考になりました。ありがとうございます。
僕と同じようにDXPでSTGをやる人がいて、なんか嬉しいです。
C言語は基本的なものを習得して本格的なプログラミングは初めてで、まだ一カ月です・・・

長い目を持って頑張ってみます。


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

Name: 少年X  ..かけだし(1,413ポイント)   Date: 2010/02/04(木) 22:54   No:47648     
Title: Re:弾幕計算の高速化    
連続で書き込みまくりですみません。

こちらでもPSPの画面でちらつきがあり、理由がわかりませんでした。
ft様によれば垂直同期によるものですが、解決策を教えていただけないでしょうか・・・
*僕の力では調べてもわからなかったので(涙)


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

Name: ft [URL]  ..中級者(12,358ポイント)   Date: 2010/02/04(木) 23:41   No:47649     
Title: Re:弾幕計算の高速化    
すみません、訂正します。垂直同期を待たなくてもチラついていたのを思い出しました。

ループで必ず行う3大処理ProcessLoop() 中の
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す

をコメントアウトすることでチラつきが無くなりました。
ただ、これはエラーが無いという勝手に立てた前提のもとですので、動作にどんな支障が出るのか分かりません。

本題の垂直同期を待たないようにする方法ですが、2つあります。
@int SetWaitVSyncFlag(int flag)関数で垂直同期を待つかどうかフラグで処理。
ADXP Ver0.5.5のソースファイルを開いて、その中の
sceDisplayWaitVblankStart();
という垂直同期を待つ関数を全て消してビルドしたものを使う(最新版はソース公開していません)

です。後者は確実に垂直同期を待つことが出来なくなります。
ちなみにSetWaitVSyncFlagを呼ぶ必要が無いという理由で、私はAをしていますが、
@とAの速度の比較はしたことないです。


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

Name: 少年X  ..かけだし(1,424ポイント)   Date: 2010/02/05(金) 18:02   No:47668 解決!     
Title: Re:弾幕計算の高速化    
頑張ってみます。

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



Name: 超初心者  ..入門者(4,632ポイント)   Date: 2010/02/01(月) 00:36   No:47460       
Title: 最初からつまづいています。    
#include "DxLib.h"
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 
 
 
 
        WaitKey() ;             // キーの入力待ち(『WaitKey』を使用) 
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}
これを実行してウィンドウを開こうと思ったのですが、
> C:\borland\bcc55\Bin\make.exe -fDebug\sumple.mak TARGET
MAKE Version 5.2  Copyright (c) 1987, 2000 Borland
    bcc32 -WC -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -eDebug\sumple.exe Debug\test.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)

** error 1 ** deleting Debug\sumple.exe
とでます。

なにが悪いんでしょうか・・・


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


Name: たかぎ [URL]  ..ハッカー(157,309ポイント)   Date: 2010/02/01(月) 01:31   No:47461     
Title: Re:最初からつまづいています。    
mainがないか、オプションが間違っているかのどちらかです。
結局何をしたいのかによります。



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

Name: non  ..比類無きプログラマー(90,197ポイント)   Date: 2010/02/01(月) 08:47   No:47476     
Title: Re:最初からつまづいています。    
プロジェクトの設定で、ウィンドウズアプリケーションになっていないのではないでしょうか?

ココ読んで、設定してみてください。
http://homepage2.nifty.com/natupaji/DxLib/dxuse_bcc.html#R4


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

Name: 超初心者  ..入門者(4,883ポイント)   Date: 2010/02/05(金) 00:25   No:47651     
Title: Re:最初からつまづいています。    
すいません。。。
設定したのですが、
> C:\borland\bcc55\Bin\make.exe -fDebug\test.mak -B TARGET
MAKE Version 5.2  Copyright (c) 1987, 2000 Borland
    bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -nDebug  -c C:\borland\test\test.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
c:\borland\test\test.c:
エラー E2209 c:\borland\test\test.c 1: インクルードファイル 'DxLib.h' をオープンできない
エラー E2141 c:\borland\test\test.c 3: 宣言の構文エラー
*** 2 errors in Compile ***

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

Make End !! (Elapsed time 0:00.969)

と出るんですよ↓
どうしたらいいんでしょうか。。。
ほんとにもうしわけない・・・


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

Name: たかぎ [URL]  ..ハッカー(158,436ポイント)   Date: 2010/02/05(金) 00:31   No:47652     
Title: Re:最初からつまづいています。    
> どうしたらいいんでしょうか。。。 

一通りのドキュメントを読みましょう。
一つ一つ質問していたのではまったく先に進みません。
あるいは、お金を払ってでも指導を受けるかです。


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

Name: Ma  ..熟練のプログラマー(44,284ポイント)   Date: 2010/02/05(金) 04:56   No:47655     
Title: Re:最初からつまづいています。    
VC++に移るのも手です。
最初はBCCのほうがUIが単純でわかりやすいですが、
いずれVC++のほうが高機能で便利になって変えたくなりますから。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,146,033ポイント)   Date: 2010/02/05(金) 07:51   No:47656     
Title: Re:最初からつまづいています。    
Maさんも仰っていますが、VC++をお使いになってはいかがでしょう?
コンパイラは何でもいいですが、ネットにあるサンプルなどはVC++のプロジェクトを使っていたりするので、
メジャーなコンパイラを使うと利益があることがあります。

VC++の導入の仕方はうちでも紹介してます。
http://dixq.net/vcpp.html

DXライブラリの使い方は本家に書いてあります。
http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2008express.html

参考にどうぞ^^


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

Name: non  ..比類無きプログラマー(91,108ポイント)   Date: 2010/02/05(金) 10:01   No:47657     
Title: Re:最初からつまづいています。    
みなさん、VC++を勧めておられますが、BCCでも大丈夫です。設定がうまくいってないだけです。

使っているのは BCC Developerですよね。

>エラー E2209 c:\borland\test\test.c 1: インクルードファイル 'DxLib.h' をオープンできない 

これは、ヘッダーファイルが見つからないのですから、
DXライブラリの「プロジェクトに追加すべきファイル_BCC用」をフォルダごとコピーして、
フォルダの名前を、DxLibに変えましょう。

フォルダの場所は例えば
¥MyC
 |
 +DxLib
 |
 +作成するプロジェクト

のような位置関係とします。つまり、自分で作成するプロジェクトはMyCの下です。
プロジェクトを作成したら、プロジェクトの設定で、
アプリケーションタブで,Windowsアプリケーションをクリックします。
これは、
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -nDebug  -c C:\borland\test\test.c 
こうなっているので、設定されているみたいです。
次に、コンパイル3のタグをクリックし
インクルードパスにDxLibの場所を設定します。
..\DxLib になりますね。
さらに、その他オプションに
-L..\DxLib と入力し設定ボタンを押します。
恐らくココが設定できていないと思います。

>エラー E2141 c:\borland\test\test.c 3: 宣言の構文エラー 
これは、上のが解決してから考えましょう。
プログラム見ないとわからないし・・・


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



Name: wm  ..ぴよぴよ(453ポイント)   Date: 2010/02/02(火) 03:20   No:47541       
Title: 画像のランダム表示について    
はじめて相談させて頂きます。

現在、画面上の(30, 30)から(450, 450)までの部分を35pixelごとの12*12マスに分け、
そのマスそれぞれに9個に分割して読み込んだブロックの画像(drop.png)をランダムで表示させようとしています。
理想では144個のバラバラな画像が表示されるようにしたいのですが、
動かしてみたところ全てのマスが一緒にチカチカと瞬いてしまいます。
原因が分からないので、お気づきになったことがありましたら教えて頂けますでしょうか?
よろしくお願い致します。

以下ソースになります。

int ScreenDraw()    //画像処理
{
    //画像ハンドルの宣言
    int BG1, BG2, BG3, BG4, BG5;  //背景
    int drop[9];  //ブロック

    //画像の読み込み
    BG1 = LoadGraph("graph/bg1.jpg");
    BG2 = LoadGraph("graph/bg2.jpg");
    BG3 = LoadGraph("graph/bg3.jpg");
    BG4 = LoadGraph("graph/bg4.jpg");
    BG5 = LoadGraph("graph/bg5.jpg");    //ここまで背景
    LoadDivGraph("graph/drop.png", 9, 3, 3, 35, 35, drop);    //ブロック

    //背景画像の表示
    DrawGraph(0, 0, BG1, TRUE);
    DrawGraph(30, 0, BG2, TRUE);    
    DrawGraph(30, 450, BG3, TRUE);    
    DrawGraph(450, 30, BG4, TRUE);    
    DrawGraph(30, 30, BG5, TRUE);

    //ブロックの初期表示
    int masume[12][12];    //ブロックを置くマス目
    int i, j, a, x, y;
    a= GetRand(8);    //ランダム
    x= 30;    //座標
    y= 30;    //座標

    for(i=0; i<12; i++)
    {
    for(j=0; j<12; j++)    //初期表示
    {
    DrawGraph(x, y, drop[a], TRUE);
    x=x+35;
    }
    x=30;
    y=y+35;
    }

return 0;
}


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


Name: Ma  ..熟練のプログラマー(43,034ポイント)   Date: 2010/02/02(火) 05:00   No:47542     
Title: Re:画像のランダム表示について    
>動かしてみたところ全てのマスが一緒にチカチカと瞬いてしまいます。 
もうちょっと詳しく説明してもらえませんか?
画像が一緒になっているのが、画像がいれかわってちかちかなのか、それとも同じ画像が消えたり表示したりでちかちかなのか。。。




まぁ、ソースコード読むことで言わんとしていることはだいたいわかりました。
原因は、GetRand を1ループにつき1回しかしていないことです。
マスごとに違う画像にしたいなら、1ループで144回やらないといけないはずですよ?

   
 つまりこう

    for(i=0; i<12; i++) 
    { 
    for(j=0; j<12; j++)    //初期表示 
    { 
    a= GetRand(8);    //ランダム 
    DrawGraph(x, y, drop[a], TRUE); 
    x=x+35; 
    } 
    x=30; 
    y=y+35; 
    } 


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

Name: wm  ..ぴよぴよ(707ポイント)   Date: 2010/02/02(火) 21:18   No:47554     
Title: Re:画像のランダム表示について    
レスありがとうございます!

説明が下手で申し訳ありません。
画面全体の画像が一斉に入れ替わってちかちかする状態になっていました。
教えて頂いた通りにGetRandをループ内に入れることでマスごとの表示をバラバラにすることができました。
ありがとうございました。

もう一つわからないことがあるのですが、よろしいでしょうか?
今の状態で、144個のマスで違う画像が表示されるようになりましたが
マスごとに表示された画像が高速で入れ替わってしまっています。
ランダムに表示されたそれぞれの画像を入れ替わらないように静止させたいのですが、どうすればいいのでしょうか。


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

Name: 猫旅  ..ぴよぴよ(198ポイント)   Date: 2010/02/03(水) 01:17   No:47558     
Title: Re:画像のランダム表示について    
フラグを使ってはいかがですか?

1、グローバル領域にbool randF = false;
  (ローカルならstaticつけて)と宣言
2、randF = falseならランダムの処理
3、ランダム処理後randFをtrueに

以上で出来るかと思います。


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

Name: wm  ..ぴよぴよ(926ポイント)   Date: 2010/02/04(木) 18:00   No:47636     
Title: Re:画像のランダム表示について    
レスありがとうございます。

以下のようにboolを使ってみたのですが、うまくいきません。

    bool randF = true;
    
    if(randF = true)
    {
    for(i=0; i<12; i++)
    {
    for(j=0; j<12; j++)    //初期表示
    {
    a= GetRand(8);    //ランダム処理
    DrawGraph(x, y, drop[a], TRUE);
    x=x+35;
    }
    x=30;
    y=y+35;
    }
    randF = false;
    }

trueとfalseを入れ替えるとforの処理自体が行われなくなりますし…。
やり方が間違っているのでしょうか?
何度もお聞きしてしまい申し訳ありませんが、よろしくお願いします。


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

Name: ランド  ..初心者(5,761ポイント)   Date: 2010/02/05(金) 01:14   No:47653     
Title: Re:画像のランダム表示について    
if文の中が = 1個になってるみたいです。 編集済み

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

Name: Ma  ..熟練のプログラマー(44,192ポイント)   Date: 2010/02/05(金) 02:13   No:47654     
Title: Re:画像のランダム表示について    
static bool randF = true;
for(i=0; i<12; i++)  {     
    for(j=0; j<12; j++){
        if(randF == true){
            a= GetRand(8);
            randF = false;
        }
        DrawGraph(x, y, drop[a], TRUE);    
        x=x+35;
    } 
    x=30;
    y=y+35;
}
if(!randF && GetRand(50) == 0)
    randF = true;


for文の実行順番とか理解していますか?
そもそも、インデントされていないのが問題です。
もし、しっかりどのようにプログラムが流れるのか把握していないのなら
入門サイト等を読むなどして基本を学習しなおしましょう。

追記
(↑のプログラムは一定の確率で画面が変わります。静止させたいのなら 最後の if 文をとりけしてください。) 編集済み


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



Name: ひよこ  ..比類無きプログラマー(79,434ポイント)   Date: 2010/02/04(木) 18:19   No:47637       
Title: newの例外処理について    
ただいま勉強中なのですが、newでメモリの確保に失敗すると例外が発生しますよね。
もし、ゲームの中でメモリ確保に失敗したら、例外をキャッチして今まで確保したメモリを解放して、
終了という感じでよろしいのでしょうか?


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


Name: たかぎ [URL]  ..ハッカー(158,396ポイント)   Date: 2010/02/04(木) 18:35   No:47639     
Title: Re:newの例外処理について    
どうしたいのかによります。
理想的には、最低限、ゲームの途中経過を何からの形で保存してから終了するのが望ましいですが、それをやるにもメモリを新たに割付けなければならないケースもあるため、常にできるとはかぎりません。

メモリ使用量を踏まえて、メモリの割付けに失敗することがありえない場合、あるいはメモリ不足を検出してもどうすることもできない場合は、いっそメモリ不足に対しては何もしないという選択肢もあり得ます。
そうでなければ、前もってメモリ不足が発生した場合に必要になるメモリをキープしておく必要があるでしょう。


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

Name: ひよこ  ..比類無きプログラマー(79,533ポイント)   Date: 2010/02/04(木) 19:05   No:47641 解決!     
Title: Re:newの例外処理について    
そうですか、思い切って何もしないようにします。(おそらく、最近のパソコンでは起きなさそうですから。
セーブデータを保存することも考えておきます。
メモリを保存しておくのもあるんですか、勉強になります。
たかぎさんありがとうございました。


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



Name: イーグル  ..ぴよぴよ(100ポイント)   Date: 2010/02/04(木) 17:26   No:47629       
Title: 分割コンパイル    
こんにちは
   イーグルです
   最近東方のようなSTGゲームを作っています
   そこで敵の攻撃などのプログラムするとめんどうなので
   誰か分割コンパイルの方法を教えてください



Name: たかぎ [URL]  ..ハッカー(158,200ポイント)   Date: 2010/02/04(木) 17:33   No:47630     
Title: Re:分割コンパイル    
まだ書きかけの記事で中途半端なのですが、何かの役には立つかもしれません。
http://www.kijineko.co.jp/tech/sepcomp

# というか、最近まで存在を忘れかけていたので、時間が取れ次第、第2回以降を書きたいと思います。


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



Name: AO  ..ぴよぴよ(164ポイント)   Date: 2010/02/03(水) 23:26   No:47604       
Title: RPGで言う村人と動くマップチップについて    
自分でも考えてみたのですが
何か他に良いやり方などがあったら教えてもらいたいです。

こちらのサイトのようなマップを作ったのですが、
村人のようにマップを移動するイベントはどう作ればよいのでしょうか。
マップをクラスで作って変数にマップ位置と、村人を描く位置を作り
村人を描く位置が(マップチップのサイズの半分)以上進んだら隣のマップ位置に移り
(-マップチップサイズの半分)を代入しから0まで村人を描く位置に持っていくというのを考えたのですが
効率が悪いような感じがします。



動くマップチップについてですが
私が作りたいのは川の流れのようなものです。
私の考えているやり方だと、クラス内の関数でマップチップの番号を変えて描画する方法なのですが、
毎回マップの二次元配列を全て読み込みしなければならない為、こちらも効率が悪いような感じがします。

説明不足や文章が分かり難い場合は気軽に質問してください。どうかよろしくお願いします


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


Name: softya  ..ハッカー(114,333ポイント)   Date: 2010/02/03(水) 23:42   No:47605     
Title: Re:RPGで言う村人と動くマップチップについて    
まぁ、色々方法はあるんですが。

1.マップチップのパーツ番号を仮想化する方法。
マッチチップのパーツ番号をテーブル番号と見立てることで、マップパーツテーブルを参照してから表示するようにする方式。マップパーツテーブルに書かれているパーツ番号を書き換えるだけでアニメ出来る。

●マップチップ
01022340
02044440
00544000

●マップパーツテーブル
[0]0
[1]1
[2]2
[3]3
[4]4 ← ここだけ4,6,8などに変化。
[5]5

●実際の表示。[4]が6なら
01022360
02066660
00566000

2.マップに大規模なコピペをする方法。
アニメーションするブロックだけの別マップを作っておいて、そこからアニメ番号順にブロック毎にコピーしてくる方式。パッチ式とも言う。

●マップチップ
01022340
02044440
00544000

●別マップチップ。これをマップにコピペする。
[0]
2234
4444
4400
[1]
2236
6666
6600
[2]
2238
8888
8800


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

Name: AO  ..ぴよぴよ(230ポイント)   Date: 2010/02/04(木) 15:05   No:47615     
Title: Re:RPGで言う村人と動くマップチップについて    
softyaさんお答えありがとうございます。
マップチップのパーツ番号を仮想化する方法とパッチ式ですか。
とても参考になりました。
パッチ式など良く調べてからプログラミングに活かしたいと思います。


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

Name: softya  ..ハッカー(114,876ポイント)   Date: 2010/02/04(木) 15:21   No:47618     
Title: Re:RPGで言う村人と動くマップチップについて    
どちらも、古典的な手法ですので速度的には問題ないはずです。
※ この手法は、8ビットパソコンMSXやファミコン時代から使われています。あとパレットアニメと言う古典手法もありますが、DirectXではかえって難しいので解説しませんでした。

あと書き忘れましたが、村人とかはキャラクタとしてマップと別に描画した方が良いです。
「ゲームプログラミングの館」の20章から22章に書かれていることを自キャラでは村人に適用すれば良いわけで、村人はキー入力ではなくAIか適当なアルゴリズムで移動させると言う点が違うだけです。


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

Name: AO  ..ぴよぴよ(278ポイント)   Date: 2010/02/04(木) 16:56   No:47627 解決!     
Title: Re:RPGで言う村人と動くマップチップについて    
softyaさん両方の質問に丁寧に答えてくれてありがとうございます。
とても助かりました。


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



Name: デジキャメ  ..初心者(6,272ポイント)   Date: 2010/02/02(火) 01:22   No:47535       
Title: コントロールパスについて    
#include "DxLib.h"
#define BOX       (20)
#define MESH_Y    (15)
#define MESH_X    (15)
#pragma warning(disable:4996)

/**********************************************マスの作成****************************************/
int PIEL(int x, int y, int color){

 int Wh=GetColor(255,255,255), Bl=GetColor(70,70,255), Gr=GetColor(70,255,70), Rd=GetColor(255,155,255);
 int Yl=GetColor(249,230,0), col[]={Wh,Bl,Rd,Yl,Gr}, sx=x*BOX, sy=y*BOX;

    DrawBox(sx, sy, sx+BOX-1, sy+BOX-1, col[color], TRUE); return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
 
    int  SetFontThickness(int TinckPal), CheckHitKey(int KeyCode), i, j, MouseX, MouseY, Gry,k=0; 
    int  PI[MESH_Y][MESH_X]={0},d=0, sum=0;
    int  jMX=0, P=15,  p[15][15], t[15], bango[15][15], ironanba[15][15], c; FILE *file;
    
    ChangeWindowMode(TRUE);        
    if(DxLib_Init() == -1){return -1;} 
    SetMouseDispFlag(TRUE);
    Gry=GetColor(200, 200, 200);    
    DrawBox(0, 0, 800, 600, Gry, TRUE);
    for(i=0; i<MESH_Y; i++){
        for(j=0; j<MESH_X; j++){
            PIEL(j, i, 0);
        }
    }
/*********************************************左クリック***************************************/
    while(!ProcessMessage()){
        if((GetMouseInput() & MOUSE_INPUT_LEFT)){
            while (GetMouseInput() & MOUSE_INPUT_LEFT);
            GetMousePoint(&MouseX, &MouseY);
            MouseX = MouseX/BOX;
            MouseY = MouseY/BOX;
            if(MouseX<MESH_X && MouseY<MESH_Y){ PI[MouseY][MouseX]++;
        if( PI[MouseY][MouseX]>4)  PI[MouseY][MouseX]=0;
                PIEL(MouseX,MouseY, PI[MouseY][MouseX]);
            }
        }
    }
/***************************************ファイル読み書き込み***********************************/
        file=fopen("meshpanel.txt","w");
        for(i=0; i<MESH_Y; i++){
            for(j=0; j<MESH_X; j++){
        fprintf(file,"%d ",PI[i][j]);
            }
            fprintf(file,"\n");
        }
        fclose(file);
        file=fopen("meshpanel.txt","r");
        for(i=0; i<MESH_Y; i++){
            for(j=0; j<MESH_X; j++){
                fscanf(file,"%d", &PI[i][j]);
            }
        }
        fclose(file);
/*****************************************/ 
        for (c = 0; c < P; c++) {
            for (j=0; j<P; j++){
                t[j] = p[j][c];
            }
            for (j = 0; j < P;j++){
                ironanba[c][j] = 0;
            } 
            while (k < P){
                while ((t[j]==0) && (j< MESH_Y)) j+=j;
                if (k>= MESH_Y) break;
                i = t[k];
                while (t[j]==i){
                    k+=k;
                }
                ironanba[c][d] =i;
                d+=d; 
            }
        }
                file=fopen("takasairo.txt","w");
        for (j = 0; j <= P; j++) {
            for (c=0; c<P; c++){
                fprintf(file,"%d",ironanba[c][j]);
            }
            fprintf(file,"\n");        
        }
        fclose(file);
}

をコンパイルすると、
warning C4715: 'WinMain' : 値を返さないコントロール パスがあります
とでてきます。実行が file=fopen("takasairo.txt","w");while付近でストップします。

returnが必要なのでしょうか?



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


Name: Ma  ..熟練のプログラマー(42,677ポイント)   Date: 2010/02/02(火) 02:47   No:47539     
Title: Re:コントロールパスについて    
>returnが必要なのでしょうか? 
必要です。 編集済み


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

Name: デジキャメ  ..初心者(6,290ポイント)   Date: 2010/02/04(木) 16:47   No:47625 解決!     
Title: Re:コントロールパスについて    
解決しました。

ありがとうございます。


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



Name: 紅葉  ..中級者(11,985ポイント)   Date: 2010/02/03(水) 02:58   No:47560       
Title: ゲームを作りました。    
>>管理人様
申し訳ないのですが場所をお借りします。

ここのサイトでDXライブラリについて勉強させて頂きましてゲームを作りました。
とても面白いとは言えませんが初めて自分だけで作ったものなので
優しくなじってくれると助かります。

http://www1.axfc.net/uploader/Sc/so/79096
Pass:dxlib

その他アドバイスとか書いて頂けますと嬉しいです。


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


Name: dic  ..熟練のプログラマー(50,842ポイント)   Date: 2010/02/03(水) 05:46   No:47565     
Title: Re:ゲームを作りました。    
やらせてもらいました
当たらないように逃げるゲームでしょうか?
プレイヤーが表示されないのですが
素材は全部入ってるでしょうか?

私だけの環境だったらすいません


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

Name: 紅葉  ..中級者(12,035ポイント)   Date: 2010/02/03(水) 05:54   No:47566     
Title: Re:ゲームを作りました。    
プレイありがとうございます。

すみませんプレイヤーの画像は元からないです

マウスでプレイするゲームです。
おしゃるとおり敵っぽいのからひたすら逃げて下さい。


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

Name: kerotan0820  ..上級者(23,357ポイント)   Date: 2010/02/03(水) 13:26   No:47573     
Title: Re:ゲームを作りました。    
プレイさせていただきました^^
dicさん同様操作方法などのが分からず困っていましたw
ルールを把握するのに10分掛かりましたw
途中でマウスに当たり判定があることに気づいてやっと始まったのですが、非常に面白いですね〜
イライラ棒をやっているような気分でした 
これもいろいろなステージとか作って敵にバリエーション加えたら面白そうですね
がんばってください^^


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

Name: バグ  ..ハッカー(189,007ポイント)   Date: 2010/02/03(水) 14:06   No:47575     
Title: Re:ゲームを作りました。    
ウインドウの外にカーソルを持っていくと永遠に逃げられますね(^_^;)
あとは時間の加算単位を秒ではなく、100ミリ秒単位くらいにすると緊迫感が増すかもしれません。
個人的にこういうお手軽ゲーム大好きですよ♪


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

Name: dic  ..熟練のプログラマー(50,896ポイント)   Date: 2010/02/03(水) 17:56   No:47591     
Title: Re:ゲームを作りました。    
イラッ
(冗談よ? 編集済み


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

Name: ひよこ  ..比類無きプログラマー(79,378ポイント)   Date: 2010/02/03(水) 21:10   No:47599     
Title: Re:ゲームを作りました。    
遊ばせていただきました。
こういう簡単なゲームもいいですね。
個人的には説明書(read me.txt)があるといいのかもしれません。
制作お疲れ様です。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,145,698ポイント)   Date: 2010/02/04(木) 07:37   No:47611     
Title: Re:ゲームを作りました。    
お〜面白いですね^^
シンプルなのに、何故か引き込まれる要素がありますね。

配布する時はビットマップではなく、PNGがいいですよ。
後、DXライブラリのlongファイルを出さない設定にして配布した方がいいかもしれません。
それとやはり自分のイラストは欲しいですね><

> バグさん

確かに^^;


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



Name: 青木  ..ぴよぴよ(24ポイント)   Date: 2010/02/03(水) 18:00   No:47592       
Title: 課題研究    
学校の課題研究でシューティングゲームを作る際に参考にさせていただいたので、ご報告します。


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


Name: softya  ..ハッカー(113,880ポイント)   Date: 2010/02/03(水) 18:09   No:47593     
Title: Re:課題研究    
龍神録を利用された場合は、利用規約をごらんください。
http://dixq.net/rp/kiyaku.html
メールで管理人さんに利用規約にそった報告をお願いします。

[引用]
専門学校の卒業制作や何かの制作物として教育機関などに提出される際は一度ご連絡ください。
その際は提出先とお名前をご連絡内容に添えて下さい。




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

Name: Dixq (管理人) [URL]  ..ウィザード(1,145,601ポイント)   Date: 2010/02/04(木) 07:33   No:47610     
Title: Re:課題研究    
最近特に卒業制作や進級制作で同じメールが多いのですが、
時々メールアドレスに間違いがあって返信できないものがありますので、
返事が無い場合はメールアドレスを確認の上、再送して下さい。



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



Name: ムンバ  ..プログラマー(27,656ポイント)   Date: 2010/02/03(水) 23:48   No:47606       
Title: 「ゲームプログラミングの館」について    
こんばんはっ!お世話になってます。(_ _)

こちらのページの「プログラミングの館」の
「54. 文字のサイズや太さを変更する(1度きりの場合) 」
約15行目位なのですが・・・(空白行、抜きでのアバウトな行数ですが)

プレーする人のパソコンに入っていない場合がありますの、なるべくメジャーなフォントを使用しましょう。

↑ ありますの→ありますので?

脱字かと思うのです。(自信が無くなってます。<(_ _)>) 

誤字や脱字とか、チェックしてるつもりは無いのですが・・・すみません。^^;

今日は、「s13. sin,cosって何?シューティングの基本概念」  
まで、復習しました。
勉強になってます。w

揚げ足とか取ってるつもりは無いのですが
お時間ある時に必要でしたら、ご修正の程、宜しくお願い致します。
私の解釈の違いで、脱字でなければ大変申し訳御座いません。(謝


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,145,547ポイント)   Date: 2010/02/03(水) 23:54   No:47607     
Title: Re:「ゲームプログラミングの館」について    
入ってない場合がありますの・・ってどこのおばちゃんだよとw
ご報告ありがとうございます^^
誤字などの報告はありがたいので、是非お願いします。
特に共有する必要のない情報でしたらメールでも結構です。


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

Name: ムンバ  ..プログラマー(27,736ポイント)   Date: 2010/02/04(木) 00:10   No:47609 解決!     
Title: Re:「ゲームプログラミングの館」について    
>入ってない場合がありますの・・ってどこのおばちゃんだよとw

嫁には、「ありますの」って、何処のセレブだよっ!?
って、突っ込まれました。(笑

お忙しい中、レスありがとう御座いました。
おやすみなさい!(∪。∪)。。。zzzZZ


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



Name: 匿名  ..上級者(20,152ポイント)   Date: 2010/02/03(水) 16:48   No:47578       
Title: 無題    
本家ページよりゲームプログラミングのページに行けなくなってしまいました。

ファイルが見つかりませんでしたと表示されます。

2時間くらい前は普通に行けたので。

この症状は自分だけでしょうか?



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


Name: fatens  ..初心者(7,251ポイント)   Date: 2010/02/03(水) 16:52   No:47580     
Title: Re:無題    
ゲームプログラミングの館または龍神録プログラミングの館のことなら問題なく表示できます。
ページを更新してみてはどうでしょうか。


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

Name: 匿名  ..上級者(20,293ポイント)   Date: 2010/02/03(水) 17:02   No:47582     
Title: Re:無題    
返信ありがとうございます。

ページ更新、またブラウザの再起動もしてみましたが見れませんでした><

次の3行のように表示されました。

http://dixq.net/g/ にはファイルが見つかりませんでした。
  
    *   アドレスに大文字/小文字の違い、その他の間違いがないか確認してください。

    *   ファイルの名前が変更、削除、または移動している可能性があります。


ゲームプログラミングの館以外のホームページにはつながるのでインターネットにはつながっているようです。


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

Name: kazuoni [URL]  ..ハッカー(133,409ポイント)   Date: 2010/02/03(水) 17:04   No:47583     
Title: Re:無題    
http://dixq.net/g/ 

ではなく

http://dixq.net/g/

でアクセスできませんか?


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

Name: 匿名  ..上級者(20,237ポイント)   Date: 2010/02/03(水) 17:06   No:47584     
Title: Re:無題    
返信ありがとうございます。

同じくアクセスできません。

パソコンおよびインターネットを再起動してみます。


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

Name: softya  ..ハッカー(113,672ポイント)   Date: 2010/02/03(水) 17:07   No:47585     
Title: Re:無題    
URLの最後に表示されない文字コードが入っています。
手で打ち直してみて下さい。


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

Name: 匿名  ..上級者(20,324ポイント)   Date: 2010/02/03(水) 17:18   No:47586     
Title: Re:無題    
パソコンを再起動して、手でURLを打ち込みましたがつながりませんでした.

他のページを表示できたのでインターネットにはつながっていると思います。

試しにウイルスバスターを切ってアクセスしてみましたが結果は同じでした。

ふーむ、困った。


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

Name: fatens  ..初心者(7,304ポイント)   Date: 2010/02/03(水) 17:27   No:47588     
Title: Re:無題    
http://dixq.net/g/00.html
ゲームプログラミングの館内のページはどうでしょうか?


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

Name: softya  ..ハッカー(113,757ポイント)   Date: 2010/02/03(水) 17:36   No:47589     
Title: Re:無題    
DNSからdixp.netが何らかの原因で消えたかも知れません。
tracert dixp.net
が私のところでもDNSが解決出来ませんでした。
このままだと、徐々に私も含めて他の人も見えなくなるかも知れません。

と思ったら打ち間違いでした。
正解:tracert dixp.net
って事で、トレース出来ました。

あと考えられるのは、ルータの不調や故障などですね。
ルータがあるなら再起動してみて下さい。

 編集済み


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

Name: 匿名  ..上級者(20,482ポイント)   Date: 2010/02/03(水) 17:52   No:47590     
Title: Re:無題    
返信ありがとうございます。

まだ見れませんが、どうにも自分のパソコンが影響しているようです。

他のページでもきちんと読み込めていない部分があります;;

例えば、mixiアプリのようなゲーム。





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

Name: SooA [URL]  ..プログラマー(28,930ポイント)   Date: 2010/02/03(水) 18:32   No:47594     
Title: Re:無題    
j-word などのアドオンがインストールされていると
不具合が生じる可能性があります。
そういったもののインストールを行いませんでしたか?


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

Name: 匿名  ..上級者(20,486ポイント)   Date: 2010/02/03(水) 20:21   No:47596     
Title: Re:無題    
返信ありがとうございます。

色々いじり、firefoxのキャッシュをすべてを消したところ無事ホームページが表示されるようになりました。

ご迷惑をお掛けしました。

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



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

Name: 匿名  ..上級者(20,499ポイント)   Date: 2010/02/03(水) 20:22   No:47597 解決!     
Title: Re:無題    
解決ボタン押し忘れました。

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



Name: dic  ..熟練のプログラマー(50,697ポイント)   Date: 2010/02/03(水) 05:40   No:47563       
Title: リンクエラーが起きる    
winsock関係の質問になりますが、
ソースコードを http://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/basic-client.html
から参考にしてコンパイルするのですが

リンク中...
basic-clinet.obj : error LNK2001: 外部シンボル ""bool __cdecl ShutdownConnection(unsigned int)" (?ShutdownConnection@@YA_NI@Z)" は未解決です
basic-clinet.obj : error LNK2001: 外部シンボル ""char const * __cdecl WSAGetLastErrorMessage(char const *,int)" (?WSAGetLastErrorMessage@@YAPBDPBDH@Z)" は未解決です
Debug/winsock01.exe : fatal error LNK1120: 外部参照 2 が未解決です。
link.exe の実行エラー

とでてリンクできません
関数の定義なども調べたのですが、私の知識では解決できません
このソースコードのどこが悪いのでしょうか?

開発環境
VC++6.0


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


Name: さかまき  ..ぴよぴよ(270ポイント)   Date: 2010/02/03(水) 09:33   No:47570     
Title: Re:リンクエラーが起きる    
ShutdownConnectionとWSAGetLastErrorMessage関数がリンクできていません。
そこで、「WSAGetLastErrorMessage」でGoogle検索してみると
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/index.html にたどり着きます。
ここにある、「ws-util.cpp」 が必要なんでしょう。


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

Name: dic  ..熟練のプログラマー(50,890ポイント)   Date: 2010/02/03(水) 16:58   No:47581 解決!     
Title: Re:リンクエラーが起きる    
たしかに実態が定義されていないすね
サーッとしか見てなかったです

ws-util.cpp を追加したらリンクできました
ありがとうございました


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



Name: デバック用  ..ぴよぴよ(292ポイント)   Date: 2010/02/01(月) 02:23   No:47463       
Title: デバック用の関数    
デバック用の関数を作ろうとしてます。
ただ可変引数の参照の仕方がイマイチわかりません。
下記のソースでエラーが出るのですが
このようなことはできないのでしょうか?

void DebText(char *FormatString, ... ){
    DrawFormatString(0,0,GetColor(255,255,255), FormatString, (char*)(&FormatString+1));
}


また変数名の取得をする方法などはあるのでしょうか?
調べたのですが出てきませんでした・・・。
例えば 

int test=0;

引数にtestを入れると
FormatStringに格納されている値がtest(※0ではなくて)になる。

というのも自動的に"test = 0"みたいに表示して欲しいので質問させていただきました。


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


Name: デバック用  ..ぴよぴよ(319ポイント)   Date: 2010/02/01(月) 02:31   No:47464     
Title: Re:デバック用の関数    
連レスにて失礼します。
間違えてました。

エラーが出ます → エラーは出ないのですが値が変です。


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

Name: たいちう  ..熟練のプログラマー(53,902ポイント)   Date: 2010/02/01(月) 10:06   No:47482     
Title: Re:デバック用の関数    
他の人にも必要そうな情報ならば、
ちょっとググればサンプルが見つかるのです。

可変長引数について
http://www.geocities.jp/ky_webid/c/057.html

DrawFormatStringについて
http://studiokingyo.fc2web.com/dxlib/kowaza/k1.html

※ リンクがあると投稿に失敗したので、全角にしています。


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

Name: non  ..比類無きプログラマー(90,365ポイント)   Date: 2010/02/01(月) 12:14   No:47492     
Title: Re:デバック用の関数    
>また変数名の取得をする方法などはあるのでしょうか?

残念ながら、存じません。
変数名を、文字列リテラルで与えていいのなら、出来ますが、
そうすると、
引数が(test,"test")のようになって面倒ですね。


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

Name: デバック用  ..ぴよぴよ(346ポイント)   Date: 2010/02/01(月) 17:07   No:47500     
Title: Re:デバック用の関数    
ご回答ありがとうございます。

>>たいちう様
URLを拝見させていただきました。

1つ目のリンクなのですがこれだと引数にいくつの可変長引数があるかを
あらかじめ与えてあげないのではないでしょうか?
出来ればそういった情報を与えないでも自動的にやってくれるようにしたいです。

2つ目は何処を見ればよろしいのでしょうか・・・?

>>non様
では多分出来ないのでしょうね・・・。
残念です><
色々と教えていただきありがとうございます。


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

Name: non  ..比類無きプログラマー(90,293ポイント)   Date: 2010/02/01(月) 17:21   No:47501     
Title: Re:デバック用の関数    
>1つ目のリンクなのですがこれだと引数にいくつの可変長引数があるかを 
>あらかじめ与えてあげないのではないでしょうか?

なんらかの形で引数の数を知らせる必要があります。
しかし、あなたの仕様では
char *FormatString があるので、これでわかりますね。
%d や %s などで個数と型がわかります。


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

Name: たいちう  ..熟練のプログラマー(54,587ポイント)   Date: 2010/02/01(月) 17:37   No:47502     
Title: Re:デバック用の関数    
> 出来ればそういった情報を与えないでも自動的にやってくれるようにしたいです。

http://www.ncad.co.jp/ ̄komata/c−kouza4.htm
これが参考になるかと。


> 2つ目は何処を見ればよろしいのでしょうか・・・?

DrawFormatStringの使い方のサンプルもあったほうが良いかと思い、
「メインメモリのリアルタイム容量表示」の部分を紹介したつもりでした。
不要ならば結構です。


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

Name: デバック用  ..ぴよぴよ(201ポイント)   Date: 2010/02/01(月) 17:51   No:47503     
Title: Re:デバック用の関数    
ご回答ありがとうございます。
URLを張っていただいたりした中
申し訳ないのですが今の私では理解できそうにありません・・・。

どうか今回だけはサンプルを頂けないでしょうか。

void DebText(char *FormatString, ... ){
//    va_list list;
//    va_start( list, FormatString );  /* 可変引数リストの使用準備 */
//    for(int i=0; i<FormatString; ++i){
///        DrawFormatString(x,y,GetColor(255,255,255), FormatString, (char*)(&FormatString+1));
//    }
//    va_end( list );  
}


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

Name: non  ..比類無きプログラマー(90,316ポイント)   Date: 2010/02/01(月) 18:58   No:47512     
Title: Re:デバック用の関数    
たいちうさんが示された可変長変数のURLの練習問題2が参考になると思います。


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

Name: デバック用  ..かけだし(1,176ポイント)   Date: 2010/02/01(月) 20:21   No:47516     
Title: Re:デバック用の関数    
non様
回答ありがとうございます。
私がやると下記の様なエラーが出てしまいます。
お願いします・・・。関数を作っては頂けないでしょうか?


1>C:\Program Files\Microsoft Visual Studio 8\VC\include\stdarg.h(29) : warning C4005: 'va_start' : マクロが再定義されました。
1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\varargs.h(88) : 'va_start' の前の定義を確認してください
1>C:\Program Files\Microsoft Visual Studio 8\VC\include\stdarg.h(30) : warning C4005: 'va_arg' : マクロが再定義されました。
1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\varargs.h(89) : 'va_arg' の前の定義を確認してください
1>C:\Program Files\Microsoft Visual Studio 8\VC\include\stdarg.h(31) : warning C4005: 'va_end' : マクロが再定義されました。
1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\varargs.h(90) : 'va_end' の前の定義を確認してください
1>.\DrawLib.cpp(211) : error C2065: 'va_alist' : 定義されていない識別子です。
1>.\DrawLib.cpp(211) : error C2146: 構文エラー : ';' が、識別子 'va_list' の前に必要です。
1>.\DrawLib.cpp(211) : error C2146: 構文エラー : ';' が、識別子 'va_alist' の前に必要です。
1>.\DrawLib.cpp(211) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>.\DrawLib.cpp(211) : error C2377: 'va_list' : 再定義されています。typedef は他のどのシンボルでもオーバーロードできません
1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\vadefs.h(61) : 'va_list' の宣言を確認してください。
1>.\DrawLib.cpp(211) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>.\DrawLib.cpp(211) : error C2371: 'va_alist' : 再定義されています。異なる基本型です。
1>.\DrawLib.cpp(211) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
1>.\DrawLib.cpp(214) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(214) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(215) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(215) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(217) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(217) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(218) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(218) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(220) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(220) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(221) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(221) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(222) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(222) : error C3872: '0x3000': この文字を識別子で使用することはできません


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

Name: たいちう  ..熟練のプログラマー(54,718ポイント)   Date: 2010/02/01(月) 21:32   No:47520     
Title: Re:デバック用の関数    
> どうか今回だけはサンプルを頂けないでしょうか。

どう見ても捨てハンの人に今回だけって言われてもねぇ。
どっちみち今使っているPCにはDXライブラリが入ってないので作れません。

それよりも自分で作れるようになる方が魅力的ではないですか?
そのための手伝いならできますので、まず、
http://www.geocities.jp/ky_webid/c/057.html
の void func(int num, ...); を実行してください。


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

Name: ST  ..ぴよぴよ(104ポイント)   Date: 2010/02/01(月) 22:33   No:47526     
Title: Re:デバック用の関数    
たいちう様
すみません・・・。
いつも本家で聞いておりこちらに来たのが初めてだったので・・・。
また固定のHNをもったことがないのでこれからは私のイニシャルで投稿させていただきます。

自分で作りたいのですが
こればかりはサンプルのソースを見たほうが
理解できると判断したので質問させていただきました。
普通の関数などは作ることができます・・・。

お願いです・・・。教えてください><


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

Name: softya  ..ハッカー(113,205ポイント)   Date: 2010/02/01(月) 23:13   No:47528     
Title: Re:デバック用の関数    
出ているエラーが、関数が作れる人のエラーと思えません。
初心者レベルのエラーが多数見受けられます。
とりあえずエラー取ってみませんか。


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

Name: non  ..比類無きプログラマー(90,378ポイント)   Date: 2010/02/01(月) 23:21   No:47529     
Title: Re:デバック用の関数    
あのエラーはどのプログラムのエラーですか?
ソースを載せてください。

それより、なぜ、そんなデバッグ用の関数が必要なんでしょうか?
なくてもいいのでは?


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

Name: ST  ..ぴよぴよ(479ポイント)   Date: 2010/02/01(月) 23:37   No:47533     
Title: Re:デバック用の関数    
すみません・・・かなりいじってしまったので
ソースの原型が残っておりません・・・。

作りたい理由としてこれを呼ぶだけでy軸を調整してくれるような仕様にしようと考えております。
Deb.Cntに読んだ回数
FONT_SIZEが文字サイズです。

かなり便利かと思うのですがこういうことはしないものなのでしょうか?

void DebText(char *FormatString, ... ){
    int x = 0;
    int y = Deb.Cnt*FONT_SIZE;

//    va_list list;
//    va_start( list, FormatString );  /* 可変引数リストの使用準備 */
//    for(int i=0; i<FormatString; ++i){
///        DrawFormatString(x,y,GetColor(255,255,255), FormatString, (char*)(&FormatString+1));
//    }
//    va_end( list );  
    Deb.Cnt++;
}



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

Name: YuO  ..熟練のプログラマー(42,669ポイント)   Date: 2010/02/02(火) 02:17   No:47538     
Title: Re:デバック用の関数    
va_list相手に自分で処理するくらいなら,vsnprintfに任すのも手だと思います。
メモリの管理だけは自分でする必要がありますが。

MSDN: vsnprintf、_vsnprintf、_vsnprintf_l、_vsnwprintf、_vsnwprintf_l
http://msdn.microsoft.com/ja-jp/library/1kt27hek.aspx

流れとしては,
1. va_start
2. mallocで文字列バッファを確保 (malloc失敗時の処理を忘れずに)
3. vsnprintfでバッファへ出力
4. vsnprintfに失敗してればfreeして2へ (次回はバッファ長を増やす)
5. va_end
6. 文字列をDrawStringで出力
7. free
という感じになるかと思います

デバッグ目的とのことなので,場合によっては固定長の文字列バッファでもよいでしょう。
# 誰も突っ込まないので突っ込んでおくと,デバッ「グ」と,全ての音が濁ります (debug)。


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

Name: たかぎ [URL]  ..ハッカー(157,750ポイント)   Date: 2010/02/02(火) 03:09   No:47540     
Title: Re:デバック用の関数    
>また変数名の取得をする方法などはあるのでしょうか? 

ひとつだけ方法があります(厳密にいうともうひとつありますが紹介しません)。
可変長引数マクロを使って、

#define DebText(format, ...)  #__VA_ARGS__ (以下省略)

のようにすれば、可変長引数に与えた内容が文字列として取り出せます。
あとは、これを解析すれば何とかなります。
ただし、単純な識別子やリテラルだけならともかく、式を実引数として与えると、C++パーサーと同じぐらいの仕事をしなければなりません。
それなりの大変さを覚悟してください。


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

Name: SooA [URL]  ..プログラマー(28,982ポイント)   Date: 2010/02/02(火) 07:54   No:47544     
Title: Re:デバック用の関数    
>かなり便利かと思うのですがこういうことはしないものなのでしょうか? 
なさろうとしていることが printf や printfDx そのものに
見えるんですが、そのまま使う方法ではダメなのでしょうか?


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

Name: 西村  ..中級者(10,006ポイント)   Date: 2010/02/03(水) 01:02   No:47557     
Title: Re:デバック用の関数    
横から失礼します。
たかぎさんって毎回難しい言葉使って
質問者をいじめてませんか・・・?

スレ主には悪いですがこのような質問をする人が
C++パーサー等理解してるわけないですよね?

もう少しわかりやすく説明された方が
回答者からも喜ばれると思いますよ?

>>デバック用さん
以前、似た様な質問をここで見た記憶が御座います。
URLがでてこないのですがソース書きます。
可変長引数を与える方法ではないのですが
これでも表示ができます。

void        dumDebTextXY(int x, int y, int deb, char *name);
void        dumDebText(int deb,char *name);
#define        DebTextXY(X,Y,DEB)        dumDebTextXY(X,Y,DEB,TEXT(#DEB))
#define        DebText(DEB)            dumDebText(DEB,TEXT(#DEB))

void dumDebTextXY(int x, int y, int deb,char *name){
    char str[1024] = "";
    wsprintf(str, TEXT("%s = %d"),name,deb);
    DrawFormatString(x,y,GetColor(255,255,255),str);
}

void dumDebText(int deb,char *name){    
    //  Y座標指定
    int    y = Deb.Cnt * FONT_SIZE;
    
    char str[1024] = "";
    wsprintf(str, TEXT("%s= %d"),name,deb);
    DrawFormatString(0,y,GetColor(255,255,255),str);
    Deb.Cnt++;
}





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

Name: たかぎ [URL]  ..ハッカー(157,834ポイント)   Date: 2010/02/03(水) 02:12   No:47559     
Title: Re:デバック用の関数    
> たかぎさんって毎回難しい言葉使って 
> 質問者をいじめてませんか・・・? 

いじめる意図はありません。
いじめる気があれば、荒らし行為を行うとか、もっといろいろやり方がありますね。

> スレ主には悪いですがこのような質問をする人が 
> C++パーサー等理解してるわけないですよね? 

理解しているかどうかは本人に聞いてみないとわかりませんが...
分からなければ検索すればよいだけのことです。
そのために、検索しやすい用語をわざわざ選んで使っているのですから。


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

Name: ST  ..ぴよぴよ(196ポイント)   Date: 2010/02/03(水) 03:04   No:47561     
Title: Re:デバック用の関数    
>>西村様
ありがとうございます!!
出来ました><感激です。
どうやってもわからなかったので
手助けして頂いて感謝しております。

>>たかぎ様
いろいろとアドバイスありがとうございました。
正直いいますと西村様の言うとおり
わからない言葉を使われると戸惑ってしまいます・・・。

確かに調べなくてはいけないのですが
かなりモチベーションが下がります。

C++パーサーで調べたのですが
よく理解できませんでした><
ライブラリみたいなものでしょうか?
素人なので調べてもわからないことが多々御座います。
 ※調べ方も悪いのですが・・・。

回答して頂いたことに感謝はしております。
お気を悪くされましたら申し訳ございません。

甘えたことを言っているのはわかりますが
やはり可変長引数の使い方がわからないので
サンプルソースを頂けないでしょうか・・・。
宜しければ


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

Name: たかぎ [URL]  ..ハッカー(158,028ポイント)   Date: 2010/02/03(水) 08:41   No:47567     
Title: Re:デバック用の関数    
> わからない言葉を使われると戸惑ってしまいます・・・。 

それなら変数名を取り出すのは諦めてください。
nonさんでさえ、そんな方法は知らないといわれる内容です。簡単なはずがありません。

> 確かに調べなくてはいけないのですが 
> かなりモチベーションが下がります。 

理解できていないところに、コードだけ示せば、おそらくもっとモチベーションが下がると思います。
ボリューム的にも完全なコードを示すことはできませんので、やり方だけを示して、後は自力で何とかしなければならないのですから。

> C++パーサーで調べたのですが 
> よく理解できませんでした>< 

何がどうわからないのでしょうか?
http://yougo.ascii.jp/caltar/パーサ


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

Name: non  ..比類無きプログラマー(90,527ポイント)   Date: 2010/02/03(水) 08:41   No:47568     
Title: Re:デバック用の関数    
前に、たいちうさんや私が示したHPの解答Aで
何が、わからないのでしょうか?
http://www.geocities.jp/ky_webid/c/057ans.html

これで、事足りていると、考えているのですが。
それ以上は、フォーマットの書式を示してもらわないとわかりません。
また、printfなどと、まったく同じ書式がすべて使えるようにするのは
大変なことですし、デバッグのためなら、すべてを満足する必要はないと思います。


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

Name: たいちう  ..熟練のプログラマー(54,926ポイント)   Date: 2010/02/03(水) 08:51   No:47569     
Title: Re:デバック用の関数    
> 甘えたことを言っているのはわかりますが
> やはり可変長引数の使い方がわからないので
> サンプルソースを頂けないでしょうか・・・。
> 宜しければ

可変長引数の使い方のサンプルについては、
私がリンクを張っています。

「可変長引数を理解する」ことと「DrawFormatStringを理解する」ことが、
STさんのやりたいことの必要条件のようですので、
まず前者に取り組んでみてはいかがですか?
と書いているのです。

目標達成までのステップは、次のようなものになるでしょう。

1.可変長引数の関数(1つ目の引数は、データの個数)
2.可変長引数の関数(vsnprintfで処理)
3.DrawFormatStringで文字列表示   (← これはできているようですね)
4.可変長引数をvsnprintfで処理してDrawFormatStringで表示

STさんが欲しがっているのは4.のサンプルですよね。
以前書いた通り私には作る環境がありませんし、
上記のステップを見れば、自分でも作れそうではないですか?

順番にやってください。
躓いたら適宜質問してください。


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

Name: non  ..比類無きプログラマー(90,742ポイント)   Date: 2010/02/03(水) 09:50   No:47571     
Title: Re:デバック用の関数    
vsnprintfなんてのがあるのですね。失礼しました。
サンプルを作りました。
#include "DxLib.h"

void DebText(int x,int y,char *format, ... )
{
    va_list args;
    va_start( args, format );
    char str[100];
    vsnprintf_s(str,sizeof(str),_TRUNCATE, format, args);
    int White   = GetColor( 255 , 255 , 255 ) ; 
    DrawFormatString(  x, y, White ,  str );
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
    ChangeWindowMode( TRUE ) ; 
    if( DxLib_Init() == -1 ) return -1 ;

    int test=100;
    DebText(0,0,"test=%d",test);

    WaitKey() ;        
    DxLib_End() ;        
    return 0 ;     
}


va_end( args ); が必要なのかどうかわかりませんでした。


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



Name: 入門者以下  ..かけだし(1,463ポイント)   Date: 2010/02/02(火) 16:48   No:47548       
Title: 初歩的な事ですが・・・    
VC++をVisual2008で勉強しているのですが、
CFontとLOGFONTは両方フォント関連のクラスのようなのですが
何が違うのか把握できずご質問させていただきます。

LOGFONTは、フォントの大きさ・種類・高さ・角度・幅・色などの情報を格納
CFontは、フォントを操作する

とあったので、フォントの種類,色を変更する際に、
LOGFONTから変更したいフォントの種類、色の情報を呼び出して
CFontで動作させる。とのニュアンスでよいのでしょうか??

誤認識であれば、お手数ですがご教示ください。

よろしくお願い致します。


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


Name: バグ  ..ハッカー(188,911ポイント)   Date: 2010/02/02(火) 17:00   No:47549     
Title: Re:初歩的な事ですが・・・    
MFCですよね?以下、それが前提での書き込みです。

>>CFontとLOGFONTは両方フォント関連のクラスのようなのですが

LOGFONTは構造体で、CFontはクラスです。


>>LOGFONTは、フォントの大きさ・種類・高さ・角度・幅・色などの情報を格納
>>CFontは、フォントを操作する

うーん…どちらかというと、LOGFONT構造体にフォントの元となる情報を設定し、それを使ってCFontでフォントを作成するという感じかな?


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

Name: softya  ..ハッカー(113,491ポイント)   Date: 2010/02/02(火) 17:04   No:47550     
Title: Re:初歩的な事ですが・・・    
CFontはMFCのクラスだと思います。
LOGFONTってWin32APIの構造体?あるいは、.NETのクラス?
あぁ、CFontクラスで扱える構造体のLOGFONT構造体ですね。

CFontから情報を取り出したり、Font情報を設定したりするときに使いますが、使わなくてもCFontクラスでフォントは作れますよ。 編集済み


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

Name: 入門者以下  ..かけだし(1,690ポイント)   Date: 2010/02/02(火) 20:09   No:47552 解決!     
Title: Re:初歩的な事ですが・・・    
バグ様、softya様

はい、MFCです。
失礼いたしました。


ご回答ありがとうございます。

お二人の「LOGFONT構造体にフォントの元となる情報を設定し、
それを使ってCFontでフォントを作成する」or
「CFontから情報を取り出したり、Font情報を設定したりするときに使いますが
CFontクラスでフォントは作れる」

とてもわかりやすかったです。
上記の解釈を頭に入れ参考にしているソースを再度見ると
今までより深い理解ができました!
ありがとうございました。


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



Name: 美香  ..ぴよぴよ(753ポイント)   Date: 2010/02/01(月) 18:00   No:47504       
Title: 皆様だったらどっちでソースを書きますか?    
具体的な質問ではないのですが皆様だったら下記の処理をどうやって書きますか?
理由なども教えて頂けますと嬉しいです。

処理内容
・キャラクターの向き(画像)が上下左右の4方向ある
・キャラクターが上下左右の4方向に移動する

この2つを実装するとします。
KEY_UP等は仮の名前でキーが押されたことを意味します。
わかりづらい質問で申し訳ないのですが
ご回答いただけますと嬉しいです。

//////////////////////////////////////////////////
パターン1
//////////////////////////////////////////////////
if(KEY_UP){
    向きの修正
    移動処理        
}
if(KEY_DOWN){
    向きの修正
    移動処理        
}
if(KEY_RIGHT){
    向きの修正
    移動処理        
}
if(KEY_LEFT){
    向きの修正
    移動処理        
}
//////////////////////////////////////////////////
パターン2
//////////////////////////////////////////////////
if(KEY_UP)    向きの修正
if(KEY_DOWN)    向きの修正
if(KEY_RIGHT)    向きの修正
if(KEY_LEFT)    向きの修正

if(KEY_UP)    移動処理
if(KEY_DOWN)    移動処理
if(KEY_RIGHT)    移動処理
if(KEY_LEFT)    移動処理

//////////////////////////////////////////////////
パターン3
//////////////////////////////////////////////////
その他


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


Name: softya  ..ハッカー(113,036ポイント)   Date: 2010/02/01(月) 18:06   No:47506     
Title: Re:皆様だったらどっちでソースを書きますか?    
こんな感じ。シンプルだしメンテナンス性も高いから。

float 移動ベクトル配列[向きの数];

if(KEY_UP){
    向きの修正  
}
if(KEY_DOWN){
    向きの修正 
}
if(KEY_RIGHT){
    向きの修正
}
if(KEY_LEFT){
    向きの修正  

移動処理(今の座標+移動ベクトル[向き]) 編集済み


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

Name: 御津凪 [URL]  ..ハッカー(139,020ポイント)   Date: 2010/02/01(月) 18:15   No:47507     
Title: Re:皆様だったらどっちでソースを書きますか?    
私なら、
if(!(KEY_UP && KEY_DOWN)){
    if(KEY_UP){
        向きの修正
        移動処理        
    }
    if(KEY_DOWN){
        向きの修正
        移動処理        
    }
}
if(!(KEY_LEFT && KEY_RIGHT)){
    if(KEY_LEFT){
        向きの修正
        移動処理        
    }
    if(KEY_RIGHT){
        向きの修正
        移動処理        
    }
}

ですね。(パターン1亜種とでもしましょうか)
方向が反対のキーが同時に押された時の判断を処理しておかないと動作が(ユーザーに対して)不適切になります。


もしキャラクターの移動に慣性があって、その移動方向に常に向く、というのであれば、
向きの修正はキー入力では判断できませんが、その点はどうなのでしょうか?
処理内容にはキャラクターが指定方向に向く明確な条件(仕様)が書かれていないので気になりました。


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

Name: バグ  ..ハッカー(189,057ポイント)   Date: 2010/02/02(火) 10:32   No:47547     
Title: Re:皆様だったらどっちでソースを書きますか?    
>>・キャラクターの向き(画像)が上下左右の4方向ある
>>・キャラクターが上下左右の4方向に移動する

これが前提にあるのだから、斜め(縦・横同時)に移動してはマズイのではないかと…
となると…こうかな?


if (KEY_UP)
{
    向きの修正
    移動処理
}
else if (KEY_DOWN)
{
    向きの修正
    移動処理
}
else if (KEY_LEFT)
{
    向きの修正
    移動処理
}
else if (KEY_RIGHT)
{
    向きの修正
    移動処理
}




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



Name: PG初心者  ..ぴよぴよ(918ポイント)   Date: 2010/01/28(木) 20:37   No:47251       
Title: ダンジョン風ゲームのキャラクターの移動    
ダンジョン風ゲームのキャラクターの移動用のプログラムを作っております。
シレンやチョコボ等の増すごとの移動とは違い
自由に移動できるタイプを考えております。(聖剣伝説?みたいなかんじです)

シレン等の移動方法は一度作ったことがあるので
出来るのですが自由に移動できるとなると判定の仕方がよくわかりません。

現在、下記の様なソースなのですが移動が挙動な動きをしてしまいます・・・。
どこをどのように修正すれば良いか教えては頂けないでしょうか?

※大変申し訳ないのですがソースを一部抜粋しております。
わかりにくい関数がありましたら教えて頂けますと助かります。

//////////////////////////////////////////////////
初期化
//////////////////////////////////////////////////

typedef struct{
    float Px,Py,Mx,My;
    int Cx,Cy;
    float Speed;
}CHR;

CHR Play;

int H_char;
int H_box;

extern KEY Key[256];

int Map[15][20] = {
    {1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,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}
};

//////////////////////////////////////////////////
ループ
//////////////////////////////////////////////////
    Play.Mx = 0;
    Play.My = 0;

    Play.Cx = int(Play.Px/32);
    Play.Cy = int(Play.Py/32);

    if(Key[KEY_INPUT_RIGHT].Key) Play.Mx = Play.Speed ;
    if(Key[KEY_INPUT_LEFT].Key) Play.Mx = -Play.Speed ;
    if(Key[KEY_INPUT_UP].Key) Play.My = -Play.Speed ;
    if(Key[KEY_INPUT_DOWN].Key) Play.My = Play.Speed ;

    Play.Px += Play.Mx;
    Play.Py += Play.My;

    if(Play.Mx < 0){
        if(Map[Play.Cy][Play.Cx] == 1) Play.Px = (float)Play.Cx * 32 + 32;
        if(Map[Play.Cy][Play.Cx] == 1) Play.Py = (float)Play.Cy * 32 + 32;
    }else{
        if(Map[Play.Cy][Play.Cx] == 1) Play.Px = (float)Play.Cx * 32 - 32;
        if(Map[Play.Cy][Play.Cx] == 1) Play.Py = (float)Play.Cy * 32 - 32;    
    }

//////////////////////////////////////////////////
描画
//////////////////////////////////////////////////
    for(int i=0; i<15; i++){
        for(int j=0; j<20; j++){
            if(Map[i][j] == 1) DrawGraph( j*32, i*32 , H_box , true ) ;
        }    
    }
    DrawGraph( (int)Play.Px, (int)Play.Py , H_char , true ) ;


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


Name: MNS  ..プログラマー(30,097ポイント)   Date: 2010/01/28(木) 20:48   No:47253     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
>現在、下記の様なソースなのですが移動が挙動な動きをしてしまいます・・・。 
挙動がおかしいということでしょうか?
いずれにせよ、もう少し質問内容を具体的にして頂けると助かります。


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

Name: PG初心者  ..ぴよぴよ(871ポイント)   Date: 2010/01/28(木) 20:51   No:47254     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
>>MNS様
ご回答ありがとう御座います。

挙動がおかしいです。
ブロックがあったら移動出来ないようにしたいのに
ブロックの向こう側に飛んでしまったりしてしまいます。


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

Name: MNS  ..プログラマー(30,116ポイント)   Date: 2010/01/28(木) 21:13   No:47256     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
それなら、当たり判定の部分のコードを提示していただけませんか?

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

Name: PG初心者  ..かけだし(1,113ポイント)   Date: 2010/01/28(木) 21:38   No:47261     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
>>MNS様
回答ありがとう御座います。
ループに書いてある

    if(Play.Mx < 0){
        if(Map[Play.Cy][Play.Cx] == 1) Play.Px = (float)Play.Cx * 32 + 32;
        if(Map[Play.Cy][Play.Cx] == 1) Play.Py = (float)Play.Cy * 32 + 32;
    }else{
        if(Map[Play.Cy][Play.Cx] == 1) Play.Px = (float)Play.Cx * 32 - 32;
        if(Map[Play.Cy][Play.Cx] == 1) Play.Py = (float)Play.Cy * 32 - 32;    
    }
でチェックを行っております。 プレイヤーがいるセルを求めて位置戻しております。 たぶん、セルの取得がいけないのかと思うのですが 修正案が思い浮かびません・・・。 ブロックとの当たり判定をするとしたら どのように行うのでしょうか? ※あたり判定については理解しております。 関数にすると以下のような感じですよね?

//==============================================================================================
//  ヒットチェック 中心点 P〜は現在位置 S〜は画像サイズ
//==============================================================================================

bool HitCheck(float Px1, float Py1, int Sx1, int Sy1, float Px2, float Py2, int Sx2, int Sy2){

    if(Px1-Sx1/2 < Px2+Sx2/2 && Px1+Sx1/2 > Px2-Sx2/2 &&
        Py1-Sy1/2 < Py2+Sy2/2 && Py1+Sy1/2 > Py2-Sy2/2){
        return true;    
    }else{
        return false;
    }
}



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

Name: MNS  ..プログラマー(30,596ポイント)   Date: 2010/01/28(木) 23:33   No:47270     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
なるほど、そこが当たり判定の部分でしたか。失礼しました。

このコードは、自分がいる位置を調べて、そこが障害物であれば、
動いた方向と逆の方向に位置を動かす、ということを行おうとしているのでしょうか?

全く検討違いである可能性もありますが、

Play.Cx = int(Play.Px/32);
Play.Cy = int(Play.Py/32);

if(Key[KEY_INPUT_RIGHT].Key) Play.Mx = Play.Speed ;
if(Key[KEY_INPUT_LEFT].Key) Play.Mx = -Play.Speed ;
if(Key[KEY_INPUT_UP].Key) Play.My = -Play.Speed ;
if(Key[KEY_INPUT_DOWN].Key) Play.My = Play.Speed ;

Play.Px += Play.Mx;
Play.Py += Play.My;

今、こういう順番で処理が並んでいますが、

if(Key[KEY_INPUT_RIGHT].Key) Play.Mx = Play.Speed ;
if(Key[KEY_INPUT_LEFT].Key) Play.Mx = -Play.Speed ;
if(Key[KEY_INPUT_UP].Key) Play.My = -Play.Speed ;
if(Key[KEY_INPUT_DOWN].Key) Play.My = Play.Speed ;

Play.Px += Play.Mx;
Play.Py += Play.My;

Play.Cx = int(Play.Px/32);
Play.Cy = int(Play.Py/32);

こうするとどうでしょうか?
これだけではおそらく問題は解決しませんが、
結果がどうなったかを調べていただけると、解決の緒がつかめるかもしれません。


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

Name: PG初心者  ..ぴよぴよ(182ポイント)   Date: 2010/01/29(金) 01:03   No:47278     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
ご回答ありがとうございます。
変更したところ前までは判定されるのですが
やはりうまくいきません。
※急激に場所が変わったりする。

もしかしたらなのですがセルでのやり取りがダメなのでかもしれません。
またあたり判定時の処理を下記に変更してみました。


    if(Map[Play.Cy][Play.Cx] == 1){
        if(Play.Mx < 0) Play.Px = Play.Cx*32+32;
        else if(Play.Mx > 0) Play.Px = Play.Cx*32-32;
        if(Play.My < 0) Play.Py = Play.Cy*32+32;
        else if(Play.My > 0) Play.Py = Play.Cy*32-32;
    }



皆様のお忙しい中申し訳ないのですが
ご回答いただけないでしょうか?


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

Name: softya  ..ハッカー(108,968ポイント)   Date: 2010/01/29(金) 10:43   No:47295     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
一番簡単なのは、移動前に座標を保存しておいて当たり判定で衝突したら保存しておいた座標に戻すって方法があります。お試し下さい。

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

Name: PG初心者  ..ぴよぴよ(111ポイント)   Date: 2010/01/30(土) 02:59   No:47349     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
>>softya 様
ご回答ありがとう御座います。
前よりだいぶ改善されました。
当たってるという判定は出来たのかと思います・・・。

但し、現在のPGだと一度めり込んでキーを放すとパッと戻ってしまい
かなり気になります・・・。

私のミスかと思うのですが
どのように直せばよいか教えては頂けないでしょうか・・・。

処理
    
    HitF = false;
    Play.Mx = 0;
    Play.My = 0;

    if(Key[KEY_INPUT_RIGHT].Key) Play.Mx = Play.Speed ;
    if(Key[KEY_INPUT_LEFT].Key) Play.Mx = -Play.Speed ;
    if(Key[KEY_INPUT_UP].Key) Play.My = -Play.Speed ;
    if(Key[KEY_INPUT_DOWN].Key) Play.My = Play.Speed ;
    
    //  マップの表示
    for(int i=0; i<15; i++){
        for(int j=0; j<20; j++){
            if(Map[i][j] == 1){
                if(Play.Px-16 < j*32+16 && Play.Px+16 > j*32-16 &&
                    Play.Py-16 < i*32+16 && Play.Py+16 > i*32-16){
                        Play.Px = Play.Ox;
                        Play.Py = Play.Oy;
                        HitF = true;
                }
            }
        }    
    }

    Play.Ox = Play.Px;
    Play.Oy = Play.Py;

    Play.Px += Play.Mx;
    Play.Py += Play.My;

    Play.Cx = int(Play.Px/32);
    Play.Cy = int(Play.Py/32);




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

Name: SooA [URL]  ..プログラマー(28,886ポイント)   Date: 2010/01/30(土) 10:29   No:47363     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
あなたが道を歩くとき、目前に川があったらどう対処しますか?

落ちるまで進み、落ちてから通れないと判断しますか?
普通は川があるから通れないと認識して落ちる事を回避しますよね?

キャラクターも同じです。
移動する前に移動先を計算して当たり判定を行い、
通れないならキャラを動かさない、通れるなら移動させる。
といったプログラムにしてみましょう。


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

Name: softya  ..ハッカー(109,869ポイント)   Date: 2010/01/30(土) 11:29   No:47365     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
処理の順番の問題ですね。
移動→表示→あたり判定(行けなかったら元の座標に戻す)
だと移動した後の座標で表示されてしまいます。
移動→あたり判定(行けなかったら元の座標に戻す)→表示
としてください。


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

Name: PG初心者  ..かけだし(1,257ポイント)   Date: 2010/01/30(土) 12:46   No:47375     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
皆様回答ありがとうございます。
処理の順番を変えたら元の位置に戻るようなことがなくなりました。

現在、私が作ったソースです。
但し問題点が2点ございます。

1点目
当たり判定をしている為、当たった際に隙間ができてしまう。

2点目
当たり判定がある時にキーを押してもキャラが動かない。
例えば右キーを押しっぱにして壁に当たった場合上下キーが利かなくなってしまう・・・。

私のソースが問題なのですがどこを改善すればよいのかがわかりません・・・。
ご指摘いただけないでしょうか?


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

Name: softya  ..ハッカー(111,235ポイント)   Date: 2010/01/30(土) 13:25   No:47380     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
とりあえずアルゴリズムをじっくりと考えてみましょう。
根本的な考え方を理解していないと少し問題がある度に行き詰まってしまいますからね。

>当たり判定をしている為、当たった際に隙間ができてしまう。 

良く使われるアルゴリズムは、当たった際に当たったブロックの隣の座標を強制的に与えてしまう方法です。
ただ、これを使うには今の前の座標を保存する方式は使えませんの別案を考えてみましょう。

もうひとつの方法は時間と移動量の関係を見直すことです。
たとえば60FPSだとすると1/60秒でspeed分のピクセルを移動するわけですが、これが1/120秒だったらどうでしょうか? 1/2speedピクセルしか移動しないのでブロックとの隙間は1/2speed分になりますよね。
じゃあ、もっと考えを進めて1/(60*speed)秒だったら1pixelづつ移動するので隙間は開かないことになります。
ただ、1/(60*speed)秒だと描画をすることが出来ませんので表示は1/60秒で移動は1/(60*speed)秒にすることは出来ないでしょうか?考えてみて下さい。
ただし、1/(60*speed)秒と言っても実際にそうする必要はなくて1/60秒の間にspeed回数分処理すれば良いだけですよ。

>当たり判定がある時にキーを押してもキャラが動かない。
>例えば右キーを押しっぱにして壁に当たった場合上下キーが利かなくなってしまう・・・。 

これは、移動キーを無かったことにしてみると実現出来ます。
x,yのキーで移動出来なかったら、xだけの方向に移動してみるんです。yも同様ですね。
分かりますかね?


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

Name: PG初心者  ..かけだし(1,465ポイント)   Date: 2010/01/30(土) 15:04   No:47388     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
回答ありがとうございます。

>>良く使われるアルゴリズムは、当たった際に当たったブロックの隣の座標を強制的に与えてしまう方法です。 

こちらも作ったのですが左で当たっている時、
上を押すと変な位置に飛ばされてしまったので
諦めてしまいました・・・。

>>これは、移動キーを無かったことにしてみると実現出来ます。 
>>x,yのキーで移動出来なかったら、xだけの方向に移動してみるんです。yも同様ですね。 
>>分かりますかね? 

すみません・・・。
お手数おかけいたしますが
添付したソースに手を加えてはいただけないでしょうか?
丸投げしているのは分かっているのですが
自分では解けそうにありません・・・。

本当にお願いいたします。


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

Name: softya  ..ハッカー(111,575ポイント)   Date: 2010/01/30(土) 16:33   No:47397     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
まぁ、そう言わずに紙にでも書いてアルゴリズムを検討してみて下さい。
ゲームを作る過程で半日悩むなんてよくあることです。
よーく考えて、それでも分からなければ具体的にどの部分が分からないか聞いてください。


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

Name: PG初心者  ..かけだし(1,532ポイント)   Date: 2010/01/30(土) 22:24   No:47411     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
ご回答ありがとうございます。

解らないというより現在のバグをどう取り除けばいいかが考えらません…

色々と自分なりに考えて見て処理を書いてみたのですが一番最新に貼らせて頂いたソース以上の結果が望めません。

お願いします…。助けて下さい。


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

Name: softya  ..ハッカー(111,630ポイント)   Date: 2010/01/31(日) 00:32   No:47418     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
1つ目のヒント。
No:47375のソースでLoop()関数の中でSpeed単位で移動しているのを1づつ移動するようにしてください。
その上で、Loop()関数をSpeed回数分ループする様にします。

2つ目は、これが出来てからです。 編集済み


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

Name: PG初心者  ..かけだし(1,539ポイント)   Date: 2010/01/31(日) 13:45   No:47435     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
こういうことでしょうか?

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

Name: PG初心者  ..かけだし(1,852ポイント)   Date: 2010/01/31(日) 13:58   No:47436     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
連レスに手失礼いたします。
softya様がおっしゃいたいことはわかえいます・・・。
移動スピードは1×Loop回数だが判定は1でしているということですよね
ただしLOOPをspeed(例えば10)回数分回すとかなり処理が重くなりませんか?

もしくわspeedの値を画面サイズの
公約数(32×32なら4など)にするのとかも考えたのですが
もう少し効率の良い方法はないでしょうか・・・?


    for(int i=0; i<15; i++){
        for(int j=0; j<20; j++){
            if(Map[i][j] == 1){                
                if(Play.Px-16 < j*32+16 && Play.Px+16 > j*32-16 &&
                    Play.Py-16 < i*32+16 && Play.Py+16 > i*32-16){
                        Play.Px = Play.Ox;
                        Play.Py = Play.Oy;
                        HitF = true;
                }
            }
        }    
    }



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

Name: softya  ..ハッカー(112,096ポイント)   Date: 2010/01/31(日) 15:42   No:47440     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
>softya様がおっしゃいたいことはわかえいます・・・。
>移動スピードは1×Loop回数だが判定は1でしているということですよね

コード見ましたが間違ってますよ。
移動ベクトルが1になっていませんので、speed速度×speed回で移動してます。


>ただしLOOPをspeed(例えば10)回数分回すとかなり処理が重くなりませんか? 

分かりやすく処理しているので多少は我慢して下さい。
数学的、アルゴリズム的な知識レベルが上がれば方法は色々ありますが、まず基本的なところが分かっていないと応用は効きません。

>もう少し効率の良い方法はないでしょうか・・・? 
実は全ブロックあたり判定する必要はありません。
キャラクタのいるブロックが分かっているなら、キャラを中心に3x3のブロックとだけあたり判定すれば良いのです。
キャラクタのいるブロックの位置の式はこれですよね?
Play.Cx = int(Play.Px/32);
Play.Cy = int(Play.Py/32);
このforループを考え直してみて下さい。
    for(int i=0; i<15; i++){
        for(int j=0; j<20; j++){




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

Name: PG初心者  ..ぴよぴよ(304ポイント)   Date: 2010/01/31(日) 20:48   No:47444     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
softya様
何度も何度も回答ありがとうございます><
本当に助かります。

現在、当たり判定を周囲8マスと自分のいる位置でしてみました。
また移動ベクトルを1にするということは
添付しましたソースのようにするということでしょうか?
これをspeed回数分ということでしょうか?


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

Name: softya  ..ハッカー(112,405ポイント)   Date: 2010/01/31(日) 21:18   No:47447     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
ちゃんと斜め方向のベクトルもちゃんと処理してますね。
後で言おうと思っていたのですが、感心しました。

>現在、当たり判定を周囲8マスと自分のいる位置でしてみました。 

あたり判定前の処理で、
if(Cx < 0) Cx = 0;
if(Cy < 0) Cy = 0;
ですが、補正するんじゃなくてマップ外なら無条件に障害物とみなしてください。
ちなみに、マイナス方向だけ処理してますがCx>=20やCy>=15もマップ外ですよ。

>これをspeed回数分ということでしょうか?

このソースだとベクトルはspeed分ですからベクトルを1にしてspeed回数分ですね。


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

Name: PG初心者  ..かけだし(2,038ポイント)   Date: 2010/01/31(日) 23:28   No:47454     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
>>softya様
なるほど・・・仰ってる意味がわかりました><
多分こういうことですよね?

ただまた2点ほど問題点が御座いまして

1点目 
一度でも斜め移動すると当たり判定時に描画のピクセルがずれる。

理由はわかります・・・。
斜め時には1より小さい値が入ってしまうの描画の際に切り捨てられてしまう。
これをceil関数などで防いでみたのですが
処理をする瞬間に強制的にXY座標とも切り上げられるので
違和感が御座います。

2点目 
当たり判定がある時にキーを押してもキャラが動かない。 
例えば右に壁があり右キーを押しっぱにすると
上下キーが利かなくなってしまう・・・。 

本当に申し訳ございません><


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

Name: softya  ..ハッカー(112,761ポイント)   Date: 2010/02/01(月) 11:03   No:47485     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
いいですね。大分と出来てきました。

>1点目 
SetDrawMode( DX_DRAWMODE_BILINEAR );
として表示に、DrawGraphFを使って下さい。
これで座標が少数でもキレイに表示されるはずです。

>2点目 
あたり判定を3回に増やすことで解決します。
1.XYのベクトル反映したあたり判定。当たったら2へ。
2.Xのベクトルだけを反映したあたり判定。当たったら3へ。
3.Yのベクトルだけを反映したあたり判定。
この場合壁のあたり判定だけを関数化すると組みやすくなります。


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

Name: PG初心者  ..かけだし(2,361ポイント)   Date: 2010/02/01(月) 16:49   No:47499     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
回答ありがとうございます。

すみません・・・。2点目の関数化するという
意味がわからなかったのでベタで書いております。

これだけは私ではわかりそうにありません・・・。
下記の等を試してみたのですが思い通りの結果が得られませんでした。
どうかここだけはサンプルを頂けないでしょうか・・・。
お願いいたします。

        //  マップ
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                int Cx = Play.Cx - 1 + j;
                int Cy = Play.Cy - 1 + i; 
                if(Cx < 0 && Cx > 20){
                    Play.Px = Play.Ox;
                }
                if(Cy < 0 && Cy > 15){
                    Play.Py = Play.Oy;
                }
                if(Map[Cy][Cx] == 1){
                    int sx = CEL_W/2;
                    int sy = CEL_H/2;
                    if(Play.Px-sx+8 < Cx*CEL_W+sx && Play.Px+sx-8 > Cx*CEL_W-sx &&
                        Play.Py-sy < Cy*CEL_H+sy && Play.Py+sy > Cy*CEL_H-sy){
                            if(Play.Px-sx+8 < Cx*CEL_W+sx && Play.Px+sx-8 > Cx*CEL_W-sx){
                                if(Play.Py-sy < Cy*CEL_H+sy && Play.Py+sy > Cy*CEL_H-sy){
                                    Play.Px = Play.Ox;
                                    Play.Py = Play.Oy;
                                }else{
                                    Play.Px = Play.Ox;
                                }
                            }else{
                                Play.Py = Play.Oy;
                            }
                        //    Play.Px = Play.Ox;
                        //    Play.Py = Play.Oy;
                            HitF = true;
                    }
                }    
            }
        }




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

Name: softya  ..ハッカー(112,762ポイント)   Date: 2010/02/01(月) 18:02   No:47505     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
申し訳ない組みづらかったので、コードを大分変えてしまいました。
予定とも仕様が違います。
衝突したら、右45度と左45度の方向に移動出来るか試すコードになってます。


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

Name: PG初心者  ..入門者(2,500ポイント)   Date: 2010/02/01(月) 19:15   No:47514     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
 softya 様

お忙しい中、ありがとうございます。
実は画像サイズを変えまして上手く動作してくれません・・・。
当たり判定が発生すると移動が止まってしまいます。

ブロックのサイズが48×48
キャラのサイズが32×48 です。
何度も迷惑をお掛けして申し訳ないのですが
ご確認いただけないでしょうか・・・。


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

Name: softya  ..ハッカー(113,132ポイント)   Date: 2010/02/01(月) 22:14   No:47523     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
1)そもそも元の画像サイズでうまく動いているんでしょうか?
私の作ったコードも動作確認してませんので、バグっている可能性があります。
2)私の作ったコードを理解されていますか?
まず、ここから始めて下さい。


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

Name: PG初心者  ..入門者(2,573ポイント)   Date: 2010/02/01(月) 22:24   No:47525     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
実は元のでも動いておりません・・・。
当たると止まってしまいます。

コードについては理解しているつもりです。
その理解のもとで何点か変更しました・・・。

それでも動きません><


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

Name: softya  ..ハッカー(113,198ポイント)   Date: 2010/02/01(月) 22:58   No:47527     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
どうダメなのか分析してみて下さい。
コードが理解出来るなら問題点も調べられるはずです。
printfDxなどで調べてみて下さい。


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

Name: PG初心者  ..入門者(2,707ポイント)   Date: 2010/02/01(月) 23:21   No:47530     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
softya様
原因はわかっております。
1度でも当たってしまうとmoveokが1になりません・・・。
移動量は入っているのでこれが原因です。
ただし私が見てもこのソースであっている気がします・・・。

何故動かないかがわかりません・・・。
これで動くと思うのですが・・・。


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

Name: softya  ..ハッカー(113,228ポイント)   Date: 2010/02/01(月) 23:30   No:47531     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
int moveok;
moveok = 0;
と分けてみて下さい。


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

Name: PG初心者  ..かけだし(2,202ポイント)   Date: 2010/02/01(月) 23:34   No:47532     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
すみません・・・。
多分直りました。
これから深くテストをしてみます。
原因は前の位置に戻す処理をしていない為
当たり判定がずっと起こってしまうからだと思います。


//    移動あり?
    
    if( rot != -1 ) {
    
        //    スピード回数分
        for(int speed=0; speed<Play.Speed; speed++){
            int moveok = 0;
            //    マップとの衝突
            if( MapJudge((int)Play.Px,(int)Play.Py,rot) ) {
                //    当たったので、今度は左斜めへ。
                rot -= 45/180*M_PI;
                if( MapJudge((int)Play.Px,(int)Play.Py,rot) ) {
                    //    当たったので、今度は右斜めへ。
                    rot += 90/180*M_PI;
                    if( MapJudge((int)Play.Px,(int)Play.Py,rot) ) {
                        //    これは移動出来ません。
                        Play.Px = Play.Ox;
                        Play.Py = Play.Oy;
                    } else {
                        moveok = 1;
                    }
                } else {
                    moveok = 1;
                }
            } else {
                moveok = 1;
            }
            //    移動できたら座標の反映
            if( moveok ) {
                Play.Ox = Play.Px;
                Play.Oy = Play.Py;
                Play.Px += cos(rot);
                Play.Py += sin(rot);
            }
        }
    }


お忙しい中、本当にありがとうございました。


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

Name: PG初心者  ..かけだし(2,243ポイント)   Date: 2010/02/01(月) 23:41   No:47534     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
なんどもすみません・・・
根本的な問題が解決できませんでした・・・。
上にブロックがある時に→キーを押すと移動できません・・・。



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

Name: softya  ..ハッカー(113,392ポイント)   Date: 2010/02/02(火) 10:15   No:47546     
Title: Re:ダンジョン風ゲームのキャラクターの移動    
>原因は前の位置に戻す処理をしていない為 
私のコードでは、戻さなくて良いはずですけどね。

>上にブロックがある時に→キーを押すと移動できません・・・。 
これは何が原因か分かりますか?
当たる前と当たった座標から調べてみて下さい。
斜めの入力に対して、45度づつ違う方向に避けているはずなので、原理的には横にも進むはずです。
※ あくまで原理的であって誤差などの問題がある可能性があります。


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



Name: memory_swan  ..ぴよぴよ(365ポイント)   Date: 2010/02/01(月) 18:17   No:47508       
Title: 多次元配列の渡し方    
今友人と一緒にC言語でゲームっぽいのを作ろうとしてるんだが、背景の作り方が分からない。
っで考えたのが多次元配列(二次元配列)で背景を描画し、キャラクタが重なったら消え、通り過ぎたら再描画しようと思ってます。再描画と言っても全画面すると重くなるので出来ればポイントだけ。

現段階では背景用の関数を作りそれをメインに渡し、表示させる関数に渡すという順路を考えてます。
しかし、ポインタで二次元配列を指定しポインタを渡せばOKという考えは甘く、うまくいきません。どこでエラーが出ているのかもよく分からない。

長くなったが、「二次元配列で背景を描画し、キャラが通り過ぎたらそのポイントだけ再描画したい
C言語はポインタ、構造体は一応分かっているつもりです。

返答お願いします。


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


Name: たかぎ [URL]  ..ハッカー(157,398ポイント)   Date: 2010/02/01(月) 18:39   No:47510     
Title: Re:多次元配列の渡し方    
> しかし、ポインタで二次元配列を指定しポインタを渡せばOKという考えは甘く、うまくいきません。どこでエラーが出ているのかもよく分からない。 

どんなコードを書いてどんなエラーになったのかが分からないとどうすることもできません。
現状では、コンパイルエラーなのか、リンクエラーなのか、実行時エラーなのか、期待通りの動作をしなかっただけなのかもさっぱりわかりませんから。


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

Name: memory_swan  ..ぴよぴよ(415ポイント)   Date: 2010/02/01(月) 19:00   No:47513     
Title: Re:多次元配列の渡し方    
説明不足orz

void haikei (void){
int hairetsu[30][60]={{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,…},
{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,…}};
int *point_haikei;
pointer = &hairetsu[0][0];
(略)
}

void main (void){
int *point;
haikei(point);
(略)
print(point);
}

void print (int *point_print){
printf("%d",point_print[1]);
}


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

Name: たかぎ [URL]  ..ハッカー(157,504ポイント)   Date: 2010/02/01(月) 19:18   No:47515     
Title: Re:多次元配列の渡し方    
ソースを見る限り、多次元配列云々の話ではなく、根本的な理解不足がうかがえます。

> pointer = &hairetsu[0][0]; 

pointerが定義されていません。

> void main (void){ 

mainの返却値の型がintでなければ未定義の動作になります。

> haikei(point); 

haikeiは引数を取れないはずでは?

> void print (int *point_print){ 

print関数の定義前に呼び出していますので、コンパイラは

int print()

と認識しています。
関数定義はこれと矛盾します。

> printf("%d",point_print[1]); 

関数原型無しでprintfを呼び出した場合は未定義の動作になります。


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

Name: バグ  ..ハッカー(184,263ポイント)   Date: 2010/02/01(月) 21:24   No:47517     
Title: Re:多次元配列の渡し方    
開発環境とかも欲しいですね。printfを使ってるから、コンソールアプリケーションなんでしょうが、コンソールアプリケーションでのカーソル制御は開発環境によって違いますから…
WINAPIを使用してもよいのであれば、楽なんですけどね。


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

Name: バグ  ..ハッカー(188,841ポイント)   Date: 2010/02/02(火) 09:45   No:47545     
Title: Re:多次元配列の渡し方    
WINAPIを使用したサンプルです。
変数名や書き方は私好みに変更していますが、コメントを入れてますので適当に解析してみてください。
無限ループしていて終了しないので、飽きたら終了させてください(^_^;)

#include <stdio.h>
#include <windows.h>

/* 定数 */
#define MAP_WIDTH    10
#define MAP_HEIGHT    11
#define MOVE_WAIT    100

/* グローバル変数 */

// コンソールウインドウ用出力ハンドル
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);

// プレイヤー座標
int px = 1;
int py = 1;

// 背景

/* プロトタイプ宣言 */
void printMap(int map[MAP_HEIGHT][MAP_WIDTH]);
void printGrid(int x, int y, int grid);
void printPlayer(int x, int y, int map[MAP_HEIGHT][MAP_WIDTH]);
void moveUp(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH]);
void moveDown(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH]);
void moveLeft(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH]);
void moveRight(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH]);

/* メイン関数 */
void main(void)
{
    // マップ用配列
    // ※この程度の規模ならばグローバル変数にした方が制御が楽だとは思いますが、
    //  多元配列を引数で渡す練習用にローカルで書いてます
    int map[MAP_HEIGHT][MAP_WIDTH] = {    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
                                        {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
                                        {1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
                                        {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
                                        {1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
                                        {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
                                        {1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
                                        {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
                                        {1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
                                        {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
                                        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}    };

    // 初期描画
    printMap(map);
    printPlayer(1, 1, map);

    // プレイヤー移動制御
    for(; ;)
    {
        moveRight(2, 8, map);
        moveDown(2, 3, map);
        moveLeft(7, 1, map);
        moveDown(4, 5, map);
        moveRight(2, 8, map);
        moveDown(6, 7, map);
        moveLeft(7, 1, map);
        moveDown(8, 9, map);
        moveRight(2, 8, map);
        moveUp(8, 7, map);
        moveLeft(7, 1, map);
        moveUp(6, 5, map);
        moveRight(2, 8, map);
        moveUp(4, 3, map);
        moveLeft(7, 1, map);
        moveUp(2, 1, map);
    }
} 

/* 背景全描画 */
void printMap(int map[MAP_HEIGHT][MAP_WIDTH])
{
    for (int x = 0; x < 10; ++x)
    {
        for (int y = 0; y < 11; ++y)
        {
            printGrid(x, y, map[y][x]);
        }
    }
}

/* 背景1マスだけ描画 */
void printGrid(int x, int y, int grid)
{
    COORD pos = {x, y};
    SetConsoleCursorPosition(hout, pos);
    printf("%d", grid);
}

/* プレイヤーの描画 */
void printPlayer(int x, int y, int map[MAP_HEIGHT][MAP_WIDTH])
{
    // 移動する前のプレイヤー座標のマスをマップデータで上書きする
    printGrid(px, py, map[py][px]);

    // プレイヤー座標を更新(移動)する
    px = x;
    py = y;

    // 移動先の座標にプレイヤーを描画する
    COORD pos = {px, py};
    SetConsoleCursorPosition(hout, pos);
    putc('@', stdout);
}

/* 上移動 */
void moveUp(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH])
{
    for (int y = start; y >= end; --y)
    {
        printPlayer(px, y, map);
        Sleep(MOVE_WAIT);
    }
}

/* 下移動 */
void moveDown(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH])
{
    for (int y = start; y <= end; ++y)
    {
        printPlayer(px, y, map);
        Sleep(MOVE_WAIT);
    }
}

/* 左移動 */
void moveLeft(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH])
{
    for (int x = start; x >= end; --x)
    {
        printPlayer(x, py, map);
        Sleep(MOVE_WAIT);
    }
}

/* 右移動 */
void moveRight(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH])
{
    for (int x = start; x <= end; ++x)
    {
        printPlayer(x, py, map);
        Sleep(MOVE_WAIT);
    }
}


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



Name: Ma  ..プログラマー(35,172ポイント)   Date: 2010/01/27(水) 12:39   No:47132       
Title: 複雑な形の図形を3D描画    
いつもお世話になってます。
高校3年の数学に出てくる、体積の問題を視覚的に表現するプログラムを作りました。
(課題ではありません、好きでやってます。)

その問題とは、関数 f(x)= sin(x) を、x軸に対して回転したときにできる図形の体積を求めよ。
のような問題です。

添付画像のように、この段階までは成功できました。
これは、半径1、長さ1の円柱を描画時に好きな倍率に拡大し何度も描画することで近い形を再現しています。

ここまではいいのですが、
今度は f(x) = x*x と g(x) = sqrt(x) の間をx軸に対して回転してできた図形の体積の面積を求める問題です。
(分かりにくかったら画像をみてください。)

ただの計算なら、外側体積から内側の体積を引くだけです。
でも、描画をどうしよう・・・と悩むことになりました。

ふと思いついた方法は、 
    [ぜんぜん駄目だった方なので略]
だ、だめだ・・・。

なんとか、この複雑な図形を3D表示するいい方法はないでしょうか?

(添付画像を修正しました。)


追記
 環境
DXライブラリ
VisualC++ 2008 Express

 現在の仕様でUIより入力できる情報
・xの関数1
・xの関数2
・xの範囲(xの最小値と最大値)
・近時体積を求めるときのx範囲の分割数

解答はコードでなくても、アイディアでも結構です。 編集済み


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


Name: たいちう  ..熟練のプログラマー(51,696ポイント)   Date: 2010/01/27(水) 13:09   No:47135     
Title: Re:複雑な形の図形を3D描画    
例えば、
1 <= sqrt(x^2 + y^2) <= 2
0 <= z <= 1
を満たす図形を表示できれば良いのかな?

上下の平面の部分と内側外側の曲面の部分を、
それぞれ3角形に分割して描画するのが基本ではないかな。
これが難しいなら、更にその前のステップとして、
正四面体や正八面体の描画はできますか?


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

Name: Ma  ..プログラマー(35,778ポイント)   Date: 2010/01/27(水) 13:32   No:47136     
Title: Re:複雑な形の図形を3D描画    
>例えば、 
>1 <= sqrt(x^2 + y^2) <= 2 
>0 <= z <= 1 
>を満たす図形を表示できれば良いのかな? 

そうですね。
円柱から中をくりぬいた感じです。

>上下の平面の部分と内側外側の曲面の部分を、 
>それぞれ3角形に分割して描画するのが基本ではないかな。 

つまり、円柱から中がくりぬかれたものをたくさん描画する、っていうことですね。
いっていることはわかりますが、かなり面倒ですね。。。
特にその円柱(中がくりぬかれた状態)のまわりをぐるりとまわるときの計算が特に。


・おかげでひとつ思いついた方法。
メタセコで中がくりぬかれた円柱が基本図形にあるので、これを使う。
頂点データから、内側の頂点位置をいじることで内側と外側の幅をコントロール。


とすると、DXライブラリでモデルの頂点位置をいじることができる関数があればいけるのかな?
ど、どれでしたっけ・・・。 編集済み


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

Name: Ma  ..プログラマー(35,875ポイント)   Date: 2010/01/27(水) 13:43   No:47137     
Title: Re:複雑な形の図形を3D描画    
参照用メッシュ関数
とかでしょうか?
このへんからメッシュ情報を取得して計算するプログラムはみたことがあるんですが、
メッシュ情報をいじって、それに対応したものを描画できるのでしょうか?
参照用 とあるので、書き込みはできない・・・のかな?


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

Name: たいちう  ..熟練のプログラマー(51,863ポイント)   Date: 2010/01/27(水) 13:53   No:47139     
Title: Re:複雑な形の図形を3D描画    
> 特にその円柱(中がくりぬかれた状態)のまわりをぐるりとまわるときの計算が特に。

ここの計算は別に面倒ではないです。

// 外周の下側
float r = 2;
for (int i = 0; i < n; i++) {
    float theta = 2. * PI * i / n;
    x[i] = r * cos(theta);
    y[i] = r * sin(theta);
    z[i] = 0;
}

// 外周の上側
for (int i = 0; i < n; i++) {
    float theta = 2. * PI * (2 * i + 1) / 2 / n;
    x[i] = r * cos(theta);
    y[i] = r * sin(theta);
    z[i] = 1;
}


実際は用意したバッファに直接計算し、indexを設定して
DrawPolygonIndexed3Dなどを呼び出すことになるでしょう。


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

Name: Ma  ..プログラマー(36,077ポイント)   Date: 2010/01/27(水) 14:40   No:47143     
Title: Re:複雑な形の図形を3D描画    
>> 特にその円柱(中がくりぬかれた状態)のまわりをぐるりとまわるときの計算が特に。 
>ここの計算は別に面倒ではないです。 

ちょっと複雑に考えていたみたいです。
DrawPolygonIndexed3D( VERTEX3D *Vertex, int VertexNum, unsigned short *Indices, int PolygonNum, int GrHandle, int TransFlag )

ここで、四角形ポリゴンを使えば(VertexNum に 4)、簡単に計算できますね。
↑三角形で考えてたから、難しく考えてた。

なるほど。
このへんの関数の使い方はぜんぜん覚えてないので、次に時間ができたとき(1,2日後とか)に挑戦開始します。
ありがとうございました。


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

Name: Ma  ..プログラマー(37,059ポイント)   Date: 2010/01/28(木) 06:23   No:47212     
Title: 重い    
ちょちょいといじってみたら、いがいとすんなりできました。
ありがとうございます。
ですが、新しい問題にあたってしまいました。

以下のように実装できましたが、
ちょっと重い感じです。
速度改善のための提案をおねがいします。
(Vertex,Index はグローバル変数として宣言し、それ以来は変更しません。)


void drawHollowCylinder(float xStart,float xEnd,float R,float r){

    int n = 10;
    for(int i = 0; i < n; i++){
        float theta = 2.0f*PHI_F*i/n;
        float thetaPre = 2.0f*PHI_F*(i-1)/n;
        Vertex[ 0 ].pos  = VGet( xStart*100, sin(theta)*R*100,  cos(theta)*R*100) ;//外側
        Vertex[ 1 ].pos  = VGet( xStart*100, sin(thetaPre)*R*100,  cos(thetaPre)*R*100 ) ;//外側
        Vertex[ 2 ].pos  = VGet( xStart*100, sin(theta)*r*100, cos(theta)*r*100 ) ;//内側
        Vertex[ 3 ].pos  = VGet( xStart*100, sin(thetaPre)*r*100,  cos(thetaPre)*r*100 ) ;//内側
        // 2ポリゴンの描画
        DrawPolygonIndexed3D( Vertex, 4, Index, 2, DX_NONE_GRAPH, FALSE ) ;//底1
        for(int i = 0; i < 4;i++){
            Vertex[ i ].pos.x = xEnd*100;//反対側の底
        }
        DrawPolygonIndexed3D( Vertex, 4, Index, 2, DX_NONE_GRAPH, FALSE ) ;//底2
        Vertex[ 2 ].pos  = VGet( xStart*100, sin(theta)*R*100, cos(theta)*R*100 ) ;//反対側の内側にあったものを、元側の外側にする。
        Vertex[ 3 ].pos  = VGet( xStart*100, sin(thetaPre)*R*100,  cos(thetaPre)*R*100 ) ;
        DrawPolygonIndexed3D( Vertex, 4, Index, 2, DX_NONE_GRAPH, FALSE ) ;//外側の外壁
        if(r < 0.01f){//もし、小さい半径が0に近いならば内側の外壁は描画しない。
            for(int i = 0; i < 4;i++){
                Vertex[i].pos.y *= r/R;Vertex[i].pos.z *= r/R;
            }

            DrawPolygonIndexed3D( Vertex, 4, Index, 2, DX_NONE_GRAPH, FALSE ) ;//内側の外壁
        }
    }
    
}



大体モデルで描画するときより、(面数で言えば8分の1ぐらいなのに)感覚的に4倍ぐらい時間がかかってしまいました。
描画は↑の関数を毎フレーム200回ぐらい呼び出しています。
円柱から中をくりだしたものをいくつもならべることで、曲線2本の間をぐるっとx軸に対して回して作られた3D図形を、中が綺麗に曲線に沿って空洞になっているような再現をしています。

(各円柱の底ふたつの半径を別々にすれば数が少なくてもより綺麗な描画になりますが、各円柱のふたつの底の半径が一致しているのは(積分を意識した)意図的表現です。)


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

Name: たいちう  ..熟練のプログラマー(52,281ポイント)   Date: 2010/01/28(木) 09:15   No:47214     
Title: Re:重い    
まず最初に行うべきことは処理時間の計測です。
感覚に頼るのではなく正確に計測してこそ、
最適化の効果を評価できます。

次に、DrawPolygonIndexed3Dを使いこなしましょう。
drawHollowCylinderでは、4角形を40回描画しているようですが、
連続した3角形を4回描画すれば済むはずです。

見えない面の描画はしなくても良いでしょう。
法線ベクトルで判定できます。

こっから先はケースバイケース。
有意な効果が出るとは限りません。もっと情報が欲しいところです。
自作関数への置き換えなど、最適化のテクニックは諸刃の剣です。
効果があってもプログラムを本来よりも複雑にしてしまいます。
闇雲にやらず、効果が確認できなければ元に戻すべきです。

・ループ内でsin(theta)等を複数回計算しているが、
  コンパイラがこれを最適化していない可能性がある。
・sin()を自作のもっと速い関数に置き換える。
  必要な精度で作ればよいので速くなる可能性はある。
・VGetは汎用的に作られた関数だろうから、これも必要な
  機能と精度に絞って自作する。その過程で、ループ外に出せる
  計算や、起動時に一回すればよい計算が見つかるかもしれない。

ソースを見ただけではこれ以上は今は思いつきません。
後はもっと詳しい人におまかせです。

最後に、プログラムの目的をよく考えて見ましょう。
何が必要なのですか?


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

Name: Ma  ..プログラマー(37,789ポイント)   Date: 2010/01/28(木) 11:36   No:47221     
Title: Re:重い    
>drawHollowCylinderでは、4角形を40回描画しているようですが、 
>連続した3角形を4回描画すれば済むはずです。 
なるほど。
四角形より三角形がメジャーなことと、何度も同じ関数を呼ぶよりよりひとつにまとめたほうが
(関数内の初期化処理や後処理が減るおかげで)描画がはやくできる可能性が高いわけですね。

つまり、円柱の底ふたつと、外側の皮と内側の皮、計四回で描画。
それぞれの描画に三角形の数はn*2 ということですね。(四角形n回をふたつに割るから)(nは360度の分割数。
挑戦してみますが、しばらく時間かかりそうです。


>見えない面の描画はしなくても良いでしょう。 
>法線ベクトルで判定できます。 
すいません、見えない面というのは内側の面のことでしょうか?

そもそも DirectX の基礎知識が足りないので、どの頂点のどのメンバーをいじったらDrawPolygonIndexed3D関数で片面表示できるかが分かりません・・・。
公式のサンプルをやってみて、両面表示していたので、片面はどうやるんだろう。。。って思っていました。
法線ベクトルというと、norm めんばーのことでしょうか?でも、これって光の反射率の計算ですよね。

まずは、DrawPolygonIndexed3D関数で片面表示の仕方からご教授お願いできますか?
それから、よければ、頂点データの各メンバーの私なりの解釈があっているかとか教えていただけるとうれしいです。
typedef struct tagVERTEX3D
{
    VECTOR                    pos ;//頂点の位置x,y,z
    VECTOR                    norm ;//法線ベクトルx,y,z(光の反射?)
    COLOR_U8                dif ;//ディフューズカラー。基本色調?
    COLOR_U8                spc ;;//スペキュらカラー。反射色調?
    float                    u, v ;//テクスチャのどの位置を選択するか。でも、この場合のuv は違う意味な気がする・・・。
    float                    su, sv ;//???
} VERTEX3D, *LPVERTEX3D ;


>ケースバイケースの方法
あまり、大きな影響があるのか分からないので、ひとまずあとまわしにさせていただきます。
まずは、片面化から・・・。


>最後に、プログラムの目的をよく考えて見ましょう。 
何が必要なのですか?

ちょっと漠然とした質問ですねwなんと答えていいのやら・・・
目的といえば円柱から中をくりぬいた図形の描画ですけど、そういうことじゃないですよね。 編集済み


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

Name: Ma  ..プログラマー(37,846ポイント)   Date: 2010/01/28(木) 11:55   No:47222     
Title: 無題    
追加で質問なのですが、
透明度は、モデルのときは以下の関数をつかっていました。
MV1SetOpacityRate
今回の描画方法の場合は、どの値を調整すればいいのでしょうか?
または、どのような方法をとればいいでしょうか? 編集済み


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

Name: たいちう  ..熟練のプログラマー(52,931ポイント)   Date: 2010/01/28(木) 12:04   No:47223     
Title: Re:無題    
処理時間の計測についての反応がありませんが、
当然やってくれているわけですよね?
これがないと話になりませんので、現段階での実測時間を教えてください。


> すいません、見えない面というのは内側の面のことでしょうか?

立方体を外から見た図を表示する場合、
6つの正方形(変形している)を描画する必要はありません。
視点からは最大でも3つしか見えませんので、見えない面の描画は無駄です。
もし可能ならば、座標の計算も省きたいところですが、
とりあえず法線ベクトルを使って判定するのが簡単でしょう。


> 法線ベクトルというと、norm めんばーのことでしょうか?
> でも、これって光の反射率の計算ですよね。

normメンバーであっていると思いますが、反射率の計算のためだけにあるわけではありません。
図形的な意味を調べてください。


> まずは、DrawPolygonIndexed3D関数で片面表示の仕方からご教授お願いできますか?

知りません。私はDxライブラリは殆ど使用経験がないもので。
他の方からの回答を待つか、もっとよいのは、自分で調べてください。
何でもすぐに人に聞くようだと力は付きませんよ。
自分でできることがなくなってから質問するのが良いと思います。

それと私が意味しているのは、隠れることがわかっている面については、
DrawPolygonIndexed3Dを呼び出さない、ということです。


隠れる面の計算と描画を省いたとしても、せいぜい処理時間は半分になるだけですので、
DrawPolygonIndexed3Dを4回だけ呼び出すように変更するのが先でしょう。
もちろん処理時間の計測後ですが。


> ちょっと漠然とした質問ですねwなんと答えていいのやら・・・

どの位の処理速度が必要なのか、とか、動画である必要があるのか、とか、
全く判りませんので、何のためのプログラムなのかを質問したのです。


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

Name: Ma  ..プログラマー(38,833ポイント)   Date: 2010/01/28(木) 12:58   No:47224     
Title: Re:無題    
>どの位の処理速度が必要なのか、とか、動画である必要があるのか、とか、 
>全く判りませんので、何のためのプログラムなのかを質問したのです。
なるほど。
このプログラムは、任意の(数学的意味での)関数をx軸に対して回転した時の結果の図形を表示するプログラムで
目的は、より図形の形が理解または想像できるようにするためのものです。
また、今回の質問は、ふたつの任意の(数学的意味での)関数を用いて、その間の部分を回転してできた図形を表示するためにしています。
また、見る角度やカメラ位置はFPSのように任意で移動できるようにしたいので、表示は動画的である必要があります。


>処理時間の計測についての反応がありませんが、 
>当然やってくれているわけですよね? 
>これがないと話になりませんので、現段階での実測時間を教えてください。 

失礼しました。
さっそく計測結果を報告します。
と、その前に、以前話していた4倍も時間がかかるというのは、描画ではなく計算部分の間違いによるものでした。
修正後、割とスムーズに動いてくれることが分かりました。
それでも計測してみました。


1 <= sqrt(x^2 + y^2) <= 2 
0 <= z <= 1 

この図形で実験することとします。

xの範囲を分割する数(今回の場合0から1を分割する数)を以降 分割数と呼ぶことにします。
また、それぞれの円柱の360度を何分割するかという数を n=[自然数] と表現します。
また、これらの計測結果は、↑のDrawHollowCylinder にかかった時間です。

n=50での結果。
以下(分割数,計測結果の平均(ms))
(1,0.5ms)
(10,2.9ms)
(100,29ms)
(200,57.7ms)

n=100での結果。
以下(分割数,計測結果の平均(ms))
(1,0.9ms)
(10,6.1ms)
(100,58.1ms)
(200,116.0ms)




以上が、DrawHollowCylinder の結果でした。
以下、モデル(元mqoデータ)を使用して、
0 <= sqrt(x^2 + y^2) <= 2 
0 <= z <= 1 
を描画した結果です。

モデルは、n=100です。
(分割数,計測結果の平均(ms))
(1,0.4ms)
(10,1.5ms)
(100,106.2ms)
(200,423.6ms)


なぜか不思議な結果に。。。。。
もしかしたら、計算部分が影響しているのかもしれません。

計測してわかったことは、分割数(面の数)がふえるごとに、DrawHollowCylinder は比例するのに対して
モデル描画では、まるで二次関数のように上昇しているが、2桁以下の分割数までならDrawHollowCylinder よりもだいたい早い描画ができる。

すでに、現状のDrawHollowCylinder だけでも、十分目的を達成できる速度になっていることがわかりましたが、後学とさらなるパフォーマンス向上のためにたいちうさんが教えてくださった二つの重要な改良方法を実装する方向しようとおもいます。

1.四角形から三角形へなおし、4回の描画ですませる。
2.法線ベクトルから描画するか判定する。
3. なぜか両面表示になっているので、これを片面表示へ。(DXライブラリの関数なので、公式の掲示板で質問。ここで答えが得られたならラッキー。)


追記
ちょっと今時間がとれそうにないので、また後日やります。 編集済み


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

Name: Ma  ..プログラマー(39,239ポイント)   Date: 2010/01/29(金) 10:52   No:47297     
Title: コーディングミス    
すいません。前回の計測結果は(mqoモデル描画側のコードが)間違っていました。

↓これが間違い


モデルは、n=100です。 
(分割数,計測結果の平均(ms)) 
(1,0.4ms) 
(10,1.5ms) 
(100,106.2ms) 
(200,423.6ms) 


まさにforループが二重になってて、文字通り二次関数状態になってました。

正しくは、
モデルは、n=100です。 
(分割数,計測結果の平均(ms)) 
(1,0.1ms) 
(10,0.9ms) 
(100,1.2ms) 
(200,2.3ms)

(1000,11.5ms)

やはり、驚異的な差がありました。(DrawHollowCylinderと比べて)約50倍の差です。
今回はうまく比例してくれました。
おそらく毎フレーム頂点計算があるのも影響しているのかもしれません。
(マイフレーム関数が変わるわけじゃないので、データの保存も考えておきます。)


以下、経過報告

1.四角形から三角形へなおし、4回の描画ですませる。
 すいません、まだ(時間的に)できません。週末になるかも?
 
2.法線ベクトルから描画するか判定する。 
 すいません、まだ(時間的に)できません。週末になるかも?
 
3. なぜか両面表示になっているので、これを片面表示へ。(DXライブラリの関数なので、公式の掲示板で質問。ここで答えが得られたならラッキー。) 
 DXライブラリの公式掲示板で解答待ちです。

以上です。
あまり進歩していないのにあげてすいません。 編集済み


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

Name: Ma  ..プログラマー(39,932ポイント)   Date: 2010/01/30(土) 07:04   No:47355     
Title: Re:コーディングミス    
1.四角形から三角形へなおし、4回の描画ですませる。 

↑これやろうとしてます。



void drawHollowCylinder(float xStart,float xEnd,float R,float r){

    
        int n = 50;
        VERTEX3D *Vertex = new VERTEX3D[n*2];
        unsigned short *Index = new unsigned short[n*6];
        for(int i = 0; i < n; i++){
            Vertex[i*2] = initialVertex;
            Vertex[i*2+1] = initialVertex;
            float theta = 2.0f*PHI_F*2*i/n;
            Vertex[ i*2 ].pos  = VGet( xStart*100, sin(theta)*R*100,  cos(theta)*R*100) ;//外側
            Vertex[ i*2+1 ].pos  = VGet( xStart*100, sin(theta)*r*100, cos(theta)*r*100 ) ;//内側

            /*Indexの並びがわかりません・・・・。
            if(i == 0){
                Index[ 0 ] = 0;
                Index[ n*6-3 ] = 0;
                Index[ n*6-4 ] = 0;
                Index[ 1 ] = 2;
                Index[ 4 ] = 1;
                Index[ n*6-1 ] = 3;
            }
            else{
                Index[ i*6 ] = i*2;
                Index[ i*6-3 ] = i*2;
                Index[ i*6-4 ] = i*2;
                Index[ i*6+1 ] = i*4+2;
                Index[ i*6+4 ] = i*4+1;
                Index[ i*6-1 ] = i*4+3;
            }*/

            
            
        }
        
        
        
        // 2ポリゴンの描画
        DrawPolygonIndexed3D( Vertex, n*6, Index, 2*n, DX_NONE_GRAPH, FALSE ) ;//底1
            
    delete Vertex;
    delete Index;

}

↑Index の求め方がもうちんぷんかんぷんでした。。
一応図に5回ぐらい描いて挑戦したんですが、とんでもない図形になるばかりでしたorz
ちなみに、まだ底一つ目の描画の段階です。

Index の正しい並び方の考え方を教えてください。


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

Name: たいちう  ..熟練のプログラマー(53,592ポイント)   Date: 2010/01/30(土) 22:55   No:47414     
Title: Re:コーディングミス    
> Index の正しい並び方の考え方を教えてください。

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R14N8


まず、n=4くらいで、forループなしでやってみて下さい。
これならできますか?


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

Name: Ma  ..プログラマー(39,480ポイント)   Date: 2010/01/31(日) 00:19   No:47417     
Title: Re:コーディングミス    
で、できましたー!

初心に戻って、データをリスト化してみたら、なんとなくパターンが見えました。

経過報告でした。

void drawHollowCylinder(float xStart,float xEnd,float R,float r){

    
        int n = 50;
        VERTEX3D *Vertex = new VERTEX3D[n*2];
        unsigned short *Index = new unsigned short[n*6];
        for(int i = 0; i < n; i++){
            Vertex[i*2] = initialVertex;
            Vertex[i*2+1] = initialVertex;
            float theta = 2.0f*PHI_F*i/n;
            Vertex[ i*2 ].pos  = VGet( xStart*100, sin(theta)*R*100,  cos(theta)*R*100) ;//外側
            Vertex[ i*2+1 ].pos  = VGet( xStart*100, sin(theta)*r*100, cos(theta)*r*100 ) ;//内側
        }
        /*パターン分析
        Index[0] = 0;
        Index[1] = 1;
        Index[2] = 2;

        Index[3] = 1;
        Index[4] = 2;
        Index[5] = 3;
        
        Index[6] = 2;
        Index[7] = 3;
        Index[8] = 4;
        
        Index[9] = 3;
        Index[10] = 4;
        Index[11] = 5;
        
        Index[12] = 4;
        Index[13] = 5;
        Index[14] = 6;
        
        Index[15] = 5;
        Index[16] = 6;
        Index[17] = 7;
        */
        for(int i= 0; i < n*6; i++){
            Index[i] = i/3+i%3;
            if(Index[i] >= n*2){
                Index[i] %= n*2;
            }
        }

        
        // 2ポリゴンの描画
        DrawPolygonIndexed3D( Vertex, n*6, Index, 2*n, DX_NONE_GRAPH, FALSE ) ;//底1
            
    delete Vertex;
    delete Index;

}


続きいきます!


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

Name: Ma  ..プログラマー(39,744ポイント)   Date: 2010/01/31(日) 01:39   No:47419     
Title: Re:コーディングミス    
1.四角形から三角形へなおし、4回の描画ですませる。 

ようやく、これが終わりました。
なお、描画するときは、計算時間がかからないように、最初(図形に変更があったとき)にすべて先に計算しデータとして保存するようにしました。
(つまり、頂点の位置を計算するのは図形を変更したときだけ)



で比較してみます。

以下、結果。

n=50での結果。 
以下(分割数,計測結果の平均(ms)) 
(1,0.5ms) 
(10,2.9ms) 
(100,29ms) 
(200,57.7ms) 
↓(改良後)
(1,0.1ms) 
(10,0.8ms) 
(100,8.5ms) 
(200,13.5ms) 

(1000,62ms) 

n=100での結果。 
以下(分割数,計測結果の平均(ms)) 
(1,0.9ms) 
(10,6.1ms) 
(100,58.1ms) 
(200,116.0ms) 

↓(改良後)

(1,0.2ms) 
(10,1.9ms) 
(100,12.6ms) 
(200,24.0ms) 

(1000,120ms) 



結論
・約、5倍ほど早くなりました。





これで、1番は完了にします。

二番にとりかかります。
一応、先に考えていることをかいておきます。

各面の頂点3つから外積で求めた法線ベクトルと、頂点からカメラへのベクトルの内積を使って、間の角度を求める。
それが、90度以上だったら描画しない。 編集済み


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

Name: Ma  ..プログラマー(39,750ポイント)   Date: 2010/01/31(日) 02:54   No:47421     
Title: Re:コーディングミス    
法線ベクトルを求めている途中、以前のインデックス計算時、表裏が交互になっていたことが判明しましたorz


   for(int i= 0; i < n*6; i++){ 
            Index[i] = i/3+i%3; 
            if(Index[i] >= n*2){ 
                Index[i] %= n*2; 
            } 
        } 

↑こんな感じで、頂点の順番を定義していました。


それで、↓が、法線ベクトルと頂点からカメラの内積を求めながら法線ベクトルを描画する部分。

            for(int faceNum = 0; faceNum < 2*divN;faceNum++){
                VECTOR v1 = VertexStart[Index[faceNum*3]].pos;
                VECTOR v2 = VertexStart[Index[faceNum*3+1]].pos;
                VECTOR v3 = VertexStart[Index[faceNum*3+2]].pos;
                VECTOR normalVec = VCross(VSub(v1,v3), VSub(v3,v2));
                VECTOR center = VGet((v1.x+v2.x+v3.x)/3,(v1.y+v2.y+v3.y)/3,(v1.z+v2.z+v3.z)/3);
                VECTOR dotCamVec = VSub(center,CamPos);
                float theta = acos(VDot(normalVec,dotCamVec)/(sqrt(VSquareSize(normalVec))*sqrt(VSquareSize(dotCamVec))));
                //printfDx("theta=%4.2f\n");
                DrawLine3D(v1,v2,GetColor(255,255,255));
                DrawLine3D(v2,v3,GetColor(255,255,255));
                DrawLine3D(v3,v1,GetColor(255,255,255));
                DrawLine3D(center,VAdd(center,normalVec),GetColor(255,255,255));
                
        }


結果は、画像のとおりで、表と裏が交互になっていたみたいですorz
調べたところ、頂点が時計周りなら裏で、頂点が半時計周りなら表らしいので、インデックスの計算方法を直す必要があるみたいでした。
挑戦してみます。


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

Name: Ma  ..熟練のプログラマー(40,265ポイント)   Date: 2010/01/31(日) 06:12   No:47424     
Title: Re:コーディングミス    
例の問題も修正して、2番できました。

何をやったかというと。。。って言葉で説明するとすごく長くなりそうです(汗
基本的には、前書いたことです。
>各面の頂点3つから外積で求めた法線ベクトルと、頂点からカメラへのベクトルの内積を使って、間の角度を求める。 
>それが、90度以上だったら描画しない。 

底面は、それぞれ1つの三角形の法線だけで表示チェックしましたが、側面はそうもいかないので、すべての面をチェックすることになりました・・・。
おそらく、これがスピードのネックになりそうです。


ともかくこの方法で、二番
>2.法線ベクトルから描画するか判定する。
を、完了しました。


計測結果の比較をします。
今回、比較するのは、1番修正後と1番、2番両方修正後です。



n=50での結果。  
以下(分割数,計測結果の平均(ms))  
【1番修正後】 
(1,0.1ms)  
(10,0.8ms)  
(100,8.5ms)  
(200,13.5ms)  
(1000,62ms)  
↓【二番修正後】
(1,0.2ms)  
(10,3.2ms)  
(100,26.5ms)  
(200,55ms)  
(1000,268ms)  


n=100での結果。  
だいたい予想できるので略


結論
今のコードではぜんぜんだめだったorz
コードの組み方がわるいんでしょうけど、潔く判定しないほうがいいと思い始めてます。
とりあえず、1番修正後のコードと2番修正後のコードを添付します。

あと、VC++の出力画面にアクセス違反が大量発生しているので(プログラムは落ちないが、表示している。)、それの原因がもしありそうなら教えていただけると幸いです。

もし余裕がない方がいれば、2番修正後は長いので、1番修正後だけを見ていただけるだけでもいいです。


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

Name: Ma  ..熟練のプログラマー(40,842ポイント)   Date: 2010/01/31(日) 08:07   No:47430     
Title: Re:コーディングミス    
修正点2番ですが、
なんだか、とんでもない勘違いをしていたみたいです。

法線ベクトルは、頂点情報に保存しておいて、表示するかどうかはその法線ベクトルから求めればいいから、
毎フレーム法線ベクトルを求める必要なんてなかったんですね。

ようやく、VECTOR.norm メンバーの意味が分かりました。
解説サイトがないと、こうもてこずるものなんですねw
ここの2Dの解説ページには感謝です。
この点を改良しようと思います。
(あーでも、アクセス違反の件は引き続き探してますので、分かる方がいればうれしいです。)

なんか一人芝居やってるみたいで、ほんとすいませんorz



で、
http://sky.geocities.jp/freakish_osprey/opengl/opengl_normalvecotr.htm
ここのページみながら、頂点法線ベクトルを求める段階までこれました。


>頂点法線ベクトルを求める
>基本は面法線ベクトル。
>面法線を元に頂点法線を求めます。
>ある頂点の頂点法線を求める場合に、
>おおざっぱに言ってどのように計算していくかというと、 

>頂点法線を求める頂点を共有している面をリストアップする。 
>リストアップした面の面法線を足しあわせて規格化(=平均化)したものが、頂点法線。 
>という具合です。
>各面の面法線が求められていて、頂点を共有する面のリストアップさえできてしまえば、
>後は、各面の面法線を足しあわせて規格化するだけなので、
>たいして難しいことはないです。 


よく理解しました。。。。が。
頂点を共有する面のリスト、ってどうやって・・・・
またデータ解析かorz
うわぁ、面倒ですねこれは・・・。 編集済み


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

Name: Ma  ..熟練のプログラマー(40,791ポイント)   Date: 2010/01/31(日) 23:16   No:47452 解決!     
Title: Re:コーディングミス    
どうも、うまく描画判定ができないです。(遅くなってしまう)
とりあえず、判定なしで当初の目的の高速化ができたのでよしとします。


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

Name: たいちう  ..熟練のプログラマー(53,764ポイント)   Date: 2010/02/01(月) 09:58   No:47481     
Title: Re:コーディングミス    
VertexStart = new VERTEX3D[n*2];
...

//頂点情報を出していく。
for(int i = 0; i < n; i++){
    //頂点を初期化
    VertexStart[i*2] = initialVertex;
    VertexStart[i*2+1] = initialVertex; ← 明らかにおかしい

パッと見ただけですが、おかしいところがありますね。
このような所が他にもあるのでしょう。

経験を積みプログラムが短かければ一目で気付きますが、
プログラムがもっと複雑になると相当経験があっても、
ソースコードからバグの原因に気付くことが困難になってきます。
実行時エラーの対処法を工夫すべきでしょう。

今回の場合は、ソースコードの一部をコメントアウトして試すことで、
アクセス違反をおこしている箇所を絞り込むことができるでしょう。
私の指摘を聞かなかった振りをして、コメントアウトして絞り込む練習を
してみてはいかがでしょうか。

# この説明で分からなければ、時間のあるときにもっと丁寧な説明をしてみます。


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

Name: たいちう  ..熟練のプログラマー(54,138ポイント)   Date: 2010/02/01(月) 10:24   No:47484     
Title: Re:コーディングミス    
「アクセス違反の原因が分からない。」のスレに気付かず、こっちに回答しました。
向こうも解決済みになっていますし、しばらくはこのスレを使いましょう。


> どうやら、一度に作れる個数に制限があるみたいなんです。

という推測は間違いでしょう。私が指摘した種類のことを修正してから
再度試してください。


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

Name: Ma  ..熟練のプログラマー(42,460ポイント)   Date: 2010/02/01(月) 11:28   No:47487     
Title: Re:コーディングミス    
>今回の場合は、ソースコードの一部をコメントアウトして試すことで、 
>アクセス違反をおこしている箇所を絞り込むことができるでしょう。 

一応 VertexInner か VertexOuter を描画するときにアクセス違反が発生するのが確認できてます。
        DrawPolygonIndexed3D( VertexInner, divN*6, Index, 2*divN, DX_NONE_GRAPH, FALSE ) ;//内側の側面(ここでアクセス違反発生)
        DrawPolygonIndexed3D( VertexOuter, divN*6, Index, 2*divN, DX_NONE_GRAPH, FALSE ) ;//外側の側面    

ただ、一番よくわからないのは、(n角柱の)個数をふやすとアクセス違反が発生するんですよね・・・。
(過去に、2、3個DXライブラリのバグを発見したことがあるので、今回も一応DXライブラリのバグも検討しながらチェックをすすめてみます。)


>    VertexStart[i*2] = initialVertex;
>    VertexStart[i*2+1] = initialVertex; ← 明らかにおかしい

うーん指摘されても、なにがおかしいのかよくわかりません。
ただ、コードがわかりづらいのはたしかなので、この部分をわかりやすく書き直すと

↓これから
//頂点情報を出していく。
for(int i = 0; i < n; i++){
    //頂点を初期化
    VertexStart[i*2] = initialVertex;
    VertexStart[i*2+1] = initialVertex; ← 明らかにおかしい

↓こうなります。
//すべての頂点を初期化する。
for(int i = 0; i < n*2;i++){
    //頂点を初期化(色情報など)
    VertexStart[i] = initialVertex;

(今回添付した新しいソースを見ると分かりやすいかも)

ちょっとここにのせているソースが古くなっているので、現在のソースを添付させていただきます。

ところで、VC++のデバッガー(自動変数)でnew を使った値を確認できないのって仕様なんでしょうか?
私の環境では、どうもエラーみたいな表示になるんですよね。。。
実際にDXライブラリのprintf とかで表示すると、エラーになんてなってないんですけどね。。


あ、あと仕様に変更がありました。
半径を底1と底2でばらばらで指定できるようにしました。
つまり、n角柱なのだが、底面がそれぞれ合同してない感じです。


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

Name: たいちう  ..熟練のプログラマー(54,403ポイント)   Date: 2010/02/01(月) 12:03   No:47490     
Title: Re:コーディングミス    
> うーん指摘されても、なにがおかしいのかよくわかりません。

申し訳ありません。これは私の勘違いでした。
経験を積み、、、のくだりが特に痛いですね。


> (過去に、2、3個DXライブラリのバグを発見したことがあるので、
> 今回も一応DXライブラリのバグも検討しながらチェックをすすめてみます。)

念のために確認しますが、DXライブラリのバグだとどのようにして確認しましたか?
今回の場合だと、

分割数が多くなると不具合が発生する

分割数以外に自分のプログラムは変更していない

ライブラリのバグに違いない

という思い込みに落ち込まないように気をつけてください。
ライブラリのバグの可能性はありますが、自分のプログラムに
原因があることが殆どです。
ご承知のことと思いますが念のため。


今回のアクセス違反の原因については、時間が取れればもう少し見てみます。
少なくとももっと有益なアドバイスは差し上げられるように。


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

Name: Ma  ..熟練のプログラマー(42,573ポイント)   Date: 2010/02/01(月) 12:13   No:47491     
Title: Re:コーディングミス    
ご丁寧にありがとうございます。

>思い込みに落ち込まないように気をつけてください。 
はい、もちろんまだまだ詳しく調べて自分がミスっていないか調べて、おもいこまないように気をつけます。


さて、さっそくもっと原因をほっていきたいところなんですが、
しばらくちょっと手があかなさそうなので
次の投稿はしばらく後になりそうです><


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

Name: たいちう  ..熟練のプログラマー(54,474ポイント)   Date: 2010/02/01(月) 13:03   No:47495     
Title: Re:コーディングミス    
http://www.play21.jp/board/formz.cgi?action=res&resno=47132&page=&id=dixq&rln=47491

↑のサンプルと比較してみると、DrawPolygonIndexed3Dの2つめの引数は、
divN*2ではないかな。


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

Name: Ma  ..熟練のプログラマー(43,636ポイント)   Date: 2010/02/02(火) 05:50   No:47543 解決!     
Title: Re:コーディングミス    
ん?リンクミスでしょうか?
そのURLはここのリンクのようです。

http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R14N8
きっとここのことですよね。


…読んでます・・・。



なおったぁぁあああ、うわぁぁあああ!!!って感じですね。(悲しみと喜び
まさかの、まさかの引数ミス・・・。
リファレンスをもう一度確認しておけばよかったです。

こんなミスはもうしないように、リファレンスは何度でも読むようにこころがけるようにします。
おはずかしいミスですいませんでした。


そして、今回の成果の記念に一枚、添付しましたw

こんな複雑な図形(x方向を100分割、YZ方向(360度)を50分割)を、なんと! 約 2ms で描画してしまう!
最初と比べると、15倍早くなりましたww

いやぁ、爽快ですねw ありがとうございました。  編集済み


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



Name: 猫旅  ..ぴよぴよ(104ポイント)   Date: 2010/02/02(火) 01:30   No:47536       
Title: 画像が読み込まれていなかったら警告    
こちらでは初めて質問させていただきます。

DXライブラリを使っております。
LoadGraph等で画像を読み込む際に
指定した場所にその画像がなかったら
○○の画像がありませんと新しいウインドウを表示して警告することは可能なのでしょうか?


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


Name: kazuoni [URL]  ..ハッカー(132,791ポイント)   Date: 2010/02/02(火) 01:58   No:47537     
Title: Re:画像が読み込まれていなかったら警告    
画像ハンドル生成失敗時には-1が返ってくるので、
-1が返ってきたらメッセージボックスを表示するというのはどうでしょうか?


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



Name: dom  ..ぴよぴよ(574ポイント)   Date: 2010/02/01(月) 18:23   No:47509       
Title: ファイルを読み込まない    
龍神録プログラミングについてです。
今、20章辺りなのですがこれ自体は問題なく進んでいます。
あるとき、Ryujin.exeをダブルクリックで実行してみると真っ黒な画面が表示されるだけでした。
(VC++からは「デバックなしで開始」で問題なく表示されます。)

いろいろ試した結果、load.cppでデータ(画像、音声、cvs、...)を読み込めていないとわかりました。
原因はパスの表記の仕方で、読み込みファイルのパスを絶対パスで書くとexeからでも問題なく実行できました。(VC++ではどちらでも問題ありません)
ここで疑問に思ったのですが、なぜ相対パスだとRyujin.exeはファイルを読み込んでくれないのでしょうか?


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


Name: ひよこ  ..比類無きプログラマー(79,308ポイント)   Date: 2010/02/01(月) 18:44   No:47511     
Title: Re:ファイルを読み込まない    
相対パスはその位置から、探します。
絶対パスは直接、その場所を指すので実行できます。
例えば../dat/img/board/10.pngをDebugフォルダの中から探すと、
まず、一つ上のフォルダに行きます。(プロジェクトがあるところです)
そこにはdatというフォルダがないのでそこで失敗します。


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

Name: dom  ..ぴよぴよ(624ポイント)   Date: 2010/02/01(月) 21:50   No:47522 解決!     
Title: Re:ファイルを読み込まない    
ありがとうございます!納得できました。
自分はファイルがexeに組み込まれているものと勘違いしていました。


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



Name: kms  ..中級者(13,686ポイント)   Date: 2010/01/31(日) 13:05   No:47433       
Title: 3Dでの2D描画について    
こんにちは。
質問させて頂きます。

DXライブラリで3DのRPGを作成しているのですが、
モデル(キャラクタ)のみを2Dのドット描画にする、という実装は可能でしょうか?

マップは3Dで表現するのは無論なのですが、
モデルとなるキャラクタのみを2Dのドットで描画したいのです。

googleで検索したところ、「プリレンダリング」という技術を見つけたのですが、
素人の僕にはさっぱり理解不能でした。

DXライブラリの3D描画のなかに、2D描画の記述を織り込むには、
何か別のソフトが必要になるのでしょうか?
それともコードの記述次第では可能なのでしょうか?

イメージとしては、3Dのマップ内を、ドット絵のキャラクタが自由自在に動き回る、
といった感じなのですが。。

もしよろしければ、ご回答、宜しくお願い致します。


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


Name: KS  ..ぴよぴよ(12ポイント)   Date: 2010/01/31(日) 13:42   No:47434     
Title: Re:3Dでの2D描画について    
ビルボードとかはどうでしょうか?

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

Name: kms  ..中級者(13,712ポイント)   Date: 2010/01/31(日) 14:55   No:47437     
Title: Re:3Dでの2D描画について    
すみません。。全くの素人なのですが、

ビルボードとは何でしょうか?


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

Name: softya  ..ハッカー(111,772ポイント)   Date: 2010/01/31(日) 15:15   No:47439     
Title: Re:3Dでの2D描画について    
ビルボードとは、ポリゴンの一枚板を常にカメラの方向に向けることでスプライトを3D空間の中に置く手法です。PS1やセガサターンの時代にはキャラクタと木とかに多用されてました。
ドラクエ7とかのキャラクタはビルボードだったはず。

説明。
http://www.platz.or.jp/~moal/billboard.html


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

Name: kms  ..中級者(13,728ポイント)   Date: 2010/02/01(月) 16:01   No:47497     
Title: Re:3Dでの2D描画について    
KS様、softya様、お返事ありがとうございます。

とりあえず、ポリゴン板一枚を作り、そこにテクスチャを貼る、

という認識でよろしいのでしょうか?


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

Name: softya  ..ハッカー(112,818ポイント)   Date: 2010/02/01(月) 16:40   No:47498     
Title: Re:3Dでの2D描画について    
>とりあえず、ポリゴン板一枚を作り、そこにテクスチャを貼る、
それだけではビルボードではありません。常にカメラの方を向くと言うのが重要です。


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



Name: uni  ..ぴよぴよ(12ポイント)   Date: 2010/02/01(月) 11:43   No:47488       
Title: 別ファイルの変数を参照する方法がわからない    
sourceB.cで宣言した、
const int numA[] = { 
    1,
    2,
    3,
    4,
    };
const int numB[][] ={
    { 0, 1, 2, 3, 4},
    { 5, 6, 7, 8, 9},
    };
を、sourceA.cで参照する場合はどうすればいいのでしょうか?

sourceB.cで、
void processA(){
    const int numA[] = ...
    const int numB[][] = ...
...
}
と書いていた場合は、
headerA.hで
void processA();
として、headerA.hをインクルードすれば参照できるかな?と思うのですが、
グローバル宣言している場合はどうしたら良いのかわかりません。
グローバル変数を別ソースで参照する場合はどうすればいいのでしょうか?


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


Name: non  ..比類無きプログラマー(90,296ポイント)   Date: 2010/02/01(月) 12:02   No:47489     
Title: Re:別ファイルの変数を参照する方法がわからない    
extern をつけます。


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

Name: uni  ..ぴよぴよ(62ポイント)   Date: 2010/02/01(月) 13:35   No:47496 解決!     
Title: Re:別ファイルの変数を参照する方法がわからない    
ありがとうございます。
ヘッダーに、
extern const int numA[];
みたいに書けばよかったのですね。 編集済み


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



Name: no  ..入門者(3,967ポイント)   Date: 2010/01/31(日) 22:01   No:47448       
Title: .exeファイルについて    
作成した.exeファイルを他PCでプレイする場合、どのファイルを渡せばいいのでしょうか?
個人的には.exeファイルと素材のみでよいのかと思うのですが、ただしいですか?


あと、何か注意点とかありましたら教えてください



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


Name: Ma  ..熟練のプログラマー(42,647ポイント)   Date: 2010/02/01(月) 12:20   No:47493     
Title: Re:.exeファイルについて    
仕様次第ですが、だいたいそれで正しいです。

・注意点
デバッグではなくリリースモードで作成したexeでないと、開発環境がないところでは起動しないときいたことがあります。


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

Name: Mist  ..比類無きプログラマー(83,348ポイント)   Date: 2010/02/01(月) 13:03   No:47494     
Title: Re:.exeファイルについて    
デバッグモードで作成したexeの配布は利用規約で禁止されています。

VS2008がインストールされていないPCで実行する場合、Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)のインストールが必要な場合があります。

http://www.microsoft.com/downloads/details.aspx?DisplayLang=ja&FamilyID=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2


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

Name: no   Date: 2010/02/24(水) 23:19   No:474481267021166     
Title: Re:.exeファイルについて    
お二方、返答ありがとうございました。
リリースモードで作成したexeファイルと素材を渡す、ということですね。
多忙につき謝辞が遅れました。申し訳ありません。




Name: デジキャメ  ..入門者(4,977ポイント)   Date: 2010/02/01(月) 00:22   No:47458       
Title: fprintfについて    
12X12 の大きさのmeshpanelを読み込んで、fprintfでtakasa / takasairoに書き込むのはどうすればよいのでしょうか?

数値の1〜9はそのまま、10〜12は、PQRで表します。

実行すると、白い画面が出ます。

↓のようにクリックすると、格子の色が変わります。
 (左端を青、右端を緑にしました)

 プログラムを実行しましたが、エラーが出てしまい、困っています。

 宜しくお願いいたします。

meshpanel(例)  takasa (期待の数値)    takasairo(期待の数値)
 
1000000000002   12           11           1            2
1000000000002                                         
1000000000002
1000000000002
1000000000002
1000000000002
1000000000002
1000000000002
1000000000002
1000000000002
1000000000002
1000000000000


#include "DxLib.h"
#define BOX       (20)
#define MESH_Y    (12)
#define MESH_X    (12)
#pragma warning(disable:4996)

void hikaku(int suuji){
    
  if (suuji <= 0) printf(" ");
  else if (suuji   < 10) suuji= suuji;
  else if (suuji  == 10) suuji='P';
  else if (suuji  == 11) suuji='Q';
  else if (suuji  == 12) suuji='R';
  else if (suuji  >= 13) printf("NO\n");
}

/***********/
int PIEL(int x, int y, int color){

 int Wh=GetColor(255,255,255), Bw=GetColor(70,70,255), Gr=GetColor(70,255,70), 
 int col[]={Wh,Bw,Gr}, sx=x*BOX, sy=y*BOX;

    DrawBox(sx, sy, sx+BOX-1, sy+BOX-1, col[color], TRUE); return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
 
    int  SetFontThickness(int TinckPal), CheckHitKey(int KeyCode), i, j, MouseX, MouseY;
    int  PIXjoho[MESH_Y][MESH_X]={0}, d=0, sum=0, Gry,genzaiti=0; 
    int  jMX=0, P=15,  p[18][18], t[18], bango[18][18], ironanba[18][18], mm; FILE *file;
    
    ChangeWindowMode(TRUE);        
    if(DxLib_Init() == -1){return -1;} 
    SetMouseDispFlag(TRUE);
    Gry=GetColor(200, 200, 200);    
    DrawBox(0, 0, 800, 600, Gry, TRUE);
    for(i=0; i<MESH_Y; i++){
        for(j=0; j<MESH_X; j++){
            PIEL(j, i, 0);
        }
    }
/***********/
    while(!ProcessMessage()){
        if((GetMouseInput() & MOUSE_INPUT_LEFT)){
            while (GetMouseInput() & MOUSE_INPUT_LEFT);
            GetMousePoint(&MouseX, &MouseY);
            MouseX = MouseX/BOX;
            MouseY = MouseY/BOX;
            if(MouseX<MESH_X && MouseY<MESH_Y){
         PIXjoho[MouseY][MouseX]++;
         if( PIXjoho[MouseY][MouseX]>2)  PIXjoho[MouseY][MouseX]=0;
                 PIEL(MouseX,MouseY, PIXjoho[MouseY][MouseX]);
            }
        }
    }
/*********/
        file=fopen("meshpanel.txt","w");
        for(i=0; i<MESH_Y; i++){
            for(j=0; j<MESH_X; j++){
                fprintf(file,"%d ",  PIXjoho[i][j]);
            }
            fprintf(file,"\n");
        }
        fclose(file);
        file=fopen("meshpanel.txt","r");
        for(i=0; i<MESH_Y; i++){
            for(j=0; j<MESH_X; j++){
                fscanf(file,"%d", &PIXjoho[i][j]);
            }
        }
        fclose(file);
/**********/
    for (mm = 0; mm < P; mm++) {
        for (j = 0; j < P; j++){
            t[j] = p[j][mm];
        }
        for (j = 0; j < P+10;j++){
            bango[mm][j] = 0;
            ironanba[mm][j] = 0;
        } 
            while (genzaiti < P){
            while ((t[genzaiti] == 0) && (genzaiti< MESH_Y)) genzaiti += genzaiti;
            if (genzaiti >= MESH_Y) break;
            i = t[genzaiti];
            while (t[genzaiti] == i){
                sum += sum;
                genzaiti += genzaiti;
            }
            bango[mm][d] = sum;
            ironanba[mm][d] = i;
            d += d; 
            sum = 0;
        }
    }
    for (mm = 0; mm < P; mm++) {
        for (j = jMX+1; j < 20 ; j++){
            if (bango[mm][j] > 0) jMX = j;
            printf("\n"); 
        }
    }
    for (j = 0; j <= jMX ; j++) {
        for (mm = 0; mm < P; mm++){
            printf("%2d", bango[mm][j]);
        }
        printf("\n"); 
    }
    printf("\n"); 
    for (j = 0; j <= jMX ; j++) {
        for (mm = 0; mm < P; mm++) {
            printf("%2d", ironanba[mm][j]);
        }
        printf("\n"); 
    }
    printf("\n"); 
    file=fopen("takasa.txt","w");
    for (j = 0; j <= jMX ; j++) {
        for (mm = 0; mm < P; mm++) {
            hikaku(bango[mm][j]);
            scanf("%d",bango[mm][j]);
            fprintf(file,"%d",bango[mm][j]);
        }
        printf("\n"); 
    }
    for (j = 0; j <= jMX; j++) {
        for (mm = 0; mm < P; mm++){
            hikaku(bango[mm][j]);
            scanf("%d", bango[mm][j]);
            fprintf(file,"%d",bango[mm][j]);
        }
        printf("\n"); 
    }
    printf("\n"); 
    fclose(file);
    file=fopen("takasairo.txt","w");
    for (j = 0; j <= jMX ; j++) {
        for (mm = 0; mm < P; mm++){
            hikaku(ironanba[mm][j]);
            fprintf(file,"%2d",ironanba[mm][j]);
        }
        printf("\n"); 
    }
    fclose(file);
    return 0;
}


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


Name: non  ..比類無きプログラマー(90,283ポイント)   Date: 2010/02/01(月) 09:16   No:47479     
Title: Re:fprintfについて    
自分で作っているプログラムなのでしょうか?

自分で作ったプログラムなら
エラーはコンパイルすればすぐわかると思うけど、行の最後にセミコロンがない行があるからです。



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

Name: Mist  ..比類無きプログラマー(83,213ポイント)   Date: 2010/02/01(月) 09:49   No:47480     
Title: Re:fprintfについて    
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1598

マルチポストは規約違反ですよ。


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

Name: デジキャメ  ..初心者(5,109ポイント)   Date: 2010/02/01(月) 11:05   No:47486     
Title: Re:fprintfについて    
>nonさん

ありがとうございます。

セミコロンを忘れていました。

>Mistさん

失礼致しました。

http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1598


の方に、削除の申請をしました。


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



Name: 東西南北  ..ぴよぴよ(52ポイント)   Date: 2010/02/01(月) 04:06   No:47469       
Title: math.hをインクルードしているのにM_PIが使えない    
math.hをインクルードしているのにM_PIが使えないです。

DXライブラリを使っております。
そのため、自分でM_PIを定義してます・・・。


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


Name: たかぎ [URL]  ..ハッカー(157,320ポイント)   Date: 2010/02/01(月) 04:10   No:47470     
Title: Re:math.hをインクルードしているのにM_PIが使えない    
そもそも math.h に M_PI があるのは、特定処理系の独自仕様にすぎません。


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

Name: 東西南北  ..ぴよぴよ(92ポイント)   Date: 2010/02/01(月) 04:26   No:47471     
Title: Re:math.hをインクルードしているのにM_PIが使えない    
たかぎ様
遅くにご回答ありがとうございます。
ということDXライブラリでは自分で宣言しなければいけないのでしょうか?
VS2005を使っております。


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

Name: Ma  ..熟練のプログラマー(40,828ポイント)   Date: 2010/02/01(月) 05:53   No:47472     
Title: Re:math.hをインクルードしているのにM_PIが使えない    
PHI
があります。
PHI_F
とかも。


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

Name: 御津凪 [URL]  ..ハッカー(138,669ポイント)   Date: 2010/02/01(月) 10:14   No:47483     
Title: Re:math.hをインクルードしているのにM_PIが使えない    
Visual Studio であれば、math.h をインクルードする前に _USE_MATH_DEFINES を定義すると使えますよ。

たかぎさんの仰るとおり、独自仕様のため、ご丁寧に通常では定義されません。

math.h を開いてコードの最後を見ると E_ で始まるマクロ定義文があり、
上記のように #if で括られている事が分かります。


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



Name: Ma  ..熟練のプログラマー(40,813ポイント)   Date: 2010/02/01(月) 03:00   No:47466       
Title: アクセス違反の原因が分からない。    
お世話になってます。

「複雑な形を3D描画」と似た内容なのですが、そのスレが長文化してしまったのと
質問内容がちょっとかわるので、新しいスレで失礼します。
経緯を知りたい場合は、お手数おかけしますが、「複雑な形を3D描画」を参照お願いします。

添付ファイルに、中が抜けている柱を3Dで描画することができるクラスが含まれているテキストファイルがはいってます。

使い方は簡単で


    hollowCylinder temp;
    temp.makeNew(3,0,1,2,1,2,1,true,true);
    temp.draw();

こんな感じです。

どうも描画するときにアクセス違反が起こるみたいで、その原因がわかりません。
VC++使っているので、デバッガー使って値をチェックしようと思ったんですが、
new を使ってメモリ確保したデータなので中身を見ることができません・・・orz
(↑仕様なのでしょうか?)
値をチェックする場合は

        for(int i = 0; i < divN*2;i++){
            printfDx("%d{%4.2f,%4.2f,%4.2f} // ",i,VertexInner[i].pos.x,VertexInner[i].pos.y,VertexInner[i].pos.z);
        }
        for(int i = 0; i < divN*6;i++){
            printfDx("{%d,%d} // ",i,Index[i]);
        }
これでチェックできます。 編集済み


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


Name: Ma  ..熟練のプログラマー(41,514ポイント)   Date: 2010/02/01(月) 06:53   No:47473 解決!     
Title: Re:アクセス違反の原因が分からない。    
自己解決でした、すいません。
なぜかよくわかりませんが、頂点を求める計算をちょっと変えたら解決しました。
修正後↓

//底2 = 底1 と pos.x 成分修正(x方向のシフト)
            VertexEnd[i*2].pos = VGet(xEnd*100,100*rE*sin(-theta),100*rE*cos(-theta));//底2、内側
            VertexEnd[i*2+1].pos = VGet(xEnd*100,100*RE*sin(-theta),100*RE*cos(-theta));//底2、外側

            //側面は、底の頂点のコンビネーション。
            VertexInner[i*2].pos = VGet( xStart*100, sin(-theta)*rS*100, cos(-theta)*rS*100 );//内側側面、底1
            VertexInner[i*2+1].pos = VGet(xEnd*100,100*rE*sin(-theta),100*rE*cos(-theta));//内側側面、底2
            VertexOuter[i*2].pos = VGet( xStart*100, sin(theta)*RS*100,  cos(theta)*RS*100);//外側側面、底1


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

Name: Ma  ..熟練のプログラマー(41,594ポイント)   Date: 2010/02/01(月) 07:02   No:47474     
Title: Re:アクセス違反の原因が分からない。    
すいません、気のせいでした。(1回うまくいったのになぁ・・・)
↑の修正後もアクセス違反が発生してました。



修正追記
管理人様すいません、パス間違えたみたいなので解決をはずしてもらえませんか? 編集済み


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

Name: Ma  ..熟練のプログラマー(41,722ポイント)   Date: 2010/02/01(月) 09:14   No:47478     
Title: Re:アクセス違反の原因が分からない。    
何度か実験していたところ、アクセス違反が出る条件がようやくわかってきました。(半日使ってしまったorz)
どうやら、一度に作れる個数に制限があるみたいなんです。


つまり、makeNewの第一引数の数と作る角柱の数次第ということでした。

じゃー、newが失敗しているんじゃないかと思って try catch 文で例外をみつけようと思ったんですが
例外処理にひっかからないのでどうも違うみたいです。

自力じゃ見つからないっぽいので、プログラミングの先輩方(みなさん)に頼らせてください(泣


同じ内容の事の話を(複雑な3D図形)のスレに移ってる傾向がありますが、投稿があれば責任もってこちらもしっかりチェックしますのでご了承ください。 編集済み


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



Name: 言語苦手  ..ぴよぴよ(19ポイント)   Date: 2010/01/28(木) 20:27   No:47249       
Title: C++言語を用いたチャットアプリケーションの作成    
Microsoft社 Visual Studio C++のソフトウェアを用いて
チャットアプリケーションを作れと言われたのですが、
当方C言語系がとても苦手で困っています;;

システムの仕様は
・1対1の環境でのみ動作。
・サーバ側はポート番号を指定して、クライアントからの接続を待つ。
・クライアント側はサーバのIPアドレスとポート番号を指定して、サーバに接続する。
・この時の通信はTCPで行う。
・クライアントが通信をやめたい場合は"endc"
・サーバ側がやめたい場合は"ends"と入力。
・WinSockを使用してWindowsのコンソールプログラムとして基本的な簡易なチャット

以上の条件でプログラミングしていただけると幸いです。
よろしくお願いします m__)m


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


Name: MNS  ..プログラマー(30,092ポイント)   Date: 2010/01/28(木) 20:46   No:47252     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
質問の丸投げは禁止されています。
以下テンプレート
・ 自分はどこまで理解しているのか、学校ではどこまで習ったのか明確にしましょう
・ 自分で書いたソースプログラムがあるなら提示しましょう
・ (提示してある場合)自分が書いたソースプログラムはどこからどこまでなのか教えて下さい
詳しくはこの掲示板の使い方をご覧ください→ http://dixq.net/board/board.html


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

Name: たかぎ [URL]  ..ハッカー(157,149ポイント)   Date: 2010/01/28(木) 21:23   No:47258     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
> 以上の条件でプログラミングしていただけると幸いです。 

予算は?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,144,739ポイント)   Date: 2010/01/29(金) 07:53   No:47292     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
まず、どれ位C言語を理解されています?
そしてもしこれが授業なら授業中にsocketとかbindとかという言葉が出てきたのではないかと思います。

まずはgoogleを使ってみましょう。

http://www.google.co.jp/search?hl=ja&q=socket+bind&lr=lang_ja

こうすると色々とひっかかりますよね?
ほとんど答えみたいなサイトもあります。
これを読んだ上で何が解らないかを明確にすると答えやすいと思いますよ。


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

Name: softya  ..ハッカー(109,049ポイント)   Date: 2010/01/29(金) 10:47   No:47296     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
マルチポストですかね?
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1235912687
まず、規約を読んで下さいね。→ http://dixq.net/board/board.html


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

Name: 言語苦手  ..ぴよぴよ(105ポイント)   Date: 2010/01/30(土) 02:17   No:47345     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
切羽詰ってて、丸投げ等申し訳ありませんでした;;
とても反省しています;;

一応ここまで提出するために作ったのですが(あっているのか不明;;)
ヘッダがない状態です。

理解度は初心者です^^;;
起動させたいのですが
上級者様に足りない分を補ってもらえたらとても助かります^^




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

Name: array [URL]  ..熟練のプログラマー(63,066ポイント)   Date: 2010/01/30(土) 03:00   No:47350     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
はじめまして、アレイと申します

> 理解度は初心者です^^;; 
一応初心者にもレベルがありますので、関数は分かるのかポインタくらいは理解できているのかなど
把握できないと、回答者も何から説明していいか分かりません。


ちなみに添付ファイルを読ませていただきましたが、初心者レベルには見えませんでした。

どの辺りまで分かっているので、どの辺りが分からないのか明確にしてもらえれば回答が得られやすいと
思います。


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

Name: 言語苦手  ..ぴよぴよ(163ポイント)   Date: 2010/01/30(土) 03:43   No:47353     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
初歩的なことは大体?分かります^^
関数、ポインタも一応は分かります。

添付ファイルは友達と相談しながらつくったので
正直自分の実力とは言えません;;

ヘッダが分からないといった状態です;;
曖昧でもうしわけありません。。。




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

Name: mnkr  ..入門者(4,026ポイント)   Date: 2010/01/30(土) 09:15   No:47357     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
疑問ですけど。。。
一番最初の書き込みと、
途中で添付されたドキュメントの内容が食い違っているのですけど。。。
片方はVC++で作るように指示された、
もう片方はVC++が使い慣れているから使っていると書いていますけど。。。

>Microsoft社 Visual Studio C++のソフトウェアを用いて 
>チャットアプリケーションを作れと言われたのですが、 
>当方C言語系がとても苦手で困っています;;

><使用したソフトウェア>
>Microsoft社 Visual Studio C++.NET 2003
>上記のソフトウェアを使用した。これはより使い慣れた物で行ったほうがよいと判断したからである。

自分で使用言語を選べるのなら、
>当方C言語系がとても苦手で困っています;; 
と一番最初に書いてある苦手なC言語を使わずに、VBとかの得意な他の言語でも良いのではないでしょうか。

>一応ここまで提出するために作ったのですが(あっているのか不明;;) 
>起動させたいのですが上級者様に足りない分を補ってもらえたらとても助かります^^
VC++2003が使い慣れたもので環境があるのなら何らかの起動は行えそうですけど。。。


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

Name: softya  ..ハッカー(109,902ポイント)   Date: 2010/01/30(土) 11:31   No:47366     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
マルチポストの件が解決していないので、残念ですがお答え出来ません。

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

Name: 言語苦手  ..ぴよぴよ(275ポイント)   Date: 2010/01/30(土) 11:34   No:47368     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
自分で使用言語は選べないです。

>上記のソフトウェアを使用した。これはより使い慣れた物で行ったほうがよいと判断したからである。 
この文に関しては提出用にとりあえず書いたといった感じです^^

実際は大して使い慣れてはいません;;


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

Name: 言語苦手  ..ぴよぴよ(301ポイント)   Date: 2010/01/30(土) 11:42   No:47370     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
マルチポスト申し訳ありませんでした;;
あっちの投稿は消しました^^;


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

Name: dic  ..熟練のプログラマー(49,753ポイント)   Date: 2010/01/30(土) 11:47   No:47371     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
そのペアを組んでる方に相談してみては?

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

Name: softya  ..ハッカー(110,849ポイント)   Date: 2010/01/30(土) 11:55   No:47372     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
>あっちの投稿は消しました^^; 

まぁ、あちらの回答してくれた人に消すのも失礼なんですけどね。
私もお礼を言って閉じて下さいと書くべきでしたね。

とりあえず、整理するとソースコードの大半は、お友達の知識で書かれているって事ですね。
で困っているのは、コンパイルできないって事でしょうか?
添付されてコードは、ワード書かれたドキュメントですよね。これはやり取りするのに困りますので、コードだけ取り出してコンパイル出来るものにして下さい。

出来ること、出来ないこと、今困っていること(コンパイルできないのか、動かないのか、そもそもVC++2003の使い方が分からないのか)を全て書き出して下さい。あと焦っているなら締切も明確に。
それと深夜の回答者は少ないので、回答者の時間帯に合わせることも必要ですよ。


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

Name: 言語苦手  ..ぴよぴよ(457ポイント)   Date: 2010/01/30(土) 15:41   No:47390     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
dicさんへ
ペアが提出ほっぽりだして1ヶ月の海外旅行にいってしまって;;

softyaさん色々ご指摘ありがとうございます。
たしかにお礼言わずに投稿消したのはよくないですね;;
以後気をつけます。

ほぼペアの友人が作成しました。
コンパイルできません;;
VC++2003の扱い方たもかなり曖昧で全然熟知していない状態です・・・

提出は来週の月曜日です。
あと投稿日時の時間帯も以後気をつけます。


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

Name: softya  ..ハッカー(111,496ポイント)   Date: 2010/01/30(土) 16:30   No:47396     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
まず、こちらを読んでコンパイルしてみて下さい。
http://support.microsoft.com/kb/841226/ja
半角文字であるべきところ全角文字に成っている部分が多数ありますので、まずコンパイル前にその修正を行って下さいね。ヘッダは作る必要は無さそうです。


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

Name: バグ  ..ハッカー(184,194ポイント)   Date: 2010/01/30(土) 17:58   No:47399     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
.NETを使える環境なんだから、TcpListenerクラスとかTcpCllentクラスを使えば分かりやすいのに…

※ひょっとしたら、1.0には無かったかもしれませんが…。そうだとしてもSocketクラスはあったはず。


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

Name: 言語苦手  ..ぴよぴよ(505ポイント)   Date: 2010/02/01(月) 03:10   No:47467     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
夜分にすいません;;

コンパイル失敗でした;;
一応最初から打ち直してみたのですが・・・


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

Name: lbfuvab  ..上級者(24,826ポイント)   Date: 2010/02/01(月) 03:33   No:47468     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
ならばどうして失敗したか書くべきでしょう。

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

Name: mnkr  ..入門者(4,292ポイント)   Date: 2010/02/01(月) 07:17   No:47475     
Title: Re:C++言語を用いたチャットアプリケーションの作成    
添付したテキストを確認しました。
softyaさんが指摘している
>半角文字であるべきところ全角文字に成っている部分が多数ありますので、
で全角文字が半角文字になっていない箇所あったので確認してください。

それと「{」「}」の数が一致していないので途中でどちらかが抜けているか余計だと思います。
関数のことが理解できているのでどこをどうしたらよいかはわかるはず。。。
 編集済み


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



Name: チック  ..ぴよぴよ(46ポイント)   Date: 2010/01/31(日) 23:01   No:47451       
Title: DXライブラリで描画時に色を変える    
DXライブラリで描画時に色を変えるみたいなことはできるのでしょうか?
例えばRGBカラーのうち赤い色を強調して表示するなどです。

RGB(0xff,0x00,0x00)などと入れたら画像が真っ赤で表示されるようにしたいです。


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


Name: kazuoni [URL]  ..ハッカー(132,611ポイント)   Date: 2010/01/31(日) 23:17   No:47453     
Title: Re:DXライブラリで描画時に色を変える    
> RGB(0xff,0x00,0x00)などと入れたら画像が真っ赤で表示されるようにしたいです。 

をみる限りだと色の強調とは違う気がします。
では

RGB(0x00,0xff,0x00)

としたら、画面は緑色になればよいのでしょうか?
それならば、関数DrawBoxでいいはずです。

>赤い色を強調して表示する

例えば、青空の写真があってそれを赤強調に、夕焼けの背景みたいにしたい
なんて時は色の強調であってます。キーワードは濃淡変換です。
具体的にはトーンカーブで3値をいじればよいです。
っといってもチックさんが思っているように
RGB(0x00,0xff,0x00)
という風にはやらず、画像上の全ピクセルのRの要素だけ、ある関数をかけてやります。
その結果を代入してやればいわゆる濃淡変換となります。
ある関数というのがトーンカーブです。

詳しくはいろいろググって見てください。
1から学ぶ画像補正
http://osaka.yomiuri.co.jp/digiphoto/syokyu/dps2001052.htm
#暇があったらサンプルつくってみようかなぁ。


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

Name: チック  ..ぴよぴよ(157ポイント)   Date: 2010/01/31(日) 23:36   No:47455     
Title: Re:DXライブラリで描画時に色を変える    
すみません。
質問の仕方が悪かったです><

DrawGraph等で表示する画像を
トーンカーブやグラデーション等はかけずに
べたで赤い画像を表示したいです。

例えばなのですがキャラクターのシルエットなどを
黒く表示したいです。


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

Name: kazuoni [URL]  ..ハッカー(132,692ポイント)   Date: 2010/02/01(月) 00:02   No:47456     
Title: Re:DXライブラリで描画時に色を変える    
あ、そういうことでしたか。

ならば、画像からマスク画像を生成すればよいですね。

つい先日、この掲示板であった質問から作ったプログラムが
ちょうど今回の回答にも使えそうなので、サンプル載せておきます。

が、これは質問者さんの直接の解決方法ではないかもしれません。
というのも、自分のサンプルでは、画像ハンドルを生成してしまいます。
まあ、これ(ハンドル生成)が最善な気がしますが・・・。


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

Name: kazuoni [URL]  ..ハッカー(132,729ポイント)   Date: 2010/02/01(月) 00:09   No:47457     
Title: Re:DXライブラリで描画時に色を変える    
すみません。補足忘れてました。
face2.pngを用意して下さい。
この名前の画像は管理人さんの龍神録プログラミングの館で配布されている
龍神録画像データの中にあります。

スナップショットつけておきます。


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

Name: チック  ..ぴよぴよ(13ポイント)   Date: 2010/02/01(月) 00:33   No:47459     
Title: Re:DXライブラリで描画時に色を変える    
できました><
ありがとうございます。
助かりました。


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



Name: YAMABUKI  ..ぴよぴよ(93ポイント)   Date: 2010/01/31(日) 18:23   No:47441       
Title: 3Dマップのマウスでの移動(スクリーン座標からワールド座標変換)    
現在3DのRPGモノを製作していて、移動にマウスを用いたいと思っています。
そこでスクリーンマウス座標からワールド座標をもとめたいのですが、
どのように行えばいいのかわからず行き詰っています。

参考になるURL、もしくはヒントでもよいので、
解答をいただければうれしいです。

また、使用言語はC++,DirectXです。



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


Name: softya  ..ハッカー(112,145ポイント)   Date: 2010/01/31(日) 18:30   No:47442     
Title: Re:3Dマップのマウスでの移動(スクリーン座標からワールド座標変換)    
これが参考になりますかね。
http://marupeke296.com/DXG_No48_PointGroundInScreen.html


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

Name: YAMABUKI  ..ぴよぴよ(153ポイント)   Date: 2010/01/31(日) 22:28   No:47449     
Title: Re:3Dマップのマウスでの移動(スクリーン座標からワールド座標変換)    
ご返信ありがとうございます。
参考に提示していただいたサイトを呼んでいるのですが、
CalcScreenToWorld関数の引数(float fZ, D3DXMATRIX* View, D3DXMATRIX* Prj)
に何をしていしたらよいかがわからず奮闘しています。


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

Name: softya  ..ハッカー(112,530ポイント)   Date: 2010/01/31(日) 22:52   No:47450     
Title: Re:3Dマップのマウスでの移動(スクリーン座標からワールド座標変換)    
この場合は、CalcScreenToXZ()でXZ平面の座標を出すべきだと思いますので、D3DXMATRIX* View, D3DXMATRIX* Prjだけだと思います。
各々カメラのビュー行列と射影変換行列を渡して下さい。
D3DXMatrixLookAtLHとかD3DXMatrixPerspectiveFovLHとかで作った行列です。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +