C言語何でも質問掲示板


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

 
   子クラスの静的メンバ ....   
     ・[36494] ねこ 
     ・[36499] dic 
     ・[36506] dic 
     ・[36508] ねこ 
     ・[36525] 山崎 
     ・[36528] ねこ 
     ・[36529] 山崎 
     ・[36530] Justy 
     ・[36532] dic 
     ・[36541] 山崎 
     ・[36549] Justy 
     ・[36550] 山崎 
     ・[36551] Justy 
     ・[36587] 山崎 
     ・[36609] Justy 
     ・[36630] 山崎 
   自機のオプションにつ ....   
     ・[36602] ねこ 
     ・[36603] pooka 
     ・[36624] 氷水華 
     ・[36626] ねこ 
     ・[365971247962329] 氷水華 
   BCCのプロジェクト ....   
     ・[36591] 御津凪 
     ・[36592] チルチル 
     ・[36595] ねこ 
     ・[36596] チルチル 
     ・[36599] 御津凪 
     ・[36600] ねこ 
     ・[36606] Justy 
     ・[36612] チルチル 
   クォータービューの描 ....   
     ・[36433] ねこ 
     ・[36438] Justy 
     ・[36452] ねこ 
     ・[36475] クロウ 
     ・[36478] ねこ 
     ・[36482] クロウ 
     ・[36487] ねこ 
     ・[36524] クロウ 
     ・[36527] ねこ 
     ・[36552] クロウ 
     ・[36555] ねこ 
     ・[36561] クロウ 
     ・[36565] ねこ 
     ・[36604] クロウ 
   RyuJin.exeについて   
     ・[36601] ねこ 
   無題   
     ・[36577] ねこ 
     ・[36594] ドリアン 
   複数回定義のシンボル   
     ・[36507] ねこ 
     ・[36511] s-rush 
     ・[36512] 御津凪 
     ・[36517] ねこ 
     ・[36521] やそ 
     ・[36537] s-rush 
     ・[36543] 御津凪 
     ・[36583] s-rush 
     ・[36585] 御津凪 
     ・[36593] s-rush 
   無題   
     ・[36590] 御津凪 
   箱型のポリゴンの反射   
     ・[36503] LUNA 
     ・[36513] dic 
     ・[36514] ねこ 
     ・[36515] 御津凪 
     ・[36518] TRUTH 
     ・[36519] Mist 
     ・[36523] LUNA 
     ・[36534] LUNA 
     ・[36536] ねこ 
     ・[36557] LUNA 
     ・[36558] ねこ 
     ・[36575] LUNA 
   ぐにゃぐにゃレーザー   
     ・[36422] ねこ 
     ・[36425] ねこ 
     ・[36479] あ〜る 
     ・[36535] LUNA 
   2次元配列について、 ....   
     ・[36473] MNS 
     ・[36474] conio 
     ・[36477] フリオ 
     ・[36492] やそ 
     ・[36493] やそ 
     ・[36495] conio 
     ・[36496] やそ 
     ・[36531] 芳香剤 
   描画間隔について   
     ・[36480] dic 
     ・[36485] チルチル 
     ・[36486] ねこ 
     ・[36488] チルチル 
     ・[36516] 御津凪 
     ・[36526] チルチル 
   簡易ペイント   
     ・[36456] kokosan60 
     ・[36458] MNS 
     ・[36459] kokosan60 
     ・[36460] ねこ 
     ・[36461] ねこ 
     ・[36462] DVDM 
     ・[36466] ねこ 
     ・[36489] DVDM 
     ・[36497] ねこ 
     ・[36498] やそ 
   構造体についての質問 ....   
     ・[36450] ねこ 
     ・[36451] conio 
     ・[36484] Hermit 
   お願いします   
     ・[36436] b 
     ・[36437] Mr.AA 
     ・[36441] フリオ 
     ・[36442] conio 
     ・[36445] バグ 
     ・[36470] box 
     ・[36471] conio 
     ・[36483] ユーリ 
   プログラミングソフト ....   
     ・[36394] MNS 
     ・[36469] 北斗777 
   ボスの移動を制御する ....   
     ・[36464] 花火 
     ・[36465] チルチル 
   無題   
     ・[36447] Blue 
     ・[36448] conio 
   イラストロジックにつ ....   
     ・[36375] toyo 
     ・[36376] たいちう 
     ・[36386] デジキャメ 
     ・[36444] デジキャメ 
   弾幕の管理について   
     ・[36405] 通りすがり 
     ・[36406] MNS 
     ・[36415] ひよこ 
     ・[36424] ねこ 
     ・[36440] ひよこ 
   ボム発動時の帯につい ....   
     ・[36396] Dixq (管理人) 
     ・[36431] 丸 
     ・[36439] Dixq (管理人) 
     ・[363831247594529] 丸 
     ・[363831247594560] 丸 
     ・[363831247594572] 丸 
   質問です   
     ・[36423] conio 
     ・[36432] ユーリ 
   トリリニア補間につい ....   
     ・[36429] Justy 
     ・[36430] はね 
   ピクセルでRGB取得につ ....   
     ・[36234] ねこ 
     ・[36239] 御津凪 
     ・[36297] nn 
     ・[36299] 御津凪 
     ・[36300] ねこ 
     ・[36428] nn 
   マップファイルの読み ....   
     ・[36363] Justy 
     ・[36364] 亀猫 
     ・[36369] Justy 
     ・[36392] 亀猫 
     ・[36400] Justy 
     ・[36427] 亀猫 
   お願いします   
     ・[36370] conio 
     ・[36371] ねこ 
     ・[36373] Hermit 
     ・[36408] ユーリ 
     ・[36409] バグ 
     ・[36413] ユーリ 
   スレッドローカル変数 ....   
     ・[36341] たかぎ 
     ・[36377] kunene 
     ・[36402] たかぎ 
   ボムを実装!   
     ・[36351] あ〜る 
     ・[36357] Dixq (管理人) 
     ・[36379] 素人 
     ・[36380] conio 
     ・[36381] 素人 
     ・[36382] conio 
     ・[36388] 素人 
   キャラの速度   
     ・[36333] array 
     ・[36340] やそ 
     ・[36356] Dixq (管理人) 
     ・[36374] アイス 
   スクリプトデータ(ADV ....   
     ・[36280] 御津凪 
     ・[36366] わい 
     ・[36367] わい 
   質問です   
     ・[36362] DVDM 
     ・[36365] ユーリ 
   情報取得の方法につい ....   
     ・[36312] non 
     ・[36324] C言語はじめたばかりです。 
     ・[36335] non 
     ・[36339] toyo 
     ・[36359] C言語はじめたばかりです。 
   魔方陣を反時計周りに ....   
     ・[36321] 御津凪 
     ・[36322] array 
     ・[36323] ☆ 
     ・[36358] Dixq (管理人) 
   無題   
     ・[35630] ねこ 
     ・[35632] ユーリ 
     ・[35633] non 
     ・[35647] dic 
     ・[35668] やそ 
     ・[35675] やそ 
     ・[35688] non 
     ・[36010] ユーリ 
     ・[36012] 初級者 
     ・[36014] 山崎 
     ・[36015] ユーリ 
     ・[36017] 初級者 
     ・[36018] ユーリ 
     ・[36021] non 
     ・[36023] 初級者 
     ・[36043] ユーリ 
     ・[36045] non 
     ・[36046] 初級者 
     ・[36053] やそ 
     ・[36074] conio 
     ・[36343] ユーリ 
     ・[36344] non 
     ・[36345] box 
     ・[36353] ユーリ 
     ・[36354] ねこ 
     ・[36355] ユーリ 
   visual studioおよびW ....   
     ・[36336] 御津凪 
     ・[36337] Mist 
     ・[36350] 寺 
   起動時の警告   
     ・[36348] 亀猫 
   3D背景を作ってみよ ....   
     ・[36327] ねこ 
     ・[36329] 迷える羊 
     ・[36346] 迷える羊 
   基本は完成したのです ....   
     ・[36315] ねこ 
     ・[36330] DVDM 
     ・[36342] dic 
   静的メンバを各クラス ....   
     ・[36306] たかぎ 
     ・[36307] 山崎 
     ・[36318] Justy 
     ・[36334] 山崎 
   TCPとUDP どっちがい ....   
     ・[36278] Justy 
     ・[36293] ベリ工 
     ・[36328] ぬこ 
   プロジェクトがダウン ....   
     ・[36317] ねこ 
     ・[36319] めーりん 
   プログラムの著作権に ....   
     ・[36303] Dixq (管理人) 
     ・[36311] Ⓒ 
   ファイルの書き出し  ....   
     ・[35955] pooka 
     ・[35975] 西 
     ・[35976] バグ 
     ・[36025] 西 
     ・[36034] pooka 
     ・[36070] 西 
     ・[36071] pooka 
     ・[36136] 西 
     ・[36137] pooka 
     ・[36139] バグ 
     ・[36141] 西 
     ・[36147] pooka 
     ・[36150] バグ 
     ・[36160] pooka 
     ・[36231] 西 
     ・[36260] pooka 
     ・[36264] pooka 
     ・[36279] バグ 
     ・[36298] 西 
     ・[36301] バグ 
     ・[36305] pooka 
     ・[36309] バグ 
     ・[36310] pooka 
   C言語を習得すればつく ....   
     ・[36026] 御津凪 
     ・[36038] 俺 
     ・[36040] 山崎 
     ・[36041] Dixq (管理人) 
     ・[36042] non 
     ・[36047] 山崎 
     ・[36049] 御津凪 
     ・[36296] 俺 
   ボムを撃ってみようが ....   
     ・[36217] kazuoni 
     ・[36295] デラ初心者 
   龍神録プログラミング ....   
     ・[36288] Dixq (管理人) 
     ・[36294] ta 
   矩形と直線の当たり判 ....   
     ・[36291] MNS 
     ・[36292] ねこ 
     ・[362901247399721] B/B 
   VC++2008 F5とCtrl+F5 ....   
     ・[36282] DVDM 
     ・[36283] R 
     ・[36289] ねこ 

Name: 山崎  ..上級者(18,179ポイント)   Date: 2009/07/09(木) 10:49   No:36491       
Title: 子クラスの静的メンバの値を正しく取得できない    
お世話になっております、山崎です。
今回は、静的メンバのアクセスに関してお伺いに参りました。

現在、引き続き敵キャラに関する処理を作っております。
親クラスにグラフィックハンドルとなる変数を持たせ、
そのメンバを子クラスで静的メンバにしてオーバーライドしました。
グラフィックハンドルにLoadGraphする処理は、親クラスのメソッドにしています。

以下のコードのように、
子クラスの静的メンバに、親クラスのメンバ関数内でグラフィック領域を確保しようとしています。
親クラスのメンバ関数内では、クラス定義の外でNULLとしているはずの子クラスの静的メンバの値が
おかしなものになっています(親クラスのメンバにアクセスしてしまっているのだと思います)。


#include "DxLib.h"

class Parent
{
public:
int* GHandle;

void LoadGH(char* GHName)
{
if(GHandle==NULL)
{
GHandle=new int();
*GHandle=LoadGraph(GHName);
}
}

void PrintGH(int X,int Y)
{
DrawGraph(X,Y,*GHandle,TRUE);
}
};

class Child1:public Parent
{
public:
static int* GHandle;

Child1()
{
LoadGH("Img1.bmp");
}
};
int* Child1::GHandle=NULL;

class Child2:public Parent
{
public:
static int* GHandle;

Child2()
{
LoadGH("Img2.bmp");
}
};
int* Child2::GHandle=NULL;

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

if( DxLib_Init() < 0 )
return -1;

Child1 C11,C12;
Child2 C21,C22;

while(ProcessMessage()==0)
{
ClsDrawScreen();

C11.PrintGH(10,10);
C12.PrintGH(10,250);
C21.PrintGH(330,10);
C22.PrintGH(330,250);

ScreenFlip();
}

DxLib_End();
return 0;
}


親クラスのメンバ関数内で、子クラスでオーバーライドした静的メンバに
正しくアクセスするにはどのようにしたらよいのでしょうか。


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


Name: ねこ  ..上級者(24,254ポイント)   Date: 2009/07/09(木) 11:23   No:36494     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
どういうスコープの時にどうおかしいのかが分からないです。

LoadGH関数時にグラフィックハンドルが入っているのは「Parent::GHandle」ですよ。
とりあえず子クラスのコンストラクタに下記を追加すればいいのかな?

if( GHandle == NULL ) {
LoadGH( "Img1.bmp" );
GHandle = Parent::GHandle;
}


気になるのはParentにコンストラクタが無く「GHandle」がNULL初期化されていないから
いつまでもメモリ確保されないような・・・


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

Name: dic  ..プログラマー(27,734ポイント)   Date: 2009/07/09(木) 15:34   No:36499     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
Parentクラスを継承しているなら
子クラスで静的メンバにしてオーバーライドする理由は見当たりませんが


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

Name: dic  ..プログラマー(27,156ポイント)   Date: 2009/07/09(木) 16:03   No:36506     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
修正してみました

#include "DxLib.h"

class Parent {
public:
int* GHandle;

void LoadGH(char* GHName) {
if(GHandle==NULL) {
GHandle=new int();
*GHandle=LoadGraph(GHName);
}
}

void PrintGH(int X,int Y) {
DrawGraph(X,Y,*GHandle,TRUE);
}

Parent();
~Parent();
};

Parent::Parent() {
GHandle = 0;
}
Parent::~Parent() {
if( GHandle ) {
delete GHandle;
GHandle = NULL;
}
}
class Child1 : public Parent {
public:
Child1() {
LoadGH("Img1.bmp");
}
};

class Child2 : public Parent {
public:
Child2() {
LoadGH("Img2.bmp");
}
};

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

if( DxLib_Init() < 0 )
return -1;

Child1 C11,C12;
Child2 C21,C22;

while(ProcessMessage()==0)
{
ClsDrawScreen();

C11.PrintGH(10,10);
C12.PrintGH(10,250);
C21.PrintGH(330,10);
C22.PrintGH(330,250);

ScreenFlip();
}

DxLib_End();
return 0;
}


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

Name: ねこ  ..上級者(24,424ポイント)   Date: 2009/07/09(木) 16:10   No:36508     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
>dicさん
これだとインスタンス生成する度にファイルからグラフィックハンドル作っちゃいませんか?
多分それを回避するために子にstatic変数を用意してるんじゃないのかな〜と。


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

Name: 山崎  ..上級者(18,965ポイント)   Date: 2009/07/09(木) 18:39   No:36525     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
ねこさん、dicさん、ご返信誠にありがとうございます。
お返事遅くなって申し訳ございません。

>ねこさん
言葉足らずで申し訳ございません。
C11を宣言したときに、親クラスであるParentクラスで定義されているLoadGH()が
子クラスChildのコンストラクタ内で呼ばれるのですが、
クラス定義の外側で
int* Child1::GHandle=NULL;
とGHandleはNULLで初期化されているはずなのに、
LoadGH()内ではNULLではない値(0xcccccccc)になっています。

親クラスのGHandleに関してですが、
親クラスParentは子クラスに継承させるためだけに宣言しておりまして、
親クラスはインスタンス化せず、親クラス自体はGHandleを使用することがないので初期化しておりません。
その代わり、GHandleを利用する子クラスではクラス定義の外側でGHandle=NULLと初期化しております。

子クラスの静的変数GHandleがNULLで初期化され、
メンバ関数LoadGH()の
if(GHandle==NULL)
にひっかかりそのif文内でグラフィックをロードする…という処理をする、
というつもりのコードになっております。
一度GHandleにグラフィックをロードすればGHandleはNULLでなくなるので、
LoadGH()に入ってももうそれ以上同じグラフィックがロードされることはないはず、となると思ったのですが…。

なお、おっしゃるとおり
子クラスで親クラスのメンバを静的メンバとしてオーバーライドするのは
子クラスのインスタンスが生成されるたびに
同じ絵なのに新しいグラフィック領域が確保されてしまうのを防ぐためです。

親クラスのコンストラクタ内で
GHandle=NULL;
とした場合、子クラスのインスタンスが生成されるたびに親コンストラクタ内で
子クラスの静的メンバGHandleがNULLになるので、その後のLoadGH()のif(GHandle==NULL)内に入り、
既にグラフィック領域を確保したGHandleにまたグラフィック領域を確保してしまうのではないでしょうか?

>dicさん
ねこさんのおっしゃるとおり、
インスタンスが生成されるたびに同じ絵のグラフィック領域を確保されるのを防ぐため、
子クラスではGHandleを静的メンバとしてオーバーライドしております。


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

Name: ねこ  ..上級者(24,384ポイント)   Date: 2009/07/09(木) 19:19   No:36528     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
>int* Child1::GHandle=NULL;
>とGHandleはNULLで初期化されているはずなのに、
>LoadGH()内ではNULLではない値(0xcccccccc)になっています。
まずここが間違いですね。LoadGH関数で見えている「GHandle」はParent::GHandleです。
同名変数があっても関数が親に属したままです。
そのためGHandleに未初期化値の「0xccc〜」が入ってます。

今試せないのですが、LoadGHにvirtual定義を入れたら上手く動かないでしょうか?


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

Name: 山崎  ..上級者(19,042ポイント)   Date: 2009/07/09(木) 19:27   No:36529     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
>ねこさん
ご返信ありがとうございます。

今LoadGH()を
virtual void LoadGH()
としてデバッグしてみましたが、LoadGH()の中ではやはりParent::GHandleに
アクセスしてしまっているようです。
GHandleは0xccccccになっていて、if(GHandle==NULL)の中に入れませんでした。


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

Name: Justy  ..伝説なるハッカー(389,226ポイント)   Date: 2009/07/09(木) 19:33   No:36530     
Title: Re:子クラスの静的メンバの値を正しく取得できない    

>LoadGH()内ではNULLではない値(0xcccccccc)になっています。

 LoadGH内ではねこさんが最初に書いている通り、 Parent側の GHandleに
対してアクセスしています。

 staticな変数ではないので、未初期化状態なのでしょう。



>親クラスParentは子クラスに継承させるためだけに宣言しておりまして
>〜
>親クラスはインスタンス化せず、親クラス自体はGHandleを使用することがないので初期化しておりません

 正直意味がわからない半分、なんとなく判る半分なのですが、
根本的にそれらは別物の変数です。

 親クラスはインスタンス化しない、とありますが、
言語的にしっかりとインスタンス化されています。



>インスタンスが生成されるたびに同じ絵のグラフィック領域を確保されるのを防ぐため、
>子クラスではGHandleを静的メンバとしてオーバーライドしております。

 オーバーライドできるのはメンバ関数であって、変数ではありませんよ。



 さて、改善案ですが、根本的に子クラスの staticメンバにテクスチャハンドルを入れるまでは
まだいいのですが、それを1つしかないと決めうちして基底クラスでテクスチャをロードする設計は
テクスチャが複数枚になった瞬間対応出来なくなります。


 設計的に同じテクスチャの再読込を回避するなら、別の手法を使うべきでしょう。

 例えば、複数のテクスチャを管理するクラスを作り、エネミークラスは
ハンドルを格納する変数をメンバに持たせた上で、そこに対し
必要なテクスチャをリクエストします。

 テクスチャ管理クラスはそのテクスチャがまだ読み込まれていなければ
管理クラス内でロードを行い、そのハンドル値を記憶してからエネミークラスに
ハンドルを返します。
 既に読み込み済みなら、記憶していたハンドルを返します。

 これなら同じテクスチャを何度も読みことはなくなりますし、
解放処理も楽にできます。


 ちなみにこのような別の手法ではなく、現時点での方法の延長線上でなんとかしたいと
いうことでしたら最小限の修正&オーソドックスな手法としては仮想関数を
使うという手があります。

class Parent
{
public:
    void LoadGH(char* GHName)
    {
        int & handle = GetGHandle();
        if(handle==0)
            handle=LoadGraph(GHName);
    }

    void PrintGH(int X,int Y)
    {
        DrawGraph(X,Y,GetGHandle(),TRUE);
    }
    
    virtual int& GetGHandle() = 0;
};

class Child1:public Parent
{
public:
    static int GHandle;
    
    Child1() { LoadGH("Img1.bmp"); }
    virtual int& GetGHandle() { return GHandle; }
};
int Child1::GHandle=NULL;

class Child2:public Parent
{
public:
    static int GHandle;
    
    Child2() { LoadGH("Img2.bmp");}
    virtual int& GetGHandle() { return GHandle; }
};
int Child2::GHandle=NULL;

 ただ、まぁ自分で書いてて何ですが……微妙ですね。


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

Name: dic  ..プログラマー(27,922ポイント)   Date: 2009/07/09(木) 19:36   No:36532     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
なるほど そういう設計なのですね
私は、たとえ同じグラフィックでも別々で確保するので設計が異なるのでしょう

static メンバ変数を利用してるのはそういう理由だったんですね
なので static メンバ変数が使えるので利用させてもらって作り直しました


#include "DxLib.h"

class Parent
{
public:
// int* GHandle;

void PrintGH(int X,int Y,int *handle)
{
DrawGraph(X,Y,*handle,TRUE);
}
};

class Child1:public Parent
{
public:
static int* GHandle;

Child1()
{
if( GHandle == NULL ) {
GHandle = new int;
*GHandle = LoadGraph("Img1.bmp");
}

}
};
int* Child1::GHandle=NULL;

class Child2:public Parent
{
public:
static int* GHandle;

Child2()
{
if( GHandle == NULL ) {
GHandle = new int;
*GHandle = LoadGraph("Img2.bmp");
}
}
};
int* Child2::GHandle=NULL;

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

if( DxLib_Init() < 0 )
return -1;

Child1 C11,C12;
Child2 C21,C22;

while(ProcessMessage()==0)
{
ClsDrawScreen();

C11.PrintGH(10,10,C11.GHandle);
C12.PrintGH(10,250,C12.GHandle);
C21.PrintGH(330,10,C21.GHandle);
C22.PrintGH(330,250,C22.GHandle);

ScreenFlip();
}

DxLib_End();
return 0;
}




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

Name: 山崎  ..上級者(19,930ポイント)   Date: 2009/07/09(木) 21:34   No:36541 解決!     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
Justyさん、dicさん、ご返信誠にありがとうございます。

>Justyさん
親クラスのメンバと同名のメンバを子クラスで宣言しても、別のものとみなされるのですね…。
メンバ変数のオーバーライドのことなど、今までずっと勘違いをしてきたようです。
全くお恥ずかしい限りです、穴があったら顔から火を出しながら入りたいです…。

意味不明な質問で本当にすいません、
私なりに極力整理して書いたつもりですが、やはり精進不足…申し訳ないです。
とにかく経験をつんでまいりたいと思います。

さて本題の方ですが、
提示したコードは今作っているプログラムの問題の箇所を抽象的に簡単にしたもので、
実際のコードはもうちょっと複雑になっております。
実際は、GHandleはint**型で、LoadGH()内でint型の2次元配列にグラフィックを格納しております。
正面向きの絵が何枚で右向きの絵が何枚のキャラ、正面向きの絵しかないキャラなど、
キャラに応じて絵の枚数は変えられるようにしています。
なのでGhandleは、どうしてもint型のポインタ(のポインタ)にしたいと思っています。

やはり、グラフィックはグラフィックの管理専用のクラスにまとめるのがスタンダードなのでしょうか?
一番初めにプログラムの大まかな設計を考える段階では
全てのグラフィックを管理するクラスを作るという案はあったのですが、
結局、こんな問題に突き当たるとは思わず今の設計で作ることを何となく選んでしまいました。

今の設計のまま進めるのはちょっと私の技術じゃ難しいようなので、
書き換える手間はかかるかもしれませんが全てのグラフィックを管理するクラスを用いる方法に変えたいと思います。

>dicさん
わざわざコードを提示してくださり誠にありがとうございます。
しかしながら、今までの方法では私の手に負えなくなってきましたので、
ちょっと手法を変えていくことにいたしました。
せっかく提示していただいたのに申し訳ございません。

ちなみに、実際のプログラムでは、親クラスEnemyで
こんな風にグラフィックをロードしていました。



void Enemy::MakeHandle(char* NEnemyName)
{
//グラフィック領域を確保
if(GHandle==NULL)
{
char FileName[100];
GHandle=new int*[4];//右、左、正面、後ろの4方向のグラフィック
for(int i=0;i<4;i++)
{
GHandle[i]=new int[GHNumber];//1方向につき、GHNumber枚のグラフィックを確保
for(int j=0;j<GHNumber;j++)
{
if(i!=2)//右向き以外のグラフィックをロード
{
if(i==0)//右向きのグラフィックのロード
{
sprintf(FileName,"ImageFiles\\Enemy\\%s\\%s%d_%d.bmp",NEnemyName,NEnemyName,i,j);
GHandle[i][j]=LoadGraph(FileName);
}
else//i==1 || i==3 正面向き、後ろ向きのグラフィックのロード
{
if(GHDirection==2)
{
sprintf(FileName,"ImageFiles\\Enemy\\%s\\%s%d_%d.bmp",NEnemyName,NEnemyName,i,j);
GHandle[i][j]=LoadGraph(FileName);
}
else
GHandle[i][j]=GHandle[0][j];
}
}
else//右向きのグラフィックをロード
{
if(GHDirection!=0)
{
int XSize,YSize;
GetGraphSize(GHandle[0][j],&XSize,&YSize);
GHandle[i][j]=DerivationGraph(XSize-1,0,-XSize,YSize,GHandle[0][j]);
}
else
GHandle[i][j]=GHandle[0][j];
}

}
}
}
}


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

Name: Justy  ..ぴよぴよ(69ポイント)   Date: 2009/07/09(木) 22:48   No:36549     
Title: Re:子クラスの静的メンバの値を正しく取得できない    

>実際は、GHandleはint**型

 なるほど、そうでしたか。



>グラフィックはグラフィックの管理専用のクラスにまとめるのがスタンダードなのでしょうか?

 特にそういうわけではないです。
 全部を1つに、というのはあまりないかと。

 結局のところ、規模とか状況にも依るわけですが、リソースの使用状況とか寿命を
管理する為の何らかの仕組みはあった方がいいとは思いますが、それがリソースを
まとめるクラスであるかどうかは、状況次第になります。

 単純に個々の末端でのコンストラクタ・デストラクタでのリソースの読み込み・破棄で済むことも
あるでしょうし、今回のようにクラスに静的メンバを置いて管理した方がいいこともありますので。



>全てのグラフィックを管理するクラスを用いる方法に変えたいと思います

 勧めておいて何ですが、性急に決めないでもう少し検討してもいいかと思いますよ。
 今から変えるのは手間ですし、それで設計上問題ないか検討は十分に行なわないと
後でいろいろ問題がおきるかもしれませんし。


 で、ある程度状況が判ったところで、もう今の延長線上での提案を。
 Enemy::MakeHandleのような処理を基底に入れるなら、こうしてはどうでしょうか。

 Enemy::MakeHandleはローカル変数として宣言した int **に対してnewを行い、様々な処理を行ったあと、
そのポインタを戻り値として返し、派生側で staticメンバに代入を行う、という方法です。

 これなら派生先の情報を基底に持ち込まなくて済むので、だいぶマシになるかと思います。
 どうでしょう。


(あ、あとできるなら、グラフィックハンドルは intではなくテクスチャクラスを使って管理し
さらに vectorとかのコンテナでまとめて管理するようにしておいてほしいところです)


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

Name: 山崎  ..上級者(20,971ポイント)   Date: 2009/07/10(金) 01:01   No:36550     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
Justyさん
リソースの扱い方は状況次第、なのですね。
私はまだプロのプログラマではなく取引されるようなプログラムを見た事が無いので、
自分のプログラムが常識はずれな組み方なんじゃないかとよく心配になります。
この子クラスの静的メンバに親クラスのメンバ関数内でアクセスしてグラフィックをロード、
という方法はプロに見せたら笑われるんじゃないか、とちょっと心配してました。

 >Enemy::MakeHandleはローカル変数として宣言した int **に対してnewを行い、様々な処理を行ったあと、
  そのポインタを戻り値として返し、派生側で staticメンバに代入を行う

とは、このような感じでしょうか?


class Enemy:public BattleObject
{
public:
int** GHandle;
short GHNumber;//1方向につき何枚の絵を持つか
short GHDirection;//正面向きの絵だけのキャラか、左右の2つの向きの絵があるキャラか、4方向全ての絵があるキャラか

void PrintGH(){...};

int** MakeGHandle(char* NEnemyName)
{
//グラフィック領域を確保
if(GHandle==NULL)
{
char FileName[100];
GHandle=new int*[4];//右、左、正面、後ろの4方向のグラフィック
for(int i=0;i<4;i++)
{
GHandle[i]=new int[GHNumber];//1方向につき、GHNumber枚のグラフィックを確保
for(int j=0;j<GHNumber;j++)
{
//GHDirection,GHNumber,NEnemyNameにしたがってGHandle[i][j]にグラフィックのロードを行う
...
}
}
}

return GHandle;
}

};

class ChildEnemy:public Enemy
{
public:
static int** GHandle;
static short GHDirection;
static short GHNumber;

ChildEnemy()
{
if(GHandle==NULL)
GHandle=MakeGHandle("ChildEnemy");
}
};
int** ChildEnemy::GHandle=NULL;
short ChildEnemy::GHDirection=2;
short ChildEnemy::GHNumber=3;


上のコードのEnemyクラスにはGHDirectionとDHNumberというメンバがありますが、
これはグラフィックをロードする際に使うメンバで、
GHDirectionはそのキャラが向き別のグラフィックを持つかどうかを表し、
GHNumberはそのキャラが1方向の向きにつき何枚のグラフィックを持つかを表しています。
これらのメンバはひとつのクラスにひとつずつあればいいので、
実際のプログラムでは上のコードのように子クラスで静的メンバにして、親のMakeGHandle()内で使用しています。

グラフィックをロードするだけならMakeGHandle()の引数で
向きや枚数の情報を指定してやればいいのですが、使い終わったグラフィックを解放するときに、
どの向きの絵を何枚確保していたかを記憶していないと正しくグラフィック領域を解放できません。

また、是非ともJustyさんのご助言どおり、
テクスチャクラスやvectorでの管理を実践したいと思っているのですが、
「テクスチャクラス」とは何でしょうか?
グラフィックハンドルを専門に扱うクラスを自分で定義したもの、でしょうか?

いろいろご助言頂き、本当にありがとうございます。


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

Name: Justy  ..伝説なるハッカー(389,873ポイント)   Date: 2009/07/10(金) 01:53   No:36551     
Title: Re:子クラスの静的メンバの値を正しく取得できない    

>とは、このような感じでしょうか?

 いえ、それだと Enemyクラスのメンバ GHandleを返していますよね?
 Enemyクラスは GHandleは持ちません。
 あくまで、Enemy::MakeGHandle()のローカル変数上で int**からデータを構築し、
戻り値としてそのポインタのポインタを戻します。

 ちょっと強引なサンプルですが、

class Enemy
{
public:
    int** MakeGHandle(char* GHName)
    {
        int **handle = new int*[1];
        handle[0] = new int[1];
        handle[0][0] = LoadGraph(GHName);
        return handle;
    }
};

class Child1:public Enemy
{
public:
    static int **GHandle;

    Child1()
    {
        if(!GHandle)
            GHandle = MakeGHandle("Img1.bmp");
    }
};
int **Child1::GHandle=NULL;

class Child2:public Enemy
{
public:
    static int **GHandle;

    Child2()
    {
        if(!GHandle)
            GHandle = MakeGHandle("Img2.bmp");
    }
};
int **Child2::GHandle=NULL;




>グラフィックハンドルを専門に扱うクラスを自分で定義したもの、でしょうか?

 そうです。
 1つのテクスチャを1テクスチャクラスが管理し、生成から破棄までを
コントロールするようなクラスです。
 そうしておくと、生成はともかく、破棄は楽になります。

 たとえば、そのテクスチャクラスを DxLib::Textureとしたのなら、

 DxLib::Texture *tex = new DxLib::Texture[3];
 tex[0]->LoadFile("a.bmp");
 tex[1]->LoadFile("b.bmp");
 tex[2]->LoadFile("b.bmp");
 delete[] tex;

 としたとき、最後の deleteで3つの DxLib::Textureクラスがデストラクタで
それぞれ DeleteGraphもやってくれたら楽ですよね?


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

Name: 山崎  ..上級者(22,020ポイント)   Date: 2009/07/10(金) 21:02   No:36587     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
Justyさん
お返事遅れてしまい申し訳ございません。
アドバイスを元にプログラムを修正しておりました。
おかげさまで、期待通りの動きのプログラムに修正することができました。

ご助言頂いたように、新たにTextureクラスを作成しました。
Enemy::MakeGHandle()もTexture**を返すようにしてみました。
確かに、グラフィック領域の解放がかなり楽にできますね。
これからはこの手法を用いていこうと思います。


class Texture
{
public:
int GHandle;
bool Original;//デストラクタが呼ばれたとき、グラフィック領域を開放するかどうか

Texture();//引数なしコンストラクタ。配列をnewしたときのため。
Texture(char* GHName);//グラフィックのファイル名を指定して新たにグラフィック領域を確保
Texture(Texture& Tex);//既に確保されたグラフィックのハンドルをコピー。領域は確保しない。

Texture::~Texture()
{
if(Original==true)
DeleteGraph(GHandle);
}

//引数なしコンストラクタでインスタンスを生成した場合、後からハンドルを設定する関数たち
void MakeHandle(char* GHName);
void MakeHandle(Texture& Tex);
void MakeHandle(int NGH);

int Texture::GetHandle()//グラフィックハンドルを返す
{
return GHandle;
}
};

Texture** Enemy::MakeHandle(short GHDir, short GHNum, char *EnemyName,Texture** GH)
{
//グラフィック領域を確保
if(GH==NULL)
{
char FileName[100];
Texture** Handle=new Texture*[4];//右、左、正面、後ろの4方向のグラフィック
for(int i=0;i<4;i++)
{
Handle[i]=new Texture[GHNum];//1方向につき、GHNumber枚のグラフィックを確保
for(int j=0;j<GHNum;j++)
{
if(i!=2)//右向き以外のグラフィックをロード
{
if(i==0)//右向きのグラフィックのロード
{
sprintf(FileName,"ImageFiles\\Enemy\\%s\\%s%d_%d.bmp",EnemyName,EnemyName,i,j);
Handle[i][j].MakeHandle(FileName);
}
else//i==1 || i==3 正面向き、後ろ向きのグラフィックのロード
{
if(GHDir==2)
{
sprintf(FileName,"ImageFiles\\Enemy\\%s\\%s%d_%d.bmp",EnemyName,EnemyName,i,j);
Handle[i][j].MakeHandle(FileName);
}
else
Handle[i][j].MakeHandle(Handle[0][j]);
}
}
else//右向きのグラフィックをロード
{
if(GHDir!=0)
{
int XSize,YSize;
GetGraphSize(Handle[0][j].GetHandle(),&XSize,&YSize);
Handle[i][j].MakeHandle(DerivationGraph(XSize-1,0,-XSize,YSize,Handle[0][j].GetHandle()));
}
else
Handle[i][j].MakeHandle(Handle[0][j]);
}

}
}

return Handle;
}
else
return GH;
}


おかげさまで、これまでの設計を大きく変更することなく、
子クラスの静的メンバにグラフィック領域を確保することができました。
本当に、いろいろ丁寧にご助言くださりありがとうございます。

恐縮ながら最後にひとつお伺いしたいのですが、
vectorなどのコンテナでまとめるというのは、Textureクラスを、でしょうか?
Texture**型のポインタにnewで2次元配列を確保し、グラフィックをそこで管理するのではなく、
static vector<Texture> EnemyChild::Textures;
のようにTexture型を格納するvectorなどを用意し、そこで管理したほうがいい、
という理解でよろしいでしょうか。


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

Name: Justy  ..伝説なるハッカー(390,263ポイント)   Date: 2009/07/11(土) 00:18   No:36609     
Title: Re:子クラスの静的メンバの値を正しく取得できない    

>新たにTextureクラスを作成しました

 多分掻い摘んで書いてある Textureクラスだと思うので省略されてしまっているだけなのかも
しれませんが、このクラスはコピー対策はしてありますか?
 していないのでしたら、しておいた方がいいかと思います。

 コピーされると、Originalメンバが trueなのが複数生まれ、
どれか1つが破棄された段階で終わってしまいます。



>Texture**型のポインタにnewで2次元配列を確保し、グラフィックをそこで管理するのではなく、
>static vector<Texture> EnemyChild::Textures;
>のようにTexture型を格納するvectorなどを用意し、そこで管理したほうがいい

 そういうことになります。
 
 今はポインタ2つで二次元配列のように使っていますが、
今回の用途を考えると1次元でも十分だと思います。

 使用するテクスチャの枚数は 4 * GHNumであり、計算すれば右の2枚目、とかは
別に handle[2][1]とかでなくても、handle[2 * GHNum + 1]のようにアクセスすれば
十分区別できます。

 int GetHandle(右, 1);

 のようなメンバ関数でも作っておけば間違えることもないでしょうし。


 ただ、1点だけ。
 最終的なテクスチャの解放は DxLib_End()よりも前に行わなければならないので、
使ったコンテナは必ず DxLib_End()よりも前にクリアしておいてください。


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

Name: 山崎  ..上級者(22,269ポイント)   Date: 2009/07/11(土) 10:25   No:36630     
Title: Re:子クラスの静的メンバの値を正しく取得できない    
Justyさん
Textureクラスのコピー対策は恥ずかしながらしっかりと怠っておりました…。
コピーコンストラクタはこのように定義しました。


Texture::Texture(const Texture& Tex)
{
GHandle=Tex.GHandle;
Original=false;
}


先ほど子Enemyクラスの静的メンバint** GHandlesも、
vector<Texture*> GHandlesに修正しました。
修正にだいぶ手間取りましたが、今は敵キャラたちも元気に動いております。

何から何までいろいろ教えていただき本当に感謝の言葉もございません。
Justyさんのような方々がいるおかげで、めげずにプログラムを続けていくことができます。


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



Name: 氷水華  ..ぴよぴよ(481ポイント)   Date: 2009/07/10(金) 22:39   No:36597       
Title: 自機のオプションについて    
東方永夜抄での藍の敵にホーミング?して敵が死ぬ(画面から消える)まで攻撃し続けるようにするにはどうすればよろしいでしょうか???
あと、作品を忘れましたが、オプションが後をついてきて、低速でオプション間隔を固定して移動できるみたいなのはどうすればよろしいでしょうか?

質問ばかりすいません


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


Name: ねこ  ..プログラマー(25,598ポイント)   Date: 2009/07/10(金) 23:11   No:36602     
Title: Re:自機のオプションについて    
<藍
1.敵の存在の有無を確認する。
2.存在する敵(1番目か最近敵)に対して接近処理を実行する。存在しない場合はプレイヤー側へ徐々に戻る。

<レミリア系
1.オプションが自機を追従するような動作を作成する。
2.低速(SHIFT?)ボタンを押した時は移動処理を行わない。


詳細に関しては氷水華さんがどのように作っているのかが分からないため答えられません。


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

Name: pooka [URL]  ..中級者(10,551ポイント)   Date: 2009/07/10(金) 23:32   No:36603     
Title: Re:自機のオプションについて    
>オプションが後をついてきて
こちらが参考になるかもしれません。
ttp://www.play21.jp/board/formz.cgi?action=res&resno=32533&page=&lognum=100&id=dixq&rln=32537


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

Name: 氷水華  ..ぴよぴよ(616ポイント)   Date: 2009/07/11(土) 07:48   No:36624     
Title: Re:自機のオプションについて    
>ねこさん
なるほど、そういう風にすれば出来るのですね。ありがとうございます。
出来れば藍の方のプログラムだけ教えていただきたいです。



>pookaさん
ありがとうございます。これでついて来るのが実装出来ます。




自分はC++で縦スクロールを作ってます


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

Name: ねこ  ..プログラマー(26,142ポイント)   Date: 2009/07/11(土) 08:55   No:36626     
Title: Re:自機のオプションについて    
<自分はC++で縦スクロールを作ってます
いえそういうことではなく、龍神録50章をベースにとかこんなシステムで〜とかそういう意味です。

とりあえず龍神録をベースに作ってると仮定して以下のソースを参考にして下さい。
変数名はうろ覚えなので、適切に置き換えてください。
負荷考慮していないので、常に敵を検索する処理になってます。
軽減するためには策敵インデックスを付けるとかありますが、ひとまず今回は動きの実装部分だけ。


bool bFind = false;
double spd = 20; // スピード、この値が小さいほど接近スピードが速い。0はだめ。
for( int i = 0; i < ENEMY_MAX; i++ )
{
// 存在フラグが無ければコンテニュー
if( enemy[ i ].flag == 0 )
continue;
// 敵へ接近する
opion_bb[ 0 ].x += ( enemy[ i ].x - opion_bb[ 0 ].x ) / spd;
opion_bb[ 0 ].y += ( enemy[ i ].y - opion_bb[ 0 ].y ) / spd;
// 最初に見つかった敵のみ
bFind = true;
break;
}
// 敵が見つからなかった時
if( bFind == false )
{
// プレイヤーへ接近する
opion_bb[ 0 ].x += ( ch.x - opion_bb[ 0 ].x ) / spd;
opion_bb[ 0 ].y += ( ch.y - opion_bb[ 0 ].y ) / spd;
}


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

Name: 氷水華   Date: 2009/07/19(日) 09:12   No:365971247962329 解決!     
Title: Re:自機のオプションについて    
なんか勘違いしてました。
コードありがとうございます。






Name: チルチル  ..プログラマー(28,499ポイント)   Date: 2009/07/10(金) 21:33   No:36589       
Title: BCCのプロジェクト設定    
ちょっとBCCのプロジェクト設定を見ていたら
タブの中に「コード最適化」と言う項目がありました
この前の質問でコンパイルする時に
コードのまとめられる所をまとめてくれる事を知ったんですが
もしかしてこの項目でその機能をONにできるのでしょうか?


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


Name: 御津凪 [URL]  ..ハッカー(103,072ポイント)   Date: 2009/07/10(金) 21:47   No:36591     
Title: Re:BCCのプロジェクト設定    
> コードのまとめられる所をまとめてくれる事を知ったんですが
> もしかしてこの項目でその機能をONにできるのでしょうか?

そうです。
「サイズを最適化」はプログラムサイズを小さくするための最適化、
「速度の最適化」は実行速度を速めるための最適化を行います。
「最適化なし」はその名の通り、プログラムコードそのままにコンパイルします。


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

Name: チルチル  ..プログラマー(28,630ポイント)   Date: 2009/07/10(金) 22:09   No:36592     
Title: Re:BCCのプロジェクト設定    
やはりそうでしたか
では速度を最適化でやってみます

ところで他にも項目はあるんですが
よくわからないまま変更すると危ないので
他はそのままで行こうと思うんですが
その下のコンパイルの所に
「重複文字列の単一化」
「スタックフレームの作成」
「拡張エラー情報の表示」
「enum型をint型とする」
と言う項目があるんですが
これはどういう意味なんでしょうか?


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

Name: ねこ  ..プログラマー(25,407ポイント)   Date: 2009/07/10(金) 22:22   No:36595     
Title: Re:BCCのプロジェクト設定    
ヘルプを見る、という手段は無いのでしょうか?w

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

Name: チルチル  ..プログラマー(28,654ポイント)   Date: 2009/07/10(金) 22:27   No:36596     
Title: Re:BCCのプロジェクト設定    
ヘルプは(なし)と表示されるだけです・・

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

Name: 御津凪 [URL]  ..ハッカー(103,072ポイント)   Date: 2009/07/10(金) 22:54   No:36599     
Title: Re:BCCのプロジェクト設定    
> ねこさん

確か、BCC に同梱されているものには詳しいヘルプは無かったはずです。
(オプションについてはほぼ皆無です)

ただ、無償で公開されている Turbo C++ Explorer には載っていたはずです。
それだけのためにダウンロード、というのもあれですが、
確かこっちのコンパイラのほうがバージョンが上だった気がします。
(結構前の記憶なので正しいかどうかわかりませんが)



Name: ねこ  ..プログラマー(25,468ポイント)   Date: 2009/07/10(金) 23:04   No:36600     
Title: Re:BCCのプロジェクト設定    
>御津凪様

なるほど、それは失礼しました。
何か答える方もそれなりに確認取ったりする必要のある内容をポンポンと聞いてたので
それは自分ではどうしようもないの?と思ってついつい。


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

Name: Justy  ..伝説なるハッカー(389,801ポイント)   Date: 2009/07/10(金) 23:44   No:36606     
Title: Re:BCCのプロジェクト設定    

>BCC に同梱されているものには詳しいヘルプは無かったはずです

 あれ? うちの v5.5には bcc55\Help\bcb5tool.hlp ってのがありますよ。
 まぁ見ての通り、詳しく書いてあるわけではないですが……。


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

Name: チルチル  ..プログラマー(28,728ポイント)   Date: 2009/07/11(土) 00:44   No:36612 解決!     
Title: Re:BCCのプロジェクト設定    
う〜ん、ヘルプの有無ですか
そういう事もあるんですね・・

とりあえず当初の目的は達成したので解決にしておきます
どうもありがとうございました


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



Name: クロウ  ..中級者(9,185ポイント)   Date: 2009/07/07(火) 23:26   No:36419       
Title: クォータービューの描画順位    
以前も質問させていただきましたが、クォータービューにおいてのキャラクターとマップの描画順位についてです。
以前の質問した時には、スクロールは連続的なのに対し、キャラクターの移動は離散的であるところまでできたのですが、連続的に移動させると描画順位が狂ってしまっていました。
当時は離散的な描画でもよかったのですが、今現在作っているクォータービューのパズルアクションではアクション性が出てきたので、タクティクスオウガなどのクォータービューのゲームのようにキャラクターが移動中の描画をしても描画順位が狂わないようにしたいのです。

今の描画方法ですと、どう頑張っても離散的にしかならなさそうなのでアドバイスをお願いします。

今現在のマップとキャラクターの描画部分を載せておきます。また、表示するマップデータと読み込み部分を添付しました。


#define MAPSIZEMAX_X 32//マップの広さX
#define MAPSIZEMAX_Y 32//マップの広さY

void dataDraw( void )
{
//int i, f ;//i:キャラの数,x:forループx座標,y:forループy座標,f:マップの段数
int px, py ;//描画座標
int hx = 288;
int hy = 64;//初期描画位置の補正

for(int y = 0; y < MAPSIZEMAX_Y; y++ ){
for(int x = 0; x < MAPSIZEMAX_X; x++ )
{
px = hx-(y*32)+(x*32) + scroll_X(99);
py = hy+(y*16)+(x*16) + scroll_Y(99/*適当な値を入れている*/);
if(mapData.field[y][x] != -1){//マップデータがNULLでなければ

for(int f = 0;( f < mapData.fieldHigh[y][x] || mapData.fieldHigh[y][x] == 99); f++ ){
//高さ分積む(処理落ちしているので中身を空洞に)
//マップチップを並べる

if(px <= 600 + 64 && px >= 0 - 64 && py <= 600 + 48 && py >= 0 - 48){//描画領域内のみ描画
if(f == mapData.fieldHigh[y][x] - 1){//高さ以外の部分を空洞にする

DrawGraph( px, py-f*16, dat.Pic.MapChip[ mapData.field[y][x] ], TRUE );//マップチップの描画
}
}
//障害物を描画
if(mapData.hurdle[y][x] != 0){
DrawGraph( px, py-mapData.fieldHigh[y][x]*16, dat.Pic.MapObject[ mapData.hurdle[y][x]/*iaMap[y][x]*//*f%4*/ ], TRUE );
}

for(int i = 0; i < CHARAMAX; i++ ){

if(NPC.alive[y][x] == true){
NPCDraw(px ,py -48 , mapData.fieldHigh[y][x] - 1 , x ,y , NPCData[i].rank , i);
//NPCの描画
}

if(enemyData[i].alive == true && enemyData[i].true_X/16 == x && enemyData[i].true_Y/16 == y){//敵を描画

enemyDraw(px ,py -48 , mapData.fieldHigh[y][x] - 1 , x ,y , enemyData[i].rank , i);
}

if( ch[player].true_X/16 == x && ch[player].true_Y/16 == y ){

charaDrawMain(px , py -48 , mapData.fieldHigh[y][x] -1 , i , ch[i].type );//プレイヤーを描画

}
}

}
}
}
}


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


Name: ねこ  ..上級者(22,492ポイント)   Date: 2009/07/08(水) 01:27   No:36433     
Title: Re:クォータービューの描画順位    
離散的の意味がよく分からないんですが、多分移動中に本来奥にあるオブジェクトが手前に描画されてるって事ですよね。
恐らくマップチップの真上に居る時は思い通りの描画になっている、と。

if( ch[player].true_X/16 == x && ch[player].true_Y/16 == y )
この処理を
int x1 = ch[player].true_X/16;
int x2 = x1 + 1;
int y1 = ch[player].true_Y/16;
int y2 = y1 + 1;
int cx = max( x1, x2 );
int cy = max( y1, y2 );
f( cx == x && cy == y )

と書き変えると一部上手くいきませんか?
※方向の絡みがよく把握出来てないのでmaxかminか+1か-1か変わるかもしれないです。

それから多分高さ考慮が足りないと思うんですが・・・時間が押しちゃったので誰かにバトンタッチ・・・


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

Name: Justy  ..伝説なるハッカー(388,910ポイント)   Date: 2009/07/08(水) 02:35   No:36438     
Title: Re:クォータービューの描画順位    
 描画順位が狂う、というのは例えば、今いるブロックから同じ高さの隣り合った左右どちらかの手前に
移動しようとすると、移動の途中で下半身が消え、移動が終わると正常に戻っている、
みたいな状態でしょうか。

 正直これだけの情報では何がどうおかしいのかよくわからないので推測になりますが
どのブロックの上にいるのか、の判定がおかしいんでしょうね。

 16で割っているので、15のところまで進んでも以前のブロックの位置にいると
判定しているのが原因のような気もしますね。


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

Name: ねこ  ..上級者(22,537ポイント)   Date: 2009/07/08(水) 12:10   No:36452     
Title: Re:クォータービューの描画順位    
見直すと凄い変な処理書いてる、すいませんorz

現在乗っているマップチップの位置の座標をP1( x1, y1, z1 )とします( fはzと置き換えます )
現在のマップチップからずれてる方向にあるマップチップの座標をP2( x2, y2, z2 )とします。
P1からP2に対するそれぞれのxyz距離を1.0とした時、キャラの位置dx,dy,dzを0.0〜1.0の間で求めます。
int cx = dx < 0.5 ? x1 : x2;
int cy = dy < 0.5 ? y1 : y2;
int cz = dz < 0.5 ? z1 : z2;
として、求めたcx,cy,czをif分の判定に使用します。
なお、この方法はマップチップ自体がずれる場合には有用ではありません。
これでなんとかならないかなぁ。



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

Name: クロウ  ..中級者(9,331ポイント)   Date: 2009/07/08(水) 22:38   No:36475     
Title: Re:クォータービューの描画順位    
Justyさん>
移動前、移動後との断続的な描画をやめたときの移動中はこのスクリーンショットのような状況になっています。

ねこさん>
離散的に描画されているといいましたが、つまり移動前と移動後だけ描画されていて、移動中の描画が抜けてしまっていることになっています。
このcx,cy,czをif文に判定するということは
if( ch[player].true_X/16 == x && ch[player].true_Y/16 == y )のx,yを
cx,cyに書き換えるということですか?




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

Name: ねこ  ..上級者(23,842ポイント)   Date: 2009/07/08(水) 23:11   No:36478     
Title: Re:クォータービューの描画順位    
>クロウ様
逆ですね、ch[player].tru_X/16をcxに変えます。

http://ux.getuploader.com/neco3death/download/1/Sample.lzh
pass:dxlib

サンプル作ってみましたが、一応こんな動きをすれば良いのかな。
※最初に「R」キー押してデータ読むとサンプル時のブロック読みます。


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

Name: クロウ  ..中級者(9,342ポイント)   Date: 2009/07/08(水) 23:54   No:36482     
Title: Re:クォータービューの描画順位    
そうです。
そんな動きを求めています。


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

Name: ねこ  ..上級者(24,152ポイント)   Date: 2009/07/09(木) 01:23   No:36487     
Title: Re:クォータービューの描画順位    
<そんな動きを求めています。
了解しました。と言っても既に前レスで必要な考慮は書いてますのでお試しください。
要は現在居る位置はどのマップチップ上なのかを移動元から移動先への進み具合で切り変えるだけです。


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

Name: クロウ  ..中級者(9,670ポイント)   Date: 2009/07/09(木) 18:18   No:36524     
Title: Re:クォータービューの描画順位    
ねこさん>
上の二つのレスを参考に書いてみましたが・・・。
サンプル通りにいきません。
こんな変な動きをしています。
*上(画面上では右上)にいくとき、一度二つ分進んで移動先の座標に戻ってくる
*下(左下)に行くとき、一度上昇して移動先の座標に戻ってくる
*右(右下)に行くとき、少し上昇して移動する。
*左(左上)に行くとき、少し上昇して移動する。
下に書いてみた部分のどこが間違っているんでしょうか?


int x1,y1,z1,x2,y2,z2;//比較用変数
x1 = y1 = z1 = x2 = y2 = z2 = 0;//初期化

//プレイヤーが立っている位置
x1 = ch[player].true_X/16;
y1 = ch[player].true_Y/16;
z1 = mapData.fieldHigh[ch[player].true_Y/16][ch[player].true_X/16];

//プレイヤーの移動先の座標
if(ch[player].vector == up){
x2 = x1;
y2 = y1 - 1;
z2 = mapData.fieldHigh[y2][x2];
}
if(ch[player].vector == down){
x2 = x1;
y2 = y1 + 1;
z2 = mapData.fieldHigh[y2][x2];
}
if(ch[player].vector == left){
x2 = x1 - 1;
y2 = y1;
z2 = mapData.fieldHigh[y2][x2];
}
if(ch[player].vector == down){
x2 = x1 + 1;
y2 = y1;
z2 = mapData.fieldHigh[y2][x2];
}
float dx,dy,dz;//プレイヤーの移動中の座標(0.0〜1.0)

dx = (ch[player].true_X - x1*16)/32.0;
dy = (ch[player].true_Y - y1*16)/16.0;
dz = (mapData.fieldHigh[y2][x2] - mapData.fieldHigh[y1][x1]) /(ch[player].true_X/16*ch[player].true_X/16 + ch[player].true_Y/16*ch[player].true_Y/16);

//描画位置の更新
int cx = dx < 0.5 ? x1 : x2;
int cy = dy < 0.5 ? y1 : y2;
int cz = dz < 0.5 ? z1 : z2;

if( cx == x && cy == y ){

charaDrawMain(px + dx*32 , py - dy*16 -48 , cz -1 , player , ch[player].type);
// 描画座標x、描画座標y、プレイヤーの高さ、キャラ番号(プレイヤー)、キャラタイプ(プレイヤー)
}


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

Name: ねこ  ..上級者(24,197ポイント)   Date: 2009/07/09(木) 19:15   No:36527     
Title: Re:クォータービューの描画順位    
>クロウさん
1.dx,dy,dzはfabsをかけて絶対値で考える
題名通り、移動先と移動元との減算でどっちが奥かの考慮がないので、
dx = fabs(dx);とかかけてください

2.downが2個ある?
なんかif文にrightが無くてdownが2個あります。

今回アドバイスしてるのは「描画順」なので、描画位置がおかしいのはまた別の問題になります。


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

Name: クロウ  ..中級者(9,973ポイント)   Date: 2009/07/10(金) 02:05   No:36552     
Title: Re:クォータービューの描画順位    
「移動している最中を描画しても描画順がずれない方法」を質問していたのに質問の内容がずれていました申し訳ありません。

直してみましたが、やはり断続的に描画されてしまいます。
おそらく、cx,cyだけだと断続的にしか描画しないので、dx,dyで移動中の描画位置を補正しているのだと思いますが、途中までは移動してくれています。しかし、cx,cyがx2,y2に切り替わった瞬間、それ以降は無視されて移動先の座標に飛んでしまっています。
dx,dyを切り替わった瞬間には切り替わる瞬間の一フレーム前の座標を考慮して
dx = abs(x2 - x1) - dx;
dy = abs(y2 - y1) - dy;
となるようにしてみましたが、やはり切り替わった瞬間に移動先の座標に飛んでいき、うまくいきませんでした。


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

Name: ねこ  ..上級者(24,803ポイント)   Date: 2009/07/10(金) 09:35   No:36555     
Title: Re:クォータービューの描画順位    
>クロウさん
えっと、まずdx,dy,dz,cx,cy,czは「描画順のため」に求めているという認識を気持ち多めに持って下さい。
そのまま併用してもいいのですが、座標の逆補正が必要になるため「描画は別」という感じで。

問題点は恐らく

charaDrawMain( px + dx * 32 , py - dy * 16 -48 , cz -1 , player , ch[player].type);

この赤文字の変数が「描画順のため」に求めた値であって、描画時に使っちゃいけません。

px,pyは現在座標に現在移動量を加算した座標が入っているのではないのでしょうか?

最初の投稿内容にあった

charaDrawMain(px , py -48 , mapData.fieldHigh[y][x] -1 , i , ch[i].type );//プレイヤーを描画

この処理で「描画順以外」は正常に描画されていたのならこれで良いのだと思いますが、
描画関数の先が分からないのでこれ以上はこちらも分からないですね。


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

Name: クロウ  ..中級者(10,049ポイント)   Date: 2009/07/10(金) 10:56   No:36561     
Title: Re:クォータービューの描画順位    
ねこさん>
うまく伝わっていなかったようですみません。
最初の投稿内容の時点ではpx,pyは
px = hx-(y*32)+(x*32) + scroll_X(99);
py = hy+(y*16)+(x*16) + scroll_Y(99/*適当な値を入れている*/);
キャラの描画座標というよりは「画面内のマップチップの描画位置」であって、px,pyの中のx,yはfor文の変数そのままで、これ自体には移動中の座標が入っていないわけです。

scroll_X,scroll_Yはチップもプレイヤーもまとめて画面内をスクロールさせていますので、ほぼ移動中の座標とは関係がありません。。

charaDrawMain(px , py -48 , mapData.fieldHigh[y][x] -1 , i , ch[i].type );//プレイヤーを描画
の中身はいろんな場合のエフェクト処理が詰まっているんですが、基本的には

受け取った値をプレイヤー画像の描画として

DrawGraph( px , py - (mapData.fieldHigh[y][x] - 1)*16 , /*プレイヤー画像*/ , TRUE);
//mapData.fieldHigh[y][x] -1としているのはマップチップを一段のみ積んだ状態がマップデータ上では1であるためマップチップ描画ではこの場合2段積まれてしまうためです。

にそのまま移しているだけとなっています。

この状態では「移動前、移動後のみを描画する状態での正しい描画順」で描画されていまして、
「移動中も含めた場合、つまり
charaDrawMain( px + dx * 32 , py - dy * 16 -48 , cz -1 , player , ch[player].type);
のような状態で描画すると、右下方向と左下方向に進むとき、キャラクターの下半身ががマップチップの下に隠れてしまう」という状態となっています。




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

Name: ねこ  ..プログラマー(25,318ポイント)   Date: 2009/07/10(金) 11:21   No:36565     
Title: Re:クォータービューの描画順位    
なるほどpx,pyがマップ位置で、後ろの加算が移動量って事ですね。

現状のバグというのはdx等は移動間0.0⇒1.0と変化していくため
0.0〜0.5(移動元状態)の間はpx,pyが正常なのですが、
0.5〜1.0(移動先状態)の間はpx,pyが移動先を基準としたマップ位置になっています。
そのため、移動先マップから移動量を加算した位置にずれて描画されているわけです。


if( dx < 0.5 && dy < 0.5 )
charaDrawMain( px + dx * 32 , py - dy * 16 - 48 , cz -1 , player , ch[player].type);
else
charaDrawMain( px - ( 1.0 - dx ) * 32 , py + ( 1.0 - dy ) * 16 -48 , cz -1 , player , ch[player].type);


上記のように変えてみてください。ひとまず移動中に突然ワープするような感じにはならないはずです。


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

Name: クロウ  ..中級者(10,098ポイント)   Date: 2009/07/10(金) 23:37   No:36604 解決!     
Title: Re:クォータービューの描画順位    
ねこさん>
とりあえず、突然ワープする感じにはならなくなりました。
まだ描画位置がおかしい等のバグはありますが、これは自力で対処できそうです。

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


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



Name: ER  ..ぴよぴよ(71ポイント)   Date: 2009/07/10(金) 22:53   No:36598       
Title: RyuJin.exeについて    
Debugフォルダの中にRyuJin.exeっていうファイルがありますよね?それを実行するにはどうしたらいいでしょうか?
普通に実行しても「read error」となってうまく実行できません。
どこかやり方がまちがっているのでしょうか・・・

分かる人がいらっしゃいましたら、どうか教えてください。 お願いします。


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


Name: ねこ  ..プログラマー(25,470ポイント)   Date: 2009/07/10(金) 23:05   No:36601     
Title: Re:RyuJin.exeについて    
exeファイルをslnファイルと同じ場所にコピーして実行して見てください。

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



Name: ドリアン  ..ぴよぴよ(194ポイント)   Date: 2009/07/10(金) 15:12   No:36576       
Title: 無題    
質問です。
最近C言語を始めたのですが取りあえず実行してみようと思い、

#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( DxLib_Init() == -1 ) return -1;


WaitKey() ;
DxLib_End() ;
return 0 ;
}

を実行してみたのですが、ウィンドウモードにならずに全画面表示になってしまいます。

因みにVistaの64Bit版でエディタはメモ帳を使っています。


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


Name: ねこ  ..プログラマー(25,384ポイント)   Date: 2009/07/10(金) 15:17   No:36577     
Title: Re:無題    
DXLIBはデフォルトでフルスクリーン起動します。

ウィンドウモードで起動したい場合は「ChangeWindowMode( TRUE );」を
「if( DxLib_Init() == -1 ) return -1; 」の上に追加します。

このあたりがよく分からない時はDXLIB本家のリファレンス等見てみると色々分かると思います。


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

Name: ドリアン  ..ぴよぴよ(154ポイント)   Date: 2009/07/10(金) 22:16   No:36594 解決!     
Title: Re:無題    
迅速な回答ありがとうございます。
これからも何かあったら質問させてもらうかと思いますが
よろしくお願いします。


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



Name: s-rush  ..熟練のプログラマー(52,193ポイント)   Date: 2009/07/09(木) 15:53   No:36502       
Title: 複数回定義のシンボル    
いつもお世話になっています。

龍神録プログラミング 5章”宣言の仕方を工夫しよう”を参考に、
今制作中のゲームの宣言・定義のあたりを見やすく改良しました。

まだ、

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

のようなifdefの使い方が分かっていなかったので、
エラーがとんでもない数(300以上)出てしまいました^^;

自力でエラー数を4まで減らすことができたのですが、残りのエラーがどうしても消えません。
GV.h内でのincludeのタイミングに問題があるのかな?って思い、
その周りを調べている途中です。

ですが、原因がわかりません。
どうかお力をお貸しください。


エラー内容
1>get_time.obj : error LNK2005: "struct ST_WORD * word_table" (?word_table@@3PAUST_WORD@@A) は既に main.obj で定義されています。
1>graph_input_name.obj : error LNK2005: "struct ST_WORD * word_table" (?word_table@@3PAUST_WORD@@A) は既に main.obj で定義されています。
1>input_name_calc.obj : error LNK2005: "struct ST_WORD * word_table" (?word_table@@3PAUST_WORD@@A) は既に main.obj で定義されています。
1>C:\Documents and Settings\kida\My Documents\Visual Studio 2008\Projects\pokemon1\Debug\pokemon1.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。


開発環境
VC++ 2008 EE
DXライブラリ使用
OS: XP及びVista

ソースのみ添付しておきますのでよろしくお願いします。


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


Name: ねこ  ..上級者(24,352ポイント)   Date: 2009/07/09(木) 16:08   No:36507     
Title: Re:複数回定義のシンボル    
どこかでword_table.hを重複してincludeしてます。
word_table.hファイルの一番上に「#pragma once」と入れると解決するかも。


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

Name: s-rush  ..熟練のプログラマー(52,238ポイント)   Date: 2009/07/09(木) 16:16   No:36511     
Title: Re:複数回定義のシンボル    
>>ねこさん
#pragma onceをword_table.hの一番上に入れてみましたが、
変化がありませんでした。


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

Name: 御津凪 [URL]  ..ハッカー(101,628ポイント)   Date: 2009/07/09(木) 16:27   No:36512     
Title: Re:複数回定義のシンボル    
Ctrl + Shift + F (編集->検索と置換->フォルダを指定して選択)で、
word_table を検索(検索対象は ソリューション全体 で)してみてください。

もしかしたらどこかで同じ定義をしているかもしれません。


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

Name: ねこ  ..上級者(24,114ポイント)   Date: 2009/07/09(木) 17:04   No:36517     
Title: Re:複数回定義のシンボル    
あーすいません。「#pragma once」じゃ駄目ですね。
word_table.hの中をこう書き換えてみてください

#ifdef GLOBAL_INSTANCE
// ※今ある定義
#else
extern ST_WORD word_table[77];
#endif

externでも配列の中を宣言時に設定してるのでエラーでてます。


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

Name: やそ  ..比類無きプログラマー(94,336ポイント)   Date: 2009/07/09(木) 17:42   No:36521     
Title: Re:複数回定義のシンボル    
できれば、ちゃんと検索をかけて、重複している定義をみつけて、
直したほうがいいですよ^^


Name: s-rush  ..熟練のプログラマー(52,357ポイント)   Date: 2009/07/09(木) 21:00   No:36537     
Title: Re:複数回定義のシンボル    
>>御津凪さん
>>やそさん
一応ソリューション全体で検索はかけています。
(はじめに書いておくべきでした^^;)
ですが、重複らしき箇所が見つかりませんでした。
キーワードとしては”ST_WORD””word_table””word_table.h”
の3つを試しました。

>>ねこさん
今はプログラムができる環境下ではないので、明日試して見ます。


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

Name: 御津凪 [URL]  ..ハッカー(102,744ポイント)   Date: 2009/07/09(木) 21:50   No:36543     
Title: Re:複数回定義のシンボル    
添付ファイルの中身を見てなかったので上のことを書いていましたが、
中身を見てみたところ、 extern 指定しながらの定義となっていますね。
#ifdef GLOBAL_INSTANCE

#include "word_table.h"
#else
GLOBAL ST_WORD word_table[77];
#endif



と色つきの部分で囲んでみてください。これで通るはずです。


あるいは、word_table.h の中身を、
GLOBAL ST_WORD word_table[77]

#ifdef GLOBAL_INSTANCE
={

//1行目
/* --中略-- */
{-1, -1, "", "", ""}
}
#endif
;



としてもいけます。(見た目悪いですが)


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

Name: s-rush  ..熟練のプログラマー(52,520ポイント)   Date: 2009/07/10(金) 19:55   No:36583     
Title: Re:複数回定義のシンボル    
>>御津凪さん
#ifdef GLOBAL_INSTANCE
#include "word_table.h"
#else
GLOBAL ST_WORD word_table[77];
#endif
を書き込むことで解決しました。

ところで、
>extern 指定しながらの定義となっていますね
というのはどういうことなのでしょうか??
これが二重に定義されているということなんですか?


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

Name: 御津凪 [URL]  ..ハッカー(102,868ポイント)   Date: 2009/07/10(金) 20:27   No:36585     
Title: Re:複数回定義のシンボル    
extern を指定するのは、「外部へ公開する」ことに関する設定を行うものです。

例を挙げると、

extern int gIntData;

とするだけの場合、その値が存在するという宣言だけで実体は無いため、
コンパイルは成功しますがリンクエラーとなります。

extern int gIntData = 10;

と、初期値を代入すると、実体が存在してしまうので、
(他のヘッダなどから複数コンパイルされなければ)問題なくリンクできます。

今回の場合、extern と共に配列を定義しているので、各コンパイル時に同じ名前の実体が存在してしまい、
エラーとなっています。


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

Name: s-rush  ..熟練のプログラマー(52,619ポイント)   Date: 2009/07/10(金) 22:14   No:36593 解決!     
Title: Re:複数回定義のシンボル    
なるほど。
つまり、externをしておきながら初期値を設定していて、
かつほかのヘッダでも読み込んでいるため複数定義となっている・・・

という感じですかね。


なんとなくわかりました。
ありがとうございます。


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



Name: さとり  ..ぴよぴよ(243ポイント)   Date: 2009/07/10(金) 21:24   No:36588       
Title: 無題    
vistaを使ってるのですが、最近急に新規作成とファイル保存ができなくなってしまいました。
ファイルを開くコトはできるのですが。
再インストールしても直らないです。
どのようなことが考えられるのでしょうか


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


Name: 御津凪 [URL]  ..ハッカー(102,988ポイント)   Date: 2009/07/10(金) 21:43   No:36590     
Title: Re:無題    
Vista なら、UAC(ユーザーアカウント制御)が原因ではないでしょうか。
保護のかかっている場所にはソフトが上位権限を持たないと保存ができないので。
(あとプログラムによってはUACを切るように推薦しているものもあります)

なので、 UAC を切るか、正しい場所に保存するようにしてみてください。


そうでないのなら、もう少し詳しい情報をお願いします。
(どのようなことをしてどんなエラーがおきたのかなど、より具体的に)


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



Name: LUNA  ..入門者(3,480ポイント)   Date: 2009/07/09(木) 15:52   No:36501       
Title: 箱型のポリゴンの反射    
月曜日に出された勉強会の宿題で箱型のポリゴンの当たり判定を作れといわれ、作ってみたのですが、隅の当たり判定がおかしく、提出したら先生に「おまえプログラマーにすら向いていない」と勉強会のクビを宣言されてしまいました。
直そうとはしてみたのですが正直、四辺それぞれの当たり判定をどう考えればいいのか混乱してきてしまいます。だれかヒントをください。
プログラムの内容は

・正方形のポリゴンが2つある。
・ひとつは自分で操作でき、もうひとつは勝手に移動する。
・勝手に移動するポリゴンのほうは画面隅もしく自分の操作するポリゴンに接触すると反射する。

です。

先生から届いたメールには、

「すり抜けることが時々あるみたいですが・・・
これで、「完成」と言えるのでしょうか?
このソースを自信を持って「完成」と言うのであれば、あなたはプログラマーに向いていません。
ゲームプログラマーは細かいバグですら許されません。
私の個人的な意見ですが、プログラムを見る限り、プログラミングのセンスを感じません。
まずは自分が記述したプログラムの意味をしっかり理解してください。
プログラムの意味を理解していれば、次のようなコードは記述しないと思います。

if(Blockswitch==false){
Block.center.x += 3;
}else if(Blockswitch==true){
Block.center.x -= 3;
}

このままではゲームプログラマーどころか、プログラマーさえなれないと思います。」

と、書かれていました。やっぱりプログラムは頭のいい人間にしか触れない高貴なものなんですかね・・・
自分に対する自身が無くなってきました・・・


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


Name: LUNA  ..入門者(3,534ポイント)   Date: 2009/07/09(木) 15:53   No:36503     
Title: Re:箱型のポリゴンの反射    
すみません書き忘れました
「このプログラムはDirectXを使用しています。」


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

Name: dic  ..プログラマー(27,527ポイント)   Date: 2009/07/09(木) 16:29   No:36513     
Title: Re:箱型のポリゴンの反射    
物理的計算は3Dなんで私にはわかりませんのでなんとも言えないですが

先生のセンスとは何なのか考える必要があると思いますのですが、私が言えることといえば
ハンガリアン記法を利用するという手があります
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95
変数に規則性がなかったので、読みにくかったです

次に
LPDIRECT3DDEVICE9 d = g_pd3ddev; // 変数名を簡略化
とありますが、これは片方の参照が無効になった場合、残りの片方はまだ、その無効になった
領域を指してるというバグの温室になりやすいです

次に
void InitTLVer(POBJ2D obj)
void SetTLVerPos(POBJ2D obj)
void SetTLVerColor(LPTLVERTEX v , D3DCOLOR c, int point)
の関数に関してですが、ポインタを渡してないので、コピーをただ上書きしてるだけです
動いているとしたら、たまたまだと思われます

私も専門学校に行きプログラムの勉強をしてましたが、同じことを言われました
しかし、卒業後も独学にて、ゆっくりではありますが製作しています
というより、これ以上、その先生からは何も得られなかったので学校に行きませんでしたがw

先生を変えるという手段も LUNAさんにはあるので、自分に合った先生を選ばれることを
した方がいいです


すり抜けるという現象は
http://www.play21.jp/board/formz.cgi?action=res&resno=36272&page=&lognum=&id=dixq&rln=36294
を参考にされるといいです


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

Name: ねこ  ..上級者(24,034ポイント)   Date: 2009/07/09(木) 16:48   No:36514     
Title: Re:箱型のポリゴンの反射    
とりあえず言葉の解釈としては

<すり抜けることが時々あるみたいですが・・・ これで、「完成」と言えるのでしょうか?
<ゲームプログラマーは細かいバグですら許されません。
これに対して
<このソースを自信を持って「完成」と言うのであれば、あなたはプログラマーに向いていません。
こういう言葉を発してるわけですが

向いてるかどうかはおいといて、バグを残したまま完成とするのはまず許されません。
この場合の「プログラマー」を会社等に勤めて居る人として解釈するなら
バグの起こるプログラムをお客様に提出する事になります。
お客様は何百万というお金を払ってプログラムを求められるわけなので
それだけ大金を払って動かない・よく落ちるプログラムを渡されたら、その時点で信頼を失います。
ゲームだって、7,8000円出して買ったゲームソフトが頻繁にフリーズなんてしたらその会社の製品を次に買う気起こらないでしょう?
そういう意味で、バグってのはプログラマにとって潰しきらなくてはならない怨敵なのです。

それを残したまま「完成!」と言ってしまえばきつい言葉を頂いても仕方ないです。
ただ直らない事でもないしもうちょっと言葉選べよ、とは思いますねw

<やっぱりプログラムは頭のいい人間にしか触れない高貴なものなんですかね・・・
これ言うときっともっと怒られますよw
プログラムは言語の基礎からアルゴリズム、システム設計と様々な要素の集合体です。
そんな簡単に扱えるもんでもないですし、多くのプログラマは相応の努力を「年単位」で積んでいます。
「頭のいい人間」ってのは「それだけの努力をした人」なのであって、人より基礎能力が優れてるわけではありません。


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

Name: 御津凪 [URL]  ..ハッカー(102,206ポイント)   Date: 2009/07/09(木) 16:51   No:36515     
Title: Re:箱型のポリゴンの反射    
私からはひとまずメールの文面に記載されているソースについて言及します。


真偽値はご存知ですか?
true(真)と false(偽)しかない型に対し、ソースに書かれているような双方の条件を書くのは無意味です。
このコードでも動作はしますが、大体のプログラマは(構文・型などの意味を理解していれば)この文を、
    if(!Blockswitch){

Block.center.x += 3;
}else{
Block.center.x -= 3;
}


のようにするか、あるいは、
    Block.center.x -= Blockswitch ? 3 : -3;



と書きます。
そのほうが見た目にもすっきりします。


先生は、

> 私の個人的な意見ですが、プログラムを見る限り、プログラミングのセンスを感じません。

は、このような実行上(と見た目に)無意味なコードがあることと、
読みやすさについて言っていると考えられます。
もちろん、「私の個人的な意見」と書いているので、気にしない方がいるということも覚えておいてください。
(一般的にはより見やすいほうが相手から好感が持てます)
それと、この発言はインデントについても考慮しているかもしれません。
(インデントがところどころおかしいので)


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

Name: TRUTH  ..ぴよぴよ(47ポイント)   Date: 2009/07/09(木) 17:08   No:36518     
Title: Re:箱型のポリゴンの反射    
はじめましてー初カキコだったりもしますw
独学ではありますが、プログラミングの勉強をしています。
まだ未熟者ですが、最近プログラミングとは何かというのが少しずつ分かってきた気がしています。


こんな自分ですので技術的なアドバイスはできませんが・・・
気になったことを少々・・・
その先生の「プログラミングのセンス」とは、たぶん

if(条件)
//真
else
//偽


なのだから


if(Blockswitch)
Block.center.x -= 3;
else
Block.center.x += 3;

にすること、これが「プログラミングのセンス」だと言っている様に聞こえます。

個人的な意見ですが、このような部分でプログラミングのセンス?を問われるとは思っていません。
自分も似たような感じの分かりにくい書き方をした経験があります。
でも、他の人のコードなどを読んでいくうちに、「こっちの書き方の方が綺麗で理解しやすい」という風にマネを重ねて
徐々に綺麗に見えるようなコードを書けるよう努力しているつもりです。

いろいろな方が仰るように・・・コードを読んで、書いて、理解して
これを積み重ねが、その人の知的財産となっていき、プログラムが書けるようになるんだと思います。
ですから、頭の良い悪い・センスあるなしではないと思います。
その先生の仰ったことを気にせず、どんどんコードを読んで・書いて・理解していけばいいのではないでしょうか?


学ぶとはマネる事もいいますので、いろんな方のいい部分をマネて自分の物にしていくのが近道だと思いますよ



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

Name: Mist  ..熟練のプログラマー(65,626ポイント)   Date: 2009/07/09(木) 17:15   No:36519     
Title: Re:箱型のポリゴンの反射    
> (インデントがところどころおかしいので)

インデントがおかしいのはここの掲示板の仕様だと思いますよ。
ここの掲示板タブ幅が8なんですよね。
テキストエディタで、タブ幅4にして表示するときれいに表示されます。
LUNAさんの環境もタブ幅4なんじゃないでしょうか。


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

Name: LUNA  ..入門者(3,989ポイント)   Date: 2009/07/09(木) 17:56   No:36523     
Title: Re:箱型のポリゴンの反射    
皆さん色々なご意見ありがとうございます。
同じプログラムを組み、きれいに動いた人の話を利いたところ、
D3DXVECTOR2 で変数を指定し、 DirectX の標準関数 atan2を使用した計算法を使えばいいと聞きました。
ちょっと図解しないとわかりにくい方法なんで詳しい記述を省きますが、一度その方法で試してみようと思います。

>先生を変えるという手段も LUNAさんにはあるので、自分に合った先生を選ばれることを
した方がいいです

についてですが、ちょっとそれはムリですねww(この勉強会はその先生しかいない的な意味で)

>次に
LPDIRECT3DDEVICE9 d = g_pd3ddev; // 変数名を簡略化
とありますが、これは片方の参照が無効になった場合、残りの片方はまだ、その無効になった
領域を指してるというバグの温室になりやすいです

次に
void InitTLVer(POBJ2D obj)
void SetTLVerPos(POBJ2D obj)
void SetTLVerColor(LPTLVERTEX v , D3DCOLOR c, int point)
の関数に関してですが、ポインタを渡してないので、コピーをただ上書きしてるだけです
動いているとしたら、たまたまだと思われます


その部分についてはもともとこのプログラム自身先生がある程度作ったものを加工して提出しろというものでしたから私にはよくわかりませんでした。
私がいじった部分が
void GameUpdate()
の関数のさらに一部分だけでしたし。





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

Name: LUNA  ..入門者(4,118ポイント)   Date: 2009/07/09(木) 19:51   No:36534     
Title: Re:箱型のポリゴンの反射    
ちょっと当たり判定の方法を変えてみました
それぞれのポリゴンの中心の基点に当たっている間角度を求めてその角度によって反射方向を調整するというものです。が、なぜか反射がおかしく、(何度見直しても反射条件に不審な点がない)コンソールを起動して角度を確認してもおかしな点が見当たりません。
正直完全に詰んでしまったので誰かヒントをくださいお願いします。


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

Name: ねこ  ..上級者(24,399ポイント)   Date: 2009/07/09(木) 20:38   No:36536     
Title: Re:箱型のポリゴンの反射    
(a>= -45)これが(a<= -45)なんじゃない?

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

Name: LUNA  ..入門者(4,180ポイント)   Date: 2009/07/10(金) 10:09   No:36557     
Title: Re:箱型のポリゴンの反射    
> (a>= -45)これが(a<= -45)なんじゃない?

この修正で右の辺の当たり判定はしっかりしましたが、残りの3辺の当たり判定がおかしいです・・・
なぜか直しても直しても左右のどちらかの辺しかまともな動作をしてくれません・・・


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

Name: ねこ  ..上級者(24,840ポイント)   Date: 2009/07/10(金) 10:30   No:36558     
Title: Re:箱型のポリゴンの反射    
あ〜僕もすっかり見落としてたわ。

「比較はaじゃなくてrad」
ついでにいうとradはラジアン値の事なので変数名としてはdeg(度)が分かりやすいかも。


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

Name: LUNA  ..入門者(4,189ポイント)   Date: 2009/07/10(金) 14:51   No:36575 解決!     
Title: Re:箱型のポリゴンの反射    
うほっ!
本当だ・・・
radじゃなくaで比較してたからダメだったのか・・・・
本当にダメだな俺・・・
昨日の夜を無駄にしてしまった・・・・

ともかく ねこ さん 指摘ありがとうございます。


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



Name: あ〜る  ..中級者(10,303ポイント)   Date: 2009/07/07(火) 23:29   No:36420       
Title: ぐにゃぐにゃレーザー    
こんばんは
東方妖々夢でメルランやレティが使ってくるような、クネクネ曲がるレーザーを実装したいのですが、どうすれば滑らかに曲がるのか、また当たり判定をどうすればいいのかが全くわからないです。
まだプログラム前のフローチャートのような段階なので、自分ではプログラムを全く考えていないので、実際のソースは提示して頂かなくていいのですが(して頂ければ嬉しいですが)考え方、ヒントだけでも教えて下さい
また、今テスト期間でパソ禁してるのでスクリーンショットが貼れずすいません…
環境はBCC、WindowsXPです
よろしくお願いします


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


Name: ねこ  ..上級者(21,839ポイント)   Date: 2009/07/07(火) 23:43   No:36422     
Title: Re:無題    
複雑な形状は難しいですが、単調な画像なら曲線の場合いくつも弾を並べて長方形を並べて書きます。

□□□□□□□□□□□□□□

↑みたいにしておいて□の中心座標がカーブしていく軌跡の座標をなぞります。
分割数が多いと画像を回転させるだけである程度ごまかせますが、
厳密には途切れたり突き出たりするのでDXLIBを使っているなら「DrawModiGraph」関数で厳密に長方形の点と点を紡ぐとより綺麗に見えます。


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

Name: ねこ  ..上級者(22,052ポイント)   Date: 2009/07/07(火) 23:51   No:36425     
Title: Re:無題    
連レスになりますが、そういえばDXLIBのサンプルにそれっぽいのがあったなぁと思ったので、パソ禁解けたら見てみると良いかもです〜

http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N24


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

Name: あ〜る  ..中級者(10,325ポイント)   Date: 2009/07/08(水) 23:17   No:36479     
Title: Re:ぐにゃぐにゃレーザー    
ありがとうございます!
今日テスト終わったんで早速見てみました
なんか考えるまでも無く全部書いてありますね…(-.-;)
ただ当たり判定は少し工夫……しなくても大丈夫そうかな?
とりあえず明日から合宿でまたパソコン触れなくなるんで、頑張ってコードを理解してみます
教えて頂きありがとうございました!


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

Name: LUNA  ..入門者(4,135ポイント)   Date: 2009/07/09(木) 19:52   No:36535     
Title: Re:ぐにゃぐにゃレーザー    
サインカーブ使えばいいんじゃない?

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



Name: 芳香剤  ..ぴよぴよ(380ポイント)   Date: 2009/07/08(水) 21:21   No:36472       
Title: 2次元配列について、質問です    
#include<stdio.h>
#define SIZE 10
int main(void)
{
    int a[SIZE+1][SIZE+1];

int i,j;

for(i=1;i<=SIZE;i++)
for(j=1;j<=SIZE;j++)
a[i][j]=(i-1)*10+j;

for(i=1;i<=SIZE;i++)
{
for(j=1;j<=SIZE;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;

}
                 ここに総和が出力される

[実行結果]             ↓

1   2   3   4   5   6   7   8   9  10  

11 12 13 14 15 16 17 18 19 20
(途中省略)
91 92 93 94 95 96 97 98 99 100


ここまできたのですが、この実行結果の2次元行列の各行ごとに、「10個の数値の総和」を
求めて記憶させ出力させたいのですが、出力の仕方がよく解りません。
ヒント教えてください。よろしくお願いします。
解り難かったらすいません。


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


Name: MNS  ..中級者(13,147ポイント)   Date: 2009/07/08(水) 21:26   No:36473     
Title: Re:2次元配列について、質問です    

#include<stdio.h>
#define SIZE 10
int main(void)
{

int a[SIZE+1][SIZE+1];
int i,j;

for(i=1;i<=SIZE;i++)
for(j=1;j<=SIZE;j++)
a[i][j]=(i-1)*10+j;

for(i=1;i<=SIZE;i++)
{
int total = 0;
for(j=1;j<=SIZE;j++)
{
total += a[i][j];
printf("%4d",a[i][j]);
}

printf(" 総和:%d",total);
printf("\n");
}
return 0;

}

こういうことでしょうか?


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

Name: conio [URL]  ..プログラマー(26,956ポイント)   Date: 2009/07/08(水) 22:04   No:36474     
Title: Re:2次元配列について、質問です    

実際に実行してみましたか?
明らかにおかしな表示になります。
上記の様な実行結果にはなりません。
------------------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10/n 11 12 13 14 15 16 17 18 19
20/n 21 22 23 24 25 26 27 28 29 30/n 31 32 33 34 35 36 37 38
39 40/n 41 42 43 44 45 46 47 48 49 50/n 51 52 53 54 55 56 57
58 59 60/n 61 62 63 64 65 66 67 68 69 70/n 71 72 73 74 75 76
77 78 79 80/n 81 82 83 84 85 86 87 88 89 90/n 91 92 93 94 95
96 97 98 99 100/n続行するには何かキーを押してください . . .
------------------------------------------------------------------------------

printf("/n");をprintf("\n");に変更してください。
そうすれば、下記のように期待通りの実行結果になります。
------------------------------------------
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100
続行するには何かキーを押してください . . .
------------------------------------------

そして、総和を表示したいのであれば、
int total[SIZE + 1] = {0};
というように配列を作っておき、
下記の赤字の処理を追加すれば完成します。

---------------------------------------------------------------------
for(i=1;i<=SIZE;i++){
for(j=1;j<=SIZE;j++){
a[i][j]=(i-1)*10+j;
//total に a[i][j]の値を足して行く
}
}

for(i=1;i<=SIZE;i++){
for(j=1;j<=SIZE;j++)
printf("%4d",a[i][j]);
//総和(total)を表示させる処理
printf("\n");
}
---------------------------------------------------------------------


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

Name: フリオ  ..プログラマー(30,306ポイント)   Date: 2009/07/08(水) 22:45   No:36477     
Title: Re:2次元配列について、質問です    
 
 配列に空きがあるのでそれを使ってみました。


#include <stdio.h>

#define SIZE 10

int main(void)
{
int a[SIZE+1][SIZE+1] = {0};
int i, j;

for(i = 1; i <= SIZE; ++ i){
for(j = 1; j <= SIZE; ++ j){
a[i][j] = (i - 1) * 10 + j;
a[i][0] += a[i][j];
a[0][j] += a[i][j];
a[0][0] += a[i][j];
}
}
for(i = 1; i <= SIZE; ++ i){
for(j = 1; j <= SIZE; ++ j) printf("%4d",a[i][j]);
printf(" %d\n", a[i][0]);
}
putchar('\n');
for(i = 1; i <= SIZE; ++ i) printf("%4d", a[0][i]);
printf(" %d\n", a[0][0]);
return 0;
}

 


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

Name: やそ  ..比類無きプログラマー(93,851ポイント)   Date: 2009/07/09(木) 10:52   No:36492     
Title: Re:2次元配列について、質問です    
printf("/n");
というのは多分バックスラッシュを入力したかったんじゃないでしょうか?

Windowsのコンパイラでは\nが常識になっていますが、
昔(?)のコンパイラではバックスラッシュ\n(もちろん半角で)
を用いていたものもあります。
昔の書籍でもバックスラッシュのソースを何度か見かけたことがあります。

まあそれでも通常の/ではダメですが^^;

各行ごとの総和は


int total;
total = 0;
for(i=1;i<=SIZE;i++)
{
for(j=1;j<=SIZE;j++)
printf("%4d",a[i][j]);
total+=a[i][j];
printf(" %4d\n", total);
total=0;
}


という感じですかね?


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

Name: やそ  ..比類無きプログラマー(93,890ポイント)   Date: 2009/07/09(木) 11:03   No:36493     
Title: Re:2次元配列について、質問です    
・・・配列の添え字を0から使わないのは何でだろう?
BASICとかで1からに慣れてるから?
数えやすいから?


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

Name: conio [URL]  ..プログラマー(27,203ポイント)   Date: 2009/07/09(木) 11:29   No:36495     
Title: Re:2次元配列について、質問です    

そうですね。
"明解C言語"と言った参考書でも、バックスラッシュ(逆斜線)が使われてました。
(「JISコードという文字体系では\に読み替えて下さい」、と注意書きがありました)

ただ、「printf("/n");でちゃんと実行結果が得られる所まで出来た」との事だったので、
下記の様な実行結果は得られないのでは?、と疑問に思いました。
------------------------------------------
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
//中略//
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100
続行するには何かキーを押してください . . .
------------------------------------------

恐らく、投稿する際に一部修正したか、
コピーペーストではなく、元のソースプログラムを見ながら打ち込んだのかな、と。


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

Name: やそ  ..比類無きプログラマー(93,937ポイント)   Date: 2009/07/09(木) 11:57   No:36496     
Title: Re:2次元配列について、質問です    
>下記の様な実行結果は得られないのでは?、と疑問に思いました。
同意^^

たしかにあのままのソースをコンパイルではちょっと・・・
ですよね。

使用環境、コンパイラについての明記もなさそうですしねぇ^^;



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

Name: 芳香剤  ..ぴよぴよ(542ポイント)   Date: 2009/07/09(木) 19:36   No:36531 解決!     
Title: Re:2次元配列について、質問です    
返信が遅れてしまいました。すいません。
ご指摘ありがとうございます。
修正を加えながら投稿したせいか、打ち間違えてしまいました。
コンパイルする癖を身につけたほうがいいですね、やっぱり…

>添え字を0から使わないのはなぜか
私的には、「1」からの方がわかりやすいので「0」からではなく
「1」からにしています。

皆さんのアドバイスのおかげで、コンパイルすることができました。
とても勉強になり、助かりました。あと、間違えたとこは直しておきます。
どうもありがとうございました^^


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



Name: チルチル  ..プログラマー(28,128ポイント)   Date: 2009/07/08(水) 19:05   No:36467       
Title: 描画間隔について    
東方とかだと描画間隔の変更ができるようなんですが

この場合の「描画間隔」とはどういう意味なんでしょうか?

私が思い付くのは移動処理などの関数と描画処理の関数に別れていて
通常は両方とも毎フレーム実行するけど、描画間隔を2分の1とか3分の1にすると
描画関数と画面更新とFPS処理(ゲームプログラミングの館fps,wait_fanc関数など)の方は
2周に1回とか3周に1回だけ実行する事ですが

毎フレーム、ウェイトをかけないと実行速度が上がってしまうし
ゲームプログラミングの館のコードを使用させていただいてるので
FPSも実行しないとうまく動かないんですよね・・

描画はしていないけど描画回数にはカウントした方が良いのでしょうか・・?


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


Name: dic  ..プログラマー(27,646ポイント)   Date: 2009/07/08(水) 23:27   No:36480     
Title: Re:描画間隔について    
管理人さんのサンプルを見てませんので、私なりの回答になりますが
以下のソースのようなことではないでしょうか?


#include <stdio.h>

void hoge(int i)
{
static bool b = true;

if( b )
printf( "%d\n", i );

if( b ) b = false;
else b = true;
}
void main()
{
int i;
for( i=0; i<10; i++ )
hoge(i);
}



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

Name: チルチル  ..プログラマー(28,301ポイント)   Date: 2009/07/09(木) 01:06   No:36485     
Title: Re:描画間隔について    
見たところ呼ばれるたびに実効、非実行が切り替わる見たいですね
う〜んちょっと違いますね・・

具体的に言うと描画間隔を2分の1にした時に実行頻度を2分の1にしなくてはいけない処理は何かって事です

とりあえず描画処理と画面更新は2分の1にしないといけないと思うんですが
他にも2分の1にしなくてはいけない処理があるかどうかがよくわからないんです・・


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

Name: ねこ  ..上級者(24,083ポイント)   Date: 2009/07/09(木) 01:21   No:36486     
Title: Re:描画間隔について    

if( Time % 2 == 0 ) {
DrawFlg = true;
ClearDrawScreen();
} else {
DrawFlg = false;
}

// 計算処理処理

// 画面へ反映
ScreenFlip();


でいいんだと思うんだけど。
偶数フレームの時に描画して、奇数フレームの時は偶数フレームの表示に対してクリアもしないし描画もしない。
処理終了と共にディスプレイに偶数フレームの時と同じ画面を出力する。
こうすると描画は30FPS、処理は60FPSになる。

DrawFlgってのは各描画関数の頭でこのフラグが立って居たら関数を抜けるようにするためのフラグという認識で。


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

Name: チルチル  ..プログラマー(28,344ポイント)   Date: 2009/07/09(木) 01:29   No:36488     
Title: Re:描画間隔について    
あ〜なるほど

と言う事は描画処理と画面クリア処理だけをスキップすれば良いんでしょうか?


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

Name: 御津凪 [URL]  ..ハッカー(102,380ポイント)   Date: 2009/07/09(木) 16:57   No:36516     
Title: Re:描画間隔について    
> と言う事は描画処理と画面クリア処理だけをスキップすれば良いんでしょうか?

基本それで問題ないと思います。
ただ、スキップするということは、一切処理をしないということなので、
スキップする箇所(描画処理)に移動処理に影響する処理(乱数生成やカウンタなど)を入れると、
スキップした時としない時とで動作が変わってしまうので気をつけてください。
(普通は描画処理にそのようなコードは入らないので余り気にする点ではないかもしれませんが)


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

Name: チルチル  ..プログラマー(28,396ポイント)   Date: 2009/07/09(木) 18:51   No:36526 解決!     
Title: Re:描画間隔について    
よくわかりました
描画部分には余計な処理を入れないようにやってみます
どうもありがとうございました


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



Name: kokosan60  ..中級者(10,562ポイント)   Date: 2009/07/08(水) 15:26   No:36455       
Title: 簡易ペイント    
現在、簡易ペイントプログラムを作成しているのですが、
点、線、円、四角形を選択するときに、
1度選択して1回描画してしまったら再度選択しなければ
描画されません。
1度選択したらほかのものを選択するまでは描画可能にするには
どのようにすればいいのでしょうか。
ヒントのみでもかまいません。
よろしくお願いします。

環境
Windows XP SP3
Visual Studio 2005

プログラム

#include "dxLib.h"
#include <math.h>

#define N 20 /*メニュー縦*/
#define M 55 /*メニュー横*/
#define COLOR_TYPE 4 /*色の種類*/
#define MENU_TYPE 6 /*メニューの種類*/
#define COLOR_PLACE 121 /*カラー変更Y座標上*/

int string_color;/*文字列色*/
int menu_color;/*メニュー背景色*/
int menu_out_color;/*メニュー枠色*/
char *string[]={"点","線","円","四角形","クリア","終了"};/*メニュー文字列*/
int color_type[COLOR_TYPE]; /*色*/
int loop_flag=0; /*終了フラグ*/
int color=0; /*色番号*/
int menu; /*現在のメニュー番号*/


void menu_display();
void Color(int m_x,int m_y);
void Menu(int menu);
void square();
void circle();

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

int i;/*ループ変数*/
int m_x,m_y; /*終了時マウス座標*/

/*初期化*/
SetMainWindowText("簡易ペイント");
ChangeWindowMode(TRUE);
SetBackgroundColor(255,255,255);
if(DxLib_Init()==-1) return -1;
SetDrawScreen(DX_SCREEN_BACK);

/*色取得*/
string_color=GetColor(0,0,0);
menu_color =GetColor(127,127,127);
menu_out_color=GetColor(255,255,255);
color_type[0]=GetColor(0,0,0);
color_type[1]=GetColor(255,0,0);
color_type[2]=GetColor(0,255,0);
color_type[3]=GetColor(0,0,255);

while(ProcessMessage()==0){
while(1){
/*エラー*/
if(ProcessMessage()==-1){
DxLib_End();
exit(1);
}

menu_display();

if((GetMouseInput()&MOUSE_INPUT_LEFT)!=0){
/*マウス座標取得*/
GetMousePoint(&m_x,&m_y);

if(1<=m_x&&54>=m_x){

/*点*/
if(1<=m_y&&19>=m_y){
menu=0;
}

/*線*/
if(21<=m_y&&39>=m_y){
menu=1;
}

/*円*/
if(41<=m_y&&59>=m_y){
menu=2;
}

/*四角形*/
if(61<=m_y&&79>=m_y){
menu=3;
}

/*画面クリア*/
if(81<=m_y&&99>=m_y){
menu=4;
}

/*終了*/
if(101<=m_y&&119>=m_y){
menu=5;
}
if(120<=m_y&&199>=m_y){
menu=6;
Color(m_x,m_y);
}
if(menu!=6){
Menu(menu);
}

}
}
}

}

DxLib_End();
return 0;
}

/*メニュー表示関数*/
void menu_display(){
int i;
/*メニュー表示*/
for(i=0;i<MENU_TYPE;i++){
DrawBox(0,N*i,M,N*(i+1),menu_color,TRUE);
DrawBox(0,N*i,M,N*(i+1),menu_out_color,FALSE);
DrawString(2,N*i+2,string[i],string_color);
}

/*色表示*/
for(i=0;i<COLOR_TYPE;i++){
DrawBox(1,COLOR_PLACE+N*i,M-1,COLOR_PLACE+N*(i+1),color_type[i],TRUE);
}
ScreenFlip();
}

/*色変更関数*/
void Color(int m_x,int m_y){
/*黒*/
if(1<=m_x&&54>=m_x&&121<=m_y&&140>=m_y){
color=0;
}

/*赤*/
if(1<=m_x&&54>=m_x&&141<=m_y&&160>=m_y){
color=1;
}

/*緑*/
if(1<=m_x&&54>=m_x&&161<=m_y&&180>=m_y){
color=2;
}

/*青*/
if(1<=m_x&&54>=m_x&&181<=m_y&&2000>=m_y){
color=3;
}
}


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


Name: kokosan60  ..中級者(11,903ポイント)   Date: 2009/07/08(水) 15:27   No:36456     
Title: Re:簡易ペイント    
プログラム続き


void Menu(int menu){
int x1,x2,y1,y2; /*描画時マウス座標*/
switch(menu){
case 0:
do{
WaitKey();
/*左クリック中*/
while((GetMouseInput()&MOUSE_INPUT_LEFT)!=0){
GetMousePoint(&x1,&y1);
/*点描画*/
if(!(0<=x1&&55>=x1)){
DrawPixel(x1,y1,color_type[color]);
ScreenFlip();
}else{
Color(x1,y1);
}

}
}while(0<=x1&&55>=x1);
break;
case 1:
/*始点*/
do{
if((GetMouseInput()&MOUSE_INPUT_LEFT)!=0){
GetMousePoint(&x1,&y1);
}
if(0<=x1&&55>=x1) Color(x1,y1);
}while(0<=x1&&55>=x1);
WaitKey();
/*終点*/
do{
if((GetMouseInput()&MOUSE_INPUT_LEFT)!=0){
GetMousePoint(&x2,&y2);
}
if(0<=x1&&55>=x1) Color(x1,y1);
}while(0<=x2&&55>=x2);

/*線描画*/
DrawLine(x1,y1,x2,y2,color_type[color]);
ScreenFlip();
break;
case 2:
circle();
break;
case 3:
square();
break;
case 4:
DrawBox(55,0,641,481,menu_out_color,TRUE);
break;
case 5:
DxLib_End();
exit(0);
break;
default:
DxLib_End();
exit(1);
}
}

/*円描画関数*/
void circle(){
int x1,x2,y1,y2; /*描画時マウス座標*/
int c_x,c_y; /*中心座標*/
int r; /*半径*/
/*始点*/
do{
if((GetMouseInput()&MOUSE_INPUT_LEFT)!=0){
GetMousePoint(&x1,&y1);
}
if(0<=x1&&55>=x1) Color(x1,y1);
}while(0<=x1&&55>=x1);
WaitKey();
/*終点*/
do{
if((GetMouseInput()&MOUSE_INPUT_LEFT)!=0){
GetMousePoint(&x2,&y2);
}
if(0<=x1&&55>=x1) Color(x1,y1);
}while(0<=x2&&55>=x2);

/*中心、半径計算*/
c_x=(x1+x2)/2;
c_y=(y1+y2)/2;
r=(int)sqrt(pow((x1-x2),2.0)+pow((y1-y2),2.0))/2;

/*円描画*/
DrawCircle(c_x,c_y,r,color_type[color],FALSE);
DrawBox(0,0,55,480,menu_out_color,TRUE);
menu_display();
ScreenFlip();
}

/*四角形描画関数*/
void square(){
int x1,x2,y1,y2; /*描画時マウス座標*/
/*始点*/
do{
if((GetMouseInput()&MOUSE_INPUT_LEFT)!=0){
GetMousePoint(&x1,&y1);
}
if(0<=x1&&55>=x1) Color(x1,y1);
}while(0<=x1&&55>=x1);
WaitKey();
/*終点*/
do{
if((GetMouseInput()&MOUSE_INPUT_LEFT)!=0){
GetMousePoint(&x2,&y2);
}
if(0<=x1&&55>=x1) Color(x1,y1);
}while(0<=x2&&55>=x2);

/*四角形描画*/
DrawBox(x1,y1,x2,y2,color_type[color],FALSE);
ScreenFlip();
}


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

Name: MNS  ..中級者(12,984ポイント)   Date: 2009/07/08(水) 15:56   No:36458     
Title: Re:簡易ペイント    
プログラムの構造が悪いのだと思います。

 ⇒ユーザーが、x座標が1以上54以下の場所をクリック
 ⇒y座標によってmenuの値を決定
 ⇒menuの値によって条件分岐
 ⇒(例えば、点を選択した場合)ユーザーから入力を待つ
 ⇒マウスの位置が不正でなければ、点を描画
 ⇒ループを抜ける

このような構造になっているため、
ユーザーがx座標が1以上54以下の場所をクリックしない限り、
絵を描く処理が行われません。

基盤となるループの中に、また新たなループが作られているため、
(そもそも、ループの中にWaitKeyがあるのはどうなんでしょう)
プログラムの基盤となるループが活かされて無いと思います。

正直、このプログラムの構造でその問題を解決するのは難しいのではないのでしょうか。
一つのアプローチとして、

if(1<=m_x&&54>=m_x){

〜略〜

}
else if(menu >= 0 && menu <= 6) Menu(menu);



とやることでこの問題は回避可能かもしれませんが、
抜本的な解決とは成らないと思いますし、
いずれまた問題が生じるだろうと予測できるため、
プログラムの構造を見直すことをお勧めいたします。


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

Name: kokosan60  ..中級者(11,945ポイント)   Date: 2009/07/08(水) 16:12   No:36459 解決!     
Title: Re:簡易ペイント    
返信有難うございます。
確かにプログラムの構造自体が原因のようです。
最初からプログラムの構造を見直したいと思います。


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

Name: ねこ  ..上級者(23,485ポイント)   Date: 2009/07/08(水) 16:37   No:36460     
Title: Re:簡易ペイント    
何か書いてたら終わっちゃってた・・・一応張っておこう、ペタペタ



○ whileの外に追加
menu = 0;
int sts = 0;

typedef struct {
int type;
int x1;
int y1;
int x2;
int y2;
int r;
int color;
} DRAW_DATA;

DRAW_DATA g_ArrDrawData[ 200 ];
int g_iDrawCnt = 0;

BOOL g_bPrevMouse = FALSE;

======================================
=処理部分に追加
======================================
menu_display();

for( int ii = 0; ii < g_iDrawCnt; ii++ )
{
DRAW_DATA DrawData = g_ArrDrawData[ ii ];
switch( DrawData.type )
{
case 0: // 点
DrawPixel( DrawData.x1, DrawData.y1, DrawData.color );
break;
case 1: // 線
DrawLine( DrawData.x1, DrawData.y1, DrawData.x2, DrawData.y2, DrawData.color );
break;
}
}
// 線分の補助表示
if( menu == 1 && sts == 1 )
{
int x = 0; int y = 0;
GetMousePoint( &x, &y );
DrawLine( g_ArrDrawData[ g_iDrawCnt ].x1, g_ArrDrawData[ g_iDrawCnt ].y1, x, y, color_type[ color ] );
}

int Mouse = GetMouseInput() & MOUSE_INPUT_LEFT;
if( Mouse && g_bPrevMouse == 0 )
{
GetMousePoint( &m_x, &m_y );
if(1<=m_x&&54>=m_x)
{
/*点*/
if(1<=m_y&&19>=m_y){
menu=0;
}
/*線*/
if(21<=m_y&&39>=m_y){
menu=1;
}
/*円*/
if(41<=m_y&&59>=m_y){
menu=2;
}
/*四角形*/
if(61<=m_y&&79>=m_y){
menu=3;
}
/*画面クリア*/
if(81<=m_y&&99>=m_y){
menu=4;
}
/*終了*/
if(101<=m_y&&119>=m_y){
menu=5;
}
if(120<=m_y&&199>=m_y){
menu = 6;
Color(m_x,m_y);
}
/*
if( menu != 6 ){
Menu( menu );
}
*/
}
else
{
switch( menu )
{
case 0:
g_ArrDrawData[ g_iDrawCnt ].type = 0;
g_ArrDrawData[ g_iDrawCnt ].x1 = m_x;
g_ArrDrawData[ g_iDrawCnt ].y1 = m_y;
g_ArrDrawData[ g_iDrawCnt ].color= color_type[color];
g_iDrawCnt++;
break;
case 1:
if( sts == 0 )
{
g_ArrDrawData[ g_iDrawCnt ].type = 1;
g_ArrDrawData[ g_iDrawCnt ].x1 = m_x;
g_ArrDrawData[ g_iDrawCnt ].y1 = m_y;
sts = 1;
}
else
{
g_ArrDrawData[ g_iDrawCnt ].x2 = m_x;
g_ArrDrawData[ g_iDrawCnt ].y2 = m_y;
g_ArrDrawData[ g_iDrawCnt ].color= color_type[color];
g_iDrawCnt++;
sts = 0;
}
}
}
}
g_bPrevMouse = Mouse;

ScreenFlip();


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

Name: ねこ  ..上級者(23,610ポイント)   Date: 2009/07/08(水) 16:42   No:36461     
Title: Re:簡易ペイント    
スレッドには関係無いのですが、管理人様へ

添付のファイルサイズ上限ってあげれないのでしょうか。
DXLIB使ってるとデフォルトでコンパイルしても500KBくらいになるので、800〜1MBくらいまで許容されるとEXEも同梱出来てわかりやすいかなぁと思うのですが、どうでしょう?


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

Name: DVDM [URL]  ..ぴよぴよ(720ポイント)   Date: 2009/07/08(水) 17:11   No:36462     
Title: Re:簡易ペイント    
>>ねこさん
1MBくらいなら登録制(無料)ですがこちらは如何でしょう。
http://www.uploader.jp/ は長期間保存で15MBまでならアップロードできます。


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

Name: ねこ  ..上級者(23,742ポイント)   Date: 2009/07/08(水) 18:58   No:36466     
Title: Re:簡易ペイント    
>DVDM様
おお、わざわざありがとうございます。

ロダはそのうち消えるもんかと思ってました。よく調べ物で添付は消えてるパターン多かったので^^;
実行ファイルあたりはロダ推奨って認識が普通なんでしょうか。
掲示板側が無理でしたら是非使わせてもらいます〜。


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

Name: DVDM [URL]  ..ぴよぴよ(909ポイント)   Date: 2009/07/09(木) 02:11   No:36489     
Title: Re:簡易ペイント    
>>ねこさん
>実行ファイルあたりはロダ推奨って認識が普通なんでしょうか。
良く使われているのは、一時的にファイルが上げられる場所を提供して頂けるからではないでしょうか。
パスワード等の設定や容量的な問題もクリアできるサーバーがあるため使いやすいのではいかなぁと思います。

ここの掲示板は添付ファイルが過去ログに行くと消える仕組みだったような気がします。
添付ファイルを残しておきたいのであれば、上記のような長期間保存に対応したアップローダをお使い頂くか
HPを作成してアップロードするなどがいいのではないでしょうか。
私はそうしています。


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

Name: ねこ  ..上級者(24,298ポイント)   Date: 2009/07/09(木) 12:59   No:36497     
Title: Re:簡易ペイント    
あ、過去ログいくと消えちゃうんですね^^;それじゃぁ駄目か。
折角添付機能があるのにな〜と思っての質問でした。

回答ありがとうございます。


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

Name: やそ  ..比類無きプログラマー(94,336ポイント)   Date: 2009/07/09(木) 14:44   No:36498     
Title: Re:簡易ペイント    
void Color(int m_x,int m_y)
について。

この関数で塗る色をセットしているようですが、戻り値がvoidって大丈夫?
かと思ったら、変数colorがグローバル変数だったのね^^;
余計な心配でした。

if(1<=m_x&&54>=m_x&&181<=m_y&&2000>=m_y){
は2000じゃなくて200じゃないですか?

座標判定のif文はもう少しスッキリ!できそうです。


void Color(int m_x,int m_y){

if(1<=m_x&&54>=m_x&&121<=m_y&&200>=m_y)/* 範囲に入っていれば */
color=(m_y - 121)/20; /* 0 - 3 を計算 */
}

とか?
【検証】
(121 -121)/20 ・・・  0/20 = 0
(140 -121)/20 ・・・ 19/20 = 0
(141 -121)/20 ・・・ 20/20 = 1
(160 -121)/20 ・・・ 39/20 = 1
(161 -121)/20 ・・・ 40/20 = 2
(180 -121)/20 ・・・ 59/20 = 2
(181 -121)/20 ・・・ 60/20 = 3
(200 -121)/20 ・・・ 79/20 = 3

という強引な計算式です。


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



Name: スター  ..ぴよぴよ(293ポイント)   Date: 2009/07/08(水) 11:24   No:36449       
Title: 構造体についての質問です。    
登録番号(int no)と名前(char *name)と年齢(int age)を含む構造体person型のポインタ変数を宣言し, 登録人数分だけの動的メモリ確保をせよ. そして, データをファイルから入力せよ. ファイルの形式は, 先頭に登録する人数とし, そのあとに人数分のデータを登録番号, 名前, 年齢の順に書いていく(下の例を参照. 登録番号は入力順に1,2,3,4,5, …とする. そして, 入力した全員データを表示せよと言う問題が出たのですが分からなくて困っています。

どなたか教えていただけないでしょうか?

(ファイルの例)
3
1 田中 20
2 大田 40
3 井上 35



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


Name: ねこ  ..上級者(22,708ポイント)   Date: 2009/07/08(水) 11:33   No:36450     
Title: Re:構造体についての質問です。    
このタイトルと内容だと構造体の定義方法が分からないのか、構造体の動的メモリ確保が分からないのか不明です。
それとも問題全体なのでしょうか?

1.構造体を定義する
2.ファイルの最初を読み、データ個数を取得する
3.構造体の配列をデータ個数分確保する
4.ファイルの続きをデータ個数分取得する
5.読み込んだ文字列情報を分割して構造体に格納する
6.構造体に格納した情報を表示する

ざっくり分けて全体の流れは1〜6のようになりますが、このうち分からないのはどこでしょう?
また、分かっている箇所のソースを貼り付けて頂けると以後の回答がスムーズに進むと思います。


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

Name: conio [URL]  ..プログラマー(26,454ポイント)   Date: 2009/07/08(水) 11:38   No:36451     
Title: Re:構造体についての質問です。    
具体的にどこまで出来ているか、
どこで詰まっているかを詳しくお願いします。
-----------------------------------------
@構造体が分からない
A動的確保の仕方が分からない
Bファイルからの入力の仕方が分からない
Cデータの表示のさせ方が分からない
-----------------------------------------
など。

プログラムの製作途中であれば、そのプログラムを載せた方が的確な指摘が得られるかと。

基本 丸投げは禁止なので、"全然分からない"というのであれば、
まず構造体(person)の宣言の仕方から確認されてはいかがでしょうか。


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

Name: Hermit  ..上級者(24,426ポイント)   Date: 2009/07/09(木) 00:16   No:36484     
Title: Re:構造体についての質問です。    
ちょっと作ってみました。

まずはデータファイルを作ります。
これはコンパイラによってはエラーになるかも。

#include <stdio.h>
int main(void)
{
int i = 3;
typedef struct {
int no;
char *name;
int age;
} person;
FILE *fp;
person data[] = {
{1,*(char **)"田中",20},{2,*(char **)"大田",40},{3,*(char **)"井上",35}
};

fp = fopen ("data","wb");
if (fp == NULL) exit(1);
fwrite( &i, sizeof (int), 1, fp);
fwrite( data, sizeof (person), 3, fp);
fclose(fp);
return 0;
}



で、次にメインのプログラムです。

#include <stdio.h>
#include <stdlib.h>
int main() {
typedef struct {
int no;
char *name;
int age;
} person;
int no;
int i;
person *data;
FILE *fp = fopen("data","rb");
if (fp == NULL) exit(1);
fread(&i, sizeof(int), 1, fp);
data = malloc(sizeof(person) * i);
if (data == NULL) exit(1);
fread(data, sizeof(person), i, fp);

for (no = 0; no < i;no++) {
printf("%d %.4s %d\n", data[no].no, &data[no].name, data[no].age);
}
fclose (fp);
return 0;
}



こんなもんでどうでしょう?

適当に作ったので、ファイルは、"data" というファイル限定です (^^;


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



Name: ユーリ  ..入門者(4,299ポイント)   Date: 2009/07/08(水) 02:10   No:36434       
Title: お願いします    

#include <stdio.h>

int main(void)
{
int y,m,d,ze;

printf("何年かを入力して下さい");
scanf("%d",&y);
printf("何月かを入力して下さい");
scanf( "%d",&m);
printf("何日かを入力して下さい");
scanf( "%d",&d);

ze=(y+(y/4)-(y/100)+(y/400)+(13*m+8)/5+d)%7;
printf("年=%d 月=年%d 日年=%d",y,m,d,ze);  
switch(ze){
case 0:
printf("日曜日\n");
break;
case 1:
printf("月曜日\n");
break;
case 2:
printf("火曜日\n");
break;
case 3:
printf("水曜日\n");
break;
case 4:
printf("木曜日\n");
break;
case 5:
printf("金曜日\n");
break;
case 6:
printf("土曜日\n");
break;

}

return 0;
}

ツェラーの公式をつかって何年の何月の何日が何曜日と表示するプログラムなんですが
うまくいきません。ご指導のほどお願いします。


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


Name: b  ..かけだし(1,410ポイント)   Date: 2009/07/08(水) 02:21   No:36436     
Title: Re:お願いします    
とりあえず、タイトルが「お願いします」はないんじゃないかな。

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

Name: Mr.AA  ..ぴよぴよ(2ポイント)   Date: 2009/07/08(水) 02:22   No:36437     
Title: Re:お願いします    
「質問です」とか「お願いします」とか、一覧見てもそれがどの質問が何の質問なのかわからない。
もう少し質問の内容に合った適切なタイトルをつけてください。


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

Name: フリオ  ..プログラマー(30,094ポイント)   Date: 2009/07/08(水) 07:15   No:36441     
Title: Re:お願いします    
 
 人に見せるソースは、インデントのつけ方を考えた方がいいです。
 "解決しました"だけでなく、どう解決したのか書いてほしいです。
 "うまくいきません"だけでなく、どう"うまくいかない"のか書いてほしいです。

 ツェラーの公式について調べなおしてみてはどうでしょうか。
 


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

Name: conio [URL]  ..プログラマー(26,252ポイント)   Date: 2009/07/08(水) 07:24   No:36442     
Title: Re:お願いします    

タイトル以外に、質問も良く分かりません。
「プログラムがうまく行きません」だと、何がどう上手くいかないのかが不明です。

こちら側で実行して、何を聞きたいのかを推測しないといけません。
場合によっては、見当違いの回答が返って来る可能性もありますよ。

--------------------------------------------
@エラーが出て、エラーの対処が分からない
A実行できるものの、意図した結果にならない
Bその他の問題が発生した
--------------------------------------------
上記のように具体的に述べたほうが良いと思います。
そして、preタグも使うべきです。


で、実行してみたんですが、セミコロンが全角、printf関数の後ろに全角の空白がありました。
恐らく、どこからかコピペしてそのまま実行したんじゃないですかね?
(自分も、試しに大学の講義の資料をコピペ・実行して失敗した事があります)

-------------------------------------------------------------------
int main(void)
{
int y,m,d,ze;
char* day[7] = {"日","月","火","水","木","金","土"};

printf("何年かを入力して下さい");scanf("%d",&y);
printf("何月かを入力して下さい");scanf( "%d",&m);
printf("何日かを入力して下さい");scanf( "%d",&d);

ze = (y+(y/4)-(y/100)+(y/400)+(13*m+8)/5+d)%7;
printf("%3d年%3d月%3d日は\n",y,m,d);
printf("%s曜日です。\n",day[ze]);

return 0;
}
-------------------------------------------------------------------
こんな感じでいいんじゃないでしょうか。
switch文が冗長になってしまっていたので、少し変更してあります。

【追記】
ユーリさんのプログラムはprintf関数のところもおかしいです。

--------------------------------------------------------------------
printf("年=%d 月=年%d 日年=%d",y,m,d,ze);
--------------------------------------------------------------------
最後のzeに対応する書式指定文字がありません。


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

Name: バグ  ..ハッカー(161,618ポイント)   Date: 2009/07/08(水) 08:30   No:36445     
Title: Re:お願いします    
ついでに私からもひとつ。
解決した場合も「解決しました。ありがとうございました」だけではなく、どこをどのように変更して解決したのかを書くべきです。
似たような事で困っている人の為にもなりますしね(o^-')b


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

Name: box  ..ハッカー(141,915ポイント)   Date: 2009/07/08(水) 20:09   No:36470     
Title: Re:お願いします    
>conioさん

printf文ではなくて、printf関数です。
正確な用語を使う方が、伝わりやすいと思います。


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

Name: conio  ..プログラマー(26,477ポイント)   Date: 2009/07/08(水) 20:41   No:36471     
Title: Re:お願いします    
指摘ありがとうございます。
直しておきました(_ _)


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

Name: ユーリ  ..入門者(4,336ポイント)   Date: 2009/07/09(木) 00:09   No:36483 解決!     
Title: Re:お願いします    
ありがとうございました。
スイッチ文の方で頑張ってみたらできました。
配列の方もチャレンジしてみます


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



Name: 北斗777  ..ぴよぴよ(34ポイント)   Date: 2009/07/07(火) 20:40   No:36393       
Title: プログラミングソフトのダウンロードについて    
Visual Studioは、どれをダウンロードすればいいですか?
よろしくお願いします。


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


Name: MNS  ..中級者(12,437ポイント)   Date: 2009/07/07(火) 20:50   No:36394     
Title: Re:プログラミングソフトのダウンロードについて    
使用しようと思っている言語にあわせてください。

このサイトである「龍神録プログラミングの館」でプログラミングを学びたい場合には、
Visual C++ 2008 Express Edition をダウンロードしてください。


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

Name: 北斗777  ..ぴよぴよ(56ポイント)   Date: 2009/07/08(水) 19:55   No:36469     
Title: Re:プログラミングソフトのダウンロードについて    
>>MNSさん
分かりました。
どうも、ありがとうございます。


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



Name: 初心者  ..プログラマー(34,227ポイント)   Date: 2009/07/08(水) 02:16   No:36435       
Title: ボスの移動を制御する関数    
ボスの移動を制御する関数がある.cppってどれなんでしょうか?

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


Name: 花火  ..ぴよぴよ(0ポイント)   Date: 2009/07/08(水) 18:11   No:36464     
Title: Re:ボスの移動を制御する関数    
main.cpp


じゃないよ


Name: チルチル  ..プログラマー(27,946ポイント)   Date: 2009/07/08(水) 18:46   No:36465     
Title: Re:ボスの移動を制御する関数    
多分boss_shot.cppだと思います

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



Name: rajan  ..ぴよぴよ(25ポイント)   Date: 2009/07/08(水) 10:21   No:36446       
Title: 無題    
java で Ball クラス と circle
クラス 作る わからない


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


Name: Blue  ..中級者(10,738ポイント)   Date: 2009/07/08(水) 10:42   No:36447     
Title: Re:無題    
Japanese, please.


文章になっていません。
日本語で理解できる文章で再度質問してください。

It is not sentences.
Please question again by sentences that can be understood from Japanese.

※自動翻訳


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

Name: conio [URL]  ..プログラマー(26,282ポイント)   Date: 2009/07/08(水) 11:00   No:36448     
Title: Re:無題    
class Ball{

}

class Circle{

}

以上です。


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



Name: デジキャメ  ..かけだし(1,749ポイント)   Date: 2009/07/07(火) 00:59   No:36372       
Title: イラストロジックについて    
イラストロジック(ピクロス)を作成していますが、下記の段階まで進んでいます。

・表をクリックで反転可
・マスの周りを白くする(ウインドウとマス目との境界を作る)
・各々マスの境界を作る

ですが、判定条件(毎回判定し、完成図と一致でクリア)と削るマスの数字入力の仕方が
分からなく、悩んでいます。


どうすれば解決できるか、宜しくお願い致します。

#include "DxLib.h"
#define SET_X (100)
#define SET_Y (100)
#define SIZE (26) //1ピクセル(1マスの)大きさ
#define size (300)
#define PI_H (10)
#define PI_W (10)

int MyDrawPixel(int x, int y, int color){
int col[] = {GetColor(0,0,0), GetColor(255,255,255)};
int sx, sy;

if (color < 0 || color > 1) {return -1;}
sx = SET_X + x*SIZE; sy = SET_Y + y*SIZE;
DrawBox(sx, sy, sx + SIZE-1, sy+SIZE-1, col[color], TRUE);
return 0;//終了
}

int MyDrawPi(int x, int y, int color){
int col[] = {GetColor(255,255,255)};
int sx, sy;

if (color < 0 || color > 1) {return -1;}
sx = SET_X; sy = SET_Y;
DrawBox(80, 80, 80 + size-1, 80+size-1, col[color], TRUE);
return 0;//終了
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
int col[] = {GetColor(255,255,255)};

ChangeWindowMode(TRUE);
if(DxLib_Init() == 1){
return 1;
}
int PixelData[PI_H][PI_W] = //完成図は「→」
{{0,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,1,1,0,0,0},
{0,0,0,0,0,0,1,1,0,0},
{0,0,0,0,0,0,1,1,1,0},
{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,1,1,1,0},
{0,0,0,0,0,0,1,1,0,0},
{0,0,0,0,0,1,1,0,0,0},
{0,0,0,0,0,1,0,0,0,0},};
int WorkData[PI_H][PI_W] = {1}, i, j;

for(i=0; i<1; i++){
for(j=0; j<1; j++){
MyDrawPi(j, i, 1);//x, y, color
}
}
for(i=0; i<PI_H; i++){
for(j=0; j<PI_W; j++){
MyDrawPixel(j, i, 1);//x, y, color
}
}
SetMouseDispFlag(TRUE);
while(!ProcessMessage()){
int MouseX, MouseY;

if((GetMouseInput() & MOUSE_INPUT_LEFT)){
while (GetMouseInput() & MOUSE_INPUT_LEFT);
GetMousePoint(&MouseX, &MouseY); MouseX = (MouseX-SET_X) / SIZE;
MouseY = (MouseY-SET_Y) / SIZE;
if(MouseX >= 0 && MouseX < PI_W && MouseY >= 0 && MouseY < PI_H){
WorkData[MouseY][MouseX]++;
if(WorkData[MouseY][MouseX] > 1){
WorkData[MouseY][MouseX] = 0;
}
MyDrawPixel(MouseX, MouseY, WorkData[MouseY][MouseX]);
}
}
//if(WorkData[MouseY][MouseX]== PixelData[PI_H][PI_W])
// break;
}
printf("Game Clear!!");//クリア表示する

DxLib_End();//mainの終了
return 0;//終了
}


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


Name: toyo  ..プログラマー(37,073ポイント)   Date: 2009/07/07(火) 07:23   No:36375     
Title: Re:イラストロジックについて    
クリアのチェックはPixelDataとWorkDataを全部比較して一致してるか調べればいいでしょう
forの2重ループで比較してもいいしmemcmpで比較してもいいでしょう

if (memcmp(PixelData, WorkData, sizeof(int) * PI_H * PI_W) == 0) {
break;
}



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

Name: たいちう  ..プログラマー(33,014ポイント)   Date: 2009/07/07(火) 08:52   No:36376     
Title: Re:イラストロジックについて    
数字入力部分も作成するのは、プログラムの手間がかかる割に、
使いやすいものができないのではないかと思います。
まずはテキストファイルから問題を読み込んで表示するものを作成してはいかがか。


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

Name: デジキャメ  ..かけだし(1,787ポイント)   Date: 2009/07/07(火) 15:23   No:36386     
Title: Re:イラストロジックについて    
返信が遅れました。

TOYOさん、たいほうさん、アドバイスありがとうございます。

上記の方法で作成してみます。


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

Name: デジキャメ  ..かけだし(1,856ポイント)   Date: 2009/07/08(水) 08:23   No:36444 解決!     
Title: Re:イラストロジックについて    
判定条件を成立させることができました。


次は、テキストファイルで作成してみます。


TOYOさん、たいちうさんありがとうございました。




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



Name: ひよこ  ..熟練のプログラマー(45,536ポイント)   Date: 2009/07/07(火) 21:55   No:36404       
Title: 弾幕の管理について    
龍神録の改造でSTGを作っているのですが、
龍神録の館には下のようなものがあるのですが、

//func.cpp
void (*boss_shot_bullet[DANMAKU_MAX])() =
{
//中ボス
boss_shot_bulletH000,//ノーマル
boss_shot_bulletH002,//スペル〜パーフェクトフリーズ〜
//ラスボス
boss_shot_bulletH001,//ノーマル〜サイレントセレナ〜
boss_shot_bulletH004,//スペル〜ケロちゃん〜
boss_shot_bulletH009,//スペル〜反魂蝶〜
//終り
boss_shot_bulletH000,//ぬるぽ回避用(この弾幕は出てこない)};
}
たくさんステージを作りたいので
自分はわかりやすくswitch文を使って
書いたのですがエラーが出ます。
void (*boss_shot_bullet[DANMAKU_MAX])() =
{
switch(stage){
case 0:
//中ボス
boss_shot_bulletH000,//ノーマル
boss_shot_bulletH002,//スペル〜パーフェクトフリーズ〜
//ラスボス
boss_shot_bulletH001,//ノーマル〜サイレントセレナ〜
boss_shot_bulletH004,//スペル〜ケロちゃん〜
boss_shot_bulletH009,//スペル〜反魂蝶〜
//終り
boss_shot_bulletH000,//ぬるぽ回避用(この弾幕は出てこない)
break;

case 1:
//中ボス
boss_shot_bulletH012,//ノーマル
boss_shot_bulletH013,//スペル〜パーフェクトフリーズ〜
//ラスボス
boss_shot_bulletH014,//ノーマル〜サイレントセレナ〜
boss_shot_bulletH005,//スペル〜ケロちゃん〜
boss_shot_bulletH003,//スペル〜反魂蝶〜
//終り
boss_shot_bulletH000,//ぬるぽ回避用(この弾幕は出てこない)
break;
}
};

どうすればいいでしょうか?なぜそうなるのでしょうか?


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


Name: 通りすがり  ..上級者(17,176ポイント)   Date: 2009/07/07(火) 22:14   No:36405     
Title: Re:弾幕の管理について    
関数ポインタについて調査したほうが良いです。

ttp://www.geocities.jp/ky_webid/c/043.html


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

Name: MNS  ..中級者(12,518ポイント)   Date: 2009/07/07(火) 22:17   No:36406     
Title: Re:弾幕の管理について    
代入しようとしているデータの中に、
制御構文などは埋め込めないのではないでしょうか?
(というか、埋め込めないはずです)

ですので、switch文を外に持ってくるなどのアプローチをとってみてはどうでしょう?
(ただし、配列に対して一括に代入することは出来なくなるかも知れませんが。


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

Name: ひよこ  ..熟練のプログラマー(45,640ポイント)   Date: 2009/07/07(火) 23:01   No:36415     
Title: Re:弾幕の管理について    
ただいま勉強しながら試行錯誤中なのですが、
コンパイルしたら次のようなエラーが出ました。
関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。
どういう意味なのでしょうか?


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

Name: ねこ  ..上級者(22,001ポイント)   Date: 2009/07/07(火) 23:47   No:36424     
Title: Re:弾幕の管理について    
どう修正したのか分からないのですが、switch使おうとしてる点から何か妙な処理をしてるんじゃないかなと。
エラーの意味は検索したらMSのヘルプ出たのでそのへん見てみてください。

処理についてですが関数ポインタの配列に関数突っ込んでるだけなので、
ステージの都度配列の中を入れ替えてあげれば良いんじゃないでしょうか?
よーく見ると int a[3] = { 0, 1, 2 };とほぼ同じ事してるんですよ。


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

Name: ひよこ  ..熟練のプログラマー(45,676ポイント)   Date: 2009/07/08(水) 06:47   No:36440 解決!     
Title: Re:弾幕の管理について    
おはようございます。
int a[3] = { 0, 1, 2 };を見て考えたらできました。
通りすがりさん、MNSさん、ねこさん、ありがとうございました。


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



Name:  ..ぴよぴよ(20ポイント)   Date: 2009/07/07(火) 11:49   No:36383       
Title: ボム発動時の帯について    
50章
ボムを発動させたときに出る帯についてなんですが
本家龍神録みたいに横帯は縦に移動、縦帯は横に移動するように
したいのですがどうすればできますか?countを使うんでしょうか?
アドバイスお願いします


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,041,641ポイント)   Date: 2009/07/07(火) 21:04   No:36396     
Title: Re:ボム発動時の帯について    
ボムのカウンタを使って座標を移動させればいいと思います。
縦方向ならy方向へカウントアップしてやり、
横方向ならx方向へカウントアップさせてやればいいと思います。
画像の傾きはDrawRotaGraphの第四引数を+PI/2してやれば90度回転します。


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

Name:  ..ぴよぴよ(256ポイント)   Date: 2009/07/08(水) 01:21   No:36431     
Title: Re:ボム発動時の帯について    
//縦線
if((k=search_effect())!=-1){
effect[k].flag=1;
effect[k].cnt=0;
effect[k].knd=3;//ボムの線のエフェクト
effect[k].brt=0;
effect[k].ang=PI/2;
effect[k].mvang=-PI/2;
effect[k].spd=1;
effect[k].r=1;
effect[k].eff=2;
effect[k].img=img_eff_bom[3];
effect[k].x=70;
effect[k].y=300;
}
ここのどこにボムのカウンタを入れたらx方向へカウントアップできるのでしょうか?


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,042,011ポイント)   Date: 2009/07/08(水) 06:25   No:36439     
Title: Re:ボム発動時の帯について    
あぁ、すみません、質問の意図を間違って受け取っていました。
移動角度は

effect[i].mvang

で表していますから、ここに、進めたい角度を入れるといいです。


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

Name:   Date: 2009/07/15(水) 03:02   No:363831247594529     
Title: Re:ボム発動時の帯について    
返答ありがとうございます。
このeffect[i].mvang自体のスピードは上げられないのでしょうか?
例えば横帯はX軸に動くの速さは遅いが縦に移動する速度は速くするみたいに


Name:   Date: 2009/07/15(水) 03:02   No:363831247594560     
Title: Re:ボム発動時の帯について    
返答ありがとうございます。
このeffect[i].mvang自体のスピードは上げられないのでしょうか?
例えば横帯はX軸に動くの速さは遅いが縦に移動する速度は速くするみたいに


Name:   Date: 2009/07/15(水) 03:02   No:363831247594572     
Title: Re:ボム発動時の帯について    
返答ありがとうございます。
このeffect[i].mvang自体のスピードは上げられないのでしょうか?
例えば横帯はX軸に動くの速さは遅いが縦に移動する速度は速くするみたいに




Name: ユーリ  ..入門者(3,997ポイント)   Date: 2009/07/07(火) 23:17   No:36417       
Title: 質問です    

#include <stdio.h>

int main(void)
{
int i,j,k;
int a[3][3]={{0,1,2},{1,2,3,},{2,3,4}};
int b[3][3]={{0,1,2},{1,2,3,},{2,3,4}};
int c[3][3];
printf("行列A\n");
for(i=0; i<3; i++){
printf("%d %d %d",a[i][0],a[i][1],a[i][2]);
printf("\n");
}
printf("行列B\n");
for(i=0; i<3; i++){
printf("%d %d %d",a[i][0],a[i][1],a[i][2]);
printf("\n");
}
for(i=0; i<3; i++){
for(j=0; j<3; j++){
for(k = 0; k<3; k++){
c[i][j]=a[i][k]*b[k][j];
}
}
}
printf("行列C\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){

printf("%5d", c[i][j]);
}
printf("\n");

}


return 0;
}

行列の積の計算をするプログラムを作りたいのですがどこが間違っているのでしょうか?
よろしければ教えてください。


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


Name: conio [URL]  ..プログラマー(25,793ポイント)   Date: 2009/07/07(火) 23:44   No:36423     
Title: Re:質問です    

--------------------------------
for(i=0; i<3; i++){
for(j=0; j<3; j++){
for(k = 0; k<3; k++){
c[i][j]=a[i][k]*b[k][j];
}
}
}
--------------------------------
この部分を順に、どのように計算されているかを調べれば良いのでは無いでしょうか。

下記のようにすれば、恐らく原因が分かるはずです。
--------------------------------
for(i=0; i<3; i++){
for(j=0; j<3; j++){
for(k = 0; k<3; k++){
c[i][j]=a[i][k]*b[k][j];
printf("c[%d][%d] = a[%d][%d] * b[%d][%d]", i,j,i,k,k,j);
printf("( %d = %d * %d )\n", c[i][j], a[i][k], b[k][j]);

}
}
}
--------------------------------

あと、見たところ配列Cが初期化されて無いです。


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

Name: ユーリ  ..入門者(4,002ポイント)   Date: 2009/07/08(水) 01:23   No:36432 解決!     
Title: Re:質問です    
ありがとうございました。
解決いたしました。


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



Name: はね  ..中級者(11,188ポイント)   Date: 2009/07/07(火) 22:23   No:36407       
Title: トリリニア補間について    
トリリニア補間のプログラムを制作しようと試みているのですが
ググってみても有益な情報が得られずに困っております。
言語はC++です。

補間に必要な画素値、補間係数は算出できていますが公式がわからないです。

そこで、トリリニア補間の公式、参考になるサイトでも結構ですので
教えて頂きたいです。

よろしくお願いします。


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


Name: Justy  ..伝説なるハッカー(388,722ポイント)   Date: 2009/07/08(水) 00:48   No:36429     
Title: Re:トリリニア補間について    
 自前のレンダラーを書いているのでしょうか。

 tri-linerって2つのレベルの mipmapをバイリニアでサンプリングして、
後は線形補完するんじゃなかっでしたっけ?

 で、補間に必要な画素値……各バイリニア補完後の値が判っていて、
補間係数……2つの mipmap間の補完係数が出ているのであれば、あとは補関するだけなのでは?


 一応参考になりそうなサイトも載せておきます。

GameDev.net - Bilinear Interpolation Of Texture Maps
ttp://www.gamedev.net/reference/articles/article810.asp


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

Name: はね  ..中級者(11,539ポイント)   Date: 2009/07/08(水) 01:19   No:36430 解決!     
Title: Re:トリリニア補間について    
Justy様

回答ありがとうございます。
トリリニア補間は3次元データの補間に使用する予定です。

>で、補間に必要な画素値……各バイリニア補完後の値が判っていて、
>補間係数……2つの mipmap間の補完係数が出ているのであれば、あとは補関するだけなのでは?
説明が足りませんでした。
現在取得している画素値と係数は
バイリニア補間前の元画像から抜き出した画素値と、XYZ軸各軸方向の係数がわかっているのみです。
素材はそろっているのに、公式(?)、補間の方法が不明でした。

>tri-linerって2つのレベルの mipmapをバイリニアでサンプリングして、
>後は線形補完するんじゃなかっでしたっけ?
なるほど!
まず、XY軸(例えば)で画素値をバイリニア補間し、バイリニア補間後の画素と残りのZ軸を線形補間するのですか!
これでできそうです。

ありがとうございます。
サイトも教えて頂き重ね重ねありがとうございました。


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



Name: nn  ..ぴよぴよ(836ポイント)   Date: 2009/07/04(土) 14:20   No:36226       
Title: ピクセルでRGB取得について    
Javaでピクセルグラバーからピクセルを取得し、
R、G、Bそれぞれの値を入手しようと思ってググってみたところ、
ソースコードで以下のような記述を見つけました。


int pixel=new int[img.getWidth(this)*img.getHeight(this)]
pixel=(int[])pg.getPixels();
int[] R=new int[256];
for(int i=0;i<pixel.length;i++){
R[pixel[i]>>16 & 0xff]++;
}



ここで質問なのですが、

R[pixel[i]>>16 & 0xff]++;

の文についてなのですが、
R要素は16〜32ビットの間にあるのでいらない0〜16ビット分を右にシフトするのは
わかるのですが、 & 0xffは何の処理をしているのでしょうか?
他にも | 0 といったソースを見かけたのですがこちらも何を
しているのでしょうか?


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


Name: ねこ  ..上級者(20,059ポイント)   Date: 2009/07/04(土) 15:43   No:36234     
Title: Re:ピクセルでRGB取得について    
使った事があるわけじゃないので推測になりますが

getPixels関数で戻ってくるのはRGB値に透明度を加えた0xFFFFFFFF( 透明度・赤・緑・青 )の形式なんじゃないでしょうか。
R(赤)は17〜24ビットになるので、16ビットシフトした値に0xFFを&演算する事で17〜24ビットだけを取得します。

< | 0
0のOR演算は何も起こらない・・・と思うのでちょっと分からないですね。
何かお約束的な処理なのかもしれません。


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

Name: 御津凪 [URL]  ..ハッカー(100,422ポイント)   Date: 2009/07/04(土) 17:17   No:36239     
Title: Re:ピクセルでRGB取得について    
> R[pixel[i]>>16 & 0xff]++;

& 0xff の意味は、 pixel[i]>>16 だけでは 0x00 〜 0xff の範囲ではない(0x0000 〜 0xffffの範囲の)ため、
0x00 〜 0xff の範囲にするためにマスク処理(& 0xff)を行っています。

32bit カラーでの各色成分は 256 段階で持っているため、ある色成分を取得するには、
ねこさんのような計算で取得する必要があります。


> | 0

は、見やすさなど、実際の処理には影響しないものの、明示的な意味合いを含ませるために記述することがあります。
例えば、
int color = 

(0x80 << 24) | // 透明度(A)
(0xFF << 16) | // 赤(R)
(0x00 << 8) | // 緑(G)
(0x00 << 0); // 青(B)


この color の計算結果は 0x80FF0000 となり、上記のほうが比較的見やすい(かも)ですが、
(0x00 << 0) のように処理としてはまったく意味(効果)のない箇所もあります。
しかし、見やすさとしてはあったほうが見やすいと思いますがどうでしょう?


ちなみに、" | 0" と書かれている箇所はどういった処理なのでしょうか?
もしフラグ関係なら、「何も(追加)指定しない」などの意味合いを示しているかと思います。


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

Name: nn  ..ぴよぴよ(980ポイント)   Date: 2009/07/05(日) 15:42   No:36297     
Title: Re:ピクセルでRGB取得について    
マスク処理なんですね。
マスク処理というと2進しかイメージなかったのでピンときませんでした。
| 0 の処理なんですが、


PixelGrabber pg = new PixelGrabber(im,0,0,w,h,pixels,0,w);
R[i] = pixels[i] & 0x00ff0000;
Rim[i] = 0xff000000 |R[i]|0|0;


の最後の行です。2回 | 0 をしているのですが何をしているのかさっぱりです。
それとふと疑問に思ったのですが、

pixel[i]>>16
を行うと
0xffffのようにアルファ値とR要素が残ると思うのですが、
これに & 0xffのようにマスク処理をして、桁数があってないので
R要素だけちゃんとかえって来るのかな?と疑問に思ったのですが
これはどうなんでしょう?


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

Name: 御津凪 [URL]  ..ハッカー(101,519ポイント)   Date: 2009/07/05(日) 16:21   No:36299     
Title: Re:ピクセルでRGB取得について    
> Rim[i] = 0xff000000 |R[i]|0|0;

この処理は Rim[i] へ色情報を格納しているものです。
or でそれぞれの値を結合していますが、 | で区切った場合、
A(0xff000000) | R(R[i]) | G(0) | B(0)



と、各色要素に分けて表現していることがわかります。


ここでは、 G と B は指定していない(ゼロ)ので省略してもかまわないのですが、
ここでは省略せず "| 0 | 0" と表記しているのでしょう。


また、ここで扱っているカラー情報は、以下のような構成になっています。
・A - 25 〜 32 ビットに格納(マスク値は 0xff000000)

・R - 17 〜 24 ビットに格納(マスク値は 0x00ff0000)
・G - 9 〜 16 ビットに格納(マスク値は 0x0000ff00)
・B - 1 〜 8 ビットに格納(マスク値は 0x000000ff)


さらに、各要素値を 0 〜 255 の範囲にするためには、( color はカラー値が入っている変数)
・A -> "(color >> 24) & 0xff"

・R -> "(color >> 16) & 0xff"
・G -> "(color >> 8) & 0xff"
・B -> "(color >> 0) & 0xff" (省略して "color & 0xff" でも可)


となります。
(元の位置に戻すには左シフトに切り替えるだけです)

> pixel[i]>>16 & 0xff

というのは、 R 要素を取り出す処理なので、この記述で問題はありません。
(カッコをつけて優先順位を明確にしたほうが良いですが)


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

Name: ねこ  ..上級者(20,466ポイント)   Date: 2009/07/05(日) 16:23   No:36300     
Title: Re:ピクセルでRGB取得について    
<Rim[i] = 0xff000000 |R[i]|0|0;
それはこういう事ですね。「透明度 | 赤 | 緑 | 青」
緑と青を明示してるだけで計算上では意味はないです。

<これに & 0xffのようにマスク処理をして、桁数があってないので
10進数でも10をわざわざ0010とか書かないですよね?
それと同じでマスクも省略しているだけで、実際には0x00FFを計算してるわけです。

「かえってくる」という表現をしていますが、
AND演算やOR演算はただの演算処理なので特殊な処理ってわけじゃないですよ。
2進数のマスク処理と一緒で16進数に置き換えてるだけです。


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

Name: nn  ..かけだし(1,010ポイント)   Date: 2009/07/08(水) 00:39   No:36428 解決!     
Title: Re:ピクセルでRGB取得について    
見やすくしているだけなんですね。
詳しい回答をどうもありがとうございました。


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



Name: 亀猫  ..かけだし(1,632ポイント)   Date: 2009/07/06(月) 23:34   No:36361       
Title: マップファイルの読み込み    
こんにちは。今回はマップファイルの読み込みと川の流れについて質問があります。

マップファイルを読み込むにはどうすればいいでしょうか?

マップエディタはPlatinumというものを使ってます。

DXライブラリの
FileRead_read という関数を使って読み込もうとしたのですが、画像は読み込めるのですがマップファイルは読み込めませんでした。どうすればいいでしょうか。




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


Name: Justy  ..伝説なるハッカー(387,962ポイント)   Date: 2009/07/06(月) 23:56   No:36363     
Title: Re:マップファイルの読み込み    

>画像は読み込めるのですがマップファイルは読み込めませんでした
>どうすればいいでしょうか

 FileRead_readで画像が読み込めるなら、マップファイルも読み込めるはずなのですが。

 そうですね。
 さすがにこれだけの情報では誰も何もわからないので、
とりあえず、何を以て読み込めなかったと判断したのか、と
具体的にどういうコードを書いて、読み込もうとしたのかを
提示してみてはどうでしょうか。


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

Name: 亀猫  ..かけだし(1,089ポイント)   Date: 2009/07/07(火) 00:04   No:36364     
Title: Re:マップファイルの読み込み    
#include "DxLib.h"
#include <malloc.h>

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
void *Buffer ;
int FileSize, FileHandle, GrHandle ;

// DXライブラリの初期化
if( DxLib_Init() == -1 ) return -1 ;

// ファイルのサイズを得る
FileSize = FileRead_size( "sample.ppj" ) ;

// ファイルを格納するメモリ領域の確保
Buffer = malloc( FileSize ) ;

// ファイルを開く
FileHandle = FileRead_open( "sample.ppj" ) ;

// ファイルを丸ごとメモリに読み込む
FileRead_read( Buffer, FileSize, FileHandle ) ;

// ファイルを閉じる
FileRead_close( FileHandle ) ;

// グラフィックハンドルの作成
GrHandle = CreateGraphFromMem( Buffer, FileSize ) ;

// メモリの解放
free( Buffer ) ;

// 画面に描画
DrawGraph( 0, 0, GrHandle, TRUE ) ;

// キー入力待ち
WaitKey() ;

// DXライブラリの後始末
DxLib_End() ;

return 0 ;
}

これで実行したところ、真っ暗な画面でなにも起きませんでした。

ファイルを開く,サイズを得るをtown01_a.bmpにしたら、うまく表示されました・・・。




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

Name: Justy  ..伝説なるハッカー(388,128ポイント)   Date: 2009/07/07(火) 00:32   No:36369     
Title: Re:マップファイルの読み込み    
 ppjファイルは "Platinum Project File"ですよね?
 これは画像ファイルではなく、Platinumのプロジェクトファイルなので、
Platinumアプリだけが読み書きできるデータファイルです。

 なので、このデータからグラフィックハンドルを作成することは出来ないはずです。
 逆に言えば、データとしては読み込めている可能性は高いです。


 尚、ゲームなどで使用する場合は Platinumから bmpや csv、fmfに書き出して
使う必要があります。
(勿論、グラフィックハンドルに直接変換可能なのはこのうち bmpだけです)

 fmf形式で読み込む方法については、サンプルが Platinumに同梱されていたと思うので
そちらを参考にしてみてください。


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

Name: 亀猫  ..かけだし(1,131ポイント)   Date: 2009/07/07(火) 19:40   No:36392     
Title: Re:マップファイルの読み込み    
返信ありがとうございます。
fmf形式で読み込む場合、マップのパーツを順々に変えていくことは出来ますか?
例えば

扉が閉まっているパーツがあり、扉のパーツの前で「Zキー」が押された場合扉が開くパーツに変更

川の流れを表現するパーツ 1 2 3 があり、川の流れを表現するパーツを 1→2→3→1→2→3→・・・ のようにループさせる。

のようにすることはできますか?
する方法は自分で考えて出来なかったら再び質問します・・・。


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

Name: Justy  ..伝説なるハッカー(388,668ポイント)   Date: 2009/07/07(火) 21:21   No:36400     
Title: Re:マップファイルの読み込み    

>マップのパーツを順々に変えていくことは出来ますか?

 できますよ。

 fmfデータの中には画像に関する情報やそれが何であるかの情報は一切含まれていません。
 その場所が 0とか 4とか数字があるだけなので、その解釈は個々で行うことが出来ます。

 つまり解釈する側でどうにでもできる、というわけです。


 例えば扉に番号 100を割り当てたとして、マップ上に 100の指定があったら、
個々の扉を管理するプログラムがボタンに応じて開閉ステータスを切り替えたり、
ステータスに応じて開いている・閉じている扉の描画を行うようにするとか。

、或いは番号 100と 101にそれぞれ扉の開閉時の絵を割り当て、
100の時にZが押されたら 101に変更、101の時にZが押されたら 100に変更する、
というようにマップデータの番号を直接書き換えてもいいです。

 まぁ扉に関しては後者の方がいいような気がしますね。

「最初から開いている扉、最初から閉じている扉」を表現するためには
それぞれに番号を割り振っておかないとエディタ上で区別が付かないですから。


 川の流れの方も同様に、川は 150とか決めておいて、プログラムでマップを調べた時に
150の場所が出てきたのなら川だと判定して、適宜アニメーションさせれば
いいだけです。


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

Name: 亀猫  ..かけだし(1,174ポイント)   Date: 2009/07/08(水) 00:01   No:36427 解決!     
Title: Re:マップファイルの読み込み    
返信ありがとうございます!

まだマップ作りで止まっているので、完成したら色々といじってみます!


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



Name: ユーリ  ..入門者(3,542ポイント)   Date: 2009/07/07(火) 00:19   No:36368       
Title: お願いします    
キーボードからアルファベット文字列を入力し、文字列の中の母音(a,e,i,o,u)を'='に置き換えて表示するというプログラムなのですが

#include <stdio.h>

int main(void)
{
char moji[];
printf("文字を入力してください");
scanf("%S",&moji);



printf("%S",moji);
return 0;
}

最初の方はできたのですが母音を=に置き換えて表示するにはどうしたらいいですかね?
ヒントを貰えないでしょうか?


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


Name: conio [URL]  ..プログラマー(25,753ポイント)   Date: 2009/07/07(火) 00:39   No:36370     
Title: Re:お願いします    
>>最初の方はできたのですが
残念ながら出来ていないように思えます。
エラーが出るのではないですか?

----------------------------------------------------
char moji[];
これではサイズが不明です。
適当な数でいいので指定しないとエラーになりますよ。
(省略可能の場合もありますが、今回の書き方だと省略不可です)


scanf("%S",&moji);
文字列の場合、&は要らないです。
あと、大文字ではなく、小文字ではないかと。 %S ⇒ %s
----------------------------------------------------


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

Name: ねこ  ..上級者(21,689ポイント)   Date: 2009/07/07(火) 00:40   No:36371     
Title: Re:お願いします    
<ヒント1>
例えば入力で「kakikukeko」と入力した場合、mojiには以下のように情報が入っています
moji[0]:'k'
moji[1]:'a'
moji[2]:'k'
moji[3]:'i'
moji[4]:'k'
moji[5]:'u'
moji[6]:'k'
moji[7]:'e'
moji[8]:'k'
moji[9]:'o'

<ヒント2>
文字を1文字ずつ比較するのはif( moji[x] == 'a' )と判定出来ます。

<ヒント3>
指し変えるためには「moji[x] = '='」と処理します。

<ヒント4>
文字数を取得するには「int mojisu = strlen(moji);」で取得する事が出来ます。

これで分からなかったらその次は「ヒント」じゃなくて「答え」になります。


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

Name: Hermit  ..上級者(23,812ポイント)   Date: 2009/07/07(火) 01:04   No:36373     
Title: Re:お願いします    
文字を一文字ずつ比較する処理を書くのは面倒なので、
一気に比較する為に、
switch() や、strchr() 等をよく使います。

		switch(moji[i]) {

case 'a': case 'i': case 'u': case 'e': case 'o':
moji[i] = '=';
}
とか、

if (strchr("aiueo",moji[i]))
moji[i] = '=';
とか。


コンピュータ内部での処理は遅くなるかもしれません。簡単に書くためだけです。


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

Name: ユーリ  ..入門者(3,729ポイント)   Date: 2009/07/07(火) 22:26   No:36408     
Title: Re:お願いします    

#include <stdio.h>

int main(void)
{
char i;
char moji[30];
printf("文字を入力してください\n");
scanf("%s",moji);
switch(moji[i]) {
case 'a':
case 'i':
case 'u':
case 'e':
case 'o':
break;

}
moji[i]='=';
printf("%s",moji);
return 0;
}

これで実行したら初めの文字だけが=になるのですがどのようにしたらよいのでしょうか?


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

Name: バグ  ..ハッカー(161,511ポイント)   Date: 2009/07/07(火) 22:31   No:36409     
Title: Re:お願いします    
変数iは何の為に使ってますか?

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

Name: ユーリ  ..入門者(3,730ポイント)   Date: 2009/07/07(火) 22:45   No:36413 解決!     
Title: Re:お願いします    
ありがとうございました。
解決いたしました。


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



Name: kunene  ..ぴよぴよ(180ポイント)   Date: 2009/07/06(月) 10:13   No:36338       
Title: スレッドローカル変数について    
スレッドローカル変数について教えてください。

VisualC 2005 でスレッドローカル変数を使っています。
__decspec(thread)やTLS関数を使っています。

この方法だとすべてのスレッドで独立したスレッドローカル変数が使用できるのですが、
容量が大きくなりすぎるため
あるスレッドのみ、スレッドで独立したスレッドローカル変数を使えるようにしたいと思っています。

何か方法はありませんか?

あるスレッドとは、同じスレッドを複数起動します。
そのスレッドのみ、特定のスレッドローカル変数を使用したいのです。

以上、よろしくお願いします。


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


Name: たかぎ [URL]  ..ハッカー(106,815ポイント)   Date: 2009/07/06(月) 17:18   No:36341     
Title: Re:スレッドローカル変数について    
TLSでポインタだけ用意しておき、大きなサイズの変数が必要なスレッドで動的に割付けるというのはどうでしょう?


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

Name: kunene  ..ぴよぴよ(484ポイント)   Date: 2009/07/07(火) 09:36   No:36377     
Title: Re:スレッドローカル変数について    
返信遅れてすみません。

説明たらずだったようで、、、補足させてください。

スレッドA、スレッドB、スレッドCがあります。
スレッドCが複数起動します。

スレッドCのみで使用できるスレッドローカルの方法を探しています。
スレッドCの本体は、既に実装済みのソースから流用です。

__decspec(thread) にてスレッドローカルとして定義してしまうと
スレッドCのソースを変更する必要はないのですが、
スレッドA、スレッドBでも同じ変数が定義されてしまうので、無駄な領域ができてしまいます。

TLS関数を使うと、スレッドCのみで使用できるスレッドローカル変数を定義できそう(やってません)
なんですが、ソースを変更しなければならないと思ってます。

そこで、2つの長所のみの
既存のソース内部を変更せずに何とかその外側で特定のスレッドのみ定義される
スレッドローカル変数というものが定義できないかと思ってます。

たかぎさんのご意見ですと、既存のソースの変更が必要になると思いますが、
いかがでしょうか?



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

Name: たかぎ [URL]  ..ハッカー(106,918ポイント)   Date: 2009/07/07(火) 21:40   No:36402     
Title: Re:スレッドローカル変数について    
ソースをまったく変更しないとなると、よほど幸運な状況(マクロ定義だけで済むとか)でない限り、コンパイラの変更か、それに近いことが必要になります。
対象となるコードを見せていただくとともに、どんな修正をしようとしているのかを具体的に補足してください。


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



Name: 素人  ..初心者(8,884ポイント)   Date: 2009/07/06(月) 19:48   No:36349       
Title: ボムを実装!    
やっと50章までいきました。
そういえばボムの回数制限は実装されてなかったのですが
どうすれば実装出来るのでしょうか?
アドバイスをお願いします。


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


Name: あ〜る  ..中級者(9,820ポイント)   Date: 2009/07/06(月) 19:57   No:36351     
Title: Re:ボムを実装!    
適当に自機の構造体の中にボムの数を表す変数を用意して、ボムを使ったら1減るようにしたらどうでしょうか?

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,041,196ポイント)   Date: 2009/07/06(月) 22:32   No:36357     
Title: Re:ボムを実装!    
あ〜るさんが仰るとおりなので、何も言う事はありませんが、
構造体にボムの数を表す変数を用意して、
ボムが発動する関数の最初辺りにでも、その数を減らす処理を書き、
残り数が0なら、ボムを発動させなくすればいいと思います。


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

Name: 素人  ..初心者(8,921ポイント)   Date: 2009/07/07(火) 11:00   No:36379     
Title: Re:ボムを実装!    
返答ありがとうございます。
残り数が0なら、ボムを発動させなくするという
処理のみ分かりません。どうすればいいのでしょうか?


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

Name: conio [URL]  ..プログラマー(25,804ポイント)   Date: 2009/07/07(火) 11:22   No:36380     
Title: Re:ボムを実装!    
if(残り数が0より大きいなら)
 ボム発動

具体的なプログラムは分かりませんが、if文を使えば問題ないでしょう。


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

Name: 素人  ..初心者(8,955ポイント)   Date: 2009/07/07(火) 11:40   No:36381     
Title: Re:ボムを実装!    
逆に

if(残り数が0より大きいなら)
 ボムが発動できなくなる
}

というプログラムを考えてるんですが
できませんか?


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

Name: conio [URL]  ..プログラマー(26,055ポイント)   Date: 2009/07/07(火) 11:48   No:36382     
Title: Re:ボムを実装!    
----------------------------
if(残り数が0より大きいなら)
 ボムが発動できなくなる
----------------------------

適当に変数がbom、初期値が5だったとすると、
上記のプログラムではボムが発動する事は無いですよ。

-----------------------------------------
if(bom > 0) //bom == 5なので発動しない
if(bom > 0) //bom == 4なので発動しない
if(bom > 0) //bom == 3なので発動しない
if(bom > 0) //bom == 2なので発動しない
if(bom > 0) //bom == 1なので発動しない
if(bom > 0) //if文が成立しないので、何も行われない
-----------------------------------------


やるとするなら、下記のどちらかでしょう。

---------------------------
if(残り数が0より大きいなら)
 ボムを発動


if(残り数が0以下なら)
 ボムを発動しなくなる
else
 ボムを発動
---------------------------


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

Name: 素人  ..初心者(8,990ポイント)   Date: 2009/07/07(火) 17:32   No:36388 解決!     
Title: Re:ボムを実装!    
アドバイスのおかげで実装できました。
ありがとうございました!



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



Name: アイス  ..ぴよぴよ(362ポイント)   Date: 2009/07/06(月) 03:37   No:36331       
Title: キャラの速度    
キャラの移動制御のところで止まってるんですが
説明が不十分でよくわかりません。

void ch_move(){//キャラクタの移動制御
int i,sayu_flag=0,joge_flag=0;
double x,y,mx,my,naname=1;
double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,4.0,-4.0};//{左,右,下,上}のスピード
int inputpad[4];
inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);

if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
ch.img+=4*2;//画像を左向きに
else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
ch.img+=4*1;//画像を右向きに

for(i=0;i<2;i++)//左右分
if(inputpad[i]>0)//左右どちらかの入力があれば
sayu_flag=1;//左右入力フラグを立てる
for(i=2;i<4;i++)//上下分
if(inputpad[i]>0)//上下どちらかの入力があれば
joge_flag=1;//上下入力フラグを立てる
if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
naname=sqrt(2.0);//移動スピードを1/ルート2に

for(int i=0;i<4;i++){//4方向分ループ
if(inputpad[i]>0){//i方向のキーボード、パッドどちらかの入力があれば
x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納
mx=move_x[i]; my=move_y[i];//移動分をmx,myに代入
if(CheckStatePad(configpad.slow)>0){//低速移動なら
mx=move_x[i]/3; my=move_y[i]/3;//移動スピードを1/3に
}
x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
if(!(x<10 || x>FIELD_MAX_X-10 || y<5 || y>FIELD_MAX_Y-5)){//計算結果移動可能範囲内なら
ch.x=x , ch.y=y;//実際に移動させる
}
}
}
}

結局のところ
キャラのスピードのあげるのはどこをいじればいいんでしょうか?(低速移動も)


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


Name: array  ..熟練のプログラマー(50,635ポイント)   Date: 2009/07/06(月) 06:07   No:36333     
Title: Re:キャラの速度    
double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,4.0,-4.0};//{左,右,下,上}のスピード

ここだと思います


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

Name: やそ  ..比類無きプログラマー(93,625ポイント)   Date: 2009/07/06(月) 12:07   No:36340     
Title: Re:キャラの速度    
arrayさんの指摘した場所の数値を好きなようにいじってテストしてみればわかると思うよ。

また、低速移動は

if(CheckStatePad(configpad.slow)>0){//低速移動なら
mx=move_x[i]/3; my=move_y[i]/3;//移動スピードを1/3に

で行っていると思います。(コメント読めばわかるよね)

1/3のスピード(移動幅)が「違うなぁ〜」と思えばそのあたりを修正してTRY&ERRORあるのみです。


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

Name: Dixq (管理人) [URL]  ..ウィザード(1,041,180ポイント)   Date: 2009/07/06(月) 22:29   No:36356     
Title: Re:キャラの速度    
本来なら、4.0や/3の部分のマジックナンバーはdefineで定義した方がいいと思いますので、
適当な名前で定義してみて下さい。

いちいちどの辺か悩まなくても定義を変えるだけで移動スピードが変わるようになると思います。


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

Name: アイス  ..ぴよぴよ(393ポイント)   Date: 2009/07/07(火) 05:45   No:36374 解決!     
Title: Re:キャラの速度    
色々アドバイスどうもです。
おかげで無事に速さ調節できました。
ありがとうございます。


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



Name: わい  ..ぴよぴよ(544ポイント)   Date: 2009/07/05(日) 01:36   No:36277       
Title: スクリプトデータ(ADV)のフォーマットに関して    
お世話になります。
スクリプトデータ(ADV)のフォーマット(データの持ち方)に関して
質問させてください。

参考にしているゲームでは、スクリプトプレイヤー(ゲーム本体)で
実行する時に使用するバイナリデータにコンパイルする際、データを

・文章や選択肢のテキストデータ
・オペレーションコード(コマンド)
・コマンドのパラメータ

という風に、大まかに3つのブロックに分けていました。
一般的に、このように分けるものなのか?という疑問と、
このように分けなければいけない理由があるはずだろう
ということで、考えてみたのですが、納得できる答えまで
はたどり着いていない状態です。

特に、分ける理由について。
履歴の表示や、中断データから再開する際に、オペレーション
(コマンド)コードを別にしておいた方が良いのでしょうか?
分ける必要はないけど、データとしての隠蔽の為に、そうして
いるだけなのか。もしくは、圧縮の有利性を考えてのことなのか?。

どういうフォーマットにするかは、その人の好みの問題で、
分ける必要性は特ない。というのが答えなのかなぁとは
思うのですが、ご意見を頂ければと思います。


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


Name: 御津凪 [URL]  ..ハッカー(101,042ポイント)   Date: 2009/07/05(日) 02:28   No:36280     
Title: Re:スクリプトデータ(ADV)のフォーマットに関して    
データを複数のブロックに分けることの利点は、読み込み時や実行中のオーバーヘッドを無くすためだと考えられます。

どういうことかと言うと、
バイナリデータのヘッダ情報に各ブロックへの(ファイルの先頭からの)オフセットを用意し、
読み込み時ではヘッダを読み込むだけでどのブロックがファイルのどこにあるかを把握することができる、ということです。

ほかのデータへの参照など、複雑なデータ構造を持つとき、このようにブロックとして分けることで管理を楽にしています。

あとは、その参考にしているゲームでのデータの扱い方により異なります。
(もしかしたらそのゲームでは最良の形式なのかもしれません)

ちなみに、データをブロック単位として分けることで圧縮率も若干向上します(もちろん内容によります)が、
それだけのために分けるということは(重要でない限り)余りやらないです。

※余談ですが、実行ファイルやライブラリファイルなども、セクション(ブロック)としてデータが分かれています。


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

Name: わい  ..ぴよぴよ(623ポイント)   Date: 2009/07/07(火) 00:15   No:36366     
Title: スクリプトデータ(ADV)のフォーマットに関して    
御津凪さん、レスありがとうございます。

参考にしているゲームは、おっしゃるように、オフセットを用意
して、各ブロックのデータにアクセスしておりました。

勉強の為に、分ける方法と、分けない方法、両方で作ってみたいと思います。



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

Name: わい  ..ぴよぴよ(647ポイント)   Date: 2009/07/07(火) 00:15   No:36367 解決!     
Title: スクリプトデータ(ADV)のフォーマットに関して    
すみません。解決のチェックを忘れました。

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



Name: ユーリ  ..入門者(3,315ポイント)   Date: 2009/07/06(月) 23:27   No:36360       
Title: 質問です    
乱数で1〜10の整数値を一個発生させて、これを答えとする。キーボードから値を入力して、その答えが、一致するまで繰り返すプログラムを作成せよ。ただし入力回数をカウントし、5回を超えたら入力を中止し答えを表示する。という問題なのですが

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

int main()
{
int a,b,i;
i=0;
srand(time(NULL));
printf("%3d\n",rand()%10+1);
b=rand()%10+1;
while(1){
i++;
printf("数字を入力してください");
scanf("%d",a);
if(a==b){
printf("OKだよん");
break;
}

if(i==5){
printf("ざんね〜ん\n");
printf("答えは",b);
break;
}
}
return 0;
}

という感じで作ってみたのですがどこが違うのでしょうか?


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


Name: DVDM [URL]  ..ぴよぴよ(647ポイント)   Date: 2009/07/06(月) 23:50   No:36362     
Title: Re:質問です    
>>ユーリさん
まず、乱数を発生させている所です。
printf("%3d\n",rand()%10+1);
b=rand()%10+1;

・・・となっていますが、表示された内容と、bに入っている値は別々になる可能性があります。
printfで表示する場所でランダムな値を発生させ、bに代入する部分でも乱数を発生させているからです。
修正の一例として
b=rand()%10+1;
printf("%3d\n",b);
とでもしてやると、bにランダムな値が入り、それを表示しているので二回乱数を発生させたことによる値の不一致が防げます。

それと、scanfを用いて入力する所です。
scanf("%d", a); と書いている所ですが scanf("%d", &a); です。「&」がありません。


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

Name: ユーリ  ..入門者(3,335ポイント)   Date: 2009/07/07(火) 00:07   No:36365 解決!     
Title: Re:質問です    
ありがとうございました。
解決いたしました。


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



Name: C言語はじめたばかりです。  ..ぴよぴよ(38ポイント)   Date: 2009/07/05(日) 18:44   No:36308       
Title: 情報取得の方法について    
こんにちは。

フォルダ内のフォルダ、ファイル一覧を、配列に格納するにはどうすれば良いんですか?
その際、サイズ、更新日時も取得したいです。

C言語の文法(ポインタ等)は理解したつもりですが、やりたいことが全然出来ず困っています。
参考になる本等あれば教えてください。

よろしくおねがいします。


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


Name: non  ..熟練のプログラマー(53,238ポイント)   Date: 2009/07/05(日) 19:52   No:36312     
Title: Re:情報取得の方法について    
環境がわからないと、答えられませんが、
Windowsなら、ここが参考になります。
http://msdn.microsoft.com/ja-jp/library/kda16keh.aspx


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

Name: C言語はじめたばかりです。  ..ぴよぴよ(231ポイント)   Date: 2009/07/06(月) 00:20   No:36324     
Title: Re:情報取得の方法について    
nonさま有難うございます。

ただ、実際に動かそうと思って、サンプルを実行してみたところ
main.cpp(14) : error C2065: 'intptr_t' : 定義されていない識別子です。
main.cpp(14) : error C2146: 構文エラー : ';' が、識別子 'hFile' の前に必要です。
main.cpp(14) : error C2065: 'hFile' : 定義されていない識別子です。
main.cpp(30) : error C2065: 'ctime_s' : 定義されていない識別子です。
main.cpp(30) : error C2065: '_countof' : 定義されていない識別子です。
main.cpp(36) : fatal error C1004: 予期せぬ EOF が検出されました。
サンプル自体を動かせないていれべるなので、もう少しアドバイスいただけますか?

環境はWindows XP SP3のVC++6.0です。


// crt_find.c
// This program uses the 32-bit _find functions to print
// a list of all files (and their attributes) with a .C extension
// in the current directory.

#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <time.h>

int main( void )
{
struct _finddata_t c_file;
intptr_t hFile;

// Find first .c file in current directory
if( (hFile = _findfirst( "*.c", &c_file )) == -1L )
printf( "No *.c files in current directory!\n" );
else
{
printf( "Listing of .c files\n\n" );
printf( "RDO HID SYS ARC FILE DATE %25c SIZE\n", ' ' );
printf( "--- --- --- --- ---- ---- %25c ----\n", ' ' );
do {
char buffer[30];
printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " );
ctime_s( buffer, _countof(buffer), &c_file.time_write );
printf( " %-12s %.24s %9ld\n",
c_file.name, buffer, c_file.size );
} while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}


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

Name: non  ..熟練のプログラマー(53,403ポイント)   Date: 2009/07/06(月) 09:06   No:36335     
Title: Re:情報取得の方法について    

#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <time.h>

int main( void )
{
struct _finddata_t c_file;
long hFile;

// Find first .c file in current directory
if( (hFile = _findfirst( "*.c", &c_file )) == -1L )
printf( "No *.c files in current directory!\n" );
else
{
printf( "Listing of .c files\n\n" );
printf( "RDO HID SYS ARC FILE DATE %25c SIZE\n", ' ' );
printf( "--- --- --- --- ---- ---- %25c ----\n", ' ' );
do {
char buffer[30];
printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " );
printf( " %-12s %.24s %9ld\n", c_file.name, ctime( &( c_file.time_write ) ),c_file.size );

} while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}
}



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

Name: toyo  ..プログラマー(36,973ポイント)   Date: 2009/07/06(月) 11:42   No:36339     
Title: Re:情報取得の方法について    
VC++のバージョンで関数の仕様が違うようです
古い方
http://msdn.microsoft.com/ja-jp/library/kda16keh%28VS.71%29.aspx



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

Name: C言語はじめたばかりです。  ..ぴよぴよ(256ポイント)   Date: 2009/07/06(月) 22:39   No:36359 解決!     
Title: Re:情報取得の方法について    
ありがとうございました。
とても助かりました。


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



Name:  ..上級者(19,853ポイント)   Date: 2009/07/05(日) 23:52   No:36320       
Title: 魔方陣を反時計周りに回す方法    
これが時計周りに回す方法
DrawRotaGraphFdF(boss.dx, boss.dy,
(0.4+0.05*sin(PI2/360*(count%360)))*3,
2*PI*(count%580)/580,
img_etc[5], TRUE);

これを反時計周りに回すにはどうやればいいんですか?


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


Name: 御津凪 [URL]  ..ハッカー(101,503ポイント)   Date: 2009/07/06(月) 00:00   No:36321     
Title: Re:魔方陣を反時計周りに回す方法    
count を減らしていくようにすれば反時計回りになります。

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

Name: array  ..熟練のプログラマー(50,598ポイント)   Date: 2009/07/06(月) 00:05   No:36322     
Title: Re:魔方陣を反時計周りに回す方法    
もしくは、*(-1)すれば反時計周りになるかもしれません。

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

Name:  ..上級者(19,859ポイント)   Date: 2009/07/06(月) 00:08   No:36323 解決!     
Title: Re:魔方陣を反時計周りに回す方法    
サンクス!

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

Name: Dixq (管理人) [URL]  ..ウィザード(1,041,226ポイント)   Date: 2009/07/06(月) 22:34   No:36358     
Title: Re:魔方陣を反時計周りに回す方法    
もっと簡単に書くと

2*PI*(count%580)/580...

-2*PI*(count%580)/580...
にすればいいと思います。
 


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



Name: ユーリ  ..かけだし(2,170ポイント)   Date: 2009/06/24(水) 10:18   No:35629       
Title: 無題    
0番目の配列要素にテストのテストの点数を初期設定してある配列がある。
int data[10][10]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}};
これを一番目の列要素に点数の高い順からの順位を格納するにはどういったふうにすればよろしいでしょうか?
ヒントをお願いします。


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


Name: ねこ  ..中級者(10,940ポイント)   Date: 2009/06/24(水) 10:21   No:35630     
Title: Re:無題    
「降順 ソート」で検索して下さい。

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

Name: ユーリ  ..かけだし(2,227ポイント)   Date: 2009/06/24(水) 11:09   No:35632     
Title: Re:無題    
結果を
点数 RANK
67 5
43 9
56 7
97 1
30 10
88 2
76  4
55 8
66 6
78 3
のよう表示したいのですがどうしたらいいですかね?


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

Name: non  ..熟練のプログラマー(49,914ポイント)   Date: 2009/06/24(水) 11:16   No:35633     
Title: Re:無題    
総当たりで点数を比較し、小さい方の順位を+1します。


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

Name: dic  ..上級者(24,821ポイント)   Date: 2009/06/24(水) 16:56   No:35647     
Title: Re:無題    
配列の数が決まってるので ねこさんのおっしゃるように
まず、得点順に並び替えて、そのあと順番に順位をつけていけばいいかと思います


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

Name: やそ  ..比類無きプログラマー(92,355ポイント)   Date: 2009/06/24(水) 20:36   No:35668     
Title: Re:無題    

番号 点数 順位
 0 67  1
 1 43  1
 2 56  1
 3 97  1
 4 30  1
 5 88  1
 6 76  1
 7 55  1
 8 66  1
 9 78  1

という点数の配列があって、点数の高い順にランキングしたいという意図はわかりました。
点数の並びは変えたくないということですね。
そうすると普通に点数をソートしてはいけないという罠なんでしょうか(笑)
順位として1が入っているというのがヒントになっているようです。

for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(data[i][0]<data[j][0])
{
data[i][1]++;
}
}
}

自分自身との比較もしているので無駄があるといえばあるのですが、できるだけシンプルにしてみたつもりです。
同じ点数がある場合など、詳細な検証はしていませんが、どうでしょう?


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

Name: やそ  ..比類無きプログラマー(92,571ポイント)   Date: 2009/06/24(水) 21:05   No:35675     
Title: Re:無題    
連投失礼^^;

【やそでもわか??る解説】
解説用に配列は縮小させてもらいました。

番号  点数 順位
やそ  67  1
ユーリ 43  1
aaa 56  1
bbb 97  1


やそくんは自分の点数が班のなかで何番目なのかとても気になりました。
班のメンバーの点数は貼り出されているので一目瞭然(笑)
上から順に見ていくと・・・
やそくんvsやそくん
 (って自分や〜ん!)順位はそのまま1位(笑)
やそくんvsユーリくん
 やそくんの勝ち!とりあえず1位^^
やそくんvsaaaくん(誰?)
 やそくんの勝ち!まだ何とか1位^^;
やそくんvsbbbくん(だから誰だってば!?)
 bbbくんの勝ち!やそくん1つ順位を下げて2位確定!

やそくんは余計なお世話で皆の順位を調べ始めた!!
ユーリくんvsやそくん
 やそくんの勝ち!ユーリくんの順位がひとつ下がった(ドラクエで呪いがかかった時のBGMで読もう!)
ユーリくんvsユーリくん
 (だから自分同士だってば)
ユーリくんvsaaaくん
 aaaくんの勝ち!ユーリくんの順位がひとつ下がった!!
ユーリくんvsbbbくん
 bbbくんの勝ち!ユーリくんの順位がひとつ下がった!!
ユーリくんは4位(最下位)に確定した!!





ってことを繰り返していくことで順位付けが出来ると思うんよ。



for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(data[i][0]<data[j][0]) //お互いの点数を比べるの♪
{
data[i][1]++; //点数が低かったら順位を下げるの。このバカチンが〜!!
}
}
}


余計わかりにくかったらゴメンナサイ^^;



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

Name: non  ..熟練のプログラマー(50,290ポイント)   Date: 2009/06/24(水) 21:51   No:35688     
Title: Re:無題    
比較回数を減らすなら

for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(data[i][0]<data[j][0]) //お互いの点数を比べるの♪
{
data[i][1]++; //点数が低かったら順位を下げるの。このバカチンが〜!!
}
if(data[i][0]>data[j][0]) //お互いの点数を比べるの♪
{
data[i][1]++; //点数が低かったら順位を下げるの。このバカチンが〜!!
}
}
}



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

Name: ユーリ  ..かけだし(2,481ポイント)   Date: 2009/06/30(火) 21:12   No:36010     
Title: Re:無題    

#include <stdio.h>

int main(void)
{
int data[10][2]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}};
int i,j;
for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(data[i][0]<data[j][0])
{
data[i][1]++;
}

if(data[i][0]>data[j][0])
{
data[i][1]++;

}
}
}


return 0;

}

どういった感じで表示すればいいのでしょうか?


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

Name: 初級者  ..初心者(6,257ポイント)   Date: 2009/06/30(火) 21:48   No:36012     
Title: Re:無題    
その二重ループで順位を正しくセットしているのであれば、
No.35632でご自身が提示されたように出力するためのループを組むだけですよ。
どこがわかりませんか?


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

Name: 山崎  ..上級者(16,926ポイント)   Date: 2009/06/30(火) 22:05   No:36014     
Title: Re:無題    
仮に規約に無いとしても、トピックには、何を尋ねたいのかわかるタイトルをつけることをお勧めしますよ。
きれいにタイトルをまとめるのが難しくても、努力してみることは必要です。
いつも無題のまま投稿なさいますね。

表示なら、printf関数を使うとよいでしょう。
テストの点と順位はint型変数に格納してありますから、printfの書式の中では%dをつかえば
整数型の値を表示することができます。

もう少し、何がわからないのか具体的に質問してみてはいかがでしょうかな。
やはり、教えてあげる側としてもそうしてくれると助かりますし、何よりやる気が出ますからね。
何をすればいいのか全くわからないのか、
printfで書式付の表示のやり方がわからないのか、
ソートのやり方がわからないのか、
はたまた、課題の答となるプログラムをただ書いてほしいだけなのか・・・。

プログラムの大まかな流れを示してほしいだけにしても、
「どのような流れにすればいいのか、指針を教えてください」なり書き込めると思います。
どこまではわかっているのか、それも示してくれるとなお助かります。


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

Name: ユーリ  ..かけだし(2,310ポイント)   Date: 2009/06/30(火) 22:10   No:36015     
Title: すいません    
No:35632のように表示したいのですが、どのようにしたらいいのかわかりません


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

Name: 初級者  ..初心者(6,284ポイント)   Date: 2009/06/30(火) 22:33   No:36017     
Title: Re:無題    
10人分の成績を出力したいので、10回まわるループを組む、ということはわかりますか?

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

Name: ユーリ  ..かけだし(2,319ポイント)   Date: 2009/06/30(火) 22:38   No:36018     
Title: Re:無題    
はい、わかります

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

Name: non  ..熟練のプログラマー(52,019ポイント)   Date: 2009/06/30(火) 23:09   No:36021     
Title: Re:無題    
前に投稿したときミスがありました。訂正してお詫びします。

for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(data[i][0]<data[j][0]) //お互いの点数を比べるの♪
{
data[i][1]++; //点数が低かったら順位を下げるの。このバカチンが〜!!
}
if(data[i][0]>data[j][0]) //お互いの点数を比べるの♪
{
data[j][1]++; //点数が低かったら順位を下げるの。このバカチンが〜!!
}
}
}


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

Name: 初級者  ..初心者(6,364ポイント)   Date: 2009/06/30(火) 23:14   No:36023     
Title: Re:無題    
その、10回まわるループで、

・0回目に出力したいデータは何ですか?
・1回目に出力したいデータは何ですか?

・9回目に出力したいデータは何ですか?


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

Name: ユーリ  ..かけだし(2,483ポイント)   Date: 2009/07/01(水) 09:25   No:36043     
Title: できれば・・・    

#include <stdio.h>

int main(void)
{
int data[10][2]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}};
int i,j;
for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(data[i][0]<data[j][0])
{
data[i][1]++;
}
if(data[i][0]>data[j][0])
{
data[j][1]++;
printf("%4d",data[i][j]);
}
}
}


printf("\n");
return 0;

}

何が違うのでしょうか?
できれば、解答をいただけるとうれしいです


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

Name: non  ..熟練のプログラマー(52,172ポイント)   Date: 2009/07/01(水) 09:51   No:36045     
Title: Re:できれば・・・    
ソートする部分と、表示する部分を分けて考えたらどうですか?
上のプログラムのforの2重ループはソートするためのものです。
これが終わった後に、
for文で出力する部分を作成します。


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

Name: 初級者  ..初心者(6,386ポイント)   Date: 2009/07/01(水) 09:56   No:36046     
Title: Re:無題    
自分で考えることに意味があると思います。

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

Name: やそ  ..比類無きプログラマー(93,195ポイント)   Date: 2009/07/01(水) 13:37   No:36053     
Title: Re:無題    
ユーリさんへ
私や皆さんの回答(ソースプログラム)は理解できましたでしょうか。

点数の順位付け(ランキング)の仕方がわかったら、今度はそれを表示しないことには
上手くできているのかわかりませんよね^^;

で、表示するタイミングとしては、ランキングが全て終わった後でいいでしょう。

main()
{
 ランキング処理

 表示処理
}


とすればいいです。
表示処理では
全員(10人)分表示するのですからループさせる必要があります。
forでもwhileでもよいです。

表示文はprintf()関数を使えばいいでしょう。
data[i][0]とdata[i][1]をスペースを空けて並べて表示して、改行。

がんばってね〜


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

Name: conio [URL]  ..プログラマー(25,359ポイント)   Date: 2009/07/01(水) 22:15   No:36074     
Title: Re:無題    

ソートはあくまでもソートなので、その中にprintf文を入れてしまうと
ソートの途中経過がズラーと表示されるだけになりますよ。

ソート終了後、添え字が0〜9までの得点とRankを表示するようにすれば問題ないかと。
配列の受け渡しなどすると分かりづらくなると思い、とりあえず二次元配列dataはグローバルにして
処理ごとに関数にしてみました。

なお、下記のShowData()は完成しておりません。
for文を使えば2行程度で記述できますので、頑張ってみてください。
(添え字が0〜9までの得点とRankを、順に表示する処理)
----------------------------------------------------------------------------------------
#include<stdio.h>

int data[10][2]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}};


void Rank(void)
{
for(int i = 0; i < 9; i++)
{
for(int j = i+1; j < 10; j++)
{
if(data[i][0] < data[j][0])
{
data[i][1]++;
}
if(data[i][0] > data[j][0])
{
data[j][1]++;
}
}
}
}

void ShowData(void)
{
//data[0]の得点を表示 Rankを表示
//data[1]の得点を表示 Rankを表示
//data[2]の得点を表示 Rankを表示
//data[3]の得点を表示 Rankを表示
//data[4]の得点を表示 Rankを表示
//data[5]の得点を表示 Rankを表示
//data[6]の得点を表示 Rankを表示
//data[7]の得点を表示 Rankを表示
//data[8]の得点を表示 Rankを表示
//data[9]の得点を表示 Rankを表示
}

int main(void)
{
Rank();
ShowData();

return(0);
}
----------------------------------------------------------------------------------------



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

Name: ユーリ  ..入門者(2,837ポイント)   Date: 2009/07/06(月) 17:34   No:36343     
Title: Re:無題    

#include <stdio.h>

int main(void)
{
int data[10][2]={{67,1},{43,1},{56,1},{97,1},{30,1},{88,1},{76,1},{55,1},{66,1},{78,1}};
int i,j,h;
for(i=0;i<9;i++)
{
for(j=i+1;j<10; j++)
{
if(data[i][0]<data[j][0])
{
data[i][1]++;
}
if(data[i][0]>data[j][0])
{
data[j][1]++;
}
}
}

for(h=0;h<10;h++){
printf("%d %d",data[i][0],data[i][1]);
printf("\n");
}
return 0;

}

こういうことでしょうか?
printf("%d %d",data[i][0],data[i][1]);
ここがいまいちわからないんですよね


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

Name: non  ..熟練のプログラマー(53,322ポイント)   Date: 2009/07/06(月) 17:41   No:36344     
Title: Re:無題    

for(h=0;h<10;h++){
printf("%d %d",data[i][0],data[i][1]);
printf("\n");
}

hをカウンタ変数として回しているのだから、配列のINDEXもhを使わなきゃ駄目よ。




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

Name: box  ..ハッカー(141,875ポイント)   Date: 2009/07/06(月) 17:42   No:36345     
Title: Re:無題    
> こういうことでしょうか?

ご自分のところで実行してみましたか?
思ったとおりの結果を得ましたか?


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

Name: ユーリ  ..入門者(2,866ポイント)   Date: 2009/07/06(月) 20:56   No:36353     
Title: Re:無題    
実行しましたが、思った通りの結果は得られませんでした

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

Name: ねこ  ..上級者(21,507ポイント)   Date: 2009/07/06(月) 22:05   No:36354     
Title: Re:無題    
>ユーリさん
なんでnonさんの書き込み無視?
ほぼ答えな回答してくれてると思うんですが。


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

Name: ユーリ  ..入門者(2,934ポイント)   Date: 2009/07/06(月) 22:21   No:36355 解決!     
Title: すいません    
もうしわけないです。
気づきませんでした
ありがとうございました。解決いたしました
長期に渡りみなさん本当にありがとうございました。


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



Name:  ..かけだし(1,142ポイント)   Date: 2009/07/06(月) 04:34   No:36332       
Title: visual studioおよびWindows関連の質問    
少し前にお世話になったものです。

規約にC言語以外の質問も可と記述されていたので質問したいのですが、

ここ最近PCでBlueScreen(STOP:0x0000007E)が発生するようになりました。

これまではなんともなかったんですがWindows.hがらみの関数

int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

をDxLib.hの関数と併用して使用した後visual studio起動中に発生するようになりました。

BlueScreenなんでデバイス関係を疑ったんですがここ最近新しいソフトウェアを導入していないし、これまでのデバイスも正常に起動しているので原因が全くわかりません。

わかっているのはBlueScreenが発生したときは常にvisual studioで上記のプログラムを編集しているときです。

教えてもらいたいのは作ったプログラムが原因でBlueScreenが発生することってあるのですか?


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


Name: 御津凪 [URL]  ..ハッカー(101,572ポイント)   Date: 2009/07/06(月) 10:08   No:36336     
Title: Re:visual studioおよびWindows関連の質問    
> 作ったプログラムが原因でBlueScreenが発生することってあるのですか?

あります。

私の場合、DirectX を使用しているときに、実行中、カメラの操作で視点と注視点を同じ座標(0.0)にしたときに発生しました。
(これはハードウェア的な問題かと思いますが)

あとは、他のプログラムと何らかの競合を起こしているか、(ウインルスとか)
PCの老朽化が考えられます。


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

Name: Mist  ..熟練のプログラマー(65,533ポイント)   Date: 2009/07/06(月) 10:12   No:36337     
Title: Re:visual studioおよびWindows関連の質問    
あるといえばあります。
APIにアプリケーションがアクセスしてはいけないアドレスを読み書きさせるようなプログラムを組めば起こせる場合があります。
ただ、今回は0x0000007Eということですのでドライバかハード(HDDとかメモリ)の故障が怪しいように思います。

参考
http://support.microsoft.com/kb/330182/ja​
http://support.microsoft.com/default.aspx/kb/321637/ja



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

Name:  ..かけだし(1,159ポイント)   Date: 2009/07/06(月) 19:48   No:36350 解決!     
Title: Re:visual studioおよびWindows関連の質問    
ご返答ありがとうございます。

参考にさせていただきます。


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



Name: 亀猫  ..かけだし(1,366ポイント)   Date: 2009/07/06(月) 19:07   No:36347       
Title: 起動時の警告    
こんにちは。今回はVC++2008を起動した時に発生した警告について質問があります。

今VC++2008を起動をしたらいきなり

「 IntelliSense データベースファイル (ファイルがある場所)を書き込み用に開けなかったため
IntelliSense 情報はVC++プロジェクトに利用できません。
ソリューション ディレクトリが読み取り専用である場合他の機能にも影響を及ぼします。」

と出てきました。一体なんなんでしょうか?
OK を押せば普通に出来るのですが、不安なので質問しました。




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


Name: 亀猫  ..かけだし(1,482ポイント)   Date: 2009/07/06(月) 19:12   No:36348 解決!     
Title: Re:起動時の警告    
すみません。自己解決しました・・・。

二つVC++2008を起動していたため表示されたようです。

ご迷惑おかけしました・・・。


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



Name: 迷える羊  ..初心者(5,041ポイント)   Date: 2009/07/06(月) 00:34   No:36326       
Title: 3D背景を作ってみよう.3について    
いつもお世話になっております.

今回3D背景に構造体,ポインタを使わずにクラスだけで挑戦してみました.
3D背景を作ってみよう.3では,「手前にあるものを描いた後で、奥にあるものを書いてしまうとおかしなことになってしまいます。そこで常にZでソートする必要があります。」とあるのですが,Zでソートするというのはどういう仕組みなのかはっきりと理解できないでいます.
また,SwapObChild関数では構造体とポインタを使わない場合,何を入れ替えればよいのか分からないです.ソートの仕組みが分かっていないので,入れ替えるものも分からないですかね...
構造体とポインタを使わない場合は多数の変数を入れ替える必要があるのは覚悟しています.
入れ替える必要のある変数を明示していただければ幸いです.

void SwapObChild(ObChild_t *Ob1,ObChild_t *Ob2){
ObChild_t t = *Ob1;
*Ob1 = *Ob2;
*Ob2 = t;
}

void SortObject(){
int i,j,t;
for(t=0; t<ObjectNum; t++){
for (i = 0; i < Object[t].ObchindMax ; i++) {
for (j = i + 1; j < Object[t].ObchindMax ; j++) {
if ( Object[t].ObChild[i].z < Object[t].ObChild[j].z ) {
SwapObChild( &Object[t].ObChild[i], &Object[t].ObChild[j] );
}
}
}
}
}


もう一つは,

DrawPolygon3D( Object[t].ObChild[s].Vertex, 2, Object[t].Img, TRUE ) ;

ですが,やはりこの一番目の引数には必ず

struct VERTEX_3D
{
  VECTOR pos ;
  unsigned char b, g, r, a ;
  float u, v ;
} ;

struct VECTOR
{
  float x, y, z ;
} ;

という構造体を使用しなければなりませんか?


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


Name: ねこ  ..上級者(21,468ポイント)   Date: 2009/07/06(月) 00:44   No:36327     
Title: Re:3D背景を作ってみよう.3について    
<Zでソートするというのはどういう仕組みなのかはっきりと理解できないでいます.
例えばX座標で考えると「20,30,0,10」という座標を持つオブジェクトが4つあります。これを左にある順に表示します。
と考えると「0,10,20,30」に並び変えて表示するというのは分かりますよね?
これをZ軸でやっています。

<入れ替え
Object変数は確かグローバルだったのでこういう指定もできますよ。

void SwapObChild( int obj_idx, int idx1, int idx2 ) {
ObChild_t t = Object[ obj_idx ].ObChild[ idx1 ];
Object[ obj_idx ].ObChild[ idx1 ] = Object[ obj_idx ].ObChild[ idx2 ];
Object[ obj_idx ].ObChild[ idx2 ] = t;
}

呼び出し側:SwapObChild( t, i, j );

<DrawPolygon3D
DrawPolygon3D関数を呼ぶ関数を別途用意してそこでVERTEX_3Dデータ作成するという手法はあると思います。


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

Name: 迷える羊  ..初心者(5,076ポイント)   Date: 2009/07/06(月) 01:13   No:36329     
Title: Re:3D背景を作ってみよう.3について    
さっそくの返信ありがとうございます.
お教えいただいた方法をもとに挑戦してみます.


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

Name: 迷える羊  ..初心者(5,098ポイント)   Date: 2009/07/06(月) 17:59   No:36346 解決!     
Title: Re:3D背景を作ってみよう.3について    
うまく表現することができました.
お助けいただき感謝しています.


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



Name: dic  ..プログラマー(27,409ポイント)   Date: 2009/07/05(日) 21:42   No:36314       
Title: 基本は完成したのですが・・・    
前回に公開したものを改良し
シューティングの基本設計図はできたのですが、色々考えるところもあり、
また公開してみます
なんというか、設計に答えがないもので、これでいくと決めかねているところであり
ここはこうした方がいいとか、これはやめた方がいいとか意見を聞いてみたいです

これをもとに作っていきますが、変更などあるかもしれないし
優柔不断なもので、いまいち決め手が欠けてるところです


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


Name: ねこ  ..上級者(21,155ポイント)   Date: 2009/07/05(日) 22:35   No:36315     
Title: Re:基本は完成したのですが・・・    
基本的なシューティングの設計としては申し分無いと思いますよ。
今後ゲーム自体のオリジナリティによって色々派生していくと思います。

個人的にですが、CBulletのMove()にくっつく形としてMoveクラス系を加えると変則的な動作は書きやすいと思いますよ。
僕の場合「MoveUtil」という基底クラスを「MoveStraight」「MoveCurve」等で継承して
ShotクラスにMoveUtil* m_pArrMove[10]という配列に保持しています。
イメージとしてはこれらの移動クラスに現在の座標をポインタで渡すと1フレームの移動分値を加算する関数を用意する感じですね。
150フレームはMoveStraight,150以降はMoveCurveというように使い分けると逐一そういう動作をするショットクラスを作らなくても打つ側の組み込みで完結する事が出来ます。
シューティングゲームは弾幕にそれなりの労力がかかるため、ショット周りの手間は可能な限り簡略する事が効率向上になります。

後はサウンド、特にSE関連でしょうか。
読み込んだサウンドハンドルを保持して、どこからでも呼べるクラス関数を用意して
1フレームに何度も呼ばれた時の挙動やボリューム等管理するクラスが1個あると重複して大音量になったり
重なると変に聞こえる音をクラス側で対処出来たりある程度便利です。

1作目には必要ないと思いますが、Enemy系にはEnemyBase⇒Enemy⇒Enemy1というような継承をしておくと次の時便利かもしれません。
というのも例えば体力や自機への参照等、シューティングを作る上では絶対必要だろうって要素はいくつかあると思います。
設計によって異なるのでどれとは言えないのですが、EnemyBaseで基本的なパラメータとSetter/Getter作っておくだけでもEnemyでの記述も少なくなり、見やすくなると思いますよ。


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

Name: DVDM [URL]  ..ぴよぴよ(363ポイント)   Date: 2009/07/06(月) 01:51   No:36330     
Title: Re:基本は完成したのですが・・・    
>>dicさん
良く解らない時は、今の案で一端作ってみては如何でしょう。
そのクラスを使っていくとどこかしらで使いにくくなってくるかもしれません。
その時、より良い設計にするにはどうすればよいか・・・を考えていけばいいと思います。
(私はそういうスタイルでクラスを作成しています)

CStageクラスの中に draw, move 等ありますが、画面遷移のみを担当するようにしてみてはどうでしょう。
描画は別のクラスにお任せすると良さそうな気がします。

インプット関連もクラス化してしまうと次に使う時に非常に便利かなぁ〜と思います。


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

Name: dic  ..プログラマー(27,454ポイント)   Date: 2009/07/06(月) 17:31   No:36342 解決!     
Title: Re:基本は完成したのですが・・・    
>ねこさん DVDMさん
なるほど、一回作って見た方がいいのでしょうか
アドバイスありがとうございます


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



Name: 山崎  ..上級者(17,232ポイント)   Date: 2009/07/05(日) 18:27   No:36304       
Title: 静的メンバを各クラス独自のものとして継承したい    
毎度お世話になっております、山崎です。
今回は、静的メンバの継承についてお伺いに参りました。

現在、敵キャラクラスを作っております。
敵に共通したメンバやメソッドをEnemyクラスにまとめ親クラスとし、
それを継承した子クラスが個々の敵キャラとなるように作っております。

全ての敵キャラのインスタンスが同じグラフィックの領域を確保する必要も無いので、
子クラスの静的メンバにグラフィックの領域を確保し、共有させようと考えています。
そこで、親クラスのグラフィック用の静的メンバを継承させ、
各子クラスにもクラス別の静的メンバを持たせようと思ったのですが、
親クラスを継承した全ての子クラスで共有のメンバになってしまいます。

わかりにくいかもしれないので、以下に例を貼り付けます。
StaticMemberを、Parentを継承した各Childクラスに一つずつ持たせたいのですが、そうなりません。


#include <stdio.h>

class Parent
{
public:
static short StaticMember;

Parent()
{
printf("P StaticMember = %hd\n",StaticMember);
}

void PrintMember()
{
printf("StaticMember = %hd\n",StaticMember);
}
};
short Parent::StaticMember=1;

class Child1:public Parent
{
public:
Child1()
{
StaticMember=StaticMember+10;
printf("C1 StaticMember = %hd\n",StaticMember);
}
};

class Child2:public Parent
{
public:
Child2()
{
StaticMember=StaticMember+100;
printf("C2 StaticMember = %hd\n",StaticMember);
}
};

int main()
{
Parent PIns;
Child1 C1Ins1,C1Ins2;
Child2 C2Ins1,C2Ins2;

PIns.PrintMember(); // 1 になってほしい
C1Ins1.PrintMember(); // 21 になってほしい
C1Ins2.PrintMember(); // 21 になってほしい
C2Ins1.PrintMember(); // 201 になってほしい
C2Ins2.PrintMember(); // 201 になってほしい

return 0;
}


------------------------------実行結果----------------------------------------
P StaticMember = 1
P StaticMember = 1
C1 StaticMember = 11
P StaticMember = 11
C1 StaticMember = 21
P StaticMember = 21
C2 StaticMember = 121
P StaticMember = 121
C2 StaticMember = 221
StaticMember = 221
StaticMember = 221
StaticMember = 221
StaticMember = 221
StaticMember = 221
------------------------------実行結果ここまで----------------------------------

静的メンバを、親クラスのメンバとは別のものとして継承する方法はあるのでしょうか?
それとも、静的メンバは継承した全ての子クラスで必ず共有しなければならないのでしょうか。

やはり、面倒がらずに各子クラスでも静的メンバを宣言しなければいけないのでしょうか。


1,067ポイント を落としてしまった。


Name: たかぎ [URL]  ..ハッカー(106,759ポイント)   Date: 2009/07/05(日) 18:34   No:36306     
Title: Re:静的メンバを各クラス独自のものとして継承したい    
> やはり、面倒がらずに各子クラスでも静的メンバを宣言しなければいけないのでしょうか。

そういうことです。
継承はコーディングの手間を省くためのものではありません。


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

Name: 山崎  ..上級者(17,330ポイント)   Date: 2009/07/05(日) 18:39   No:36307 解決!     
Title: Re:静的メンバを各クラス独自のものとして継承したい    
>たかぎさん
とっても早いご返答、ありがとうございます。
やはり子クラスでも宣言しなければいけないのですか…。

いつの間にか、継承はコーディングの手間を省くためのものだと思うようになってました。


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

Name: Justy  ..伝説なるハッカー(388,162ポイント)   Date: 2009/07/05(日) 23:21   No:36318     
Title: Re:静的メンバを各クラス独自のものとして継承したい    

>静的メンバを、親クラスのメンバとは別のものとして継承する方法はあるのでしょうか?

 妥当かどうかは置いておくとして、言語的には

template <class T>
class THogeHoge
{
protected:
    static short StaticMember;
};

template <class T>
short THogeHoge<T>::StaticMember;

class Child1 : public Parent, public THogeHoge<Child1>
{
...
};
class Child2 : public Parent, public THogeHoge<Child2>
{
...
};

とか

template <class T>
class THogeHoge : public Parent
{
protected:
    static short StaticMember;
};

template <class T>
short THogeHoge<T>::StaticMember;

class Child1 : public THogeHoge<Child1>
{
...
};
class Child2 : public THogeHoge<Child2>
{
...
};

という方法があります。


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

Name: 山崎  ..上級者(17,389ポイント)   Date: 2009/07/06(月) 07:44   No:36334     
Title: Re:静的メンバを各クラス独自のものとして継承したい    
>Justyさん
ご返信誠にありがとうございます。
なるほど、テンプレートを使うのですね…。
今まで一度もテンプレートを使ったことが無いので、非常に勉強になりました。
是非とも参考にさせていただきます。


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



Name: ぬこ  ..かけだし(1,445ポイント)   Date: 2009/07/04(土) 00:37   No:36204       
Title: TCPとUDP どっちがいいのでしょ?    
こんばんは〜。
ネットワーク対戦できるゲームが作ってみたいなぁっと思いwinsockを勉強中な日々をすごしてる者なのですが、
ちょっとした疑問がでてきたので聞いてください。

TCPとUDPについては勉強したのですが、格闘ゲームの場合ネットワーク対戦機能を追加するならばどっちのほうがいいでしょうか?
ほぼリアルタイムに動かしたいのでUDPをつかったほうがいいと思うのですが、パケットがロストすることがあるってのがひっかかります。
結構シビアなコマンド入力が求められる格闘ゲームの場合は、致命的な気がするのですが・・・、
回線状況にもよると思いますがどの程度ロストって起こるものなのでしょう?
わかるかたは参考までにおしえてくださるとうれしいです。
いっそTCPでいいかなっとも思うのですが、できれば複数人接続できるようにしたいなぁっと思ってます。
複数人と接続する場合は同時に送信できないTCPだとラグがすごそうな気がします。
どっちが向いてるか参考までに意見をお聞かせください。

〜蛇足〜
今は「WinSock2.0プログラミング」って書籍を参考にしているのですが、他にオススメの参考書とかありましたら紹介していただけるとうれしいです。これいい本なのですが借り物なので返さないといけないんですよねぇorz
とりよせようにも古い本らしく近場では在庫なくて取り寄せられないんです><


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


Name: Justy  ..伝説なるハッカー(387,678ポイント)   Date: 2009/07/05(日) 01:38   No:36278     
Title: Re:TCPとUDP どっちがいいのでしょ?    
 そんなに詳しいわけではないですが。


>どっちのほうがいいでしょうか?

 どっちかと言われれば UDPじゃないでしょうか。

 TCPは相手に届いたかどうかを確認したり、届かなければ再送処理を行ったりと
処理負荷が高くレイテンシーも上がる傾向があります。

 リアルタイム性が重視される格闘ゲームなら、そういう状況になるよりかは、
余計なことはしない UDPの方が向いていると思います。



>結構シビアなコマンド入力が求められる格闘ゲームの場合は、致命的な気がするのですが・

 元々リアルタイム性と正確な描画の両方を高い精度で要求する格闘ゲームは
あまりネットワークゲームには向かないと思うのですが、ある程度ロストしても
相手の動きを予測して描画して後でつじつまを合わせたり、
うまくゲームの仕様的に視覚でタイミングをとらなくてもいいようなゲームにするなどで
ある程度回避できるのではないでしょうか。



>程度ロストって起こるものなのでしょう?

 まさに回線と状況次第としか言いようがないのですが、
ごく普通の家庭内にある有線による同一 LAN内で、ごく普通の使い方しかしていない
機器が数台程度しか繋がっていないのであれば、適度にパケットを送りつける分には
まぁほとんど発生しないと思っていいと思いますよ。

 とはいえ、そういう環境で動かしたゲームが短時間のうちに大量のパケットを
送りつけてた結果、ポロポロとロストすることはありえますが……。


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

Name: ベリ工  ..かけだし(2,299ポイント)   Date: 2009/07/05(日) 11:41   No:36293     
Title: Re:TCPとUDP どっちがいいのでしょ?    
#回答ではないです。私の経験論を・・・

昔、私もソケットを用いてネットワークプログラミングを行った事があります。
UDPは確かにパケットがロストする可能性がある為、パケット投げっぱなしが基本
なので、良くストリーミング動画再生などに使われたりしますよね。
一方TCPは相手先に確実にパケットが送信される事が保証されているので
パケットロスは基本的に無いと思ってもらって差し支えないでしょう。

>格闘ゲームの場合ネットワーク対戦機能を追加するならばどっちのほうがいいでしょうか?
格闘ゲームですか・・・どっちが良いかを判断するのは難しいですね。私は昔、
ぷよぷよみたいな落ちゲーをネットワークゲームにした事あります。
その時はTCPで作成しました。また、WEBカメラの映像をネットワークで
別端末に表示するネットワークプログラムも作成しましたが、その際もTCPでしたね。
理由は両者共にパケットロスが許されない仕様でしたから・・・。

さて、その実行速度は両者共にほぼリアルタイムに実行できました。
ゲームはまさにリアルタイムネットワーク対戦でき、WEBカメラ映像は
別端末からリアルタイムに映像が送信されているとは思えないくらい
表示されました。但し、インターネット経由ではなく、ローカルLAN環境
でしたのでインターネット経由だとほぼ間違いなく遅くなる可能性は大ですが。

リアルタイム性を追求する為、アプリケーション側でもそれなりの高速化を
ゲームでもWEBカメラの場合でも実装しました。

ゲームの場合では
画像、音声データは送信しない。ゲームの今現在の状況データ(自分仕様のテキストデータ)のみ
送信する。画像、音声データはサイズが大きい為、これをそのまま送信するとリアルタイム性が
極端に落ち、ネットワークに負荷を掛けるだけです。画像、音声データは相手先の端末にも
同じゲームがインストールされているはずなので既に相手先に存在しているからです。

WEBカメラの場合は画像、場合によっては音声データそのもを送信せざるを得ません。
ではどうするかと言うと当然圧縮送信させます。圧縮解凍のプログラミングは
ネット上で探せばそれなりに見つかりますが、大抵はファイルIOを伴います。
ファイルIOで行うと処理が重くなるのでリアルタイム性が下がります。
なので圧縮解凍アルゴリズムはzipやlzh等の有名アルゴリズムをそのまま利用し、
ファイルIOが伴わない(メモリ上で圧縮解凍する)様に自分でそれを改造しましたね。

後は共通的な処理として別途サーバを儲け、受信プログラムをサーバプログラムにして各端末に
ブロードキャスト配信しました。複数端末から一斉に送信されると受信側はどの端末の何番目の
パケットか常に判断をしないといけません(TCPは送信順も保証されていた気がしますが、念の為に
判断してました)。これをクライアント端末に行わせるのは現実的でありません。なので、
パケットの仕様としてパケット内にヘッダ部とデータ部を設けて、受信時にヘッダ部を見てどの端末の
何番目か判断し、そしてそれをどんどん繋げて最終的に一つのバイナリデータが完成したら
各クライアントに送信する様にしていました。
それを受信したクライアント端末はメモリ上で解凍し、ゲームであればバックサーフェース(裏画面)に
描画し、WEBカメラであればビットマップハンドルを生成して画面に表示していましたね。

結論から言うと、ネットワークプログラミングは非常に大変です。いろいろな事を考えないといけませんから。
ゲームであればDirectX9(8だったかも)にDirectPlayというAPIが用意されていますので
それを使うのも手かもしれません。

長々と語ってしまいましたが、単なる私の経験論なので別にそうする必要は無いですよ。


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

Name: ぬこ  ..かけだし(1,815ポイント)   Date: 2009/07/06(月) 00:49   No:36328 解決!     
Title: Re:TCPとUDP どっちがいいのでしょ?    
Justyさん、ベリ工さんご回答ありがとうございました。

やはりどちらかというとUDPなんですね。
ロストすると聞いて不安になっていたのですがUDPでやってみよーと思います。
ロストしても 相手の動きを予測して後でつじつまを合わせたりなど、といった方法は思いつきもしなかったです。
目から鱗という感じで勉強になりました。色々方法はあるんですねぇ。


経験論、非常ためになりました。
私はまだネットワークプログラミングはカンタンなものしか行ったことがないので、
参考になります。ネットワークプログラミングはやっぱり大変そうですね・・・
試行錯誤された方の意見は説得力が違うなぁと感じました。
DirectPlayってのも調べてきました。ロビーのシステムなどこれはなかなか便利そうですね。
こっちにも興味がわいてきました。

少しでもわからないことやこのままでいいのか不安になると作業が滞ってしまう悪い癖があるのですが、
案ずるよりうむが安しってことでとりあえずプログラム組んでみて失敗してきます〜。
そのほうが時間はかかってもより詳しく理解できそうだし、なんだかやる気でてきたのでがんばってきます。
お二方ともありがとうございました〜。


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



Name: めーりん  ..ぴよぴよ(13ポイント)   Date: 2009/07/05(日) 22:40   No:36316       
Title: プロジェクトがダウンロードできません・・・    
はじめまして。めーりんと申します。
龍神碌プログラミングの館でプロジェクトの一括ダウンロードをしたのですが、保存した後フォルダを展開しようとすると、「フォルダは空なのでファイルを入れないと開けません」、というようなエラーメッセージが出てしまい、フォルダが開けません。
何度か一括ダウンロードをし直してみたのですが、駄目でした。
保存が駄目ならと、ダウンロードの際フォルダを開こうとしても、「このフォルダは無効です」のようなエラーメッセージがでてしまい開けませんでした。
旧シューティングゲームの館の第33章までの一括ダウンロードは出来たのですが・・・
これは私のPCの設定とかがおかしいのでしょうか・・・。
プログラミング以前の質問ですみません。
解決法があれば、回答のほうよろしくお願いします。


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


Name: ねこ  ..上級者(21,174ポイント)   Date: 2009/07/05(日) 23:05   No:36317     
Title: Re:プロジェクトがダウンロードできません・・・    
ブラウザを変えると落とせたという情報が過去にありました。
FireFox等を使って試してはどうでしょう?


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

Name: めーりん  ..ぴよぴよ(78ポイント)   Date: 2009/07/05(日) 23:32   No:36319 解決!     
Title: できました!!    
ねこさんのおっしゃった通り、Firefoxをインストールして実行しましたら正常に開きました!

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


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



Name:  ..ぴよぴよ(89ポイント)   Date: 2009/07/05(日) 17:42   No:36302       
Title: プログラムの著作権について    
龍神録について重要なことです。
改造龍神録のプログラムを主に利用して作ったゲームかつ
配布している画像や音楽は一切使わずオリジナルで作ったものであった場合

copyright (C) 200X 著者名 All rights reserved.

↑これをゲーム内に表示してもおkですか?それともだめですか?


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,041,112ポイント)   Date: 2009/07/05(日) 17:50   No:36303     
Title: Re:プログラムの著作権について    
(C)さん、龍神録をご覧下さりありがとうございます。

著作権表示につきまして、プログラムコードを公開されるわけではなさそうですし、
画像も音楽も全てオリジナルということなら、表面上全く龍神録と関係ないので、全く構いません。

また、こちらは細かい事は特に言いませんので、好きに使って下さい。


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

Name:  ..ぴよぴよ(103ポイント)   Date: 2009/07/05(日) 19:34   No:36311 解決!     
Title: Re:プログラムの著作権について    
分かりました。早急なご返答ありがとうございます

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



Name: 西  ..入門者(2,647ポイント)   Date: 2009/06/29(月) 00:18   No:35954       
Title: ファイルの書き出し VC++    
VisualStadio2005AE
XP 詳しくわからないのですがVC++?

テキストボックスに書かれている内容を書き出したいのですが
どのようにすればよいのでしょうか?
現在コメント(※1)になっているところに処理を入れようとしておりま。
困っているのはテキストボックスの情報をどうやって取ってくるかということです、

※1 //write->WriteLine(this->textBox1->

どうかよろしくお願いします。

ファイルの書き出し VC++



#pragma once


namespace Memo {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO;


/// <summary>
/// Form1 の概要
///
/// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
/// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
/// 変更する必要があります。この変更を行わないと、
/// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
/// 正しく相互に利用できなくなります。
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//
}

protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::TabControl^ tabControl1;
protected:
private: System::Windows::Forms::TabPage^ tabPage1;
private: System::Windows::Forms::TabPage^ tabPage2;
private: System::Windows::Forms::TabPage^ tabPage3;
private: System::Windows::Forms::TabPage^ tabPage4;
private: System::Windows::Forms::TextBox^ textBox1;
private: System::Windows::Forms::MenuStrip^ menuStrip1;
private: System::Windows::Forms::ToolStripMenuItem^ menuFile;
private: System::Windows::Forms::ToolStripMenuItem^ menuOpen;
private: System::Windows::Forms::ToolStripMenuItem^ menuAsSave;

private:
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
void InitializeComponent(void)
{

//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(1, 6);
this->textBox1->Multiline = true;
this->textBox1->Name = L"textBox1";
this->textBox1->Size = System::Drawing::Size(628, 414);
this->textBox1->TabIndex = 0;

//
// menuStrip1
//
this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(1) {this->menuFile});
this->menuStrip1->Location = System::Drawing::Point(0, 0);
this->menuStrip1->Name = L"menuStrip1";
this->menuStrip1->Size = System::Drawing::Size(640, 24);
this->menuStrip1->TabIndex = 1;
this->menuStrip1->Text = L"menuStrip1";
//
// menuFile
//
this->menuFile->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(2) {this->menuOpen, this->menuAsSave});
this->menuFile->Name = L"menuFile";
this->menuFile->Size = System::Drawing::Size(51, 20);
this->menuFile->Text = L"ファイル";
//////////略

//
// menuOpen
//
this->menuOpen->Name = L"menuOpen";
this->menuOpen->Size = System::Drawing::Size(152, 22);
this->menuOpen->Text = L"開く";
//
// menuAsSave
//
this->menuAsSave->Name = L"menuAsSave";
this->menuAsSave->Size = System::Drawing::Size(152, 22);
this->menuAsSave->Text = L"上書き保存";
this->menuAsSave->Click += gcnew System::EventHandler(this, &Form1::menuAsSave_Click);
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(640, 480);
this->Controls->Add(this->tabControl1);
this->Controls->Add(this->menuStrip1);
this->MainMenuStrip = this->menuStrip1;
this->Name = L"Form1";
this->Text = L"Form1";
this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
this->tabControl1->ResumeLayout(false);
this->tabPage1->ResumeLayout(false);
this->tabPage1->PerformLayout();
this->menuStrip1->ResumeLayout(false);
this->menuStrip1->PerformLayout();
this->ResumeLayout(false);
this->PerformLayout();

}
#pragma endregion
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void menuAsSave_Click(System::Object^ sender, System::EventArgs^ e) {
StreamWriter^ write = gcnew StreamWriter("text_01.txt");
//write->WriteLine("aaa");
//write->WriteLine(this->textBox1->
write->Close();
MessageBox::Show("ファイルに書き込みました");
}
};
}




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


Name: pooka [URL]  ..初心者(8,053ポイント)   Date: 2009/06/29(月) 00:36   No:35955     
Title: Re:ファイルの書き出し VC++    
詳しくありませんがtextBox1->Textでいけませんか?

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

Name: 西  ..入門者(2,778ポイント)   Date: 2009/06/29(月) 21:56   No:35975     
Title: Re:ファイルの書き出し VC++    
できました><
ありがとうございます。

ただただ先ほど気づいた問題点が1つあります。
ウインドウ上部をダブルクリックすると最大化するじゃないですか?
でもサイズ変えたからってテキストボックスとかのサイズが変わってくれないんです・・・。
当たり前なんですけど・・・

System::Drawing::Size(628, 414);

とかを直接値をいじらないといけないのでしょうか?
何か良い方法はないでしょうか?


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

Name: バグ  ..ハッカー(160,467ポイント)   Date: 2009/06/29(月) 22:45   No:35976     
Title: Re:ファイルの書き出し VC++    
Anchorというプロパティを変更してやれば、フォームサイズの変更に合わせて変わってくれますよ。

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

Name: 西  ..入門者(3,276ポイント)   Date: 2009/06/30(火) 23:49   No:36025     
Title: Re:ファイルの書き出し VC++    
バグ様できました><
ありがとうございます。
またまた質問で申し訳ありません・・・

いろんなサイトを見ながら作っているのですが自分では解決できなかったので
再度質問させていただきます。

大方の処理はできたのですが読み込み?(開く)のファイル名を指定する場合
.txtファイルを呼ぶと文字化けしてしまいます。
また dlg->Filter = "すべてのファイル(*.*)|*.*";
の最後の*.*を.txtに変えてもテキストのみの読み込み指定?ができませn・・・

どのようにすればよいのでしょうか?




OpenFileDialog^ dlg = gcnew OpenFileDialog();
dlg->Filter = "すべてのファイル(*.*)|*.*";
if(dlg->ShowDialog() != System::Windows::Forms::DialogResult::OK){
return;
}
//this->textBox1->Text = dlg->FileName;

StreamReader^ reader = gcnew StreamReader(dlg->FileName);
this->textBox1->Text = reader->ReadLine();
reader->Close();
MessageBox::Show("ファイルに読み込みました");


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

Name: pooka [URL]  ..初心者(8,423ポイント)   Date: 2009/07/01(水) 01:29   No:36034     
Title: Re:ファイルの書き出し VC++    
>.txtファイルを呼ぶと文字化けしてしまいます。
Shift-JISなら
StreamReader^ reader = gcnew StreamReader(dlg->FileName,System::Text::Encoding::GetEncoding(932));
こんなかんじでいけると思います。

>また dlg->Filter = "すべてのファイル(*.*)|*.*";の最後の*.*を.txtに変えてもテキストのみの読み込み指定?ができませn・・・
こちらはちょっとわかりません。
dlg->Filter = L"テキストファイル(*.txt)|*.txt";
のようにすれば、ダイアログを表示したとき、
テキストファイルだけ表示されると思うのですが、それとは違うのでしょうか?


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

Name: 西  ..入門者(3,444ポイント)   Date: 2009/07/01(水) 21:27   No:36070     
Title: Re:ファイルの書き出し VC++    
ご回答ありがとうございます。

dlg->Filter = L"テキストファイル(*.txt)|*.txt";

でいけました・・・。
dlg->Filter = L"テキストファイル(*.txt)|.txt"
こう書いておりました・・・。

StreamReader^ reader = gcnew StreamReader(dlg->FileName,System::Text::Encoding::GetEncoding(932));
については一応読み込めたのですが1行だけしか見ることができません・・・どうすればよいでしょうか?


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

Name: pooka [URL]  ..初心者(8,493ポイント)   Date: 2009/07/01(水) 21:34   No:36071     
Title: Re:ファイルの書き出し VC++    
>this->textBox1->Text = reader->ReadLine();

this->textBox1->Text = reader->ReadToEnd();
これで最後まで読み込めると思いますよ^^


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

Name: 西  ..入門者(3,623ポイント)   Date: 2009/07/02(木) 20:41   No:36136     
Title: Re:ファイルの書き出し VC++    
pooka様

問題なくできました。


今回初めてVCを触ったのでとっつきにくいところがかなりありますが頑張ります。

現在
this->textBox1->Text
の文字数を取得する
というところで戸惑っております。

こちらに関してはstrlenみたいな関数はないのでしょうか?
this->textBox1->Text->に Length というものがあったので
これをどうにかして使うのでしょうか?




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

Name: pooka [URL]  ..初心者(8,657ポイント)   Date: 2009/07/02(木) 21:17   No:36137     
Title: Re:ファイルの書き出し VC++    
Lengthで文字数を取得することができます。
this->textBox1->Text->Length
でOKです。


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

Name: バグ  ..ハッカー(161,561ポイント)   Date: 2009/07/02(木) 21:43   No:36139     
Title: Re:ファイルの書き出し VC++    
.NETライブラリは慣れると便利なことこのうえないですよ(^-^)
ただし、欲しい機能がほとんど揃っているので、自分で組もうとする意欲が削がれるのが難点といえば難点です(笑)


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

Name: 西  ..入門者(3,366ポイント)   Date: 2009/07/02(木) 21:50   No:36141     
Title: Re:ファイルの書き出し VC++    
文字カウントのPGを作っております。

pooka様それだと型の問題でテキストに入れることができませんでした。
下記のようにキャストをしてみたのですが無理みたいです。
どのようにすればよろしいのでしょうか?
this->label1->Text = (String ^)this->textBox1->Text->Length;

また
this->label1->Text = "文字 = ";
~処理
this->label1->Text = "文字 = ○"; //丸には文字数が入ります。
にしたいです。

ただこれを表示することに問題がありまして、今までゲームを作ってきた関係で
アプリケーションで常に値をかえるのにどこでwhileを書くか迷っております。

一層、ボタンを作って押したときにだけ表示させようかなとも思っております。
こちらについては
MessageBox::Show("文字数 = %d","確認");
みたいにできないのでしょうか?

質問ばかりで本当にすみません。



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

Name: pooka [URL]  ..初心者(8,827ポイント)   Date: 2009/07/02(木) 22:09   No:36147     
Title: Re:ファイルの書き出し VC++    
とりあえず
>型の問題でテキストに入れることができませんでした。
textBox1->Text->Length.ToString()
としてみてください。

>this->label1->Text = "文字 = ";
>~処理
>this->label1->Text = "文字 = ○"; //丸には文字数が入ります。
>にしたいです。
例えば
this->label1->Text = "文字 = ";
こうあったとすると
this->label1->Text += this->textBox1->Text->Length.ToString();
とすれば文字 = ○のように表示できるかと。

>>バグさん
>ただし、欲しい機能がほとんど揃っているので、自分で組もうとする意欲が削がれるのが難点といえば難点です(笑)
私はC#でやっていて、たいしたものは作れませんけど分かるようなきがします^^;


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

Name: バグ  ..ハッカー(161,532ポイント)   Date: 2009/07/02(木) 22:38   No:36150     
Title: Re:ファイルの書き出し VC++    
書式指定ならば、String.Formatを使うといいですよ(o^-')b

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

Name: pooka [URL]  ..中級者(9,042ポイント)   Date: 2009/07/03(金) 01:31   No:36160     
Title: Re:ファイルの書き出し VC++    
ちょっと作ってみました。(間違ってる可能性がありますが)
やりたいことと違ってたらごめんなさいm(_ _)m
私はVisualStudio2008 PEで作ってるので、2005で開けるように直したつもりですが、開けないかもしれません…

>ただこれを表示することに問題がありまして、今までゲームを作ってきた関係で
>アプリケーションで常に値をかえるのにどこでwhileを書くか迷っております。
おそらくテキストボックスで文章を書いたりしたとき、文字数の表示も一緒に変化させたいのかなと思ったので、
テキストボックスのTextChangedというイベントを使いました。

あとString::Format使ったことなかったので使ってみました。



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

Name: 西  ..入門者(3,550ポイント)   Date: 2009/07/04(土) 14:57   No:36231     
Title: Re:ファイルの書き出し VC++    
>>バグさん、pookaさん
返信ありがとうございます。

>>pookaさん
ソース見せていただきました。
やりたいことはそれです!!
私の方でも試してみたのですがラベルが変更されませんでした・・・。

ファイル置場となります。
ttp://momiji0210.web.fc2.com/web_test/test.zip

また、それ以外にも
問題が2つありまして
1、ソースを見ていただければわかるかと思うのですが
  かなり非効率なやり方でタブの取得をおこない表示している

2、リリースで作ったアプリをほかのPCで起動できない。
  アプリケーションの初期化ができないエラーが起こります。
  もしかしたらリビルドしないでビルドで吐き出したものを持っていったからかもしれません。
  お互いXPです。


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

Name: pooka [URL]  ..中級者(10,235ポイント)   Date: 2009/07/04(土) 21:50   No:36260     
Title: Re:ファイルの書き出し VC++    
>私の方でも試してみたのですがラベルが変更されませんでした・・・。
textBox1であれば
this->textBox1->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged);


#pragma region Windows Form Designer generated code
        /// <summary>
        /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディタで変更しないでください。
        /// </summary>
        void InitializeComponent(void)
        {
            //省略

            // 
            // textBox1
            // 
            this->textBox1->AllowDrop = true;
            this->textBox1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom) 
                | System::Windows::Forms::AnchorStyles::Left) 
                | System::Windows::Forms::AnchorStyles::Right));
            this->textBox1->Location = System::Drawing::Point(1, 6);
            this->textBox1->Multiline = true;
            this->textBox1->Name = L"textBox1";
            this->textBox1->Size = System::Drawing::Size(628, 414);
            this->textBox1->TabIndex = 0;
            this->textBox1->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::textBox1_DragDrop);
            this->textBox1->DragEnter += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::textBox1_DragEnter);
            this->textBox1->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged);//ここ

に追加すれば変更されると思います。

ただ、私はデザイナー画面?(添付画像)のプロパティウィンドウのイベントの所で設定したほうがいいかなと思います。

>問題が2つありまして
>1、ソースを見ていただければわかるかと思うのですが
>  かなり非効率なやり方でタブの取得をおこない表示している
とありますが、数が多くなる予定であれば配列にした方がいいかなと思います。

VisualC++で作り慣れていないのでいろいろ試行錯誤しながら作ってみました。(次に添付します)
なのでこれでいいのかわかりませんm(_ _)m
配列にするなら自分でいろいろ書かないといけないので、少し面倒でした^^;

>2、リリースで作ったアプリをほかのPCで起動できない。

こちらはちょっとわかりません。


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

Name: pooka [URL]  ..中級者(10,316ポイント)   Date: 2009/07/04(土) 22:44   No:36264     
Title: Re:ファイルの書き出し VC++    
上でも書いたとおり自分でもきちんと理解してるわけではないので、コメント部分が少ないです。
あとファイルの読み込みや保存などの処理はコメントにしてあります。(仕様によってかわると思うので)


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

Name: バグ  ..ハッカー(161,510ポイント)   Date: 2009/07/05(日) 01:45   No:36279     
Title: Re:ファイルの書き出し VC++    
.NETライブラリがインストールされていない環境では動きません。例えばSPのインストールされていないスッピンのXPなら駄目でしょうね。
VS2005で組んだのであれば、.NET2.0ですね。XPであればSP3がインストールされていれば間違いなく入っているはずですが…


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

Name: 西  ..入門者(3,652ポイント)   Date: 2009/07/05(日) 15:48   No:36298 解決!     
Title: Re:ファイルの書き出し VC++    
>>pookaさん
色々とありがとうございました!!
VC.netは基本C言語みたいなのですが配列の定義がjavaとかに似ていますね。
またprintfとかで使える%dなどは{0:00}みたいに書くのですねw

基本が全く分かっていないので勉強していきます。
助かりました。ありがとうございます。

>>バグさん
XPSP3なのですが初期化エラーが出ます。
明日もう一度試してみますね。


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

Name: バグ  ..ハッカー(161,596ポイント)   Date: 2009/07/05(日) 17:19   No:36301     
Title: Re:ファイルの書き出し VC++    
>>pookaさん
私だったら、テキストボックスとラベルを1つのクラスとしてしまいますね。
今回みたいに、.NETを使用したものならば、ユーザーコントロールというのを使うといいですよ。
ソースを添付しておきますね(^-^)

>>西さん
うーん、謎ですね(^_^;)


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

Name: pooka [URL]  ..中級者(10,463ポイント)   Date: 2009/07/05(日) 18:31   No:36305     
Title: Re:ファイルの書き出し VC++    
>>バグさん
ありがとうございます><
ビルドしてみたところInputBox.hがないというエラーがありましたが、
該当箇所をコメントアウトしたところ起動できました。
ユーザーコントロールというのを初めて知りました。
確かに今回のような場合はまとめて扱ったほうがいいかもしれませんね。
今まで作ってきたソフトもいろいろ改良できそうです。
勉強になりました。m(_ _)m


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

Name: バグ  ..ハッカー(161,495ポイント)   Date: 2009/07/05(日) 18:48   No:36309     
Title: Re:ファイルの書き出し VC++    
>>ビルドしてみたところInputBox.hがないというエラーがありましたが…

あ、失礼しました(^_^;)
途中でWRboxという名前に変更したのですが、修正しきれてなかったみたいですね、申し訳ないっすm(__)m
ユーザーコントロールはC#やVBでも使えますんで、使ってみてください(^0^)


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

Name: pooka [URL]  ..中級者(10,499ポイント)   Date: 2009/07/05(日) 18:52   No:36310     
Title: Re:ファイルの書き出し VC++    
>ユーザーコントロールはC#やVBでも使えますんで、使ってみてください
はい、ぜひ使ってみたいと思います^^


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



Name: 俺 [URL]  ..ぴよぴよ(6ポイント)   Date: 2009/06/30(火) 23:25   No:36024       
Title: C言語を習得すればつくれるものは?    
はじめまして。
僕はC言語を独学で勉強していますが、
最近、これを学んでなんになるのか分からなくなってしまいました。

こちらのサイトではゲームを作れるとなっていますが、
そのほかに、実用的なもの等、なにが作れる、なにができるのでしょうか?

あいまいな質問ですみません。。。
回答をよろしくお願いします。


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


Name: 御津凪 [URL]  ..比類無きプログラマー(97,848ポイント)   Date: 2009/06/30(火) 23:53   No:36026     
Title: Re:C言語を習得すればつくれるものは?    
まず確実に言えることは、"ソフト(デジタル)上のことなら何でも"出来ます。

現在動いているほとんどのOSのプログラムも元をたどればC言語から作られていますし、
マイコンやデバイスなどのハード操作に関するプログラムもほとんどC言語で作られています。

その気になればロボットの思考や動作等もプログラミングできますよ。

しかし、これらは難しい分野にあたりますので、
C言語に慣れない内はゲームやツールなどでプログラミング技術を覚えてからでも遅くはありません。

自分がほしいと思ったソフトは、基本的にC言語で作ることが出来る、と思っておいてください。


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

Name: 俺 [URL]  ..ぴよぴよ(54ポイント)   Date: 2009/07/01(水) 07:17   No:36038     
Title: Re:C言語を習得すればつくれるものは?    
即答、ありがとうございます。

確かになんとなく何でもできることはわかる気がします。
しかし、C言語は目に見え、マウスで操作する部分を作れるのでしょうか?


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

Name: 山崎  ..上級者(17,545ポイント)   Date: 2009/07/01(水) 08:20   No:36040     
Title: Re:C言語を習得すればつくれるものは?    
おはようございます。

目に見えてマウスで操作できる、ということは、GUIのプログラムのことですね。
もちろん、作ることができます。

例えばDXライブラリを使えば、簡単にマウスの動きや状態を取得することができます。
どのボタンを押しているかとか、マウスポインタがどこにあるかなど、簡単に取得できます。
マウスポインタのある位置を無理やり変える、ということも可能です。
(ただ、DXライブラリを使わないときのマウス関係の操作は私にはわかりませんが)

でも、普段我々が目にするようなウインドウズアプリケーションを作るなら、
C言語よりもVisualBasicの方がかなり向いてると思いますね。何より簡単です。
ただ、無料ではないですが…。


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

Name: Dixq (管理人)  ..ウィザード(1,039,478ポイント)   Date: 2009/07/01(水) 08:22   No:36041     
Title: Re:C言語を習得すればつくれるものは?    
windowsAPIについて調べてみて、猫でもわかるプログラミングのサイトを見てみてください。

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

Name: non  ..熟練のプログラマー(52,100ポイント)   Date: 2009/07/01(水) 08:46   No:36042     
Title: Re:C言語を習得すればつくれるものは?    
>C言語よりもVisualBasicの方がかなり向いてると思いますね。何より簡単です。
>ただ、無料ではないですが…。

Visual Basic 2008 Express Edition なら無料です。



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

Name: 山崎  ..上級者(17,626ポイント)   Date: 2009/07/01(水) 10:21   No:36047     
Title: Re:C言語を習得すればつくれるものは?    
>nonさん
おっとっと、これは失礼しました。

ということで Visual Basic 2008 Express Edition なら無料ですので、
ゲームよりもウィンドウズアプリケーションを作りたいのなら触ってみると良いかもしれません。


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

Name: 御津凪 [URL]  ..比類無きプログラマー(97,987ポイント)   Date: 2009/07/01(水) 10:40   No:36049     
Title: Re:C言語を習得すればつくれるものは?    
> Visual Basic 2008 Express Edition

C言語を覚えているのに他の言語を覚えなきゃいけないのか?と思ったなら、
C/C++ 言語に似ている Visual C# 2008 Express Edition をお勧めします。
(こちらも無料です)


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

Name: 俺 [URL]  ..ぴよぴよ(0ポイント)   Date: 2009/07/05(日) 14:39   No:36296 解決!     
Title: Re:C言語を習得すればつくれるものは?    
みなさん、たくさんの返信ありがとうございました。

DXライブラリ、API、VS・VC# Express Edition、、、。

おかげさまで一層モチベーションもあがりました。
いろいろ試してみます。

またお世話になるかもしれませんがよろしくお願いしますm(_ _)m


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



Name: デラ初心者  ..かけだし(1,835ポイント)   Date: 2009/07/03(金) 20:56   No:36192       
Title: ボムを撃ってみようが出来ません    
また質問です よろしくお願いします
effect.cpp(27) : error C2668: 'cos' : オーバーロード関数の呼び出しを解決することができません。
effect.cpp(28) : error C2668: 'sin' : オーバーロード関数の呼び出しを解決することができません。
graph.cpp(81) : error C2660: 'graph_effect' : 関数に 1 個の引数を指定できません。
と出てきます
'mvang' : 'effect_t' のメンバではありません。
'spd' : 'effect_t' のメンバではありません。
と出てきたので
effect構造体に
typedef struct{
int flag,cnt,col,knd,img,eff,brt,spd,mvang;
double x,y,r,ang;
}effect_t;
spd,mvangを足したらエラーがなくなったから、これで問題ないんでしょうか?

spd,mvangを足したらオーバーロード関数の呼び出しを解決することができません。
が出てきたような気もしますが・・・
ソース(graph.cpp)を貼っときます


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


Name: kazuoni [URL]  ..比類無きプログラマー(93,173ポイント)   Date: 2009/07/04(土) 09:31   No:36217     
Title: Re:ボムを撃ってみようが出来ません    
オーバーロード関数の呼び出しを解決することができません。
とググればそれとなく、答えが見えてきます。
下に参考ページを。
(ブラウザで「オーバーロード関数の呼び出しを解決することができません。」と検索かけてください。)

C++入門
ttp://www.geocities.co.jp/SiliconValley-Cupertino/3384/Cplus2.html


>spd,mvangを足したらエラーがなくなったから、これで問題ないんでしょうか?
どのような状況なのか把握できませんが、(spd,mvangの型)
いいのではないでしょうか。


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

Name: デラ初心者  ..かけだし(1,781ポイント)   Date: 2009/07/05(日) 13:06   No:36295 解決!     
Title: Re:ボムを撃ってみようが出来ません    
kazuoniさん
回答ありがとうございます
ttp://www.geocities.co.jp/SiliconValley-Cupertino/3384/Cplus2.html
参考にさせて貰いました

intではオーバーロードするようなので
doubleでやったところ出来ました

無事解決しました


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



Name: ta  ..ぴよぴよ(294ポイント)   Date: 2009/07/05(日) 00:24   No:36272       
Title: 龍神録プログラミングの館 18章について    
当たり判定について質問です。

すり抜けが起こる場合というのは「前のフレームでは当たっていないが現在のフレームとの間で
当たり判定を満たしており現在のフレームでは当たっていない」状態の時、という認識で正しい
でしょうか。ここでは自機ショットの速度が当たり判定の大きさを上回っている場合に前フレーム
から現在のフレームの間を細分化して判定していますが、これは逆に言えば自機ショットの速度が
当たり判定の大きさを下回っている場合には上記の現象が起こらない、ということですよね。何故
すり抜けが起きるかどうかがこの条件でわかるのか、説明箇所を読んでもどうしても理解できません。
頭の固い私にアドバイスをお願いします。


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


Name: Dixq (管理人) [URL]  ..ウィザード(1,040,991ポイント)   Date: 2009/07/05(日) 06:45   No:36288     
Title: Re:龍神録プログラミングの館 18章について    
そういうことです。仰るとおりです。


○が弾の当たり判定の大きさだとして、☆が自機だとすると

○・・・・・・・・・・・☆・・・・・         
・・・・・○・・・・・・☆・・・・・         
・・・・・・・・・・○・☆・・・・・         
・・・・・・・・・・・・☆・・○・・         

○の範囲だけ計算して☆と接触しているか考えただけじゃダメだということですね。
 


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

Name: ta  ..ぴよぴよ(433ポイント)   Date: 2009/07/05(日) 11:57   No:36294 解決!     
Title: Re:龍神録プログラミングの館 18章について    
大変わかりやすい図をありがとうございました。
自分が考えていたのは、○(弾)が☆(自機)と極めて近い場所にいて
次のフレームまでに一瞬だけ当たり判定範囲に入った後にまた元の場所に
戻るような時は、弾が遅くてもすり抜けてしまうのではないか、ということでしたが、
実際には無限の細かさではなく・の範囲で移動するのでそんなことはあり得ないですね。


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



Name: B/B  ..ぴよぴよ(65ポイント)   Date: 2009/07/05(日) 09:53   No:36290       
Title: 矩形と直線の当たり判定    
初めまして。現在シューティングゲームを作っているのですが、
高速で移動する弾丸の当たり判定は、"直線"ということにして行おうと思ったのですが、その組み方がわかりません。

直線:(x1,y1)から(x2,y2)まで移動する直線
矩形:(cx,cy)に存在し、幅が(width,height)の矩形 ※座標は矩形の中心

この矩形と直線の当たり判定の作り方を教えてください。

矩形と矩形、円と円の当たり判定なら簡単でわかるのですが、
矩形と直線の当たり判定の例は、ネットで検索しても見つかりませんでした(あってもFlashなどの別環境でソースが理解できませんでした)。


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


Name: MNS  ..中級者(12,376ポイント)   Date: 2009/07/05(日) 10:13   No:36291     
Title: Re:矩形と直線の当たり判定    
矩形の四隅が、線分の全て上にある、もしくは下にあるのならば、矩形は線分をまたいでいません。
逆に、一つでも違う方向のものがあれば、またいでいると言えるでしょう。

(x1,y1)と(x2,y2)を通る直線の式を求め、
その式と矩形の四隅の点を比較していけば、出来るかもしれません。

実装したことがないので、あんまり自信はないんですが・・


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

Name: ねこ  ..上級者(20,300ポイント)   Date: 2009/07/05(日) 11:00   No:36292     
Title: Re:矩形と直線の当たり判定    
>MNSさん
僕が正しく理解出来ていないだけかもしれませんが、それだと/□という状態で( スラッシュはもうちょい小さいイメージで)成立しちゃわないでしょうか。

矩形を4本の線分と考えて、どれかと実交点を持つ時当たっていると判定するのはどうでしょうか。


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

Name: B/B   Date: 2009/07/12(日) 20:55   No:362901247399721 解決!     
Title: Re:矩形と直線の当たり判定    
MNSさん、ねこさんご回答ありがとうございます。
ねこさんの矩形の直線を一本ずつ交差している、あるいは直線が矩形に囲まれているときに
接触したと判定するように、試してみたいと思います。




Name: R  ..入門者(3,413ポイント)   Date: 2009/07/05(日) 03:23   No:36281       
Title: VC++2008 F5とCtrl+F5について    
質問です。VC++2008にて次のようなコードをF5で実行した場合は最後まで動くのですが、CTRL+F5では問題が発生したため(以下略)のエラーがでます。なにが原因なのでしょうか?

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

typedef struct node* list;
struct node{
int data;
list prev;
list next;
};

list makenode(){
list n;
n=(list)malloc(sizeof(list*));
n->data=0;
n->next=n;
n->prev=n;
return n;
}
int main(){
list x;
list y;
x=makenode();
y=makenode();
}


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


Name: DVDM [URL]  ..ぴよぴよ(109ポイント)   Date: 2009/07/05(日) 03:37   No:36282     
Title: Re:VC++2008 F5とCtrl+F5について    
>>Rさん
構造体のサイズ分確保したいのであれば
n=(list)malloc(sizeof(node)); ではないでしょうか・・・。


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

Name: R  ..入門者(3,493ポイント)   Date: 2009/07/05(日) 04:25   No:36283     
Title: Re:VC++2008 F5とCtrl+F5について    
回答ありがとうございます。
ご指摘の部分をn=(list)malloc(sizeof(struct node));に修正したところ解決したようです。
typedef node* list; でlistはnodeへのポインタ型,list*はnodeへのポインタへのポインタ型ですね・・・。
F5とCtrl+F5で動作が異なった原因については不明なままなので引き続き回答募集させていただきます。



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

Name: ねこ  ..上級者(20,203ポイント)   Date: 2009/07/05(日) 09:31   No:36289     
Title: Re:VC++2008 F5とCtrl+F5について    
参考になりそうな記事見つけたのでどうぞ
ttp://okwave.jp/qa2047142.html


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +