C言語何でも質問掲示板


Total hit  今日  昨日  

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

 
   閉じるボタンを押した ....   
     ・[45835] ベリ工 
     ・[45836] tibi 
   画像を動画で読み込む ....   
     ・[45819] DVDM 
     ・[45829] 単発 
   ゲーム画面でキーコン ....   
     ・[45415] SooA 
     ・[45417] Justy 
     ・[45529] クロウ 
     ・[45535] SooA 
     ・[45552] Ma 
     ・[45708] クロウ 
     ・[45712] SooA 
     ・[45812] クロウ 
   ppm   
     ・[45781] mayuta 
     ・[45783] ぽこ 
     ・[45784] mayuta 
     ・[45785] mayuta 
     ・[45809] ぽこ 
   ソースステップ数   
     ・[45571] non 
     ・[45575] たいちう 
     ・[45581] mii 
     ・[45585] たいちう 
     ・[45587] mii 
     ・[45590] non 
     ・[45606] mii 
     ・[45747] mii 
     ・[45750] たいちう 
     ・[45752] mii 
     ・[45753] mii 
     ・[45754] mii 
     ・[45756] mii 
     ・[45757] たいちう 
     ・[45758] mii 
     ・[45759] たいちう 
     ・[45760] mii 
     ・[45786] たいちう 
     ・[45787] mii 
     ・[45788] mii 
     ・[45790] たいちう 
     ・[45791] mii 
     ・[45795] mii 
     ・[45796] たいちう 
     ・[45798] mii 
     ・[45799] mii 
     ・[45801] mii 
     ・[45804] たいちう 
   画像に関してなのでず ....   
     ・[45802] ようすけ 
   ゲームプログラマに必 ....   
     ・[45686] softya 
     ・[45700] dic 
     ・[45710] 山崎 
     ・[45729] たいちう 
     ・[45730] 山崎 
     ・[45737] たかぎ 
     ・[45738] softya 
     ・[45789] 山崎 
   2Dマップについて   
     ・[45768] softya 
     ・[45771] アト 
     ・[45772] softya 
     ・[45774] アト 
     ・[45775] softya 
     ・[45777] アト 
     ・[45779] softya 
     ・[45782] アト 
   無題   
     ・[45678] DVDM 
     ・[45778] 初心者 
   龍神録プログラミング ....   
     ・[45767] softya 
     ・[45776] kms 
   誘導弾の角度制限につ ....   
     ・[45687] nns 
     ・[45761] ジュンヤ 
     ・[45773] Ma 
   C++でLuaの使い方   
     ・[45698] sizuma 
     ・[45713] kai 
     ・[45717] softya 
     ・[45751] Naohiro19 
     ・[45769] kai 
   敵のプログラム   
     ・[45734] SooA 
     ・[45766] 256bit 
   背景を描いてみよう   
     ・[45762] ひよこ 
     ・[45763] デラ初心者 
   ハードが変わるを格段 ....   
     ・[45732] hard 
     ・[45736] Mist 
     ・[45739] softya 
     ・[45740] hard 
     ・[45741] hard 
     ・[45742] hard 
     ・[45743] Mist 
     ・[45744] hard 
     ・[45745] Mist 
     ・[45746] hard 
   無題   
     ・[45725] MNS 
     ・[45726] box 
     ・[45727] かんたべ君 
     ・[45728] MNS 
   13a. 裏画面処理をして ....   
     ・[45666] MNS 
     ・[45669] ナッツ 
     ・[45670] kazuoni 
     ・[45723] ナッツ 
   耐久弾幕を作るには   
     ・[45719] あ〜る 
     ・[45720] SooA 
     ・[45721] yrao 
   ボムについて   
     ・[45693] sizuma 
     ・[45695] Dixq (管理人) 
     ・[45709] いぬ。 
     ・[45718] いぬ。 
   自機の当たり判定を四 ....   
     ・[45683] fatens 
     ・[45690] 光翼型近接支援残酷超初心者 
     ・[45697] fatens 
     ・[45701] Dixq (管理人) 
     ・[45705] dic 
     ・[45706] 光翼型近接支援残酷超初心者 
   ゲームプログラマーに ....   
     ・[45621] shilfia 
     ・[45622] 御津凪 
     ・[45627] softya 
     ・[45628] conio 
     ・[45630] sizuma 
     ・[45631] Justy 
     ・[45636] ようすけ 
     ・[45638] sizuma 
     ・[45644] shilfia 
     ・[45646] softya 
     ・[45649] Justy 
     ・[45651] softya 
     ・[45704] dic 
   おしえてください。   
     ・[45639] ZIKITETRY 
     ・[45641] SooA 
     ・[45643] sizuma 
     ・[45688] ZIKITETRY 
     ・[45691] sizuma 
     ・[45692] SooA 
     ・[45694] sizuma 
     ・[45699] ZIKITETRY 
     ・[45702] sizuma 
   フルスクリーン時の文 ....   
     ・[45673] MNS 
     ・[45674] no 
     ・[45675] MNS 
     ・[45679] no 
     ・[45684] MNS 
   他者の作成したライブ ....   
     ・[45369] no 
     ・[45375] dic 
     ・[45466] たかぎ 
     ・[45671] no 
     ・[45681] SooA 
   フィールドの領域の問 ....   
     ・[45584] fatens 
     ・[45620] 光翼型近接支援残酷超初心者 
     ・[45625] MNS 
     ・[45642] 光翼型近接支援残酷超初心者 
     ・[45659] fatens 
     ・[45680] 光翼型近接支援残酷超初心者 
   どのファイルやフォル ....   
     ・[45656] SooA 
     ・[45660] bb 
     ・[45661] MNS 
     ・[45662] nayo 
     ・[45664] 御津凪 
     ・[45665] bb 
     ・[45677] DVDM 
   3Dでの処理について   
     ・[45408] softya 
     ・[45409] kms 
     ・[45413] softya 
     ・[45418] kms 
     ・[45419] softya 
     ・[45422] kms 
     ・[45447] softya 
     ・[45455] kms 
     ・[45460] softya 
     ・[45470] kms 
     ・[45476] softya 
     ・[45487] kms 
     ・[45494] softya 
     ・[45496] kms 
     ・[45503] softya 
     ・[45513] kms 
     ・[45514] softya 
     ・[45516] kms 
     ・[45518] softya 
     ・[45520] kms 
     ・[45523] softya 
     ・[45525] kms 
     ・[45528] softya 
     ・[45530] kms 
     ・[45532] softya 
     ・[45533] conio 
     ・[45540] kms 
     ・[45547] Ma 
     ・[45554] kms 
     ・[45564] softya 
     ・[45567] Ma 
     ・[45569] kms 
     ・[45572] softya 
     ・[45578] kms 
     ・[45604] softya 
     ・[45608] conio 
     ・[45615] kms 
     ・[45616] softya 
     ・[45617] kms 
     ・[45618] conio 
     ・[45667] Ma 
   13章について   
     ・[45650] wing 
     ・[45652] へたれ 
     ・[45658] wing 
   3Dによるエフェクトに ....   
     ・[45488] Justy 
     ・[45522] ようすけ 
     ・[45531] Justy 
     ・[45534] ようすけ 
     ・[45544] Justy 
     ・[45568] ようすけ 
     ・[45648] Justy 
     ・[45653] ようすけ 
     ・[45654] Justy 
   【雑談】ベターC用のラ ....   
     ・[45596] たかぎ 
     ・[45605] たかぎ 
     ・[45626] sizuma 
     ・[45633] たかぎ 
     ・[45635] たかぎ 
     ・[45640] たかぎ 
     ・[45645] sizuma 
   不注意ならすみません ....   
     ・[45629] sizuma 
     ・[45634] ZIKITETRY 
   エラーコードは何なの ....   
     ・[45441] box 
     ・[45468] たかぎ 
     ・[45469] sizuma 
     ・[45632] ZIKITETRY 
   Direct3D   
     ・[45559] 御津凪 
     ・[45580] 初心者 
     ・[45589] 御津凪 
     ・[45614] 初心者 
   文字列比較に関する質 ....   
     ・[45591] MNS 
     ・[45595] non 
     ・[45612] 冬 
     ・[45613] 冬 
   また復習しててわから ....   
     ・[45598] non 
     ・[45599] non 
     ・[45600] sizuma 
     ・[45601] MNS 
     ・[45602] たかぎ 
     ・[45609] さかまき 
     ・[45611] たかぎ 
   XAudio2のマスターボイ ....   
     ・[45561] 御津凪 
     ・[45570] miya 
     ・[45573] 御津凪 
     ・[45574] miya 
     ・[45577] 御津凪 
     ・[45583] miya 
     ・[45592] 御津凪 
     ・[45603] miya 
     ・[45607] 御津凪 
     ・[45610] miya 
   C言語の数字の出現回数 ....   
     ・[45556] さかまき 
     ・[45560] たかぎ 
     ・[45597] tovira 
   コンストラクタとデス ....   
     ・[45548] たかぎ 
     ・[45563] miya 
     ・[45576] qwerty 
     ・[45579] たかぎ 
     ・[45586] miya 
   SoundとSeについて   
     ・[45566] バグ 
     ・[45582] wing 
   最初の関数について   
     ・[45356] sizuma 
     ・[45366] Naohiro19 
     ・[45463] ICE 
     ・[45465] たかぎ 
     ・[45471] たかぎ 
     ・[45492] dic 
     ・[45493] softya 
     ・[45495] sizuma 
     ・[45502] たかぎ 
     ・[45524] dic 
     ・[45526] dic 
     ・[45527] sizuma 
     ・[45562] dic 
   無題   
     ・[45501] たかぎ 
     ・[45505] 上杉謙信 
     ・[45507] たかぎ 
     ・[45511] 上杉謙信 
     ・[45553] Dixq (管理人) 
   8章のinput_pad_or_ke ....   
     ・[45485] kazuoni 
     ・[45551] banba 
   ホーミング弾について   
     ・[45517] Justy 
     ・[45521] ft 
     ・[45539] Justy 
     ・[45541] ft 
     ・[45546] Justy 
     ・[45550] ft 

Name: tibi  ..ぴよぴよ(648ポイント)   Date: 2010/01/09(土) 16:55   No:45834       
Title: 閉じるボタンを押したときにデバッグが終わらない    
お世話になります
C++の質問です。
WindowsXP
Visual C++ 2008 Express Edithionを使っています。

現在シューティングゲームを作っています。
画像の読み込みと破棄、音楽の再生と停止、クラスの生成と破棄はそれぞれコンストラクタとデストラクタで行っているのですが、ウィンドウの閉じるボタンを押して終了したときにデバッグが終わらず、
ウィンドウを閉じた後も音楽を再生しては停止、再生しては停止…を繰り返してしまいます。
その場合タスクマネージャからプロセスを終了させないと止まりません。

クラスの流れ
Main ─ Game ┬ Menu
             └ Shooting ┬ MyShip
                         ├ Enemy
                         └ 以下略 



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow)
{
    Game game;
    if(DxLib_Init() == -1) return -1;  //ここでウィンドウサイズ(640,480)、裏画面描画、ログ出力の有無の設定を行う。
    SetDrawScreen(DX_SCREEN_BACK);
    game.Run();
    DxLib_End();
    return 0;
}


void Game::Run() {
    menu = new Menu(FPS);
    while(menu->Select() != 0) {  // メニュー画面
        RunStg();
    }
    //RunStg();
    delete menu;
    menu = NULL;
}

void Game::RunStg() {
    stg = new Shooting(FPS);
    stg->Run();  //シューティングの処理へ
    delete stg;
    stg = NULL;
}



参考
Shooting::Shooting(double fps) {
    WaitTime = (int)(1000/fps);
    PlayMusic("./music/sorato.mid", DX_PLAYTYPE_LOOP);
    FrameCount = 0;
    ship = new MyShip;
    shot = new Shot;
    enm = new Enemy;
    blt = new Bullet;
    scene = new Scene;
}

Shooting::~Shooting() {
    StopMusic();
    if(ship != NULL) {
        delete ship;
        ship = NULL;
    }
    if(shot != NULL) {
        delete shot;
        shot = NULL;
    }
    if(enm != NULL) {
        delete enm;
        enm = NULL;
    }
    if(blt != NULL) {
        delete blt;
        blt = NULL;
    }
    if(scene != NULL) {
        delete scene;
        scene = NULL;
    }
}
てっきりウィンドウの閉じるボタンを押した場合もデストラクタは呼び出されると思ってこのように 書いていたのですが、これだとマズいのでしょうか? 少し前の段階で
void Game::Run() {
    menu = new Menu(FPS);
    RunStg();
    delete menu;
    menu = NULL;
}

このようにメニュー用のループを入れていない時は普通に終了していました。

すみません、ソースが断片的過ぎるかとは思いますがこの辺りから推測できる
問題点はありますでしょうか。
それと、閉じるボタンを押された場合は特別な解放処理がなんかが必要なんでしょうか。

追記:
出力ウィンドウには
スレッド 'Win32 スレッド' (0x1f8) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました
スレッド 'Win32 スレッド' (0xbc0) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました
スレッド 'Win32 スレッド' (0x5e4) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました
スレッド 'Win32 スレッド' (0xbac) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました
スレッド 'Win32 スレッド' (0xa0c) はコード 0 (0x0) で終了しました。
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' をアンロード
'Snow 0.02.exe': 'C:\WINDOWS\system32\mciseq.dll' を読み込みました

このような出力が繰り返されます。 編集済み


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


Name: ベリ工  ..かけだし(2,438ポイント)   Date: 2010/01/09(土) 18:03   No:45835     
Title: Re:閉じるボタンを押したときにデバッグが終わらない    
作りがまずいですね。
特に

>while(menu->Select() != 0) {  // メニュー画面
>    RunStg();
>}

のあたりが。OSからのメッセージを処理しないと
×ボタンで終了してもこのループはどうやって
"×ボタンから終了された"の判断を行うのでしょうか?

ここを参考にされるとよろしいかと。
http://dixq.net/rp/2.html

どうしても今の作りを変えたくないのであれば
×ボタンから終了できないように制御し、
必ずゲームのメインメニュー??の終了から行えるように
するとか・・・。


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

Name: tibi  ..ぴよぴよ(888ポイント)   Date: 2010/01/09(土) 18:27   No:45836 解決!     
Title: Re:閉じるボタンを押したときにデバッグが終わらない    
ベリ工さん、ありがとうございます!
試しに
void Game::Run() {
    menu = new Menu(FPS);
    while(menu->Select() != 0) {
        if(RunStg() == -1) break;  //中の処理でProcessMessage() == -1が返ってきた場合は戻り値で伝える
    }
    delete menu;
    menu = NULL;
}

にしたら直りました。
下の階層でProcessMessage() == -1 が返されたとき時に呼び出し元に伝えていなかったんですね。
もう一度見直してみます。ありがとうございましたm(_ _)m 編集済み


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



Name: 単発  ..ぴよぴよ(11ポイント)   Date: 2010/01/08(金) 19:03   No:45805       
Title: 画像を動画で読み込むには    
画像を動画で読み込める(int型にデータを渡すことが出来る)らしいのですが、C言語で可能なのでしょうか?
アクションゲーム等を作る時、一枚ずつ使って動かすのはすごい面倒だと思うんです。
環境はBCCDeveloper+DXライブラリです。


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


Name: DVDM [URL]  ..熟練のプログラマー(48,901ポイント)   Date: 2010/01/09(土) 02:09   No:45819     
Title: Re:画像を動画で読み込むには    
>>単発さん
>画像を動画で読み込める・・・
画像を動画で読み込むというのが良く解らないのですが、
お作りになった動画を再生するというのであれば可能です。

一応、動画を再生するという前提でこちらのページを紹介しておきます。
下記のリンク先、DxLibリファレンスページにあります、「動画関係関数」を見てみるといいと思います。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html


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

Name: 単発  ..ぴよぴよ(100ポイント)   Date: 2010/01/09(土) 13:06   No:45829 解決!     
Title: Re:画像を動画で読み込むには    
ありがとうございます。よく分かりました。

言い方が紛らわしくてすいません。普通に動画をint型に渡す方法を聞いてました。
正確に言うと、何枚もの画像を動画として読み込む的な意味合いです。


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



Name: クロウ  ..中級者(13,173ポイント)   Date: 2010/01/02(土) 23:03   No:45406       
Title: ゲーム画面でキーコンフィグを行う方法    
久しぶりの投稿になります。

制作中のゲームで、龍神録プログラミングの館の第8章を参考にキーコンフィグを実装中ですが、
コントローラから直接入力を受け取って、キーコンフィグを行うところで見通しが立たなくなっている状態です。

今現在はソース中で書いていたボタン割り当てを外部ファイル化して割り当てることで、コンフィグを行うということで妥協していますが、やはりゲームのオプション画面等からコントローラの入力でのコンフィグを行いたいので、アドバイスをお願いします。

----コンフィグ部分のソースは第8章とほとんど同じとなっております。-----


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


Name: SooA [URL]  ..上級者(22,475ポイント)   Date: 2010/01/03(日) 00:33   No:45415     
Title: Re:ゲーム画面でキーコンフィグを行う方法    
>見通しが立たなくなっている
パッドでの入力がうまく取得できないという事でしょうか?

例えば設定画面で[Shotボタン]が選択中であれば、
1.龍神禄側のパッド入力判定を止める。
2.GetJoypadInputState()でパッド入力を監視
3.何かボタンが押されたら、そのボタン番号を
 龍神禄のキーコンフィグのShotボタンに割り当て直す。
4.龍神禄側のパッド入力判定を再開。

大まかな流れはこんな感じになると思います。


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

Name: Justy  ..伝説なるハッカー(490,394ポイント)   Date: 2010/01/03(日) 00:50   No:45417     
Title: Re:ゲーム画面でキーコンフィグを行う方法    
 何で詰まっているのかあまりよくわからないのですが。

> ボタン割り当てを外部ファイル化して割り当てることで

 これが出来てるんでしたら、ボタンの割り当てパターンを何種類か用意して
ユーザーに選択させれば楽じゃないでしょうか。


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

Name: クロウ  ..中級者(13,049ポイント)   Date: 2010/01/04(月) 22:38   No:45529     
Title: Re:ゲーム画面でキーコンフィグを行う方法    
上手く伝えられなくて申し訳ありませんが、具体的にやりたい事としては、四聖龍神録Plusのconfig画面のようなことをやりたいと思っています。

SooAさんのおっしゃっているような流れはうっすらと想像できているのですが、それをどう実装するかという事で悩んでいるところです。


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

Name: SooA [URL]  ..上級者(22,491ポイント)   Date: 2010/01/04(月) 23:31   No:45535     
Title: Re:ゲーム画面でキーコンフィグを行う方法    
メニュー画面の作り方が分からないとかですか?


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

Name: Ma  ..プログラマー(26,881ポイント)   Date: 2010/01/05(火) 07:02   No:45552     
Title: Re:ゲーム画面でキーコンフィグを行う方法    
昔作ったやつをそのままこぴぺしちゃいますので参考までに。
余分なところは切り取りました。
無駄があるかもしれませんが、ご了承ください。
基本的に、キーコンフィグ用のクラスを作りました。


//==ここからヘッダファイル


//キー 数字でやるより、分かりやすくなる。
#define KEY_SHOT    0
#define KEY_LEFT    1
#define KEY_UP        2
#define KEY_RIGHT    3
#define KEY_DOWN    4
#define KEY_SUB        5
#define KEY_BOMB    6
#define KEY_SLOW    7
#define KEY_STOP    8


#define CONFIG_NONE -1    //configNow に使用。現在コンフィグするためにキー待ちしている状態ではないという意味。


//クラス typeInfo 

class typeInfo {

    // キーや、パッドボタンは↓のConfig配列によって変更可とする。中身の値はdxLibに使われる KEY_**** とかの値と一致。
    int keyConfig[9];
    int padConfig[9];
public:
    int configNow;    //現在何をコンフィグしているかを記録。↑の0から8という値を保存。
    void keyConfigUpdate(typeInfo*);//コンフィグしている間は毎フレーム呼び出す。
    string whatKeyIsThis(int);//KEY_**** などの値から、キーの名前をstring で返します。string は std::string です。すでに、include したとします。
    //ここにいろいろあったけど・・・・・・その他のメンバー関数と、メンバー変数は略します
}


//==ここからソースファイル
//引数 typeInfo* otherType プレイヤー2のキーコンフィグ情報。

void typeInfo::keyConfigUpdate(typeInfo* otherType){
    if(configNow == CONFIG_NONE)
        return;


    char Buf[ 256 ] ;
    GetHitKeyStateAll( Buf ) ;

    int n = 0;
     while(n < 256){//すべてのキー
         if(Buf[n] == 1){    //nキーの入力があるなら
            if(strcmp(whatKeyIsThis(n).c_str(),"エラー") == 0){//たまに対応していないキーがあるので。
                configNow = CONFIG_NONE;
                //ここにエラーメッセージの処理をいれてください。
                return;
            }


            //以下のfor文で、キーの重複を避けます。
            //他のキーに使っているキー番号なのに、それに設定してしまってはひとつのキーでふたつのアクションを取ってしまう。
            //例:↑キーと⇒キーの両方が同じコンフィグだったら困る。これはそれを回避する。
            for(int i = 0; i < 9;i++){//すべてのコンフィグをチェック。
                
                 if(keyConfig[i] == n && i != configNow){//入力したキー(n)が、コンフィグのi番目で設定したキーと等しく、さらに i == configNow が true のときは、スキップする。                    
                    keyConfig[i] = keyConfig[configNow];//重複したキー(もともと設定してあった方)を、現在コンフィグしようとしていたものにする。
                    keyConfig[configNow] = n;//現在コンフィグしようとしていた方に、nキーが重複しないようになったのでnキーを割り当てる。
                    
                    configNow = CONFIG_NONE;//コンフィグモード終わりを記録する。
                    return;
                }

            }

            for(int i = 0; i < 9;i++){//すべてのコンフィグをチェック。
                 if(otherType->keyConfig[i] == n){//このnキーが、プレイヤー2のコンフィグのi番目で設定したキーと重複してしまった場合。                    
                    otherType->keyConfig[i] = keyConfig[configNow];
                    keyConfig[configNow] = n;


                    
                    configNow = CONFIG_NONE;//コンフィグモード終わり。
                    while(Buf[n] != 0){//現在コンフィグしたキーが離されるまでループ。
                        GetHitKeyStateAll( Buf );
                        ProcessMessage();
                    }
                    return;
                }
            }


            
            //押したキーは問題ない(重複やエラーがない)場合のみここまでくる。。
            keyConfig[configNow] = n;//キーセット。
            
            
            configNow = CONFIG_NONE;//コンフィグモード終わり。
            return;
        }
        n++;
    }
}


(pre タグ入れ忘れて編集しましたw) 編集済み


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

Name: クロウ  ..中級者(13,137ポイント)   Date: 2010/01/06(水) 22:28   No:45708     
Title: Re:ゲーム画面でキーコンフィグを行う方法    
返事が遅れてすみません。。。

SooAさん>
メニュー画面ではなく、1〜4の実装で悩んでいるという事です。
「こういう風にやればできるんだろうな・・・」とまでは分かっていても実際にプログラム上で組むことが出来ない状況です。

MAさん>
参考にさせていただきます。
とりあえず、ソースを参考にもう少し考えてみます。


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

Name: SooA [URL]  ..上級者(23,441ポイント)   Date: 2010/01/06(水) 23:08   No:45712     
Title: Re:ゲーム画面でキーコンフィグを行う方法    
参考になるかどうか分かりませんがサンプルです。
 編集済み


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

Name: クロウ  ..中級者(13,206ポイント)   Date: 2010/01/08(金) 22:25   No:45812 解決!     
Title: Re:ゲーム画面でキーコンフィグを行う方法    
SooAさん>
サンプルを見させていただきましたが、こんなことをやりたかったわけです。
他には対応するボタンが被った場合やコンフィグデータの保存等、ありますがこの辺りは自力でできそうです。
ありがとうございました!


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



Name: mayuta  ..ぴよぴよ(264ポイント)   Date: 2010/01/08(金) 00:56   No:45780       
Title: ppm    
今、北海道の工業系の大学に通っているものです。Cのプログラミングをして1年の初心者です。
現在、C++でマンデルブロを描画するためにPPMを使って描画しようとしているのですが、PPM画像用のヘッダにエラーが出ます。

ppb_ppm.h(35) : error C2514: 'real_ppm::stat' : クラスにコンストラクタが定義されていません。
ppb_ppm.h(30) : 'real_ppm::stat' の宣言を確認してください。
ppb_ppm.h(36) : error C2228: '.st_size' の左側はクラス、構造体、共用体でなければなりません。
型は 'real_ppm::stat *' です。
代わりに '->' を使用しますか?

どこを直したらエラーがなくなるでしょうか。皆さんのお力を貸してください。
実行環境は、microsoft windows xp sp3、microsoft visual C++ 2008 express editionです。

以下にPPMのヘッダを書きます。




/* ppm.h */
#ifndef _PPB_PPM_H
#define _PPB_PPM_H

#define PPM_MAGIC "P6"



typedef struct _rgb_t{
    unsigned char r;
    unsigned char g;
    unsigned char b;
} rgb_t;

typedef struct _image_t{
    int width;
    int height;
    rgb_t *buf;
} image_t;



int real_ppm(image_t* img,char* fname){
    char *token, *pc;
    char *buf;
    char *del=" \t\n";

    int filesize;
    int i,w,h,luma,pixs;

    struct stat *st;

    rgb_t *dot;
    FILE *fp;

    stat(fname,&st);
    filesize=(int)st.st_size;

    buf=(char *)malloc(filesize*sizeof(char));

    if((fp=fopen(fname, "r"))==NULL){
        printf("Failed to open file\n");
        return -1;
    }

    fseek(fp,0,SEEK_SET);
    fread(buf,filesize * sizeof(char),1,fp);

    fclose(fp);

    token=(char *)strtok(buf,del);
    if(strncmp(token,PPM_MAGIC,2) !=0){
        return -1;
    }

    token=(char *)strtok(NULL,del);

    if(token[0]=='#'){
        token=(char *)strtok(NULL,"\n");
        token=(char *)strtok(NULL,del);
    }

    w=strtoul(token,&pc,10);
    token=(char *)strtok(NULL,del);
    h=strtoul(token,&pc,10);
    token=(char *)strtok(NULL,del);
    luma=strtoul(token,&pc,10);

    token=pc+1;

    pixs=w*h;


    img->buf=(rgb_t *)malloc(pixs * sizeof(rgb_t));


    dot=img->buf;
    for(i=0;i<pixs;i++,dot++){
        dot->r=*token++;
        dot->g=*token++;
        dot->b=*token++;
    }

    img->width=w;
    img->height=h;
    return 0;
}


int write_ppm(image_t* img, char* fname){
    int i,j;
    int w=img->width;
    int h=img->height;

    FILE *fp;
    if((fp=fopen(fname,"wb+"))==NULL){
        fprintf(stderr,"failed to open file %s\n",fname);
        return -1;
    }


    fprintf(fp,"%s\n%d %d\n255\n",PPM_MAGIC,w,h);


    for(i=0;i<w;i++){
        for(j=0;j<h;j++){
            putc((int)img->buf[i*w+j].r,fp);
            putc((int)img->buf[i*w+j].g,fp);
            putc((int)img->buf[i*w+j].b,fp);
        }
    }
    fclose(fp);
    return 0;
}


void new_image(image_t* img,int w, int h){
    img->width=w;
    img->height=h;
    img->buf=(rgb_t*)malloc(w*h*sizeof(rgb_t));
}


void delete_image(image_t *img){
    free(img->buf);
}

#endif








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


Name: mayuta  ..ぴよぴよ(287ポイント)   Date: 2010/01/08(金) 00:59   No:45781     
Title: Re:ppm    
すみません。タグを使わないで投稿してしまいました、見づらくて申し訳ございません。。。。

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

Name: ぽこ  ..入門者(3,429ポイント)   Date: 2010/01/08(金) 01:44   No:45783     
Title: Re:ppm    

上記コードでは手元でコンパイルできないので、確認はしていません。

struct stat *st; → struct stat st;
stat(fname,&st); → ::stat(fname,&st);

でどうですか?


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

Name: mayuta  ..ぴよぴよ(511ポイント)   Date: 2010/01/08(金) 01:59   No:45784     
Title: Re:ppm    
実行してみたのですが、

ppb_ppm.h(30) : error C2079: 'st' が 未定義の struct 'real_ppm::stat' で使用しています。
ppb_ppm.h(35) : error C2039: 'stat' : '`global namespace'' のメンバではありません。

という、エラーが増えてしまいました。。


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

Name: mayuta  ..かけだし(2,069ポイント)   Date: 2010/01/08(金) 02:25   No:45785     
Title: Re:ppm    
マンデルブロのコードは、


/* mandel */

#include<stdio.h>
#include<stdlib.h>
#include "stdbool.h"
#include<limits.h>
#include "pthread.h"
#include <string.h>
#include "ppb_ppm.h"

#define THREAD_NUM    2
#define STEP_HEIGHT   10
#define JOB_NUM       (IMG_HEIGHT/STEP_HEIGHT)

#define OUTPUT        "out.ppm"
#define IMG_WIDTH     400
#define IMG_HEIGHT    400

#define COUNT_MAX     0xfff
#define REAL_MIN      -1.5
#define REAL_MAX      1.5
#define IMAG_MIN      -1.5
#define IMAG_MAX      1.5
#define SCALE_REAL    ((REAL_MAX - REAL_MIN) / IMG_WIDTH)
#define SCALE_IMAG    ((IMAG_MAX - IMAG_MIN) / IMG_HEIGHT)


typedef struct _complex{
    
float real;
    
float imag;
} complex_t; typedef struct _thread_arg{     
int id;
    
image_t *img;
} thread_arg_t; typedef struct _job{     
int x, y, w, h;
} job_t; job_t mandel_jobs[JOB_NUM]; pthread_mutex_t job_mutex; int job_index; void init_jobs(){     
int i;
    
for(i=0;i<JOB_NUM;i++){
        
mandel_jobs[i].x=0;
        
mandel_jobs[i].y=(IMG_HEIGHT/JOB_NUM)*i;
        
mandel_jobs[i].w=IMG_WIDTH;
        
mandel_jobs[i].h=STEP_HEIGHT;
    
}
    
pthread_mutex_init(&job_mutex,NULL);
    
job_index=0;
} job_t *get_next_job(){     
int index;
    
pthread_mutex_lock(&job_mutex);
    
if(job_index+1==JOB_NUM){
        
pthread_mutex_unlock(&job_mutex);
        
return NULL;
    
}
    
index=job_index++;
    
pthread_mutex_unlock(&job_mutex);
    
return &mandel_jobs[index];
} void plot_point(rgb_t* buf,unsigned int color){     
buf->r=(color&(0xf)<<8)>>4;
    
buf->g=(color&(0xf)<<4);
    
buf->b=(color&0xf)<<4;
} unsigned int calc_point(complex_t c){     
unsigned int count=0;
    
float temp, length_sq;
    
complex_t z;
    
z.real=z.imag=0.0f;
    
do{
        
temp=z.real*z.real-z.imag*z.imag+c.real;
        
z.imag=2*z.real*z.imag+c.imag;
        
z.real=temp;
        
length_sq=z.real*z.real+z.imag*z.imag;
        
count++;
    
} while ((length_sq<4.0)&&(count<COUNT_MAX));
    
return count;
} void plot_mandelbrot(image_t *img,int sx, int sy, int w, int h){     
complex_t c;
    
int x,y;
    
for(x=sx;x<sx+w;x++){
        
for(y=sy;y<sy+h;y++){
        
c.real = REAL_MIN + ((float)x * SCALE_REAL);
        
c.imag = IMAG_MIN + ((float)y * SCALE_IMAG);
    
plot_point(&img->buf[y * IMG_WIDTH + x], calc_point(c));
        
}
    
}
} void thread_func(void *arg){     
thread_arg_t *targ=(thread_arg_t *)arg;
    
job_t *job;
    
while ((job=get_next_job()) !=NULL)
        
plot_mandelbrot(targ->img,job->x,job->y,job->w,job->h);
} int main(){     
int i;
    
image_t img;
    
pthread_t handle[THREAD_NUM];
    
thread_arg_t targ[THREAD_NUM];
    
new_image(&img,IMG_WIDTH,IMG_HEIGHT);
         
init_jobs();
    
for(i=0;i<THREAD_NUM;i++){
        
targ[i].id=i;
        
targ[i].img=&img;
pthread_create(&handle[i],NULL,(void *(__cdecl *)(void *))thread_func,(void *)&targ[i]);
    
}
    
for(i=0;i<THREAD_NUM;i++)
        
pthread_join(handle[i],NULL);
    
write_ppm(&img,OUTPUT);
    
delete_image(&img);
    
return 0;

}

です。


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

Name: ぽこ  ..入門者(3,521ポイント)   Date: 2010/01/08(金) 21:17   No:45809     
Title: Re:ppm    
> 実行してみたのですが、

> ppb_ppm.h(30) : error C2079: 'st' が 未定義の struct 'real_ppm::stat' で使用しています。
> ppb_ppm.h(35) : error C2039: 'stat' : '`global namespace'' のメンバではありません。

> という、エラーが増えてしまいました。。

構造体struct statが定義されているヘッダファイルをインクルードしてください。
同様に、関数statが定義されているヘッダファイルをインクルードしてください。


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



Name: mii  ..中級者(14,490ポイント)   Date: 2010/01/05(火) 10:02   No:45558       
Title: ソースステップ数    
あけましておめでとうございます。
今だにやってました(汗

締切が金曜なので取りあえず今週の木曜を目標にやりたいと思います。

仕様としましては以下になります。

各ファイルごとにステップ数を算出し、結果を表示する(結果例参照)。
算出するステップ数は、以下のとおりである。

1.総ステップ数 (すべての行数)
2.実ステップ数 (コメント行および空白行を除いた行数)
3.ロジックステップ数 (実ステップ数のうち、プリプロセッサ行・
   中カッコのみの行を除いたステップ数)
という風になっています。

総ステップはEOFまでの行です。EOFだけの場合は総ステップに含めず、何か1文字でもあれば総ステップとします。

実ステップはコメントと空白行を除いた数になります。今回はコメント行と空白行を一緒にカウントして総ステップから
引くことで実ステップを算出するようにしています。コメントについてはネスト有りの場合でも正確にカウントできるように
しなければなりません。

ロジックステップのプリプロセッサ行はシャープが来たらカウントするようにします。
中カッコのみの行は}}など2個続いても中カッコだけならカウントします(中カッコ以外にスペース以外の文字があった場合はカウントしない)

後は、コンパイルが通るファイルというのが条件のようです。
たとえば
int a;
とあれば本来int main(void) {}
の中に書かれなけばいけないですが、それが書かれていると見なして上記テストファイルのようにint a;だけでカウント出来るようにしなければなりません。

ただ例として##defineなどはコンパイル不可なので動きは不定で構わないことなります。

過去ログになってしまいましたのでもう一度立ててしまいました。すみません(汗
分からない部分がありましたら質問させていただきますのでよろしくお願いいたします。


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


Name: non  ..比類無きプログラマー(85,837ポイント)   Date: 2010/01/05(火) 11:43   No:45571     
Title: Re:ソースステップ数    
>コメントについてはネスト有りの場合でも正確にカウントできるようにしなければなりません。

やっぱり、そうきたか。
すると、文字列リテラルの中も考えなきゃいけないね。こりゃ大変だ。
最初の頃のツーパスで操作する方法の方がわかりやすくていいかもね。


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

Name: たいちう  ..熟練のプログラマー(42,860ポイント)   Date: 2010/01/05(火) 12:43   No:45575     
Title: Re:ソースステップ数    
お疲れ様です。今は質問は無いのね。
質問する場合は、前スレで指摘したように、
このスレで完結した質問になるように注意してください。
さらに、前スレやその前のすれへのリンクも張ってくれるとベターです。


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

Name: mii  ..中級者(14,645ポイント)   Date: 2010/01/05(火) 13:43   No:45581     
Title: Re:ソースステップ数    
前のスレがこちらです
その前のスレがこちらです

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

>nonさん
何かどんどん訳わからん状態に。。。
取りあえず完璧は無理なので教授を欺けるくらにはしたいですw

>たいちうさん
>今は質問は無いのね。
ありすぎるのでもう少し絞りたいと思いまして(泣

ご指摘ありがとうございました。 編集済み


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

Name: たいちう  ..熟練のプログラマー(43,149ポイント)   Date: 2010/01/05(火) 14:38   No:45585     
Title: Re:ソースステップ数    
> ありすぎるのでもう少し絞りたいと思いまして(泣

割と面倒なのが、テストデータの作成です。
前スレで、test1.c〜test4.cがあったと思いますが、
もしかしてtest1〜20位までが用意されているのでしょうか?
私が問題を出す立場ならば、採点用に必ず用意しますし、
場合によっては出題時に配布します。
また、私が仕事で作るならば必ずテストファーストで作ります。

あるなら、その分楽ができますし、
無いのならば、自分で作るのが近道でしょう。

現在、test1〜4までが正しくカウントできるならば、
test5をカウントできるようにするのが次の目標です。
難しいテストデータはとりあえず飛ばしても良いですが、
今まで正しくカウントできたデータについては、
成績を下げないことが肝心です。

行き詰ってしまい最初から作り直し、という事もあるでしょう。
上級者はある程度先の見通しを立ててから作り始めることができますし、
上手にリファクタリングをすることもできます。
この課題を通して勉強中なのだから、作り直すことを覚悟しないと、
一歩も進めなくなります。

今、どのような状態なのかわかりませんが、
前スレからあまり変わっていないのならば、
nonさんの書くようにツーパスにしたり、
前スレで私が書いたソースを元にしたりする方が良いかもしれません。


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

Name: mii  ..中級者(14,799ポイント)   Date: 2010/01/05(火) 14:42   No:45587     
Title: Re:ソースステップ数    
>nonさんの書くようにツーパスにしたり
ツーパスというのはどういった処理なのでしょうか?
調べたのですがわからなかったです。。。orz

>前スレで私が書いたソースを元に
取りあえず今たいちうさんのソースを元にやっています。


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

Name: non  ..比類無きプログラマー(86,235ポイント)   Date: 2010/01/05(火) 15:23   No:45590     
Title: Re:ソースステップ数    
A 1度目のファイル読み込みで
総行数のみを数える。他のことは何もしない。

B 同じファイルを再度読み込み、コメントと空白行を削除して、別名1でファイルに
書き込む。ここで、完全にコメントが削除できたかチェックできる。

C 別名1で保存したファイルを読み込み、プリプロセッサを削除したファイルをさらに
別名2で保存する。

D さらに別名2のファイルを読み込み、括弧のみ行を削除し、ファイルに保存する。

このように、何度もファイルを読み込みながら条件を絞ります。
いろんな処理が一度に出てこないので、わかりやすいプログラムになります。
AとBを一度に、CとDを一度に行うと、ファイルを読み込むのが2度で済みます。
このように中間ファイルを出力して処理を行うコンパイラがツーパスコンパイラです。
なお、一度で行うのがワンパスコンパイラといいます。








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

Name: mii  ..中級者(14,880ポイント)   Date: 2010/01/05(火) 16:28   No:45606     
Title: Re:ソースステップ数    
なるほど。。。
初めて知りました!いろいろ勉強になります。

以前nonさんに教えていただいた方法がツーパスなんですね。
木曜日までって考えると自分には早いですね。

仕事の納期を考えるといかに大変か思い知らされました。






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

Name: mii  ..上級者(15,061ポイント)   Date: 2010/01/07(木) 11:16   No:45747     
Title: Re:ソースステップ数    
本コードとは関係ないのですが、
#define DEBUG
#ifdef DEBUG
    #define D(x) (x)
#else
    #define D(x)
#endif


となっていて例えば
D(printf("表示"));
という文がある場合

#define DEBUGが定義されていれば
表示という文字が出力されると思うのですが、
なぜ#ifdefの文の下が#define D(x)ではいけないのでしょうか?

D(printf("表示"));というのが引数になると思ったのですが、
なぜ#define D(x) (x)と引数が2つ必要なのでしょうか?


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

Name: たいちう  ..熟練のプログラマー(43,624ポイント)   Date: 2010/01/07(木) 12:24   No:45750     
Title: Re:ソースステップ数    
プリプロセス時と実行時の2つの段階を混同しているようです。

ソースコードをコンパイルすると実行ファイルができます。
printfが実際に出力するのは、もちろん実行時です。
そしてマクロが動作するのは、コンパイルの前段階のプリプロセス時です。

#define A B
と書かれていた場合、ソースコード中のAを、
文法を無視してBに置換してから、コンパイルが行われます。
#define N 100
と書かれているのを見たことがあると思いますが、
コンパイル前に機械的にNが100に置き換わっています。

for (i = 0; i < N; i++)

for (i = 0; i < 100; i++)

#define D(X) (X)
この場合は、ソースコード中のD(X)を(X)に置換します。
先の例と違い、Xは任意の文字列です。

D(printf("表示"));

(printf("表示"));

出力したくない場合は、次のようにdefineされ、

#define D(X)

D(printf("表示"));

;

という置換がされるので、これをコンパイルして作られた実行ファイルは
何も出力しません。


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

Name: mii  ..上級者(15,091ポイント)   Date: 2010/01/07(木) 14:38   No:45752     
Title: Re:ソースステップ数    
大変分かりやすかったです!
たいちうさんありがとうございました。


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

Name: mii  ..上級者(15,204ポイント)   Date: 2010/01/07(木) 16:04   No:45753     
Title: Re:ソースステップ数    
今テスト中でして以下ファイルの際に問題があったのでご教授お願いします。
int i;/***//**//*
    int bb;
int *k;

総ステップ3、実ステップ1、処理ステップ1になる予定ですが
総ステップ3、実ステップ3、処理ステップ3になってしまいます。

一体どの部分が悪いのでしょうか?



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

Name: mii  ..上級者(15,244ポイント)   Date: 2010/01/07(木) 16:20   No:45754     
Title: Re:ソースステップ数    
case2のif文以下にcontinue文を入れることで対応出来ました。
お騒がせしてすみません。


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

Name: mii  ..上級者(15,299ポイント)   Date: 2010/01/07(木) 16:52   No:45756     
Title: Re:ソースステップ数    
連レスすみません。

(3 + 2) 
/ //
5
/*/*//*/*/12


このテストの場合
総ステップ4、実行ステップ3、処理ステップ3となってしまいます。

これは行中にコメントと空白を除き'/'だけの場合スペースフラグが0のままのため
空白又はコメント行とみなされ上手くカウントされません。

これはどうやってなおしたらよいでしょうか?


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

Name: たいちう  ..熟練のプログラマー(43,677ポイント)   Date: 2010/01/07(木) 16:55   No:45757     
Title: Re:ソースステップ数    
コメントが閉じていないから、未定義ですよね。
3行目の最後に */ を追加したところ、
以前私が書いたプログラムだと、無事3 1 1になりました。


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

Name: mii  ..上級者(15,378ポイント)   Date: 2010/01/07(木) 17:21   No:45758     
Title: Re:ソースステップ数    
わかりにくくてすみません。
(3 + 2) 
/ //
5
/*/*//*/*/12

この3行目の最初のスラッシュは四則演算の÷の意味で使っていまして、
コメントとみなすわけではないです。

サンプルが曖昧ですね。。。申し訳ありません。


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

Name: たいちう  ..熟練のプログラマー(43,767ポイント)   Date: 2010/01/07(木) 17:38   No:45759     
Title: Re:ソースステップ数    
> この3行目の最初のスラッシュは四則演算の÷の意味で使っていまして、
> コメントとみなすわけではないです。

私のNo:45757の指摘は、No:45753 に対してのものです。
それと2行目の間違いですよね?

No:45756 のデータについては、先日の私のプログラムでは 4 2 2 になりました。
4 4 4になるのが期待されていると思いますので、私のプログラムについては
手が空いたら修正して投稿します。
(期待する結果も必ず書いて下さい)


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

Name: mii  ..上級者(15,290ポイント)   Date: 2010/01/07(木) 17:47   No:45760     
Title: Re:ソースステップ数    
>私のNo:45757の指摘は、No:45753 に対してのものです。
>それと2行目の間違いですよね? 
その通りです。すみません。

期待する結果を書きもらしてしまいました。
こちらもすいませんでした。



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

Name: たいちう  ..熟練のプログラマー(43,791ポイント)   Date: 2010/01/08(金) 08:54   No:45786     
Title: Re:ソースステップ数    
前スレの私のプログラムをNo:45756(test5.cとした)に対応させました。
もう間に合わないかな?


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

Name: mii  ..上級者(15,336ポイント)   Date: 2010/01/08(金) 09:17   No:45787     
Title: Re:ソースステップ数    
いろいろやってみたのですが上手くいかず。。。

添付ありがとうございます。
まだ間に合うので見させて頂きます!


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

Name: mii  ..上級者(15,373ポイント)   Date: 2010/01/08(金) 09:30   No:45788     
Title: Re:ソースステップ数    
やはり自分のやつに上手く組み込めない。。。orz
もう少しやってみます!


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

Name: たいちう  ..熟練のプログラマー(43,972ポイント)   Date: 2010/01/08(金) 10:00   No:45790     
Title: Re:ソースステップ数    
一応確認ですが、私のサンプルを見るだけではなく、
実行して動きを追いかけてもらっているのですよね?

UpdateStepで期待通りにステップがカウントされているか、
期待と違うとしたら、その時点でのフラグはどうなっているか、
どの文字の処理が間違っていたから、行末でフラグが違ってしまっているのか。

ちゃんと動くようにしたい自分のプログラムでデバッグ実行するのは当然ですが、
(比較的)ちゃんと動いている私のプログラムもデバッグ実行し、
フラグの動きなどを追ってみるのも有効だと思います。
往々にして勘違いをしているものですから。

少なくとも私が主張するような結果がmiiさんの環境でも得られることは
確認してください。得られないならば、重要な前提条件に誤解等がある
可能性があります。


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

Name: mii  ..上級者(15,431ポイント)   Date: 2010/01/08(金) 10:59   No:45791     
Title: Re:ソースステップ数    
とりあえず原因はわかったのですが、
その部分を変えると大幅に結果が変わってきてしまいまして。。。orz
時間も無いので何とか組み込みたいと思いまして。

何か良い方法が無いかと探しています。

取りあえずプログラム添付します!


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

Name: mii  ..上級者(15,477ポイント)   Date: 2010/01/08(金) 16:04   No:45795     
Title: Re:ソースステップ数    
やはり駄目でした。。。

他のテストケースは大丈夫なのですが、行中に'/'だけの場合
どうしても空白又はコメント行になってしまいます。

いい方法ないでしょうか?


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

Name: たいちう  ..熟練のプログラマー(44,053ポイント)   Date: 2010/01/08(金) 16:28   No:45796     
Title: Re:ソースステップ数    
> 他のテストケースは大丈夫なのですが、行中に'/'だけの場合
> どうしても空白又はコメント行になってしまいます。

私のプログラムでもダメでしたね。
UpdateStepを次のように変更したらOKでした。

void UpdateStep(Steps *steps, Flags *flags) {
    if (flags->commentFlg == 0 && flags->backChar == '/')
        flags->spaceFlg = 1;

    steps->allStep++;
    ...


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

Name: mii  ..上級者(15,586ポイント)   Date: 2010/01/08(金) 16:59   No:45798     
Title: Re:ソースステップ数    
提示ありがとうございます。

取りあえずそれ自分もやってみたんですが、/の後に空白とかが入ると
やはり空白又はコメント行として扱われてしまいます。

極端な話
/△/としても空白又はコメント行になってしまいます(△は半角スペースです)

コメント以外の/を処理として判定するのがわかりません。
これはどうしようもないんでしょうか?


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

Name: mii  ..上級者(15,654ポイント)   Date: 2010/01/08(金) 17:13   No:45799     
Title: Re:ソースステップ数    
たいちうさんの先ほどのコードを
flags.backChar = flags.currentChar;
の上に書いたところ上手く動きました。

今のところ問題がなさそうなのでこのままテストを続けてみます。


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

Name: mii  ..上級者(15,708ポイント)   Date: 2010/01/08(金) 17:48   No:45801     
Title: Re:ソースステップ数    
やはり微妙にバグ出ました(笑
ただ教授がもう少し伸ばしてくれるそうなのでちょっと安心しました。

わからなかったらまたレスしますのでよろしくお願いします(たぶんすぐかもしれないです。。。orz)


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

Name: たいちう  ..熟練のプログラマー(44,335ポイント)   Date: 2010/01/08(金) 18:28   No:45804     
Title: Re:ソースステップ数    
> 極端な話
> /△/としても空白又はコメント行になってしまいます(△は半角スペースです)

> コメント以外の/を処理として判定するのがわかりません。
> これはどうしようもないんでしょうか?

プログラムで悩んでいるのは理解できますが、
この質問の仕方ではアドバイスできる人はいないでしょう。
私のプログラムでは/を正しく判定しているので、
参考にしてください、としか言いようがない。
あなたの現状のプログラムが判らないので、
デバッグする気になった人がいたとしても何もできません。

掲示板は愚痴を書いたり進捗を報告したりする場ではないはずです。
そのような投稿にならないように、1つ1つの質問を完全なものにしてください。
自分が何を知りたいか、答えを得るために何を相手に伝えるかを、よく考えます。
特に前者について、うまく説明できるように問題をまとめるうちに、
自力で解決できることも多いですし、教えてもらった後では、
自分に何が足りなかったのかに気付きやすくなります。


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



Name: たつのしん  ..ぴよぴよ(251ポイント)   Date: 2010/01/08(金) 14:40   No:45794       
Title: 画像に関してなのでずが    
こんにちは。
こちら様のサイトでいつも勉強させてもらってます。

ところで、プログラミングではなく画像に関して質問があるのですが。
シューティングゲームで自キャラが飛んでいるように見せるため、
キャラの背面が描かれている画像を探しているのですが、なかなか見つけられません。

どなたかご存知でしたら教えて下さると幸いです。


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


Name: ようすけ  ..中級者(11,704ポイント)   Date: 2010/01/08(金) 18:07   No:45802     
Title: Re:画像に関してなのでずが    
言ってる意味がよくわからないのですが,要するに自機画像の素材を探しているという事でよろしいのですかね?

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



Name: 山崎  ..プログラマー(33,216ポイント)   Date: 2010/01/06(水) 00:02   No:45647       
Title: ゲームプログラマに必要な3Dの技術    
去年はお世話になりました、山崎です。
実家に帰っていたせいで ■新年の挨拶トピ■ でご挨拶できなかったのが残念です。
下のほうに行ってしまった記事を上げるのは気が引けてしまいまして・・・。
掲示板の皆様、今年も宜しくお願いいたします。

「ゲームプログラマーになるには?」の記事と内容がかぶってしまうのですが、
ゲームプログラマになるにはやはり3Dを扱う技術が必要不可欠なのでしょうか?

何かエディタを使って3Dのキャラクターやオブジェクトを作ったり、
何かライブラリを用いて3Dのオブジェクトを動かしたり光源やカメラをいじくったり、
3Dを扱ったゲームを作る経験や技術はゲームプログラマを目指す人にとって必ず必要、
あるいは無いと悲惨、なのでしょうか?
もし必要、あるいは望まれるとしたら、具体的にどんな経験が必要でしょうか。

今作ってる2Dゲームが終わったら3Dを勉強するぞ、と考えていたのですが、
思いのほか2Dゲームの製作が長引き、3Dゲーム作りに殆ど手を出せておらず、
非常にあせっております・・・。私事ですが・・・。
プロとしてプログラムに関わっている皆様も多いと思います、
3Dの経験がどれくらい必要なのかどうか、現場にいる皆様の意見をお伺いしたいです。

それからこちらは雑談っぽくなるのですが、
この質問は「ゲームプログラマーになるには?」の記事に返信、という形で
質問したほうが良かったでしょうか?
それとも、内容は似ていても全く同じでないなら新しく新規投稿でいいのでしょうか。
どちらにしようか非常に迷ったので、質問させていただきます。


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


Name: softya  ..比類無きプログラマー(83,746ポイント)   Date: 2010/01/06(水) 19:13   No:45686     
Title: Re:ゲームプログラマに必要な3Dの技術    
>「ゲームプログラマーになるには?」の記事と内容がかぶってしまうのですが、
>ゲームプログラマになるにはやはり3Dを扱う技術が必要不可欠なのでしょうか? 

それこそ会社によるし、ターゲットとする機種で決まってくるものです。
携帯電話なら2Dが主流ですし、PSPやDSでも2Dのゲームは多々あります。
逆にPS3やXbox360で開発にかかわるなら3Dは当たり前です。
なので将来自分をどうしたいかです。

会社には行った後勉強しようと思っても思うように時間は取れませんので、3D方面に進みたいなら今のうちに基礎はやっておいた方は良いと思いますよ。もうひとつのスレッドのCESAレポートを見る限り基礎力を期待しているみたいですしね。
ただし、2Dもそう簡単になくなるものでは無いでしょう。


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

Name: dic  ..熟練のプログラマー(48,178ポイント)   Date: 2010/01/06(水) 21:29   No:45700     
Title: Re:ゲームプログラマに必要な3Dの技術    
3Dの解説本ってすくないですよね
ってことは3Dができるだけで、期待されるかもしれませんね
どの程度できるかにもよりますけど

ただ、3Dできる人って普通の知識も豊富なので
ゲームプログラムにとらわれないのかもしれないですね

一人勝手な妄想なので、あまり信用しないでください


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

Name: 山崎  ..プログラマー(33,452ポイント)   Date: 2010/01/06(水) 23:00   No:45710     
Title: Re:ゲームプログラマに必要な3Dの技術    
softyaさん
ご返信、誠にありがとうございます。
3Dをどの程度重要なものとして扱うかも、やはり会社によるのですね。
「私は2Dのゲームしか作らないんだ〜!」なんて言えないでしょうから、
3Dも今のうちに触れたほうがよさそうですね・・・。
アドバイスありがとうございます。

dicさん
ご返信、誠にありがとうございます。
そういえば以前、この掲示板でも3Dを解説したサイトが少ない、
という話題があったような。
身につけておくと有利なのかもしれませんね、やる気が出てきました。
私も皆さんのように知識豊富な人間にならねば!


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

Name: たいちう  ..熟練のプログラマー(43,368ポイント)   Date: 2010/01/07(木) 09:07   No:45729     
Title: Re:ゲームプログラマに必要な3Dの技術    
> 3Dも今のうちに触れたほうがよさそうですね・・・。

別に反対するわけじゃないけど、3Dの高度なプログラムができる人を
簡単に獲得できるとは企業も思ってないのではないかな。

数学的な裏付けもできないままに、本やサイトのサンプルプログラムを
写しただけのプログラムを作成しても、評価されないかも。
「色々手を出したみたいだけど、何1つ自分では理解してない人」
という評価を受けることのないように、
気を付けて努力の方向を考えても良いかもしれません。

就職に有利そうだから、、、ではなくて、
面白そうだからとりあえず触ってみる、
という理由なら歓迎(俺は何様?)です。


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

Name: 山崎  ..プログラマー(33,749ポイント)   Date: 2010/01/07(木) 09:29   No:45730     
Title: Re:ゲームプログラマに必要な3Dの技術    
たいちうさん
ご返信、誠にありがとうございます。
お話を伺いますと、3Dは私の思っている以上に難しいもののようですね、
一朝一夕で習得できるものではない、いうことですね。
あまり打算的な考えで手を出すべきじゃないのかも知れませんね・・・。

ご忠告ありがとうございました。非常に参考になりました。


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

Name: たかぎ [URL]  ..ハッカー(148,694ポイント)   Date: 2010/01/07(木) 10:09   No:45737     
Title: Re:ゲームプログラマに必要な3Dの技術    
3Dの場合、プログラミングがどうこういう前に、高校レベルでかまわないので、数学や物理の学力が必要になります。
特定環境のAPIの使い方を覚えることも大切ですが、それよりは数学や物理をしっかり身につけましょう。
難しいといっても高校レベルですので、今日では誰でもできる範囲のことです。
# 一部、四元数のような高校レベルを超えたものもありますが...


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

Name: softya  ..比類無きプログラマー(84,022ポイント)   Date: 2010/01/07(木) 10:21   No:45738     
Title: Re:ゲームプログラマに必要な3Dの技術    
プロの使っている3D技術のコラムを紹介しておきますね。

こっちは概要的。
http://game.watch.impress.co.jp/docs/series/3dcg/
こっちはより詳細。
http://journal.mycom.co.jp/column/graphics/index.html

行列やらベクトルやらは基本技術で、ビジュアル的にはそれ以外の技術やセンスを必要とされる訳です。


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

Name: 山崎  ..プログラマー(33,977ポイント)   Date: 2010/01/08(金) 09:53   No:45789     
Title: Re:ゲームプログラマに必要な3Dの技術    
たかぎさん
ご返信誠にありがとうございます。
一応、高校レベルの数学と物理であれば身についているかな・・・とは自分では思っています。
でも、おそらく現場で働いている方々が学生に求めるレベルと
我々学生が十分と認識しているレベルには実は差があるのではないか・・・と懸念しています。

softyaさん
コラムに目を通させていただきました。
・・・う〜ん、やはり素人には難しい分野みたいですね、これが現場の技術・・・。
でもいつかは向き合わなければなりません。
貴重なものを紹介していただき、ありがとうございました。


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



Name: アト  ..ぴよぴよ(297ポイント)   Date: 2010/01/07(木) 18:55   No:45764       
Title: 2Dマップについて    
マップを描く
    ↓
キャラクタの位置を検索して描く


で下のように2Dマップを作っているのですが
(0が壁マップチップ(サイズ縦32,横32)、1が地面(32*32)、2が(48*32)、
3と4が木でどちらもサイズ32*32ですが4の上半分は透明であり、4は歩ける判定)
左の2の位置にキャラクタを置くとして、キャラクタの後ろの0のマップチップはキャラクタの透明な部分で0は表示されるのですが
右上の4の位置に行ってたとき4は木でなくキャラクタが表示されてしまいます。
これを改善するにはどうすればよいのでしょうか。

{ 0, 0, 0, 0, 0, 0, 0}
{ 0, 2, 1, 1, 1, 4, 0}
{ 0, 1, 1, 1, 1, 3, 0}
{ 0, 0, 0, 0, 0, 0, 0}

どうかよろしくお願いします。 編集済み


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


Name: softya  ..比類無きプログラマー(84,435ポイント)   Date: 2010/01/07(木) 19:25   No:45768     
Title: Re:2Dマップについて    
木がキャラクタの必ず上にくるなら後で書くのが良いでしょう。
つまり、
1.背景
2.キャラクタ
3.前景
の順番で描画するのです。
前景に該当するのは、4の木ですね。
ちなみに、木の後ろの地面があったりする場合は、背景の地面と前景の木は別データで持つ必要があります。


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

Name: アト  ..ぴよぴよ(396ポイント)   Date: 2010/01/07(木) 21:37   No:45771     
Title: Re:2Dマップについて    
softyaさんお返事ありがとございます。
つまり、地面、背景、前景の3つの配列と判定1つの配列が必要になるわけですか。
なかなか膨大なデータ量になりそうですね。
的確な答えで本当に助かりました。


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

Name: softya  ..比類無きプログラマー(84,506ポイント)   Date: 2010/01/07(木) 21:57   No:45772     
Title: Re:2Dマップについて    
>地面、背景、前景の3つの配列と判定1つの配列が必要になるわけですか。 

まず、地面と背景は兼用できますよ。
当たり判定も背景に持たせれば、背景と前景の合計2つの配列だけですね。


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

Name: アト  ..ぴよぴよ(479ポイント)   Date: 2010/01/07(木) 22:07   No:45774     
Title: Re:2Dマップについて    
softyaさんお返事ありがとうございます。
地面と背景は想像つきますが
それに当たり判定を背景に持たせるというのは
1から5まで歩ける判定、6以上は歩けない。
というような感じで移動処理に組み込めば良いのでしょうか?


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

Name: softya  ..比類無きプログラマー(84,784ポイント)   Date: 2010/01/07(木) 22:31   No:45775     
Title: Re:2Dマップについて    
>1から5まで歩ける判定、6以上は歩けない。
>というような感じで移動処理に組み込めば良いのでしょうか?

もちろん、それでも出来ます。
でもそれは1〜2面ぐらいマップが限度かと思います。

ゲームプログラミングの館のやり方はいったん置いておいて。

地形に関するデータは次のように定義出来ると思います。
・背景画像番号
・前景画像番号
・歩ける/歩けない
で、これを構造体にして歩ける/歩けないフラグで判定するのか、背景番号で歩けない歩けるを判断するのか、それはアトさんの考え方次第です。
構造体にすれば他の情報も持たせられますので地形アニメーションとかするときに便利でしょうが、マップ作成ツールが必要になってしまいます。
作ろうとしているゲームの種類とか、想定されるマップ数や広さそれらを考慮して考えないといけない事だと思います。


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

Name: アト  ..ぴよぴよ(626ポイント)   Date: 2010/01/07(木) 23:09   No:45777     
Title: Re:2Dマップについて    
softyaさんお返事ありがとうございます。
マップ作成ツールというものがあったのですか!
後で探してみようと思います。

構造体の定義の仕方についてなんですが
背景画像番号と前景画像番号は下のような感じだと思うんですけど

{0,0,0,0,0,0}
{0,1,1,1,1,0}
{0,0,0,0,0,0}

歩ける/歩かない
というのはどういう定義になるのか教えてもらえないでしょうか
勉強不足で申し訳ないです。


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

Name: softya  ..比類無きプログラマー(85,026ポイント)   Date: 2010/01/07(木) 23:58   No:45779     
Title: Re:2Dマップについて    
>マップ作成ツールというものがあったのですか! 
「マップエディタ」で探した方が良いでしょう。
Windowsアプリが作れるなら自分で作った方が勉強になりますけどね。

>歩ける/歩かない
>というのはどういう定義になるのか教えてもらえないでしょうか 

地形に歩けない歩けるの情報は何処かに必要だと思いますよね。
で、最初のアトさんのマップは、地形番号がそのまま歩ける/歩けないのフラグになってます。
0,1,2,4が歩けて、3が歩けないんですよね?

その方法を止めて地形データ配列を構造体化して、地形情報自体に組み込んでしまうって話です。
typedef struct {
 int bg_imgno; //背景画像番号
 int fg_imgno; //前景画像番号
 int stop_flag; //0なら歩ける,1なら歩けない。
} map_t; 

こんな構造体ですね。
で、この構造体の初期化はマップエディタで作ったデータを読み込んで行いましょうって話です。


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

Name: アト  ..ぴよぴよ(745ポイント)   Date: 2010/01/08(金) 01:13   No:45782     
Title: Re:2Dマップについて    
softyaさんお返事ありがとうございます。

マップエディタを見てきたのですが(softyaさんの言っている場所かはわかりませんが)、
とても読み解いて自分のソースに組み込むのはできそうにありません。
紹介してもらって悪いのですが、とりあえず今の方法で頑張ってみようと思います。


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



Name: 初心者  ..熟練のプログラマー(45,987ポイント)   Date: 2010/01/06(水) 09:37   No:45657       
Title: 無題    
質問です
このHPで紹介されているような画像(添付したやつです)を
作るにはどんなツールを使えばいいのでしょうか?
ペイントでも大丈夫ですか?


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


Name: DVDM [URL]  ..熟練のプログラマー(48,687ポイント)   Date: 2010/01/06(水) 15:51   No:45678     
Title: Re:無題    
>>初心者さん
私の友人にはペイントでなんでそんな絵が描けるの・・・という方がいらっしゃいます。
機能的に満足するかは解りませんが、貼り付けた画像を描くならペイントでも問題ないです。

GIMP、PIXIA、EDGEなど、フリーソフトで高機能なお絵描きツールも存在します。
宜しければお使いになってみてはいかがでしょうか。


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

Name: 初心者  ..熟練のプログラマー(45,961ポイント)   Date: 2010/01/07(木) 23:39   No:45778 解決!     
Title: Re:無題    
ありがとうございました
さっそく使ってみたいと思います


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



Name: kms  ..中級者(13,699ポイント)   Date: 2010/01/07(木) 18:57   No:45765       
Title: 龍神録プログラミングの館-57章-の    
解らない箇所が出てきたので、質問させて頂きます。

龍神録プログラミングの館-57章-の、

// 画面の中央に幅・高さ100で描画
Vertex[0].pos.x = 320.0F - 50.0F ;      Vertex[0].pos.y = 240.0F + 50.0F ;      Vertex[0].pos.z = Z ;
Vertex[0].u = 0.0F ;                    Vertex[0].v = 0.0F ;


- 50.0F の'-'と、同様に+ 50.0F の、'+'の演算子の意味がよくわからないのですが、
何方かご教授頂けないでしょうか?


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


Name: softya  ..比類無きプログラマー(84,319ポイント)   Date: 2010/01/07(木) 19:18   No:45767     
Title: Re:龍神録プログラミングの館-57章-の    
>- 50.0F の'-'と、同様に+ 50.0F の、'+'の演算子の意味がよくわからないのですが、 
ただの加算と減算ですね。

>今、中心点が(320,240)で、画像の横幅が100、縦幅が100であり、奥行きZである画像を描画する為、
>aの位置に必要な情報を代入する場合は以下のように代入されます。

と書かれている通り、中心点から幅の半分のサイズを足したり引いてたりしている部分です。
pos.zは無視して、pos.xとyの座標を紙で実際に点を打ってみると分かりますよ。
320cmは大きすぎるので、16cmぐらいまでスケールダウンしてくださいね。


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

Name: kms  ..中級者(13,701ポイント)   Date: 2010/01/07(木) 22:44   No:45776 解決!     
Title: Re:龍神録プログラミングの館-57章-の    
softya様、ありがとうございます。

仰るとおりに、紙に書いていたら、途中で気がつきました。

助かりました。本当にありがとうございました。


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



Name: ジュンヤ  ..入門者(2,631ポイント)   Date: 2010/01/06(水) 19:07   No:45685       
Title: 誘導弾の角度制限について    
ボスに誘導弾を打たせたいと思っています。
atan2を使って、ボスの弾と自機との角度を求めて誘導弾を作ったのですが、
誘導する角度がきつくて、そのまま自機の方向に向かってきてしまいます。
ある程度誘導する角度をゆるめてやる方法はないでしょうか?
以下のように書きました。よろしくお願いします。
void boss_shot_bulletH000(){
    int t=boss_shot.cnt%60,i;
    if(t == 0){
        bullet_way(boss.x, boss.y, 1, bossatan2(), 0, 2, 7, 0, 0);
    }
    for(i = 0; i < BOSS_BULLET_MAX; i++){
        if(boss_shot.bullet[i].flag > 0){
      boss_shot.bullet[i].angle = atan2(ch.y - boss_shot.bullet[i].y, ch.x - boss_shot.bullet[i].x);
    }
    }
}



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


Name: nns  ..ぴよぴよ(22ポイント)   Date: 2010/01/06(水) 20:23   No:45687     
Title: Re:誘導弾の角度制限について    
DXライブラリ本家のサンプルプログラムのホーミングミサイルの部分を参考にされると良いと思います。

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

Name: ジュンヤ  ..入門者(2,663ポイント)   Date: 2010/01/07(木) 18:05   No:45761 解決!     
Title: Re:誘導弾の角度制限について    
サンプルを見ても理解できませんでしたが、真似してみたらなんとかできました。
ありがとうございました。


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

Name: Ma  ..プログラマー(28,245ポイント)   Date: 2010/01/07(木) 22:04   No:45773     
Title: Re:誘導弾の角度制限について    
もう遅いかもしれませんが。。。

boss_shot.bullet[i].angle = atan2(ch.y - boss_shot.bullet[i].y, ch.x - boss_shot.bullet[i].x);

double cross = (ch.x - boss_shot.bullet[i].x)*sin(boss_shot.bullet[i].angle)- (ch.y - boss_shot.bullet[i].y)*cos(boss_shot.bullet[i].angle);//sin(シータ)*距離  (-Pi/2 < θ < PI/2)
double dot = (ch.x - boss_shot.bullet[i].x)*cos(boss_shot.bullet[i].angle)+ (ch.y - boss_shot.bullet[i].y)*sin(boss_shot.bullet[i].angle);//cos(シータ)*距離 (0 < θ < PI)
double tan_ang = atan2(dot,cross);//   (sin(シータ)*距離/cos(シータ)*距離) = tan(θ) より。 (-PI < θ < PI)
boss_shot.bullet[i].angle += tan_ang/2;  //2 にはお好きな定数を代入。弾道のきつさを変数としてもいいかも。



なんて、内積と外積を利用した方法なんかもあったりします。
あ、チェックしていないので間違っている部分もあるかもです。
 編集済み


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



Name: kai  ..中級者(11,741ポイント)   Date: 2010/01/06(水) 21:15   No:45696       
Title: C++でLuaの使い方    
はじめまして。質問させてください。

現在RPGを作っているのですが、イベントに使うスクリプトをLuaにしようと思いました。
そこで、C++にLuaを組み込むにはどうすれば良いのでしょうか。
普通に組み込むなら出来ますが、沢山スクリプトを作るとその度にC++側でスタックしてやる必要があるのですか?
イベントの概念自体もはっきりしてないのでそもそもの勘違いなのかもしれませんが、、、よろしくお願いします。

環境はVC++2008,C++,DXライブラリです。
駄文すみませんでした。


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


Name: sizuma [URL]  ..プログラマー(26,479ポイント)   Date: 2010/01/06(水) 21:22   No:45698     
Title: Re:C++でLuaの使い方    
僕もやってみたいな、とは思ってるんですけどね。
本格的にやるなら↓

スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践
http://www.amazon.co.jp/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8B%E5%8A%B9%E7%8E%87%E7%9A%84%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA-%E3%81%B8%E3%81%AELua%E7%B5%84%E8%BE%BC%E3%81%BF%E5%AE%9F%E8%B7%B5-GAME-DEVELOPER-%E6%B5%9C%E4%B8%AD/dp/4797348550

おそらくC++もLuaも使える人用でしょう。 編集済み


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

Name: kai  ..中級者(11,801ポイント)   Date: 2010/01/06(水) 23:14   No:45713     
Title: Re:C++でLuaの使い方    
返信ありがとうございます。

やる気はありますが、それでも趣味の領域ですし、学生なので流石にそこまでお金は出せません;;
とりあえず明日本屋で探してみます。


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

Name: softya  ..比類無きプログラマー(83,872ポイント)   Date: 2010/01/07(木) 00:10   No:45717     
Title: Re:C++でLuaの使い方    
Luaを使った事が無い事をお断りしておきます。

RPGのオーソドックスな手法としては、マップの指定区間を踏むことやNPCキャラクタと会話することでLuaの関数を呼び出せば良いと思います。
あとはマップの初期化とか、キャラクタの配置とか色々便利なので必要に応じて関数を増やせば良いかなと。
スクリプトはマップごとに作った方が管理が楽だと思います。その場合グローバル変数の持ち回り方法は考えて置く必要がありますね。
あと、Luaから会話メッセージを出す場合などに、ずっとLuaにいるままって訳にもいかないのでメッセージループに戻る方法は考えておく必要があります。Luaだとコルーチンが使えるかもしれません。


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

Name: Naohiro19  ..入門者(3,218ポイント)   Date: 2010/01/07(木) 13:25   No:45751     
Title: Re:C++でLuaの使い方    
コンソールで動くサンプルプログラムです。
#include <stdio.h>
#include <lua.hpp>
#pragma comment(lib, "lua5.1.lib")

//add関数の実装
int add( int a, int b)
{
    return a + b;
}

//add関数のグルーコード
int addGlue(lua_State* L)
{
    //引数を取得
    int a = (int)lua_tonumber(L, 1);
    int b = (int)lua_tonumber(L, 2);

    //目的の関数を実行
    int ret = add(a, b);

    //スタックをクリア
    lua_settop(L, 0);

    //戻り値を格納
    lua_pushnumber(L, ret);
    return 1;
}

int main(void)
{
    //luaのVMを開く
    lua_State* L = lua_open();
    lua_openlibs(L);

    //関数をLuaに登録する
    lua_register(L, "add", addGlue);

    //luaの読み込み
    if( lua_loadfile(L, "add.lua") || lua_pcall(L,0,0,0)){
        printf("error: %s\n", lua_tostring(L, - 1));
        return -1;
    }

    //luaを閉じる
    lua_close(L);
    return 0;
}
Luaからは
-- add.lua
local res = add(10, 9)
local fmt = string.format("10 + 9 = %d", res)
print(fmt)

で呼び出せます。
結果は「10 + 9  = 19」と画面に表示されると思います。


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

Name: kai  ..中級者(11,884ポイント)   Date: 2010/01/07(木) 20:40   No:45769 解決!     
Title: Re:C++でLuaの使い方    
>softyaさん
> あと、Luaから会話メッセージを出す場合などに、ずっとLuaにいるままって訳にもいかないのでメッセージループに戻る方法は考えておく必要があります。Luaだとコルーチンが使えるかもしれません。
コルーチンですか。使ったことがないですが、便利そうですね。
勉強してみます。

>Naohiro19さん
わざわざ書いていただきありがとうございます。
グルーコードを指定してやれば良かったんですか。知らなかったです。
ありがとうございましたm(__)m


出来そうな気がするので解決にします。
また質問した際にはよろしくお願いします。


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



Name: 256bit  ..入門者(2,813ポイント)   Date: 2010/01/07(木) 02:04   No:45722       
Title: 敵のプログラム    
 ボンバーマンのような2Dアクションシューティングゲームを作っています。現在旧シューティングゲームの館のプログラムを参考にして敵のプログラムを実装していますが、しばらくすると敵キャラクターの画像が狂ってしまいます。その時のプログラムも添付しましたので、プログラムの分析をお願いします。
 最終的に敵の動きは、プレイヤーの操作と同じ感じにしたいと思っています。
 
  編集済み


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


Name: SooA [URL]  ..上級者(23,140ポイント)   Date: 2010/01/07(木) 09:50   No:45734     
Title: Re:敵のプログラム    
        EnemyCalcDisp(); //敵の描画
        EnemyControl();  //敵のコントロール

        for(i=0;i<1;i++){
            enemy[i].img = ((enemy[i].x+enemy[i].y)%32)/8 + enemy[i].muki3*4;
            DrawGraph( enemy[i].x , enemy[i].y , enemy_image[i][ enemy[i].img ] , TRUE ) ;//敵画像を描画
        }

for文の中を修正
座標 x と y それぞれの余りを加算していたのが原因かと思います。
自機キャラも同様の計算をしていますが、
こちらは32ドット単位できっちり移動していて
x方向の移動時には yが、y方向の移動時には xの計算に
余りが出ないようになっているのでしょう。


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

Name: 256bit  ..入門者(2,875ポイント)   Date: 2010/01/07(木) 19:11   No:45766 解決!     
Title: Re:敵のプログラム    
 >SooAさん

 ありがとうございます。
 画像の狂いがなくなりました。
 また何かありましたら、今後もよろしくお願いします。

 

 


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



Name: デラ初心者  ..入門者(3,644ポイント)   Date: 2010/01/07(木) 16:34   No:45755       
Title: 背景を描いてみよう    
龍神録の20章の
背景を描いてみようですが
img_back[0] = LoadGraph("dat/img/back/0/back0.png");
が背景ですが../は要らないのですか?

自分は../がないと描画されません


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


Name: ひよこ  ..比類無きプログラマー(77,476ポイント)   Date: 2010/01/07(木) 18:10   No:45762     
Title: Re:背景を描いてみよう    
自分のを見てきましたが、../はありました。
これは一階層前のフォルダからって意味だと思うので、ないと画像が読み込めないと思います。
きっと間違いでしょう。


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

Name: デラ初心者  ..入門者(3,694ポイント)   Date: 2010/01/07(木) 18:22   No:45763 解決!     
Title: Re:背景を描いてみよう    
そうですか〜
他の章にもあるので
暇があれば直して欲しいですね

ありがとうございました


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



Name: hard  ..ぴよぴよ(171ポイント)   Date: 2010/01/07(木) 09:37   No:45731       
Title: ハードが変わるを格段に処理が遅くなる    
この前、ネットカフェで僕のゲームを持っていきました。
あるカフェではfpsが70以上でるのに他のカフェでは40以下になりました。
カフェのハードウエァのスペックはあまり変わらなかったと思います。
ソースはかなり長いので出せませんが、
ハードウエァを変えたとき、ゲームの処理能力が格段に変わる原因はなんだと思いますか?
アドバイスされたことを捜索してみますのでよろしくお願いします。


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


Name: hard  ..ぴよぴよ(188ポイント)   Date: 2010/01/07(木) 09:37   No:45732     
Title: Re:ハードが変わるを格段に処理が遅くなる    
追加で
もちろんDXライブラリを使っています。


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

Name: Mist  ..比類無きプログラマー(80,066ポイント)   Date: 2010/01/07(木) 10:07   No:45736     
Title: Re:ハードが変わるを格段に処理が遅くなる    
FPSが低かったほうは他のソフトウェアがいろいろ動いていたんじゃないでしょうか。
(見えるもの、見えないものも含めていろいろと)

ハードウェア部分に重点を置くなら、グラフィックスボードとグラフィックスドライバのバージョンが影響大きそうですが。


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

Name: softya  ..比類無きプログラマー(84,062ポイント)   Date: 2010/01/07(木) 10:23   No:45739     
Title: Re:ハードが変わるを格段に処理が遅くなる    
GPUじゃないですかね。
OSとDirectXのバージョンも関係しそうです。


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

Name: hard  ..ぴよぴよ(444ポイント)   Date: 2010/01/07(木) 10:37   No:45740     
Title: Re:ハードが変わるを格段に処理が遅くなる    
回答ありがどうございます。
OSはXPで同じだったような気がします。
僕もGPUが一番あやしいと思っているんですが、
もしGPUだった場合、動作環境に書く時これ以上だったら綺麗に動くって
どうやって記述すればいいのですか?
それとGPUを数値として検証する方法ってありますか?



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

Name: hard  ..ぴよぴよ(473ポイント)   Date: 2010/01/07(木) 10:48   No:45741     
Title: Re:ハードが変わるを格段に処理が遅くなる    
追記で
アプリはゲーム以外全部消して試しました。


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

Name: hard  ..ぴよぴよ(583ポイント)   Date: 2010/01/07(木) 10:54   No:45742     
Title: Re:ハードが変わるを格段に処理が遅くなる    
>Mistさん
>FPSが低かったほうは他のソフトウェアがいろいろ動いていたんじゃないでしょうか。 
(見えるもの、見えないものも含めていろいろと) 

目に見えないもの・・・
たしかにネットカフェではそのようなものがあるかもしれません。このような場合どうすれば
改善されるのですか?


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

Name: Mist  ..比類無きプログラマー(80,089ポイント)   Date: 2010/01/07(木) 10:59   No:45743     
Title: Re:ハードが変わるを格段に処理が遅くなる    
確認ですがhardさんの作られているゲームはフルスクリーンですか?


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

Name: hard  ..ぴよぴよ(603ポイント)   Date: 2010/01/07(木) 11:03   No:45744     
Title: Re:ハードが変わるを格段に処理が遅くなる    
フルスクリーンではつくっていません。
よろしくお願いします。


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

Name: Mist  ..比類無きプログラマー(80,155ポイント)   Date: 2010/01/07(木) 11:10   No:45745     
Title: Re:ハードが変わるを格段に処理が遅くなる    
フルスクリーンの場合、CPUは無理だけどGPUをほぼ独占できるのでかなり安定すると思います。(フルスクリーンはそのためにあるわけですし)
ウィンドウの場合は、どうしても他ソフトの影響を受けるので確実に安定させる方法を私は知らないです。


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

Name: hard  ..ぴよぴよ(701ポイント)   Date: 2010/01/07(木) 11:14   No:45746     
Title: Re:ハードが変わるを格段に処理が遅くなる    
そうですか。ありがとうございます。
フルスクリーンだと荒くなるからやってないんですよね。
プログラムの問題かもって思っているんですけど、ハードによって
おかしくなるプログラムなんて聞いたことないし・・・。


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



Name: かんたべ君  ..ぴよぴよ(185ポイント)   Date: 2010/01/07(木) 07:20   No:45724       
Title: 無題    
おはようございます。
C言語で分からないことがあったので質問させていただきます。
WindowsのVistaでBorland C++を使っています。

プログラムの中から抜粋したコードです。
<pre>
int main(int argc, char *argv[])
{
    int width = 8;
    FILE *fp;

    if (argc < 2) {
        datab(stdin, stdout, width);
    }
    else {
        while (--argc > 0) {
            if (**(++argv) == '-') {
                width = atoi(++*argv);
            }
               ・・・・
        ・・・・
この中で **(++argv)とあるのですが、これはどんな動きをするのですか?
argvはポインタですよね。++argvなので、argv[1]を指しますよね?
ということは、**(argv[1])になりますよね?*(argv[1])だと、そのポインタが指す中身なのですが、
*二つあります。これは、どういうことなのでしょうか?


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


Name: MNS  ..プログラマー(29,023ポイント)   Date: 2010/01/07(木) 07:40   No:45725     
Title: Re:無題    
*(argv[1])がargv[1]の値を指す、ということは、**(argv[1])はargv[1][0]の値をさします。

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

Name: box  ..ハッカー(148,423ポイント)   Date: 2010/01/07(木) 07:44   No:45726     
Title: Re:無題    
そのプログラムは

実行ファイル名 -4

のように、実行ファイル名の後ろにハイフン付きの
数値オプションを付けて、
何かの幅を指定するようになっているものですか?

++argv:お考えのとおり、argv[1]を指します。
*(++argv):argv[1]が指している文字列、つまり"-4"のことです。
**(++argv):argv[1]が指している文字列"-4"の先頭文字、つまり'-'のことです。

つまり、

if (**(++argv) == '-') { 
width = atoi(++*argv); 


このif文は、

実行ファイル名の直後に指定したオプションが「ハイフンの直後に数値」の形であれば、
数値の部分を変数widthに格納する、という意味です。

atoi(++*argv)
の部分は、
*argv:argv[1]が指している文字列、つまり"-4"のことです。
++*argv:ポインタargv[1]を1文字分進めて、"4"を指します。
atoi(++*argv):atoi("4")を実行して、文字列の"4"から数値の4を得ます。 編集済み


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

Name: かんたべ君  ..ぴよぴよ(444ポイント)   Date: 2010/01/07(木) 08:42   No:45727     
Title: Re:無題    
MNSさん、boxさん回答ありがとうございます。

すいません、このプログラムが何のプログラムか説明していませんでした。
このプログラムは、"test.c"という名前のファイルをタブ幅4で表示するそうです。実行は
> detab -t4 test.c

あと、boxさん、申し訳ございません。if (*++(*argv) == 't')が抜けていました。
if (**(++argv) == '-') { 
    if (*++(*argv) == 't') {
        width = atoi(++*argv); 
    }
} 


boxさんに質問です。

*(++argv):argv[1]が指している文字列、つまり"-4"のことです。 
**(++argv):argv[1]が指している文字列"-4"の先頭文字、つまり'-'のことです。

と、あったのですが、
*(argv[1])だけで、先頭文字'-'は指さないのですか?


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

Name: MNS  ..プログラマー(29,161ポイント)   Date: 2010/01/07(木) 09:02   No:45728     
Title: Re:無題    
なんか、間違えていた気がします。
*(argv[1])で確かに'-'はさしますね。

追記:
>argvはポインタですよね。++argvなので、argv[1]を指しますよね?
>ということは、**(argv[1])になりますよね?*(argv[1])だと、そのポインタが指す中身なのですが、
すいません、先程の回答は誤っていました。この時点で違いますね。
(++argv)=argv[1]ではありません。++argv=&argv[1]です。
つまり、*(++argv)=argv[1]です。


>*(argv[1])だけで、先頭文字'-'は指さないのですか? 
よって、*(*(++argv))=*(argv[1])ですから、合っています。 編集済み


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



Name: TAKA  ..ぴよぴよ(75ポイント)   Date: 2010/01/06(水) 11:12   No:45663       
Title: 13a. 裏画面処理をして画像を動かす、について    
ゲームプログラミング入門の、”13a. 裏画面処理をして画像を動かす”について、
説明には「画像がスーッと動く」と書いてあったのですが、
私が行うと、「パッ」としかでません。
コードも間違えていないはずなのに、どうしてでしょうか。


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


Name: MNS  ..プログラマー(28,860ポイント)   Date: 2010/01/06(水) 11:26   No:45666     
Title: Re:13a. 裏画面処理をして画像を動かす、について    
コードが間違えていないとなると、パソコンの方の問題かもしれませんね。
ソースコードを置いているディレクトリに、Log.txtというテキストファイルがあるはずです。
それを見せていただけませんか?


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

Name: ナッツ  ..ぴよぴよ(37ポイント)   Date: 2010/01/06(水) 12:51   No:45669     
Title: Re:13a. 裏画面処理をして画像を動かす、について    
おなじくなりました><
が、私は裏画面に描画するを消したことで解決しましたよ^^


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

Name: kazuoni [URL]  ..ハッカー(124,790ポイント)   Date: 2010/01/06(水) 13:27   No:45670     
Title: Re:13a. 裏画面処理をして画像を動かす、について    
> 私は裏画面に描画するを消した

これは根本的な解決策ではない気がします。


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

Name: ナッツ  ..ぴよぴよ(55ポイント)   Date: 2010/01/07(木) 07:02   No:45723     
Title: Re:13a. 裏画面処理をして画像を動かす、について    
たしかにそうなんですよ^^:
一応私はそうしたので書いておきました^^:


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



Name: yrao  ..上級者(16,494ポイント)   Date: 2010/01/07(木) 00:04   No:45716       
Title: 耐久弾幕を作るには    
現在ボス弾幕を制作中なのですが、東方などでみられる『耐久弾幕』の実装についてで分からないことがあったので質問させてください。
 
耐久弾幕というのは、
ボスに弾を当てて体力をけずるのではなく、一定時間弾幕を避けきることを目的とした弾幕
・・・のことです。(解釈がまちがっているかもしれませんが・・・)
 
 
この種類の弾幕を実装するためには、最低でも、
   ボスの弾幕中であっても、
   ・自機ショットとボスの当たり判定
   ・自機とボスの当たり判定
   をなくす
ことが必要だと考えました。
 
そこで、一番目の「自機のショットとボスの当たり判定を消す」処理から書いていこうと思ったのですが、
ホーミング弾がボスに吸いついたようになったまま消えない
という現象が起きてしまいました・・・
添付ファイルのような感じです。
 
cshot.cppに何か処理を加えてあげれば良さそうなのですが、どのような処理を追加するのが最善の方法なのでしょうか・・・
アドバイスよろしくお願いします。
 
 
____以下は追加した部分です____



・struct.h内のボスの構造体に、耐久弾幕かどうかのフラグ、
s_flagを追加(1なら耐久)


・out.cppの赤文字部分を追加
 
int out_judge_cshot_boss(int i){
    if(cshot[i].cnt>0){//ショットの軌道が1度でも計算されていたら
        if(boss.s_flag==0){             
             if(out_judge(cshot[i].x,cshot[i].y,boss.x,boss.y,
                    cshot_range[cshot[i].knd],BRANGE,cshot[i].spd,cshot[i].angle)){
                    return 1;
             }
        }
    }
    return 0;
}



  ・graph.cppの赤文字部分を追加

void graph_boss(){
    int i;
    if(boss.flag==0)return;
    if(boss.s_flag==0){        
         graph_boss_effect();
        DrawRotaGraphF(boss.dx+FX+dn.x,boss.dy+FY+dn.y,
            1.0f,0.0f,img_dot_riria[0],TRUE);
    }
    if(boss.hp_max==0){printfDx("graph_boss内0割り\n");return;}
    for(i=0;i<FMX*0.98*boss.hp/boss.hp_max;i++){
        if(boss.back_knd[boss.knd]==1)
            DrawGraph(3+FX+i+dn.x,2+FY+dn.y,img_etc[7],FALSE);
        else
            DrawGraph(3+FX+i+dn.x,2+FY+dn.y,img_etc[1],FALSE);
    }
}

・boss_shot.cpp内の赤文字部分を追加

void enter_boss(int num){
    if(num==0){//中ボス開始時の時は
        memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);//雑魚敵を消す
        memset(shot,0,sizeof(shot_t)*SHOT_MAX);//弾幕を消す
        boss.x=FMX/2;//ボスの初期座標
        boss.y=-30;
        if(stage_count==boss.appear_count[0])//最初なら
            boss.knd=-1;//弾幕の種類
    }
    boss.phy.flag=1;
    boss.phy.flag=1;
    boss.s_flag=0;    
     boss.flag=1;
    boss.hagoromo=0;//扇を広げるかどうかのフラグ
    boss.endtime=99*60;//残り時間
    boss.state=1;//待機中状態に
    boss.cnt=0;
    boss.graph_flag=0;//描画フラグを戻す
    boss.knd++;
    boss.wtime=0;//待機時間を初期化
    input_phy(60);//60カウントかけて物理的計算で定位置に戻す
}





・弾幕関数内で、
boss.s_flag=1;
とする



________________________________________


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


Name: あ〜る  ..上級者(16,160ポイント)   Date: 2010/01/07(木) 00:36   No:45719     
Title: Re:耐久弾幕を作るには    
どうやってホーミングさせているかはわかりますよね?
s_flagが1の時にその処理を呼ばない、またはs_flagが0の時にのみその処理を呼べばOKのはずです
 編集済み


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

Name: SooA [URL]  ..上級者(22,986ポイント)   Date: 2010/01/07(木) 01:21   No:45720     
Title: Re:耐久弾幕を作るには    
//自機ショットと敵との処理
void cshot_and_enemy(){
    int i,s;
    for(i=0;i<CSHOT_MAX;i++){//自機ショット総数
        if(cshot[i].flag>0){
            for(s=0;s<ENEMY_MAX;s++){//敵総数
                if(enemy[s].flag>0){
                    if(out_judge_cshot(i,s)){//自機ショットと敵が当たっていれば
                        cshot[i].flag=0;//その自機ショットを消す
                        hit_enemy(s,cshot[i].power);
                        break;
                    }
                }
            }
            //ボスが出現していて、描画しないフラグがオフで、ショット中なら
            if(boss.flag==1 && boss.graph_flag==0 && boss.state==2){
                if(out_judge_cshot_boss(i)){
                    cshot[i].flag=0;
                    hit_boss(cshot[i].power);
                }
            }
        }
    }
}

龍神禄プログラムの60章のプロジェクトから
out.cpp 内の赤色の行をコメントアウトして
テストプレイしてみましょう。


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

Name: yrao  ..上級者(17,007ポイント)   Date: 2010/01/07(木) 01:42   No:45721     
Title: Re:耐久弾幕を作るには    

あ〜るさん、SooAさん、どうもありがとうございます。
 


不具合ですが、


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

        }
        cshot[k].angle=atan2(y,x);
    }
}



とすることで、解決してしまいました・・・(=.=;;)


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



Name: いぬ。  ..ぴよぴよ(71ポイント)   Date: 2010/01/06(水) 20:25   No:45689       
Title: ボムについて    


ボンバーマンみたいなん作りたいのですが爆弾を置いて爆発させるまでをどう書けばいいかわかりません。

爆弾を書く→数秒たつ→爆発としたいのですができなくて困ってます。

ボンバーマンつくったことある人教えてもらえたらありがたいです。


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


Name: sizuma [URL]  ..プログラマー(25,290ポイント)   Date: 2010/01/06(水) 20:47   No:45693     
Title: Re:ボムについて    
作ったことない人です。

・blastFlagをつくる。
爆弾をどうやって管理してるかは知らないですけど。Cならリストかな?
・処理のたびにインクリメントする。
blastFlag++;
・一定の回数インクリメントされたら爆破させる。
FPSが60だったら2秒後の120インクリメントされたら、とか

なんてどうでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,129,796ポイント)   Date: 2010/01/06(水) 21:15   No:45695     
Title: Re:ボムについて    
なんちゃってなら作った事ある人です。

質問が結構漠然としていて答えにくい気が・・^^;
まずどの辺まで出来ているのでしょう?
概念的な事を答えたら実装出来そうな段階なのでしょうか、それともマップでキャラを動かすこともまだ出来ていない状態でしょうか。

爆弾のアルゴリズム的な部分はsizumaさんが仰っているので省略します。

もしマップ関連がまだならマップから作ってみてはどうでしょう?
爆弾を作るにしてもマップに置かないといけないので、まずマップが出来ていないと試してみる事も難しそうです。
マップが出来てしまえばキャラのいるマスに爆弾を置けばいいだけで、
時間が経ったら爆発させればいいので、簡単に実装出来そうです。

ただし、誘爆も考えないといけないので、完全にまねするのはちょっと難しいかも。
特に爆風が交差する部分の表示画像の制御がちょいとややこしいです。
(特定の方向の爆風が最大であるとき、別の方向の炎が弱まり始めた時とか)

ただアルファブレンドや加算ブレンド使って良いのならすぐ出来るかもしれませんね。


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

Name: いぬ。  ..ぴよぴよ(180ポイント)   Date: 2010/01/06(水) 22:46   No:45709     
Title: Re:ボムについて    
お二人方ありがとうございます。

マップはゲームプログラミングの館の「いけないところを作る2D」を見てできました!
爆弾の処理いろいろ試してみたんですがうまくいけないです・・。


どこに爆弾の処理を書けばいいのですか?whileのとこにいれたら人の動きまでが遅くなってしまいました><




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

Name: いぬ。  ..ぴよぴよ(188ポイント)   Date: 2010/01/07(木) 00:28   No:45718 解決!     
Title: Re:ボムについて    
しょぼいですが爆破までできました!

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


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



Name: 光翼型近接支援残酷超初心者  ..入門者(4,557ポイント)   Date: 2010/01/06(水) 18:02   No:45682       
Title: 自機の当たり判定を四角形にしたい    
当たり判定の定義のしかたを前の質問でいろいろ教えてもらいましたが、今回も同じ様な質問をさせていただきます。


自分の改造龍神録のSTGの自機は「横長」なので、龍神録と同じく円形の当たり判定だと先端などに当たり判定が付かなくなってしまいます。

そこで、タイトル通り自機の当たり判定を四角形(長方形)にしたいのですが、どう CRANGE を定義すればよろしいのでしょうか?

個人的には、フィールドの領域の判定と同じで、左上の座標を決めて、そこからxに〜・yに〜、…………という風にしたいのですが、可能でしょうか?


連続で同じような質問をしてしまってすみません。ですが、前回のものとはとても若干違った内容のような気がしたので、スレ立てさせて頂きました。

if文ぐらいしか知らない自分ですが、どうかお願いします。


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


Name: fatens  ..入門者(4,208ポイント)   Date: 2010/01/06(水) 18:42   No:45683     
Title: Re:自機の当たり判定を四角形にしたい    
CRANGEは自機の当たり判定の円の半径であるため、
それをどう定義しても当たり判定を長方形にはできないでしょう。


>左上の座標を決めて、そこからxに〜・yに〜、…………という風にしたい

龍神録では自機や敵の座標は画像の中心なので、
中心から左右に x 、上下に y とした方が変更が少なくてすむと思います。


http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%C5%F6%A4%BF%A4%EA%C8%BD%C4%EA#content_1_4
↑矩形を用いた当たり判定

http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%C5%F6%A4%BF%A4%EA%C8%BD%C4%EA#content_1_2
↑龍神録はこっち
 編集済み


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

Name: 光翼型近接支援残酷超初心者  ..入門者(4,893ポイント)   Date: 2010/01/06(水) 20:31   No:45690     
Title: Re:自機の当たり判定を四角形にしたい    
???

書いてある事は〜、……なんとなく分かるのですが。

低脳の自分には、龍神録の中にどのように組み込めばいいのかが…………。



とりあえず、敵弾の当たり判定はそのまま shot[s].bullet[n] を使えばいいんですよね(ホントに?

それで、 if(x*x+y*y<r*r)//当たり判定内なら を if(X0 < X3 && X2 < X1 && Y0 < Y3 && Y2 < Y1) にすればいいのでしょうか?

それにおっしゃっていた自機当たり判定の「左右に x 、上下に y」はどこで定義すればいいのですか?


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

Name: fatens  ..入門者(4,440ポイント)   Date: 2010/01/06(水) 21:20   No:45697     
Title: Re:自機の当たり判定を四角形にしたい    
>if(x*x+y*y<r*r)//当たり判定内なら を if(X0 < X3 && X2 < X1 && Y0 < Y3 && Y2 < Y1) にすればいいのでしょうか?

先のサイトはあくまでイメージです。
時間がなく実装例を示せないのですが一部分の変更では無理です。


今思ったのですが、自機を左右2つに分けてそれぞれ円の当たり判定を用いれば
それなりに判定できるのではないでしょうか?

私が間違っていたりもっと良いアイデアがあればどなたかお願いします。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,129,935ポイント)   Date: 2010/01/06(水) 21:29   No:45701     
Title: Re:自機の当たり判定を四角形にしたい    
自機の当たり判定範囲だけ長方形にしたいということでしょうか。
敵の弾のあたり判定範囲は円である為、長方形と円とのあたり判定を計算する必要があります。

長方形と円のあたり判定はちょっとややこしいです。
http://www.google.co.jp/search?hl=ja&q=%E7%9F%A9%E5%BD%A2%E3%80%80%E5%86%86%E3%80%80%E5%88%A4%E5%AE%9A&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja&aq=f&oq=
この辺参考になるかもしれません。

例えば龍神録の館ではこのように計算しています。
http://dixq.net/rp/34.html

しかし長方形といっても、別に必ず長方形であたり判定計算をしなくてもいいと思います。
円と円のあたり判定の方が便利なのなら、円を組み合わせたらいいのです。


いい加減でよければこれでだいたい長方形の範囲は網羅出来ました。
静止したものと静止したもののあたり判定ならこれでは困るかもしれませんが、
物体は動いているわけですから、少々カバーしていない部分があってもこれで十分な場合が多いです。

もっと言えばこんな複雑なあたり判定だとしても



円を組み合わせることで大体カバーすることが出来ます。



もっと正確に1ピクセル単位であたり判定を計算したければ
あたり判定の計算を行う弾などに白黒のドット絵を用意してやり、画像のピクセル単位で計算すれば、
かなり正確なあたり判定が計算出来るでしょう。


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

Name: dic  ..熟練のプログラマー(48,474ポイント)   Date: 2010/01/06(水) 22:05   No:45705     
Title: Re:自機の当たり判定を四角形にしたい    
http://ja.wikipedia.org/wiki/%E5%86%86%E7%A9%8D%E5%95%8F%E9%A1%8C
円を用いて正確な正方形を描くことは不可能であると証明されてます
近いものなら描けます


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

Name: 光翼型近接支援残酷超初心者  ..初心者(5,239ポイント)   Date: 2010/01/06(水) 22:09   No:45706     
Title: Re:自機の当たり判定を四角形にしたい    
>自機を左右2つに分けてそれぞれ円の当たり判定を用いれば
>円を組み合わせたらいいのです

あっ、ソレ、ビッグカメラで立ち読みした本で見た事あります。


えっと、つまり。当たり判定を二つ(またはそれ以上)用意して、それぞれを計算すれば良いんですね!

でも、どうやって二箇所(以上)に定義すればいいのでしょう?

CRANGE とかで二回定義しても、結局画像の中心なので意味無いですよね?


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



Name: たけし  ..ぴよぴよ(299ポイント)   Date: 2010/01/05(火) 20:57   No:45619       
Title: ゲームプログラマーになるには?    
ゲームプログラマーになるには、何の言語ができればいいのですか?
そして、言語を習得するには、本屋にある言語の本を何冊ぐらい読めばいいのですか?
ゲームブログラマーになるのに、必要なことは何ですか?


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


Name: shilfia  ..かけだし(2,009ポイント)   Date: 2010/01/05(火) 21:10   No:45621     
Title: Re:ゲームプログラマーになるには?    
こんにちは。
とりあえずこれらのサイトに一通り目を通されてはいかがでしょう。

http://www.purplemoon.jp/game/index.htm
http://tegeyoka.com/index.html


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

Name: 御津凪 [URL]  ..ハッカー(136,672ポイント)   Date: 2010/01/05(火) 21:11   No:45622     
Title: Re:ゲームプログラマーになるには?    
> ゲームプログラマーになるには、何の言語ができればいいのですか?

ゲームとして成り立つのなら、どの言語でも出来ます。


> そして、言語を習得するには、本屋にある言語の本を何冊ぐらい読めばいいのですか?

個人差によります。

ネットで調べるだけで習得に値する知識と技術を身につけられるかもしれませんし、
何冊読んでも覚えられず、諦めてしまうかもしれません。

> ゲームブログラマーになるのに、必要なことは何ですか?

ゲームをプログラミングする意志があれば誰でもなれます。
ただし、その意志でゲームを完成できるかどうかは別です。


(以上、真正面から答えたので、予想した答えと違うと思う現職の答えでした)


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

Name: softya  ..比類無きプログラマー(83,377ポイント)   Date: 2010/01/05(火) 21:39   No:45627     
Title: Re:ゲームプログラマーになるには?    
>ゲームプログラマーになるには、何の言語ができればいいのですか?

覚えていると有利なのは、C++かJavaでしょうね。

>そして、言語を習得するには、本屋にある言語の本を何冊ぐらい読めばいいのですか?

その人、次第でしょうね。
必要な情報はだいたいネット上に転がっています。
それを拾い集めて理解する能力があるかどうかです。

>ゲームブログラマーになるのに、必要なことは何ですか?

プログラミングを楽しめるかどうかでしょうね。
楽しんでいれば、そのうち凄いゲームを作れる様になります。

とりあえずC++を覚えて下記の本の内容を全て理解することをまず目指してみては?
「ゲームプログラマになる前に覚えておきたい技術」
http://www.amazon.co.jp/dp/4798021180
ただし、全部理解出来ても出発点にすぎませんよ。


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

Name: conio [URL]  ..比類無きプログラマー(77,939ポイント)   Date: 2010/01/05(火) 21:43   No:45628     
Title: Re:ゲームプログラマーになるには?    
>>ゲームプログラマーになるには、何の言語ができればいいのですか?  
企業によっても変わると思います。

「C++は必須」、というところもあれば
「基本的にCでやってます」という所、
「携帯アプリを専門に作る」というところもあります。

もし志望している企業があれば、
その企業の募集要項などを見ると参考になるかと思います。


>>ゲームブログラマーになるのに、必要なことは何ですか?
目標を目指して頑張れる精神力 だと思います。
何をするかにもよりますが、とりわけ3Dに関してはかなり専門的な事が必要になってきます。
2Dよりも 数十倍、数百倍は難解 と言っても過言では無いと思います。 編集済み


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

Name: sizuma [URL]  ..上級者(24,909ポイント)   Date: 2010/01/05(火) 22:04   No:45630     
Title: Re:ゲームプログラマーになるには?    
就活中の学生です。
技術的なことは他の人がかいてるので他のことを。

人とコミュニケーションをとれることが出来るのがまずは大前提だと思います。
明るかったりプレゼン能力があったり。
気配り(空気読むこと)が出来ない人とは一緒に仕事したくないですね、僕は。
やる気ない人もうっとおしいですけどね。


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

Name: Justy  ..伝説なるハッカー(492,337ポイント)   Date: 2010/01/05(火) 22:09   No:45631     
Title: Re:ゲームプログラマーになるには?    
 
 ゲームプログラマーになるだけなら、「自分はゲームプログラマーである」と宣言して
ゲームを作り始めた瞬間からゲームプログラマーになれるんですが、そういう意味で
訊いているわけじゃないですよね?


> 何の言語ができればいいのですか

 よく使われるのは、C / C++ / C# / JAVA / Objective-C / ActionScript(Flash)などが
あります。
 作りたいもの興味のあるもの、働きたい業界・会社が求めているものに合わせて
覚えるといいでしょう。

 ただ、それよりも重要な言語は日本語(コミュニケーション力)で、出来れば英語も修めて
おきたいところです。



> ゲームブログラマーになるのに、必要なことは何ですか?

 センスです。
 プログラムセンスだけでなく、美的センスだったり、アイデアのセンスだったり。
 これらがないと、どうしようもないプログラムやゲームができあがりますので、非常に重要です。

 あと「必要」というより「求められている」ことになりますが、1年ほど前に CESAが
レポート「ゲーム産業における新卒開発者人材育成事業報告書」を纏めていますので、
参考にして下さい。


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

Name: ようすけ  ..中級者(10,676ポイント)   Date: 2010/01/05(火) 22:25   No:45636     
Title: Re:ゲームプログラマーになるには?    








横から失礼します。

私はゲームプログラマーとは全く正反対のガテン系の仕事をしています。

趣味でゲームプログラムをしている程度です。

ですので専門職の事は全くわからないのですが、
何が言いたいかと言うとゲームが好きでプログラムが好きじゃないと
仮に就職が決まったとしても長くは続かないと思います。(私個人の意見なので何とも言えませんが(汗)

私なんか趣味で作ってる程度でヒーヒー言ってますが・・・

でも結局一番大事なのはsizumaさんもおっしゃってますが、ゲーム業界に限らずコミュニケーション能力ですね。
仕事は人間性が出るものだと思ってます。

>conioさん

>2Dよりも 数十倍、数百倍は難解 と言っても過言では無いと思います。

私は今3Dのゲームを作ってるんですが、ほんとそう思います(汗


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

Name: sizuma [URL]  ..プログラマー(25,348ポイント)   Date: 2010/01/05(火) 23:04   No:45638     
Title: Re:ゲームプログラマーになるには?    
>Justyさん
>レポート「ゲーム産業における新卒開発者人材育成事業報告書」

こんなのがあるんですね。
・・・・長いっ!
読んでると、なんか絶対受かる気がしてきます。
まぁ気のせいでしょうけど。
いろいろ(資料には)書いてるけど、受ける側は基本は自分を偽らないで表現してほしいと思います。
学校でも、
「読んだ本聞かれるかもしれないから、なんか本読んどけ」
「ボランティア経験についてしゃべれるから、ボランティアしとけ」
なんていわれるんですが、意味が分からないですね、そんな付け焼刃な趣味。
自分を変えていこうとすることはすごく大事だと思うんで、求められてることをみて、自分を成長させることができる行動をしてほしいものです。
・・・今年面接される側の意見じゃないなぁ(笑


>ようすけさん
>ゲームが好きでプログラムが好き
でも、ゲームばっかりしてて、ゲームがとにかく好きだから、ってだけで出来る仕事じゃないと思いますね。
僕はゲーム自体を作ることよりも、ゲームエンジンを作ったり、ネットワークで通信できるようにしたり、って方のほうが興味があります。
いろんなことが出来たり、おもしろいものが作れる仕事がいいなってことでゲーム会社も受けようと思ってます。
正直ゲームが好きなのが志望理由って人は公務員目指したほうが絶対いいですよ。


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

Name: shilfia  ..かけだし(2,141ポイント)   Date: 2010/01/05(火) 23:36   No:45644     
Title: Re:ゲームプログラマーになるには?    
>レポート「ゲーム産業における新卒開発者人材育成事業報告書」

これすごいですね、全部読んでみます。
実はCESAというのも初めて知りました・・・。

と、上の感想だけではアレなので。


私も就活中です。
sizumaさんに便乗して技術以外のアドバイスを。。
コミュニケーション能力は当然必須です。
ゲーム業界とは少しずれますが、第一印象が良く、前向きで自己成長の意識が高い人は面接で通りやすいと人事の人が言っていました。
ゲーム業界も大手は面接重視らしいですから、そちらの方の対策も必要でしょうね。

時間があるなら、何かプログラムを組んで一つの作品を作ることが重要だと思います。
絶対に自分でプログラミングした方がいいです。
本を読んだだけでは身につきません。
もっと前からゲームプログラミングをしておけばよかったと後悔することは避けた方がいいです。私みたいに。 編集済み


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

Name: softya  ..比類無きプログラマー(83,412ポイント)   Date: 2010/01/05(火) 23:47   No:45646     
Title: Re:ゲームプログラマーになるには?    
>実はCESAというのも初めて知りました・・・。

東京ゲームショウはCESAの主催ですよ。
あと開発者向けのカンファレンスも行ってますね。


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

Name: Justy  ..伝説なるハッカー(492,646ポイント)   Date: 2010/01/06(水) 00:20   No:45649     
Title: Re:ゲームプログラマーになるには?    
□ sizumaさん

> こんなのがあるんですね

 実は去年読んでちょっとびっくりしましたよ。
「え? 今って新人にそこまで求めるの?」と。

 今は一から育てていたら間に合わない・割に合わないんでしょうね。


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

Name: softya  ..比類無きプログラマー(83,551ポイント)   Date: 2010/01/06(水) 00:50   No:45651     
Title: Re:ゲームプログラマーになるには?    
>実は去年読んでちょっとびっくりしましたよ。
>「え? 今って新人にそこまで求めるの?」と。
> 今は一から育てていたら間に合わない・割に合わないんでしょうね。

学業優秀だからといってプログラミングやゲームのセンスがあるとは限らないってのもあるんじゃないでしょうか。


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

Name: dic  ..熟練のプログラマー(48,410ポイント)   Date: 2010/01/06(水) 21:58   No:45704     
Title: Re:ゲームプログラマーになるには?    
コミュニケーション能力 93%

私は絶望的ですね・・・orz
やたらむやみに面接受けるより
こういった基準があると便利というか
分かりやすくていいですね

しかし、逆に言うとコミュニケーション能力が高いと
採用率もばつぐんに高くなるともいえますね
ただ、普通に会話してるだけで無意味に感情がかたぶるときが・・・


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



Name: ZIKI  ..ぴよぴよ(381ポイント)   Date: 2010/01/05(火) 22:59   No:45637       
Title: おしえてください。    
http://www.play21.jp/board/formz.cgi?action=res&resno=45623&page=&id=dixq&rln=45634
で、私の質問の仕方が間違っていると教わったので、反省し、それを生かして投稿さしていただきます。

私は今「龍神録プログラミングの館」の10章、「敵を表示させてみよう」で、
敵が出ない。というところで困っています。

私はvisual c++ 2008 edition を使っています。

10章の前の9章「キャラクタの移動制御をしてみよう」までをコピペし、デバッグしたときには、
正常に作動しました。
その後10章をコピペして、デバッグしてもエラー、警告がでて、9章の時と同じ事しかできません。

出力されたエラーは、多いので添付さしてもらいます。


反省を生かせたと自分では思いますが、足りない部分があったらコメントください。


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


Name: ZIKITETRY  ..ぴよぴよ(656ポイント)   Date: 2010/01/05(火) 23:10   No:45639     
Title: Re:おしえてください。    
名前の場所がまた変になってます。すみません。
削除キーになにも入れてなかったので編集できないので書かして貰います。
私の名前は、ZIKIではありません、「ZIKITETRY」です


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

Name: SooA [URL]  ..上級者(22,556ポイント)   Date: 2010/01/05(火) 23:14   No:45641     
Title: うっかり消してしまったんだろう。    
再定義しようとしてエラー
 ↓
なぜ再定義されているのか?
 ↓
ヒント「5章」


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

Name: sizuma [URL]  ..プログラマー(25,063ポイント)   Date: 2010/01/05(火) 23:24   No:45643     
Title: Re:うっかり消してしまったんだろう。    
おそらく写し間違えがほとんどでしょう。
(変更しなくてはいけないのに、そのままぜんぶコピペしたり)
もう一度出来なくなった章の最初にもどってまた読み直す、ってのがいいとは思いますが、動く状態のものはないですかね?

龍神録プログラミングの館のトップで全章のプロジェクトが一括でDL出来ます
一応リンクを
http://dixq.net/rp/zip/project.zip

僕はプログラミングの館を読んでないので、SooAさんのアドバイスに従ってちょっと見直してみては?
どうしても分からなかったら、何処がミスってるのかをエラーが発生した行を見直したり、10章のソースを見ながら修正すれば直ると思いますよ。


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

Name: ZIKITETRY  ..ぴよぴよ(803ポイント)   Date: 2010/01/06(水) 20:23   No:45688     
Title: Re:うっかり消してしまったんだろう。    
返信ありがとうございます。
SooAさんにはヒントを貰いましたが、すみません。分かりません。
sizumaさんにも言われたとおり写し間違えだと思うのですが、
写し間違えて、いつも投稿していたら切りがない。と自分で思ったので、
龍神録の章の一番下の、「この章までのプログラムを一括ダウンロード」をダウンロードしました。



最初から作るのではなく、作られている物を軸にして変換しながら作る事にします。



ですがこれもおかしいです。
ダウンロードして解凍し、デバッグしたのですが、黒い画面しか出ません。
これは自分が間違えているんですかね?


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

Name: sizuma [URL]  ..プログラマー(25,153ポイント)   Date: 2010/01/06(水) 20:38   No:45691     
Title: Re:うっかり消してしまったんだろう。    
10章のプロジェクトを実行しましたか?
おそらく最初のほうのプロジェクトだと、画面を表示する、とかの項目ではないのですかね?
それ以外だったら僕にはわからないです。


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

Name: SooA [URL]  ..上級者(22,981ポイント)   Date: 2010/01/06(水) 20:45   No:45692     
Title: Re:うっかり消してしまったんだろう。    
答えを書くと main.cpp の一行目、

誤 define GLOBAL_INSTANCE
  ↓
正 #define GLOBAL_INSTANCE


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

Name: sizuma [URL]  ..プログラマー(26,282ポイント)   Date: 2010/01/06(水) 21:08   No:45694     
Title: Re:うっかり消してしまったんだろう。    
>SooAさん
>誤 define GLOBAL_INSTANCE 
気の利いたエディタなら、色が違うからすぐわかりますよね。
一番上だし。

じゃぁ僕もぱっと見て

>\project\1章\mydat\source\ini.cpp(21) : error C2084: 関数 'void first_ini(void)' は既に本体を持っています

おそらくコピーしたときにもともとあったやつを消さないで書いたから、前の章でやったのが残ってるのでは?
ini.cpp(21)とありますよね
ini.cppの21行目より上ですでに定義されてるよってことでしょう。(もしくはincludeしたファイル内)
既存の関数に処理を付け加える部分を、そのままコピーしてるから動かないのだと。
こういう風にまずはエラーが出てる行のあたりをデバッグしましょう。
それでも見つからなかったら(実行時エラーとか)ブレークポイントを使って・・・となるんですけど、これはおいおい。


1>f:\project\1章\mydat\source\load.cpp(11) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>f:\project\1章\mydat\source\load.cpp(11) : error C2365: 'LoadDivGraph' : 再定義; 以前の定義は '関数' でした。
1>        f:\project\include\dxlib.h(1594) : 'LoadDivGraph' の宣言を確認してください。
1>f:\project\1章\mydat\source\load.cpp(11) : error C2078: 初期化子の数が多すぎます。
1>f:\project\1章\mydat\source\load.cpp(11) : error C2440: '初期化中' : 'int [9]' から 'int' に変換できません。

明らかにこの行はおかしいって言ってます。

1>c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(19) : error C2146: 構文エラー : ';' が、識別子 'GLOBAL_INSTANCE' の前に必要です。
1>c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(19) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(19) : error C2144: 構文エラー : '__w64 unsigned int' は ';' によって先行されなければなりません。
1>c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(19) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません

これがおそらく#defineの#が抜けてることによるエラーなんじゃないかな?と思います。

1>f:\project\1章\mydat\source\main.cpp(25) : error C3861: 'ini': 識別子が見つかりませんでした
1>f:\project\1章\mydat\source\main.cpp(31) : error C3861: 'enemy_main': 識別子が見つかりませんでした
ソースコードの上をたどっていって、おそらく関数の
ini()とenemymain()の関数プロトタイプがないですね。
多分includeされてるヘッダの中にまとめてあるはず。


・・・あぁ、ありました。
10章のページの実行結果の上

--function.hに以下を追加--

GLOBAL void enemy_main();
GLOBAL void ini();


とあります。
これが抜けてるのでしょう。
 編集済み


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

Name: ZIKITETRY  ..ぴよぴよ(965ポイント)   Date: 2010/01/06(水) 21:25   No:45699 解決!     
Title: Re:うっかり消してしまったんだろう。    
ありがとうございます。
SooAさんの言うとおり、#を付けたら正常にできました。
sizumaさんの言うとおり、10章を開くとできました。

実は、1章のファイルしか開いたことが無くて、何処が間違えているか
自分で調べることができませんでした。
皆さんありがとうございました。
これからはあまり質問しなくてもすむと思います


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

Name: sizuma [URL]  ..プログラマー(26,792ポイント)   Date: 2010/01/06(水) 21:35   No:45702     
Title: Re:うっかり消してしまったんだろう。    
普通はエラーメッセージからデバッグします。
別に龍神録だけつくれればいいなら一括DLのプロジェクトを見て訂正してもいいとは思いますが、いろいろ自分の力で出来るようにしたほうがいいですよ。
ここで何をしているのか?
というのを理解しながら解説ページのコードを書いたり、写したりしたほうがいいと思います。

ゲームが自分で作れるようになりたいなら、C言語の文法も並行して学習するべきでしょう。

あと、次回何か問題が起きたら、何で困ってるのかをトピックのタイトルにしましょう。
今回の場合ですと、

龍神録プログラミングの館:10章について
とか、
エラーのデバッグの仕方がについて
とか。

僕は質問したことがないので、ほんとうにこれでいいのかは考える必要がありますけど
少なくとも「おしえてください」よりは質問内容が分かりやすいですよね。


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



Name: no  ..ぴよぴよ(731ポイント)   Date: 2010/01/06(水) 14:03   No:45672       
Title: フルスクリーン時の文字について    
現在480*640サイズのウィンドウに文字を表示させています。
しかしながらそれをフルスクリーンに拡張してしまうと、文字ががたがたになってしまいます。
拡大しているのだから半ば当然のことなんですが、解決するにはどのような手段がありますか?

現在、DrawFormatString関数で文字を表示させています。

ワード上で文字を書き、そのスクリーンショットをペイントで加工し、その画像を表示させるという
形にするとやや改善されるのですが、他にどのような方法があるでしょうか?

OsはwindowsXP、コンパイラはVC++で、DXライブラリを使用しています。


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


Name: MNS  ..プログラマー(28,911ポイント)   Date: 2010/01/06(水) 14:30   No:45673     
Title: Re:フルスクリーン時の文字について    
単純に解像度を上げるのではダメでしょうか、
おそらく、それ以外の方法で解決するのはなかなか難しいと想いますよ。


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

Name: no  ..ぴよぴよ(884ポイント)   Date: 2010/01/06(水) 15:26   No:45674     
Title: Re:フルスクリーン時の文字について    
解像度の変更とのことですが、リファレンスにそれらしいものはありませんでした。


して、リファレンスを眺めていたところ、
int ChangeFontType( int FontType ) ;
という便利な関数があったので、それを使ったところ、いい感じになりました。


ですがやはり、画像そのものの解像度も上げたいので、よろしければ関数の名前と、簡単な使い方を教えてくれませんか?








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

Name: MNS  ..プログラマー(29,038ポイント)   Date: 2010/01/06(水) 15:32   No:45675     
Title: Re:フルスクリーン時の文字について    
解像度が低くても、アンチエイリアスをかければ滑らかになるんですかね。

解像度を変えるには、
int SetGraphMode( int SizeX , int SizeY , int ColorBitNum )
という関数を使用します。
SizeX,SizeYには解像度を、ColorBitNumには、カラービット数を指定します。

例えば、解像度(1024×768)、カラービット数を32bitにしたい場合は、
SetGraphMode(1024, 768, 32);
とします。


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

Name: no  ..かけだし(1,048ポイント)   Date: 2010/01/06(水) 16:21   No:45679     
Title: Re:フルスクリーン時の文字について    
うーん、そちらも試してみたのですが、
フルスクリーンの画面の左上に640*480の画面が移りこむようになり、拡大されません。


■ → ■□
    □□

上のような感じです。(左側が640*480の画面、右がフルスクリーンモードで表示したとき)
左上につまるとはこういうことです。
こちらのとしては、

■ → ■■
    ■■

にしたいんですが、関数を使う場所が悪いのでしょうか。


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

Name: MNS  ..プログラマー(29,056ポイント)   Date: 2010/01/06(水) 18:45   No:45684     
Title: Re:フルスクリーン時の文字について    
普通はそうならないはずですが・・・。
解像度が大きすぎたりしていませんか?

Log.txtを提示するなり、コードを開示するなりすると、解決が早まるかもしれません。


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



Name: no  ..ぴよぴよ(288ポイント)   Date: 2010/01/02(土) 11:26   No:45368       
Title: 他者の作成したライブラリの実装について    

C言語歴は大体1年ほど、入門書を一冊終わらせました。
具体的には、

・九つの制御文
・ポインタ
・構造体
・分割コンパイル
・リファレンスを見ることでの、関数の使用

が使用可能な状態です。
とはいえここで、.lib や .dll などのファイルの扱いがさっぱりで困り果てています。
そのため、DxLibなどの実装が詳しく説明されているライブラリならばともかく、使用したい別の
ライブラリが実装できません。

そのため、

・文法などの解説ではなく、そういったことが書かれている書籍はないか。
・また、そのライブラリの実装方法を知る術はないか。
 そのライブラリ → http://studiokingyo.fc2web.com/dxlib/tutorial/bmldll_tutorial.html

という二点、ご存知の方教えてくれると助かります。

環境は windowsXP 、VC++2008 です。

無知ながら、よろしくお願いします。


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


Name: no  ..ぴよぴよ(345ポイント)   Date: 2010/01/02(土) 11:28   No:45369     
Title: Re:他者の作成したライブラリの実装について    
追記です。

「VisualC++での使い方」の「各自、BMLDLL.lib(マルチスレッドを使うならば BMLDLLMT.lib)をリンクしてください」 
からどうしてよいかわからない状態です。


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

Name: dic  ..熟練のプログラマー(45,768ポイント)   Date: 2010/01/02(土) 14:18   No:45375     
Title: Re:他者の作成したライブラリの実装について    
ここを読んでみてはいかがでしょうか
http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2008express.html


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

Name: たかぎ [URL]  ..ハッカー(146,813ポイント)   Date: 2010/01/03(日) 18:35   No:45466     
Title: Re:他者の作成したライブラリの実装について    
> どうしてよいかわからない状態です。

とりあえずVisual Studioのドキュメントを読みましょう。


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

Name: no  ..ぴよぴよ(407ポイント)   Date: 2010/01/06(水) 13:57   No:45671     
Title: Re:他者の作成したライブラリの実装について    
dicさん たかぎさん
 知り合いのプログラマーに尋ねてみたところ、そういったことを解説している書籍はほとんどないとのことでした。
 やはりVisualStudioのドキュメントをみるしかなさそうです。
 解答ありがとうございました。


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

Name: SooA [URL]  ..上級者(22,951ポイント)   Date: 2010/01/06(水) 17:12   No:45681     
Title: Re:他者の作成したライブラリの実装について    
コンパイラにはVC++2008を使いました。 

1. ダウンロードして解凍する→ package というフォルダが作成される 

2. packageフォルダ内の BMLDLL.h を開いて 
  BMLDLLMTd.lib を BMLDLLMT.lib に変更 
  BMLDLLd.lib を BMLDLL.lib に変更 
  #include "BMLDefined.h" を #include "src/BMLDefined.h" に
  変更して保存

3. VC++2008 ツール→オプション 
  プロジェクトおよびソリューション→VC++ディレクトリで 
  インクルードとライブラリに package フォルダを追加 

4. ライブラリを使用するプロジェクトのカレントフォルダに 
BMLDLL.dll と BMLDLLMT.dll をコピー 


動作は保証できません。 
 編集済み


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



Name: 光翼型近接支援残酷超初心者  ..入門者(3,755ポイント)   Date: 2010/01/05(火) 01:03   No:45543 解決!       
Title: フィールドの領域の問題+当たり判定について    
どうも、こんばんは。

最近こんなめんどくさい名前にせにゃよかったと思っている光翼型近接支援残酷超初心者です。ドゥーム様に憧れてやった結果がコレだよ! って感じですね。

以上挨拶でした。



質問ですが、


近頃、龍神録の改造がうまくいってきてるので、自作のボードを作ってみたのですがそこで問題が出てきました。

と言っても実際は初期の方から気になっていた問題なんですが……。


FIELD_MAX_X、と
FIELD_MAX_Y

の値をどんなに変えても変更が適用されないのです。


龍神録では、

#define FIELD_MAX_X 384
#define FIELD_MAX_Y 448

となっていますが。


自分のSTGでは広くして

#define FIELD_MAX_X 544
#define FIELD_MAX_Y 448

としてるのですが、変更しても反映されず、龍神録のデフォルトの領域でしか動けませんでした。


どうすれば改善されるのでしょうか? 他に変更すべき点があるのでしょうか?

どうかお願いします。






それともう一つの質問なんですが、


//敵の当たり判定範囲
int enemy_range[ENEMY_RANGE_MAX]={16,30,16,50};
//自機ショットの当たり判定範囲
int cshot_range[CSHOT_RANGE_MAX]={6,};


という文で当たり判定を決めているのは分かるのですが、どのように決めているのでしょうか?


{16,30,16,50}の場合、領域の判定と同じで画像の左上の座標を16,30とし、そこからxに16の範囲、yに50の範囲、という考えでよいのでしょうか? でも龍神録等の当たり判定というのは円形だった気がしてるのですが、自分が言った考え方だと四角形になってるハズので疑問に思いました。

それと、int cshot_range[CSHOT_RANGE_MAX]={6,};の{6,}はどう定義しているモノなのでしょうか?


I can`t C.な自分ですが、どうかご教授お願いします。 編集済み


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


Name: fatens  ..入門者(3,648ポイント)   Date: 2010/01/05(火) 14:25   No:45584     
Title: Re:フィールドの領域の問題+当たり判定について    
最初の質問については私の方では反映されます。
リビルドしてみてくださいとしか……

enemy_range[] や cshot_range[] はそれぞれ敵と自機ショットの半径です。
enemy_range[enemy[s].knd] といった記述があるように、
敵の種類によって当たり判定の円の半径を決定しています。

>int cshot_range[CSHOT_RANGE_MAX]={6,};の{6,}
初期化子の数が足りないときは残りは0で初期化されることになっています。
また、6, の , はあってもなくてもかまいません。


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

Name: 光翼型近接支援残酷超初心者  ..入門者(3,919ポイント)   Date: 2010/01/05(火) 21:08   No:45620     
Title: Re:フィールドの領域の問題+当たり判定について    
領域の方はビルトしてデバックなしでやったら反映されました。緑色の三角押してやってたのがいけなかったのでしょうか? というかこの二つの方法の違いはどこなんでしょう?

まあでも、大丈夫でした。解決しました。




なるほど半径でしたか。
……つまり一匹目の敵は半径16分の円が当たり判定で、二匹目は半径30分が当たり判定…………って事、ですか? いやなんか違う気がする……。


すみません。このクソ低能でカスで塵以下でむしろ「生まれてきてすみません」って遺書かいて死ね、な低脳を持つ自分にもう一度お教え頂けないでしょうか? ホントすみません。


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

Name: MNS  ..プログラマー(28,768ポイント)   Date: 2010/01/05(火) 21:30   No:45625     
Title: Re:フィールドの領域の問題+当たり判定について    
龍神録のコードはあまり良くしりませんが、
敵の種類などはkndというint型の変数で定めているのでしょう。
ですから、
>つまり一匹目の敵は半径16分の円が当たり判定で、二匹目は半径30分が当たり判定
こういうことではなく、
→0が値の種類の敵の、当たり判定に用いる円の半径は16、1が値の種類の敵は30・・・
ということだと思います。

>このクソ低能でカスで塵以下でむしろ「生まれてきてすみません」って遺書かいて死ね、な低脳を持つ自分
もう少し、表現を和らげた方が良いでしょう。気分を害する人がいるかもしれません。


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

Name: 光翼型近接支援残酷超初心者  ..入門者(4,185ポイント)   Date: 2010/01/05(火) 23:19   No:45642     
Title: Re:フィールドの領域の問題+当たり判定について    
>>0が値の種類の敵の、当たり判定に用いる円の半径は16、1が値の種類の敵は30・・・

なるほど。今の所公開されてる龍神録の章では敵の種類を増やす事には触れてなかったので混乱してました。

ありがとうございます。


>>低脳表現

ちょっとしたネタを含めたつもりでしたが……、やはりそうですね、知らない人には随分と悪い印象を持たれるかもしれませんでしたね。




ところで、気になったんですけど、

オプションから発射される弾の当たり判定も「int cshot_range[CSHOT_RANGE_MAX]={6,};」で決めているのでしょうか?


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

Name: fatens  ..入門者(4,006ポイント)   Date: 2010/01/06(水) 10:34   No:45659     
Title: Re:フィールドの領域の問題+当たり判定について    
>領域の方はビルトしてデバックなしでやったら反映されました。緑色の三角押してやってたのがいけなかったのでしょうか? というかこの二つの方法の違いはどこなんでしょう? 

緑色の三角は「デバッグ開始」を意味します。
通常ソースを変更した状態でこれを押すと、ビルドを確認するダイアログが出て、
「はい」を選択すると、ビルドした後デバッグ開始をしますが、
「いいえ」の場合、ビルドせずにデバッグ開始をします。
「今後このダイアログを表示しない」をチェックして「いいえ」を選択していた場合、
何回緑色の三角を押してもビルドされないため、変更が反映されなかったのではないでしょうか。


>オプションから発射される弾の当たり判定も「int cshot_range[CSHOT_RANGE_MAX]={6,};」で決めているのでしょうか?

そうですね。
オプションからのショットは knd = 1 なので、cshot_range[1] = 0 となります。


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

Name: 光翼型近接支援残酷超初心者  ..入門者(4,290ポイント)   Date: 2010/01/06(水) 16:45   No:45680     
Title: Re:フィールドの領域の問題+当たり判定について    
いつも三角でやっていましたし、変更しても毎回「はい」「いいえ」のダイログは出てたので関係ないと思うんですけどね……。何でだったんでしょう。


>そうですね。 
>オプションからのショットは knd = 1 なので、cshot_range[1] = 0 となります。

当たってましたか、よかったです。
じゃあ int cshot_range[CSHOT_RANGE_MAX]={6,}; の{6,}の部分に「,」があるのはオプションのために分かりやすくしてあった、……って事なんですね、多分。


ともかく解決です。御三方、ありがとうございました。


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



Name: bb  ..ぴよぴよ(21ポイント)   Date: 2010/01/06(水) 08:18   No:45655       
Title: どのファイルやフォルダを削除しても大丈夫なの?    
DXライブラリでゲームをつくりました。
人に配ろうと思いますが、いらないファイルやフォルダは削除したいです。
下のものを削除していいか迷ってます。
Debugのフォルダと
slnのファイル
vcprojのファイル
USERファイルは
これらは削除しても大丈夫なのですか?
詳しくないのでよろしくお願いします。


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


Name: SooA [URL]  ..上級者(22,653ポイント)   Date: 2010/01/06(水) 09:31   No:45656     
Title: Re:どのファイルやフォルダを削除しても大丈夫なの?    
必要なのはリリース用に作られた実行ファイル(.exe)と
その実行ファイルから読み込みまれる画像や音楽などの
データファイル類です。

大事なファイルを消してしまわないように
ゲーム用のフォルダを別に用意して、
必要なファイルをコピーする形で行いましょう。


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

Name: bb  ..ぴよぴよ(92ポイント)   Date: 2010/01/06(水) 10:51   No:45660     
Title: Re:どのファイルやフォルダを削除しても大丈夫なの?    
すいません。
上のファイルかフォルダを
消して大丈夫なのか、答えてくれませんか?
そのいい方だとLIBファイルも消していいように聞こえます。
LIBファイルは削除してもだめですよね?
ここを見て知ってる人がいたらお願いします。


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

Name: MNS  ..プログラマー(28,792ポイント)   Date: 2010/01/06(水) 10:59   No:45661     
Title: Re:どのファイルやフォルダを削除しても大丈夫なの?    
>LIBファイルは削除してもだめですよね? 
大丈夫ですよ?


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

Name: nayo  ..中級者(14,335ポイント)   Date: 2010/01/06(水) 10:59   No:45662     
Title: Re:どのファイルやフォルダを削除しても大丈夫なの?    
配布するためのフォルダを新規作成して
その中に実行ファイルと画像や音楽といったデータファイルをコピー、フォルダを圧縮して配布すれば良いかと
一応パスの間違いがないか動作確認はした方が良いかもしれません

LIBファイルを含め最初に挙げられていたファイルは
ゲームをプレイする分には消しても何も問題はないはずです

ただ、バグの修正をしたりさらに機能を追加するのならば
自分用としてプロジェクトのバックアップはとっておくことをお勧めします


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

Name: 御津凪 [URL]  ..ハッカー(136,862ポイント)   Date: 2010/01/06(水) 11:15   No:45664     
Title: Re:どのファイルやフォルダを削除しても大丈夫なの?    
配布する場合、ゲーム本体の実行ファイルと、そのゲームが使用しているファイルとフォルダが必要なファイルです。
つまり、ゲーム内で一切ファイルを使わないのなら、ゲーム本体の実行ファイル一つだけでOKです。

どうしても不安という場合は、別フォルダに必要そうなファイルとフォルダをコピーし、
そこで起動して問題ないことを確認すると良いでしょう。
そして不要そうなファイルを取り除いて起動を繰り返せば、要るものと要らないものがハッキリするはずです。


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

Name: bb  ..ぴよぴよ(0ポイント)   Date: 2010/01/06(水) 11:15   No:45665     
Title: Re:どのファイルやフォルダを削除しても大丈夫なの?    
そんなに消してもよいんですか・・・。勉強になりました。
先程、やりましたが確かに動きますね。
最後に二つおしえてください。
自分で作成したCPPファイルやヘッダーファイルもなくても動いたのですが
これも入れなくていいんですか?
あとパスが通ってなかったときの対処法ってありますか?

最後によろしくお願いします。


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

Name: DVDM [URL]  ..熟練のプログラマー(48,615ポイント)   Date: 2010/01/06(水) 15:41   No:45677     
Title: Re:どのファイルやフォルダを削除しても大丈夫なの?    
>>bb
>自分で作成したCPPファイルやヘッダーファイルもなくても動いたのですが
>これも入れなくていいんですか?

入れなくても大丈夫です。
他の人にプログラムを見せたいのであれば、入れておいても構いません。


>あとパスが通ってなかったときの対処法ってありますか? 
何のパスが通っていなかった時の対処法なのでしょうか?
どういうことを想定しているのかが良く分からないのですが、
例えば画像や音楽が指定したディレクトリにない場合はどうすればいいのかってことですかね。

また、別の問題なんですかね・・・。
だた、どう対処したいかによって変わってきそうなのでもう少し詳しく書いて頂けると幸いです。


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



Name: kms  ..初心者(8,301ポイント)   Date: 2010/01/02(土) 22:04   No:45402       
Title: 3Dでの処理について    
質問させて頂きます。

現在、2DでRPGを作成しているのですが(DXライブラリ)、
キャラクターと背景に3D的な奥行きを持たせることは可能ですか?

x,y座標の他に、z座標を持たせたいのですが。。
平面上に見える画像データを、立体的に見せたいのです。

初めは、「キャラクターを4方向に歩かせる」をじっくり読んでいたのですが、
3Dで処理する場合、ピクセル単位で歩かせるのでしょうか?
(3Dの最小の単位が解らないので、、)

或いは、z座標で奥行きを作った場合でも、今度はキャラクターの向きを処理するのが、
難しくなりそうですが。。

ご意見をお伺いしたいです。


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


Name: softya  ..比類無きプログラマー(79,640ポイント)   Date: 2010/01/02(土) 23:06   No:45408     
Title: Re:3Dでの処理について    
結局のところSFC程度で良いのか、FF10などの本格的な3Dを望んでいるのかで話が変わります。
カメラアングルが固定なら2Dでも3D風に見せることも出来ます。
少なくともRPGは、2Dでも完成させるのが難しいものなので、高望みをすると挫折する可能性が高くなりますね。3Dのアクションの経験が無いと難しいかもです。

※3Dのピクセルと言う単位はありません。
3Dはメーターとか距離の単位しかありませんので、メーター数とピクセル数を一致させることは出来ます。
10cm毎に1ピクセルとにして、歩く単位を10cm基準すれば良いだけです。
ただ、3Dマップデータを作るのは大変難易度が高いので、2Dの安易さで考えていると痛い目を見ます。


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

Name: kms  ..初心者(8,536ポイント)   Date: 2010/01/02(土) 23:30   No:45409     
Title: Re:3Dでの処理について    
お返事ありがとうございます。

一度、「龍神録プログラミングの館」で3D背景の技法を見、
ソースを拝見したのですが、これは難しいですね。
ただ、これをRPG風に作成したなら、面白いのではないか、と思ったのです。
カメラアングルは固定で、キャラクターがx,z座標を動き回る、というものです。

FF10のようなRPGは望んではいません。
一昔前のポリゴンで描かれたような、簡易なサンプルプログラムを作れたらな、
という願望ですね。

「龍神録プログラミングの館」の3Dの項目の背景を、
キャラクターに置き換えた感じです。


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

Name: softya  ..比類無きプログラマー(79,895ポイント)   Date: 2010/01/03(日) 00:14   No:45413     
Title: Re:3Dでの処理について    
>カメラアングルは固定で、キャラクターがx,z座標を動き回る、というものです。 
これはウィザードリィやダンジョンマスター風のイメージでしょうか?
※ 古いのでゲームの名前が分からないかも知れませんので動画サイトを紹介します。

古典タイプ
http://www.youtube.com/watch?v=0yPI9LMKGag&feature=related
http://www.youtube.com/watch?v=g3UdUWU4j1Y

完全3Dタイプ
http://www.youtube.com/watch?v=LI93iXQTAc4
http://www.youtube.com/watch?v=W5qo7yhfXkk

古典タイプは難易度はさほどでもありませんが、完全3Dだと難易度は高いです。
どちらでしょうか?

PS1の「クライムクラッカーズ」ですが、この程度でも難易度は高いですよ。
http://www.youtube.com/watch?v=dLrvfJmKu4w


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

Name: kms  ..中級者(9,290ポイント)   Date: 2010/01/03(日) 00:51   No:45418     
Title: Re:3Dでの処理について    
>これはウィザードリィやダンジョンマスター風のイメージでしょうか?

いえ、主観視点ではなく、客観的視点(俯瞰視点)です。
シューティングゲームで例えるならば、
FPSではなく、
TPS(サードパーソン・シューティングゲーム Third Person Shooting Game)
ですね。

まず、3Dの背景があり、そのなかをキャラクターが歩き回る感じなのですが。。
カメラは、キャラクターや背景を俯瞰しています。

簡潔にいえば、ただの3DRPGになってしまうのでしょうか。

例えば、一昔前に発売したRPG。
http://www.youtube.com/watch?v=fjLcrWCi2Mk&feature=related

これほどの完成度、とはいかなくても、
ドット絵で描かれたキャラクターが、3Dのダンジョンを探索する、
そんなイメージなのですが。。。

伺ったところ、ウィザードリィでも難易度が高いということなので、
上記のようなRPGは、技術的には不可能なのでしょうか?


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

Name: softya  ..比類無きプログラマー(80,025ポイント)   Date: 2010/01/03(日) 01:13   No:45419     
Title: Re:3Dでの処理について    
俯瞰視点ですね。
>上記のようなRPGは、技術的には不可能なのでしょうか?

龍神録の背景3Dの仕組みが理解出来るのなら作成可能そうですね。
キャラクタは2Dのまま(板ポリゴン)で出来るでしょう。
なんにしても、3Dの基本的な仕組みの理解が必須ですよ。

それとマップエディタは既存のものが使えないので、自前で作る必要ありです。
ちなみに、XZ平面を歩く必要が無くてXY平面を歩かせた方がイメージ的に後々楽になります。


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

Name: kms  ..中級者(9,601ポイント)   Date: 2010/01/03(日) 01:34   No:45422     
Title: Re:3Dでの処理について    
お返事、ありがとうございます。

>3Dの基本的な仕組みの理解が必須ですよ。

3Dの知識に関しては、「龍神録プログラミングの館」を熟読し、
自分でソースを書いていったほうが近道でしょうか?

一時、なんでも良いので、ドット絵のキャラクターが、
X,Y,Z座標を行き来するようなプログラムを書こうと思い、
龍神録のサンプルプログラムにキャラクターの画像と、X,Y,Z座標を加えた、
簡易なソースを追加したのですが、
キャラクターが画面内で拡大、縮小するだけでした(-Z,+Z等)。

やはり歩行に応じてキャラクターの向きを変えたり、
3Dの背景を俯瞰するカメラ視点を設置する方法などは、
書籍等を買うか、2Dから発展させた形で学ぶ方が良いのでしょうか?

何分、3Dの基本的な仕組み、というのがまだ馴染んでいませんので。。


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

Name: softya  ..比類無きプログラマー(80,240ポイント)   Date: 2010/01/03(日) 13:50   No:45447     
Title: Re:3Dでの処理について    
>3Dの知識に関しては、「龍神録プログラミングの館」を熟読し、
>自分でソースを書いていったほうが近道でしょうか?

何らかの本で3Dの勉強をした方が良いでしょうね。
行列、逆行列など使いこなせないと3D空間にスプライト平面キャラクタを違和感なく立たせる事自体が出来ませんしね。

例えばこんな本。「実例で学ぶゲーム3D数学」
http://www.amazon.co.jp/dp/4873113776/
あたりを読む必要があるかと。

>キャラクターが画面内で拡大、縮小するだけでした(-Z,+Z等)。
3Dのカメラと空間座標の概念が分かっていないとそうなると思います。
概念は、こんな感じです。↓
http://sorceryforce.com/xna/tips_abouttransform3d.html

>やはり歩行に応じてキャラクターの向きを変えたり、
>3Dの背景を俯瞰するカメラ視点を設置する方法などは、
>書籍等を買うか、2Dから発展させた形で学ぶ方が良いのでしょうか?

プログラムして色々試すのは良いことだと思います。

幾つか質問があるのですが、
(1)2D空間でマップ背景にスプライトを使ったものは作れますか?
(2)2D空間でマップ背景を回転させることは出来ますか?
※ 自キャラは画面の真ん中で上を向いたままとします。左右のキーでマップ自体を回転させます。
※ 回転しつつも、移動の当たり判定はちゃんとすること。
最低限これを作れないと3Dは無理だと思います。



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

Name: kms  ..中級者(9,713ポイント)   Date: 2010/01/03(日) 15:10   No:45455     
Title: Re:3Dでの処理について    
お返事ありがとうございます。

紹介して下さった書籍やホームページ、拝見しました。
「座標変換」という単語すら知りませんでした。。

3Dのサンプルソースを最近、意識して書いたり、見たりしているのですが、
一番解らないのは、3Dの、最低限記述するソースコードです。
どこから、どこまで2Dを応用し、どこからどこまでが3Dなのか。
或いは、座標変換をどこで行っているのか? です。

>幾つか質問があるのですが、 
>(1)2D空間でマップ背景にスプライトを使ったものは作れますか? 
>(2)2D空間でマップ背景を回転させることは出来ますか?

正直、難しいです。やはり3Dを作るのは無理なのでしょうか。
とりあえず、2Dと並行して、ちょっとしたサンプルから手を出そうと思っていたのですが。。


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

Name: softya  ..比類無きプログラマー(80,649ポイント)   Date: 2010/01/03(日) 16:04   No:45460     
Title: Re:3Dでの処理について    
>3Dのサンプルソースを最近、意識して書いたり、見たりしているのですが、
>一番解らないのは、3Dの、最低限記述するソースコードです。

DXライブラリのは、かなり簡単に記述出来ますよ。
3D背景を作ってみようなんて、かなり簡単に記述できています。

>どこから、どこまで2Dを応用し、どこからどこまでが3Dなのか。

DrawPolygon3Dを使っている限り3D空間ですよ。
カメラ関数とライト関数の使い方は覚えましょう。
これが出来ないとPS1レベルのポリゴン表示もおぼつきません。

>或いは、座標変換をどこで行っているのか? です。 

DrawPolygon3Dで登録すれば自動的に行なってくれます。
何処でどうなっているかは知識が増えてからで良いでしょう。

>正直、難しいです。やはり3Dを作るのは無理なのでしょうか。
>とりあえず、2Dと並行して、ちょっとしたサンプルから手を出そうと思っていたのですが。。

座標変換の概念は理解して欲しいですね。
基礎技術力のレベルを上げないと3Dでは混乱するだけです。
一歩づつ基礎を固めて下さいね。


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

Name: kms  ..中級者(9,830ポイント)   Date: 2010/01/03(日) 18:52   No:45470     
Title: Re:3Dでの処理について    
ありがとうございます。

softya様の助言通り、精進します。

現在は、3Dに関する数学、物理学の勉強をしています。

僕は応用が苦手なのですが、
3DRPGに於いて、よく用いられる数学や物理学(公式や概念)は何なのでしょうか?
また、どういった場合に、どういった式や概念を必要とするのでしょうか?
そこが少し気になっています。 編集済み


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

Name: softya  ..比類無きプログラマー(80,816ポイント)   Date: 2010/01/03(日) 20:46   No:45476     
Title: Re:3Dでの処理について    
>3DRPGに於いて、よく用いられる数学や物理学(公式や概念)は何なのでしょうか? 

格闘・アクションゲームで無い限り物理学は特にないですね。
光学的な知識が必要ですけどね。
http://ja.wikipedia.org/wiki/%E5%85%89%E5%AD%A6

数学は、「実例で学ぶゲーム3D数学」に出てくる物は基本的に必要だと思って下さい。
格闘・アクションゲームになると当たり判定で更に別の数学が必要になりますが、RPGなら必要ないでしょう。

>また、どういった場合に、どういった式や概念を必要とするのでしょうか? 

移動データはベクトルで持ち、座標変換には行列です。
ワールド座標系、ローカル座標系、回転移動、平行移動、カメラの透視変換(カメラの画角)全てが行列演算で求められますので、理解出来ていないと思うように動かせません。

>僕は応用が苦手なのですが、 
2Dの座標の回転変換の方法も分からないみたいですが、これは高校の数学の教科書にも出てくるレベルです。
まず、自在に2Dマップを回転させてみてはどうでしょうか?


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

Name: kms  ..中級者(10,188ポイント)   Date: 2010/01/04(月) 15:17   No:45487     
Title: Re:3Dでの処理について    
お返事、大変遅くなり申し訳ありません。。

>まず、自在に2Dマップを回転させてみてはどうでしょうか?

はい。二次元の回転ということで、下記の行列を用意しました。

X'    cos, -sin, 0,  X
Y' =  sin,  cos, 0,  Y
1     0,    0,   1,  1
(見にくくてすみません)。 これを二次元の回転ということで、 元の座標から90度回転させたいのですが、 下記の構造体からどう反映させていけば良いか悩んでいます。
typedef struct Matrix{
    float temp;
    float result;
}Matrix;
         Matrix index[3][3];

    index[0][0].temp = cos;
    index[1][1].temp = cos;
    index[2][2].temp = 1;

    index[0][1].temp = -1 * sin;
    index[1][0].temp = sin;

    return result;


回転させたい2Dマップは、添付したサンプルプログラムです。
不適切な質問でしたら、削除お願い致します。 編集済み


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

Name: softya  ..比類無きプログラマー(81,079ポイント)   Date: 2010/01/04(月) 18:13   No:45494     
Title: Re:3Dでの処理について    
とりあえず見て思ったのは、マトリックス構造体で配列にした方がすっきりしますね。
typedef struct Matrix2D{
 float m[3][3];
}
Matrix2D temp;

あとはプログラムに成っていませんので、何処が分からないんでしょうか?
私としては座標と角度を引数として持つ座標変換関数で良いと思うのですが。
戻り値も構造体で、座標を返します。


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

Name: kms  ..中級者(10,329ポイント)   Date: 2010/01/04(月) 18:35   No:45496     
Title: Re:3Dでの処理について    
お返事ありがとうございます。

>あとはプログラムに成っていませんので、何処が分からないんでしょうか?

・どのように計算式を記述したら良いのかがわからない、故にプログラムになっていない感じです。。
上記の行列に従って、配列に数値やcos,sinを代入したものの、
その後の記述がなんとも漠然としており、
どうしたら良いのかが解りません。

自分としては、2Dマップを90°回転させたいのですが、
後に続く関数?計算式?が解らないのです。。

例えば、元の座標を計算式に代入し、結果、90°マップを回転させたいのです。
簡潔に述べますと、2次元の行列による、
マップの回転のソースコードの記述の仕方が解りません。。

>座標変換関数

座標変換関数とは、具体的にどういったものなのでしょうか? 編集済み


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

Name: softya  ..比類無きプログラマー(81,292ポイント)   Date: 2010/01/04(月) 19:03   No:45503     
Title: Re:3Dでの処理について    
>座標変換関数とは、具体的にどういったものなのでしょうか?
言葉足らずでしたね。
座標変換関数を作れば良いって意味です。

>上記の行列に従って、配列に数値やcos,sinを代入したものの、 
角度の無いsinやcosはありませんよ。
sin,cos関数の使い方は理解されていますか?

>その後の記述がなんとも漠然としており、
>どうしたら良いのかが解りません。

行列の計算方法は分かりますか?
まず、そこが分からないと話になりません。
X'と Y'を求める式を書いてみて下さい。


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

Name: kms  ..中級者(10,411ポイント)   Date: 2010/01/04(月) 19:42   No:45513     
Title: Re:3Dでの処理について    
>sin,cos関数の使い方は理解されていますか?

僕が読んだ限りなのですが、

[度で表した角 × (π/180) = ラジアンで表した角]

なので、sinの90°のラジアンを求める場合、

sin(90*π(3.14159)/180)でしょうか?

同様に、cosは、

cos(90*π(3.14159)/180)でしょうか?

>X'と Y'を求める式を書いてみて下さい。

[x', y'] = [x , y] + [dx , dy]、でしょうか?


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

Name: softya  ..比類無きプログラマー(81,379ポイント)   Date: 2010/01/04(月) 19:57   No:45514     
Title: Re:3Dでの処理について    
sinとcosは大丈夫ですね。

でも、
>[x', y'] = [x , y] + [dx , dy]、でしょうか?
は行列の演算では無いですよ。
dx,dyなんて突然出現してますよ。
自分で書かれた行列式の計算ですよ?


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

Name: kms  ..中級者(10,712ポイント)   Date: 2010/01/04(月) 20:23   No:45516     
Title: Re:3Dでの処理について    
>自分で書かれた行列式の計算ですよ?

X'    cos, -sin, 0,  X
Y' =  sin,  cos, 0,  Y
1     0,    0,   1,  1
を前提とした場合、 90°回転させるのであるから、
X'    cos90, -sin90, 0,  X     0, -1, 0,  X
Y' =  sin90,  cos90, 0,  Y  =  1,  0, 0,  Y
1         0,      0, 1,  1     0,  0, 1,  1


すみません。。ここまでしか理解できていません。
後は、二次元の物体を90°回転させる為、頂点を上記の式に代入し、
新しい位置の座標を求めることぐらいしか。。

なのでこれをどうC言語のソースに置換したらいいのか、わからないのです。。
何故、90°が1になるのかも。。
申し訳ないです。。 編集済み


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

Name: softya  ..比類無きプログラマー(81,570ポイント)   Date: 2010/01/04(月) 20:34   No:45518     
Title: Re:3Dでの処理について    
>なのでこれをどうC言語のソースに置換したらいいのか、わからないのです。。
>申し訳ないです。。

いえ、ソースプログラム以前に数学として行列式を理解出来ている必要があります。
数学として理解して始めてプログラムに出来るわけで、ソースコードはまだ早いです。

行列式がまったく分かりませんか?
これとか回答できます?
http://www.geisya.or.jp/~mwm48961/kou2/matrix2.html
高校の教科書を見直してみて下さい。
※ 年齢が分からないので、まだだったら、ごめんなさい。



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

Name: kms  ..中級者(10,934ポイント)   Date: 2010/01/04(月) 21:08   No:45520     
Title: Re:3Dでの処理について    
>行列式がまったく分かりませんか?

まったく、ではないのですが、
行列の足し算と引き算なら出来ますね。。
掛け算はちょっと法則性を見いだすのに時間がかかります。

2×2型の行列の掛け算は、


          a00 a01
行列A=  a10 a11


          b00 b01
行列B= b10 b11

          (a00 b00 + a01 b10)  (a00 b01 + a01 b11)
A+B= (a10 b00 + a11 b10)  (a10 b01 + a11 b11)




という公式を覚えているところです。

高校時代は、諸事情あり勉学にあまり触れていなかったですね。。


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

Name: softya  ..比類無きプログラマー(81,623ポイント)   Date: 2010/01/04(月) 21:44   No:45523     
Title: Re:3Dでの処理について    
こっちを見逃していましね。
>何故、90°が1になるのかも。。 

ここらへんを読んで貰うと分かるかな。
http://www8.plala.or.jp/ap2/suugaku/sankakukansuunoshoho.html

2×2型の積が分かるなら2x2と2x1の積もわかりますよね。

          a00 a01
行列A=  a10 a11

          b0
行列B= b1

これが分かるなら
3x3と3x1の積に発展させるだけです。


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

Name: kms  ..中級者(11,041ポイント)   Date: 2010/01/04(月) 22:01   No:45525     
Title: Re:3Dでの処理について    
>2×2型の積が分かるなら2x2と2x1の積もわかりますよね。


A+B= (a00 + b0)  (a01 + b1)
          (a10 + b0)  (a11 + b1)


でしょうか?

>3x3と3x1の積に発展させるだけです。

しかし、これら行列の計算を、どうゲームに応用するのでしょうか?


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

Name: softya  ..比類無きプログラマー(81,951ポイント)   Date: 2010/01/04(月) 22:26   No:45528     
Title: Re:3Dでの処理について    
A+B= (a00 + b0)  (a01 + b1)
          (a10 + b0)  (a11 + b1)

ちがいます。積と和の関係が逆になっています。

>しかし、これら行列の計算を、どうゲームに応用するのでしょうか?
例えば四角形があったとして、4つの頂点の座標をこの行列式で回転移動させれば回転後の頂点位置が分かりすよね?
その頂点を結んだ線を書けば回転する四角形が書けることになります。マップも四角形の集まりですので、四角形の回転がうまく操つれれば、マップ全体をぐるぐる回転する事も出来るわけなんです。
ただし、今の行列式を単純に使っただけではマップの回転は色々と問題が出てきます。
そこを自分で苦労しもらうことで座標変換の概念を理解して欲しいですね。


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

Name: kms  ..中級者(11,204ポイント)   Date: 2010/01/04(月) 22:57   No:45530     
Title: Re:3Dでの処理について    
>積と和の関係が逆になっています。

すみません。まだ理解していないようです。
この問題だけ、正しい解答を教えては頂けませんか?

>ただし、今の行列式を単純に使っただけではマップの回転は色々と問題が出てきます。 
>そこを自分で苦労しもらうことで座標変換の概念を理解して欲しいですね。

ありがとうございます。
明日、書籍を購入して勉強します。
座標変換にここまで悩むとは正直思ってもみませんでしたので、
なんとか自力で理解してみようと思います。


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

Name: softya  ..比類無きプログラマー(82,033ポイント)   Date: 2010/01/04(月) 23:17   No:45532     
Title: Re:3Dでの処理について    
>すみません。まだ理解していないようです。
>この問題だけ、正しい解答を教えては頂けませんか? 

まず、2x2と2x1の積は2x1の行列になります。
それとこの問題は積ですので
A*B= a00*b0 + a01*b1
         a10*b0 + a11*b1

となります。

こちらも参考にして下さい。1x2の行列との積ですので混乱する可能性もありますが。
http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?3D%BA%C2%C9%B8%CA%D1%B4%B9


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

Name: conio [URL]  ..比類無きプログラマー(77,203ポイント)   Date: 2010/01/04(月) 23:18   No:45533     
Title: Re:3Dでの処理について    
>>>何故、90°が1になるのかも。。
「90°が1になる」のではなく、「sin90°が1」になります。

公式もあるのですが、丸暗記せずに

---------------------------------------------------------
【1】単位円を書く (半径1の円)
【2】任意の角度に点を打つ
【3】cosは、その点のX座標を、sinは、その点のY座標を見る
---------------------------------------------------------
このようにやれば分かると思います。

例えば90°だと、単位円の真上の部分になります。
ここはY座標 = 1、X座標 = 0 となるので、
---------
cos = 0
sin = 1
---------
となります。

同じように0°の場合は、
---------
cos = 1
sin = 0
---------
となります。


あと45°、60°、30°の場合は、任意の角度の点から
円の中心に向かう線とX軸に直交する線を引き、直角三角形を描いて
---------------------
sin は 側辺/斜辺
cos は 底辺/斜辺
---------------------
を計算すればOKです。 編集済み


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

Name: kms  ..中級者(11,562ポイント)   Date: 2010/01/05(火) 00:26   No:45540     
Title: Re:3Dでの処理について    
softya様、conio様、お返事ありがとうございます。

>こちらも参考にして下さい。1x2の行列との積ですので混乱する可能性もありますが。

このようなサイト様があったのですね。
非常にわかりやすく解説されていて、読んでいて唸ってしまいました。
一読ではまだ頭に入りきらないので、何度も読んでみますね。
問題は、行列の計算ですね。。
行列に特化した計算書等、あれば良いのですが。。

>公式もあるのですが、丸暗記せずに 
>--------------------------------------------------------- 
>【1】単位円を書く (半径1の円) 
>【2】任意の角度に点を打つ 
>【3】cosは、その点のX座標を、sinは、その点のY座標を見る 
>--------------------------------------------------------- 
>このようにやれば分かると思います。

ありがとうございます。
これは判りやすいですね。
なるほど、sin90°が1になる理由が解りました。
やっと、回転行列に記述されている1と0の意味が理解できました。
ご丁寧な解説、本当に助かります。。

とりあえず、行列式、ですね。。


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

Name: Ma  ..プログラマー(26,236ポイント)   Date: 2010/01/05(火) 01:38   No:45547     
Title: Re:3Dでの処理について    
DXライブラリの最新版を使用すると仮定します。

現在、3DでRPG系のゲームを作っている方を知っていますが、彼はソースを公開しています。

私が思うには楽しむ程度で3Dゲームを作るというならば、皆さんが言っているような行列の計算などの学力は
ほぼ必要ありません。
ただ、本格的に3Dを作る場合は別ですが。。。

最近のDXライブラリはかなり簡単に3Dゲームを作れます。
三角関数と内積、外積、ベクトルを使えれば(高校生レベル)安易にできちゃいます。

http://www.nicovideo.jp/watch/sm9115910
こちらが例のゲーム(ニコニコ動画)。

あまり、ソースに細かい説明がないので、何をやっているのか考える必要はありますが、先ほど言った事を応用したレベルまでの数学(または物理)で理解可能です。

リンクは、「その4」ですので、ソースを見始めるなら「その1」からをお勧めします。

参考までに。


ちなみに、内積と外積を使って3D空間での音を表現(遮蔽物なし/反響なし)とか先日やりました。


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

Name: kms  ..中級者(12,234ポイント)   Date: 2010/01/05(火) 07:54   No:45554     
Title: Re:3Dでの処理について    
Ma様、ご紹介ありがとうございます。

動画を拝見しました。

これは凄いですね。DXライブラリでここまで出来るとは驚きました。

>私が思うには楽しむ程度で3Dゲームを作るというならば、
>皆さんが言っているような行列の計算などの学力は 
>ほぼ必要ありません。 
>ただ、本格的に3Dを作る場合は別ですが。。。 

自分の場合は、変なところで完璧主義者なので、
楽しむ程度の3Dゲームでも、それに関する知識は、
どうしても本格的に得ようとしてしまうんですね。
そもそも、自分は、3Dを理解するには、それに関する、あらゆる数学、物理学の知識を
知りたい、という欲求が根本にありますので、
自分の場合、あくまで自分の場合はですが、
楽しむ程度でも、本格的でも、
こういった知識は身につけておこうという思いが強いですね。
ただ、高校時代に得られなかった知識を、
どこかで補完しようという願望が強いだけなのかもしれませんが。。

>リンクは、「その4」ですので、ソースを見始めるなら「その1」からをお勧めします。 
>参考までに。

全部拝見したのですが、グラフィックはここまで出来るのですか?
純粋に驚いたのですが、自分は高校数学レベルも覚束ないので、びっくりです。
ちょっと勇気が沸きました。

くどいようで申し訳ないのですが、3Dの初歩としては、
DXライブラリのどの関数(サンプルプログラム)から入ったほうが
勉強になりますでしょうか?
例えば、カメラの視点、注視点、上方向を設定する関数から、や、
DrawLine3D関数、DrawPolygon3D関数など。 編集済み


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

Name: softya  ..比類無きプログラマー(82,174ポイント)   Date: 2010/01/05(火) 11:11   No:45564     
Title: Re:3Dでの処理について    
>くどいようで申し訳ないのですが、x,yを回転させる為のsin,cos関数の他に、
>z座標(奥行き)をぐるぐると回る関数の記述の仕方は、
>どういったものなのでしょうか?

Z方向の回転もsin,cosですよ。
2次元だと行列が3x3ですが、3次元だと4x4になるだけです。
http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/basic3d.html


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

Name: Ma  ..プログラマー(27,453ポイント)   Date: 2010/01/05(火) 11:26   No:45567     
Title: Re:3Dでの処理について    
>全部拝見したのですが、グラフィックはここまで出来るのですか?
3D系のグラフィックのことでしょうか?
 
ミクなど踊っているデータは、例の動画の作者さんが作ったものではなくMMDで使われているデータの流用かと思われます。
(3Dアニメや人間の3Dモデルの作成は、私も含めた未経験者にはかなり時間がかかると思います。)

アニメや人間の3Dモデルは流用でも、地形や遠地の風景のグラフィックスは自作だと思います。
これらは学力関係なく作ることができますが、3Dモデリング用のソフトの操作方法に慣れる必要があります。
(平地を作るぐらいなら慣れてなくてもすぐできるでしょうが。)
フリーなら、3Dモデル(地形もこれ)を作成できるメタセコイアをお勧めします。


>3Dの初歩としては、 
>DXライブラリのどの関数(サンプルプログラム)から入ったほうが 
>勉強になりますでしょうか? 

ひとつやふたつの関数だけに注目するよりもサンプルプログラムを理解するように努めたほうが、
関数の意味がより分かりやすいと思います。

DXライブラリ公式にある3Dサンプルプログラムがふたつあります。(30 と 31)
http://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3Dmeiro.html

これらのサンプルから理解する、というのはどうでしょうか?
分からない関数がでてきたらDXライブラリのリファレンスを見て理解できると思います。

これが終わったらリファレンスに乗っている関数で興味がある関数からよんでいけばいいとおもいます。



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

Name: kms  ..中級者(12,285ポイント)   Date: 2010/01/05(火) 11:40   No:45569     
Title: Re:3Dでの処理について    
>softya様

例えば、添付した画像の原点(0,0,0)を中心に、
ぐるぐると回転させる事は可能でしょうか?
うまく説明できず歯がゆいのですが、
原点の座標は変えずに、x,y軸を回転させる感じです。
z軸は動きません。
(ああ、なんと云ったら良いのでしょう。。
正確には、横軸を回転させ、縦軸は動かさないといった感じなのですが。。)
これも行列による演算でしょうか?

>Ma様

ご丁寧なお返事、ありがとうございます。

>DXライブラリ公式にある3Dサンプルプログラムがふたつあります。(30 と 31) 
>これらのサンプルから理解する、というのはどうでしょうか? 
>分からない関数がでてきたらDXライブラリのリファレンスを見て理解できると思います。

ありがとうございます。
一応、自分でもサンプルプログラムを組んでいますので、
それと照らし合わせながら勉強したいと思います。 編集済み


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

Name: softya  ..比類無きプログラマー(82,714ポイント)   Date: 2010/01/05(火) 11:47   No:45572     
Title: Re:3Dでの処理について    
>私が思うには楽しむ程度で3Dゲームを作るというならば、
>皆さんが言っているような行列の計算などの学力は
>ほぼ必要ありません。 

私は最低限は必要だと思うのですが。
行列が分からないとDXライブラリの3D系の算術演算関数の意味が分からないので、思うことが出来ないことに成りかねません。
例えばビルボード表示しようと思ったら、カメラ回転系の逆行列が必要じゃないですか。
http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%A5%D3%A5%EB%A5%DC%A1%BC%A5%C9#w8cf1d9a
kmsさんは、キャラはスプライトで表現しようと思っているはずなので(違っていたらすいません)
ビルボードする為の知識は必要だと思いますが。

>例えば、添付した画像の原点(0,0,0)を中心に、
>ぐるぐると回転させる事は可能でしょうか?
>うまく説明できず歯がゆいのですが、
>原点の座標は変えずに、x,y軸を回転させる感じです。
>z軸は動きません。
>これも行列による演算でしょうか? 

それは、Z軸回りの回転ですね。
当然行列演算します。
参考リンク先には「Z軸に関する回転」の行列が書かれていますよね。それです。
http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/basic3d.html


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

Name: kms  ..中級者(12,487ポイント)   Date: 2010/01/05(火) 13:05   No:45578     
Title: Re:3Dでの処理について    
softya様、参考リンク、ありがとうございます。

とりあえず、3D空間に、モデルと線を描画したのですが、
キー入力によって、モデルを動かす場合は、行列演算ですよね?

DXライブラリの本家サイト様の関数リファレンスを拝見したのですが、
確かに行列変換の関数はあるのですが、
キー入力によって移動させる方法がわからないのですが。。 編集済み


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

Name: softya  ..比類無きプログラマー(82,795ポイント)   Date: 2010/01/05(火) 16:04   No:45604     
Title: Re:3Dでの処理について    
プログラムを見ましたが、この場合は行列を使わなくても移動出来ますよ。
それとメインループ中に「3Dモデルの読み込み」があるのは良くないです。
これで移動プログラムが組めないのは、C言語の基礎力不足かと思います。
もしかして、2Dでも自力で組めないのではないですか?


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

Name: conio [URL]  ..比類無きプログラマー(77,555ポイント)   Date: 2010/01/05(火) 16:40   No:45608     
Title: Re:3Dでの処理について    
>>キー入力によって、モデルを動かす場合は、行列演算ですよね?
キー入力と行列演算は何の関係もありません。

別にキー入力が無くても 行列演算でモデルを動かせますし、
キー入力判定をする際には必ず行列演算、といった決まりは無いです。


>>キー入力によって移動させる方法がわからないのですが。。
基本的にプログラミングは、様々な処理を組み合わせて 任意の動作をする処理を作り出します。

------------------------------------------
【1】キー入力でモデルを動かす関数
【2】マウスクリックでモデルを動かす関数 
------------------------------------------
みたいなものはありません。

【1】ならば、
------------------------
・キー入力を判定する処理
・モデルを動かす処理
------------------------
をif文か何かで組み合わせて実装したりしますし、


【2】も同様に、
------------------------
・マウスの状態を判定する処理
・モデルを動かす処理
------------------------
をif文か何かで組み合わせて実装します。


何でもかんでも「特定の1つの関数が存在し、それを呼び出せば終わり」という考え方は誤りです。
パーツ(関数など)を組み合わせ、自分で作ってください。 編集済み


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

Name: kms  ..中級者(13,072ポイント)   Date: 2010/01/05(火) 18:34   No:45615     
Title: Re:3Dでの処理について    
conio様へ

僕は、
「何でもかんでも「特定の1つの関数が存在し、それを呼び出せば終わり」という」
考え方は持ってはいませんよ。

>基本的にプログラミングは、様々な処理を組み合わせて 任意の動作をする処理を作り出します。

これも心得ているつもりですし、
僕が質問したかったのは、 
------------------------ 
・キー入力を判定する処理 
・モデルを動かす処理 
------------------------ 
における、キー入力とモデルを動かす処理の関係性です。
具体的に書かなかった僕が悪いのは認めます。ごめんなさい。
しかし、
「何でもかんでも「特定の1つの関数が存在し、それを呼び出せば終わり」という」
考え方、を僕が持っている、という何の根拠もない事実を前提としたその言い方は、
心外ですね。
確かに僕は馬鹿ですが、馬鹿だから、純粋に質問しているつもりです。
何を以て、そういった考え方を持っていると思ったのですか?

>これで移動プログラムが組めないのは、C言語の基礎力不足かと思います。 
>もしかして、2Dでも自力で組めないのではないですか?

2Dは、自力で組んだ覚えもあるのですが、
結局、ゲームプログラミングの館をお手本にしてしまった感もありますし、
質問に頼ってしまった感もあります。
本当に解らなかったのも事実です。

解らなかった箇所は、C言語の文法というよりも、数学的な箇所でした。

3Dに関しては、softya様のアドバイス以外は、正直、殆ど解りません。

キー入力をif文に分け、ベクトルの演算を組み込んだものの、
やはりsoftya様のいう「C言語の基礎力不足」の所為か、
キャラクターのようにうまくは動いてくれませんでした。

例えば、下記のように組み込んでも、

if( CheckHitKey( KEY_INPUT_UP ) == 1 )
        {
            MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, 200.0f ) ) ;
        }


当たり前ですが、一瞬で移動するだけですよね。

それと、僕の記事を読んで、不快な気持ちになる方もいらっしゃると思いますので、
そのときは、記事を削除したいと思います。 編集済み


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

Name: softya  ..比類無きプログラマー(83,084ポイント)   Date: 2010/01/05(火) 19:20   No:45616     
Title: Re:3Dでの処理について    
動くようにしてみました。
pc_test1.mqoは持っていないのでkabe.mqoを代用に使っています。
そのため、カメラが引きすぎかもしれません。
ソースをご自分のと見比べて直してもらえればと思います。

>確かに僕は馬鹿ですが、馬鹿だから、純粋に質問しているつもりです。
>何を以て、そういった考え方を持っていると思ったのですか? 

そう思って質問してくる人がここでは多いからですね。
conioさんにも悪意があったとは思えませんので、気分を害さずに受け止めていただければと思います。
あと、世の中には何でもサンプルコードあると思っている困った人もいます。そんな人達に慣れていると先読みして一言添えちゃう事が多々あります。

>やはりsoftya様のいう「C言語の基礎力不足」の所為か、
>キャラクターのようにうまくは動いてくれませんでした。 

ソースを見てもらうと分かるのですが、2Dの時の処理と特段変わるものではありません。
何処で分からなくなったか、言ってもらえると疑問にお答えしますよ。



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

Name: kms  ..中級者(13,518ポイント)   Date: 2010/01/05(火) 19:42   No:45617 解決!     
Title: Re:3Dでの処理について    
>conioさんにも悪意があったとは思えませんので、気分を害さずに受け止めていただければと思います。
>世の中には何でもサンプルコードあると思っている困った人もいます。そんな人達に慣れていると先読みして>一言添えちゃう事が多々あります。 

申し訳ありません。そういう事だったのですか。。
僕が、わからない、わからない、と質問の連続だったので、
本当に申し訳ないと思います。ごめんなさい。。
ただ、解らないまま、解決をチェックするのも失礼だと思ったのです。

>ソースを見てもらうと分かるのですが、2Dの時の処理と特段変わるものではありません。 
>何処で分からなくなったか、言ってもらえると疑問にお答えしますよ。 

数式云々に捕らわれていて、難しく考えすぎていたようなのです。
解らなくなったのは、やはり2Dから3Dへ移行する際に、関数が色々と変わりますので、
それで混乱していたのだと思います。
softya様の書いて下さったソースを見て納得しました。
本当に2Dの頃と、特段変わった点は見受けられないです。
pos変数をMV1SetPosition関数の引数に渡せたのですね。。
おそらく、3D関数の使い方が頭に入っていないのでしょうね。僕は。

本当に申し訳ありませんでした。。 編集済み


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

Name: conio [URL]  ..比類無きプログラマー(77,774ポイント)   Date: 2010/01/05(火) 20:05   No:45618     
Title: Re:3Dでの処理について    
>>確かに僕は馬鹿ですが、馬鹿だから、純粋に質問しているつもりです。 
>>何を以て、そういった考え方を持っていると思ったのですか? 


------------------------------------------------------------
>>キー入力によって、モデルを動かす場合は、行列演算ですよね? 
------------------------------------------------------------
それは上記のコメントから判断しました。


このコメントから、
--------------------------------------------------------
「特に因果関係の無い処理を、1つのものとして考えている」
「一連の処理を、細かい処理単位に分割しきれていない」
--------------------------------------------------------
もしかすると 上記のように考えて詰まっているのかもしれない、と思ったのです。
違っていたのであれば失礼しました。 編集済み


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

Name: Ma  ..プログラマー(27,801ポイント)   Date: 2010/01/06(水) 11:44   No:45667     
Title: Re:3Dでの処理について    
返事が遅れました。失礼><

>>私が思うには楽しむ程度で3Dゲームを作るというならば、 
>>皆さんが言っているような行列の計算などの学力は 
>>ほぼ必要ありません。 

>私は最低限は必要だと思うのですが。 
>行列が分からないとDXライブラリの3D系の算術演算関数の意味が分からないので、思うことが出来ないことに成りかねません。 
>例えばビルボード表示しようと思ったら、カメラ回転系の逆行列が必要じゃないですか。 

経験浅はかな身ですが自身の勉強のためにも自分のやり方を書いてみます。

おそらくビルボード表示に行列は有効というか高効率だと思いますが、(実はプログラムで行列やったことがない…)
行列を使わないでもビルボードできると思います。
カメラのx-y平面における角度、x-z平面における角度を元に、ビルボードする平面の角度を求めて、適度な距離に描画することで私はビルボードを実現しました。

そのために、行列の知識が無くても例の動画レベルの3Dゲームは作れるはず と書思いました。
無論、行列をうまく使う方法を知っておくことに越したことはないのでしょうがw(自分に言ってます。)
正直自分も行列を学ぶべき身です。


ちなみに、行列なしで私が(DXライブラリで)3Dゲームを作る場合で、カメラを更新するためには
プレイヤーの情報(構造体かクラス)に
 x,y,z (位置座標)
 カメラのx-y平面における角度、x-z平面における角度(水平な角度と縦の角度)
の計5つの要素を最低限持たせています。


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



Name: へたれ  ..かけだし(1,159ポイント)   Date: 2010/01/05(火) 21:29   No:45624       
Title: 13章について    
現在、龍神録プログラミングの館のプログラムをそのまま書き込んでいるのですが
13章の敵にショットを撃たせてみようで
shot.cpp(31) : error C3861: 'shot_calc': 識別子が見つかりませんでした
となり、このエラーが解消できません
何が原因なのかがわかりません
コードにうち間違いは無いと思うのですが、原因がわかる方はいらっしゃいますか?


環境は
Visual C++ 2008
XP
です

あと13章に
--- shotH.cpp に以下を追加 ---
という同じコードと思われるもの?が2つあるのですが、何か意味はあるのですか?
2つ書きこむとエラーがでるので1つ消しましたが、よかったのでしょうか?


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


Name: wing  ..入門者(3,465ポイント)   Date: 2010/01/06(水) 00:21   No:45650     
Title: Re:13章について    
void shot_main(){
......
}
の下に
void shot_calc(int n){
.....
}
を書いていませんか?
上に書けばOKです。


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

Name: へたれ  ..かけだし(1,203ポイント)   Date: 2010/01/06(水) 01:06   No:45652     
Title: Re:13章について    
void shot_main(){ 
...... 
}

void shot_calc(int n){ 
..... 
}
の順番を入れ替えたら動作しました

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

習うより慣れろという考えかたでプログラム勉強し始めましたが
やはり、基礎はしっかり覚えた方がいいのでしょうか?
いちようやさしいC++を読んだのですがいまいちピントこないんで…

質問ばかりですいません


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

Name: wing  ..入門者(3,822ポイント)   Date: 2010/01/06(水) 10:04   No:45658     
Title: Re:13章について    
今回の問題点は、プログラムは上から下へ順番に実行されるということです。
void shot_main()の中でshot_calc()が呼ばれても、まだ定義されていないので
分かりません、というエラーです。

順番を入れ替える以外にも解決する方法はありました。
shot.cppの上のほうにvoid shot_calc(int n);と宣言すればOKです。
でも龍神録の場合は、function.hにGLOBAL void shot_calc(int n);と書くのがいいですね。
しかし、今回の場合は入れ替えるのが一番いい方法です。

こういうことはエラーをしながら覚えてゆけば良いんじゃないでしょうか。
多少理解できないことがあっても先へ進んでいくうちに分かってくることもあります。

分からないことは質問してください。
龍神録プログラミングの館にお世話になった人は、親切に教えてくれますよ。


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



Name: ようすけ  ..中級者(9,655ポイント)   Date: 2010/01/04(月) 14:37   No:45486       
Title: 3Dによるエフェクトについて    
お邪魔します。

今現在、DXライブラリで3Dゲームを制作しているのですが、わからないことがあるので質問させて下さい。

今3Dによるエフェクト(光ってるやつ)を3Dモデルとして制作したのですが、(Xファイルです)いざ
ファイルを読み込むと光ってるはずのモデルが光ってなく表示されてしまいます。

これはどうしてでしょうか?

何か専用の関数でもあるのでしょうか?

環境は

VISTA
BCCdeveloperです。

説明が下手ですが3D関係に詳しい方いらっしゃいましたらよろしくお願いします。



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


Name: Justy  ..伝説なるハッカー(490,947ポイント)   Date: 2010/01/04(月) 15:39   No:45488     
Title: Re:3Dによるエフェクトについて    
 使ったモデリングソフトと、それを使ってどうやって光らせた(つもり)で、
最終的にどういう状態になれば光ったことになるのかを説明しないと
誰も答えられないかと。


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

Name: ようすけ  ..中級者(9,879ポイント)   Date: 2010/01/04(月) 21:30   No:45522     
Title: Re:3Dによるエフェクトについて    
失礼しました。

ツールはご存じないとおもいますがパーツアセンブラというツールです。

画像を貼り付けましたが、左が3Dモデルエフェクトで作ったやつで、
実際プログラムを組むと右のように単色?で表示されてしまい困ってます。

左のように光ってほしいのです。


voad hikari(){ 

hikariHandle = MV1LoadModel( "hikari.x" ) ;
       
MV1SetPosition(hikariHandle, VGet(hikarix, hikariy, hikariz ) ) ;
           MV1SetDifColorScale( hikariHandle, GetColorF( 1.0f, 1.0f, 1.0f, 1.0f ) ) ;          MV1SetMaterialDrawBlendMode(hikariHandle, 0, DX_BLENDMODE_ADD ) ;                  MV1SetMaterialDrawBlendParam(hikariHandle, 0, 255 ) ;     MV1DrawModel(hikariHandle ) ;     }



コードは上のようにかいてるんですが、これだと透視はしてくれます。


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

Name: Justy  ..伝説なるハッカー(491,514ポイント)   Date: 2010/01/04(月) 23:10   No:45531     
Title: Re:3Dによるエフェクトについて    
 DOGA系のやつですかね。使ったことはないですが。

 画像を見ると(ポリゴンのエッジを越えて)発光しているように見えますね。

 これが「発光しているように見えるテクスチャ」を貼ったものでなく、設定によって
オブジェクトの周囲にグロー効果を出すものだとしたら、これはこのソフト内部でのみ有効な
発光パラメータを使って表現しているため、Xファイルには出力されていないのでしょう。

 解決方法としては、XファイルのみではどうしようもないのでDXライブラリ上で
それに似た効果を出すよう再現するしか方法はないと思います。


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

Name: ようすけ  ..中級者(9,996ポイント)   Date: 2010/01/04(月) 23:25   No:45534     
Title: Re:3Dによるエフェクトについて    
>解決方法としては、XファイルのみではどうしようもないのでDXライブラリ上で 
それに似た効果を出すよう再現するしか方法はないと思います。

すいません、3D関係はまだ始めたばかりなので、具体的には
どうすれば光ってるように再現できるんでしょうか?

やはりアルファブレンドとか関係するんですかね? 



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

Name: Justy  ..伝説なるハッカー(491,895ポイント)   Date: 2010/01/05(火) 01:23   No:45544     
Title: Re:3Dによるエフェクトについて    
 うーん、シェーダが使えない(?)DXライブラリではまともにやるのはちょっと面倒ですね。

 形状的に許されるなら発光色でぼかしたテクスチャを事前に用意しておいて、
それを上から加算で表示すればそれっぽいのができあがるのですが、カメラ的に四方八方から
写される可能性があり且つ形状が激しく変化するようだと、その手は使えません、

 事前に発光テクスチャを用意する方法では出来ないような形状でしょうか?
 No.45522の左側のような発光ならモデルも不要で、事前にそういうテクスチャを用意しておいて
ビルボードにはっつけて加算で表示、でいいと思うのですが。


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

Name: ようすけ  ..中級者(10,319ポイント)   Date: 2010/01/05(火) 11:26   No:45568     
Title: Re:3Dによるエフェクトについて    


一応今の段階ではカメラの視点も変更できるように考えてます。

言葉では説明しづらいので、試作段階ですがゲームをアップしました。

カーソルキー 自機移動

Zキー  ショット

Xキー  ボム

A・S・D・Fキー カメラ視点変更

アップローダ様

http://kissho1.xii.jp/7/src/7jyou28983.zip.html

DLkeyは必要ないです

で、プレイされた上での話ですが、
ボムを撃った時に最初に戦闘機が頭上を通過してそのあとに
回転しながらのエフェクトが出ると思いますが、

さらにそのあとに先ほどのNo.45522の右の絵が出るとおもいますが、
これを左の光ってるエフェクトにしたいのです。

今はまだ試作段階ですのでまだまだ絵の変更や追加などもしたいので、

例えば信号機などの青赤黄色などを表現する時に今回の光らせるということが
応用というか必要になってくる技術だと思ってます。

よくを言えば、FFシリーズなどの敵を切った時のエフェクトなどが理想(まぁ、今の
レベルでは到底無理ですが)です。

非常にお手数かけますがよろしくお願いします。









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

Name: Justy  ..伝説なるハッカー(492,516ポイント)   Date: 2010/01/06(水) 00:11   No:45648     
Title: Re:3Dによるエフェクトについて    

> これを左の光ってるエフェクトにしたいのです

 拝見しました。
 あのエフェクトは爆発のエフェクトだったのですね(合ってますよね?)。
 イメージとしては小刻みに短時間で出す小爆発なのでしょうか。

 地面にめり込んでいるのでビルボードでは表現できなさそうです。
 なら、こんなんではどうでしょう? → (添付)

 作り方としては球にテクスチャを平面的に貼っただけのものです。
 
 これを常にカメラの方に向けるようにすれば、(微妙なところはあるにせよ)求めるものに
近いように思います。


# ちなみにパーツアセンブラではどのパラメータで光らせようとしていました?


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

Name: ようすけ  ..中級者(11,653ポイント)   Date: 2010/01/06(水) 01:14   No:45653     
Title: Re:3Dによるエフェクトについて    
>あのエフェクトは爆発のエフェクトだったのですね(合ってますよね?)。 
 イメージとしては小刻みに短時間で出す小爆発なのでしょうか。

そうです。爆発エフェクトです。説明不足ですいません。

 Justyさんに頂いたmv1ファイルを「DxLibModelViewer」で開いてみたところ
ちゃんと光ってました。
私が作ったのはこれで開くと光ってません。

で、試しにJustyさんのmv1ファイルをゲームに読み込んで表示してみたんですが、
ゲーム上だと光ってません。

わけがわかりません(泣

> ちなみにパーツアセンブラではどのパラメータで光らせようとしていました?


パラメータとかの設定画面とかはないとおもうんですけど、
輝きというのを500%にしました。
解決の糸口になるかもしれないので、レンダリング画面でのLOG出力?を貼っておきます。

1フレームから1フレームまで作画します
フォンシェーディングで作画します
-n オプションは無視します
インクルードパスにC:\Program Files\DOGACGA\common\BG\を追加
環境マッピングを有効にします
裏面を描画しません
半径を画面の10.00%、強さを 0.00%でグローエフェクトをかけます
影ポリゴンで影を落とします
半径を  0ピクセルで影をぼかします
影がぼけてもエッジが明るくならないようにします
ピンボケ効果を有効にします
最大ぼけ半径を画面の10.00%にします
レイトレーシングによる反射・屈折計算を行います(レベル4)
解像度を横 640 ×縦 480 にします
アンチエイリアシングを横2倍、縦2倍にします
Read Surface File...
Reading L3P_temp.suf
Read Attribute File...
Reading L3P_temp.atr
Read Frame File...
1フレーム
ポリゴン数: 30
影ポリゴン数: 0
result:
Total Time:             1435ms
V EdgeArray.Get:           0ms
V EdgeList.InsertAll:      0ms
V Horizontal:             46ms
V EdgeList.Inc:            0ms
V EdgeList.Sort:           0ms
V Draw:                  467ms
E GlobalConv:              0ms
E PolygonConv:             0ms
E Clip:                    0ms
E SetEdgeList:             0ms
H CreateEdge:              0ms
H EdgeList.InsertAll:     15ms
H 1st SearchSmalletst:     0ms
H 1st CalcColor:          15ms
H TransparentSearch:       0ms
H Inc:                     0ms
H ShadowCounter Clear:    16ms
H Edge Pairing:            0ms


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

Name: Justy  ..伝説なるハッカー(492,774ポイント)   Date: 2010/01/06(水) 01:30   No:45654     
Title: Re:3Dによるエフェクトについて    

> ゲーム上だと光ってません

 あ、加算にして下さい。
 それでもダメなら、マテリアルを調整する必要があるかもしれません。


> 輝きというのを500%にしました

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


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



Name: たかぎ [URL]  ..ハッカー(148,164ポイント)   Date: 2010/01/05(火) 15:41   No:45593       
Title: 【雑談】ベターC用のライブラリ    
C++をベターCとして使っている人が意外に多いようですので、実験的にベターC用のライブラリを一部だけ作ってみました。
今のところ、<stdlib.h>を拡張した<betterc/stdlib.h>だけです。
bettercディレクトリを作って、そこに添付したファイルを格納してください。そして、インクルードディレクトリを設定してください。
文字コードはUTF-8ですので、必要に応じて変換してください。
ヘッダファイルをインクルードするだけで使えますので、ライブラリファイルをリンクする必要はありません。

ざっとライブラリの説明をすると...

一番力が入っているのが strto関数テンプレートです。
これは、strtolやstrtodなどを一般化したもので、

long value = betterc::strto<long>("12345");

のようにして使います。
もちろん、第二引数や第三引数を指定することもできます。
betterc::strto<double>とすれば浮動小数点型も使えますが、C99の0x1.234p+3のような形式にも対応しています。
ただし、ロケールは未対応ですので、小数点には . しか使えません。
また、ナロー文字列だけでなく、ワイド文字列や、C++0xのchar16_tやchar32_tの文字列も指定できます。

ほかには、betterc::abs関数に、例えば INT_MIN を指定すると、assertを埋め込んでいますのでエラーを検出できます。
betterc::div関数の除数にゼロを指定したり、betterc::div(INT_MIN, -1)のようにした場合もエラーを検出できます。

多バイト文字・ワイド文字間の変換は、現状ではUTF-8しか対応していません。

なお、ざっとしかテストしていませんし、Mac OSX上のGCC(バージョン4.0.0, 4.4.0, および4.5)でしか試していません。
時間のあるときにでも触ってみて、ご意見をいただけると幸いです。
 編集済み


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


Name: たかぎ [URL]  ..ハッカー(148,189ポイント)   Date: 2010/01/05(火) 15:44   No:45596     
Title: Re:【雑談】ベターC用のライブラリ    
ファイル添付がうまくいかなかったようです。 編集済み

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

Name: たかぎ [URL]  ..ハッカー(148,338ポイント)   Date: 2010/01/05(火) 16:20   No:45605     
Title: Re:【雑談】ベターC用のライブラリ    
早速バグが見つかりました。
std::getenvがNULLを返した場合の処理が入っていませんでした。
ある程度まとめて修正を行いたいと思います。


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

Name: sizuma [URL]  ..上級者(24,470ポイント)   Date: 2010/01/05(火) 21:39   No:45626     
Title: Re:【雑談】ベターC用のライブラリ    
>bettercディレクトリを作って、そこに添付したファイルを格納してください。そして、インクルードディレクトリを設定
こういうことってしたことなかったから、試行錯誤しました^^;
結局文字コードが原因で動かなかったのかな?とりあえずコメント消したら動くようになりました。
文字コードを変換するのはどうやったら出来るのでしょうか?
テキストエディタで出来るかな?と思ったら見当たらなくて出来ませんでした。
VisualC++なんですが、VCの設定で変えるのでしょうか?


strtoだけでもトレースしてみようと思ってみてるんですけど、難しくてわからないとこだらけです。
関数テンプレート使ったことがないんで、見慣れてない部分もあり読むのに時間がかかります・・・


>detail::space_and_sign(s, s)
こんな使い方をするんですね、ポインタって。
CharT const *& next
これって一見すると**nextがconstに見えるんですが、*nextがconstなんですね。


>std::numeric_limits<T>::is_integer
なんか見たことあるテンプレートだなぁ・・・と思って検索したらきじねこ様のページがヒットしました
あぁ、ここで見たのか、と(笑


あと、こういう風に使うと
double value = betterc::strto<double>("123.45"); 
ctoiで'.'が変換されないから、初期化されないvalueを使うって実行時エラーが出ます
(使い方が間違ってるのかもしれないですけど・・・)
// 整数部
while (charT c = *s)
{    
    int d = ctoi(c);
    if (d >= radix)
        break;
    if (std::numeric_limits<T>::is_signed && std::numeric_limits<T>::is_integer
        && minus)
    {
        if (value * radix < std::numeric_limits<T>::min() + d)
            throw std::overflow_error("overflow");
        value = value * radix - d;
    }
    else
    {
        if (value * radix > std::numeric_limits<T>::max() - d)
            throw std::overflow_error("overflow");
        value = value * radix + d;
        }
    ++s;
    if(*s == decimal_point)break;//二重にdecimal-pointの判定をしてしまうけれど・・
}


あれ?
コード眺めてたら2時間ぐらいたってる・・・
ちなみにたかぎさんはこのヘッダを作るのにどれくらい時間かかったのですか? 編集済み


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

Name: たかぎ [URL]  ..ハッカー(148,316ポイント)   Date: 2010/01/05(火) 22:18   No:45633     
Title: Re:【雑談】ベターC用のライブラリ    
Visual C++ 2008でも使えるように手直ししました(サロゲートペアは非対応)。
あと、mblenなど少し関数を追加したほか、気づいた不具合を直しました。


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

Name: たかぎ [URL]  ..ハッカー(148,442ポイント)   Date: 2010/01/05(火) 22:24   No:45635     
Title: Re:【雑談】ベターC用のライブラリ    
> strtoだけでもトレースしてみようと思ってみてるんですけど、難しくてわからないとこだらけです。 

std::pow周りを除けば、割と素直なつくりです。
strtolとstrtodの定義を合体させると、大体こんな感じになります。
std::pow周りは最初素直に書いていたのですが、GCC 4.0.0でエラーになるので、無理やり対応しました。

> あと、こういう風に使うと 
> double value = betterc::strto<double>("123.45"); 
> ctoiで'.'が変換されないから、初期化されないvalueを使うって実行時エラーが出ます 
> (使い方が間違ってるのかもしれないですけど・・・) 

バグでした。
ちゃんと解析していませんが、それっぽい修正をしておきました。

> ちなみにたかぎさんはこのヘッダを作るのにどれくらい時間かかったのですか?

計っていませんが、のべ半日ぐらいかと思います。
# だからまともにテストができていない。


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

Name: たかぎ [URL]  ..ハッカー(148,596ポイント)   Date: 2010/01/05(火) 23:13   No:45640     
Title: Re:【雑談】ベターC用のライブラリ    
ちょっと触ると、今度はGCCでコンパイルできなくなっていたので、再度手直ししました。
一応、シフトJIS版とUTF-8版の両方を入れたものをアップロードしておきます。
本腰を入れる余力はないのですが、いい加減な取り組みだと収集がつかなくなりそうです。


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

Name: sizuma [URL]  ..プログラマー(25,100ポイント)   Date: 2010/01/05(火) 23:39   No:45645     
Title: Re:【雑談】ベターC用のライブラリ    
>計っていませんが、のべ半日ぐらいかと思います。 
よかった。1、2時間って言われたらショックが大きすぎますんで・・・・
やっぱり自分と比べて考えてしまいますからね(おこがましいのは置いておいて)
僕なら何日かかって作るかな、って思ってしまいます。

>修正版
また明日にでもトレースしてみます。


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



Name: ZIKI  ..ぴよぴよ(108ポイント)   Date: 2010/01/05(火) 21:25   No:45623       
Title: 不注意ならすみません。    
前にエラーで出したのですが、括弧がなかったり、後で見たら簡単なことでした。
けれど、すみません。これは分かりません。全部のデータを貼ります。
これからエラーが発生したとき、自分で解決する方法など、
できればそれも教えてください。


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


Name: sizuma [URL]  ..上級者(24,823ポイント)   Date: 2010/01/05(火) 21:56   No:45629     
Title: Re:不注意ならすみません。    
あなた前の投稿のレスをちゃんとみてますか?
みてるならせめて解決マークつけてください。
回答者にお礼もなしに次の質問をしてるのを見ると、僕はあなたにレスしたくないです。

規約よみましたか?
名前をちょこちょこ変えて投稿しないでください。

質問内容がわかりません。
せめて何がしたくて、どんなエラーが起こってるのかを書くぐらいして投稿しましょう。

あなたも私たちも感情をもった人間です。
顔が見えないからこそ相手に誠意を持って接するべきですよ。
(学生だとして)クラスの友人にプロジェクト渡して
「デバッグしてくれない?」
だけ言って、相手が喜んでデバッグしてくれると思いますか?
普通は
「何々がしたくて、こんなエラーが出てるんだけど、どうすればいいかな?」
って言ってからプロジェクトを見せますよね。


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

Name: ZIKITETRY  ..ぴよぴよ(586ポイント)   Date: 2010/01/05(火) 22:21   No:45634 解決!     
Title: すみません    
前の投稿の時に最後に返信してくださった方ですよね。
すみません。悪かったです。
前に投稿したことを、忘れてしまってました。
なので解決を押すのも忘れていました。

名前を変えたのは、名前を変えようとしたのではなく、
関連語句に入れている名前を出したつもりで出ていませんでした。

いろいろと迷惑を掛けて、すみませんでした。

この質問は、前に投稿した物の返信文を見て解いていきたいので、
解決とさしていただきます。

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


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



Name: ZIKITETRY  ..ぴよぴよ(345ポイント)   Date: 2010/01/03(日) 13:02   No:45440       
Title: エラーコードは何なのですか?    
前にエラーが出たときに、エラーコードを貼ってください。と言われたのですが、
どういう物なのですか?
エラーコードとは何なのですか?
私は出力(ビルド)だと思うのですが・・・。


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


Name: box  ..ハッカー(148,150ポイント)   Date: 2010/01/03(日) 13:06   No:45441     
Title: Re:エラーコードは何なのですか?    
そのときに直接おたずねになればよかったと思います。
エラーが出たソースそのもの、あるいはエラーメッセージのことでありましょう。

どんなソースで
何をしたときに(コンパイル?リンク?実行?)
どうなったか(どんなエラー?)

が、セットで必要です。

質問者さんが回答する側になったとき、
単に「エラーが出ました」だけでは何も回答できないことは
簡単に想像できるでしょう。 編集済み


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

Name: たかぎ [URL]  ..ハッカー(146,885ポイント)   Date: 2010/01/03(日) 18:39   No:45468     
Title: Re:エラーコードは何なのですか?    
> 前に

具体的に、いつ?

> エラーが出たときに、

何を試みて、どんなエラーが出たのですか?

> エラーコードを貼ってください。と言われたのですが、 

誰に、どんな状況でいわれたのですか?

自分だけがわかっている情報を前提に質問されても、満足な回答が得られるはずがありません。


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

Name: sizuma [URL]  ..上級者(23,633ポイント)   Date: 2010/01/03(日) 18:51   No:45469     
Title: Re:エラーコードは何なのですか?    
確かに前のトピックを見てないと答えられないので、せめて前のトピックへのリンクを貼るなどしなくてはいけませんね。
ちらっとトピックをみてたんで、こういうことでしょう。
僕はvisualC++2008eなんでこんな感じでエラーが出力されます
まぁこれは警告ですけど

>------ ビルド開始: プロジェクト: prac 構成: Debug Win32 ------
>コンパイルしています...
>practice.c
>c:\documents and settings\dxlib_vc\prac\practice.c(15) : warning C4098: 'main' : 戻り値の型が 'void' で宣言された関数が、値を返しました。

意味はboxさんの書かれてるとおりです。
これを見れば、何をしてるのか大体分かるんで。



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

Name: ZIKITETRY  ..ぴよぴよ(383ポイント)   Date: 2010/01/05(火) 22:12   No:45632 解決!     
Title: Re:エラーコードは何なのですか?    
すみませんすみません。
返信するの忘れていました。
ありがとうございました。


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



Name: 初心者  ..熟練のプログラマー(45,887ポイント)   Date: 2010/01/05(火) 02:07   No:45549       
Title: Direct3D    
Direct3Dを勉強しているのですが、
頂点シェーダやピクセルシェーダは、
(ゲーム作成の)どういうときに使うのでしょうか?

初心者ですが、よろしくお願いします。

環境?は、
C++、DirectX 9です。


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


Name: 御津凪 [URL]  ..ハッカー(135,228ポイント)   Date: 2010/01/05(火) 10:18   No:45559     
Title: Re:Direct3D    
頂点シェーダやピクセルシェーダ等(DirectX10以降は他にもあります)は、
主に描画を行う時に使用するものです。

DirectX9 では、固定機能パイプラインという、
シェーダを使用しなくても描画できる機能がありますが、
DirectX10 以降では固定機能パイプラインが廃止されています。
(描画には頂点シェーダ・ピクセルシェーダを使用することが必須となる)

それはさておき、 DirectX9 でのシェーダの使い道ですが、
固定機能パイプラインでは補えない部分、つまり
描画時の画像処理(ぼかし・色変換等)や、頂点テクスチャを利用した波の表現、
デプスシャドウ(影)などを実現する際に必要となります。

また、最近の GPU では固定機能パイプラインよりもシェーダを使って描画したほうが
余計なプロセスを省くことができるので高速に描画できます。


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

Name: 初心者  ..熟練のプログラマー(45,918ポイント)   Date: 2010/01/05(火) 13:41   No:45580     
Title: Re:Direct3D    
>頂点テクスチャを利用した波の表現・・・

実際にどのように記述すればいいですか?
なにか例があったら教えてくれませんか?


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

Name: 御津凪 [URL]  ..ハッカー(136,004ポイント)   Date: 2010/01/05(火) 15:23   No:45589     
Title: Re:Direct3D    
下記のサイトが使用例として参考になると思います。

Maverick Project
http://maverickproj.web.fc2.com/pg00.html

こちらのサイトでは、シェーダを利用した沢山の例があります。

シェーダの大まかな基本部分については、下記の、

ゲームつくろー!
http://marupeke296.com/GameMain.html

の、「プログラマブルシェーダ編」にて解説されています。

シェーダ自体の情報は 10 年近く前(DirectX8 が登場した辺り)から存在しているので、
シェーダに関する情報は探そうと思えばいくらでも見つかります。
専門的知識や仕様を確認するには MSDN ライブラリが一番ですが。


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

Name: 初心者  ..熟練のプログラマー(45,937ポイント)   Date: 2010/01/05(火) 17:49   No:45614 解決!     
Title: Re:Direct3D    
参考になりました。
ありがとうございます。


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



Name:  ..かけだし(2,177ポイント)   Date: 2010/01/05(火) 15:22   No:45588       
Title: 文字列比較に関する質問です    
二つの文字列(コード)の類似性を視覚的に確認するためのプログラムについて質問です。
文字列コードはJISカナを使用します。
"31"で"ア"を表すので二つずつ要素を比較します。

例えば二つの

121A342S5465と
131A43225465
の配列を2要素ずつ比較して両方とも一致していたら1、どちらかでも違ったら0を配列に格納し、

000000
010000
000000
000000
000010
000001

というようにファイルに出力するプログラムを教えてください。(この出力結果は正しいです。)
一応自分でも組んでみたのですが通りません。プログラムはまだまだ初心者ですのでご教授の方よろしくお願いいたします。



int dot(char a[],char b[])
{
    int i,j;
    FILE *fp;
    int ten[NUM];

    fp =fopen("text1.txt", "w");

    if(fp == NULL){
        printf("ファイルをオープンできませんでした。\n");
        return 1;
    }
    else{
        printf("ファイルをオープンしました。\n");
    }

    printf("2つの文章を比較し結果をファイルに出力します。\n");
    
    for(i=0; i<NUM;i++){
        for(j=0; j<NUM; j++){
            if(a[2i] == b[2j] && a[2i+1] == b[2j+1]){
                ten[j] == 1;
            }
            else{
                ten[j] == 0;
            }
        }
    }
    while(ten[] == NULL){
        fprintf(fp, "%d", ten[]);
    }

    return 0;
}



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


Name: MNS  ..プログラマー(28,477ポイント)   Date: 2010/01/05(火) 15:26   No:45591     
Title: Re:文字列比較に関する質問です    
何をシたいのかいまいちわからないのですが、少なくとも
if(a[2i] == b[2j] && a[2i+1] == b[2j+1]){ 
    ten[j] == 1;
}
else{
    ten[j] == 0;
}
これは
if(a[2i] == b[2j] && a[2i+1] == b[2j+1]){ 
    ten[j] = 1;
}
else{
    ten[j] = 0;
}

こうでしょう。

あと、規約はしっかりと読みましょう。


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

Name: non  ..比類無きプログラマー(86,180ポイント)   Date: 2010/01/05(火) 15:42   No:45595     
Title: Re:文字列比較に関する質問です    
意味がわからない。

少なくとも、
a[2i]なんてのは変。

プログラムを添付するなら、全部添付して。


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

Name:  ..かけだし(2,195ポイント)   Date: 2010/01/05(火) 17:30   No:45612     
Title: Re:文字列比較に関する質問です    
申し訳ありませんでした。
解決できました。


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

Name:  ..かけだし(2,202ポイント)   Date: 2010/01/05(火) 17:32   No:45613 解決!     
Title: Re:文字列比較に関する質問です    
解決しました

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



Name: tovira  ..ぴよぴよ(0ポイント)   Date: 2010/01/05(火) 15:41   No:45594       
Title: また復習しててわからないことがあったので・・・    
大学でもらったプリントの復習をやっています。またわからないことが二つあるので教えてもらえるとうれしいです。
一つ目ですが、lower_dec()を定義してそれぞれの桁の合計をもとめるというもので、自分なりにやってみた結果、エラーは出なかったのですが、警告が3つでました。プログラムは
#include <stdio.h>
void lower_dec(int n)
{

n = n%10;

}

int main(void)
{
int z,n,ans;
printf("正の値を入力してください。");
scanf("%d",&n);
while(1){
z = n;
lower_dec(n);
ans = n;
n=(double)z/10;
n=(int)n;
}


printf("それぞれの桁の値の合計は%dです。\n",ans);
    return 0;
}
です。これが自分で書いたものですが、警告が出てしまいます。警告の内容は
5: 'n' に代入した値は使われていない(関数 lower_dec) 
23: 実行されないコード(関数 main )
17: 'ans' に代入した値は使われていない(関数 main )
の三つです。教えてもらえるとうれしいです。
もう一つは

#include <stdio.h>
int total_mat(int mat[])
{
    int i;
    int sum = 0;
    
    for(i=0;i<6;i++)
        sum += mat[i];
        
        return( sum );
        } 
int main(void)
{
    int va[6] = {0};
    int j;
    double ans ;
    for(j=0;j<6;j++){
    printf("整数%d:",j+1);
    scanf("%d",&va[j]);
    }
    
    ans=(double)total_mat(va)/6;
    
    printf("それらの平均値は%fです。\n",ans);
    
    return 0;
}
平均を求めるプログラムなのですが、私はint total_mat(int mat[])の部分がよくわからないのです。というのはvoid関数は良く知っています。void putschar(int n1)みたいなものです。なのでなぜvoidではなく、int total_mat(int mat[])なのかが不思議です。voidの場合とintの場合の使い分けがわかるように説明してもらえるとうれしいです。
以上です、お願いします。


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


Name: non  ..比類無きプログラマー(86,321ポイント)   Date: 2010/01/05(火) 15:46   No:45598     
Title: Re:また復習しててわからないことがあったので・・・    
最初の警告について
>5: 'n' に代入した値は使われていない(関数 lower_dec) 
関数で計算した値が、呼び出し側に反映されないから。

>23: 実行されないコード(関数 main ) 
whileが永久ループのため、実行されない。

>17: 'ans' に代入した値は使われていない(関数 main ) 
上記理由により、実行されない。



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

Name: non  ..比類無きプログラマー(86,385ポイント)   Date: 2010/01/05(火) 15:51   No:45599     
Title: Re:また復習しててわからないことがあったので・・・    
2つめ
>void putschar(int n1)みたいなものです。
この関数は私は知らない。どんな関数ですか?

仮にputcharと誤入力したとしても、
int putchar(int c) のはず。


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

Name: sizuma [URL]  ..上級者(23,897ポイント)   Date: 2010/01/05(火) 15:52   No:45600     
Title: Re:また復習しててわからないことがあったので・・・    
先ほどまずは規約を読みなさい、とかかれてましたよね。
なぜ読まないのですか?

とりあえずぺたっと。
・ ソースコードは< pre>と< /pre>のタグで囲んでください
詳しくはこの掲示板の使い方をご覧ください→ http://dixq.net/board/board.html

見たところ全然授業内容を理解していないようなので、もう一度最初の講義のプリントからの復習をした方がいいと僕は思います。 編集済み


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

Name: MNS  ..プログラマー(28,558ポイント)   Date: 2010/01/05(火) 15:53   No:45601     
Title: Re:また復習しててわからないことがあったので・・・    
>なぜvoidではなく、int total_mat(int mat[])なのかが不思議です。
return文で、int型の変数を返しているからです。
詳しくは、wikipedia(http://ja.wikipedia.org/wiki/Return%E6%96%87)や、
その他C/C++入門サイトなどで学んでみてください。


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

Name: たかぎ [URL]  ..ハッカー(148,276ポイント)   Date: 2010/01/05(火) 16:01   No:45602     
Title: Re:また復習しててわからないことがあったので・・・    
> 先ほどまずは規約を読みなさい、とかかれてましたよね。 
> なぜ読まないのですか? 

もしかすると日本語がわからないのかもしれません。
ソースコードだけでなく、文章も(誰かが書いたものの)コピペの可能性があります。
留学生も多いので、十分あり得ることです。



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

Name: さかまき  ..ぴよぴよ(354ポイント)   Date: 2010/01/05(火) 17:21   No:45609     
Title: Re:また復習しててわからないことがあったので・・・    
>もしかすると日本語がわからないのかもしれません。
>留学生も多いので、十分あり得ることです。

勤勉な留学生や日本かぶれした外国人のほうが余程、美しい日本語を話されます。
最近は、日本人の話す日本語が「びみょう」に「ヤバイ」感じがします。


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

Name: たかぎ [URL]  ..ハッカー(148,392ポイント)   Date: 2010/01/05(火) 17:28   No:45611     
Title: Re:また復習しててわからないことがあったので・・・    
> 勤勉な留学生や日本かぶれした外国人のほうが余程、美しい日本語を話されます。

そういう人ばかりではないですよ。
留学生の言語スキルは千差万別ですので、一概にはいえません。


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



Name: miya  ..かけだし(1,481ポイント)   Date: 2010/01/05(火) 10:00   No:45557       
Title: XAudio2のマスターボイスの破棄について    
お世話になっております。

XAudio2を利用したサウンド再生クラスを作っている時に、如何しても理解できないバグが発生してしまったので質問させて頂きます。

XAudio2オブジェクトとマスターボイスのオブジェクトを持ち、機能として初期化と開放のみをするクラスを作りました。
これを継承して、使いまわすことにしたのですが…。
どうしてもマスターボイスを破棄するところでエラーが発生してしまいます。
サウンドの再生自体は出来るので、XAudio2オブジェクト、マスターボイス、ソースボイスの作成は上手くいっていると思います。
エラーの原因が自分には分かりません、どうかご教授願います。

ソース内のライブラリのサイズの関係で他のアップローダーを利用してソースをアップしました。
http://down11.ddo.jp/uploader/download/1262652933.zip
パスワードは「xad」です。
また一部抜粋した物もこちらに記載させて頂きます。

//MyXAudio.h
class XAudio{    
protected:
    //static DWORD                    ReferenceCnt;    //参照カウンタ(使用予定)
    static IXAudio2*                pXAudio2;
    static IXAudio2MasteringVoice*            pMasterVoice;
    
    HRESULT     InitXA(void);

public:
    static void Release(void);
};

//MyXAudio.cpp
#define XA_SAFE_RELEASE(p){ if(p) { (p)->Release(); (p)=NULL; } }

IXAudio2*        XAudio::pXAudio2 = NULL;
IXAudio2MasteringVoice*    XAudio::pMasterVoice = NULL;

HRESULT XAudio::InitXA(void){
    HRESULT hr = S_OK;

    if(pXAudio2 == NULL){
        CoInitializeEx(NULL, COINIT_MULTITHREADED);

        UINT32 flg = 0;
        #ifdef _DEBUG
            flg |= XAUDIO2_DEBUG_ENGINE;
        #endif

        if(FAILED(hr = XAudio2Create(&pXAudio2, flg))){
            MessageBox(NULL, "IXAudio2オブジェクトの作成に失敗。", "ERROR", MB_OK); 
            CoUninitialize();
            return hr;
        }

        if(FAILED(hr = pXAudio2->CreateMasteringVoice(&pMasterVoice))){
            MessageBox(NULL, "マスターボイスの作成に失敗。", "ERROR", MB_OK); 
            XA_SAFE_RELEASE(pXAudio2);
            CoUninitialize();
            return hr;
        }
    }

    return hr;
}

void XAudio::Release(void){
    if(pXAudio2 != NULL){
        if(pMasterVoice != NULL) {
            pMasterVoice->DestroyVoice(); //ここでエラー
            pMasterVoice = NULL;
        }

        XA_SAFE_RELEASE(pXAudio2);
        CoUninitialize();
    }
}


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


Name: 御津凪 [URL]  ..ハッカー(135,404ポイント)   Date: 2010/01/05(火) 10:35   No:45561     
Title: Re:XAudio2のマスターボイスの破棄について    
IXAudio2Voice::DestroyVoice
http://msdn.microsoft.com/ja-jp/library/bb694576%28VS.85%29.aspx

には、

> 現在このボイスに他のボイスがオーディオを送信している場合、このメソッドは失敗します。

とあります。

なので、中身を見るとマスターボイスを破棄する際、他のソースボイスは全て破棄されていないはずです。


それと、継承関係にあるクラスのデストラクタには必ず virtual をつけないと、
正しくデストラクタが呼ばれませんよ。


それ以外の部分(main 関数の戻り値が int でない事)にも問題ありますが、
この質問の問題ではないので、これについては最近の下記の別トピの記事をご覧ください。
http://www.play21.jp/board/formz.cgi?action=res&resno=45350&page=&id=dixq&rln=45527#45465


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

Name: miya  ..入門者(2,726ポイント)   Date: 2010/01/05(火) 11:43   No:45570     
Title: Re:XAudio2のマスターボイスの破棄について    
> なので、中身を見るとマスターボイスを破棄する際、他のソースボイスは全て破棄されていないはずです。
 
XAudioクラスをすべてpublicメンバにし、XAudioクラスを継承したクラスを利用せずエントリーポイント内で以下のようにしてみたのですがやはり…。

XAudio::InitXA();
 ↓
ソースボイス作成
 ↓
再生
 ↓
ソースボイス破棄
 ↓
XAudio::Release();


>それと、継承関係にあるクラスのデストラクタには必ず virtual をつけないと、
 正しくデストラクタが呼ばれませんよ。 

わかりました。以後気をつけます。

>それ以外の部分(main 関数の戻り値が int でない事)にも問題ありますが

すいません個人的なルールで、試験的なソースにはvoid main(void)を、
完成した、サンプルとして提供するなどのソースにはint main(void)を利用するようにしていまして、
今回は気が動転しててvoidのまま公開してしまいました。
以後気をつけます。


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

Name: 御津凪 [URL]  ..ハッカー(135,661ポイント)   Date: 2010/01/05(火) 12:02   No:45573     
Title: Re:XAudio2のマスターボイスの破棄について    
ソースボイスを一切作成せず、マスターボイスのみを生成、破棄してみてください。
それで問題が無ければソースボイスの破棄に問題があるはずです。

あと、
> XAudioクラスをすべてpublicメンバにし、XAudioクラスを継承したクラスを利用せずエントリーポイント内で以下のようにしてみたのですがやはり…。

その記述したコードを見せてくれますか?

アップローダにあった Main.cpp 内では、
void main(void){
    OggXAudio test;

    test.Load("test.ogg");

    test.Play();
    Sleep(10000);
    test.Stop();
    
    XAudio::Release();
}

となっていますが、
このときクラス内にソースボイスを持ち、デストラクタ時に解放するような場合だと、
main 関数から抜ける直前までデストラクタが呼び出されません。
これは、 XAudio::Release 関数がそのデストラクタより前に呼び出されることを意味します。


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

Name: miya  ..入門者(3,290ポイント)   Date: 2010/01/05(火) 12:18   No:45574     
Title: Re:XAudio2のマスターボイスの破棄について    
> ソースボイスを一切作成せず、マスターボイスのみを生成、破棄してみてください。 
通りました。
完璧にソースボイスの影響のようです。

そして先ほど通らなかったソースがこちらです。(XAudioクラスはオールパブリックの他変更なしです)

#include "MyXAudio.h"

int main(void){
    XAudio::InitXA();

    OggVorbis_File ovf;
    IXAudio2SourceVoice*    pSourceVoice = NULL;

    ov_fopen("test.ogg", &ovf);
    vorbis_info* info = ov_info( &ovf, -1 );

    WAVEFORMATEX fmt;

    fmt.wFormatTag        = WAVE_FORMAT_PCM;
    fmt.nChannels        = info->channels;
    fmt.nSamplesPerSec    = info->rate;
    fmt.wBitsPerSample    = 16;
    fmt.nBlockAlign        = fmt.wBitsPerSample / 8 * fmt.nChannels;
    fmt.nAvgBytesPerSec    = fmt.nSamplesPerSec * fmt.nBlockAlign;
    fmt.cbSize            = 0;

    XAudio::pXAudio2->CreateSourceVoice(&pSourceVoice, &fmt);

    UINT Size = (UINT)(info->channels * info->rate * info->channels * ov_time_total(&ovf, -1));
    char *data = new char[Size];

    UINT LoadSize = 4096;
    UINT ReadSize = 0;
    UINT Pos      = 0;

    while(1){
        ReadSize = ov_read(&ovf,&data[Pos], LoadSize, 0, 2, 1, NULL);
        if(ReadSize == 0 || Pos + ReadSize >= Size)break;
        
        Pos += ReadSize;
        if(Pos + LoadSize >= Size) LoadSize = Size - Pos;
            
    }
    

    XAUDIO2_BUFFER            SoundBuffer = { 0 };
    SoundBuffer.AudioBytes = Size;
    SoundBuffer.pAudioData = (BYTE*)data;

    pSourceVoice->SubmitSourceBuffer( &SoundBuffer );
    
    pSourceVoice->Start(0);

    MessageBox( 0, "終了します", "", 0 );

    pSourceVoice->Stop(0);
    pSourceVoice->DestroyVoice();

    XAudio::Release();

    return 0;
}


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

Name: 御津凪 [URL]  ..ハッカー(135,711ポイント)   Date: 2010/01/05(火) 12:44   No:45577     
Title: Re:XAudio2のマスターボイスの破棄について    
そのコードでこちらで何度か実行してみましたが、エラーは出ませんでした。
(警告は出ますが)

どのようなエラーが出ましたか?



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

Name: miya  ..入門者(3,383ポイント)   Date: 2010/01/05(火) 14:24   No:45583 解決!     
Title: Re:XAudio2のマスターボイスの破棄について    
すいません。原因が何となく特定しました…。(詳しい所まではさすがに分からないものでしたが)
報告させていただきます。

> どのようなエラーが出ましたか?
エラーの発生箇所までプログラムが進むと
「○○(プログラム名).exe によってブレークポイントが発生しました」
とだけ表示されるものでした。

で、何が原因だったかと言いますと、DirectX SDKの一部のファイル(恐らくXAudio2に関連した何か)が
何らかの原因で破損していたようで、同バージョンのSDKを再度入れなおした結果コンパイルが通るようになりました。
数日前に書いた別のソース(制作当時、動作していた物)も同様の部分で同じ状態になっていたので「アレ?」と思ったら…まさかと言う感じです。

なお、警告のほうはこちらでも確認できています。

まさか、こんな所に原因が潜んでるとは思わず、自分でも驚いています。
お手数をおかけしてすいませんでした。




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

Name: 御津凪 [URL]  ..ハッカー(136,039ポイント)   Date: 2010/01/05(火) 15:30   No:45592     
Title: Re:XAudio2のマスターボイスの破棄について    
エラーを確認して、 SDK に問題があるかどうかを特定しようとしていましたが、
miya さんが先に気づき、解決されたようで何よりです。

> エラーの発生箇所までプログラムが進むと
> 「○○(プログラム名).exe によってブレークポイントが発生しました」
> とだけ表示されるものでした。

ランタイムエラーのダイアログさえ出ないということは、明らかに何らか(恐らく DLL)の破損ですね。

ちなみに警告に意味は分かりますか?


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

Name: miya  ..入門者(3,967ポイント)   Date: 2010/01/05(火) 16:03   No:45603     
Title: Re:XAudio2のマスターボイスの破棄について    
本当に御津凪さんにはお世話になりました。

ちなみに、こちらで確認している警告は

warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。

というもので、書いてあるとおり、/MTで作られたライブラリをそれ以外の指定で利用しているため
出ているようです。
実際、コード作成を/MTにする、又は特定のライブラリの無視に追加してしまえば消えたので、
リリースでビルドするときに/MTを指定する事にしました。

後、warningとしては出ていませんが

ogg_static.lib(framing.obj) : MSIL .netmodule または /GL を伴ってコンパイルされたモジュールが
見つかりました。/LTCG を使用して再開始してください。リンカのパフォーマンスを向上させるためには、
コマンドラインに /LTCG を追加してください。

というものが出ています。
こちらはMSDNを読んでも、今一「/LTCG」の項目が理解できていない状態です。
しかし指定されたとおり、リンカのコマンドラインに「/LTCG」を追加すれば回避できるようなので、
ひとまずこのまま利用したいと思います。

これ以外の警告がそちらの環境で出ていましたら、教えていただくと助かります。

後、余談になりますがマスターボイスの破棄のタイミングですが、
現在の利用中のソースボイスをカウンタで数えてやり、
すべてソースボイスが破棄された(カウンタが0になった)時に一緒に破棄するようにしました。
まだコピーコンストラクタや=演算子の時のカウント数の問題は残っていますが、
ひとまずこれで何とかなりそうです。


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

Name: 御津凪 [URL]  ..ハッカー(136,530ポイント)   Date: 2010/01/05(火) 16:36   No:45607     
Title: Re:XAudio2のマスターボイスの破棄について    
コンパイル・リンク時の警告はそれで正解ですね。
ようは元となっているライブラリ(ここでは ogg_static.lib)をコンパイルしたときの設定と一緒にしなさい
ということなんですけどね。
つまり、デバッグ版とリリース版、もしくは各コード生成オプションごとにライブラリを使用する必要があるわけです。


それとは別に、実行時にも警告が出ていますね。
XAudio2 では、デバッグエンジンを使用したときに、動作に影響(あるいは支障)がある可能性のとき、
デバッグ出力上に出力されます。
今回では、

XAUDIO2: WARNING: Voice at 0x******** starved: no more source buffers are available, but no end-of-stream marker was received
(一応アドレス値は置き換えています)

というものが出ています。
こちらのほうはお気づきでしたでしょうか?

要約すると、
「最後のサウンドバッファを消費しましたが、 最後のバッファにはエンドマーカーが付いていませんでした」
です。
音声の終端が存在するサウンドバッファを送る時は XAUDIO2_END_OF_STREAM フラグをつける必要があります。
(ちなみに、つけなくても動作自体には全く支障はありません)


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

Name: miya  ..入門者(4,189ポイント)   Date: 2010/01/05(火) 17:22   No:45610 解決!     
Title: Re:XAudio2のマスターボイスの破棄について    
デバッグ出力に情報を吐き出してくれるとは…指摘されるまで気づきませんでした。
「〜を読み込みました」で埋め尽くされていたため、スクロールしてようやく確認できました。

SDKのサンプルの初期化時に、デバッグ用のフラグを設定していたので、
そっくりそのまま書いたは良かったものの、結局何してるんだろうなぁ…という感じだったのですが
これでスッキリしました!

確かに、こちらでコメントに記載したソースには、すべて読み込んでいるのに、
見事にフラグ付け忘れてますね…気をつけます。

後、出力される事が分かったおかげで、今現在のソースの問題も見えました。

XAUDIO2: WARNING: Called Stop() on a voice that was already stopped; ignoring call

停止状態で停止させようとするなって…当然ですよね。
Start()した回数だけStop()を呼び出さないといけない、とリファレンスにも書かれてますし…。

しかし、これで大分作る込めそうな気配がします。
DirectX Audioと違い中々ネット上でも書籍でもまだ資料が少なくて、
経験の浅い私には難しい面もありますが、自身の知識向上のためにも頑張ってみます。


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



Name: tovira  ..ぴよぴよ(387ポイント)   Date: 2010/01/05(火) 08:39   No:45555       
Title: C言語の数字の出現回数のプログラミング    
初めまして。今大学のプログラミングが私苦手なので復習をしています。ですがやはりつまづいてしまうところはつまづいてしまいます@@;。下のC言語のプログラムについての質問です。
#include <stdio.h>

int main(void)
{
int i, j, ch;
int cnt[10] = {0};

while((ch = getchar()) != EOF){
if(ch >= '0' && ch <= '9') ++ cnt[ch - '0' ];
}

puts("数文字の出現回数");
for(i = 0; i<10;i++){
printf("'%d':",i);
for(j=0;j<cnt[i];j++)
 putchar('*');
putchar('\n');
}
return 0;
}
質問内容についてですが、ほとんどといってわからない部分が多いのでひとつづつ書いていきます。
まず
while((ch = getchar()) != EOF){
if(ch >= '0' && ch <= '9') ++ cnt[ch - '0' ];
}
の部分はCtrl+Zをするまで数字を入力してまではわかるのですが次がわかりません。++ cnt[ch - '0']もcntのカッコの中が+されているのかcntそのものが+されるかわからないレベルです@@;。この部必要ないんじゃないかなと思って抜いてみたのですが、*が表示されてなく、必要とわかりました。けれどもなぜ必要なのかということが今になってもわかりません。
次に
for(i = 0; i<10;i++){
printf("'%d':",i);
for(j=0;j<cnt[i];j++)
 putchar('*');
putchar('\n');
}
の部分ですが、この部分もさっぱりといってわかりません。詳しくいいますと、
for(i = 0; i<10;i++)
printf("'%d':",i);
の部分は数字をprintfで並べているのがわかります。(表形式)
その次にアスタリスクの個数で数字の個数を表示します。この部分なのですが、なぜ
for(j=0;j<cnt[i];j++)
 putchar('*');
putchar('\n');
で出現回数分アスタリスクを表示できるのか意味がわかりません。
ほんと初心者みたいな質問ですみませんがどうしても100%理解したいので教えてください。


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


Name: さかまき  ..ぴよぴよ(438ポイント)   Date: 2010/01/05(火) 09:13   No:45556     
Title: Re:C言語の数字の出現回数のプログラミング    
cnt[10]は'0'から'9'の出現回数を記録する変数の配列です。
cnt[0] = '0' の出現回数
  |
cnt[9] = '9' の出現回数
がセットされます。
cnt[ch - '0' ] は
ch='0' の時、cnt[0]
ch='1' の時、cnt[1]
 |
ch='9' の時、cnt[9]
になります。cnt[]の意味が理解できれば
if(ch >= '0' && ch <= '9') ++ cnt[ch - '0' ];
で出現回数をカウントアップしている事がわかると思います。
このプログラムの核ですので「この部必要ないんじゃないかな」どころでは無いです。

カウンターなので
for(j=0;j<cnt[i];j++) putchar('*'); によって
それぞれの個数だけアスタリスクが表示されます。
putchar('\n');は次のカウント表示する為の改行ですね。


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

Name: たかぎ [URL]  ..ハッカー(147,129ポイント)   Date: 2010/01/05(火) 10:19   No:45560     
Title: Re:C言語の数字の出現回数のプログラミング    
まずはお約束



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

Name: tovira  ..ぴよぴよ(29ポイント)   Date: 2010/01/05(火) 15:44   No:45597     
Title: Re:C言語の数字の出現回数のプログラミング    
プログラムを良くよめばわかりました@@;。さかまきさんありがとうございました。

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



Name: たこ  ..ぴよぴよ(0ポイント)   Date: 2010/01/05(火) 01:29   No:45545       
Title: コンストラクタとデストラクタ    
ごめんなさい。またまた投稿させてもらいます。
c++のクラスについてです。
コードは
#include<iostream>
#include<string.h>
#include<conio.h>
using namespace std;
class Cat{
public:
    Cat(char *kind,char *size);
    ~Cat();
    void show();
private:
    int leg;
    char body_size[32];
    char kind_of_cat[32];
};
Cat::Cat(char *kind, char *size){
    leg=4;
    strcpy(kind_of_cat,kind);
    strcpy(body_size,size);
    cout<<kind_of_cat<<"のコンストラクタが呼ばれました"<<endl;
}

Cat::~Cat(void){
    cout<<kind_of_cat<<"のデストラクタが呼ばれました"<<endl;
}
void Cat::show(void){
    cout<<"猫の種類="<<kind_of_cat<<endl;
    cout<<"足の本数="<<leg<<endl;
    cout<<"体系="<<body_size<<endl;
    return;
}
int main(void){
    Cat MaineCoon("メイン・クーン","大型");
    Cat American_Short("アメリカン・ショート・ヘア","小型");
    MaineCoon.show();
    cout<<'\n';
    American_Short.show();
    getch();
    return 0;
}
全くコンストラクタとデストラクタ の仕組みがよくわかりません。
本当になにもかもわからない状態です。
このコンストラクタとデストラクタを使うとどのようなことができるようになるのでしょうか?
まずそこから教えてくれませんか?
解答お願いします><


 編集済み


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


Name: たかぎ [URL]  ..ハッカー(147,039ポイント)   Date: 2010/01/05(火) 01:55   No:45548     
Title: Re:コンストラクタとデストラクタ    
> まずそこから教えてくれませんか?

いや、まずは↓からでしょう。



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

Name: miya  ..入門者(2,534ポイント)   Date: 2010/01/05(火) 11:11   No:45563     
Title: Re:コンストラクタとデストラクタ    
たかぎさんの言う通りまずはそこから…と私も思います。
しかし、甘いと思われるかもしれませんが、自分の知識の確認のためにも答えさせて頂こうかと思います。

コンストラクタとデストラクタについてまずお話したいと思います。

クラスと言うのは構造体とは違い、変数だけでなく関数も一緒のグループとして取り扱えるものです。
その中でコンストラクタは作ったクラスを利用する際に必ず1番最初に呼ばれる関数の事を言います。

逆にデストラクタは「デス」と付くように利用するクラスが最後に呼び出す関数の事を言います。
使用しているクラスがスコープ(有効範囲)を抜ける際に呼び出されます。

どちらも戻り値を指定する事が出来ませんので関数の型を定義する必要が有りません。

コンストラクタとデストラクタは定義していなくても、自動的に「何もしない」コンストラクタとデストラクタが作られます。

ここで何かしらの処理をしたい場合はクラスを作るときに自分で定義してやる必要が有ります。
定義する場合はコンストラクタなら
クラス名(){処理}

デストラクタなら
~クラス名(){処理}

と記述します。

記載されているプログラムよりもシンプルな物を用意したのでそれを見てみましょう。

#include<iostream> 

//以降名前空間「std」を省略
using namespace std; 

class TestClass{
public:
    //コンストラクタを定義
    TestClass(){ 
        cout << "コンストラクタ実行" << endl;
    }

    //デストラクタを定義
    ~TestClass(){
        cout << "デストラクタを実行" << endl;
    }
};

int main(void){

    TestClass A; //ココでコンストラクタが呼ばれる。

    return 0;
}//ここでデストラクタが呼ばれる。
//実行結果 コンストラクタ実行 デストラクタを実行 このように自身は何かをしたつもりがないのに、勝手に呼ばれるのがコンストラクタとデストラクタです。 なお自身が設定してもpublicメンバ(公開用)にしておかないと、コンパイラが 「(自動的に)呼ぼうかと思ったけど公開されてないから無理」 と言うような事を返してきます。 今回のプログラムのコンストラクタを解説すると
Cat::Cat(char *kind, char *size){
    leg=4; //「leg」に4を代入
    strcpy(kind_of_cat,kind); //「kind_of_cat」にkind(指定された猫の名前(文字列))をコピー
    strcpy(body_size,size);    //「body_size」にsize(指定されたサイズ(文字列))をコピー

        //画面にコンストラクタが呼ばれた事を出力
    cout<<kind_of_cat<<"のコンストラクタが呼ばれました"<<endl;
}
となります。 デストラクタは自身が呼ばれた事を出力しているだけですね。 またメンバ関数show()は指定された情報を出力しているだけです。 今回はそれだけの処理をするクラスのようですね。 今回の場合を除いてコンストラクタとデストラクタを有効に使うプログラムですと…。 例えばnew(動的にメモリを確保)delete(newされた領域の開放)を利用したプログラム等があるでしょう。 deleteのし忘れは良くあるバグで、そのバグを生み出す可能性を回避する事が出来ます。 こちらもサンプルを書いてみました。
#include<iostream>
#include<string.h>

//以降名前空間「std」を省略
using namespace std; 

class TestClass{
//利用するときにはアクセスできないメンバ
private:
    char *str;

//利用するときにアクセスできるメンバ
public:
    //コンストラクタ(指定されたサイズ分配列を確保)
    TestClass(int size){
        cout << size << "Byteの領域を確保。" << endl;
        str = new char[size];
    }
    //文字列をコピー
    void get(char *st){
        strcpy(str, st);
    }
    //画面へ出力
    void show(void){
        cout << "現在「" << str << "」という文字が入っています。"  << endl;
    }
    //デストラクタ(開放)
    ~TestClass(){
        cout << "確保された領域を開放。" << endl;
        delete [] str;
    }
};

int main(void){
    TestClass moji(32);    //32個のchar型配列を確保

    moji.get("猫が好き");    //「猫が好き」という文字を格納
    moji.show();        //画面へ出力

    return 0;
}


//実行結果
32Byteの領域を確保。
現在「猫が好き」という文字が入っています。
確保された領域を開放。

長くなってしまいましたがコンストラクタとデストラクタというのは以上のような感じのものになります。


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

Name: qwerty  ..かけだし(1,097ポイント)   Date: 2010/01/05(火) 12:43   No:45576     
Title: Re:コンストラクタとデストラクタ    
>>miyaさん
丁寧にご回答されているところ、揚げ足を取るようで申し訳ないのですが、気になったのでレスさせてもらいます。
悪気はありません・・・

>クラスと言うのは構造体とは違い、変数だけでなく関数も一緒のグループとして取り扱えるものです
構造体も関数を定義することはできますよ。

>「デス」と付くように利用するクラスが最後に呼び出す関数の事を言います
どちらかというと「デ」ですね。
反対の接頭辞ですので、「デ」がつくから「最後に〜する」という意味があるわけではありませんよ。


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

Name: たかぎ [URL]  ..ハッカー(147,621ポイント)   Date: 2010/01/05(火) 13:15   No:45579     
Title: Re:コンストラクタとデストラクタ    
ついでなので私も揚げ足をとります。同じく悪意はありません。

> クラスと言うのは構造体とは違い、変数だけでなく関数も一緒のグループとして取り扱えるものです。

C++では、構造体もクラスの一種です。
http://www.kijineko.co.jp/tech/superstitions/struct-is-not-class.html

> その中でコンストラクタは作ったクラスを利用する際に必ず1番最初に呼ばれる関数の事を言います。

これも正確には違います。
作ったクラスのオブジェクトを構築する際に呼ばれる特殊なメンバ関数がコンストラクタです。

クラスを利用するだけなら、コンストラクタは必ずしも必要ではありません。
具体的には、静的メンバを使うこともできますし、クラス有効範囲で定義された型を使うことも可能です。typeidやsizeof演算子のオペランドにすることもできます。
ジェネリックプログラミングでは、セマンティクスが間違っていた場合にコンパイルエラーを生じさせるためのギミックに使ったり、タグとしてテンプレート実引数に指定するためだけに使うこともあります。

> 逆にデストラクタは「デス」と付くように利用するクラスが最後に呼び出す関数の事を言います。 

語の成り立ちとしては(音節ではない点に注意)de-struct-orです。
これは、destructionという名詞から逆生された動詞destructに接尾辞-orがついたもので、元々の意味は廃棄物焼却炉や(軌道をはずれたロケット等の)破壊装置を意味します。
また、利用するクラスが最後に呼び出すのではなく、オブジェクトが解体される際に呼び出されるものです。
structは、構造体を意味するstructureと同根です。

> 使用しているクラスがスコープ(有効範囲)を抜ける際に呼び出されます。 

それはオブジェクトが自動記憶域期間を持つ場合だけです。
正確には、生存期間を終える際に呼び出されます。

> 例えばnew(動的にメモリを確保)delete(newされた領域の開放)を利用したプログラム等があるでしょう。 

newは動的にメモリを確保することが目的の演算子ではありません。
例えば、new(size_t, void*)のような位置指定形式の場合、メモリの確保は呼び出し側で行わなければなりません。
newは、オブジェクトを生成することが第一の目的です。

ちなみに、領域の開放ではなく、解放です。
http://www.kijineko.co.jp/tech/superstitions/open-memory-by-free.html



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

Name: miya  ..入門者(3,464ポイント)   Date: 2010/01/05(火) 14:40   No:45586     
Title: Re:コンストラクタとデストラクタ    
> おふた方
いえ、丁重に正してくくれて寧ろありがたく思います。
開放=>解放なのは素直に勘違いしていました。
自分が最初のころ(と言いましてもまだC++に触れるようになって駆け出しも良いところですが)
言われても分からなかった単語や言葉を避けて、なるべく感覚的に近いイメージを持ってもらおうと
屈曲した書き方をしたのも失敗でした…。(せめて「正くは違いますが」と入れるべきでした)

他人様の記事にこれ以上書くのも失礼と思いますので、失礼します。




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



Name: つら〜  ..ぴよぴよ(48ポイント)   Date: 2010/01/05(火) 11:17   No:45565       
Title: SoundとSeについて    
今サウンドと効果音をつけたいと思っているプログラムを作っています。

プログラミングは3ヶ月ちょっとやってます。

質問はボリュームがあるvoidの場所からほかのvoidのばしょにそのボリュームの値?をわたすようなことをしたいのですが。どうすればいいかわかりません。

環境はXP
言語はC



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


Name: バグ  ..ハッカー(183,230ポイント)   Date: 2010/01/05(火) 11:24   No:45566     
Title: Re:SoundとSeについて    
質問の意味が全くもって分かりません(^_^;)

>>質問はボリュームがあるvoidの場所からほかのvoidのばしょにそのボリュームの値?をわたすようなことをしたいのですが。どうすればいいかわかりません。 


『ボリュームがあるvoidの場所』というのは何の事ですか?

『ほかのvoidのばしょ』というのは何の事ですか?

『ボリュームの値』というのは何の事ですか?


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

Name: wing  ..入門者(3,423ポイント)   Date: 2010/01/05(火) 14:12   No:45582     
Title: Re:SoundとSeについて    
龍神録プログラミングの館では、
load.cppのload関数で
    sound_se[0]=LoadSoundMem("dat/se/enemy_shot.wav");
    sound_se[1]=LoadSoundMem("dat/se/enemy_death.wav");
    sound_se[2]=LoadSoundMem("dat/se/cshot.wav");
    sound_se[3]=LoadSoundMem("dat/se/char_death.wav");
    sound_se[8]=LoadSoundMem("dat/se/hit.wav");
    ChangeVolumeSoundMem( 50, sound_se[0] ) ;
    ChangeVolumeSoundMem(128, sound_se[1] ) ;
    ChangeVolumeSoundMem(128, sound_se[2] ) ;
    ChangeVolumeSoundMem( 80, sound_se[3] ) ;
    ChangeVolumeSoundMem( 80, sound_se[8] ) ;
ファイルの読み込みとボリュームの調整をしています。 music.cppでは、
void music_play(){
    int i;
    for(i=0;i<SE_MAX;i++){
        if(se_flag[i]==1){
            if(CheckSoundMem(sound_se[i])!=0){
                if(i==8)continue;
                StopSoundMem(sound_se[i]);
            }
            PlaySoundMem(sound_se[i],DX_PLAYTYPE_BACK);
        }
    }
}

se_flagが1のときに音が出るようにしています。
あとは好きなところで se_flag[0]=1 とか書けば音が出ます。


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



Name: ICE  ..ぴよぴよ(222ポイント)   Date: 2010/01/02(土) 02:23   No:45350       
Title: 最初の関数について    
ちょっと気になり、調べても解らなかったので質問いたします。
C言語で
int main(void)
void main(void)
int main()
void main()
と最初の関数には色々な書き方があるのですが、差がわかりません。
どういった差があるのでしょうか?
returnを書く以外で差があれば教えて頂きたいです。
もしやのどれを使ってもほぼ変わらないというオチですか・・・?


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


Name: sizuma [URL]  ..上級者(23,421ポイント)   Date: 2010/01/02(土) 03:08   No:45356     
Title: Re:最初の関数について    
作ったプログラムを呼び出す側の動作が違うだけで、普通にプログラミングする分には変化ないですね。
普通の処理系だと
int main(void)
ですね。
voidにすると警告を出す処理系もあるようです。
だから、戻り値がvoidの処理系もあるようだ、ってことだけ頭に入れてて自分でプログラミングときは
int main(void)で書くって覚えておけばよいと思います。(コマンドライン引数を受け取るのもあるでしょうけど)

()と(void)の違いですが、Cだと引数のチェックを行わないって意味でしょう。
例えば関数を作ります

int myprint(){
 printf("%s","this is my print");
}

これをmainから
myprint();
myprint(12);
myprint("hoge");

と呼び出しても警告もだしません。(VisualC++2008express)
チェックしてないわけですからね。

Cだと、main関数を再帰的に呼び出したり、アドレスを取得できるようなので、そういう時以外は変わりはないと思います。


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

Name: Naohiro19  ..入門者(2,749ポイント)   Date: 2010/01/02(土) 10:31   No:45366     
Title: Re:最初の関数について    
ニコニコ大百科には以下のような記述があります。
大百科記事
C言語でのmain関数は

int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
と定義するか、

int main(int argc char** argv) { /* ... */ }
のような同等の定義か、処理系依存の定義をしなければならない。(C99 5.1.2.2.1)

よって、

void main(void) { /* ... */ }
は、C言語の規格上定義されていない。

また、return せずに main 関数の最後まで到達した場合、main 関数は 0 を返したことになる。
int と互換性の無い型の値を返した場合には不定となる。(C99 5.1.2.2.3)


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

Name: ICE  ..ぴよぴよ(240ポイント)   Date: 2010/01/03(日) 18:08   No:45463 解決!     
Title: Re:最初の関数について    
やはり基本的にはあまり変わらないのですね。
ありがとうございました!


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

Name: たかぎ [URL]  ..ハッカー(146,796ポイント)   Date: 2010/01/03(日) 18:34   No:45465     
Title: Re:最初の関数について    
> やはり基本的にはあまり変わらないのですね。 

どう解釈すればそういう結論になるのかわかりません。
Cでは、

int main(void)

または

int main(int argc, char *argv[])

か、このいずれかと等価な形式しか移植性がありません。

int main()

は、実質的な問題はありませんが、

void main(void)

のような返却値の型がint以外のものは、完全に移植性が損なわれます。
簡単に移植性を保てる方法があるのに、あえてそれに背を向ける選択をするのは、ちょっと理解できませんね。


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

Name: たかぎ [URL]  ..ハッカー(146,916ポイント)   Date: 2010/01/03(日) 19:06   No:45471     
Title: Re:最初の関数について    
自己レスです。

> int main() 
> は、実質的な問題はありませんが、 

そういえば、これも実質的な問題がないとはいえませんでした。
NC30WAやNC308WA(M16CやM32Cのコンパイラ)では、main()とする場合とmain(void)とする場合で、生成されるアセンブリ言語におけるシンボルが変わったように記憶しています。
確か、前者が .main で、後者が _main だったような...(うろ覚えです)。
結果として、(ホスト環境向けの)規格通りにスタートアップを実装した場合、main() とすればリンクエラーになります。


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

Name: dic  ..熟練のプログラマー(47,346ポイント)   Date: 2010/01/04(月) 17:19   No:45492     
Title: Re:最初の関数について    
逆におうかがいしたいですが、
void main() として、警告もしくはエラーになる環境(コンパイラ)を列挙していただきたい


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

Name: softya  ..比類無きプログラマー(80,918ポイント)   Date: 2010/01/04(月) 18:01   No:45493     
Title: Re:最初の関数について    
>void main() として、警告もしくはエラーになる環境(コンパイラ)を列挙していただきたい

列挙するまでも無いでしょう。
少なくともgccならデフォルトオプションでwarningが出ます。
それでは納得出来ませんか?


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

Name: sizuma [URL]  ..上級者(23,652ポイント)   Date: 2010/01/04(月) 18:27   No:45495     
Title: Re:最初の関数について    
visualstudioもデフォルトで(たしかレベル3)警告が出ますね。

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

Name: たかぎ [URL]  ..ハッカー(146,937ポイント)   Date: 2010/01/04(月) 19:02   No:45502     
Title: Re:最初の関数について    
警告やエラーが出ようが出まいが、未定義の動作である以上、void main()のような記述は行うべきではありません。
この件に限らず、未定義の動作になる記述の多くはエラーも警告も出ません。


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

Name: dic  ..熟練のプログラマー(47,803ポイント)   Date: 2010/01/04(月) 21:59   No:45524     
Title: Re:最初の関数について    
#include    <stdio.h>

int myprint(){
    printf("%s","this is my print");
} 

typedef    int (*PFUNC)();

int    main()
{
    myprint();
    myprint(12);
    myprint("hoge");

    PFUNC    kansu = myprint;
    kansu();
    kansu(12);
    kansu("hoge");

    return 0;
}

をVC++6.0でコンパイルしたらコンパイルエラーがでるんですが・・・

C:\hoge\main.cpp(12) : error C2660: 'myprint' : 関数が不正な 1 個の実引数をともなって呼び出されました。
C:\hoge\main.cpp(13) : error C2660: 'myprint' : 関数が不正な 1 個の実引数をともなって呼び出されました。
C:\hoge\main.cpp(17) : error C2197: 'int (__cdecl *)(void)' : 実引数が多すぎます。
C:\hoge\main.cpp(18) : error C2197: 'int (__cdecl *)(void)' : 実引数が多すぎます。


VC++ Express でもコンパイルしてもコンパイルエラーですけど・・・
コンパイルしています...
main.cpp
c:\コピー 〜 hoge\main.cpp(12) : error C2660: 'myprint' : 関数に 1 個の引数を指定できません。
c:\コピー 〜 hoge\main.cpp(13) : error C2660: 'myprint' : 関数に 1 個の引数を指定できません。
c:\コピー 〜 hoge\main.cpp(17) : error C2197: 'PFUNC' : 呼び出しに対する引数が多すぎます。
c:\コピー 〜 hoge\main.cpp(18) : error C2197: 'PFUNC' : 呼び出しに対する引数が多すぎます。
ビルドログは "file://c:\コピー 〜 hoge\Debug\BuildLog.htm" に保存されました。
hoge - エラー 4、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========


もしかしたら関数へのポインタを使った場合の話ではないかと思い
付け加えてます


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

Name: dic  ..熟練のプログラマー(48,019ポイント)   Date: 2010/01/04(月) 22:03   No:45526     
Title: Re:最初の関数について    
#include    <stdio.h>

int    main()
{
    int    s;
    printf( "%d\n", s );

    return 0;
}



VC++ 6.0 の警告

コンパイル中...
main.cpp
C:\hoge\main.cpp(6) : warning C4700: 値が割り当てられていないローカルな変数 's' に対して参照が行われました。
リンク中...


VC++ Express の警告

コンパイルしています...
main.cpp
c:\コピー 〜 hoge\main.cpp(6) : warning C4700: 初期化されていないローカル変数 's' が使用されます
マニフェストをリソースにコンパイルしています...


と最近では警告でます
報告でした


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

Name: sizuma [URL]  ..上級者(23,712ポイント)   Date: 2010/01/04(月) 22:22   No:45527     
Title: Re:最初の関数について    
C言語の話ですよね。(一番上の投稿にC言語で、とあるので)
>C:\hoge\main.cpp(12) : error C2660: 'myprint' : 関数が不正な 1 個の実引数をともなって呼び出されました。
C++でコンパイルしてますよ。



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

Name: dic  ..熟練のプログラマー(48,038ポイント)   Date: 2010/01/05(火) 10:36   No:45562     
Title: Re:最初の関数について    
確認しました
たしかにCではコンパイル、実行までできますね


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



Name: 上杉謙信  ..ぴよぴよ(4ポイント)   Date: 2010/01/04(月) 18:40   No:45498       
Title: 無題    
なぜ、DXライブラリーを導入する必要があるんですか?

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


Name: たかぎ [URL]  ..ハッカー(146,935ポイント)   Date: 2010/01/04(月) 18:59   No:45501     
Title: Re:無題    
使わなければ導入する必要はありません。
 編集済み


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

Name: 上杉謙信  ..ぴよぴよ(145ポイント)   Date: 2010/01/04(月) 19:12   No:45505     
Title: Re:    
導入しなくても、出来るってことですか?

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

Name: たかぎ [URL]  ..ハッカー(146,945ポイント)   Date: 2010/01/04(月) 19:19   No:45507     
Title: Re:    
> 出来るってことですか?

何をしたいのかにもよります。


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

Name: 上杉謙信  ..ぴよぴよ(213ポイント)   Date: 2010/01/04(月) 19:25   No:45511     
Title: Re:    
解決しました。
解答ありがとうございました。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,129,338ポイント)   Date: 2010/01/05(火) 07:30   No:45553     
Title: Re:    
上杉謙信さん、こんにちは。

C言語で何をしたいとお思いでしょうか?
コンソールアプリケーション(黒い画面に文字が出てくる奴)を作るのであればDXライブラリは必要ありません。
しかし画像や音楽などを扱おうと思うと何かのライブラリを使う必要が出てきます。

C言語というものは単体では非常に機能が少ないですが、ライブラリ(という関数の集合)を
インクルードすることで、機能が増えていきます。
printfという関数もstdio.hというライブラリをインクルードすることで使えるようになっているわけです。

画像や音楽を扱えるライブラリはDirectX、OpenGL、SDL....色々ありますが、
DXライブラリは中でも非常に簡単で解り易く、初心者に易しいライブラリなのです。
なので、ここではDXライブラリを紹介しています。

おわかりいただけたでしょうか?


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



Name: banba  ..ぴよぴよ(917ポイント)   Date: 2010/01/04(月) 12:29   No:45484       
Title: 8章のinput_pad_or_key関数について    
現在僕は龍神録プログラミングの館を参考にしつつ、ゲームを作っているのですが
8章の内容を読んだところ、PadInput & mulの論理積のビット演算(?)等は理解できたのですが
input_pad_or_key関数の引数がポインタになっているのが理解できませんでした。

他のサイトなどでもよく見かけるのですが、関数の引数をポインタにするのは何の意味があるのですか?
僕は「他の関数内で宣言された変数等を参照する必要がある時」と解釈しているのですが間違っていますか?
この解釈が当たっていたとして、何故pad_t padは関数外(グローバルスコープ)で宣言されているのにこうする必要があるのですか?

ちなみに基礎的なポインタの仕組みは一応ですが理解しています。(具体的な使い方とかはまだ知らないんですけど)

とても知識の乏しい質問かもしれませんが、回答いただけるとありがたいです。


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


Name: kazuoni [URL]  ..ハッカー(124,773ポイント)   Date: 2010/01/04(月) 13:08   No:45485     
Title: Re:8章のinput_pad_or_key関数について    
input_pad_or_key関数は
「引数1と引数2のうち大きい方を引数1に代入する」
関数です。
では、引数1をint *型ではなくint型にしてみてください。
もし、引数1<引数2が成り立つとして、その関数を抜けた後に
引数1 = 引数2となっているでしょうか?

なぜこうなるか理解をしていないと、ポインタの初歩から躓いていると思われます。
もう一度、参考サイトなり、本なりを復習してみてください。


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

Name: banba  ..ぴよぴよ(976ポイント)   Date: 2010/01/05(火) 06:30   No:45551 解決!     
Title: Re:8章のinput_pad_or_key関数について    
回答ありがとうございます。

回答を参考にし、調べ直したところ
どうやら、ポインタどころか関数の仕組みに対して致命的な勘違いをしていた事が発覚しました。
もう一回基礎を勉強しなおします。


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



Name: ft  ..中級者(9,811ポイント)   Date: 2010/01/04(月) 20:06   No:45515       
Title: ホーミング弾について    
先程Justyさんに教えて貰った方法でホーミング弾を作ってみました。
お陰で弧を描くように追尾してくれるようになったのですが、
弾が敵の右側真横にたどり着くと、敵とは逆方向の右側へ飛んで行ってしまいます。
何故このようになるのでしょうか?
また補正する方法はありますか?


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


Name: Justy  ..伝説なるハッカー(491,319ポイント)   Date: 2010/01/04(月) 20:33   No:45517     
Title: Re:ホーミング弾について    
 ソースを出すとか図を書くとかもう少し環境を含めて状況説明をきちんとしないと
回答しづらいです。


> 弾が敵の右側真横にたどり着くと敵とは逆方向の右側へ飛んで行ってしまいます

 位置関係はわかりましたが、敵と弾のそれぞれの移動ベクトルはどういう状態の時におきていますか?
 その逆に飛んでいったときは、ずっと右側に直線運動でもしているのですか?


 よくわからないので、今言えることは1点だけです。
 角度の差を求めたときに 180度を越えていた場合の処理は入れていますか?
 もし入れていなければ、180度を超えた場合どうしたらいいのかを考えて、処理を追加してみて下さい。


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

Name: ft  ..中級者(9,945ポイント)   Date: 2010/01/04(月) 21:18   No:45521     
Title: Re:ホーミング弾について    
角度は
  cshot[k].angle+= (atan2f(y,x)-cshot[k].angle)*0.25f;
としました。

図のように敵の右真横に並ぶとそのままAのように振動して右側へ飛びます。
また下からだけでなく、上から右真横に行った時もAのような軌道をとります。

>180度を超えた場合どうしたらいいのか
もしかして、もしも自機弾と敵が190度をなす位置関係にいたとしたら、atan2は10度を返すのですか? 編集済み


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

Name: Justy  ..伝説なるハッカー(491,628ポイント)   Date: 2010/01/05(火) 00:10   No:45539     
Title: Re:ホーミング弾について    
 なるほど。
 180度問題っぽいですね。

 角度の差を出したとき、その角度が -180〜180度の範囲の外にあった場合、
角度を正規化して -180〜180度の範囲に収まるようにしてあげる必要があります。

 例えば 181度は -179度に、-181度は 179度に、です。

 式で書くと

    if(deltaAngle > PI)
        deltaAngle = deltaAngle - PI * 2;
    else
    if(deltaAngle < -PI)
        deltaAngle = -deltaAngle - PI * 2;

 こんなかんじでしょうか。
 あとはこの角度を元に何かしらフィルタをかけて、弾の角度に足せばいいんじゃないかと。


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

Name: ft  ..中級者(10,057ポイント)   Date: 2010/01/05(火) 00:46   No:45541 解決!     
Title: Re:ホーミング弾について    
できました!
-180と180の間でブルブルしていたのですね。
一応自分でも作ってみたのですが、
文章構成が醜い上、無駄処理があったのでJustyさんが考えて下さったものを使いたいと思います。
分かりにくい質問に付き合って頂き有難うございました。


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

Name: Justy  ..伝説なるハッカー(492,028ポイント)   Date: 2010/01/05(火) 01:33   No:45546     
Title: Re:ホーミング弾について    
 できたようでなによりです。

 あと、この手のホーミング時に注意することとしては集束時の処理でしょか。
 確実に敵に向くホーミングでない場合、弾の速度が速いとターゲットの周りを
くるくる回るような動作になることがあります。

 少しくらいなら回ってもいいのですが、永遠に回ることも考えられるので対策を入れるか
そうならないよう調整しておいたほうがいいでしょう。


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

Name: ft  ..中級者(10,073ポイント)   Date: 2010/01/05(火) 02:46   No:45550     
Title: Re:ホーミング弾について    
わかりました、ありがとうございます。

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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +