|
Name: スモモ ..入門者(3,083ポイント)
Date: 2010/10/03(日) 19:47
No:62660
|
|
Title: DX のテクスチャ処理について
|
|
お世話になっています。
CreateTextureでのテクスチャができました。
テクスチャの内容を書き換えたいですが、どうすればいいでしょうか?
ご教授の程、よろしくお願いします。
2倍のポイントを手に入れた! 136ポイント を手に入れた。
|
|
|
|
Name: スモモ ..入門者(3,124ポイント)
Date: 2010/10/03(日) 19:57
No:62661
|
|
Title: Re:DX のテクスチャ処理について
|
|
補助説明
作ったテクスチャをオフスクリーンとして扱いたいです。
ご教授の程、よろしくお願いします。
41ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(85,322ポイント)
Date: 2010/10/03(日) 19:57
No:62662
|
|
Title: Re:DX のテクスチャ処理について
|
|
テクスチャの内容を書き換えるにはD3DUSAGE_DYNAMIC及びD3DPOOL_DEFAULTでテクスチャを作成する必要があります。
あとはLockRectメソッドでロックしたら、自由に書き換えて下さい。
ここを参照すればわかりやすいかと。
2倍のポイントを手に入れた! 320ポイント を手に入れた。
|
|
|
|
|
Name: スモモ ..入門者(3,190ポイント)
Date: 2010/10/03(日) 20:10
No:62663
|
|
Title: Re:DX のテクスチャ処理について
|
|
ご回答ありがとうございます。
もし、書き換えの部分を LPD3DXSPRITE の Draw みたいに扱いたいならどうすればいいでしょうか?
ご教授の程、よろしくお願いします。
66ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(85,504ポイント)
Date: 2010/10/03(日) 20:20
No:62664
|
|
Title: Re:DX のテクスチャ処理について
|
|
書き換えたテクスチャをそのまま、Drawメソッドで使えばいいと思いますが。
DrawPrimitive等でやる場合もその書き換えたテクスチャをSetTextureでセットして
描画するだけです。
2倍のポイントを手に入れた! 182ポイント を手に入れた。
|
|
|
|
|
Name: りゅん [URL] ..ぴよぴよ(41ポイント)
Date: 2010/10/03(日) 21:18
No:62667
|
|
Title: Re:DX のテクスチャ処理について
|
|
はじめまして。
読んでいて気になるところがあったのでちょっとだけ補足です。
普通の(動的でない)テクスチャを作って LockRect でロックする場合、USAGE は 0、POOL は D3DPOOL_MANAGED でOKです。
質問には直接関係ないですけど、「D3DPOOL_DEFAULT かー… 管理めんどくさいなー」って思われたなら D3DPOOL_MANAGED で作ってみるのがいいと思います。
41ポイント を手に入れた。
|
|
|
|
|
Name: スモモ ..入門者(3,461ポイント)
Date: 2010/10/04(月) 18:06
No:62717
|
|
Title: Re:DX のテクスチャ処理について
|
|
皆様、ありがとうございます。
奇想天外ですが、こんなコード思いつきました。
LPDIRECT3DTEXTURE9 pTexture;
pDevice->CreateTexture (100,100,1,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&pTexture,NULL);
LPDIRECT3DDEVICE9 pDevice;
pTexture->GetDevice(&pDevice);
pDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
pDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
pDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(255,0,0),1.0,0);
pDevice->BeginScene();
pDevice->EndScene();
pDevice->Present(NULL,NULL,NULL,NULL);
エラーがないですが、うまくいかない。(テクスチャの内容を書き換えてないみたい)
ご教授の程、よろしくお願いします。
271ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(86,258ポイント)
Date: 2010/10/04(月) 18:22
No:62720
|
|
Title: Re:DX のテクスチャ処理について
|
|
すいません。結局何がしたいのでしょうか?
テクスチャをレンダリングターゲットにしたいのですか?
それならまず、テクスチャのサーフェイスを取得したあと、
SetRenderTargetでそのサーフェイスを指定しなければなりません。
レンダリングターゲットに設定した後は、通常通り描画するだけでテクスチャに描画されます。
当然ですが最終的には元のバックバッファに描画することになると思いますので、
あらかじめ、バックバッファのサーフェイスを取得しておかなければなりません。
提示していただいたコードでは、ただテクスチャを作って、ただバックバッファをクリアして、
何も描画せずに終了しているだけです。
何がしたいのかまったく見えないので、誰にでも分かるように具体的に説明して下さい。
よろしくお願い致します。
2倍のポイントを手に入れた! 640ポイント を手に入れた。
|
|
|
|
|
Name: スモモ ..入門者(3,515ポイント)
Date: 2010/10/04(月) 19:03
No:62725
|
|
Title: Re:DX のテクスチャ処理について
|
|
説明不足ですいません
私がやりたいのは動的テクスチャを作って、
それでそのテクスチャをいろいろなところで描画したいです。
54ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..入門者(3,986ポイント)
Date: 2010/10/04(月) 20:32
No:62737
|
|
Title: Re:DX のテクスチャ処理について
|
|
動的テクスチャを作って、
それでそのテクスチャをいろいろなところで描画、
というのをもう少し具体的にいうとどのようなことでしょうか?
もうちょっと情報が必要だと思います
67ポイント を手に入れた。
|
|
|
|
|
Name: スモモ ..入門者(3,411ポイント)
Date: 2010/10/05(火) 04:25
No:62750
|
|
Title: Re:DX のテクスチャ処理について
|
|
実は動的テクスチャを作るクラス制作中です。
できたテクスチャを3Dモデルに張ったり
(たとえば、花瓶やガラスなどのひび割れ、壁の張り紙やポスター、布や紙などのしわなど)、
文字のウインドを表示したりしたいです。
一度作ったテクスチャは何度でもつかいたいです。
半透明や透過や変色なども実現したいです。
ご教授の程、よろしくお願いします。
104ポイント を落としてしまった。
|
|
|
|
|
Name: うしお ..入門者(4,441ポイント)
Date: 2010/10/05(火) 07:17
No:62751
|
|
Title: Re:DX のテクスチャ処理について
|
|
やろうとなさっていることが、
ちょっと多くの要素を含んでいるので、一つ一つ分割して挑戦してみてはいかがでしょうか?
このサイトが参考になると思います まるぺけつくろー様です
http://marupeke296.com/DirectXMain.html
>花瓶やガラスなどのひび割れ、壁の張り紙やポスター
→おそらく出来たテクスチャを2枚重ねと言う意味でしょうか
でしたら、マルチパスレンダリング
マルチパス テクスチャー ブレンディングあたりでしょうか
>文字のウインドを表示したり
→こちらはID3DXFontを使わず高速に描画したいということでしょうか?
紹介したサイトのその5あたりのトピックでしょうか
>半透明や透過や変色→アルファブレンド 線形合成 加算合成 減算合成 乗算合成
directxはちょっとしたことに思えても、
たくさんのプロセスが必要な場合が多いと思います
やりたいことを分割して、一つ一つ手の届くところから挑戦していってはいかがでしょうか?
まずはアルファブレンドで2枚のテクスチャを重ねるところあたりが簡単かなと思います
455ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(86,535ポイント)
Date: 2010/10/05(火) 07:57
No:62754
|
|
Title: Re:DX のテクスチャ処理について
|
|
動的テクスチャを作りたいって言ってるのは、
ただ画像を読み込んでテクスチャを作りたいってことですか?
それともCreateTextureで作って、自分でデータを書き込んでテクスチャを作りたいってことですか?
まあどちらにしても、うしおさんが貼ってくださっているサイトを参考に順番に一から勉強して
いってください。
前にもスモモさんにはそのサイトを教えたはずなので、ずっとそこで勉強されているものだと
思ってましたが、もしそのサイトだけで理解が出来ないのであれば、
参考書等を購入することをお勧めします。
以上。 
182ポイント を手に入れた。
|
|
|
|
|
Name: スモモ ..入門者(3,455ポイント)
Date: 2010/10/08(金) 22:42
No:62942
|
|
Title: Re:DX のテクスチャ処理について
|
|
皆様、ありがとうございます。
勉強させていただきます。
シエルさん
私のことを気にかけていただいてありがとうございます。
44ポイント を手に入れた。
|
|
|
|
|
Name: スモモ ..入門者(3,437ポイント)
Date: 2010/10/08(金) 22:46
No:62943
| 解決!
|
Title: Re:DX のテクスチャ処理について
|
|
しばらく、勉強させていただきます。
〆マス
18ポイント を落としてしまった。
|
|
|
|
Name: みけCAT ..上級者(17,176ポイント)
Date: 2010/10/08(金) 21:50
No:62939
|
|
Title: GetKeyboardStateでキーが取得できない?
|
|
開発環境はDev-C++4.9.9.2(コンパイラはデフォルト)です。
C言語でDXライブラリを使わずにゲームを作っています。
コンパイルオプションは-mwindowsにしました。
GetKeyboardState()APIでキーの状態を取得しようとしたのですが、取得できなく困っています。
自作関数のGetKey()内でGetKeyboardState()を呼び出して取得しようとしています。
解決法がわかる方がいらっしゃいましたらよろしくお願いします。
ソースコードは長すぎると怒られたので添付しました。
135ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..上級者(17,202ポイント)
Date: 2010/10/08(金) 22:20
No:62941
|
|
Title: Re:GetKeyboardStateでキーが取得できない?
|
|
とりあえずGetAsyncKeyState()を使うことにします。
2倍のポイントを手に入れた! 26ポイント を手に入れた。
|
|
|
|
Name: カイリ ..ぴよぴよ(9ポイント)
Date: 2010/10/05(火) 14:30
No:62767
|
|
Title: iphoneアプリでの日本語入力について
|
|
IphoneのIBを使ってアプリケーションを作っております。
そこでtextfieldを使っているのですが初期文字を日本語で打てるようにすることは出来ないのでしょうか?
数字などだとプロパティのキーボードの項目を変えれば出来るのですが
日本語だけは見つからなかったので対応していないのでしょうか?
(誤記があったようなので管理人が記事を編集しました)
9ポイント を手に入れた。
|
|
|
|
Name: カイリ ..ぴよぴよ(36ポイント)
Date: 2010/10/07(木) 00:25
No:62857
|
|
Title: Re:textfield
|
|
やはり出来ないのでしょうか・・・・
ご回答が頂けないということはできなさそうですね・・・。
36ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(583,522ポイント)
Date: 2010/10/07(木) 01:52
No:62859
|
|
Title: Re:textfield
|
|
確証はないですが、UIKeyboardTypeにないですし出来ないような気がします。
そもそも日本語キーボードが設定によって無効になっている可能性もありますし。
65ポイント を手に入れた。
|
|
|
|
|
Name: カイリ ..ぴよぴよ(240ポイント)
Date: 2010/10/08(金) 18:36
No:62928
| 解決!
|
Title: Re:textfield
|
|
Justy さん
そうなのですか・・・
ご回答ありがとうございました。
実現できそうにないので仕様変更します><
迅速な回答ありがとうございました。
43ポイント を手に入れた。
|
|
|
|
Name: エメ ..ぴよぴよ(602ポイント)
Date: 2010/10/07(木) 20:38
No:62885
|
|
Title: タイトル画面
|
|
初めての投稿となります。
DXライブラリを始めて1週間程度なんですが2日間ここで困っています。
タイトル画面を作ろうとしているのですがキーを押しても動きません。
#include "DxLib.h"
void message_box(){
int flag;
flag=MessageBox(
NULL ,
TEXT("Yでフルスクリーン、Nでウィンドウモードです。") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
}
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
void char_disp(int White,int y){
DrawString( 150 , y , "■" , White );
DrawString( 170 , 100 , "SHOOTING" , White );
DrawString( 170 , 150 , "QUIT" , White );
}
void Background(){
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "gazo/taitoru2.png" ) ; //taitoru2.pngのハンドルを代入
DrawGraph( 0 , 0 , image , FALSE ) ; //taitoru2.pngを表示
}
void Backmusic(){
int music; //ハンドルを受け取るためのint型変数を宣言
music = LoadGraph( "music/03.mid" ) ; //0.3midのハンドルを代入
PlayMusic( "music/03.mid" , DX_PLAYTYPE_BACK ) ; // 03.midのバックグラウンド演奏
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int Key[256];
int White , y=100; //色とy座標の宣言
SetMainWindowText( "とあるしゅーてぃんぐ。" ) ;// タイトルを変更
message_box(); //ウィンドウ処理
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
White = GetColor( 255 , 255 , 255 ) ; //色の取得
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
Background(); //背景描画
Backmusic(); //バックグラウンド演奏
char_disp(White,y); // 文字を描画
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y+=50;
if(y==150) // y座標が150なら(選択が一番下なら)
y=100; // 選択座標を一番上に
}
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
602ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..上級者(17,041ポイント)
Date: 2010/10/07(木) 20:44
No:62886
|
|
Title: Re:タイトル画面
|
|
最初はy=100です。
y+=50によりy=150になります。
y==150なのでyを100にします。
この処理が行われるため動きません。
2ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(38,806ポイント)
Date: 2010/10/07(木) 21:50
No:62892
|
|
Title: Re:タイトル画面
|
|
こんばんは。
後々のことを考えたら次のようにするとわかりやすい、バグも少ないかもしれません。
参考にどうぞ。
@タイトル項目のための文字列や画像の座標はdefineで定義
Aカーソルのy座標は0,1,2,・・・とする。
define定義は以下のような感じで。
#define DISPLAY_POS_X 170
#define DISPLAY_POS_Y(i) (100 + 50 * (i))
#define N 2 // 項目数
カーソルの座標は
int y = 0;
などと宣言し、上下キーによってインクリメントorデクリメント
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y++;
if(y==N) // y座標がNなら(選択が一番下なら)
y=0; // 選択座標を一番上に
}
DrawString( DISPLAY_POS_X - 20 , DISPLAY_POS_Y(y) , "■" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(0) , "SHOOTING" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(1) , "QUIT" , White );
46ポイント を手に入れた。
|
|
|
|
|
Name: エメ ..ぴよぴよ(726ポイント)
Date: 2010/10/07(木) 23:17
No:62898
|
|
Title: Re:タイトル画面
|
|
キーを押すとyが150になるのにすぐ100の位置に戻してしまうから動かないっていうことですよね。
if(y==200)
y=100;
さらに1個下にさげようとすると100まで戻す という風にしたのですが…。
なにか間違えて理解してしまったのでしょうか
それと背景が数十秒表示されると表示されなくなってしまいます
度々の質問すみません 
124ポイント を手に入れた。
|
|
|
|
|
Name: wing ..中級者(13,262ポイント)
Date: 2010/10/07(木) 23:43
No:62899
|
|
Title: Re:タイトル画面
|
|
void Background(){
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "gazo/taitoru2.png" ) ; //taitoru2.pngのハンドルを代入
DrawGraph( 0 , 0 , image , FALSE ) ; //taitoru2.pngを表示
}
この関数の中でLoadGraphすると、何度も何度もtaitoru2.pngをLoadしてしまいます。
whileのそとに移したほうがいいと思います。
185ポイント を落としてしまった。
|
|
|
|
|
Name: エメ ..かけだし(1,735ポイント)
Date: 2010/10/08(金) 17:25
No:62922
| 解決!
|
Title: Re:タイトル画面
|
|
みけCAT さん シエル さん やっくん さん wing さん
ありがとうございました。
無事解決することができました。
もしかしたら同じことになる人がいるかもしれないのでそのときの参考のために(なるのか?)
残しておきます
#include "DxLib.h"
int counter=0;
int color_white;
int y = 0;
#define DISPLAY_POS_X 170
#define DISPLAY_POS_Y(i) (100 + 50 * (i))
#define N 2 // 項目数
void message_box(){ //スクリーン設定
int flag;
flag=MessageBox(
NULL ,
TEXT("Yでフルスクリーン、Nでウィンドウモードです。") ,
TEXT("スクリーン設定") ,
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
}
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
void char_disp(int White,int y){
DrawString( DISPLAY_POS_X - 20 , DISPLAY_POS_Y(y) , "■" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(0) , "SHOOTING" , White );
DrawString( DISPLAY_POS_X , DISPLAY_POS_Y(1) , "QUIT" , White );
}
void SetColor(){
color_white = GetColor(255,255,255); //白色ハンドルを取得
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。
int RefreshTime=0;
SetMainWindowText( "時鏡 鉢帳録" ) ;// タイトルを変更
SetColor(); //色を取得
int Key[256];
int White ; //色とy座標の宣言
message_box(); //ウィンドウ処理
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int Sound ;
Sound = LoadSoundMem( "music/harutoman.wav" ); //wavファイルを読み込み、ハンドルをint型変数へ格納
PlaySoundMem( Sound , DX_PLAYTYPE_BACK );//バックグラウンド再生
White = GetColor( 255 , 255 , 255 ) ; //色の取得
RefreshTime = GetNowCount(); //今の時間を取得
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "gazo/taitoru2.png" ) ; //gazo/taitoru2.pngのハンドルを代入
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
DrawGraph( 0 , 0 , image , FALSE ) ; //gazo/taitoru2.pngを表示
char_disp(White,y); // 文字を描画
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y++;
if(y==N) // y座標がNなら(選択が一番下なら)
y=0; // 選択座標を一番上に
}
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
1,009ポイント を手に入れた。
|
|
|
|
Name: 電気屋 ..初心者(8,306ポイント)
Date: 2010/10/04(月) 13:57
No:62689
|
|
Title: プログラムの構造
|
|
こんにちは。
私は、C言語(C++)を使い始めて2年とちょっとになります。
ポインタや構造体など基本的な能力をつけてきました。最近では簡単なゲームを作っています。
しかし、いざ作ってみるとどのように作って見ればいいのかわからず、
一様動くプログラムは作れるのですが、友達に見てもらうと「あまりよくない。」と言われてしまいました。
次回までに友達を見返してやりたいと、おもい勉強をしているのですが、何か良いサイトがあれば教えてください
122ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,284,013ポイント)
Date: 2010/10/04(月) 14:10
No:62691
|
|
Title: Re:プログラムの構造
|
|
お友達は何を見てよくないと思ったのでしょう?
ゲームの見栄え?
ゲームシステム?
プログラムの設計?
プログラムコード?
それによって変わってくると思います。
今一番解決したいことは何でしょうか。
87ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(225,347ポイント)
Date: 2010/10/04(月) 14:35
No:62698
|
|
Title: Re:プログラムの構造
|
|
プログラムのどの部分が知りたいかはっきりしないと答えづらいですね。
何のゲームかも分かりませんのでアドバイスしようにも?
まず自分のしたいこと、出来ないこと、問題点を明確にする事から始めて見ませんか?
>一様動くプログラムは作れるのですが、友達に見てもらうと「あまりよくない。」と言われてしまいました。
まず何が良くないのか、自分ではどうすれば良くなると思うのか、どんな点が力量不足な点なのかまとめてみてください。プログラムを見せてもらうのが一番かも知れません。
208ポイント を手に入れた。
|
|
|
|
|
Name: 電気屋 ..初心者(8,672ポイント)
Date: 2010/10/04(月) 17:42
No:62714
|
|
Title: Re:プログラムの構造
|
|
そうですね。
まず、自分しか解らない書き方をしてすいませんでした。
現時点で、問題点または知りたいことを書きます。
知識:
基本的な知識(ポインタ・構造体)は習得
ゲームなどの作成経験または参考書はなし。
作成は独学。
今回作成しているもの
・ゲーム⇒シューティングゲーム(四方に打つ)
友達の感想:
・プログラムコードの結合度が高い
・見栄えが悪い
・プログラムとしては動くかもしれないけど、無駄が多いから実行が遅いと思う
・変数の定義の仕方があまりよくない
などなど・・・・
今回知りたいこと:
・基本的なプログラムやcppファイルが1つのしか、作った事がないのでクラスの分け方の解るサイト
・プログラムのヘッダーファイルとcppの使い方
この2つが今の問題点です。
プログラムはあるのですが、大きすぎるのとまだバグなどがあるのでご遠慮させてください。
366ポイント を手に入れた。
|
|
|
|
|
Name: dic ..ハッカー(103,058ポイント)
Date: 2010/10/04(月) 18:02
No:62716
|
|
Title: Re:プログラムの構造
|
|
私なりの感想です
>友達の感想:
>・プログラムコードの結合度が高い
市販レベルでないならかまわないと思います
一人で製作している分には問題ないと思います
>・見栄えが悪い
その友達の主観からくるもので、個人の読みやすいコードでいいと思います
>・プログラムとしては動くかもしれないけど、無駄が多いから実行が遅いと思う
これも市販レベルでもないならかまわないと思います
無駄とは使用メモリのことでしょうか、実行速度のことでしょうか
ご自分の環境で十分に動くならかまわないと思います
>・変数の定義の仕方があまりよくない
これもその友達の主観ですね、気にしなくていいです
68ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(226,089ポイント)
Date: 2010/10/04(月) 18:09
No:62718
|
|
Title: Re:プログラムの構造
|
|
まず、クラスの分け方とファイルの分け方は別の問題ですね。
ファイル分けは、クラス設計がちゃんと出来る様になってからで良いかも知れません。
dicさんの指摘にある通り、多分に友達の主観に左右されますがプロのプログラマになるなら多少は気にすべきだとは思います。ちゃんとカプセル化とか継承とか出来ているのか、ソース見ないとみなさん問題点は指摘し辛いと思いますよ。全部じゃなくても良いので1つ2つクラスを取り出せませんか?
175ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,284,822ポイント)
Date: 2010/10/04(月) 18:21
No:62719
|
|
Title: Re:プログラムの構造
|
|
なるほど、主に設計の話のようですね。
効率的な設計方法についてはある程度経験則に頼る必要があるように思います。
また、先人の作ったソフトウェアの設計方法を真似するとかでしょうか。
私も昔思いましたけど、C言語の入門サイトはかなりの数あるけれど、
中級者が参考にするようなソフトの設計についてのサイトってあまり無いんですよね。
C++でのオブジェクト指向設計ついては私は先輩の設計したソフトのコードを読んで勉強しました。
恐らくオープンソースのコードを読んで構造を理解するのが良いのではないかと思います。
または、数をこなす間に効率的な設計方法が解ってくる場合もあるでしょう。
ポインタや構造体をゲームに利用したことが無いということから、今はきっとあまりゲームの作成経験が無いのだと思います。
沢山ゲームを作っていくうちに解る事も多いです。
ゲームの作成経験が無いうちから大規模なゲームのオープンソースを読んでもわけがわからないかもしれませんから、
ある程度理解できる力を付け、何が非効率で、どう改善すべきなのか自分で解るレベルになってからの方がよいかもしれません。
で、オブジェクト指向で設計する時のポイントとしては、
そのオブジェクト名が「物」になっているかどうかを気にしながら設計すると良いかもしれません。
また、コードの結合度が強いという事ですが、再利用性や独立性を気にすると良いと思います。
そのモジュールをファイルごとペタっと他のゲームプログラムに貼りつけて呼ぶだけでもう他のゲームプログラムでも利用できるかどうかそんな汎用性や再利用性があるかどうか気にすると良いと思います。
何もかもそれにあてはまればいいかと言えばそうではないので、その辺は難しい所ですね。
もしグローバル変数を多用したりしている場合は、これが再利用性を低くしてしまっている可能性があります。
UI関連などでシングルトンを使う場合はあるかもしれませんが、なるべくグローバル変数を使わない設計がC++では望ましいと思います。
設計方法については、なかなか難しいと思いますから、詳細なゲームの仕様を記載したうえで、自分がこれがクラスになりそうだと思ったものを列挙してみてはいかがでしょう。
おかしければ何かアドバイスが受けられるかもしれません。
また、投稿できるソースコードであれば、投稿すればアドバイスが受けられるかもしれません。
809ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,284,832ポイント)
Date: 2010/10/04(月) 18:28
No:62721
|
|
Title: Re:プログラムの構造
|
|
> dicさん
全て気にしなくてもいいものかどうかは見てみないとわからないのではないでしょうか?
上に挙げられた4つはどれもより良い形へ改善出来そうなものばかりだと思いますし。
> 電気屋さん
見栄えというのはゲームの見栄えでしょうか?
美しいエフェクトであったり、素材のグラフィックであったりすることでしょうか?
これも現在どのような仕様なのかがわからないと答えづらいですね・・。
今どんな仕様なのでしょう?
2倍のポイントを手に入れた! 10ポイント を手に入れた。
|
|
|
|
|
Name: dic ..ハッカー(103,374ポイント)
Date: 2010/10/04(月) 18:46
No:62722
|
|
Title: Re:プログラムの構造
|
|
>>Dixqさん
>全て気にしなくてもいいものかどうかは見てみないとわからないのではないでしょうか?
>上に挙げられた4つはどれもより良い形へ改善出来そうなものばかりだと思いますし。
失礼ながら言いますが
プログラムを完成することを目的としているなら気にしなくていいと私は思っています
プログラムの書き方やタブの数などを気にしているようであれば、だんまりします
あくまでも手段であって目的ではないと考えています
まれに、ひどいソースコードを見かけますが、まれにしかありませんし、しかし、そのプログラムは
動くので問題ないと考えています
誰もが見やすくて修正しやすく、再利用しやすい書き方があれば標準化して欲しいです
改善点はあるかもしれないですが、ソースコードを見れない限りはなんともいえないです
見栄えとは個人的感覚に基づきます
画像のように人によって見え方が違うこともあります
316ポイント を手に入れた。
|
|
|
|
|
Name: ISLe ..プログラマー(25,098ポイント)
Date: 2010/10/04(月) 19:03
No:62724
|
|
Title: Re:プログラムの構造
|
|
> 画像のように人によって見え方が違うこともあります
これは「おばあさんにも女の人にも見える絵」ではないのですか?
(追記)
たとえばとても基本的なことですが
HitCheck_MyShip_Enemy
HitCheck_Enemy_MyShip
という二つの関数があったとしたら
わたしはどちらを主体に当たり判定しているか関数名だけで分かるように変えたほうが良いと思います。
どちらにも読めることに価値があるとはとても思えません。

26ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(226,111ポイント)
Date: 2010/10/04(月) 19:16
No:62726
|
|
Title: Re:プログラムの構造
|
|
>まれに、ひどいソースコードを見かけますが、まれにしかありませんし、しかし、そのプログラムは
>動くので問題ないと考えています
多人数で仕事をしていると読むのが困難なプログラムには出会います。
そのプログラムのデバッグをする事になったりすることも多々あるので、プロであれば出来れば読みやすく関数や変数の意味が推察しやすい命名規則やプログラム構造になっているのが望ましいと私は思います。
決して動けばOKだと思ったことは一度もありません。ひどい目には何度も会いました。
この見解は並行性をたどると思いますので、議論する場合は別のスレッドにさせてください。
それはそれとして「問題だと思う質問者」と「問題だと思う回答者」がいるのは事実なので回答者さんに対しては、「問題だと思う回答者」としての回答を返したいと思います。 
22ポイント を手に入れた。
|
|
|
|
|
Name: ISLe ..プログラマー(25,229ポイント)
Date: 2010/10/04(月) 19:26
No:62727
|
|
Title: Re:プログラムの構造
|
|
#連投すみません。
最近はプロでない作者のケータイアプリが配布サイトで人気が出て続編や移植が行われるケースも少なくありません。
そういうアプリの制作仕事の依頼を貰ったりするのですが、ソースコードがあんまりにもあんまりで、他のキャリア向けにはほとんど作り直さないと無理、これだけ掛かります。と見積りを出して断られたことが何度もあります。
#依頼を受けたアプリは数年経ったいまだ配布されていません。
すくなくとも質問者さんは意見を求めるために友達に見せたわけですし。

131ポイント を手に入れた。
|
|
|
|
|
Name: ぽこ ..プログラマー(31,584ポイント)
Date: 2010/10/04(月) 19:28
No:62728
|
|
Title: Re:プログラムの構造
|
|
> まれに、ひどいソースコードを見かけますが、まれにしかありませんし、しかし、そのプログラムは
> 動くので問題ないと考えています
これでOKと言えるのは、入門者だけでは?
電気屋さんは、次のステップへ進むために質問しているんですよね?
> 改善点はあるかもしれないですが、ソースコードを見れない限りはなんともいえないです
これには同意します。
> 見栄えとは個人的感覚に基づきます
> 画像のように人によって見え方が違うこともあります
これには、反対。
「分かりやすい作文の書き方」等があるように、プログラムにも
万人に共通する美醜といういうものがあるとは思いませんか?
128ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..入門者(3,919ポイント)
Date: 2010/10/04(月) 20:03
No:62733
|
|
Title: Re:プログラムの構造
|
|
見やすく、保守しやすく、柔軟性に優れ・・・etc
やはり日々訓練をしてより良いコードを書けるようになりたいですね
設計に関して、自分が非常に参考にしているのをいくつか挙げてみます
参考になれば幸いです
サイト&本 ロベールのC++教室
http://www7b.biglobe.ne.jp/robe/cpphtml/index.html
入門編からクラスの基本など非常に分かりやすくまとめている印象でした
本『Effective C++』スコット・メイヤーズ (著), 小林 健一郎 (翻訳)
出版社: ピアソン・エデュケーション
プログラムとデザインについて数多くのアドバイスがまとめられています
234ポイント を手に入れた。
|
|
|
|
|
Name: 電気屋
Date: 2010/10/12(火) 14:32
No:626891286861566
| 解決!
|
Title: Re:プログラムの構造
|
|
書き込みが遅れてすみません。
パソコンの調子が悪く修理に出していたので書き込みができませんでした。
今、うしおさんに教えてもらったサイトで勉強しています。
勉強してある程度完成したら、またすれ立てます。
|
|
|
|
Name: ナイ ..ぴよぴよ(810ポイント)
Date: 2010/10/08(金) 02:57
No:62903
|
|
Title: newによる多次元配列の開放について
|
|
こんばんは いつもお世話になっています。
今回、以下のようなコードをプログラムの一部で組んでいます。
CHAR** BUF_STRING_A;
INT CREATE_STRING(VOID)
{
BUF_STRING_A = new CHAR*[ LINE_NUM ];//1次元での確保
for( int i = 0; i <= LINE_NUM; i ++ )
{
BUF_STRING_A[i] = new CHAR[ STRING_NUM ];//各ポインタに2次元分の確保
}
return 0;
}
INT DELETE_STRING(VOID)
{
for( int i = 0; i <= this->LINE_NUM; i ++ )
{
if( this->BUF_STRING_A[i] == NULL ) continue;
delete this->BUF_STRING_A[i];
this->BUF_STRING_A[i] = NULL;
}
if( this->BUF_STRING_A != NULL )
{
delete this->BUF_STRING_A;
this->BUF_STRING_A = NULL;
}
}
その中で最後から4行目の
delete this->BUF_STRING_A;で
「Windows によって Project.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。Project.exe または読み込まれた DLL にバグがあります。
あるいは、Project.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。」
というエラーがでます。
調べたところ、開放済みなどのポインタを再度deleteするなどをすると起きると書かれていたのですが
配列 CHAR* BUF_STRING_A[i] の開放をしたあと大元であるCHAR** BUF_STRING_A自体の開放はしなくてもよいのでしょうか??
分かりにくい文ですが、よろしくお願いいたします。
508ポイント を手に入れた。
|
|
|
|
Name: gyz ..入門者(3,908ポイント)
Date: 2010/10/08(金) 07:32
No:62905
|
|
Title: Re:newによる多次元配列の開放について
|
|
領域を確保している部分の
> for( int i = 0; i <= LINE_NUM; i ++ )
ここが原因ですね
0〜LINE_NUMまでforで回すとLINE_NUM+1回実行されます
確保した領域外までアクセスすることになり
ヒープを破壊するのでdeleteの時にエラーになります
deleteの部分のfor文でも同じミスがありますので
修正が必要ですね
時々やっちゃう、うっかりミスですね
112ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..入門者(4,910ポイント)
Date: 2010/10/08(金) 09:18
No:62908
|
|
Title: Re:newによる多次元配列の開放について
|
|
BUF_STRING_A = new CHAR*[ LINE_NUM ];
と配列newを行った場合、
delete this->BUF_STRING_A;ではだめで、
配列用のdeleteである、
delete[] this->BUF_STRING_A;
という開放処理をしなければなりません。
new CHAR[ STRING_NUM ]こちらも同様です
エラーこそ出ませんが注意が必要です
127ポイント を手に入れた。
|
|
|
|
|
Name: ナイ ..ぴよぴよ(722ポイント)
Date: 2010/10/08(金) 11:47
No:62910
| 解決!
|
Title: Re:newによる多次元配列の開放について
|
|
こんにちは
ご返答ありがとうございます。
凡ミス2つもしていたとは・・・。
それで実行したところやはり同じミスがでるとおもったところ
終了処理に加え、デスストラクタでも読み込んでいたという設計のミスもありました。
多くにお騒がせして申し訳ございませんでした。
またなにかありましたときはよろしくお願いいたします、
88ポイント を落としてしまった。
|
|
|
|
Name: 駄文使い ..入門者(2,598ポイント)
Date: 2010/10/07(木) 11:44
No:62867
|
|
Title: アクションゲーム(壁判定についての質問)
|
|
DXライブラリ関数使用。
VC2008 EXPRESS出の作業環境。
進行状況:キャラクターを表示し、キャラクターから弾丸を発射するまでの作業ができている。
問題:キャラクターをステージの上に乗せる作業-つまり壁判定についてです。
現在キャラクターはイント型で作っているのですが、DXライブラリのサンプルプログラムを見たところ、フロートで作っており、これをイント型で作り出すことが可能かを教えてほしいです。
195ポイント を落としてしまった。
|
|
|
|
Name: softya [URL] ..ハッカー(228,180ポイント)
Date: 2010/10/07(木) 11:50
No:62868
|
|
Title: Re:アクションゲーム(壁判定についての質問)
|
|
>現在キャラクターはイント型で作っているのですが、DXライブラリのサンプルプログラムを見たところ、フロートで作っており、これをイント型で作り出すことが可能かを教えてほしいです。
可能です。ただ、微妙な速度を考えればfloatの方が便利です。
62ポイント を手に入れた。
|
|
|
|
|
Name: れい ..ぴよぴよ(579ポイント)
Date: 2010/10/07(木) 11:57
No:62869
|
|
Title: Re:アクションゲーム(壁判定についての質問)
|
|
駄文使いさんがんばってくださいね。
応援してます。
28ポイント を落としてしまった。
|
|
|
|
|
Name: 駄文使い ..入門者(2,734ポイント)
Date: 2010/10/07(木) 12:04
No:62870
|
|
Title: Re:アクションゲーム(壁判定についての質問)
|
|
回答ありがとうございます。
微妙な速度というと、実行速度のことでしょうか。
可能ということで、新しい質問をさせていただきます。
現在 イント型の二次配列に「0」「1」を入れておき、マップの形状どおりにキャラクターが動くように作りましたが、ジャンプした後に壁の上に乗ろうとする動きをすると、その場でY座標での動きのみで、x座標での動きが反映さえれず、乗ることができないでいます。
よろしくお願いします。
136ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(45,578ポイント)
Date: 2010/10/07(木) 19:08
No:62876
|
|
Title: Re:アクションゲーム(壁判定についての質問)
|
|
とりあえず…
if(ch.x%1==0 && ch.y%1==0){ //座標が32で割り切れたら入力可能
これは間違えているのでは?
60ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(229,035ポイント)
Date: 2010/10/07(木) 21:21
No:62890
|
|
Title: Re:アクションゲーム(壁判定についての質問)
|
|
見ただけですがパコネコさんの指摘にもある部分で32ドット単位で歩くのか1ドット単位で歩くのかシステムを明確にした方が良いと思います。
それとジャンプ後の位置をch.xとch.y基準で決めてますが当たり判定がch.xとch.yなので、障害物の上に乗ることはどうやっても出来ません。ここも直す必要がありますね。
結局のところの、現在位置はch.xとch.yで持っていてジャンプの処理をベクトルで管理したほうが処理しやすくなりますが、そこでどうしても少数以下が欲しくなるのでfloatが無いのは非常に面倒なんですよね。
方法としては数値全てを10倍して仮想的に少数位の一桁目を整数の一の位に持ってきます。で、マップと突き合わせたり表示するときだけは10で割って元の値に戻します。って分かりますでしょうか?
float a = 4;
a = a * 0.3;
int b = (int)a;
printf( "b=%d\n", b );
と
int a= 40;
a = a * 3;
int b = a / 10;
printf( "b=%d\n", b );
は同等ってことです。
ここまで面倒なことをしてintにこだわるかは駄文使いさんにお任せします。
2倍のポイントを手に入れた! 780ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(45,803ポイント)
Date: 2010/10/07(木) 23:05
No:62896
|
|
Title: Re:アクションゲーム(壁判定についての質問)
|
|
//微妙な速度というと、実行速度のことでしょうか。
一応これについて…
私はint型以外で作ることは少ないので、intで作るのは悪いこととは思いませんが、
こだわろうとするとどうしてもめんどうです。
困る部分としては、ジャンプなどの移動距離(速度)です。
例えばジャンプの移動量を常に下に向けるにしてもintでは最低でも1ずつしかできません。
自然落下で0.5ずつとかのスピードの調節がやりづらくなってしまいます。
スピードを上げたいときも、1から2(2倍)へ大きな変化になってしまいます。
0.5から0.75へとかができないのです。
微妙な速度とはこのことを言っていると思います。
225ポイント を手に入れた。
|
|
|
|
|
Name: naohiro19 ..かけだし(1,765ポイント)
Date: 2010/10/08(金) 07:57
No:62906
|
|
Title: Re:アクションゲーム(壁判定についての質問)
|
|
softyaさんに補足をつけます。
固定小数点という考え方があります。
0x0001 0000
[整数部][小数部]
として考えます。
0x10000000と書いた場合は実数の1.0として考えます。
0x00008000と書いた場合は実数の0.5として考えます。
0x00001600と書いた場合は実数の0.75として考えます。
計算方法:
計算したいものを16回左シフトしておき、計算した結果を右に16回シフトします。
//インクルードを省略しているので必要な場合は付け加えてください
int main()
{
int x = 100;
int mx = 0x8000; //0.5
int i;
x = x << 16; //xを固定少数にする
for (i = 0; i < 3; i++) {
x += mx; //0.5ずつ加える
printf("[変換前:%d][変換後:%d]\n", x, x >> 16);
}
return 0;
}
-- 追記
計算方法が間違っていましたので修正しました。
-- 追記2
漢字がおかしかったので修正しました。 
196ポイント を手に入れた。
|
|
|
|
Name: yamataro ..かけだし(1,288ポイント)
Date: 2010/10/07(木) 21:36
No:62891
|
|
Title: 二次元配列の動的確保について
|
|
最近久しぶりにゲームを作って、テキストファイルからマップデータのロードをやっているんですが、
ポインタ変数にnewでint型の二次元配列がつくれません。僕は
int** map;
map = new int[map_y][map_x];
とやっているのですが、
・定数式が必要(関数 map_change(char *) )
・'int ( *)[1]' 型は 'int * *' 型に変換できない(関数 map_change(char *) )
というエラーが出ます(コンパイラはBorland C++です)。
なんかやり方自体違う気がするんですが、どうしたらいいでしょうか?
239ポイント を手に入れた。
|
|
|
|
Name: やっくん ..プログラマー(38,855ポイント)
Date: 2010/10/07(木) 21:55
No:62893
|
|
Title: Re:二次元配列の動的確保について
|
|
こんばんは。私自身、newではなくmallocを使うのであまり詳しくは無いですが、以下のようにしてはどうでしょう?
int **map;
map = new int* [map_y];
for(int i = 0; i < map_y; i++)
map[i] = new int[map_x];
mapの下にint*を確保し、さらにその下のそれぞれにint型を確保しています。
<追記>
deleteする際は確保と順番を逆にして、
for(int i = 0; i < map_y; i++)
if(map[i]) delete[] map[i];
if(map) delete[] map; 
49ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(39,165ポイント)
Date: 2010/10/07(木) 22:10
No:62894
|
|
Title: Re:二次元配列の動的確保について
|
|
上記の手法ではメモリが連続した位置に確保されてないので、もし局所性を考えて連続した場所に確保したいならば使用するメモリを一度に確保し、その後にポインタで細かく指していくと良いです。
参考
2倍のポイントを手に入れた! 310ポイント を手に入れた。
|
|
|
|
|
Name: yamataro ..かけだし(1,362ポイント)
Date: 2010/10/07(木) 23:08
No:62897
| 解決!
|
Title: Re:二次元配列の動的確保について
|
|
やっぱり、一次元配列でやるほうが簡単そうだったので、
softyaさんのやり方を採用させていただきました。
おかげで、ちゃんとファイルからマップのロードを行うことができました。
みなさん、ご回答ありがとうございました!
74ポイント を手に入れた。
|
|
|
|
Name: kokuoutyou [URL] ..入門者(2,728ポイント)
Date: 2010/10/06(水) 20:37
No:62844
|
|
Title: 連鎖ゲーム
|
|
今連鎖ゲーム作ってますがなかなか連鎖してくれません
縦の列か横の列のマークが二つ以上そろったら
そろったところを消すをやりたいのですがエラーが出てしまって出来ません
どうしたら出来ますか?教えてください
void cak1
で検査しています
念のためデータは↓です
http://share-3.kokuoutyou.server.co.jp/お願いしてるやつ/連鎖ゲーム.zip
void cak1()
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(map[i][j]==0)
{
return;
}
if(map[i][j]==map[i+1][j])
{
map[i+1][j]=0;
if(map[i][j]==map[i+2][j])
{
map[i+2][j]=0;
if(map[i][j]==map[i+3][j])
{
map[i+3][j]=0;
if(map[i][j]==map[i+4][j])
{
map[i+4][j]=0;
}
}
}
map[i][j]=0;
}
if(map[i][j]==map[i-1][j])
{
map[i-1][j]=0;
if(map[i][j]==map[i-2][j])
{
map[i-2][j]=0;
if(map[i][j]==map[i-3][j])
{
map[i-3][j]=0;
if(map[i][j]==map[i-4][j])
{
map[i-4][j]=0;
}
}
}
map[i][j]=0;
}
if(map[i][j]==map[i][j+1])
{
map[i][j+1]=0;
if(map[i][j]==map[i][j+2])
{
map[i][j+2]=0;
if(map[i][j]==map[i][j+3])
{
map[i][j+3]=0;
if(map[i][j]==map[i][j+4])
{
map[i][j+4]=0;
}
}
}
map[i][j]=0;
}
if(map[i][j]==map[i][j-1])
{
map[i][j-1]=0;
if(map[i][j]==map[i][j-2])
{
map[i][j-2]=0;
if(map[i][j]==map[i][j-3])
{
map[i][j-3]=0;
if(map[i][j]==map[i][j-4])
{
map[i][j-4]=0;
}
}
}
map[i][j]=0;
}
}
}
}
901ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..上級者(16,895ポイント)
Date: 2010/10/06(水) 20:43
No:62845
|
|
Title: Re:連鎖ゲーム
|
|
これだと、例えばi==0のときに[j][i-1]にアクセスした時に
マイナスの要素にアクセスするのでアクセス違反が出ます。
ヒント:for
54ポイント を手に入れた。
|
|
|
|
|
Name: kokuoutyou [URL] ..入門者(3,357ポイント)
Date: 2010/10/06(水) 21:35
No:62847
|
|
Title: Re:連鎖ゲーム
|
|
void cak1()
{
for(int k=0;k<5;k++)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(map[k][j]==map[i+1][j])
{
map[i+1][j]=0;
if(map[k][j]==map[i+2][j])
{
map[i+2][j]=0;
if(map[k][j]==map[i+3][j])
{
map[i+3][j]=0;
if(map[k][j]==map[i+4][j])
{
map[i+4][j]=0;
}
}
}
map[k][j]=0;
}
if(map[k][j]==map[i][j+1])
{
map[i][j+1]=0;
if(map[k][j]==map[i][j+2])
{
map[i][j+2]=0;
if(map[k][j]==map[i][j+3])
{
map[i][j+3]=0;
if(map[k][j]==map[i][j+4])
{
map[k][j+4]=0;
}
}
}
map[k][j]=0;
}
}
}
for(int i=5;i<0;i--)
{
for(int j=0;j<5;j++)
{
if(map[k][j]==map[i+1][j])
{
map[i+1][j]=0;
if(map[k][j]==map[i+2][j])
{
map[i+2][j]=0;
if(map[k][j]==map[i+3][j])
{
map[i+3][j]=0;
if(map[k][j]==map[i+4][j])
{
map[i+4][j]=0;
}
}
}
map[k][j]=0;
}
if(map[k][j]==map[j][i+1])
{
map[j][i+1]=0;
if(map[k][j]==map[j][i+2])
{
map[j][i+2]=0;
if(map[k][j]==map[j][i+3])
{
map[j][i+3]=0;
if(map[k][j]==map[j][i+4])
{
map[j][i+4]=0;
}
}
}
map[k][j]=0;
}
}
}
}
}
↑までは分かったけどまだ出来ない見たい
629ポイント を手に入れた。
|
|
|
|
|
Name: kokuoutyou [URL] ..入門者(3,989ポイント)
Date: 2010/10/06(水) 22:04
No:62851
|
|
Title: Re:連鎖ゲーム
|
|
void cak1()
{
for(int i=1;i<6;i++)
{
for(int j=1;j<6;j++)
{
if(map[i-1][j-1]==0)
{
return;
}
if(map[i-1][j-1]==map[i-1][j-1])
{
map[i-1][j-1]=0;
if(map[i-1][j-1]==map[i][j-1])
{
map[i][j-1]=0;
if(map[i-1][j-1]==map[i+1][j-1])
{
map[i+1][j-1]=0;
if(map[i-1][j-1]==map[i+2][j-1])
{
map[i+2][j-1]=0;
}
}
}
map[i-1][j-1]=0;
}
if(map[i-1][j-1]==map[i][j-1])
{
map[i-1][j-1]=0;
if(map[i-1][j-1]==map[i][j])
{
map[i][j]=0;
if(map[i-1][j-1]==map[i][j+1])
{
map[i+1][j+1]=0;
if(map[i-1][j-1]==map[i][j+2])
{
map[i+2][j+2]=0;
}
}
}
map[i-1][j-1]=0;
}
}
}
}
↑のどこが間違ってるか分かりません教えてください
632ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(44,831ポイント)
Date: 2010/10/07(木) 18:26
No:62874
|
|
Title: Re:連鎖ゲーム
|
|
mapの宣言はどうなっているのでしょうか?
もしかして
map[5][5]とかになってないでしょうか?
どういうエラーが出ているのでしょうか?
↑はただの想像なので違ったらすいません。
54ポイント を手に入れた。
|
|
|
|
|
Name: パコネコ ..熟練のプログラマー(45,518ポイント)
Date: 2010/10/07(木) 18:54
No:62875
|
|
Title: Re:連鎖ゲーム
|
|
連続失礼します。
勝手ながらコメントを入れさせていただきました。
勘違いなども含んでいるかもしれませんが、一応…仕様と違うと思うものが多かったので…
void cak1(){
for(int i=1;i<6;i++){
for(int j=1;j<6;j++){
//消せるかの判定? このままでは終了判定?
if(map[i-1][j-1]==0){
//コンティニューでいいのでは?
return;
}
//必要? 打ち間違い?
if(map[i-1][j-1]==map[i-1][j-1]){
//判定済みは消す?
map[i-1][j-1]=0;
//一つ右と同じか判定 でも0で確定している。
if(map[i-1][j-1]==map[i][j-1]){
//すでに0で確定しているので意味ない?
map[i][j-1]=0;
//二つ右と判定 ここも0なら次へ
if(map[i-1][j-1]==map[i+1][j-1]){
//0と確定しているので意味ない
map[i+1][j-1]=0;
//もうひとつとなり3つ右と判定 0なら次へ
if(map[i-1][j-1]==map[i+2][j-1]){
//ここでも意味なし
map[i+2][j-1]=0;
}
}
}
//上で同じ処理しているため意味がない
map[i-1][j-1]=0;
}
//一つ右と判定
if(map[i-1][j-1]==map[i][j-1]){
//0にする
map[i-1][j-1]=0;
//右上と判定(左下を0,0とした場合)
if(map[i-1][j-1]==map[i][j]){
//0と比べて0なら0へするので意味なし。
map[i][j]=0;
//二つ上と判定
if(map[i-1][j-1]==map[i][j+1]){
//二つ右上を0に?なぜ…
map[i+1][j+1]=0;
//一つ右3つ上と判定
if(map[i-1][j-1]==map[i][j+2]){
//3つ右3つ上を0に…???
map[i+2][j+2]=0;
}
}
}
//もう一度0に…3回目?4かな?
map[i-1][j-1]=0;
}
}
}
}
687ポイント を手に入れた。
|
|
|
|
|
Name: kokuoutyou [URL] ..入門者(4,518ポイント)
Date: 2010/10/07(木) 19:35
No:62877
|
|
Title: Re:連鎖ゲーム
|
|
↓を改造したらできる
void cak1()
{
for(int go=0;go<6;go++)
{
for(int og=0;og<6;og++)
{
if(map[go][og]<0){return;}
}
}
for(int i=1;i<6;i++)
{
for(int j=1;j<6;j++)
{
if(j>1)
{
if(map[i-1][j-1]==map[i-1][j])
{
xy[i-1][j]=1;
xy[i-1][j-1]=1;
}
}
if(j<4){
if(map[i-1][j-1]==map[i-1][j+1])
{
xy[i-1][j+1]=1;
xy[i-1][j-1]=1;
}
}
if(i>1)
{
if(map[i-1][j-1]==map[i][j-1])
{
xy[i][j-1]=1;
xy[i-1][j-1]=1;
}
}
if(i<4){
if(map[i-1][j-1]==map[i-1][j+1])
{
xy[i+1][j-1]=1;
xy[i-1][j-1]=1;
}
}
}
}
for(int i=0;i<5;i++){for(int k=0;k<5;k++){
if(xy[i][k]==1)
{
map[i][k]=0;
}
}}
for(int i=0;i<5;i++){for(int k=0;k<5;k++){xy[i][k]=0;}}
}
430ポイント を手に入れた。
|
|
|
|
|
Name: kokuoutyou [URL] ..入門者(4,731ポイント)
Date: 2010/10/07(木) 21:20
No:62889
|
|
Title: Re:連鎖ゲーム
|
|
void cak1()
{
for(int go=0;go<6;go++)
{
for(int og=0;og<6;og++)
{
if(map[go][og]<0){return;}
}
}
for(int i=1;i<6;i++)
{
for(int j=1;j<6;j++)
{
if(i<5)
{
if(j<5)
{
if(map[i-1][j-1]==map[i-1][j])
{
xy[i-1][j]=1;
xy[i-1][j-1]=1;
}
if(map[i-1][j-1]==map[i][j-1])
{
xy[i][j-1]=1;
xy[i-1][j-1]=1;
}
}
}
if(i>2)
{
if(i>2)
{
if(map[i-1][j-1]==map[i-2][j-1])
{
xy[i-2][j-1]=1;
xy[i-1][j-1]=1;
}
if(map[i-1][j-1]==map[i-1][j-2])
{
xy[i-1][j-2]=1;
xy[i-1][j-1]=1;
}
}
}
}
}
for(int i=0;i<5;i++){
for(int k=0;k<5;k++){
if(xy[i][k]==1)
{
map[i][k]=0;
xy[i][k]=0;
}
}
}
}
↑で出来ましたw
213ポイント を手に入れた。
|
|
|
|
Name: かんさい ..ぴよぴよ(867ポイント)
Date: 2010/10/07(木) 09:12
No:62864
|
|
Title: コンボボックスにて背景色の変更
|
|
VC初心者です。 VC6.0SP6で作成しています。
DllにてCComboboxクラス(CMyComboBox)を作成し、作成APに関連付けて動作させています。
CMyComboBoxで可能とするのは以下で、
@フォーカスを取得した時に背景色を黄色にする。
Aフォーカスを失った時に背景色を白色にする。
BENTER入力で次コントロールへフォーカスを飛ばす。
この3件ですが、Aのフォーカスを失った場合に背景色が白色にならない。
また、@のフォーカス取得ではENTERキーやTABキーからフォーカスを取得した場合は
背景色が黄色になりますが、マウスカーソルでのフォーカス取得では背景色が
変わりません。
EditBoxでも同じような処理を作成していますが、そちらではうまく動作しています。
フォーカスを失った時に背景色を変更するにはどのタイミングでどのような処理を
すればいいのでしょうか?また、マウスカーソル移動で同じ処理を行うにはどのように
すればよろしいのでしょうか?先輩方のヒントをどうかよろしくお願い致します。
CMyComboBoxの一部
BOOL CMyComboBox::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message) {
case WM_KEYDOWN:
switch(pMsg->wParam) {
case VK_TAB:
case VK_RETURN:
pMsg->wParam = VK_TAB;
m_Skip = 1;
break;
case VK_UP:
int a = CComboBox::GetCurSel();
CComboBox::SetCurSel(a);
break;
}
break;
}
return CComboBox::PreTranslateMessage(pMsg);
}
BOOL CMyComboBox::SetBackColor(COLORREF color)
{
m_bgColor = color;
if (m_brush.GetSafeHandle()) {
if (!m_brush.DeleteObject())
return FALSE;
}
if (!m_brush.CreateSolidBrush(color))
return FALSE;
if (m_hWnd) {
Invalidate();
}
return TRUE;
}
HBRUSH CMyComboBox::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetTextColor( m_clrText );
pDC->SetBkColor( m_bFocused ? m_clrBkgnd[0] : m_clrBkgnd[1] );
return CreateSolidBrush( m_bFocused ? m_clrBkgnd[0] : m_clrBkgnd[1] );
}
HBRUSH CMyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
pDC->SetTextColor( m_clrText );
pDC->SetBkColor( m_bFocused ? m_clrBkgnd[0] : m_clrBkgnd[1] );
return CreateSolidBrush( m_bFocused ? m_clrBkgnd[0] : m_clrBkgnd[1] );
}
void CMyComboBox::OnKillfocus()
{
m_bFocused = FALSE;
Invalidate(TRUE);
SetBackColor(RGB(255,255,255));
}
void CMyComboBox::OnSetfocus()
{
m_bFocused = TRUE;
Invalidate(TRUE);
}
void CMyComboBox::OnSetFocus(CWnd* pOldWnd)
{
CComboBox::OnSetFocus(pOldWnd);
m_bFocused = TRUE;
Invalidate(TRUE);
}
void CMyComboBox::OnKillFocus(CWnd* pNewWnd)
{
CComboBox::OnKillFocus(pNewWnd);
m_bFocused = FALSE;
Invalidate(TRUE);
}
579ポイント を手に入れた。
|
|
|
|
Name: かんさい ..ぴよぴよ(946ポイント)
Date: 2010/10/07(木) 11:25
No:62866
|
|
Title: Re:コンボボックスにて背景色の変更
|
|
シエル様ありがとうございます。
ですが、WM_SETFOCUSとWM_KILLFOCUSについて調べては見たのですが、
幸せになれませんでした。WM_SETFOCUSとWM_KILLFOCUSでは処理の作り方が
違うのでしょうか?WM_KILLFOCUSではひと工夫が必要でしょうか?
申し訳ありませんがもう少しヒントをお願い致します。
79ポイント を手に入れた。
|
|
|
|
|
Name: かんさい ..かけだし(1,006ポイント)
Date: 2010/10/07(木) 13:38
No:62873
| 解決!
|
Title: Re:コンボボックスにて背景色の変更
|
|
シエル様
ありがとうございました。
教えていただいたページのようにBEGIN_MESSAGE_MAP部分を
変更すれば思うように動作いたしました。
専門外でしたのに申し訳ありませんでした。
ものすごく助かりました。
60ポイント を手に入れた。
|
|
|
|
Name: しんすけ ..ぴよぴよ(146ポイント)
Date: 2010/10/06(水) 18:01
No:62830
|
|
Title: リアルタイム為替レート
|
|
リアルタイムの為替レートを作りたいです。
C言語の入門書を三冊ほど読みつくした程度の知識ですが作れますか?
開発環境は
Windows XP
VC++ 2010
理想は、グラフを表示させ、その他前日の最高ドル価と比べ現在+-いくらなのか、を表示させたいのですが、
難しいですかね?
なにを勉強すればいいですか?
C++はわからないのでC言語だけで作りたいです。
146ポイント を手に入れた。
|
|
|
|
Name: しんすけ ..ぴよぴよ(214ポイント)
Date: 2010/10/06(水) 18:47
No:62834
|
|
Title: Re:リアルタイム為替レート
|
|
>なにか使いこなせるものはありますか?
Winsockは使えます。
Winsockで値を取得するつもりだったのですが、
グラフなどの処理をどうすればいいのかわかりません。
前日の最高ドル価などはtxtなり、別ファイルでログ保存する予定でした。
68ポイント を手に入れた。
|
|
|
|
|
Name: dic ..ハッカー(104,247ポイント)
Date: 2010/10/06(水) 19:54
No:62841
|
|
Title: Re:リアルタイム為替レート
|
|
C言語だけってありますけど
WINAPIってC言語のみでいけましたっけ?
C/C++しか知らないもので参考までに
//===自分で自己解決===
そういやコールバック関数がありましたね
スレ汚しすいませんでした

51ポイント を手に入れた。
|
|
|
|
|
Name: しんすけ ..ぴよぴよ(290ポイント)
Date: 2010/10/06(水) 20:05
No:62842
|
|
Title: Re:リアルタイム為替レート
|
|
うーん・・・
結構難しそうですね>_<
あきらめるつもりはないので根気よくがんばってみます。
またわからないことがあったら質問させていただきます。
76ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..熟練のプログラマー(43,968ポイント)
Date: 2010/10/07(木) 08:26
No:62863
|
|
Title: Re:リアルタイム為替レート
|
|
プログラム的にはそう難しい物ではありませんよ。
Winsockは使いこなせるということですから、それぐらいのスキルがあるなら難なく作れると思います。
スレッドの趣旨である描画周りですが、これはさすがに何かしらのライブラリを利用する必要がありますので、
ライブラリの使い方を覚える必要がありますね。
ただ、チャートの描画なんて大体、線と短径ぐらいなんで、別に難しいところはありません。
それよりもちょっと気になったのですが、リアルタイムで、というのはティックデータが欲しいということでしょうか。
リアルタイムで刻々とデータを表示してくれるサイトはいくつかありますが、大抵フラッシュだとかjavaだとかで動いているようです。 HTMLを読み込めばOKという物ではありませんので、ここからデータを引っ張ってくるのは至難の業です。
仮に出来たとしても、パソコンを24時間つけっぱなしにしておかなければいけませんね。
私も、バックテスト用に為替のチャートソフトを自作してますが、私の場合は Forexite から自動的に日々のヒストリカルデータ(1分足)を自動的に取得するようにしています。
Forexite の場合はデータはzip圧縮でアーカイブ化して提供されていますので便利なのですが、1つのファイルに全通貨ペアが一緒になって入っていたり、データが抜けていたり、同じデータが重複していたり、GMTが+1だったり、夏時間が変則的だったりと、データの整合性を保つのにとても手こずりました。
ですから、まずは、自分が求めるデータを提供しているサイトを見つけて、そのサイトに合わせてプログラムすることになると思います。 それによって何が必要かは大きく変わってくると思いますよ。
2倍のポイントを手に入れた! 896ポイント を手に入れた。
|
|
|
|
Name: マジスー ..ぴよぴよ(46ポイント)
Date: 2010/10/06(水) 16:32
No:62823
|
|
Title: 全角文字でif分岐(C++)
|
|
半角英数字での分岐ができますが、全角を使うとできません
プログラミングを始めてばかりの初心者なので、お願いします
#include <stdio.h>
int main()
{
char ch;
printf("一文字入力してください\n");
scanf("%c",&ch);
if (ch == "あ") printf("正解です");
else printf("違います");
return 0;
}
46ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..上級者(16,634ポイント)
Date: 2010/10/06(水) 16:46
No:62825
|
|
Title: Re:全角文字でif分岐(C++)
|
|
%cは1バイトしか読み込めないので、この方法では無理です。
これでどうですか?
#include <stdio.h>
#include <string.h>
int main()
{
char ch[3]={0,0,0};
printf("一文字入力してください\n");
scanf("%2s",ch);
if (strcmp(ch,"あ")==0) printf("正解です");
else printf("違います");
return 0;
}
153ポイント を手に入れた。
|
|
|
|
|
Name: マジスー ..ぴよぴよ(52ポイント)
Date: 2010/10/06(水) 17:38
No:62826
|
|
Title: Re:全角文字でif分岐(C++)
|
|
ありがとうございます
本当に助かりました
おかげで学んだことも多かったです
6ポイント を手に入れた。
|
|
|
|
|
Name: TKOZ ..比類無きプログラマー(79,065ポイント)
Date: 2010/10/06(水) 20:25
No:62843
|
|
Title: Re:全角文字でif分岐(C++)
|
|
みけCATさんとほぼ同じですが、C++のcinとcoutを使ってみました。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char str[3];
cout << "1文字入力してください->";
cin >>str;
if(strcmp(str,"あ")==0) cout << "正解です。\n";
else cout << "不正解です。\n";
return 0;
}
2倍のポイントを手に入れた! 282ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(229,764ポイント)
Date: 2010/10/06(水) 22:21
No:62852
|
|
Title: Re:全角文字でif分岐(C++)
|
|
処理系不明なので、"あ"が(ナル文字を含めて)3バイトだと決め打ちにするのは危険です。
char ch[MB_LEN_MAX + 1] = { 0 };
としておくべきでしょう。
ロケールが日本語に対応するのであれば、
wchar_t wc;
setlocale(LC_CTYPE, ""); /* ロケールの設定は環境にあわせること */
scanf("%lc", &wc);
if (wc == L'あ') printf("正解です");
...
とするのもよいでしょう。
200ポイント を手に入れた。
|
|
|
|
|
Name: マジスー
Date: 2010/10/13(水) 17:38
No:628231286959138
| 解決!
|
Title: Re:全角文字でif分岐(C++)
|
|
お早い回答ありがとうございました
また質問しに来ます
|
|
|
|
Name: MATH.H_SUPER ..ぴよぴよ(7ポイント)
Date: 2010/10/05(火) 10:50
No:62759
|
|
Title: 円と円の当たり判定 PART2
|
|
2つの円の当たり判定をしようと思います。
cx1とcx2は2つの円の中心のx座標
cy1とcy2は2つの円の中心のy座標
cz1とcz2は2つの円の半径
pow(cx1-cx2,2.0)+pow(cy1-cy2,2.0)>=pow(cz1+cz2,2.0)
のときに当たりというような感じで正しく判定されるでしょうか?
7ポイント を手に入れた。
|
|
|
|
Name: toyo ..熟練のプログラマー(62,725ポイント)
Date: 2010/10/05(火) 12:29
No:62763
|
|
Title: Re:円と円の当たり判定 PART2
|
|
質問とは関係ないですが2乗の計算であればpow関数を使うより普通の乗算でやったほうが速いと思いますよ
double a = cx1-cx2;
double b = cy1-cy2;
double c = cz1+cz2;
if (a*a + b*b >= c*c)
{
//当たっていない
}
else
{
//当たり
}
69ポイント を手に入れた。
|
|
|
|
|
Name: MATH.H_SUPER ..ぴよぴよ(55ポイント)
Date: 2010/10/05(火) 13:46
No:62764
|
|
Title: Re:円と円の当たり判定 PART2
|
|
メインループの球の描画のところに
CircleHitCircle(jiki.tx+12,jiki.ty+12,10,tmain2.x[i],tmain2.y[i],3,jiki.hp);
を入れても反応しないのはなぜでしょうか?
48ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..入門者(4,711ポイント)
Date: 2010/10/05(火) 14:12
No:62765
|
|
Title: Re:円と円の当たり判定 PART2
|
|
CircleHitCircleという関数は
MATH.H_SUPERさんにしか分からない関数なので、
これだけでは原因を突き止めることはできません
・ステップ実行や、適当な定数を入れて動作テストをして、
CircleHitCircleが適切な動きをしているか確かめる
・CircleHitCircleが正常ならば、渡すパラメータがずれていないか確かめる
というのがシンプルなバグを見つけるためのステップではないでしょうか
デバッグの基本は問題分割です
分割をして、怪しいところを一つ一つつぶしていけば、必ず原因にたどりつけるはずです。
上記の判定の考え方は正しいので、それ以外の部分をあたってみてください
270ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(62,766ポイント)
Date: 2010/10/05(火) 14:20
No:62766
|
|
Title: Re:円と円の当たり判定 PART2
|
|
前の質問を見ると
jiki.hp = CircleHitCircle(jiki.tx+12,jiki.ty+12,10,tmain2.x[i],tmain2.y[i],3);
のようにやりたいのかなと思いましたが
41ポイント を手に入れた。
|
|
|
|
|
Name: MATH.H_SUPER ..ぴよぴよ(112ポイント)
Date: 2010/10/05(火) 14:35
No:62769
|
|
Title: Re:円と円の当たり判定 PART2
|
|
試しに、void TEST(int testx){
testx++;
}
という関数を作り、ループの場所に置いてみて、引数にttestxという変数を入れてみたのですが、0からカウントアップするはずがアップしていきません。
なぜでしょうか?
57ポイント を手に入れた。
|
|
|
|
|
Name: うしお ..入門者(4,783ポイント)
Date: 2010/10/05(火) 15:26
No:62770
|
|
Title: Re:円と円の当たり判定 PART2
|
|
これはTESTの引数が値渡しだからです
関数のなかのtestxはただのコピーです
呼び出し元のを変更したい場合はポインタ渡しや参照渡しを使う必要があります
void TEST(int* p){
(*p)++;
}
72ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(226,596ポイント)
Date: 2010/10/05(火) 15:28
No:62772
|
|
Title: Re:円と円の当たり判定 PART2
|
|
関数の引数の値渡しと参照渡しの理解が出来ていないです。
C言語なら
int TEST(int testx){
return ++testx;
}
や
void TEST(int *testx){
(*testx)++;
}
とするかC++なら
void TEST(int &testx){
testx++;
}
としないと呼び出し元に更新された値は戻りません。
97ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..上級者(15,589ポイント)
Date: 2010/10/05(火) 15:29
No:62773
|
|
Title: Re:円と円の当たり判定 PART2
|
|
関数の引数はコピーなので、書き換えても元の変数は変わりません。
int test(void) {
static int a=0;
a++;
return a;
}
とするか、
void test(int* a) {
*a++;
}
/*呼び出すときは
test(&a);
のように変数に&を付ける
*/
のようにします。 
123ポイント を手に入れた。
|
|
|
|
|
Name: MATH.H_SUPER ..ぴよぴよ(228ポイント)
Date: 2010/10/05(火) 16:16
No:62774
| 解決!
|
Title: Re:円と円の当たり判定 PART2
|
|
ポインタの勉強からがんばります!!!
親切にありがとうございましたm(_ _)m
また質問があったらよろしくお願いします!
50ポイント を手に入れた。
|
|
|
|
|
Name: TKOZ ..比類無きプログラマー(78,783ポイント)
Date: 2010/10/06(水) 19:43
No:62840
|
|
Title: Re:円と円の当たり判定 PART2
|
|
薦める本があります。ゲームプログラミングのための数学・物理学です。
この本に円の当たり判定や3Dに必要な数学・物理学が載っています。
オススメです。
5ポイント を手に入れた。
|
|
|
|
Name: グルグル ..かけだし(1,834ポイント)
Date: 2010/10/03(日) 23:56
No:62672
|
|
Title: iphoneでの画面遷移方法について
|
|
はじめまして。初めての投稿になります。最近iphoneの開発を始めたのですが、どうしても画面遷移方法がわからず、悶々としております。
基本的なこととは思いますが、ご教授頂きたくお願いします。
【やりたいこと】
・View-based Applicationで作成し、複数Viewを用意して、各View上にボタンを配置し、
単純にViewを切り替える(画面遷移)。
【どこまで実装できたか】
・とあるサイトのサンプルソースを参考+自力にて以下まで作成。
画面1(View1)がアプリ起動後表示され、画面1上のボタンを押下すると
画面2(View2)に切り替わる。
画面2上にもボタン(戻る)を作成し、このボタンを押下すると
画面1に戻る。
【困っている事】
上記実装までいったのですが、また、画面1から画面2に遷移させる方法がわからない。
そもそもの考え方が間違っているのかがわからない。
一旦、考えてみたが、ビルドーエラー5個発生。
※次項目が具体的な内容です。
【具体的な内容】
画面1上のボタンを押下時のアクション関数の内容 (nextPage())
- (IBAction)nextPage:(id)sender {
//画面2のxibを読み込んで、画面2のView、ViewControllerを作成
Seni2ViewController *nextViewController=[[Seni2ViewController alloc]initWithNibName:@"Seni2ViewController" bundle:[NSBundle mainBundle]];
//画面2のクラスに画面1のViewを保持しておく。。。このサンプルコードを見た時は、戻る時にこのViewを使うのだと認識。。A
nextViewController.parentController=self;
//画面2を表示(切替える)
[self presentModalViewController:nextViewController animated:YES];
[nextViewController release];
}
このアクションで画面1→画面2はOK
そして、画面2→画面1時、画面2上のボタン押下時のアクション関数は以下。(bakPage())
- (IBAction)backPage:(id)sender {
//nextPage()関数にて、画面1のViewは、parentControllerに格納されていたので(上記A)、この変数を使って表示を切替えた。
[self presentModalViewController:parentController animated:YES];
}
このアクションで、画面2→画面1はOK
さて、また、画面1→画面2に行きたい。nextPage()を呼ぶ!
そうすると、落ちる。これは、再度、画面2のxibを呼ぶことにより、なんかおかしくなるんだろうと想像。
ならば、フラグ制御して、いろいろ調べてみよう。。。と nextPage()関数を以下に改造。
- (IBAction)nextPage:(id)sender {
//姑息な手段でフラグ制御 goFlag=0の時、最初なので、xibにて画面2を作成。
if(goFlag==0) {
Seni2ViewController *nextViewController=[[Seni2ViewController alloc]initWithNibName:@"Seni2ViewController" bundle:[NSBundle mainBundle]];
nextViewController.parentController=self;
//次回画面2に行くために画面2のViewを保持しておこう。 B
(Seni2ViewController*)childController=nextViewController;
[self presentModalViewController:nextViewController animated:YES];
[nextViewController release];
goFlag=1;
}
else {
//この処理は、goFlag=1で、2回目以上の時だから、上記Bの変数を使って画面2のViewを切り替える想定。
[self presentModalViewController:(Seni2ViewController*)childController animated:YES];
}
}
【困っている事】にも書きましたが、そもそも画面遷移ってこういう考えで実装するのでしょうか。
また、ビルドエラー(5個)は、次のエラー(←の部分)ですが、何がいけないのかがわかりません。。。
※実際は、ボタン、アクション関数などを定義していますが、省略しています。
<画面1分>
#import <UIKit/UIKit.h>
#import "Seni2ViewController.h"
@interface SeniViewController : UIViewController {
Seni2ViewController *childController; ←エラー:Expected specifier-qualifier-list before SeniViewController
}
@property (nonatomic,retain) Seni2ViewController *childController;
↑エラー:Expected specifier-qualifier-list before SeniViewController
@end
<画面2分>
#import <UIKit/UIKit.h>
#import "SeniViewController.h"
@interface Seni2ViewController : UIViewController {
SeniViewController *parentController; ←エラー:Expected specifier-qualifier-list before SeniViewController
}
@property (nonatomic,retain) SeniViewController *parentController;
↑エラー:Expected specifier-qualifier-list before SeniViewController
@end
あと、goPage()のアクション関数にもエラー
(IBAction)nextPage:(id)sender {
:
(省略)
nextViewController.parentController=self; ←Request for member 'parentController' in something not a structure or union
:
(省略)
}
※parentController およびchildController の@synthesize定義はしています
長々と申し訳ありません。何かきっかけを頂ければ幸いです。
よろしくお願いいたします。
※インデントがバラバラ表示で見にくく、申し訳ありません。
1,834ポイント を手に入れた。
|
|
|
|
Name: ら ..ぴよぴよ(231ポイント)
Date: 2010/10/04(月) 04:02
No:62676
|
|
Title: Re:iphoneでの画面遷移方法について
|
|
はじめまして。
3D周りの情報を探していてたまたまこのスレッドに流れつきました。
斜め読みです&IBを使わなくなっちゃってるので的外れかもしれません。参考まで。m(__)m
画面1から画面2に移るときに
モーダルビューで移動してるようなので、
画面2から
[self dismissModalViewControllerAnimated:YES];
みたいにしたらどうでしょうか。
具体的には下記の箇所を、
>- (IBAction)backPage:(id)sender {
> //nextPage()関数にて、画面1のViewは、parentControllerに格納されていたので(上記A)、この変数を使って表示を切替えた。
> [self presentModalViewController:parentController animated:YES];
>}
>- (IBAction)backPage:(id)sender {
> [self dismissModalViewControllerAnimated:YES];
>}
231ポイント を手に入れた。
|
|
|
|
|
Name: ら ..ぴよぴよ(354ポイント)
Date: 2010/10/04(月) 04:20
No:62677
|
|
Title: Re:iphoneでの画面遷移方法について
|
|
途中で投稿しちゃいました。。。といいつつ、後者のように書けばいけるんじゃないかなぁ、、と。
ついでにサンプル組んでみたのをアップロードしたいのですが、容量制限に引っかかってうまくいかないです。。。
>【困っている事】にも書きましたが、そもそも画面遷移ってこういう考えで実装するのでしょうか。
モーダルビューでの移動はログイン画面とか一時的な画面に使う印象がありますね。あと、戻ることを前提としているような。
階層型構造でたどって移動するときには、UINavigationControllerでのpush&popなきがします。用途次第なかんじですね。
123ポイント を手に入れた。
|
|
|
|
|
Name: グルグル ..入門者(2,580ポイント)
Date: 2010/10/04(月) 23:26
No:62746
| 解決!
|
Title: Re:iphoneでの画面遷移方法について
|
|
..ぴよぴよさん ありがとうございました。
何だか狐につままれた感じです。遷移しました。
画面1から画面2に遷移するアクション関数 nextPage()と
画面2から画面1に遷移するアクション関数 backPage()を以下のように書き換えました。
画面2から画面1へは、仰せの通り、書き換えました。
//画面1から画面2へ
- (IBAction)nextPage:(id)sender {
Seni2ViewController *nextViewController=[[Seni2ViewController alloc]initWithNibName:@"Seni2ViewController" bundle:[NSBundle mainBundle]];
[self presentModalViewController:nextViewController animated:YES];
[nextViewController release];
}
//画面2から画面1へ
- (IBAction)backPage:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
【自分なりの結論】
そもそもModalViewControllerの性質をわかっていない気がしています。
画面1上ボタンを押下するとnextPage()が呼ばれますが、
毎回、xibで画面2がインスタンス化されることになりますが、
それは上書きされるので、それはそれでよい(のかな。。。)。
画面2を表示して、自分で消える。。という考えですね。
では、さらに、画面2に画面3を作る。。。これも同じような気がしていますが、
(直線的な遷移になりますよね。。。1→2→3→2→1→2→3→2→3→×1は無しですよね)
でもでもでも。。。
そういう画面はModalViewControllerではなく、ViewNavigationControllerを使用した方がいいのではないか。。。
画面インターフェースも理解(実感)していないので、出直してきます。
ありがとうございました。
746ポイント を手に入れた。
|
|
|
|
|
Name: ら ..ぴよぴよ(0ポイント)
Date: 2010/10/05(火) 02:45
No:62749
|
|
Title: Re:iphoneでの画面遷移方法について
|
|
遷移できたようでよかったです。
>画面1上ボタンを押下するとnextPage()が呼ばれますが、
>毎回、xibで画面2がインスタンス化されることになりますが、
>それは上書きされるので、それはそれでよい(のかな。。。)。
>画面2を表示して、自分で消える。。という考えですね。
[nextViewController release];
で開放するので、
次回もalloc&initで新しくインスタンス生成していて、
上書きにはならないんじゃないかなと思ったりします。
自分で消えるという考えかたでOKだと思います。
もし画面3まで作成するのでしたら、
モーダルでもできなくはないような気がするのですが、
用途を推測すると、UINavitionControllerを使って、
1=>2や2=>3のときは、
– pushViewController:animated:
を使う。
3=>2や2=>1のときは、
– popViewControllerAnimated:
をつかう。
3=>1のときは、
– popToRootViewControllerAnimated:
を使うのがいいんじゃないかなと思ったります。
383ポイント を落としてしまった。
|
|
|
|
|
Name: グルグル ..入門者(2,679ポイント)
Date: 2010/10/05(火) 08:20
No:62755
|
|
Title: Re:iphoneでの画面遷移方法について
|
|
‥ぴよぴよさん
フォローありがとうございます。
非常にうれしいです。
メモリ管理が把握できてないのですが、
インスタンス作成して、画面切り替えて、releaseする…
それも連続して処理するソースコードですね…
画面というのは、リソースとして、別管理なんですかね…
ピンときませんが…
うーん
いろんな例を見てみます
ありがとうございました
99ポイント を手に入れた。
|
|
|
|
|
Name: グルグル ..入門者(2,788ポイント)
Date: 2010/10/06(水) 00:18
No:62811
| 解決!
|
Title: Re:iphoneでの画面遷移方法について
|
|
画面遷移が自分なりに学習できる本を見つけました。
ちょっと古い本ですが、がんばってみます。
ありがとうございました。
..ぴよぴよさん スイマセンでした。名前は ら さんだったんですね。
見間違えていました。失礼いたしました。
109ポイント を手に入れた。
|
|
|
|
Name: Ex ..ぴよぴよ(222ポイント)
Date: 2010/10/03(日) 20:41
No:62665
|
|
Title: 発射された弾の当たり判定
|
|
初めまして Exと申します。
現在STGを作っています。環境は、OSがVista エディタがBCC Deberoperです。
自機は描画・キー操作 弾は描画・発射・画面外にでた時の処理までできていて、
ここから当たり判定を付けようと思ったのですが、うまくいきません。
簡単に説明すると、
#defineで弾の数を決定 Tamakazu 50 とする
弾自体は配列で Tama[Tamakazu] とする
↓
forを使って
Tama[Tamakazu]をTamakazu分初期化(関数使用)
for(i=0,i<Tamakazu,i++;){ Tama[i]flag=0; }
こんな感じ
↓
Zが押されていたらTama[Tamakazu]の50個のうち1つフラグを立てる(関数使用)
↓
フラグが立っていたら、フラグが立っているTana[tamakazu]を発射描画(関数)
↓
発射描画されている弾が、Y座標20より上にいけば(20より小さくなれば)
X++;
で、弾の発射描画まではいいんですが、Y座標20より上にいっても
Xがプラスされないんです。
当たり判定のコードは、
if(Tama[i].y<=20)X++;
です。
分かりにくい所があったら言って下さい。
222ポイント を手に入れた。
|
|
|
|
Name: Ex ..ぴよぴよ(0ポイント)
Date: 2010/10/04(月) 16:31
No:62710
|
|
Title: Re:発射された弾の当たり判定
|
|
すいません Xは特に意味はないです。言い換えるなら適当な処理です。 X座標とかではないです。
当たり判定部分・・・というと、弾の当たり判定の範囲ですか?
それならば、弾は結構小さいので、単純に弾のX座標とY座標がそのまま当たり判定です。
弾が当たったかどうかの判定ならば、
if(Tama[i].Y<=20)X++;
だけで当たり判定を示しています。
当たったかどうかの判定は、関数を作るほど大掛かりなんでしょうか?
一応弾関係の関数を載せます
struct shot{ int x,y,flag; };
struct shot Tama[Tamakazu];
//弾の初期化
void TamaReset(){
for(i=0;i<Tamakazu;i++){
Tama[i].x=ZikiX+14; Tama[i].y=ZikiY-1; Tama[i].power=5; Tama[i].flag=0;
}
}
//Zが押されたらTamaのフラグを立てる
void StandFlag(){
if(Key[KEY_INPUT_Z]==1){
Counter=0;
for(i=0;i<Tamakazu;i++){
if(Tama[i].flag==0){ Tama[i].y=ZikiY+10;Tama[i].x=ZikiX+13;Tama[i].flag=1;break; }
}
}
}
//フラグの立っている弾を発射描画する
void Shot(){
for(i=0;i<Tamakazu;i++){
if(Tama[i].flag==1){
Tama[i].y-=Tspeed;
DrawCircle(Tama[i].x,Tama[i].y,1,Blue,TRUE);
if(Tama[i].y<0){
Tama[i].y=ZikiY-1;Tama[i].flag=0;}
}
}
}
469ポイント を落としてしまった。
|
|
|
|
|
Name: Ex ..ぴよぴよ(117ポイント)
Date: 2010/10/05(火) 17:50
No:62775
|
|
Title: Re:発射された弾の当たり判定
|
|
ちょっと良くわからないので、コードをメモ帳に貼り付けて添付しました。
Xはグローバル変数で、定義しているのは上の方です
if文は int WINAPI Winmain の中のwhile文の中です(下の方)
if(Tama[i].Y<=20)X++;
は、発射されたTama[i]がY座標20より小さくなったらXをプラスするんですが、
Tama[i]という表現はダメなんでしょうか?それとも、もっと根本的に
おかしいところがあるんでしょうか?
117ポイント を手に入れた。
|
|
|
|
|
Name: シエル ..比類無きプログラマー(86,637ポイント)
Date: 2010/10/05(火) 18:04
No:62777
|
|
Title: Re:発射された弾の当たり判定
|
|
if(Tama[i].Y<=20)X++;の処理が実行される前のShot();の処理でTama[i]の変数iが50になるので、
if(Tama[i].Y<=20)X++;の処理ではTama[50].yに対してだけ、if文が実行されていることになります。
よって、あなたの期待した動作にならないものと思われます。
94ポイント を手に入れた。
|
|
|
|
|
Name: Ex ..ぴよぴよ(137ポイント)
Date: 2010/10/05(火) 22:24
No:62807
| 解決!
|
Title: Re:発射された弾の当たり判定
|
|
分かりやすい回答ありがとうございます。
あとは自力で頑張ってみます。
20ポイント を手に入れた。
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(86,824ポイント)
Date: 2010/10/05(火) 21:15
No:62792
|
|
Title: クラステンプレート内のSTLのmapコンテナについて
|
|
いつもお世話になります。シエルです。
今回はテンプレートでの質問です。
下記のような、クラステンプレートの中にmapコンテナが入ったものを
作ろうとしたのですが、コンパイラに怒られてしまいました。
template <typename T1,typename T2> class MAP{
private:
map<T1,T2> data;
map<T1,T2>::const_iterator p;
}
【エラーMSG】map<T1,T2>::const_iterator' : 依存名は型ではありません
クラステンプレート内で、その型をmapコンテナに指定することはできないのでしょうか?
よろしくお願い致します。
183ポイント を手に入れた。
|
|
|
Name: dic ..ハッカー(104,168ポイント)
Date: 2010/10/05(火) 19:47
No:62787
|
|
Title: 基底クラスのメンバ変数を共有したい
|
|
ハッカーになったようでおめでとう俺
ハッカーになったようですが、質問はあいかわらず低レベルです
このままいけば質問攻めの 国会議員のれんほ・・・いやなんでもないです
下のように基底クラス CData があり それを継承し、それぞれのインスタンスを生成してます
このとき基底クラスの CData::m_iValue を 派生クラス両方で共有して扱いたいのですが
どういった方法があるでしょうか?
現在、CStepA のインスタンスから CStepB のインスタンスへと CData::m_iValue の値を引き継ぎたい
状態で、派生せずにCDataのインスタンスを生成するか、static メンバ変数にするか、そのほかか迷ってます
どちらがいいでしょうか?
#include <iostream>
using namespace std;
class CData
{
protected:
int m_iValue;
public:
virtual void Init();
virtual void Print();
};
void CData::Init(){}
void CData::Print(){ cout << "miss" << endl; }
class CStepA : public CData
{
public:
void Init();
void Print();
};
void CStepA::Init(){ m_iValue = 10; }
void CStepA::Print(){ cout << "m_iValue: " << m_iValue << endl; }
class CStepB : public CData
{
public:
void Init();
void Print();
};
void CStepB::Init(){ m_iValue = 100; }
void CStepB::Print(){ cout << "m_iValue: " << m_iValue << endl; }
int main()
{
CData *stepA = new CStepA;
CData *stepB = new CStepB;
stepA->Init();
stepB->Init();
// stepA->m_iValue と stepB->m_iValue の値を共有したい
stepA->Print();
stepB->Print();
delete stepA;
delete stepB;
return 0;
}
794ポイント を手に入れた。
|
|
|
|
Name: dic ..ハッカー(104,196ポイント)
Date: 2010/10/05(火) 21:16
No:62793
| 解決!
|
Title: Re:基底クラスのメンバ変数を共有したい
|
|
色々考えましたがシンプルなstaticメンバ変数でいきたいと思います
28ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..熟練のプログラマー(53,039ポイント)
Date: 2010/10/05(火) 09:44
No:62756
|
|
Title: 円と円の当たり判定
|
|
円と円の当たり判定用に下のような関数を作ったのですが、エラーがでます。
どこがおかしいのか教えてください!
int CircleHitCircle(double cx1,cy1,cz1,cx2,cy2,cz2 int chitflag){
if(pow(cx1-cx2,2)+pow(cy1-cy2,2)>=(cz1+cz2)){
chitflag=1;
}
else chitflag=0;
return chitflag;
}
110ポイント を手に入れた。
|
|
|
|
Name: やっくん ..プログラマー(38,760ポイント)
Date: 2010/10/05(火) 10:02
No:62757
|
|
Title: Re:円と円の当たり判定
|
|
おはようございます。
・開発環境が何なのか
・どのようにエラーが出ているのか
というのが分らないため正しく答えることができません(^^;
一応、こちらを試してもらえないでしょうか?
int CircleHitCircle(double cx1, double cy1, double cz1, double cx2, double cy2, double cz2, int chitflag)
と、関数の仮引数の部分を変更してみたら動きませんか?
それと、名前は”初心者”では無く他の方と区別の付くように別の名前にすることを進めます。利用既約にもそうありますし。
219ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..熟練のプログラマー(53,197ポイント)
Date: 2010/10/05(火) 10:05
No:62758
| 解決!
|
Title: Re:円と円の当たり判定
|
|
ありがとうございました。できました。
次に質問する時から名前を決めます!
環境やエラーなども書くようにします。
質問した以上のアドバイスありがとうございました。
2倍のポイントを手に入れた! 158ポイント を手に入れた。
|
|
|
|
Name: N.M ..ぴよぴよ(118ポイント)
Date: 2010/10/02(土) 17:51
No:62558
|
|
Title: 無題
|
|
はじめましてN.Mと申します。
今、自分は画面上に出た矢印の向きのキーを押していく簡単なゲームを作ろうとしています。
(プログラムコ−ドをメモ帳形式で添付しました。)
しかし、これだと画面の更新がうまくいかなかったり、キー入力に反応していなかったりします。
その原因と解決策を教えてください。
自分の使用OSはWindowsXPで、コンパイルにはVC++ 2008EEを使用しています。
C言語についてはC言語〜プログラミングの館〜で少し勉強したくらいです。
118ポイント を手に入れた。
|
|
|
|
Name: ideyan ..中級者(11,222ポイント)
Date: 2010/10/02(土) 20:44
No:62567
|
|
Title: Re:無題
|
|
こんばんは。
画面の更新がうまくいかない、といった漠然な報告でなく
〜〜なるはずなのにこういう風になってしまう、といった形式の方が
回答者も見当がつきやすくなります。
次に質問するようなことがあれば気をつけてみてくださいね。
とりあえずソースを読んでみました。
おそらく、game()で矢印がうまく表示されないあたりで
困っていると思うのですが、
原因は矢印の描画後にScreenFlip()が呼ばれないままに
WaitKey()でキー入力待ちに入って、そこで処理が止まっていることです。
さらに、WaitKey()を抜けた後でKeyBufを使っていますが、
このKeyBufも更新されていないので挙動がおかしくなります。
今の構造を変えないままにまともに動くようにするには
4か所のWaitKey()を
ScreenFlip();
WaitKey();
GetHitKeyStateAll(KeyBuf);
のように書き換えれば、応急処置ですがとりあえず遊べるようになります。
【その他の問題点】
・DrawFormatString(10,100,aqua,"かかった時間%.3f秒",(st-ft)/1000);
キャストしてないので数値がおかしくなります。
DrawFormatString(10,100,aqua,"かかった時間%.3f秒",(st-ft)/1000.0f);
とでも適当に変えてみてください。
・ProcessMessage()がほとんどの場所で呼ばれていない。
WaitKey()で待機中は自動で呼ばれるらしいのでいいんですが、
title(),finish()を実行する状態の時は呼ばれてないっぽいです。
今の構造だとプロセスの動作が不安定になったり、
右上の×でプログラムを終了してもプロセスが生き残ったりするかもしれません。
402ポイント を手に入れた。
|
|
|
|
|
Name: N.M ..ぴよぴよ(147ポイント)
Date: 2010/10/05(火) 00:27
No:62748
| 解決!
|
Title: Re:無題
|
|
指摘してくださったようにプログラムを書き直したら画面が動くようになりました。
ありがとうございました。
29ポイント を手に入れた。
|
|
|
|
Name: やっくん ..プログラマー(37,422ポイント)
Date: 2010/10/02(土) 19:59
No:62565
|
|
Title: 【雑談】自作スクリプト
|
|
こんばんは。
先日、”Lua言語の雑談トピ”を見てスクリプトに興味を持ちスクリプトを自作するために最近学習しております。(此方の図書を参考)
まだまだ知識が浅い状態ですが、今後の参考のために皆さんのスクリプト使用(製作)経験をお伺いしたいのでトピックを立てさせてもらいました。
Q4以降は自作でスクリプトを作られた方用です。
以下が質問項目です、質問文が多く大変ですが宜しければ回答をお願いいたしますm(__)m
-------------------------------
【質問(テンプレ)】
Q1.使用したスクリプト言語の種類
A1.
Q2.用途
A2.
Q3.スクリプトを使用するプログラムの規模
A3.
Q4.パーサー製作に使用したツール名(使用していなければ無しで)
A4.
Q5.スキャナ製作に使用したツール名(使用していなければ無しで)
A5.
Q6.中間コードの有無(インタプリンタ形式かどうか)
A6.
<備考>
----------------
例
A1.自作
A2.ゲームのイベント管理
A3.個人製作のRPG
A4.bison
A5.flex
A6.有り
大体こんな感じで応えていただければ嬉しいです(^^;
2DのRPGのイベント管理のためにスクリプト製作をしようと思っておりますが、それについての意見・アドバイスも貰えると嬉しいです。
729ポイント を手に入れた。
|
|
|
|
Name: softya [URL] ..ハッカー(223,907ポイント)
Date: 2010/10/02(土) 21:39
No:62587
|
|
Title: Re:【雑談】自作スクリプト
|
|
ゲームだと仕事で使ったことはあります。
自分で作っているのはアプリ用のWEBのHTML/XML処理用スクリプトですね。これはbison/flexです。
A1.ゲーム用で別スタッフ製作。
A2.ゲームのイベント管理・メッセージから宝箱の管理まで。
A3.仕事のRPG用。
A4.そのスタッフ作。
A5.そのスタッフ作。
A6.有り。バイトコードみたいな感じ。
[追記]
バイトコードのコンパイラは別スタッフが作りましたが、バイトコードのランタイムは私自身が実装しました。
[追記の追記]
変数は全コードで共通の変数を使っていますが、マップとスクリプトは一対一で結びついていてマップ単位でロードされます。スクリプトの静的・動的includeで関数呼び出しは可能。 
100ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(37,652ポイント)
Date: 2010/10/02(土) 22:04
No:62594
|
|
Title: Re:【雑談】自作スクリプト
|
|
>softyaさん
回答ありがとうございます(^^
仕事での生の声、とても参考になります。
メッセージの管理や宝箱の管理という部分がよく分らないのです。
プログラムではなく、スクリプト部分のサンプルをあげてもらえないでしょうか?
ちなみに、私が個人製作しているではメッセージは全てテキストファイルに書いておき、実行時に読み出していくという物です。
この場合に限ってスクリプトを用いると、どのように効率が変わるのでしょうか。
14ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(224,288ポイント)
Date: 2010/10/02(土) 22:50
No:62597
|
|
Title: Re:【雑談】自作スクリプト
|
|
>メッセージの管理や宝箱の管理という部分がよく分らないのです。
>プログラムではなく、スクリプト部分のサンプルをあげてもらえないでしょうか?
仕事でやったのをそのままあげると支障があるので、擬似コードで書きますね。
[部屋のドアイベントの例]
eventDOOR1: //ドアを踏んだらイベント発生。
if( event_wait ) {
grph odorki.png
mes "おっと!外へは出さないよ!"
mypos(-1)
wait
} else {
map_change(街1)
}
eventend
な感じです。
>ちなみに、私が個人製作しているではメッセージは全てテキストファイルに書いておき、実行時に読み出していくという物です。
>この場合に限ってスクリプトを用いると、どのように効率が変わるのでしょうか。
フラグとメッセージが連続しているので処理の見通しが良いのがメリット。
デメリットは如何にもプログラムなので、シナリオ担当さんに向き不向きが出来ることです。
368ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(224,363ポイント)
Date: 2010/10/02(土) 23:31
No:62599
|
|
Title: Re:【雑談】自作スクリプト
|
|
[宝箱の例]も書いときますね。
eventTAKARA1: //宝箱を開けようするとイベント発生。
if( event_key1 ) {
grph zannen.png
mes "残念。鍵が違うみたいです!"
wait
} else {
open_takara()
}
eventend
75ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(37,753ポイント)
Date: 2010/10/03(日) 09:15
No:62610
|
|
Title: Re:【雑談】自作スクリプト
|
|
softyaさん、二つのサンプルコードありがとうございます。
参考になります!
製作は基本1人でやっておりますが、シナリオさんも居るのでそのことを考えてできるだけプログラムを意識しないでできるようなスクリプトを作ってみようかと思います。
---------
中々、スクリプト言語って使われないのでしょうか・・・。
他の方々の意見もお待ちしておりますm(__)m
101ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..熟練のプログラマー(43,072ポイント)
Date: 2010/10/03(日) 10:08
No:62614
|
|
Title: Re:【雑談】自作スクリプト
|
|
Q1.使用したスクリプト言語の種類
A1. 自作です。
構文的には、C言語にさらに近くしたPerlみたいな物です。
int *[10]*[5] hoge; で、int のポインタの配列[10]のポインタの配列[5] なんて言う変態型を宣言できたりします。
Q2.用途
A2. 自作アプリへの組み込み用です。
Q3.スクリプトを使用するプログラムの規模
A3. Windows付属のメモ帳よりかは高機能ですが、ただのメモ帳です。 ちょっとだけ肥大化してます。
全部で1万行ぐらいでしょうか。
Q4.パーサー製作に使用したツール名(使用していなければ無しで)
A4. Bison です。
Q5.スキャナ製作に使用したツール名(使用していなければ無しで)
A5. フルスクラッチです。
Q6.中間コードの有無(インタプリンタ形式かどうか)
A6. ありません。
>2DのRPGのイベント管理のためにスクリプト製作をしようと思っておりますが、それについての意見・アドバイスも貰えると嬉しいです。
さっっぱり分かりませんが、ツクールみたいなツールを作って、細かい部分をスクリプトでサポート(孫の手的に)とする方が、楽なような気がします。
367ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(37,904ポイント)
Date: 2010/10/03(日) 14:52
No:62633
|
|
Title: Re:【雑談】自作スクリプト
|
|
へろりさん回答ありがとうございますm(__)m
>int のポインタの配列[10]のポインタの配列[5] なんて言う変態型を宣言できたりします
面白いですね。
やはり自作だとかなり自由度が高いですね。
>ツクールみたいなツールを作って、細かい部分をスクリプトでサポート
ツクールがどのようなものかわかりませんので調べてみます(^^;
122ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(38,146ポイント)
Date: 2010/10/04(月) 15:13
No:62703
|
|
Title: Re:【雑談】自作スクリプト
|
|
ookamiさん回答ありがとうございます(^^
Luaはいずれ使ってみたいなと思っています。
(スクリプト言語触ったこと無い、知識も少ないのに自作スクリプトを作ろうというのも変な話かもしれませんが;)
サイトの方を拝見させていただきました。
使い方のページは画像が説明に対して1枚1枚貼られていたのでわかりやすいと思いました’。
コマンドリファレンスなんですが、コマンド一覧(と簡単な説明)を一番上に書いておくのはどうでしょう?
そこをクリックしたら詳細ページに飛ぶなどのアクションを付けて。
イメージとしてはDXライブラリのリファレンスページです。
EdgeとPlatinum、私も使っていますがどちらも機能を全く使いこなせてない状況です;;
Edgeはpng形式の画像をそのまま使ってアニメーション管理はプログラムの方で自作、
Platinumはcsv形式で管理し、マップだけでなくエンカウント、村人移動制御、イベントも扱うようにしているのでソースコードがめちゃくちゃに(笑"
223ポイント を手に入れた。
|
|
|
|
|
Name: dic ..ハッカー(102,990ポイント)
Date: 2010/10/04(月) 16:28
No:62708
|
|
Title: Re:【雑談】自作スクリプト
|
|
Empire Earth というゲームの中身のスクリプトです
全部載せるとやばい気がするので一部のみです
Luaなど使わずに独自のスクリプト言語を作ってるみたいですね
そして、このスクリプトからでも変数が扱えて、コンパイルすることなく
テキストファイルの変更のみで、ゲームの内容を変更できるようになっているようです
Luaのソースを見たことがないのでなんともいえないですが
市販レベルだと 1999年でこれくらいのようです
字句解析などは、基本処理にそって忠実にやっていけば実装できると思います
私もスクリプト化を考えていますが、何をスクリプト化するのか、やどうやって実現するのかなど
まだ未解決なことがあり実現していない状態です
簡単な敵の配列などはできてますけどね
////////////////////////////////////////////////////////////////////
//
// Small Islands.rmv
//
// Input file for the small islands map type.
//
// Copyright (c) 1998, Stainless Steel Studios, Inc. All rights reserved.
// PROPRIETARY and CONFIDENTIAL.
//
// $Author: Scott Marison $
// $Date: 7/24/01 3:29p $
// $Revision: 35 $
// Revision: 25 Changed Initial step from 64 to 32 in order to get more cliffs.
//
////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Define the map generator we will use
//////////////////////////////////////////////////////////////////////
UseMapGenerator "Default"
StringTableID 27004
//////////////////////////////////////////////////////////////////////
// Files we always include
//////////////////////////////////////////////////////////////////////
#include "Common\Map Climate"
#include "Common\Common Conditions"
#include "Common\Common Terrain Painting"
#include "Common\Common Initial Units"
#include "Common\Common Forests"
//////////////////////////////////////////////////////////////////////
// initialize some defintions. it is possible that an included file
// might redefine these.
//////////////////////////////////////////////////////////////////////
#define (kShallowsElevation, -1)
#define (kShallowsWidth, 4)
#define (kMaxShallowConnectionsPerPlayer, 1)
#define (kGenerateShallows, false)
//////////////////////////////////////////////////////////////////////
// Files we include based upon map size - these files will define
// everything we need to set the random map attributes for small island
// random maps.
//////////////////////////////////////////////////////////////////////
#if IsTinyMap
#include "Small Islands\Small Islands Tiny"
#elif IsSmallMap
#include "Small Islands\Small Islands Small"
#elif IsMediumMap
#include "Small Islands\Small Islands Medium"
#elif IsLargeMap
#include "Small Islands\Small Islands Large"
#elif IsHugeMap
#include "Small Islands\Small Islands Huge"
#elif IsGiganticMap
#include "Small Islands\Small Islands Gigantic"
#endif
//////////////////////////////////////////////////////////////////////
// Attributes we set
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// map elevation attributes
MinIntElevation kMinIntElevation
MaxIntElevation kMaxIntElevation
InitialElevation 0
FlatElevation 0
ElevationScale kElevationScale
HeightMapChaos kHeightMapChaos
...
856ポイント を手に入れた。
|
|
|
|
|
Name: ISLe ..プログラマー(25,096ポイント)
Date: 2010/10/04(月) 18:01
No:62715
|
|
Title: Re:【雑談】自作スクリプト
|
|
過去の仕事では
・イベントの羅列をエクセルに入力(プランナーが担当)
・イベント発生やシナリオ進行を簡易言語でテキストファイルに記述(シナリオライターが担当)
というのをやったことがあります。
どちらもPerlの正規表現を使って命令やパラメータを分解してついでに文法チェックし、プログラムで処理しやすく容量削減のため単純に数値並びのバイナリに出力してました。
Q1.使用したスクリプト言語の種類
A1. 独自
Q2.用途
A2. ゲームでのイベント管理およびシナリオ進行処理
Q3.スクリプトを使用するプログラムの規模
A3. ケータイゲームアプリ
Q4.パーサー製作に使用したツール名(使用していなければ無しで)
A4. Perl(正規表現の羅列)
Q5.スキャナ製作に使用したツール名(使用していなければ無しで)
A5. Perl(正規表現の羅列)
Q6.中間コードの有無(インタプリンタ形式かどうか)
A6. 独自バイナリ形式
250ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(38,541ポイント)
Date: 2010/10/04(月) 23:43
No:62747
|
|
Title: Re:【雑談】自作スクリプト
|
|
>dicさん
サンプルありがとうございます!
サンプルソースの処理は何をしているかはわかりませんが、形式だけは簡単にですが伝わりました。
こうやっていろいろな形式を見ると面白いですね。
5種類くらいのプログラミング言語を触った経験がありますが、それに比べてスクリプト言語はホントに簡素な印象を受けます。
>私もスクリプト化を考えていますが、何をスクリプト化するのか、やどうやって実現するのかなど
私も悩んでいます(^^;
今、製作中のゲームが完成したら次は一つ一つの処理をスクリプトで管理できるようにして共同開発をしやすい&デバッグをしやすい開発を目指したいものです。
>ISLeさん
回答ありがとうございますm(__)m
>・イベントの羅列をエクセルに入力(プランナーが担当)
>・イベント発生やシナリオ進行を簡易言語でテキストファイルに記述(シナリオライターが担当)
この辺の実際の分担作業の話はとても参考になります。
>容量削減のため単純に数値並びのバイナリに出力
対象ハードによってはこのようなことも考えていかなきゃいけないんですね。
ケイタイのアプリがどれくらいの容量ならば問題なく動くかなどはわかりませんが、ここまで考えることは大変そうです;
395ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(14,064ポイント)
Date: 2010/10/03(日) 16:45
No:62652
|
|
Title: Re:ファイルの読み込み
|
|
めんどくさいのでDLLを使ってみてはどうですか?
http://hira.hopto.org/
のhttpget.dllを使ってみてください。
#include <stdio.h>
#include <windows.h>
static HMODULE s_hm;
static int (__stdcall *GetHttpData)(char*,char*,int,int);
int main(void) {
char buf[1000000];
s_hm = LoadLibrary("httpget.dll");
if(s_hm==NULL) {
printf("error1\n");
return 1;
}
GetHttpData=GetProcAddress(s_hm, "GetHttpData");
if(GetHttpData==NULL) {
printf("error2\n");
return 1;
}
GetHttpData("http://127.0.0.1/test.txt",buf,sizeof(buf),0);
puts(buf);
return 0;
}
http://127.0.0.1/test.txtの部分は適切なアドレスに書き変えてください。
261ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(14,145ポイント)
Date: 2010/10/03(日) 16:50
No:62653
|
|
Title: Re:ファイルの読み込み
|
|
簡単に答えてしまいましたが、「ネット上にあるファイルを読み込む」と言っても
httpやftpなどのいろいろなプロトコルがあります。
上の方法はhttpの場合のみ使えます。
81ポイント を手に入れた。
|
|
|
|
|
Name: kokuoutyou [URL] ..ぴよぴよ(344ポイント)
Date: 2010/10/03(日) 18:17
No:62655
|
|
Title: Re:ファイルの読み込み
|
|
エラー 1 error C2664: 'LoadLibraryW' : 1 番目の引数を 'const char [12]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
エラー 2 error C2440: '=' : 'FARPROC' から 'int (__stdcall *)(char *,char *,int,int)' に変換できません。
て出てきますがどうしてでしょうか?
135ポイント を手に入れた。
|
|
|
|
|
Name: めるぽん ..上級者(21,125ポイント)
Date: 2010/10/03(日) 19:29
No:62657
|
|
Title: Re:ファイルの読み込み
|
|
試していないのですが、最初のエラーは、
s_hm = LoadLibrary(_T("httpget.dll")); // _T がダメなら TEXT で
として、2番目のエラーは
GetHttpData = (int (__stdcall*)(char*,char*,int,int))GetProcAddress(s_hm, "GetHttpData");
とすれば動くかもしれないです。 
88ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(14,342ポイント)
Date: 2010/10/03(日) 19:42
No:62658
|
|
Title: Re:ファイルの読み込み
|
|
_Tを使うにはヘッダのインクルードが必要だった気がします。
tchar.hかtext.hだったかな?
違っていたらすみません。
36ポイント を手に入れた。
|
|
|
|
|
Name: めるぽん ..上級者(21,181ポイント)
Date: 2010/10/04(月) 01:52
No:62674
|
|
Title: Re:ファイルの読み込み
|
|
_T を使うには tchar.h のインクルードが必要ですね。
TEXT マクロは winnt.h に定義されていて、これは windows.h の中でインクルードされているので、windows.h をインクルードすれば使えます。
56ポイント を手に入れた。
|
|
|
|
|
Name: kokuoutyou [URL] ..ぴよぴよ(596ポイント)
Date: 2010/10/04(月) 13:23
No:62686
|
|
Title: Re:ファイルの読み込み
|
|
実行は出来ましたけど
error1って出てきて意味が分かりません
#include "stdafx.h"
#include <stdio.h>
#include "windows.h"
#include <windows.h>
static HMODULE s_hm;
static int (__stdcall *GetHttpData)(char*,char*,int,int);
int main(void) {
char buf[1000000];
s_hm = LoadLibrary(_T("httpget.dll")); // _T
if(s_hm==NULL) {
printf("error1\n");
while(true);
return 1;
}
GetHttpData = (int (__stdcall*)(char*,char*,int,int))GetProcAddress(s_hm, "GetHttpData");
if(GetHttpData==NULL) {
printf("error2\n");
while(true);
return 1;
}
GetHttpData("http://share.kokuoutyou.server.co.jp/test.txt",buf,sizeof(buf),0);
puts(buf);
while(true);
return 0;
}
252ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..上級者(15,392ポイント)
Date: 2010/10/04(月) 21:46
No:62742
|
|
Title: Re:ファイルの読み込み
|
|
これでどうでしょうか。
#include <stdio.h>
#include <string.h>
int bunkatu(char**,char*);
int main(void) {
/*改行コードが混ざっていても大丈夫*/
/*改行が連続しても大丈夫*/
char taisyou[]="abc\r\ndef\nghi\rjkl\r\n\r\naa\n\nbb\r\rcc";
int i;
char** saisyo;
int lines;
lines=bunkatu(NULL,taisyou);
saisyo=calloc(lines,sizeof(char*));
bunkatu(saisyo,taisyou);
for(i=0;i<lines;i++) {
printf("%3d行目:[%s]\n",i+1,saisyo[i]);
}
free(saisyo);
return 0;
}
/*
result:各行の先頭のポインタを入れる配列のポインタ
NULLにすると行数のみを取得する。
taisyou:行ごとに分割する対象の文字列
分割するとこの文字列が直接書き変わる。
resultをNULLにした場合は書き変わらない。
戻り値:分割した行数
*/
int bunkatu(char** result,char* taisyou) {
int i;
int lines=1;
int status=0;
if(result!=NULL) {
result[0]=taisyou;
}
for(i=0;taisyou[i]!=0;i++) {
if(taisyou[i]==0x0D) {
if(status) {
if(result!=NULL)result[lines]=&taisyou[i];
lines++;
}
status=1;
if(result!=NULL)taisyou[i]=0;
} else if(taisyou[i]==0x0A) {
if(status==2) {
if(result!=NULL)result[lines]=&taisyou[i];
lines++;
}
status=2;
if(result!=NULL)taisyou[i]=0;
} else {
if(status) {
if(result!=NULL)result[lines]=&taisyou[i];
lines++;
}
status=0;
}
}
return lines;
}
435ポイント を手に入れた。
|
|
|
|
Name: msc ..ぴよぴよ(250ポイント)
Date: 2010/10/04(月) 19:53
No:62732
|
|
Title: C言語で分からないfor文の問題があります
|
|
自分は今C言語の勉強をしているのですが
いまfor文のところで躓いています。
問題の内容は
「
例に示すように、読み込んだ整数の段数をもつピラ
ミッドを表示するプログラムを作成せよ
(例)
ピラミッドを作りましょう。
何段ですか:3
*
***
*****
」
というものです
そして少し前の問題で
/*
直角三角形(右上が直角)を表示
*/
#include <stdio.h>
int main(void)
{
int i, j, In;
printf("何段ですか:");
scanf("%d", &In);
for (i = 1; i <= In; i++) { /* i行(i = 1, 2, … , In) */
for (j = 1; j <= In - i; j++) /* In - i個の' 'を表示 */
putchar(' ');
for (j = 1; j <= i; j++) /* i個の'*'を表示 */
putchar('*');
putchar('\n'); /* 改行 */
}
return (0);
}
このとような問題があったのですが
これをもとにプログラムを組もうと思ったのですがなかなかうまくいかず
よく無限ループしたりおもったようにはなってはくれませんでした。
iに毎回2を+するという事をすればいいと思うのですが・・
これはどうすればいいでしょうか?
長文でもうしわけありませんがアドバイスをお願いします
後自分のC言語の知識はforまでです
250ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..中級者(14,472ポイント)
Date: 2010/10/04(月) 20:07
No:62734
|
|
Title: Re:C言語で分からないfor文の問題があります
|
|
確認していませんが
上のプログラムの
j <= i
を
j <= i*2-1
にしたらどうですか?
74ポイント を手に入れた。
|
|
|
|
|
Name: msc ..ぴよぴよ(354ポイント)
Date: 2010/10/04(月) 20:19
No:62735
|
|
Title: Re:C言語で分からないfor文の問題があります
|
|
みけCATさんありがとうございました。
解決できました。
これは自分がfor文の動き方をしっかり理解してれば簡単にわかったことですね。
すみません勉強不足です。
それとこれは少し違う質問になるのですが、
for (i = 1; i <= In; i++) { /* i行(i = 1, 2, … , In) */
for (j = 1; j <= In - i; j++) /* In - i個の' 'を表示 */
putchar(' ');
for (j = 1; j <= i*2-1; j++) /* i個の'*'を表示 */
putchar('*');
putchar('\n'); /* 改行 */
これのfor文の動きを教えていただけないでしょうか?
また次の時に失敗しないためにしりたいです。
299ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(14,515ポイント)
Date: 2010/10/04(月) 20:21
No:62736
|
|
Title: Re:C言語で分からないfor文の問題があります
|
|
書き忘れましたが、上のレスの変更だけをして下さい。
iに毎回2を足す必要はありません。
追記
返信がかぶってしまい、すみません。 
43ポイント を手に入れた。
|
|
|
|
|
Name: msc ..ぴよぴよ(372ポイント)
Date: 2010/10/04(月) 22:16
No:62743
| 解決!
|
Title: Re:C言語で分からないfor文の問題があります
|
|
みけCATさんありがとうございました
18ポイント を手に入れた。
|
|
|
|
Name: てつ [URL] ..入門者(4,730ポイント)
Date: 2010/10/04(月) 00:09
No:62673
|
|
Title: マウスシューティングを作るにあたって質問
|
|
久しぶりに書き込みます。今、DXライブラリでマウスシューティングを作っていて
マウスポインタの位置がそのまま自機の位置になるようにしてるんですが。
マウスカーソルのスピードってコントロールパネルで変えられますよね。
コントロールパネルの設定に依存しないで、こちらの意図したスピードで
カーソルを移動させたいのですが、実現可能でしょうか?
ちなみに作りかけのゲームは
http://www.boreas.dti.ne.jp/~tetsuaki/game/zan.zip
一応遊べる段階にはなってます。
自機は(今のところ)無敵です。出来る限りの敵を倒し、地球を守るのが目的です。
10機以上撃墜し損ねるとゲームオーバーです。これに今後味付けしていく
予定です。

36ポイント を手に入れた。
|
|
|
|
Name: asm ..ぴよぴよ(363ポイント)
Date: 2010/10/04(月) 14:37
No:62699
|
|
Title: Re:マウスシューティングを作るにあたって質問
|
|
分かりづらいですが、2つ方法があります
@
マウスの座標を(できればウィンドウ内の座標から)取得、設定のできる関数があることが前提
1. 現在のマウス座標を取得
2. 1フレーム後、新たにマウス座標を取得
3. 1.のマウス座標と2.のマウス座標を比較し、角度とベクトルを求める
4. 現在のマウス座標へと、角度分のベクトルを加える
(要するに、どれぐらいの速度でどの角度へマウスが動いたか分かればいい)
A
マウス座標から自機座標への角度を求めて、規定した速度で移動する
@の方法は、移動速度を限定できる上に、移動速度が一定にならないのでお勧めです
(Aの方法だと移動速度は必ず一定になります)
素直にマウスの速度を設定できる関数があれば、それを使うのがもっともベストでしょうね
345ポイント を手に入れた。
|
|
|
|
|
Name: てつ [URL] ..入門者(4,822ポイント)
Date: 2010/10/04(月) 17:25
No:62713
|
|
Title: Re:マウスシューティングを作るにあたって質問
|
|
ご教示ありがとうございますm(_ _)m
何やら難しそうですが、出来ないレベルではないと思いますので
やってみます。結果が出たら報告します。
職場のパソコン2台で試したところ、片方はカーソルが飛びまくって
快適にプレイできず(マウスが安物でパッドもないからかと)。
もう片方は意図した通りに動きましたが、ホイールマウスもあったので
試したところ、なんか動きが遅くて意図したとおりに動いてるとは言えませんでした。
まあ、いまどきホイールマウスでプレイする人はいないと思うので良しとします。
92ポイント を手に入れた。
|
|
|
|
|
Name: てつ [URL] ..入門者(4,895ポイント)
Date: 2010/10/04(月) 20:46
No:62739
| 解決!
|
Title: Re:マウスシューティングを作るにあたって質問
|
|
出来ました!!!!!
自作数学ライブラリがあったので実装は割と楽でした^^
ありがとうございました!!!!!
上記URLより修正版がダウンロードできます。 
73ポイント を手に入れた。
|
|
|
|
Name: きつね ..入門者(3,752ポイント)
Date: 2010/10/04(月) 14:27
No:62695
|
|
Title: キャラを増やす
|
|
以前投稿させていただいた者ですがよろしくお願いします。
以前、キャラを目的地にまで移動させるというプログラムを助言をいただきながら作成したのですが
移動するキャラを増やそうと思い、以下のようなプログラムを作りましたがキャラが増えません・・・
自作関数の使い方がおかしいのでしょうか?
**********************************************************************************
#include "DxLib.h"
#include <math.h>
void Ugoke(float bx,float by,float sx,float sy,double sokudo)
void Ugoke1(float bx1,float by1,float sx1,float sy1,double sokudo1)
{
/*必要な数値の計算*/
float sb,sbx,sby; //初期座標と目的地の座標
float sb1,sbx1,sby1;
float Ex,Ey,Esx,Esy; //移動時の座標
float Ex1,Ey1,Esx1,Esy1;
int agent; //人のグラフィック
int agent1;
double SB; //移動距離
double SB1;
float r; //ラジアン
float r1;
sbx=sx-bx; //それぞれのx座標の差
sbx1=sx1-bx1;
sby=by-sy; //それぞれのy座標の差
sby1=by1-sy1;
sb=sqrt(sbx*sbx+sby*sby); //出発点と目的地の距離
sb1=sqrt(sbx1*sbx1+sby1*sby1);
Esx=sbx/sb*sokudo; //x方向の移動速度
Esx1=sbx1/sb1*sokudo1;
Esy=sby/sb*sokudo; //y方向の移動速度
Esy1=sby1/sb1*sokudo1;
agent=LoadGraph("char1.png"); //画像をメモリに読み込み
agent1=LoadGraph("char1.png");
SB=0; //初期値
SB1=0;
Ex=0; //初期値
Ex1=0;
Ey=0; //初期値
Ey1=0;
r=atan2(sbx,sby); //ラジアン
r1=atan2(sbx,sby);
while(1)
{
ClearDrawScreen(); //画面の初期化
Ex+=Esx; //EsxをExに代入
Ex1+=Esx1;
Ey+=Esy; //EsyをEyに代入
Ey1+=Esy1;
SB=sqrt(Ex*Ex+(Ey)*(Ey)); //移動距離の計算
SB1=sqrt(Ex1*Ex1+(Ey1)*(Ey1));
if(sb<SB||sb1<SB1)
{
DrawRotaGraph(sx,sy,0.3f,r,agent,TRUE); //最後の一歩分の処理
DrawRotaGraph(sx1,sy1,0.3f,r1,agent1,TRUE);
ScreenFlip();
break;
}
DrawRotaGraph(bx+Ex,by-Ey,0.3f,r,agent,TRUE); //画像の描画
DrawRotaGraph(bx1+Ex1,by1-Ey1,0.3f,r1,agent1,TRUE);
ScreenFlip(); //表画面へ描画
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
SetGraphMode(1366,768,32) ; //画面の大きさ
if(DxLib_Init()==-1) return -1 ;
SetDrawScreen(DX_SCREEN_BACK) ; //裏画面に描画
Ugoke(600.0 , 300.0 , 800.0 , 600.0 ,3.0); //座標速度設定
Ugoke(800.0 , 600.0 , 300.0 , 200.0 ,3.0);
Ugoke(300.0 , 200.0 , 500.0 , 600.0 ,3.0);
Ugoke(500.0 , 600.0 , 300.0 , 200.0 ,3.0);
Ugoke(300.0 , 200.0 , 100.0 , 100.0 ,3.0);
Ugoke1(620.0 , 320.0 , 820.0 , 620.0 ,3.0);
Ugoke1(820.0 , 620.0 , 320.0 , 220.0 ,3.0);
Ugoke1(320.0 , 220.0 , 520.0 , 620.0 ,3.0);
Ugoke1(520.0 , 620.0 , 320.0 , 220.0 ,3.0);
Ugoke1(320.0 , 220.0 , 120.0 , 120.0 ,3.0);
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
**********************************************************************************
アドバイスよろしくお願いします。
1,439ポイント を手に入れた。
|
|
|
|
Name: きつね ..入門者(3,818ポイント)
Date: 2010/10/04(月) 16:26
No:62707
|
|
Title: Re:キャラを増やす
|
|
ご指摘ありがとうございます。始めたばっかりで独学で変な解釈をしているかもしれません・・・
もっと基本的な事からしっかり理解してやってみます。
66ポイント を手に入れた。
|
|
|
|
Name: かざみ ..ぴよぴよ(79ポイント)
Date: 2010/10/04(月) 06:09
No:62678
|
|
Title: 音声サイト作成の際、歌ってみたの公開について
|
|
初めましてです、ここでの質問は初めてで恐縮ですが質問させていただきます。
個人音声サイトを作成しようと考えています。そこでサンプルとして歌ってみたを載せたいのですが
ボーカロイドや東方vocalを載せたいのですがそれはしてもよいことなのでしょうか?
何人か東方vocalを歌ってみたりしたのをサイトで公開している方がいましたが
本当にいいのだろうかと思い質問いたしました
私が今、載せたい音楽は
東方vocal
ボーカロイドです
(これらは音楽と自分の声をあわせて公開します) 
79ポイント を手に入れた。
|
|
|
|
Name: DVDM [URL] ..熟練のプログラマー(61,374ポイント)
Date: 2010/10/04(月) 10:41
No:62679
|
|
Title: Re:音声サイト作成の際、歌ってみたの公開について
|
|
>>かざみさん
東方は二次創作可のようなので大丈夫だと思います。
他の方のアレンジに歌詞等を加えるのであれば、作った方の承諾を得る必要があるように思います。
Vocaloid に関しては良く解りませんが、
非商用目的ではある程度自由に利用できるようなガイドラインを用意しているそうなので
一度 Vocaloid の使用許諾を読んでみては如何でしょうか。
歌ってみたがそれに当てはまるかどうかは解りませんけども。
心配なら本社にメールなりで聞いてみるのが確実だと思います。
218ポイント を手に入れた。
|
|
|
|
|
Name: かざみ ..ぴよぴよ(149ポイント)
Date: 2010/10/04(月) 13:51
No:62688
| 解決!
|
Title: Re:音声サイト作成の際、歌ってみたの公開について
|
|
迅速な返信ありがとうございます!
回答していただけたおかげで安心してサイトを作成できます
本当にありがとうございました
2倍のポイントを手に入れた! 70ポイント を手に入れた。
|
|
|
|
Name: ryu ..かけだし(1,844ポイント)
Date: 2010/10/03(日) 11:23
No:62615
|
|
Title: お勧めの参考書とかありますか
|
|
お世話になっております。
今ゲームエディタ(RPGツクールとかMMF2のような)を作りたいと考えて
いるのですが、ああいったアプリを作りたい場合、全部を
C言語(C++)で作るのでしょうか?
それとも言語を複数合体したりするのでしょうか!?
どこから勉強すればいいのか迷っています、何かいい本とか
あればお願いします。
話は変わるのですが別々の言語で一つのアプリを作る、とか可能なのでしょうか?
ちょっと興味があるのですが・・・
そちらの情報もあればお願いします。
185ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..中級者(11,456ポイント)
Date: 2010/10/03(日) 11:42
No:62616
|
|
Title: Re:お勧めの参考書とかありますか
|
|
>別々の言語でひとつのアプリを作ることは可能なのでしょうか?
一応可能です。
自分はなでしこでGUIだけ作り、実際の処理はPerlに任せることがあります。
また、HSPでアプリを作り、ActiveBasicでそれに使うDLLを作ることもあります。
意味が違っていたらすみません。
C言語でなくてごめんなさい。
127ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(224,648ポイント)
Date: 2010/10/03(日) 13:06
No:62621
|
|
Title: Re:お勧めの参考書とかありますか
|
|
ツール自体は大体ひとつの言語で作りますね。
でも絶対一つの言語で作らないとダメって事はなくて、ゲームエンジン自体とエディタ部分は別の言語で作っても構いません。例えばゲームエンジンをC++、エディタ部分はC#とかです。
それとゲームエンジン自体に必要に応じてスクリプト言語を実装することがあります。RPGツクールとかもRuby系のRGSSを実装しています。
お聞きしたいのは、そこそこの規模のRPG自体を作ったことがないとゲームエンジン自体を作る要件をまとめられないと思いますが経験はおありでしょうか?未経験だとかなり困難が予想されます。
>話は変わるのですが別々の言語で一つのアプリを作る、とか可能なのでしょうか?
C++をDLLにして、C#から呼び出すとか出来ますよ。
>どこから勉強すればいいのか迷っています、何かいい本とかあればお願いします。
アドベンチャーゲームのエンジンですが、「ゲームエンジンプログラミング GAME DEVELOPER」
http://www.amazon.co.jp/dp/4797331976
まぁ、開発テーマ自体が初心者向けじゃないので自力で作れるだけの力量を求められますね。
285ポイント を手に入れた。
|
|
|
|
|
Name: ryu ..かけだし(2,007ポイント)
Date: 2010/10/03(日) 15:24
No:62637
| 解決!
|
Title: Re:お勧めの参考書とかありますか
|
|
softyaさん、みけcatさん
早レスありがとうございます!
>そこそこの規模のRPG自体を作ったことがないと
アクションゲームをちょこっと作った事がある程度なんです・・
やはりゲームの調整は何回もやることになるので
自作エディタくらい作れないと駄目だな〜と考えていたのです。
フローチャートは最近できるようになってきたのですが・・・地道にがんばります!
プログラムの合体はDLLとかにするのですか。そのあたりはDLL呼び出し〜、とかから
勉強していけばいけますかね?
色々な言語でアプリ作るなんて、楽しそうです、ありがとうございました。
163ポイント を手に入れた。
|
|
|
|
Name: グラマー ..ぴよぴよ(876ポイント)
Date: 2010/10/04(月) 11:29
No:62680
|
|
Title: コロンの意味
|
|
この前はお世話になりました。
C++の言語で
namespace Sequence{
Title::Title():mImage(0){
mLmage =new Image("data/image/title.dds");
}
}
で::はよく見かけるのでわかるのですが、:の意味がよくわかりません。はじめてみました。
C++の本で調べてもネットで調べても出て来なかったの質問しました。
よろしくお願いします。
142ポイント を手に入れた。
|
|
|
|
Name: MNS ..熟練のプログラマー(41,518ポイント)
Date: 2010/10/04(月) 11:37
No:62681
|
|
Title: Re:コロンの意味
|
|
メンバイニシャライザと言って、
コンストラクタの呼び出し時に、メンバを初期化するための機能です。
この場合では、Titleのコンストラクタの呼び出し時に、
mImageというメンバ変数の値へ0を代入しています。
特に、constメンバの初期化には必須です。
100ポイント を手に入れた。
|
|
|
|
Name: ER ..ぴよぴよ(302ポイント)
Date: 2010/10/03(日) 01:02
No:62604
|
|
Title: 無題
|
|
お久しぶりです、久しぶりに質問させていただきたいとおもいます。
いま、全2面、EX1面のシューティングゲームを作っています。
しかし、各ステージごとのボスに別々の弾幕を撃たせることができず難航しています。
別々の弾幕を撃つにはどこをいじってどのような処理をすればいいのか、皆様のお知恵をお借りしたいと思い投稿しました。
他力本願かも知れませんが、私も私なりにいろいろ試して見ましたが自分ひとりではどうしても解決できず、皆様のお力をお借りすることにしました。
どうか皆様よろしくお願いします!
158ポイント を手に入れた。
|
|
|
|
Name: ER ..ぴよぴよ(394ポイント)
Date: 2010/10/03(日) 13:37
No:62623
|
|
Title: Re:無題
|
|
>>シエルさん なんというか、どこをどういじればいいのかと言うよりは、どのような方針で進めればいいのか検討がつかないのです。 どちらかと言うと考え方を教えていただければと思っています。
92ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(224,806ポイント)
Date: 2010/10/03(日) 13:45
No:62625
|
|
Title: Re:無題
|
|
龍神録と似たプログラムなのかさえ今の情報では分かりませんので一般論として、ステージのボス毎に違う初期化・攻撃・動き・死亡関数を設ける。
ボスの弾幕をどう管理しているかも分かりませんので、ボスの弾幕発射シーケンスのデータもステージごとに変えるぐらいしか言えません。
2倍のポイントを手に入れた! 158ポイント を手に入れた。
|
|
|
|
|
Name: ER ..ぴよぴよ(515ポイント)
Date: 2010/10/03(日) 14:57
No:62634
|
|
Title: Re:無題
|
|
>>softyaさん それが抜けていましたね・・・ごめんなさい。
プログラムは龍神録プログラミングの館のを物を元にして作っています。
>>シエルさん 情報・・・ですか・・。こういう時って回答する人はどのような情報が必要なんですか?
ソースコードを載せるにしても何を載せればいいのか・・・
>>アビゲイルさん ザコ1とザコ2・・・どういうことです?(´・ω・`)理解力なくてごめんなさい。
121ポイント を手に入れた。
|
|
|
|
|
Name: softya [URL] ..ハッカー(225,139ポイント)
Date: 2010/10/03(日) 15:31
No:62642
|
|
Title: Re:無題
|
|
龍神録の理解度の問題なのですが、龍神録でボスに関する関数の名前とそれぞれの関数の機能を書き出してみてください。それとボスの弾幕をコントールしている変数というか構造体の名前と各メンバ変数の役割も書き出しましょう。これらを調べるだけで、かなりボスが分かってくるはずです。
一番よい勉強法は、龍神録に書かれているコメント一度全部消して何も見ずに自分でコメントを書いてみることです。各関数や変数の役割がしっかり頭に入っているなら元よりちゃんとしたコメントが書けるはずです。 
121ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(84,959ポイント)
Date: 2010/10/03(日) 15:33
No:62643
|
|
Title: Re:無題
|
|
そうですね。まずあなたが分からない部分をもっと明確にして下さい。
現状でアドバイスできることといえば、softyaさんがおっしゃってることぐらいです。
まず、softyaさんの回答に対して、何かほかにわからないことがあるのであれば、
もっと具体的に説明して下さい。
104ポイント を落としてしまった。
|
|
|
|
|
Name: ER ..ぴよぴよ(642ポイント)
Date: 2010/10/04(月) 02:07
No:62675
| 解決!
|
Title: Re:無題
|
|
たった今自己解決しました!
どうやら自分の考え込みが甘かったようです・・・
ご迷惑をかけてしまい申し訳ありません。
>>シエルさん 確かに状況の説明が足りなすぎましたね・・・
今度質問するときはその辺もちゃんと考えて質問しますね。
そのときはどうかよろしくお願いします。
>>softyaさん アドバイスどうもありがとうございます。softyasさんに言われたことを意識してこれからも精進していきたいと思います!
127ポイント を手に入れた。
|
|
|
|
Name: AMU ..ぴよぴよ(410ポイント)
Date: 2010/10/02(土) 20:45
No:62568
|
|
Title: 3D表示
|
|
DXライブラリで3Dモデルを表示したら穴だらけの汚いものが表示されてしまいました。
どうしてでしょうか。画像も載せておきます。
41ポイント を手に入れた。
|
|
|
|
Name: AMU ..ぴよぴよ(925ポイント)
Date: 2010/10/02(土) 21:48
No:62592
|
|
Title: Re:3D表示
|
|
簡単なソース載せます。
これでも同じ結果になるので。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);
int ModelHandle, AttachIndex ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "char.pmd" ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
MV1SetScale( ModelHandle, VGet( 4.0f, 4.0f, 4.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 300.0f, 150.0f, 0.0f ) ) ;
MV1SetRotationXYZ( ModelHandle, VGet( 3.141392/2 , 0 , 0)) ;
// 何かキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
モデルはMMD用(pmd)のマクロスのVF-27を使っていますが、二次配布はよくないので載せられません。
515ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(11,504ポイント)
Date: 2010/10/03(日) 11:52
No:62617
|
|
Title: Re:3D表示
|
|
>2次配布は良くないので載せられません。
それでは、そのモデルの入手先(URLなど)はわかりますか?
48ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..中級者(12,973ポイント)
Date: 2010/10/03(日) 15:19
No:62636
|
|
Title: system関数
|
|
開発環境はDev-C++4.9.9.2、コンパイラはデフォルトです。
この環境でC言語のCUIプログラムの実行結果が見えるように、
プログラムを起動してポーズするプログラムを書きました。
ほとんどうまくいったのですが、コマンドラインとして「"」を含むものを入力すると、
エラーが出ます。
1)「runpause.exe "D:\zikken\test.exe" /c」をコマンドプロンプトに打ち込んで起動しました。
2)コマンドラインとして「"1"」を入力しました。
3)以下のエラーが出ました。
'D:\zikken\test.exe" "1' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ソースコード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[]) {
char cmd[10000];
char runcmd[10000];
int i;
if(argc<2)return 1;
strcpy(runcmd,"\"");
strcat(runcmd,argv[1]);
strcat(runcmd,"\"");
if(argc>=3) {
fprintf(stderr,"コマンドラインを入力してください。\n");
fgets(cmd,sizeof(cmd),stdin);
for(i=0;cmd[i]!=0;i++) {
if(cmd[i]==0x0A || cmd[i]==0x0D)cmd[i]=0;
}
strcat(runcmd," ");
strcat(runcmd,cmd);
}
system(runcmd);
system("pause");
return 0;
}
D:\zikken\test.exeのソースコード
#include <stdio.h>
int main(int argc,char* argv[]) {
int i;
for(i=0;i<argc;i++) {
printf("%s\n",argv[i]);
}
return 0;
}
(追記)解決方法がわかる方がいらっしゃいましたら教えていただければ幸いです。 
656ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..中級者(13,374ポイント)
Date: 2010/10/03(日) 15:39
No:62645
|
|
Title: Re:system関数
|
|
コマンドラインを入力するところで「"1"」ではなく「1」と入力すると正常に動作します。
この時、system関数に渡すパラメータは
「"D:\zikken\test.exe" 1」となっているはずです。
72ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(13,519ポイント)
Date: 2010/10/03(日) 16:06
No:62647
|
|
Title: Re:system関数
|
|
>D:\zikken にパスが通ってないとか。
パスというのは、この場合、
たとえばD:\zikkenにパスを通すとtest.exeと入力するだけで起動できるというものですよね。
違っていたらすみません。
もしそうだとすると、この場合「D:\zikken\test.exe」というように、
フルパスで指定しているから関係ない気がしますが、どうでしょうか?
145ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(13,803ポイント)
Date: 2010/10/03(日) 16:28
No:62650
| 解決!
|
Title: Re:system関数
|
|
なぜかはわかりませんが動きました。
コマンドライン引数に「"1 2 3"」などの「"」で囲まれた文字列を入力しても動作します。
実行するファイルを「D:\The test\test.exe」というスペースを含んだものにしても動作します。
ありがとうございました。
<pre#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[]) {
char cmd[10000];
char runcmd[10000];
int i;
if(argc<2)return 1;
strcpy(runcmd,"\"\"");
strcat(runcmd,argv[1]);
strcat(runcmd,"\"");
if(argc>=3) {
fprintf(stderr,"コマンドラインを入力してください。\n");
fgets(cmd,sizeof(cmd),stdin);
for(i=0;cmd[i]!=0;i++) {
if(cmd[i]==0x0A || cmd[i]==0x0D)cmd[i]=0;
}
strcat(runcmd," ");
strcat(runcmd,cmd);
}
strcat(runcmd,"\"");
system(runcmd);
system("pause");
return 0;
}
</pre>
284ポイント を手に入れた。
|
|
|
|
Name: 私が悪いんです ..ぴよぴよ(967ポイント)
Date: 2010/09/28(火) 04:54
No:62410
|
|
Title: 行けない所を作る2Dについて
|
|
はじめまして、プログラミング歴一年にならないものです。
VC++2010を使っています。
実は今ゲームプログラミングの館で「行けない所を作る。〜2D〜」をやっているのですが行ってはいけないところに行ってしまったり、行ってもいいところで行けなかったりと思うようにいきません。
実際作ったもの(ほとんどコピー)
#include "DxLib.h"
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int hantei[15][20] = {
文字数の問題のため省略(ゲームプログラミングの館のサンプルと同じです)
};
int can_or_cannot(int x,int y,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei[y/32-1][x/32]==1)//進めるか判定
return 1;//エラー
if(muki==1)//左向きなら
if(hantei[y/32][x/32-1]==1)
return 1;
if(muki==2)//下向きなら
if(hantei[y/32+1][x/32]==1)
return 1;
if(muki==3)//右向きなら
if(hantei[y/32][x/32+1]==1)
return 1;
return 0;//正常
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image[16],i,j;
char Key[256];
ch_t ch;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
ch.x =320;
ch.y =160;
ch.walking_flag=0;
ch.muki=3;
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
/*白い壁を描画*/
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(hantei[i][j]==1)
DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
if(ch.walking_flag==1) //もし歩くなら
if(can_or_cannot(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
ch.walking_flag=0; //歩かないフラグを立てる。
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0){ //上向きならch.y座標を減らす
ch.y--;
ch.img=image[(ch.y%32)/8+0];
}
else if(ch.muki==1){ //左向きならch.x座標を減らす
ch.x--;
ch.img=image[(ch.x%32)/8+4];
}
else if(ch.muki==2){ //下向きならch.y座標を増やす
ch.y++;
ch.img=image[(ch.y%32)/8+8];
}
else if(ch.muki==3){ //右向きならch.x座標を増やす
ch.x++;
ch.img=image[(ch.x%32)/8+12];
}
}
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
ScreenFlip();
}
DxLib_End();
return 0;
}
ゲームプログラミングの館でのサンプルと違う点はキャラを一区間で歩かせないため
if(ch.x%32==0 && ch.y%32==0)
を外しました。
しかし、これを外したために行きたいところに行けなかったりとおかしなことがおこりました。
キャラを一区間で歩かせず、かつ行けない所を作るにはどうすればよいでしょうか?
回答よろしくお願いします。
また、ゲームプログラミングの館でのサンプルをいじらずにそのまま動作したところ、全く異常はありませんでした。
967ポイント を手に入れた。
|
|
|
|
Name: 私が悪いんです ..かけだし(1,946ポイント)
Date: 2010/09/28(火) 04:56
No:62411
|
|
Title: Re:行けない所を作る2Dについて
|
|
一応hantei[15][20]の部分載せておきます。
int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
979ポイント を手に入れた。
|
|
|
|
|
Name: 私が悪いんです ..かけだし(2,108ポイント)
Date: 2010/09/28(火) 16:59
No:62420
|
|
Title: Re:行けない所を作る2Dについて
|
|
>>アトラスさん
サンプルコードと回答ありがとうございます。
サンプルコードはまさに自分のやりたいものを表現していますがいまだに右上、右下、左上、左下の計4つで当たり判定という部分がいまいち理解できないでいます;
自分のこのプログラムの場合、どのようにすればサンプルと同じ当たり判定ができるかもう少しサンプルをじっくり見て研究してみます。
162ポイント を手に入れた。
|
|
|
|
|
Name: 私が悪いんです ..かけだし(2,160ポイント)
Date: 2010/09/28(火) 18:55
No:62423
|
|
Title: Re:行けない所を作る2Dについて
|
|
あとすいません、サンプルで0.0Fとか9.0FとかのFというのはなんなんでしょうか?
調べたくともなんというものなのかわからなくて・・・
52ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..熟練のプログラマー(61,605ポイント)
Date: 2010/09/28(火) 20:25
No:62426
|
|
Title: Re:行けない所を作る2Dについて
|
|
0.0FのFは定数の型を指定する接尾語です
接尾語無しの浮動小数点はdouble型なのでfloat型の定数を表す場合には後ろにfかFをつけます
整数型でも接尾語無しはint型でl/Lをつけるとlong型(lは紛らわしいのでたいてい大文字のLが使われます)、u/Uをつけるとunsigned型などがあります
2倍のポイントを手に入れた! 6ポイント を手に入れた。
|
|
|
|
|
Name: 私が悪いんです ..かけだし(2,253ポイント)
Date: 2010/09/28(火) 20:51
No:62432
|
|
Title: Re:行けない所を作る2Dについて
|
|
>>toyoさん
回答ありがとうございます。
なるほどFにはそういう意味があったんですか・・・
試しにサンプルのF全部とりましたら確かにdoubleからfloatへの変換と出ました
外しても動作はしましたがやはり入れた方がいいですね、ありがとうございます。
このFも含めてもう少し頑張ってみます。
93ポイント を手に入れた。
|
|
|
|
|
Name: 私が悪いんです ..かけだし(2,311ポイント)
Date: 2010/09/30(木) 00:47
No:62464
|
|
Title: Re:行けない所を作る2Dについて
|
|
誰かシンプルな右上、右下、左上、左下の計4つで当たり判定のサンプルを持ってないでしょうか?
もらったサンプルはとても良いのですがジャンプなどの処理も入っているため少々理解しずらい部分があり・・・
お願いします。
58ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(13,302ポイント)
Date: 2010/10/03(日) 15:36
No:62644
|
|
Title: Re:行けない所を作る2Dについて
|
|
>誰かシンプルな右上、右下、左上、左下の計4つで当たり判定のサンプルを持ってないでしょうか?
No:62410のコードのcan_or_cannot関数を以下のものに差し替えてみてください。
int can_or_cannot(int x,int y,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei[(y-1)/32][x/32]==1 || hantei[(y-1)/32][x/32+1]==1)//進めるか判定
return 1;//エラー
if(muki==1)//左向きなら
if(hantei[y/32][(x-1)/32]==1 || hantei[y/32+1][(x-1)/32]==1)
return 1;
if(muki==2)//下向きなら
if(hantei[(y+1)/32+1][x/32]==1 || hantei[(y+1)/32+1][x/32+1]==1)
return 1;
if(muki==3)//右向きなら
if(hantei[y/32][(x+1)/32+1]==1 || hantei[y/32+1][(x+1)/32+1]==1)
return 1;
return 0;//正常
}
329ポイント を手に入れた。
|
|
|
|
Name: much ..ぴよぴよ(102ポイント)
Date: 2010/10/03(日) 12:42
No:62618
|
|
Title: セーブに関して
|
|
セーブに関するプログラムを色々試してみましたが、
未解決のシンボル Win Main@16〜というふうな内容が出ます
どなたか解決法が分かる方いませんか?
49ポイント を手に入れた。
|
|
|
|
Name: much ..ぴよぴよ(92ポイント)
Date: 2010/10/03(日) 14:33
No:62629
|
|
Title: Re:セーブに関して
|
|
コンソールアプリケーションって何ですか
初心者ですいません
10ポイント を落としてしまった。
|
|
|
|
|
Name: みけCAT ..中級者(11,961ポイント)
Date: 2010/10/03(日) 14:43
No:62631
|
|
Title: Re:セーブに関して
|
|
Windowsを使っているとして話します。
コンソールアプリケーションとは、WindowsのDOS窓上で動くプログラムのことです。
作り方
ソースはtest.cとします。
MinGWの場合
gcc -o test.exe test.c
BCC55の場合
bcc32 -e"test.exe" test.c
その他の場合
ググってください。
116ポイント を手に入れた。
|
|
|
|
|
Name: much ..ぴよぴよ(139ポイント)
Date: 2010/10/03(日) 15:29
No:62641
| 解決!
|
Title: Re:セーブに関して
|
|
すいません 自己解決しました!
親切に対応してくださった方々
ありがとうございました。
47ポイント を手に入れた。
|
|
|
|
Name: ハト ..ぴよぴよ(145ポイント)
Date: 2010/10/02(土) 22:29
No:62595
|
|
Title: 文字列を変換する
|
|
VC++.netで文字列を出力するプログラムを作っております。
下記の様な文字列を別の決まった雛型に変更したいです。
String^ test = "1 2 3";
例)
"1 2 3" ⇒ "1 - 3"
"10 11 12 13 14 15" ⇒ "10 - 15"
"9 10 11 12" ⇒ "9 - 12"
文字数が2ケタなら前から2文字と後ろから2文字を切り取ってつなげれば出来るのですが
こういう数字だとどうすればいいのかわかりません。
数字と数字の間には必ず半角スペースが空いているのですが
これを使ってSplit等でどうにか出来ないか模索したのですがよくわかりませんでした・・・。
ここはゲームを作る方が多いと思うのですが
わかる方はいらっしゃらないでしょうか?
145ポイント を手に入れた。
|
|
|
|
Name: うしお ..入門者(3,685ポイント)
Date: 2010/10/02(土) 23:42
No:62600
|
|
Title: Re:文字列を変換する
|
|
String^ は、System::Stringであり
C++/CLI言語で、C/C++とは異なる言語ですが、
ここに勘違いはありませんか?
もし勘違いでなければ
これではどうでしょう?
String^ test = "1 2 3";
array<String^>^ SpritedStrArray;
SpritedStrArray = test->Split(' ');
もしC++/CLIではなくC/C++でしたら、
sscanf_s関数などを使用してみてはいかがでしょうか
143ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(11,329ポイント)
Date: 2010/10/03(日) 09:40
No:62612
|
|
Title: Re:文字列を変換する
|
|
VC++.netはわからないので普通のC言語ですが
#include <stdio.h>
void henkan(char*,char*);
int main(int argc,char* argv[]) {
char* taisyou="9 10 11 12";
char result[100];
if(argc>=2) {
henkan(result,argv[1]);
} else {
henkan(result,taisyou);
}
printf("%s\n",result);
return 0;
}
void henkan(char* result,char* source) {
int i;
int last=0;
int output=0;
int status=0;
for(i=0;source[i]!=0;i++) {
if(status==0) {
result[output]=source[i];
output++;
if(source[i]==' ') {
result[output]='-';
result[output+1]=' ';
output+=2;
last=i+1;
status=1;
}
} else {
if(source[i]==' ')last=i+1;
}
}
for(i=last;source[i]!=0;i++) {
result[output]=source[i];
output++;
}
result[output]=0;
}
コマンドラインが指定されていない場合は「9 10 11 12」を、
指定されている場合は第一引数を変換します。
301ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(583,114ポイント)
Date: 2010/10/03(日) 14:02
No:62627
|
|
Title: Re:文字列を変換する
|
|
先頭と末尾の数字を拾ってきて '-'で繋げるだけなら、Regexでいいんじゃないですか?
String^ test = System::Text::RegularExpressions::Regex::Replace("10 11 12 13 14 15", "^(\\d+)(?:\\s+\\d+)*(\\s+\\d+)$", "$1 - $2");
87ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..中級者(9,881ポイント)
Date: 2010/10/03(日) 14:37
No:62630
|
|
Title: Re:文字列を変換する
|
|
その文字列を構成している数値群が連番になっていることは
保証ずみなのでしょうか?
28ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(12,317ポイント)
Date: 2010/10/03(日) 15:06
No:62635
|
|
Title: Re:文字列を変換する
|
|
No:62612のプログラムにバグがありました。
数字を一つしか入力しなかった場合に変換に失敗します。
#include <stdio.h>
void henkan(char*,char*);
int main(int argc,char* argv[]) {
char* taisyou="9 10 11 12";
char result[100];
if(argc>=2) {
henkan(result,argv[1]);
} else {
henkan(result,taisyou);
}
printf("%s\n",result);
return 0;
}
void henkan(char* result,char* source) {
int i;
int last=0;
int output=0;
int status=0;
for(i=0;source[i]!=0;i++) {
if(status==0) {
result[output]=source[i];
output++;
if(source[i]==' ') {
result[output]='-';
result[output+1]=' ';
output+=2;
last=i+1;
status=1;
}
} else {
if(source[i]==' ')last=i+1;
}
}
if(last==0) {
result[output]=' ';
result[output+1]='-';
result[output+2]=' ';
output+=3;
}
for(i=last;source[i]!=0;i++) {
result[output]=source[i];
output++;
}
result[output]=0;
}
356ポイント を手に入れた。
|
|
|
|
Name: 風きつね ..ぴよぴよ(3ポイント)
Date: 2010/10/01(金) 02:38
No:62494
|
|
Title: 動画を描画し、各フレームで各座標ごとの色を確認したりしたい
|
|
はじめまして、風きつねと申します。
Windows Vista Visual C++ DXライブラリを用いています。
「BadApple!! 影絵」で検索をすると一つの動画が出てくるのですが、それを使った弾幕を作ろうと考えています。
黒と白に分かれている境界の部分に弾を配置し、動画のように動かしてみたいと思っています。
具体的に考えているルーチンは
1、動画の各フレーム毎に、影絵の黒と白の境となる部分の座標を全て読み取り、テキストにX座標(LX)、Y座標(LY)、現在のフレーム(LF)のデータを出力する。(これで一つのプログラムを作る)
2、龍神録プログラミングを利用し、@で出力したデータを読み取り、LFと、現在のboss_shot.cntが一致していた場合、(LX,LY)の位置に弾を出現させる。
3、弾が出現していて、LFとboss_shot.cntが異なっていた場合、弾のフラグをオフにする。
といった感じです。
問題は1の部分でして、
@動画を1フレーム毎に検証していく方法が分からない。
A影絵といっても完全に0xffffffと0x000000に分かれているわけでもなく、二色だけでできているわけでもないのでその座標が黒と白の境目なのかを判断することができない。
B色の識別に重いと噂のGetPixel関数を用いているため、X座標、Y座標総当り(480x640)でやるとCPUが耐えられない。
と問題点が多数あり、非常に困っている状況です。
何かこれらを解決できるよい方法、別のルーチン等はないものでしょうか。
皆様のお力添えを何とぞよろしくお願いします。
3ポイント を手に入れた。
|
|
|
|
Name: ルファー [URL] ..入門者(4,970ポイント)
Date: 2010/10/01(金) 08:44
No:62495
|
|
Title: GetPixelからRGBへ逆変換
|
|
その方法だと、まず GetPixel で得た色が何色なのかを判別する方法がないとどうにもなりませんね。
僕は知りませんが…。
DxLib の作者さんなら何か知っているかも知れません。
69ポイント を手に入れた。
|
|
|
|
|
Name: アトラス ..初心者(6,342ポイント)
Date: 2010/10/01(金) 11:22
No:62500
|
|
Title: Re:GetPixelからRGBへ逆変換
|
|
Aについては色の差が一定以上であれば境界であると判定すればいいのではないでしょうか
2色ではないといっても、ほとんど(0,0,0)か(255,255,255)のどちらかに近い色ですから
<pre>
col = GetPixel( i , j ) ;
R = (col & 0xFF0000) >> 16 ;
G = (col & 0x00FF00) >> 8 ;
B = col & 0x0000FF;
<pre>
という具合に色の成分を分けて、RGB値を比較すればよいと思います
140ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,281,510ポイント)
Date: 2010/10/01(金) 12:40
No:62503
|
|
Title: Re:動画を描画し、各フレームで各座標ごとの色を確認したりしたい
|
|
いいですね〜ニコニコ技術部的なネタ大好きです^^
ところで、処理はリアルタイムにしなくてはならないのですか?
リアルタイムである必要がないなら予めデータを作っておき、それに合わせて弾を配置すればよいだけだと思います。
また、画像処理は2値化してから行う方がよいでしょう。
境界線は自力でも計算出来るでしょうが、OpenCVを使えばスマートになるかもしれません。
動画データを画像処理する時は予め何かのソフトでBmpなどにわけておくと良いでしょう。
良いソフトが見つからなければffmpegがあればなんとでもなります。
現在携帯からなのでリンクとか貼れないですが…
290ポイント を手に入れた。
|
|
|
|
|
Name: ルファー [URL] ..入門者(4,994ポイント)
Date: 2010/10/01(金) 13:16
No:62504
|
|
Title: ビット数配分
|
|
しかしビットシフトを使う方法はカラーモードによって使えないのではないですか?
各成分に使うビット数 α:R:G:B は
8:8:8:8 のときもあれば 0:5:6:5 や 4:4:4:4 、0:11:11:10 かもしれませんし、 インデックスカラーかも知れません。
24ポイント を手に入れた。
|
|
|
|
|
Name: 風きつね ..ぴよぴよ(595ポイント)
Date: 2010/10/01(金) 22:02
No:62513
|
|
Title: Re:ビット数配分
|
|
皆様色々ご意見ありがとうございます。
申し遅れましたが、当方初心者なものであまり知識もないものですので、
色々迷惑かけると思いますがよろしくお願いします。
>>皆様
GetPixel関数は
Rの値+Gの値*256+Bの値*65536を返すようです。
影絵ですので青に偏る事もないでしょうし、10000000を越えたら黒…と曖昧な判定で白と黒に分けられそうです。
ひとまず問題Aに関しては無事に解決できそうです。
>>Dixq様
上に書いてなかったのですが、
プログラムはテキストデータを読み取り弾幕を展開する龍神録プログラミングと、
動画から白と黒の境目の座標をテキストデータに出力するものと二つあるのです。
で、動画のフレームレートが30、プログラムの方がおそらく60だと思われますので、2cnt毎に、
1、テキストファイルから配置する弾の座標のデータを格納
2、@で格納した座標に弾を配置
3、描画
4、弾を消す
というのを龍神録プログラミングの方でやろうとしているので、
実際にやっているのは予めデータを製作してからそれに合わせて弾を配置しているのと変わらないんですよね。
ただ、そのデータ製作のほうがうまくいかないのでご助力をお願いした次第でございます。
問題@が解決の糸口も掴めずどうしようもない状態です。
PauseMovieToGraph関数を使えばどうにかなるかと思ったんですが…どうにもなりませんでした。
592ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,282,637ポイント)
Date: 2010/10/01(金) 22:41
No:62519
|
|
Title: Re:ビット数配分
|
|
OpenCVでも輪郭抽出出来ますが、今回の場合はCVを使うまでも無さそうです。
手順としては
2値化して、全ピクセルの周辺4ピクセルを見て、4ピクセル中一つでも異なる色があればそこが境界線だと判断しています。
では詳しい手順を書きます。
【プログラムを書くまでの下準備】
・craving explorerなどでBadApple!!をダウンロードします。AVIがいいでしょう。
・ソフトは何でもいいですが、AVIからBMPに変換します。
→ AVI2JPGとか良いかもしれません。http://novolization.hp.infoseek.co.jp/download.html
→ 変換する時、動画のファイル名を「BadApple.avi」にしておいてください
→ 数GBのすごい大きさになるので、容量には注意して。BadAppleのソースコードのプロジェクトがあるフォルダの「img」フォルダをビットマップの展開先に設定してからエンコードして下さい。
【プログラムにおける手順】(こんなに長くなると思わなかったので超いい加減なコードですが・・)
(一つのソースコードで、連続画像を読み込んで、座標データファイルを作る機能と、座標データファイルを読み込んで結果を表示してみる機能が2つ備わっています。「MAKEMODE_ON」の定義を有効にすると前者モード、注釈にすると後者モードになります)
【連続画像を読み込んで→座標データファイル作成】
・ビットマップの大きさはいくつでも自動的に対応し、ウィンドウサイズやファイルサイズが変わります。領域を確保する為に、最初は「MakeBmpFrame」を呼びます。
・処理1ループの最初にbmpファイルを展開・読み込みます(6000枚以上あります)
GetBmpでビットマップを読み込みます。ビットマップのファイルフォーマットについてはURL1を参考に
・BmpThresholdで二値化します。閾値は64にしました。低すぎると、ノイズを拾ってしまうし、高すぎると星や花弁が拾えませんでした。
・RegBulletで弾を登録します。先ほど言った通り、2x2の4ピクセルを全てのピクセルにおいて調べます。4ピクセル中一つでも異なるピクセルがあれば、そこは境界です。で、条件にマッチする場合全てに弾を置くとものすごい密集してしまうので、近くに弾が無ければ置くという処理をしています。近くに弾があるかどうかはFindBullet関数で計算しています。RANGEの定義が最低限の幅です。幅を広げたい時はここを広くして下さい。
・WriteToFileで登録した弾の座標をファイルに書き込んでいます。画像ファイル名とdatファイル名は対応しています。最初の4バイトに弾の数を記録し、登録した弾の数だけ保存するので、読み込むときは、最初の4バイトを先に読みましょう。
・DrawBmp、DrawBulletは描画しています。
・FPS制御は龍神録の館のコードを使っています。館はご覧になっているようなので、説明は省略します。
【座標データファイルを読み込んで、どんな感じになったか確認】
(MAKEMODE_ONの定義を外せばこちらのモードになります。)
(特に説明するほどのコードは書いていないので、省略します。)
URL1
http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr:lang_1ja&q=bmp+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88&aq=f&aqi=g1&aql=&oq=&gs_rfai=
もう少しシンプルなサンプルを作るつもりだったのに長くなってしまいました。
こんなことならファイル分けして後から汎用的に使いまわせるように作ればよかったですね・・。
あんまり綺麗なコードじゃないので、もし使うときは適度に書き換えて下さい^^;
1,097ポイント を手に入れた。
|
|
|
|
|
Name: 風きつね ..ぴよぴよ(729ポイント)
Date: 2010/10/02(土) 02:27
No:62529
|
|
Title: Re:ビット数配分
|
|
ありがとうございます。
おかげ様でルーチンについては大体理解しました。
解像度が変わっているのが少々気になりますが、BMPの画像に依存するとこればっかりは仕方の無いことなんでしょうかね…。
一方で、BMPの処理についてはさっぱり分かりません。
どこか分かりやすい説明サイト等ご存じないでしょうか?
134ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,282,792ポイント)
Date: 2010/10/02(土) 09:00
No:62535
|
|
Title: Re:ビット数配分
|
|
解像度については、640x480の方が良いという事でしょうか?
それであれば動画をダウンロードした際動画の解像度を640x480に変更すればよいと思います。
ffmpegでも、windowsムービーメーカーでも、aviutlでも何ででも出来ます。
補間してやればプログラム側でも可能でしょう。
> 一方で、BMPの処理についてはさっぱり分かりません。
どの辺が解りませんか?
BMPについての参考サイトはURL1に記載しましたが、こちらよりわかりやすいのは無いのではないでしょうか・・。
バイト単位で全て書いてあると思います。
どの辺が解らないか教えて頂ければまたお答えします。
151ポイント を手に入れた。
|
|
|
|
|
Name: 風きつね ..ぴよぴよ(851ポイント)
Date: 2010/10/03(日) 00:01
No:62602
|
|
Title: Re:ビット数配分
|
|
BmpThreshold関数の中で、
if(Bmp->Pixel[ y*w + x ].r > THRESHOLD)
という記述があります。
これを見る限りPixel[].rの中には(x,y)座標におけるr成分がすでに格納されているようですが、
プログラムのどこを見ても自分にはどのタイミングで格納しているのか分からないものでして…。
122ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ウィザード(1,283,926ポイント)
Date: 2010/10/03(日) 00:34
No:62603
|
|
Title: Re:ビット数配分
|
|
GetBmp関数に「Bmp画像の取得」と書いてある通り、ここで、画像データを読み込んでいます。
ヘッダ情報の読み込みはそれより前にあるMakeBmpFrameでのみ行っています。
必要なヘッダ情報はどのビットマップでも変わらないであろうことを前提にしているので、最初に1枚しか読み込んでいません。
詳しい事はURL1で読んで頂いたと思いますが、
ビットマップはBITMAPFILEHEADERにファイルヘッダ情報があった後、BITMAPINFOHEADERに情報ヘッダが付いています。
ここに書いてある情報を元に画像の縦横サイズを調べています。
で、ファイルからバイナリデータを読み込む時は、fread関数で行います。
GetBmp関数の中にもこの関数を呼んでいる所がありますよね。
ビットマップのファイルフォーマットは、54バイトのヘッダ情報の後に実際の画像データが並んでいます。
画素の並びは左下から右上の方向に並んでいます。
ですから、下から読むために、for文のyがMAXから減るようになっています。
ピクセルの数だけfreadすれば読み込み完了です。
個別に何度もfreadを呼ぶのが面倒なら、全部まとめて読み込んで、左下が原点であることを意識して画像を操作するようにしても構いません。
で、今回は画像がグレースケールであることを前提としていたのでよかったのですが、カラーでも対応できるようにするには
if( Bmp->Pixels[ y*w + x ].r > THRESHOLD ){
Bmp->Pixels[ y*w + x ].r = 255;
} else {
Bmp->Pixels[ y*w + x ].r = 0;
}
if( Bmp->Pixels[ y*w + x ].g > THRESHOLD ){
Bmp->Pixels[ y*w + x ].g = 255;
} else {
Bmp->Pixels[ y*w + x ].g = 0;
}
if( Bmp->Pixels[ y*w + x ].b > THRESHOLD ){
Bmp->Pixels[ y*w + x ].b = 255;
} else {
Bmp->Pixels[ y*w + x ].b = 0;
}
こちらの部分は
if( (int)Bmp->Pixels[ y*w + x ].r + Bmp->Pixels[ y*w + x ].g + Bmp->Pixels[ y*w + x ].b + > THRESHOLD*3 ){
Bmp->Pixels[ y*w + x ].r = 255;
Bmp->Pixels[ y*w + x ].g = 255;
Bmp->Pixels[ y*w + x ].b = 255;
} else {
Bmp->Pixels[ y*w + x ].r = 0;
Bmp->Pixels[ y*w + x ].g = 0;
Bmp->Pixels[ y*w + x ].b = 0;
}
こちらの方がよさそうですね。
上のままだと、カラーでは完全に二値化されない場合がありそうです。
そして、逆に書き込みはfwriteで行います。
計算で算出した弾の座標はバイナリデータとしてファイルにfwriteで書き込んでいます。
ファイルの入出力についてのプログラムは作ったことがありますか?
652ポイント を手に入れた。
|
|
|
|
|
Name: 風きつね ..ぴよぴよ(875ポイント)
Date: 2010/10/03(日) 13:38
No:62624
| 解決!
|
Title: Re:ビット数配分
|
|
丁寧な解説ありがとうございました。
無事に解決できそうです。
txtファイルに出力するだけの簡単なプログラムでしたら作った事があります。
2倍のポイントを手に入れた! 24ポイント を手に入れた。
|
|
|
|
Name: さびしいPG ..ぴよぴよ(157ポイント)
Date: 2010/10/02(土) 20:54
No:62574
|
|
Title: エディタについて
|
|
こんばんは^^
私はプログラムコードを打つとき、複数のファイル、コードを見比べながらやるときに
若干不便に感じつつもVCに付属しているエディタを使用しているのですが、
色々なエディタを使っている方がおられるように思います。
そこで、皆さんお勧めのエディタと、よろしければ特徴なども教えて頂けないでしょうか?
157ポイント を手に入れた。
|
|
|
|
Name: やっくん ..プログラマー(37,638ポイント)
Date: 2010/10/02(土) 21:06
No:62576
|
|
Title: Re:エディタについて
|
|
windows版のemacsを使っております。
またはVisualStudioのエディタ+XKeymacs(emacsのショートカットキーを再現)
emacsのショートカットキーが豊富なところが良いです。
もちろんcontrolキー多用のためキーボードはUS配列です。(HHK使用)
2倍のポイントを手に入れた! 216ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(11,066ポイント)
Date: 2010/10/02(土) 21:18
No:62579
|
|
Title: Re:エディタについて
|
|
家ではDev-C++標準のエディタ、外ではTeraPadです。
TeraPadを使うときはコンパイルを自作ソフト(添付)でやっています。
(ソースファイルを指定してコンパイラを呼び出すソフトです)
自作ソフトの使い方(蛇足だったらすみません)
まずコンパイラのパスを指定する。
必要に応じてコマンドラインオプションも指定する。
入力ファイル(C言語のソースファイル)を指定する。ドラッグ&ドロップでも指定できる。
出力ファイル(exe)ファイルを指定する。
「スタート」ボタンを押すとバッチファイルでコンパイルされる。
169ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(219,242ポイント)
Date: 2010/10/02(土) 21:22
No:62581
|
|
Title: Re:エディタについて
|
|
なんだかんだでVisualStudioのエディタって便利だと思います。
あとはEclipseなんかも使いやすいと思います(^-^)
51ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..熟練のプログラマー(42,531ポイント)
Date: 2010/10/03(日) 07:33
No:62605
|
|
Title: Re:エディタについて
|
|
VisualStudioの付属のエディタのどこが不便なのでしょうか。
IDE の強力なサポートを得られるので、かなり便利な方だと思うのですが。
Windows では、BCC とか Perl とかスクリプト・プログラム系の作業をするときには MKEditor を使ってます。
それ以外のテキストファイルは、自作のメモ帳を使います。
Linuxでは、emacs一本です。
2倍のポイントを手に入れた! 214ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..ハッカー(150,545ポイント)
Date: 2010/10/03(日) 07:56
No:62606
|
|
Title: Re:エディタについて
|
|
わたしはVimですかね。
Visual Studio 上で普段はプログラムを書いて、
何かしら大きな編集等の時に Vim を使います。
それ以外のテキストファイルの編集は基本 Vim で。
Vim は独特な操作に慣れる必要がありますが、500種余りの構文に対応し、 Visual Studio とほぼ同じ機能もあり、
さらに GREP や差分表示、スクリプトを駆使すればどのコンパイラもエディタ上で動かす(make)ことができます。
2倍のポイントを手に入れた! 344ポイント を手に入れた。
|
|
|
|
|
Name: 白 ..中級者(11,326ポイント)
Date: 2010/10/03(日) 13:18
No:62622
|
|
Title: Re:エディタについて
|
|
VisualStudioですかね。で、何か参考にしたいコードがあるときは、
ディスプレイを二個用意して、もう一方にTeraPadで表示させています。
54ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..中級者(9,818ポイント)
Date: 2010/10/02(土) 17:39
No:62556
|
|
Title: 重い?
|
|
開発環境としてBCC55と「C言語を始めよう! Ver1.1.2.2」を使ってみました。
DXライブラリを使っています。
ゲームプログラミングの館の13b章、14章などを組み合わせて適当なプログラムを書いてみました。
カーソルキーを押すと画像が動くプログラムです。
自前のfps表示もくっつけてあります。
これを実行すると、fpsが大体30〜40くらいと表示されます。
fpsは60くらいだと思っていたのですが、みんなこんなものなのでしょうか?
それとも、自分の環境が重いだけでしょうか?
もしよろしければテストをお願いします。
プログラムコード
#include "DxLib.h"
char Key[256];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "char.png" ) ; //back.bmpのハンドルを代入
int x=0,y=0;
int White;
White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
//fps取得用
char fpstext[1024]="0.00fps";
unsigned long fpskizyuntick,fpsmaetime,fpsnowtime;
int fpscount;
fpscount=0;
fpskizyuntick=GetTickCount();
fpsmaetime=fpsnowtime=0;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
//ココに処理を書いていく
if(Key[KEY_INPUT_LEFT])x-=3;
if(Key[KEY_INPUT_RIGHT])x+=3;
if(Key[KEY_INPUT_UP])y-=3;
if(Key[KEY_INPUT_DOWN])y+=3;
DrawGraph( x , y , image , FALSE ) ; //char.pngを表示
//fpsの計測
fpsnowtime=GetTickCount()-fpskizyuntick;
if(fpsnowtime>=1000) {
wsprintf(fpstext,"%d.%02dfps",
fpscount+((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))/100,
((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))%100);
fpskizyuntick=GetTickCount();
fpsmaetime=0;
fpscount=0;
} else {
fpscount++;
fpsmaetime=fpsnowtime;
}
DrawString( 10,10,fpstext,White);
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End() ; //DXライブラリの終了処理
return 0 ;
}
追記
モニタのリフレッシュレートは60ヘルツです。 
2倍のポイントを手に入れた! 1,890ポイント を手に入れた。
|
|
|
|
Name: うしお ..入門者(3,542ポイント)
Date: 2010/10/02(土) 18:40
No:62562
|
|
Title: Re:重い?
|
|
私の環境でテストしてみました
fpsは大体56〜59の間で安定しております
Operating System: Windows 7 Home Premium 32-bit (6.1, Build 7600) (7600.win7_gdr.100618-1621)
System Model: P5Q
BIOS: BIOS Date: 02/25/10 16:02:28 Ver: 08.00.14
Processor: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz (2 CPUs), ~3.0GHz
Memory: 2048MB RAM
DirectX Version: DirectX 11
DxDiag Version: 6.01.7600.16385 32bit Unicode
グラフィックカード NVIDIA GeForce GTX 460
VisualStudio2010Express
です
228ポイント を手に入れた。
|
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(84,972ポイント)
Date: 2010/10/02(土) 20:46
No:62569
|
|
Title: Re:重い?
|
|
45FPSぐらいしか出ませんでした。
ほかの方の作品では余裕で60FPSぐらい出てるので、
FPSの計算がおかしいか、ほかの部分のコードがおかしいのかどっちかでしょう。
時間があれば検証しますが、そんな時間ないのでコードの検証はしてません。
91ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(10,897ポイント)
Date: 2010/10/02(土) 21:12
No:62577
|
|
Title: Re:重い?
|
|
fpsの計算をゲームプログラミングの館s6章のものにしてみました。
41〜43fpsくらいです。
#include "DxLib.h"
int count=0;
char Key[256];
void fps(){
int i;
static int t=0,ave=0,f[60];
f[count%60]=GetNowCount()-t;
t=GetNowCount();
if(count%60==59){
ave=0;
for(i=0;i<60;i++)
ave+=f[i];
ave/=60;
}
if(ave!=0){
DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);
DrawFormatString(0,20,GetColor(255,255,255),"%dms" ,ave);
}
return;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "char.png" ) ; //back.bmpのハンドルを代入
int x=0,y=0;
int White;
White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
//fps取得用
/*char fpstext[1024]="0.00fps";
unsigned long fpskizyuntick,fpsmaetime,fpsnowtime;
int fpscount;
fpscount=0;
fpskizyuntick=GetTickCount();
fpsmaetime=fpsnowtime=0;*/
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
//ココに処理を書いていく
if(Key[KEY_INPUT_LEFT])x-=3;
if(Key[KEY_INPUT_RIGHT])x+=3;
if(Key[KEY_INPUT_UP])y-=3;
if(Key[KEY_INPUT_DOWN])y+=3;
DrawGraph( x , y , image , FALSE ) ; //char.pngを表示
//fpsの計測
/*fpsnowtime=GetTickCount()-fpskizyuntick;
if(fpsnowtime>=1000) {
wsprintf(fpstext,"%d.%02dfps",
fpscount+((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))/100,
((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))%100);
fpskizyuntick=GetTickCount();
fpsmaetime=0;
fpscount=0;
} else {
fpscount++;
fpsmaetime=fpsnowtime;
}
DrawString( 10,10,fpstext,White);*/
fps();
count++;
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End() ; //DXライブラリの終了処理
return 0 ;
}
1,079ポイント を手に入れた。
|
|
|
|
|
Name: へろり ..熟練のプログラマー(42,705ポイント)
Date: 2010/10/03(日) 09:37
No:62611
|
|
Title: Re:重い?
|
|
No:62556 No:62577 のコード共にFPS 43-45 ぐらいですね。
DXライブラリでは初期化時の状態では表画面に描画するようになっているようです。
この時にScreenFli() 関数がどのような挙動を行うかはちょっと分かりませんが、どうにもこのあたりに原因があるようです。
とりあえず、SetDrawScreen(DX_SCREEN_BACK); を呼び出す事で FPS 60 を出すことが出来ました。
ところで、No:62556 のコードですが。
FPSの計算式がちょっと複雑なようですが、1フレーム毎に fpscount++; で、1秒ごとに
if(fpsnowtime>=1000) に突入するわけですから、その時点で fpscount の値がそのまま FPS ではありませか?
FPS というのは1秒間に何回フレームを描画したか、ですよね。
174ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(11,845ポイント)
Date: 2010/10/03(日) 12:45
No:62620
| 解決!
|
Title: Re:重い?
|
|
60fps程度出ることを確認しました。
ソース
#include "DxLib.h"
char Key[256];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen(DX_SCREEN_BACK); //裏画面に設定
int image; //ハンドルを受け取るためのint型変数を宣言
image = LoadGraph( "char.png" ) ; //back.bmpのハンドルを代入
int x=0,y=0;
int White;
White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
//fps取得用
char fpstext[1024]="0.00fps";
unsigned long fpskizyuntick,fpsmaetime,fpsnowtime;
int fpscount;
fpscount=0;
fpskizyuntick=GetTickCount();
fpsmaetime=fpsnowtime=0;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
//ココに処理を書いていく
if(Key[KEY_INPUT_LEFT])x-=3;
if(Key[KEY_INPUT_RIGHT])x+=3;
if(Key[KEY_INPUT_UP])y-=3;
if(Key[KEY_INPUT_DOWN])y+=3;
DrawGraph( x , y , image , FALSE ) ; //char.pngを表示
//fpsの計測
fpsnowtime=GetTickCount()-fpskizyuntick;
if(fpsnowtime>=1000) {
wsprintf(fpstext,"%d.%02dfps",
fpscount+((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))/100,
((1000-fpsmaetime)*100/(fpsnowtime-fpsmaetime))%100);
fpskizyuntick=GetTickCount();
fpsmaetime=0;
fpscount=0;
} else {
fpscount++;
fpsmaetime=fpsnowtime;
}
DrawString( 10,10,fpstext,White);
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End() ; //DXライブラリの終了処理
return 0 ;
}
>ところで、No:62556 のコードですが。
>FPSの計算式がちょっと複雑なようですが、1フレーム毎に fpscount++; で、1秒ごとに
>if(fpsnowtime>=1000) に突入するわけですから、その時点で fpscount の値がそのまま FPS ではありませか?
>FPS というのは1秒間に何回フレームを描画したか、ですよね。
東方のような感じで小数点以下も出したかったので、このようなコードにしてみました。
341ポイント を手に入れた。
|
|
|
|
Name: みけCAT ..初心者(6,110ポイント)
Date: 2010/10/02(土) 14:23
No:62544
|
|
Title: DXライブラリの移植 ACT.3
|
|
こんにちは、みけCATです。
私がいつも使っているDev-C++4.9.9.2で何とかDXライブラリが使えないかと思い、いろいろ調べています。
BCC用のDXライブラリのlibファイルからobjファイルの抽出に成功したのですが、
このobjファイルは「omf形式」らしく、「coff形式」への変換が必要なようです。
変換する方法を調べているのですが、なかなか見つかりません。
どうすれば変換できるか教えていただければ幸いです。
101ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..ハッカー(229,182ポイント)
Date: 2010/10/02(土) 15:59
No:62554
|
|
Title: Re:DXライブラリの移植 ACT.3
|
|
いっそのこと、まったく別のアプローチは考えられないでしょうか?
つまり...
Visual C++用のDXライブラリを使って、"C"結合のラッパー関数をエクスポートする。
MinGW側では、"C"結合のライブラリをインポートし、それをインライン関数でラッピングすることでオリジナルのインタフェースを復元する。
というやりかたです。
"C"結合でエクスポートしておけば、スクリプト言語などへのバインディングも容易にできますし、ベターCとしてつかうC++ではなく、本物のCでDXライブラリを使うこともできるようになります。
220ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..初心者(7,928ポイント)
Date: 2010/10/02(土) 16:34
No:62555
|
|
Title: Re:DXライブラリの移植 ACT.3
|
|
たかぎさん
すいません、よくわからないです。
もう少し詳しく説明できますか?
----------
VC用のライブラリをVisual Studioのlib.exe、
MinGWのar.exe、ranlib.exeを使用して.aに変換してみました。
しかし、以下のエラーが出ます。
In file included from D:\kota_documents\Documents\programs\dxlibtest2\/DxLib.h:50,
from D:\kota_documents\Documents\programs\dxlibtest2\2syou.cpp:1:
D:\kota_documents\Documents\programs\dxlibtest2\/DxDirectX.h:5387: warning: `novtable' attribute directive ignored
D:\kota_documents\Documents\programs\dxlibtest2\/DxDirectX.h:5574: warning: `novtable' attribute directive ignored
D:\kota_documents\Documents\programs\dxlibtest2\/DxDirectX.h:5667: warning: `novtable' attribute directive ignored
D:\kota_documents\Documents\programs\dxlibtest2\/DxDirectX.h:5736: warning: `novtable' attribute directive ignored
D:\kota_documents\Documents\programs\dxlibtest2\/DxDirectX.h:5800: warning: `novtable' attribute directive ignored
D:\kota_documents\Documents\programs\dxlibtest2\/DxDirectX.h:6340: warning: `novtable' attribute directive ignored
D:\kota_documents\Documents\programs\dxlibtest2\/DxDirectX.h:6517: warning: `novtable' attribute directive ignored
D:\kota_documents\Documents\programs\dxlibtest2\/DxDirectX.h:6831: warning: `novtable' attribute directive ignored
C:\Users\kota\AppData\Local\Temp/ccEzbaaa.o(.text+0xe):2syou.cpp: undefined reference to `DxLib::ChangeWindowMode(int)'
C:\Users\kota\AppData\Local\Temp/ccEzbaaa.o(.text+0x13):2syou.cpp: undefined reference to `DxLib::DxLib_Init()'
C:\Users\kota\AppData\Local\Temp/ccEzbaaa.o(.text+0x26):2syou.cpp: undefined reference to `DxLib::WaitKey()'
C:\Users\kota\AppData\Local\Temp/ccEzbaaa.o(.text+0x2b):2syou.cpp: undefined reference to `DxLib::DxLib_End()'
collect2: ld returned 1 exit status
追記
コンパイルしたソースはゲームプログラミングの館2章のウィンドウモードのプログラムです。
「コンパイラを呼ぶ際、以下のコマンドを付加する」には次のコマンドを入力しました。
-L"D:\kota_documents\Downloads\DxLib_VC\プロジェクトに追加すべきファイル_VC用\dxlib2" -mwindows -lDxLib -lDxUseCLib -lDxDrawFunc 
2倍のポイントを手に入れた! 1,818ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(229,208ポイント)
Date: 2010/10/02(土) 18:46
No:62564
|
|
Title: Re:DXライブラリの移植 ACT.3
|
|
> すいません、よくわからないです。
> もう少し詳しく説明できますか?
書いたつもりで書いていませんでしたが、DLLを作るということです。
DLLを作ってしまえば、あとは.DEFファイルからdlltoolで.aを作れるはずですよね。
26ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(11,143ポイント)
Date: 2010/10/02(土) 21:25
No:62583
|
|
Title: Re:DXライブラリの移植 ACT.3
|
|
>書いたつもりで書いていませんでしたが、DLLを作るということです。
>DLLを作ってしまえば、あとは.DEFファイルからdlltoolで.aを作れるはずですよね。
わかっていなくてすみません。
どうしたらDLLを作れますか?
60ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..ハッカー(229,286ポイント)
Date: 2010/10/02(土) 23:31
No:62598
|
|
Title: Re:DXライブラリの移植 ACT.3
|
|
> どうしたらDLLを作れますか?
どのレベルでわかっていないのかがわかりませんが、プロジェクトをDLLを作るように設定して、ビルドするだけでは?
もちろん、"C"結合にするためのラッパーは自分で作る必要があります。
確か、C#用のライブラリを作るためのツールだったかが公開されているはずなので、それを使えば多少は作業が楽になるのではないでしょうか?
78ポイント を手に入れた。
|
|
|
|
|
Name: みけCAT ..中級者(11,028ポイント)
Date: 2010/10/03(日) 08:14
No:62609
|
|
Title: Re:DXライブラリの移植 ACT.3
|
|
とりあえず簡単な例として、
添付のファイルを使い、まずtest.cからtest.objを作り(DXライブラリを想定)
それを使ってtestdll.cでtest.dllを作ってみたいです。
DLLはできたようなのですが、使う方がうまくいきません。
DLLを使おうとしたプログラムのusetest.cも入れておきました。
test.dllの作成はBCC55、usetest.cのコンパイルはMinGWです。
115ポイント を落としてしまった。
|
|
|
|
Name: FullMoon ..ぴよぴよ(428ポイント)
Date: 2010/10/02(土) 13:46
No:62540
|
|
Title: 印鑑などの一致の確認
|
|
こんにちは、FullMoonです。
質問なんですが画像を解析して一致しているかを確認する
プログラムを作ってみようと考えています。
具体的には登録印鑑の画像データベースに蓄積されている
印鑑の画像と実際に比較する画像を解析して印鑑が一致し
ているかどうか、欲あらば何%以上の確立で同じですと表
示するような感じです。同じ名字でもフォントが違えば
違う印鑑であると判断したいのです。なお比較する画像に
は白紙上ではなく書類の上での印鑑なのでまずは印鑑部分
だけの抽出が必要になると思いますが。
私は
@比較画像から印鑑部分だけを抽出して2つの画像を手動
でもいいから重ねる
A抽出した後にエッジ検出するなどして閾値にて比較する
(なんらかの数字を出して比較したい)
の2通りで考えているのですが皆さんならばどのように作
るのかを教えていただきたいです。アルゴリズムだけでな
く、もしC言語以外のほうが作りやすいというアドバイスが
あればそういった情報も教えていただきたいです。
環境はWindowsで、C言語でWindowsアプリ的に作りたいと
思っています。なので今のところマイクロソフトが無料で
提供しているVisual Studio 2010 Expressで作成しよう
と思います。
私はC言語がどれくらい使えるかはうまく
説明できませんがLinuxで作っていたので初心者はクリア
して中級になるかならないという感じだと思います。あ
まり具体的でなくすみません。
よろしくお願いします。
334ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(219,191ポイント)
Date: 2010/10/02(土) 14:20
No:62543
|
|
Title: Re:印鑑などの一致の確認
|
|
まずは輝度で印鑑部分(朱色?に近い箇所)とそうでない部分に分けてはいかがでしょうか?
そのうえでパターンマッチング処理で登録されてある印鑑データとの一致率を求める…というのでいけそうな気がします。
詳しいアルゴリズムなんかはググるなり書籍を求めるなりして勉強してくださいm(_ _)m
126ポイント を手に入れた。
|
|
|
|
|
Name: 438番 ..かけだし(1,821ポイント)
Date: 2010/10/02(土) 18:01
No:62560
|
|
Title: Re:印鑑などの一致の確認
|
|
昔信号処理を勉強していたときにパターン認識をした時
ニューラルネットワーク
テンプレートマッチング(これもニューラルネットワークの一部かも)
KL展開(KL変換)
での画像認識をやっていました
アルゴリズムは
ニューラルネットワークは
ttp://www-ailab.elcom.nitech.ac.jp/lecture/neuro/menu.html
KL変換については
ttp://hooktail.org/computer/index.php?KL%C5%B8%B3%AB
信号処理についてはアルゴリズムが複雑なのでここで記述するより
見たほうが早いかと
自分はwinAPIは苦手なのでVisualC#.NETを使っていました
GUIの部分がはるかに楽ですので,画像処理の部分のみを考えれば良いという点で便利です
同じ理由でBisual Basicなんかも使ってらっしゃる方はいるようです
184ポイント を手に入れた。
|
|
|
|
|
Name: やっくん ..プログラマー(36,693ポイント)
Date: 2010/10/02(土) 18:01
No:62561
|
|
Title: Re:印鑑などの一致の確認
|
|
書類の形式が全て同じ物ならば場所を指定して抜き出してしまうのも有だと思いますが、汎用性がなくなりますよね・・・。
抜き出した後は私なら
色の輝度で2値化、ノイズ除去、位置を揃える、回転などの正規化をしてデータとのマッチングでしょうか。
登録印鑑データベースのデータはどのようにデータがあるんでしょうか?
同じ名字でもフォントが違えば異なるデータとして存在はするようですが、印鑑と言っても押したときのインクの付き具合による印字の太さや傾きなどもありますので。
1つのデータに対して数パターン用意されているならばマッチング手法にk-nn法などどうでしょう。
303ポイント を手に入れた。
|
|
|
|
|
Name: FullMoon ..ぴよぴよ(764ポイント)
Date: 2010/10/02(土) 23:53
No:62601
|
|
Title: Re:印鑑などの一致の確認
|
|
やはり、みなさん私なんかよりはるかに知識がありますね。
皆さんの意見すべてが参考になります。
>バグさん
私のやりたいことと似たような考えですね。ありがとうございます。
アルゴリズムは書籍で勉強したいと思います。
>438番さん
初めて聞いたアルゴリズムなのでしっかり勉強したいと思います。
GUIについては考えてみます。
私もWinAPIは不慣れな部分が多いので。
ありがとうございました。
>やっくんさん
具体的な方法ありがとうございました。
データベースには登録印鑑の画像が保存されている状態のままなので
一度そちらも解析する必要がある感じです。
汎用性は結構必要なんですよね。特にやっくんさんも書かれていた印鑑
の太さや傾きがネックだと思われます。
まだまだ勉強してみます。
>Dixqさん
わざわざありがとうございました。
OpenCVについては私もありかな思っていましたが
使ったことがなかったので作れるかなという不安が
あったためためらっています。
そもそもWinAPIが作れるのかなと思いながらなので
まずはいろいろやってみます。
まだまだ意見がありましたらよろしくお願いします。
336ポイント を手に入れた。
|
|
|
|
Name: 蓮 ..初心者(7,773ポイント)
Date: 2010/09/30(木) 08:38
No:62468
|
|
Title: iPhoneアプリ開発 実機転送で不具合が出る
|
|
iPhoneアプリ開発をしております。
シミュレータ上ではきちんと動いているのですが実機転送時に不具合がでてしまいます。
現在、ゲームを作ってみたのですが実機転送時にDefault.pngが表示されてから進まなくなってしまいました。
以前はきちんと動いておりました。
おわかりになられる方はおりませんでしょうか?
http://www1.axfc.net/uploader/O/so/138413
pass:test
デバッガ内容
[Session started at 2010-09-30 08:38:57 +0900.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1470) (Thu May 27 05:54:06 UTC 2010)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=i386-apple-darwin --target=arm-apple-darwin".tty /dev/ttys002
プログラムをデバッガに読み込み中...
プログラムは読み込まれました。
target remote-mobile /tmp/.XcodeGDBRemote-114-90
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
run
実行中...
[Switching to thread 11523]
[Switching to thread 11523]
sharedlibrary apply-load-rules all
continue
2010-09-30 08:36:08.525 Medal[1624:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'
*** Call stack at first throw:
(
0 CoreFoundation 0x31a9ffd3 __exceptionPreprocess + 114
1 libobjc.A.dylib 0x3428a8a5 objc_exception_throw + 24
2 CoreFoundation 0x31a9fe91 +[NSException raise:format:arguments:] + 68
3 CoreFoundation 0x31a9fecb +[NSException raise:format:] + 34
4 Foundation 0x3289453b -[NSURL(NSURL) initFileURLWithPath:] + 70
5 Foundation 0x328b0937 +[NSURL(NSURL) fileURLWithPath:] + 30
6 Medal 0x00005c19 _Z11LoadSoundSER5Audio + 36
7 Medal 0x00009c81 _ZL4Initv + 224
8 Medal 0x000035e3 -[ES1Renderer render] + 206
9 Medal 0x000028b9 -[EAGLView drawView:] + 40
10 Medal 0x0000287b -[EAGLView layoutSubviews] + 78
11 UIKit 0x32eb86ab -[UIView(CALayerDelegate) _layoutSublayersOfLayer:] + 26
12 CoreFoundation 0x31a2b7ff -[NSObject(NSObject) performSelector:withObject:] + 22
13 QuartzCore 0x3090d585 -[CALayer layoutSublayers] + 120
14 QuartzCore 0x3090d33d CALayerLayoutIfNeeded + 184
15 QuartzCore 0x3090ce0f _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 210
16 QuartzCore 0x3090cb69 _ZN2CA11Transaction6commitEv + 192
17 QuartzCore 0x3090caa7 _ZN2CA11Transaction5flushEv + 46
18 QuartzCore 0x3090ca75 +[CATransaction flush] + 24
19 UIKit 0x32f06f4b -[UIApplication _reportAppLaunchFinished] + 30
20 UIKit 0x32ff987d -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 328
21 UIKit 0x32f06139 -[UIApplication handleEvent:withNewEvent:] + 1396
22 UIKit 0x32f05a5d -[UIApplication sendEvent:] + 44
23 UIKit 0x32f05507 _UIApplicationHandleEvent + 5022
24 GraphicsServices 0x30672147 PurpleEventCallback + 666
25 CoreFoundation 0x31a75aab __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
26 CoreFoundation 0x31a7784f __CFRunLoopDoSource1 + 166
27 CoreFoundation 0x31a7862d __CFRunLoopRun + 520
28 CoreFoundation 0x31a218eb CFRunLoopRunSpecific + 230
29 CoreFoundation 0x31a217f3 CFRunLoopRunInMode + 58
30 UIKit 0x32eaf287 -[UIApplication _run] + 370
31 UIKit 0x32eade17 UIApplicationMain + 670
32 Medal 0x0000248f main + 70
33 Medal 0x00002444 start + 40
)
terminate called after throwing an instance of 'NSException'
プログラムはシグナルを受信しました:“SIGABRT”。
1,289ポイント を手に入れた。
|
|
|
|
Name: gak ..ぴよぴよ(208ポイント)
Date: 2010/09/30(木) 18:24
No:62475
|
|
Title: Re:iPhoneアプリ開発 実機転送で不具合が出る
|
|
環境が手元に無いんでソース眺めて思った程度の回答です。
> reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'
落ちてる原因はコレ。だけどソース検索掛けてみたけど直接は使っていない様子。
となると間接的に使われて落ちていると思われる。
”予想”というか”山を張る”というか”感”というか、そういうレベルの考えだけど、
実機環境だと pathForResource が失敗しリソースファイルのパス取得に失敗している可能性をは無いだろうか。
pathForResource が失敗して nil が返り、それが最終的に initFileURLWithPath まで渡されているとか?
とりあえず「全てのターゲットをクリーニング」してから再ビルドしてみてはどうかと。
再ビルドしてもダメなら、ファイルパス関係の処理をしている部分を見直してみると良いかと。
実機とシミュレータでは当然パスは異なってくるから、この差によって何か問題が発生している可能性もありえる。
208ポイント を手に入れた。
|
|
|
|
|
Name: 蓮 ..初心者(7,895ポイント)
Date: 2010/09/30(木) 19:29
No:62477
|
|
Title: Re:iPhoneアプリ開発 実機転送で不具合が出る
|
|
ご回答ありがとうございます。
出来れば明日の夕方までに用意できると一緒に作っている人に見せられるので
なんとかして解決したいので質問させて頂きまいた。
申し訳ないです。
検索ありがとうございます。
凄い助かります!!
全てのターゲットをクリーニングしたのですがやはりだめでした・・・
一度、アプリを消したのですがそれもだめでした・・・。
環境がないのにわかるなんて凄いですね・・・。
122ポイント を手に入れた。
|
|
|
|
|
Name: 蓮 ..初心者(7,919ポイント)
Date: 2010/09/30(木) 22:21
No:62481
|
|
Title: Re:iPhoneアプリ開発 実機転送で不具合が出る
|
|
>>出来れば明日の夕方までに用意できると一緒に作っている人に見せられるので
>>なんとかして解決したいので質問させて頂きまいた。
すみません・・・友人に相談したところ日にちを延ばしてもらいました。
なので解決できればいつでも助かります。
質問している側なのにせかすような発言をしてすみませんでした。
24ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(582,277ポイント)
Date: 2010/09/30(木) 22:42
No:62482
|
|
Title: Re:iPhoneアプリ開発 実機転送で不具合が出る
|
|
スタックコールの情報が正しいのだとすると、Initから呼ばれている LoadSoundSEにブレイクポイントを貼って、
LoadSoundSE内での[NSURL fileURLWithPath]に渡された引数がおかしくないか調べてみてはどうですか?
10ポイント を手に入れた。
|
|
|
|
|
Name: どどんぱち ..入門者(3,365ポイント)
Date: 2010/10/01(金) 01:34
No:62488
|
|
Title: RE
|
|
偶々、私もサウンド関連を調べていたので
ご回答させていただきます。
SE再生で落ちていましたが、プログラム側の問題ではなく、
使用しているWAVファイルのフォーマットに問題があるようです。
WAVの場合、再生できるフォーマットが限定されているのだと思いますので、
その辺を気にせずに扱いたい場合は、CAFかAIFFの使用をお勧めします。
AIFFに変換したデータを添付しますので、差し替えて使用してみてください。
私の環境では、実機で正常に動作することが確認できました。

107ポイント を手に入れた。
|
|
|
|
|
Name: 蓮 ..初心者(8,154ポイント)
Date: 2010/10/01(金) 02:13
No:62492
|
|
Title: Re:AIFF-2
|
|
>>Justyさん
いつもいつも回答ありがとうございます。
Justyさんには何度助けられたことか・・・
確かにLoadSoundSE関連をコメントアウトしたら普通に動きました・・・。
なぜかわからないのですがコメントアウトする組み合わせを変えたりすると動いたり動かなかったりします。
あまりに謎の減少すぎて原因がわかりません。
>>どどんぱちさん
そうなんですかΣ?
回答ありがとうございます!!!!!
しかもエンコードまでして下さるなんて・・・。
お手間を取らせてしまいました。
実機を仕事場に忘れてきてしまったので今日は確認できません・・・。
明日中に確認します。
本当に悩んでいたので助かりました。
235ポイント を手に入れた。
|
|
|
|
|
Name: 蓮 ..初心者(8,180ポイント)
Date: 2010/10/01(金) 02:15
No:62493
|
|
Title: Re:AIFF-2
|
|
>>Justyさん
あ・・・本当ですね・・・。
小文字で作ったはずなのですが大文字の物がありました・・・。
すぐに修正してきます。
実機では明日の確認します。
解決マークは後ほどつけさせていただきます。
26ポイント を手に入れた。
|
|
|
|
|
Name: 蓮 ..初心者(8,207ポイント)
Date: 2010/10/02(土) 22:48
No:62596
|
|
Title: Re:AIFF-2
|
|
出来ました!!
皆様ありがとうございました。
非常に助かりました。
27ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..熟練のプログラマー(52,922ポイント)
Date: 2010/10/02(土) 14:10
No:62541
|
|
Title: DXライブラリについて
|
|
ゲームプログラミングの館でDXライブラリをダウンロードしたのですが、
DXlid_VC2008用を開こうとすると
「このファイルを開くためのアプリケーションを選択(C):」 とでて開けません。
どのようにしたら開くことができるのか教えてください。
23ポイント を手に入れた。
|
|
|
|
Name: シエル [URL] ..比類無きプログラマー(84,844ポイント)
Date: 2010/10/02(土) 14:50
No:62551
|
|
Title: Re:DXライブラリについて
|
|
先ほど私が貼ったURLから2008か2010のどちらかをダウンロードして下さい。
どちらが良いかは私は2008しか持ってないので、アドバイスできません。
たまに2010は2008より少し重いというと聞くことがありますが。。。
それと、初心者という名前は規約違反です。
ここのURLを熟読して下さい。
168ポイント を手に入れた。
|
|
|
|
|
Name: シラフ ..ぴよぴよ(31ポイント)
Date: 2010/10/02(土) 17:44
No:62557
| 解決!
|
Title: Re:DXライブラリについて
|
|
ありがとうございました。
解決しました。
名前については申し訳ありあせんでした、
これからはよく読んでから投稿します。
次からはこの名前にします。
31ポイント を手に入れた。
|
|
|
|
|