|
|
Name: キリ [URL] ..ぴよぴよ(309ポイント)
Date: 2009/04/03(金) 17:25
No:31641
|
|
Title: この作品の仕様
|
|
.defaultで平均的なキャラクターの生成。
.statsでステータスを均等な値に決定。
.openでステータスファイルを読み込む。
.rmで既に入力したキャラを最戦闘。
.owで体重と身長を決定。
.d1で内部計算数値を表示。
技読み込みのフォーマットは
技名/発動台詞/攻撃修正値/発動相対確率/技消費ポイント/攻撃対象/会心修正/属性/技タイプ/リンク技
です。
攻撃修正は乗算値、修正値、加算値、近似値、絶対率、加算乗算値、絶対乗算値があります。
ダメージに乗算と修正はかけ算、加算はプラス、近似は絶対値に近い値、絶対率は最大HPの割合、加算乗算はプラスとかけ算、絶対乗算は絶対値に攻撃力かけ算です。
292ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,013,224ポイント)
Date: 2009/04/05(日) 10:24
No:31741
|
|
Title: Re:この作品の仕様
|
|
マルチポストは「両方の掲示板の規約で許されていたら可」としています。
また、質問掲示板関連は同じ方が見ていらっしゃる場合が多いようですので、
マルチポストをする意味はあまりないという意見が以前出たことがあります。
---
人が書いたプログラムを理解するのは難しいでしょうし、
そこまでせっかく作ったのなら、わからない部分を聞いて、機能追加を自分でやった方が
後々効率的では無いでしょうか?
118ポイント を手に入れた。
|
|
|
|
|
Name: Ban ..ぴよぴよ(542ポイント)
Date: 2009/04/05(日) 11:55
No:31747
|
|
Title: Re:この作品の仕様
|
|
アチラでもレスしてますが、
意味の分からない変数名、特にグローバル変数書き換えまくりだったので、
それ以上に手を出す気がそげてしまいました。
s:先手、g:後手、k:攻撃、b:防御…などを解読しないと分からないのでは、
(ゲーム的な本質以前の面で)他の人に弄ってもらうソースとしては厳しいです。
「キー入力が少ない」とか「宣言が面倒」とか言うのはありえない。
変数名を見直しながら、グローバル変数を減らして構造体にまとめるのが最初かなという印象です。
186ポイント を手に入れた。
|
|
|
|
Name: dic ..上級者(17,239ポイント)
Date: 2009/04/05(日) 07:22
No:31730
|
|
Title: 基本的なことがらですが
|
|
現在シューティングを作成しているのですが
オブジェクト指向でいこうかと考えています
ですが、管理人さんが公開されているような
構造体で作った方が複雑にならずに簡素で
作りやすいとも思えてきました
なので、どちらでいこうか迷っています
技術的関心が高いのかオブジェクト指向でやりたいのですが、
なかなか難しいものでつまづいています
かといって楽な構造体でやってしまうと、なんか
心の底で抵抗感があります
と、オブジェクト指向でいくのか、構造体でいくのかで悩んでます
どちらとも同じくらいの経験はあるので てんびんにかけづらいです
このような私にどういった処方箋があるのでしょうか?
183ポイント を手に入れた。
|
|
|
|
Name: MNS ..入門者(3,861ポイント)
Date: 2009/04/05(日) 07:29
No:31731
|
|
Title: Re:基本的なことがらですが
|
|
作るゲームによって変わってくるのではないでしょうか?
大規模なゲームや、複雑なゲームを作る気なら、断然オブジェクト指向のほうが良いと思います。
小規模なゲームなら、構造体でやった方が楽だと思います。
64ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(17,259ポイント)
Date: 2009/04/05(日) 11:27
No:31745
| 解決!
|
Title: Re:基本的なことがらですが
|
|
返答ありがとうございます
小規模なので構造体でいこうかと思います
20ポイント を手に入れた。
|
|
|
|
Name: あさり ..ぴよぴよ(8ポイント)
Date: 2009/04/03(金) 21:13
No:31649
|
|
Title: ニコニコから来ました
|
|
DL出来ないんですが、どうしたらDL出来ますか?
8ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(137,581ポイント)
Date: 2009/04/03(金) 21:20
No:31650
|
|
Title: Re:ニコニコから来ました
|
|
「どこで」「何が」「どのように」ダウンロードできないのか、
状況を具体的に書きましょう。
2倍のポイントを手に入れた! 40ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..初心者(8,488ポイント)
Date: 2009/04/03(金) 22:12
No:31651
|
|
Title: Re:ニコニコから来ました
|
|
最近原因不明のダウンロードできないトラブルがよく起きていますので
何度もチャレンジしてみてください。たまにダウンロードできたりします。(私の場合は)
66ポイント を手に入れた。
|
|
|
|
|
Name: cosmo ..中級者(9,711ポイント)
Date: 2009/04/04(土) 13:49
No:31671
|
|
Title: Re:ニコニコから来ました
|
|
IE7だとダウンロード出来ない場合があるみたいですよ。
Google ChromeやFirefoxを使ってダウンロードをしてみて下さい。
62ポイント を手に入れた。
|
|
|
|
Name: meron ..ぴよぴよ(484ポイント)
Date: 2009/04/01(水) 12:14
No:31474
|
|
Title: 構造体の配列とメモリ
|
|
初めまして、メロンと申します。
大学で一年ほどC言語を勉強し、今は趣味でC++とDXライブラリでシューティングゲームを作っています。
質問なのですが、構造体の配列(要素数が100や1000など非常に多いもの)を宣言するときは
「malloc関数」を使ったほうがよろしいのでしょうか?
現在、とある構造体の配列の数値をいじると、別の構造体の配列の数値がおかしなことになって、正常な動作が見込めない状況です。
ソースコードを見直しても、ループ文で、宣言した配列の要素以上の場所にアクセスしていたり、といったミスはありませんでした。
それどころか、処理中の配列とはまったく別の配列の要素が同時に、かつ勝手に置き換わり、それでエラーを起こしていることが分かりました。
おそらく、宣言時に確保したメモリに関する問題だと思うのですが、このような事態はよくあることなのでしょうか?
あるとすれば、一般的にどのような解決方法があるのでしょうか?
色々と探し回って「malloc関数」を使えばうまく行くのではないかと思うのですが、
もし、「malloc関数」を使う場合、構造体の配列をどのように確保すればよいのかがよく分かりません。
ソースコードを載せようとは思ったのですが、問題となる配列をまったくいじらなければ正常に動作しますし、
逆に問題となる配列の要素を一つでもいじると即座に他の配列の数値が変化してしまうので、
やはり、メモリとその確保に関する問題だと思います。
短いサンプルプログラムを作ってみたのですが、それだと当然のように正常に動作します。
結論として、疑問は、
1、先述のようなエラーはよくあることなのか? あるとすればどのような解決法があるのか?
2、「malloc関数」で構造体の配列を宣言するにはどのようにしたらいいのか?
3、メモリの確保の問題でなければ、どのような問題であると考えられるか?
の三つになります。
同じような質問が過去にあったならば、こちらの無礼をお詫びいたします。
けれども、この問題のために製作が完全にストップしている状況です。
なんとかお力をお貸しいただければ幸いです。
484ポイント を手に入れた。
|
|
|
|
Name: meron ..ぴよぴよ(804ポイント)
Date: 2009/04/01(水) 12:37
No:31476
|
|
Title: Re:構造体の配列とメモリ
|
|
プログラミングに関して質問するのが初めてなもので、無礼があったことをお詫びいたします。
短いサンプルプログラムのほうですか?
それだとエラーが起きませんし、元のソースコードをすべて貼ることはその量から考えて、物理的に不可能かと思います。
実際に、一週間ほどソースコードを見直しましたが、そこに問題は見受けられませんでした。
変数や構造体の宣言に関しては、こちらの「竜神録プログラミングの館」で解説されている通りに作成してあります。
それでもソースコードを載せなければならないとしたら、申し訳ありませんが、どのような範囲で、どのような処理のソースコードが必要なのかを明示していただけると助かります。
ゲームとしてはほぼ完成している以上、そのソースコードのすべてはかなりの量になっていると思います。
少なくとも、コピー、ペーストで貼り付けられません。
その量をすべてお渡しできる他の手段があれば、恐縮ですが、その方法を教えていただけないでしょうか?
320ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(12,548ポイント)
Date: 2009/04/01(水) 13:09
No:31478
|
|
Title: Re:構造体の配列とメモリ
|
|
プロジェクトを丸ごとコピーして
下記ファイルに該当するものだけを残し、
中間ファイルやゲームデータは全て削除、
その状態のものに圧縮をかければ
かなり作りこんだ内容でも数百 kb 程度になります。
VC++2008の場合
・プロジェクト名.sln
・プロジェクト名.vcproj
・各ソースファイル( c, cpp, h )
BCC の場合はソースのみでもかまいません。
2倍のポイントを手に入れた! 338ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(29,060ポイント)
Date: 2009/04/01(水) 13:20
No:31479
|
|
Title: Re:構造体の配列とメモリ
|
|
1、先述のようなエラーはよくあることなのか? あるとすればどのような解決法があるのか?
勝手に書き換わることは絶対にないです。
2、「malloc関数」で構造体の配列を宣言するにはどのようにしたらいいのか?
構造体のポインタ = malloc(構造体のサイズ * 配列の個数); // C++ならmallocの戻り値を構造体のポインタ型にキャスト
3、メモリの確保の問題でなければ、どのような問題であると考えられるか?
ソース見ないとわからないですね。(見てもわからないかもしれませんが)。
思ったとおりに動かないのをバグといってこれはよくあることです。
解決法はデバッガを駆使して原因を調べます。
261ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(57,917ポイント)
Date: 2009/04/01(水) 13:21
No:31480
|
|
Title: Re:構造体の配列とメモリ
|
|
症状から察するにメモリ破壊が原因だと思います。
配列をmallocで確保すればメモリマッピングが変わるので現象が起きなくなる可能性はありますが、別のエリアが破壊される可能性もあるわけで根本的な解決にはならないと思います。
メモリ破壊はありがちなミスではあるけども「こうすれば解決する」という「一般的な解決策がない問題」ですので、一部のソースだけ見ても解決はしないでしょうね。
ましてや、meronさんのプログラム構成が全く分からないこちらからこの部分を見せてほしいというのは不可能です。
プロジェクト全体をアップされるのが一番早いかと思います。
65ポイント を手に入れた。
|
|
|
|
|
Name: meron ..かけだし(1,058ポイント)
Date: 2009/04/01(水) 14:08
No:31482
|
|
Title: Re:構造体の配列とメモリ
|
|
有力な情報をありがとうございます。
アップローダーの件は、もう一度ソースコードを見直し、他の原因が考えられないことを確認してから検討してみたいと思います。
しばらく(1〜2日か、あるいは更に一週間程度)、時間を頂けますか?
質問をしたのは自分である上に勝手なお願いをすることが皆さんにとってご迷惑になることは承知しておりますが、
とにかく他の原因が考えられないか、再調査してみようと思います。
その上で自分の手には負えないと思ったら、素直にアップロードして皆さんのご協力をたまわりたいと思います。
また、アップロードするにも、ソースコード製作に関して最低限度のコメントしか入れてないので、大変見にくいものとなっております。
その調整を含めて、もう一度、ソースコードを見直す時間を頂きたいのです。
254ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(39,023ポイント)
Date: 2009/04/01(水) 14:08
No:31483
|
|
Title: Re:構造体の配列とメモリ
|
|
>質問なのですが、構造体の配列(要素数が100や1000など非常に多いもの)を宣言するときは
>「malloc関数」を使ったほうがよろしいのでしょうか?
要素数が固定なら、mallocを使わない方が簡単です。まして、要素数の最大がが100や1000など少ない場合は
最大数の配列を用意した方が簡単と思います。ただし、構造体の1配列がむちゃくちゃ大きいなら別ですが。
おそらく、配列の要素数を超えた場所に書き込んでいると思います。
INDEX値(配列の添え字の計算式)を見直してみましょう。
182ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(94,929ポイント)
Date: 2009/04/01(水) 14:14
No:31484
|
|
Title: Re:構造体の配列とメモリ
|
|
いっそのこと、単純な配列ではなくstd::vectorにしてはどうでしょうか?
そして、[]演算子ではなくatメンバ関数を使えば、範囲を超えてアクセスしようとすると例外が送出されます。
パフォーマンスは落ちますが、動かないよりはましでしょう。
64ポイント を手に入れた。
|
|
|
|
|
Name: meron ..かけだし(2,099ポイント)
Date: 2009/04/01(水) 15:00
No:31490
|
|
Title: Re:構造体の配列とメモリ
|
|
>>non氏
解答ありがとうございます。
つまり、
int i;
int num[100];
for(i = 0 ; i <= 100 ; i++){
num[i] = 0;
}
このようなことですよね?
これだと、num[0]〜num[99]だけでなく、存在しないnum[100]に代入してしまいますから。
その可能性を考慮してループ文を中心に見ているのですが、今のところ見つかりません。
>>たかぎ氏
なるほど、検出するためにそういう方法も考えられるわけですか!
盲点というか、まったく知りませんでした……検討してみます。
一応、問題となる構造体とその配列の宣言と、挿入するとエラーになるソースコードを載せておきます。
/* 変数の宣言、各処理においてexternで呼び出します */
#define MAX_BURST_NUM 2000 //同時に爆発を起こせる最大数
#define MAX_SHOT_NUM 20 //画面上に表示する弾幕の最大数
typedef struct{ //爆発構造体
int flag,counter,pattern,img;
double x,y,range,size,power;
} Burst_t;
Burst_t burst[MAX_BURST_NUM];
typedef struct{ //レーザーの子構造体
int flag;
double x,y,range;
} Box_ele_t;
typedef struct{ //レーザー(疑似長方形)判定用の構造体
int flag,counter,pow_time,end_time,img,color,state;
double start_height,base_angle,base_height,base_range,base_x,base_y;
Box_ele_t child[200];
} Box_t ;
Box_t e_lazer[MAX_SHOT_NUM];
--------- 以下、処理に加えるとエラーになる文 ------------
/* t は敵のショットが始まってからのカウンタを示します */
if(t == 60){
for(int m=0;m < MAX_SHOT_NUM;m++){
e_lazer[m].flag = 1;
e_lazer[m].base_angle = Boss_atan();
e_lazer[m].base_x = boss.x;
e_lazer[m].base_y = boss.y;
e_lazer[m].pow_time = 60;
e_lazer[m].start_height = 20;
e_lazer[m].base_height = 100;
e_lazer[m].base_range = 50;
e_lazer[m].counter = 0;
}
}
この構造体に関する処理は別のところでも行っており、現在、それにバグがないか調べています。
これを実行すると、アクセスしたのは e_lazer[] のメンバーなのに、爆発構造体配列の値が変わってしまいます。
呼びだしている関数は「double Boss_atan(void)」のみで、これはボスキャラから見た自機との角度を返します。
この関数は、math.hをincludeして、以下のような処理を行っています。
double Boss_atan(void){ //ボスと自機の角度
return(atan2(Player_1.y - boss.y,Player_1.x - boss.x));
}
長文を失礼しました。
ちゃんと字下げできたかどうか不安です。
仕組みは、Box_ele_t の構造体配列で指定したrangeを半径とする円をボスの射撃方向に一定距離を挟んで固定配置し、それと自機とのヒットチェックをすることで擬似的に長方形を表現するというものです。
これから別の用事があるので今日はもう返事はできませんが、なんとか早いうちにすべてのソースコードのアップロードができるよう尽力いたします。
ここまでで何かミスがあれば、自分の愚かさを呪うほかありません……。
1,041ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(95,065ポイント)
Date: 2009/04/01(水) 16:16
No:31491
|
|
Title: Re:構造体の配列とメモリ
|
|
> なるほど、検出するためにそういう方法も考えられるわけですか!
不具合の検出に限らず、配列を動的に割付けるのであれば、mallocやnewを使うよりstd::vectorを使う方が得策です。
生兵法でmallocやnewを使うと、きっとメモリリークや二重解放で悩む羽目になります。
78ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(39,125ポイント)
Date: 2009/04/01(水) 17:46
No:31492
|
|
Title: Re:構造体の配列とメモリ
|
|
誤りはこの範囲にはないようです。
Player_1やbossの構造体は不明ですが。たぶん、影響はないでしょう。
あのif文のブロックを加えたら他の配列を破壊するのですね。
とりあえず、
中のfor文をm=0だけ行われるようにして、破壊されますでしょうか?
破壊されるのであれば、
代入文を1行ずつ実行し、どれで破壊されているか調べてください。
102ポイント を手に入れた。
|
|
|
|
|
Name: meron ..かけだし(2,357ポイント)
Date: 2009/04/02(木) 10:49
No:31558
|
|
Title: Re:構造体の配列とメモリ
|
|
返事が遅れて申し訳ありません。
>不具合の検出に限らず、配列を動的に割付けるのであれば、mallocやnewを使うよりstd::vectorを使う方が得策です。
>生兵法でmallocやnewを使うと、きっとメモリリークや二重解放で悩む羽目になります。
そうなのですか!
参考にさせていただきます!
>代入文を1行ずつ実行し、どれで破壊されているか調べてください。
e_lazer[8].flag = 1; の代入を行ったときからエラーで止まります。
しかも、そのエラーは、爆発用構造体とは違う、別の変数の値が置き換わったためのものでした。
「game.exe の 0x00578c47 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x01ee5ee0 を読み込み中にアクセス違反が発生しました。」
デバッグすると上記の文章が表示されます。
確認してみると、値の変化により、関数ポインタの設定していない領域を読み込んだようです。
あと、e_lazer[]に関する他の処理(前述の代入文・ループ文を除く別の処理)をソースコードから除いて実行したところ、やはり同様のバグでプログラムの動作が停止しました。
258ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(29,092ポイント)
Date: 2009/04/02(木) 11:37
No:31559
|
|
Title: Re:構造体の配列とメモリ
|
|
その構造体配列が自動変数(関数内でstaticなしで宣言している)であればstaticをつけて試してみては
32ポイント を手に入れた。
|
|
|
|
|
Name: meron ..かけだし(2,393ポイント)
Date: 2009/04/02(木) 12:55
No:31561
|
|
Title: Re:構造体の配列とメモリ
|
|
構造体配列及び、メインで使う変数はほぼすべて「竜神録プログラミングの館」等の解説通り、ヘッダファイルで宣言し、それをextern宣言したヘッダファイルをincludeして使ってます。
これでは駄目でしょうか…?
36ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(39,211ポイント)
Date: 2009/04/02(木) 13:58
No:31567
|
|
Title: Re:構造体の配列とメモリ
|
|
>これでは駄目でしょうか…?
駄目なことはありません。
toyoさんがおっしゃているのは、たぶんメモリがどこに確保されるかによって、破壊される変数が
変われば、場所を特定することの手助けにならないかということではないでしょうか?
86ポイント を手に入れた。
|
|
|
|
|
Name: meron ..かけだし(2,285ポイント)
Date: 2009/04/02(木) 14:33
No:31574
|
|
Title: Re:構造体の配列とメモリ
|
|
なるほど……。
でも、具体的に何をすればよろしいのかが分かりません。
破壊される変数はばらばらです…。
異常が見つかったのは今のところ、burst[174]〜burst[175]、及びburst[1675]とその周辺、LoadGraphで読み込んだ背景を保存しているimg_back(これは、int img_back[2]; で宣言)です。
こんなにも破壊される箇所がばらばらになるのも、そのメモリ破壊というバグの症状の一つなのでしょうか?
108ポイント を落としてしまった。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(58,145ポイント)
Date: 2009/04/02(木) 14:57
No:31582
|
|
Title: Re:構造体の配列とメモリ
|
|
> そのメモリ破壊というバグの症状の一つなのでしょうか?
そうですね、それもかなり重症とみるべきです。
起こしてしまった場合の調査はプログラムが大きければ大きいほど困難を極めます。
ループ処理でのバッファオーバランで破壊している場合は配列の途中だけ破壊ということはないように思いますので、ループ箇所を調べているだけでは見つけられないのではないでしょうか。
配列にアクセスする際に何らかの計算でインデックスを求めているようなことをしている場合、計算間違いで計算結果がとんでもない値になっていたりする場合も原因として考えられます。
(計算に使用する変数の初期化が不十分で不定値で計算しているとか)
可能性は挙げればきりがないので、プログラム全体を見ない限り正確な原因はわかりません。
開発環境が書かれていませんけど、VC系であれば調査の仕方を書きます。(見つけられるとは限らないけど)
1.プロジェクト→(プロジェクト名)のプロパティを選択
2.構成プロパティ→リンカ→デバッグを選択
3.マップファイルの作成を「はい(/MAP)」に変更
4.マップファイル名に適当なファイル名を入力
この状態でビルドするとメモリマップファイル(4で入力したファイル名)が作成されます。
メモリマップファイルにはプログラム実行時のメモリ配置アドレスが出力されます。
ファイル内を破壊される変数名で検索し、その変数よりも上に配置されている配列変数の使用箇所を重点的に調べてみてください。
58ポイント を手に入れた。
|
|
|
|
|
Name: meron ..かけだし(2,478ポイント)
Date: 2009/04/02(木) 20:52
No:31614
|
|
Title: Re:構造体の配列とメモリ
|
|
開発環境で、どのように書けばいいのかよく分からないのですが……。
一応、「Windows Vista Home Premium」、「Visual Studio 2005」で製作しています。
0004:0023fed0 ?e_lazer@@3PAUBox_t@@A 00abaed0 Main.obj
0004:00260ff8 ?burst@@3PAUBurst_t@@A 00adbff8 Main.obj
Mist氏の助言を元にメモリマップファイルというものを作成して調べたところ、こんな文章が出てきました。
左の「0023fed0」「00260ff8」っていうのが、メモリ上のアドレスということですか?
つまり、そのアドレスが同じ場所を使っていたりしないかどうかを探せばよいのでしょうか?
こんな機能初めて使ったので、よく分かりません。
とりあえず、上記の項目の周辺を載せておきます。
0004:0023fea8 ?img_status@@3PAHA 00abaea8 Main.obj
0004:0023fecc ?novel_flag@@3HA 00abaecc Main.obj
0004:0023fed0 ?e_lazer@@3PAUBox_t@@A 00abaed0 Main.obj
0004:0025fd70 ?back_blend@@3HA 00adad70 Main.obj
0004:0025fd74 ?area@@3UArea@@A 00adad74 Main.obj
0004:0025fda8 ?cnt_slow@@3NA 00adada8 Main.obj
0004:0025fdb0 ?game_mode@@3HA 00adadb0 Main.obj
0004:0025fdb4 ?bgm_sel@@3HA 00adadb4 Main.obj
0004:0025fdb8 ?f_homing@@3PAUHoming_shot_t@@A 00adadb8 Main.obj
0004:00260ff8 ?burst@@3PAUBurst_t@@A 00adbff8 Main.obj
0004:0027c578 ?img_lazer@@3PAY01HA 00af7578 Main.obj
0004:0027c588 ?counter@@3HA 00af7588 Main.obj
ソースコード全文はもう少し待ってほしいところです。
193ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(58,585ポイント)
Date: 2009/04/02(木) 21:37
No:31617
|
|
Title: Re:構造体の配列とメモリ
|
|
> 左の「0023fed0」「00260ff8」っていうのが、メモリ上のアドレスということですか?
そう考えてもらって差し支えありません。
> つまり、そのアドレスが同じ場所を使っていたりしないかどうかを探せばよいのでしょうか?
違います。
アドレスを決定するのはコンパイラの仕事なので同じになることはありません。
> burst[174]〜burst[175]
この辺が破壊されているということはメモリアドレスでは
0x00260ff8 + sizeof(Burst_t) * 174 = 0x00263608 // sizeof(Burst_t)が56byteの場合
のあたりが破壊されていることになります。
で、ここに破壊された時に書き込まれているデータ内容から破壊しているやつを探すということです。
例えばe_lazerへのライトアクセスでburstを破壊していると仮定した場合、
(0x00263608 - 0x0023fed0) / sizeof(Box_t) = 25.6 // sizeof(Box_t)が5676byteの場合
e_lazer[25]でchildの118か119あたりにライトアクセスした場合にburst[174]を破壊することになるとわかります。
(構造体サイズは手計算なので間違ってるかも(^^;、MAX_BURST_NUMが2000、MAX_SHOT_NUMが23ぐらいで定義されているならほぼあってると思うけど)
まぁ、闇君にソース眺めるよりはいくらか絞り込みが出来るというものです。
400ポイント を手に入れた。
|
|
|
|
|
Name: meron ..入門者(2,505ポイント)
Date: 2009/04/03(金) 09:36
No:31626
|
|
Title: Re:構造体の配列とメモリ
|
|
なるほど……。
私にとってはなんだか難しい話ですが、手探りでなんとか調べてみようと思います。
27ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(95,206ポイント)
Date: 2009/04/03(金) 10:35
No:31629
|
|
Title: Re:構造体の配列とメモリ
|
|
破壊されるところが分かっているのであれば、適当に何箇所かにブレークポイントを貼って実行すれば、大まかに破壊が起きている場所が絞り込めるはずです。
その上で、破壊される直前のブレークポイントからステップ実行すれば、直接の原因は比較的簡単に特定できます。
ただし、実時間のタイミングに依存するような場合は、ステップ実行では再現できないので、もう少し面倒になります。
いずれにせよ、ソース全文の掲載が一番近道であることは間違いありません。
114ポイント を手に入れた。
|
|
|
|
|
Name: meron ..入門者(2,705ポイント)
Date: 2009/04/04(土) 10:15
No:31659
|
|
Title: Re:構造体の配列とメモリ
|
|
ソースコードを「どっとうpろだ.org」にアップロードいたしました。
番号は「23152」、コメント「お願いします。」、容量は「228kb」、ファイル名は「game.zip」
ダウンロードパスは「meron」です。
汚い上に無駄に長く、コメントも僅かなものですが、どうかよろしくお願いします。
何か必要なことがあれば仰ってください。
実現可能な範囲であれば、最大限、その要望に応えるつもりです。
ただ、画像や音声などのファイルを抜かしているので、そのままでは実行してもエラーで中止すると思うのですが、それでもよろしいのでしょうか?
200ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(13,244ポイント)
Date: 2009/04/04(土) 13:58
No:31672
|
|
Title: Re:構造体の配列とメモリ
|
|
その後の記事も読ませてもらいましたが、
今回の meronさんのケースだとソースだけよりも
データをそろえて実際に動作確認できる状況であるほうが
望ましく問題解決が早くなると思います。
私が余計なこと書いちゃいましたね。
(ココにUPできるサイズにする方法を書いたので。)
できれば動作に必要な他データの補間もお願いします。
131ポイント を落としてしまった。
|
|
|
|
|
Name: meron ..入門者(3,015ポイント)
Date: 2009/04/04(土) 16:36
No:31676
|
|
Title: Re:構造体の配列とメモリ
|
|
返事が遅れて申し訳ないです。
プレイに必要な画像や音声といったデータも同封しました。
パスは同じく「meron」です。
e_lazerに関する処理を行っている場所や、その他伝えたいことなどの情報は同封の「read me」テキストに記載しておきました。
よろしくお願いします。
→ http://www.dotup.org/uploda/www.dotup.org23672.zip.html
前回アップロードした、ソースコードだけのものはしばらく残しておきます。
ただ、実行する際の不具合をなくすために、今回のものには一部に変更を施してありますので、ご注意ください。
……ところで、直接アドレスを載せてしまってもよろしいのでしょうか?
もう後の祭りなのですが、掲示板というものを使う機会がめったにないもので、分からないのです。
今回、ここを利用させていただいたのも、ゲームの製作初期、こちらのサイトを利用させて頂いたからという理由なので……。
350ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(13,451ポイント)
Date: 2009/04/04(土) 18:05
No:31682
|
|
Title: Re:構造体の配列とメモリ
|
|
typedef struct{ //レーザー判定
// フラグ、カウンタ、ヒット開始、ヒット終了、画像、色、状態
int flag,counter,pow_time,end_time,img,color,state;
// ヒット開始距離、角度、ヒット終了距離、ヒット幅、基準x、基準y
double start_height,base_angle,base_height,base_range,base_x,base_y;
Box_ele_t child[500]; // ← GlobalValue.h では 200 になっている
Lphy_t lphy;
} Box_t ;
Extern.h と GlobalValue.h で
Box_ele_t child[]; の確保している数が違っています。
龍神録5章くらいを参考にファイルを一つにまとめると
こういったバグの回避になると思いますよ。
207ポイント を手に入れた。
|
|
|
|
|
Name: meron ..入門者(3,372ポイント)
Date: 2009/04/05(日) 10:09
No:31738
| 解決!
|
Title: Re:構造体の配列とメモリ
|
|
な、なんと……!!
コピーペーストだから写し間違いはないと思ってextern.hはまったく眼中にありませんでした。
おそらく、その後に微調整したとき、extern.hに反映させるのを忘れてしまったのでしょう。
小さなミスが大きなバグに繋がるとは何度も大学で聞かされていたのですが、実際に自分がそうなると身にしみて理解できますね……。
こちらでも正常な動作を確認しました。
> 龍神録5章くらいを参考にファイルを一つにまとめると
> こういったバグの回避になると思いますよ。
アドバイス、ありがとうございます!
皆様のご協力に深く感謝いたします。
私一人では、extern.hに対する先入観を捨て切れず、きっと諦めて投げ出していたことでしょう。
半月以上かけても発見できなかったのですから、それは確実であると言えます。
こんな小さなミスに半月も翻弄されていたとは、全身から力が抜けるようであります。
このゲームは、趣味とはいえ、私が生まれて初めてプログラミングしたゲームであります。
この先、何があったとしてもこのゲームを製作したこと、このゲームを製作する上でお世話になった方々のこと、そして親切にもバグの原因解明のため協力してくださった皆様のことは、決して忘れません。
本当にありがとうございました。
そして、もしかしたら、これから先、またこの掲示板と皆様のお世話になる機会があるかもしれません。
そのときはまた、暖かく迎えてくだされば幸いです。
それでは、今回のところはこれで失礼しようと思います。
皆様、本当にありがとうございました。
357ポイント を手に入れた。
|
|
|
|
Name: かな ..ぴよぴよ(105ポイント)
Date: 2009/04/04(土) 19:21
No:31684
|
|
Title: 最初からよくわからないですね。
|
|
初めまして。さっそくですが、第一章に書かれている。
RyuJin.slnを開いて下さい。
なんですが、ひらくことができません。
sln式ファイルは何のプログラムで開けられますか?
6ポイント を手に入れた。
|
|
|
|
Name: かな ..ぴよぴよ(150ポイント)
Date: 2009/04/04(土) 19:45
No:31687
|
|
Title: Re:最初からよくわからないですね。
|
|
二人ともありがとうございます
ゲームプログラミングの館から見なきゃ駄目フラグというころですかな?
45ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(24,248ポイント)
Date: 2009/04/04(土) 20:08
No:31690
|
|
Title: Re:最初からよくわからないですね。
|
|
VisualC++2008とDXライブラリの設定をしましたか?
していないようでしたら、
ゲームプログラミングの館のほうで詳しく書かれているのでそちらから
まず設定をしてください。
龍神録の館では
「ゲームプログラミングの館でDXライブラリに慣れたら」
と書かれていますように
ゲームプログラミングの館を読んでいることを前提にされています。(あるいは既に理解されている方)
61ポイント を手に入れた。
|
|
|
|
|
Name: かな ..ぴよぴよ(92ポイント)
Date: 2009/04/04(土) 20:31
No:31692
|
|
Title: Re:最初からよくわからないですね。
|
|
yuさん
成る程。少し早とちりしました。
VisualC++2008とDXライブラリは、まだ設定は愚か未だにDL中です。
58ポイント を落としてしまった。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,013,024ポイント)
Date: 2009/04/05(日) 09:50
No:31737
|
|
Title: Re:最初からよくわからないですね。
|
|
龍神録プログラミングの館は
「C言語の基本が解り、DXライブラリの基本的な使い方が解り、ゲームプログラミングの館を読んだ人」
が対象になっています。
一方、ゲームプログラミングの館は
「C言語の基本が解る人」
が対象になっています。
どちらも、C言語の経験が無いと突然始めるのは難しいと思います。
ですので「C言語 入門」などで検索して出てくるサイトでC言語の基本をまずは学んでみて下さい。
191ポイント を落としてしまった。
|
|
|
|
Name: 初心者です ..ぴよぴよ(46ポイント)
Date: 2009/04/04(土) 22:34
No:31709
|
|
Title: visual studio 2008 について
|
|
slnをダブルクリックして開いたところ
このバージョンには対応してませんと
でたのですが
2005は終了したらしいですね(気のせいかも・・・)
どうすればいいですか?
46ポイント を手に入れた。
|
|
|
|
Name: 初心者です@ ..ぴよぴよ(109ポイント)
Date: 2009/04/04(土) 23:05
No:31711
|
|
Title: Re:visual studio 2008 について
|
|
ありがとうございます
あぁ検索すればよかったですね^^;
もう一ついいでしょうか?
DXライブラリportableという物があるんですが
使い方がわからず困っています
場所違いかもしれませんが
よろしくお願いします
109ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(75,993ポイント)
Date: 2009/04/04(土) 23:29
No:31713
|
|
Title: Re:visual studio 2008 について
|
|
本家のブログを最初のほうからお読みください。
ttp://yureeeeeeeeen.blog79.fc2.com/
あとはこの辺ですかね
ttp://w2.abcoroti.com/~building/psp/type/type4.php
53ポイント を手に入れた。
|
|
|
|
|
Name: 初心者@ ..ぴよぴよ(11ポイント)
Date: 2009/04/05(日) 00:33
No:31715
|
|
Title: Re:visual studio 2008 について
|
|
なんとなくわかりました^^;
まだ勉強が必要ですね
ありがとうございました
11ポイント を手に入れた。
|
|
|
|
Name: さとり ..ぴよぴよ(35ポイント)
Date: 2009/04/04(土) 21:02
No:31699
|
|
Title: Visual studioとVisual C++について
|
|
初歩すぎてすみません
自分は自作シューティングを学びにここにきました。
しかしVisual studioの2005または2008が必要と記されてあったのでダウンロードしようと思ったのですが
製品版しか見当たりませんでした
もしかして、製品版を買わなければいけませんか
それとも2005,2008以外のフリーソフトで代用できるのはありますか?
35ポイント を手に入れた。
|
|
|
|
Name: yu [URL] ..上級者(24,344ポイント)
Date: 2009/04/04(土) 21:07
No:31702
|
|
Title: Re:Visual studioとVisual C++について
|
|
こちらから無償のものがダウンロードできますよ。
VC++2008EE
ttp://www.microsoft.com/japan/msdn/vstudio/express/default.aspx
#盛大に被りましたw
49ポイント を手に入れた。
|
|
|
|
|
Name: さとり ..ぴよぴよ(37ポイント)
Date: 2009/04/04(土) 21:33
No:31707
| 解決!
|
Title: Re:Visual studioとVisual C++について
|
|
ありがとうございました。
無事ダウンロードできました
>vuさん
似た投稿すみませんでした
以後気をつけます
2ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(24,431ポイント)
Date: 2009/04/04(土) 21:44
No:31708
|
|
Title: Re:Visual studioとVisual C++について
|
|
さとり様に対して言っているのではなくて、
自分の投稿がけんたろうちゃん様の投稿と同じ内容だったということです;
別に 被った とか書かなくても良かったですね。orz
今後気をつけます。
87ポイント を手に入れた。
|
|
|
|
Name: kzk ..ぴよぴよ(23ポイント)
Date: 2009/04/04(土) 19:48
No:31688
|
|
Title: 東方の二次創作
|
|
東方のキャラ(霊夢やまりさ)を使って、二次創作STGを作ることはOKなのでしょうか?
初歩的な質問ですいません
23ポイント を手に入れた。
|
|
|
|
Name: yu [URL] ..上級者(24,187ポイント)
Date: 2009/04/04(土) 20:05
No:31689
|
|
Title: Re:東方の二次創作
|
|
こちらのページを参考にして下さい。
ttp://www.geocities.co.jp/Playtown-Yoyo/1736/t-081.html
二次創作は大丈夫です。
著作物の画像や音楽等を無断で二次使用するのはNGです。
76ポイント を手に入れた。
|
|
|
|
Name: situmon ..上級者(22,326ポイント)
Date: 2009/03/29(日) 22:52
No:31362
|
|
Title: プレーヤー,敵画像の作り方
|
|
弾は、何回も試して納得いくのができましたが、
プレーヤーの画像と、
一番は 背景の画像が きれいに作れません。
絶対にどこで切れてるかわかります・・・
みなさんはどうやって作られているのでしょうか?
プログラミングと違って(これは勉強)
プロの技を見たほうがいい作品が作れるので、(やはりその人の技が出てくる)
お願いします。
118ポイント を手に入れた。
|
|
|
|
Name: yu [URL] ..上級者(23,011ポイント)
Date: 2009/03/29(日) 23:24
No:31363
|
|
Title: Re:引き続き画像の美しい作り方
|
|
pixiv等のサイトへ行けば絵が上手い人達がたくさん居られますよ。
プレイヤーの画像がドット絵なのか、立ち絵なのか分かりませんが・・・
動画サイトで絵を描く過程を撮ったものも見かたりします。
自分はたまにキャラとかのドット絵を打ったりしますが、
ドットを一通り打ってみる→遠くから見てみる→おかしなところを修正→遠くから....loop
というような流れでしています。
自己流なんでかなり効率悪いかもしれませんがw
背景の繋ぎ目が気になるのでしたら、
絵を反転させれば多少ですが気にならなくなると思います。
龍神録のback0.png(背景画像)みたいな感じです。
絵が下手な自分が言うのもあれですが・・・;
絵は練習した分だけうまく..なると思い...ます.....よ。
(説得力0)
2倍のポイントを手に入れた! 296ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(11,613ポイント)
Date: 2009/03/30(月) 16:24
No:31398
|
|
Title: Re:引き続き画像の美しい作り方
|
|
32x32 のチップを 64x64に4枚並べて中心部分を抜き取り
繋ぎ目を修正して新たなチップとする場合があります。
縦に繋がるチップなら縦に並べて、横なら横で…と、
あとは yuさんと同じで
遠くから見てみる→おかしなところを修正→遠くから....loop
ですね^^;
84ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(23,809ポイント)
Date: 2009/04/01(水) 00:49
No:31459
|
|
Title: Re:引き続き画像の美しい作り方
|
|
>>situmonさん
>繋ぎ目は大切なんですね!
あえて、繋ぎ目を見せると言うのも効果の一つですので覚えておくといいでしょう。
>プレーヤーの画像・・・
絵は練習しかないので、これをやった方がいいというのはあまりなかったりします。
「どのように描いていますか」よりも、最終的に自分で描いてそのパターンをものにすることになります。
また、人により描き方も変わってきます。
自分の場合キャラの立ち絵を描く場合、
目→前髪→輪郭→もみあげ辺り→耳→髪全体→顔より下・・・という手順ですが
勿論全員がそういう訳ではないので自分なりに練習していく方がいいです。
絵の練習で一番いいのは、正確に描くことよりも、量をこなす方が練習になります。
また、プロの技を盗む前に、まずは基本的な所を抑えていき、
その段階で「ここいいな!」ってのがあれば
その技術を自分なりに真似してものにすればいいです。
プロの方でなくとも、絵がうまい方の技術をいきなり真似するのはちょっと辛いかと思います。
長くなりましたが、「うまくなるためには練習しかないです」という事です(笑)
328ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(22,518ポイント)
Date: 2009/04/01(水) 08:48
No:31466
|
|
Title: Re:引き続き画像の美しい作り方
|
|
みなさま、ありがとうございます。
もしよろしければ、絵を見せていただけませんか?
あと東方のようなきれいなキャラクターの後ろ(つまりプレーヤーのドット絵)姿
はどのようにつくられているのですか(と推測できますか)?
自分は書いてから、縮小していると思いますが・・・
自分は 輪郭 目 前髪 髪全体 の順です。
よいアドバイスありがとうございます。
97ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(23,073ポイント)
Date: 2009/04/01(水) 09:30
No:31468
|
|
Title: Re:引き続き画像の美しい作り方
|
|
自分は圧縮せずにそのままドット打ってます。
自分も始めは輪郭からで、後は・・・適当です。^^;
プレイヤーのドット絵は打ったことが無いのでボスのドット絵を添付しておきます。(引用加工品です
初めて打ったやつなのでおかしい所があるかもしれません。
あんまり参考にしないでくださいw(ならないかorz
本当に唯の推測ですが本家東方でのボスのドット絵は、立ち絵を縮小してできていると思います。
例外はありますが・・・
プレイヤーのドット絵は・・・普通に打っていると思いますw
作業過程までは自分では推測できません・・・
#でも今見てみると縮小しているようにも・・・(プレイヤー画像)
110ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(22,640ポイント)
Date: 2009/04/01(水) 21:27
No:31514
|
|
Title: Re:引き続き画像の美しい作り方
|
|
いたずらチルノですね、
とてもうまいので感動しています。
>例外はありますが・・・
とはなんでしょう
>#でも今見てみると縮小しているようにも・・・(プレイヤー画像)
ドット絵ではあれを作るのは相当な技術がいるかと・・・
ドット絵はなにでつくりましたか?参考になるかもしれないので聞いてみたいなと思ったので・・・
122ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(23,324ポイント)
Date: 2009/04/01(水) 21:49
No:31516
|
|
Title: Re:引き続き画像の美しい作り方
|
|
EDGEというフリーのソフトを使用しています。
結構、高機能だと思います。
例外というのは、伝わらないかもしれませんが
永夜抄の霊夢とかです。
立ち絵とドット絵の格好が違いますね。
後のキャラは立ち絵と大体同じポーズだったのでそう思いました。
後、手打ちだとあんなぼやけた感じにはならないかなと。
インデックスに変換してみたところ、256色以上使われていましたしね・・・
115ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..かけだし(2,238ポイント)
Date: 2009/04/01(水) 22:07
No:31518
|
|
Title: Re:引き続き画像の美しい作り方
|
|
うぎゃ!添付できてなかった・・・
もっかい添付しなおしときます、連投ですいません・・・(ちゃんと添付できてるかな・・・?)
2倍のポイントを手に入れた! 120ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(22,703ポイント)
Date: 2009/04/01(水) 22:10
No:31519
|
|
Title: Re:引き続き画像の美しい作り方
|
|
何を添付してくださったのか知りたいのですが、
たぶん添付できていないとおもいます。
こちらのまちがえならすいません。
63ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..かけだし(2,302ポイント)
Date: 2009/04/01(水) 22:10
No:31520
|
|
Title: Re:引き続き画像の美しい作り方
|
|
あ〜まただ・・・どの拡張子なら添付できるんだろう・・・
これで駄目だったらあきらめます・・・
2倍のポイントを手に入れた! 64ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(22,734ポイント)
Date: 2009/04/01(水) 22:20
No:31523
|
|
Title: Re:引き続き画像の美しい作り方
|
|
できでますよ!!
すばらしいです!
空を飛ぶ魔法使いですね。
でも東方らしさを出すにはどうすればいいのでしょうか?
31ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(23,575ポイント)
Date: 2009/04/01(水) 22:37
No:31529
|
|
Title: Re:引き続き画像の美しい作り方
|
|
東方らしさというものが分かりませんが・・・
ZUN様の絵を参考にすればいいんじゃないでしょうか?^^;
画風を合わせるのは難しいと思います・・・
まず絵が描けないと画風すら変えられないので
絵をうまく描けるようになってからだと思います。
65ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(2,622ポイント)
Date: 2009/04/01(水) 22:53
No:31532
|
|
Title: Re:背景画像をつくる
|
|
東方っぽい絵というか東方の自機に似た絵は描こうとしたんですけど、なかなか出来ませんでした…
白色で光の反射の感じを出したりとか結構難しいです、あれはきっとZUNさんの技ですね
やっぱりここはひたすら練習、これに限るんでしょうねぇ(泣)
120ポイント を落としてしまった。
|
|
|
|
|
Name: EX ..ぴよぴよ(232ポイント)
Date: 2009/04/01(水) 23:36
No:31537
|
|
Title: Re:背景画像をつくる
|
|
東方っぽさねぇ。
服が暗いからかもしれませんね。
明るくしてみました。
40ポイント を手に入れた。
|
|
|
|
|
Name: あ〜る ..入門者(3,031ポイント)
Date: 2009/04/01(水) 23:53
No:31541
|
|
Title: Re:背景画像をつくる
|
|
おぉ、色が明るくなるだけで、だいぶイメージが変わるもんですね。
でもあれですよね、東方の画像ってなんかもっとスリムっていうか・・・なんかそんなイメージありますよね。
難しいなぁ・・・
2倍のポイントを手に入れた! 136ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..プログラマー(25,325ポイント)
Date: 2009/04/02(木) 02:45
No:31551
|
|
Title: Re:背景画像をつくる
|
|
>>situmonさん
ドット絵ばかりだったのでドットでない絵も一緒に同梱してみました。
ドットは二年くらい前に初めて打ったものです。参考になるか怪しいですが・・・
ttp://www.uploader.jp/dl/SampleUP/SampleUP_uljp00001.zip.html
何故か解りませんが、誰かの画風を真似して描くと、全然そんな風に見えなかったりします。(トレス除く
なんというか、絵を描いた本人の味といいますか・・・。
ですので、画風を真似する上で自分の画風を身につければいいですよ^^
自分の場合ですが、絵の原点はポケモンのフシギダネとサトシです。
今となってはポケモンの画風などとはかけ離れてますが、ポケモンを真似してた結果、
自分なりの画風になっていき、そこからまた練習していった結果こうなりました。
2倍のポイントを手に入れた! 548ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(22,802ポイント)
Date: 2009/04/02(木) 08:19
No:31552
|
|
Title: Re:背景画像をつくる
|
|
霊夢うまいです!
後ろの背景とよくなじんでいますが、
なんのペイントソフトでかかれましたか?
あとやはり東方の絵は難しいと思ったので自分の画風で行くことにしました。
68ポイント を手に入れた。
|
|
|
|
|
Name: EX ..ぴよぴよ(326ポイント)
Date: 2009/04/02(木) 13:08
No:31562
|
|
Title: Re:背景画像をつくる
|
|
んじゃぁっ・・・
東方の画像を改造する、というのは?
28ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(23,590ポイント)
Date: 2009/04/02(木) 13:21
No:31565
|
|
Title: Re:背景画像をつくる
|
|
そこらへんのことはこちらで纏められていますね。
ttp://www.geocities.co.jp/Playtown-Yoyo/1736/t-081-3.html
二次使用の場合
個人で使用するのなら問題ないと思いますが、
配布するとかになると許可がないとだめなようです。
15ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..プログラマー(25,226ポイント)
Date: 2009/04/02(木) 15:10
No:31583
|
|
Title: Re:背景画像をつくる
|
|
>>situmonさん
>なんのペイントソフトでかかれましたか?
使用ソフトは有料ですが、相棒の「PhotoShop7.0」です。
無料のソフトでも、使いまくればきっとクオリティの高い絵を描くことができると思います。
有料だからいい絵が出来ると言う訳ではないので、
自分に合ったソフトを使いまくるのも絵の上達の第一歩かなーと思います。
99ポイント を落としてしまった。
|
|
|
|
|
Name: BEMANI ..プログラマー(25,398ポイント)
Date: 2009/04/03(金) 11:49
No:31631
|
|
Title: Re:背景画像をつくる
|
|
>>situmonさん
エレメンツ(PhotoShopElements7.0)ではない7.0(PhotoShop7.0)です。
結構古いので売ってるかどうかさえ怪しいバージョンです・・・。
最近ですとCS〜ですからねぇ・・・
PhotoShopが平均どれくらいするか気になるならグーグルで調べてみるといいですよ。
値段は軽く万単位です。
フリーで済ませられるなら一番いいですよ><
172ポイント を手に入れた。
|
|
|
|
|
Name: 叉奈 ..ぴよぴよ(841ポイント)
Date: 2009/04/03(金) 13:28
No:31635
|
|
Title: Re:背景画像をつくる
|
|
もう必要ない意見かもしれませんが…。
立ち絵を描くならSAI又はPaintshop Proが使いやすいと思います。
でもプレイヤーならドット絵…が向いてるかも。
SAIはシェアになってしまいましたが使いやすいです。
最新の方ではpngで出力するときにαチャンネルがあるので
普通に描いて縮小したものを出力すればいいと思います。
Paintshop ProはPCに最初から搭載されていたりなどフリーなので
使いやすいと思います…。
あとはドット絵でがんばるという方法も…。
あとドット絵にするときは、斜め上から見る感じにすると
立体感がでていい感じになるそうです。←受け売り
添付はSAIで描いたものです。
258ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(13,048ポイント)
Date: 2009/04/03(金) 15:04
No:31637
|
|
Title: Re:背景画像をつくる
|
|
叉奈さん
> Paintshop ProはPCに最初から搭載されていたりなどフリーなので
PC購入時の代金に含まれていのであってフリーではないと思いますよ。
お試し用の期間限定版はあるようですが。
33ポイント を手に入れた。
|
|
|
|
|
Name: situmon ..上級者(23,172ポイント)
Date: 2009/04/03(金) 18:56
No:31645
|
|
Title: Re:背景画像をつくる
|
|
1万ならいいですが(別にお金を持ってるわけではないですが、一度買えばずっと使えそう()
10・・・万だとかなり・・・
SAIもみてみます!
ありがとうございます。
うえのえはPIXIAでかきました
70ポイント を手に入れた。
|
|
|
|
Name: AS ..入門者(3,437ポイント)
Date: 2009/03/28(土) 17:11
No:31322
|
|
Title: FPSが60にならない
|
|
管理人様のページを参考にFPSを綺麗に60で統一させたいのですが、50〜55あたりまでで60には届きません。
デスクトップ画面で右クリックからプロパティを見るとリフレッシュレートはちゃんと60Hzになっています。
当たり判定などの計算が大量に出てくるプレイ中ならともかく、まだほとんど手をつけていない為、特に処理がないであろうタイトル画面などでも50〜55あたりに留まってしまいます。
試しに私のPCで龍神録のFPSを見ると、57あたりをウロウロする感じでたまにスペック不足の表示が出てしまいます。
さらにもう一つ試しにということで東方妖々夢も見てみたところ、これは59.8などほぼ60といえる数値でした。
60FPSに合わせる方法はSleepを使うものではなくwhileで一定時間まで時間を稼がせるものを使っています。
while(GetNowCount() - gametime <= 16.66666666 * fps){}//60Hzにあわせる
if(fps > 59){
gametime = GetNowCount();
fps=0;//2行後1に
}
fps++;
16.66666666の部分を25に変えれば40FPSに、20に変えれば50FPSになってくれるので書き方自体は問題ないのではないかと思います。
単なるスペック不足かとも思いましたが、処理がほとんどないタイトル画面でもFPSが低い、東方は問題なく出来ている、という点からして、どうもスペック不足以外の原因がある気がしてしまいます。
もし改善法がわかる方がおられましたら、助言をいただきたいです。
187ポイント を手に入れた。
|
|
|
|
Name: 朽木 ..中級者(10,069ポイント)
Date: 2009/03/28(土) 21:34
No:31327
|
|
Title: Re:FPSが60にならない
|
|
while( device is running ) {
auto int NowTime = GetNowCount();
static int NextTime = NowTime + 16;
if ( NextTime > NowTime )
continue;
NextTime += 16;
/* 処理 */
} の形でもだめですか? ナシ。ループ内に無駄な処理無いですか?for(;strlen() > value;) {} とか。
あと、がんばって精度を高めようと 16.66666666 と書いているようですが、
精度はミリ秒ですので、16.6でも16と同等です。
184ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(10,990ポイント)
Date: 2009/03/28(土) 21:40
No:31328
|
|
Title: Re:FPSが60にならない
|
|
部分的すぎてよく解らないのですが、
while(GetNowCount() - gametime <= 16.66666666 * fps){} //60Hzにあわせる
1000/60 をカウントしているとすると
fps をかけるのはおかしくないですか?
117ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(335,733ポイント)
Date: 2009/03/28(土) 22:07
No:31332
|
|
Title: Re:FPSが60にならない
|
|
朽木さん
>精度を高めようと 16.66666666 と書いているようですが
>精度はミリ秒ですので、16.6でも16と同等です
fpsと掛けていて、fpsは最大 60まであがっていきますので、
その時は 60*16.66666666と 60*16とは同等にはならないかと思います。
SooAさん
>fps をかけるのはおかしくないですか
起点となる gametimeが 60フレームに1回しか更新されないので、
一応動くのではないでしょうか。
136ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,559ポイント)
Date: 2009/03/29(日) 00:40
No:31336
|
|
Title: Re:FPSが60にならない
|
|
とりあえず、このままでは原因がつかめないので、試しにこれを実行してみてください。ひどいコードですが、応急処置です。
実行すると、AppLog.txtが出来るので、参考までに結果を教えてください。
私の環境では、大体60FPSになりました。
100ポイント を手に入れた。
|
|
|
|
|
Name: AS ..入門者(3,657ポイント)
Date: 2009/03/29(日) 10:20
No:31342
|
|
Title: Re:FPSが60にならない
|
|
多くの助言ありがとうございます。
朽木さん>
device is runningやfor(;strlen() > value;) {}はC言語以外での書き方でしょうか?
whileのdevice is runningの書き方を試してみたのですが、コンパイルできませんでした。
SCIさん>
部分的に見たことの無い文などもありましたが、とりあえず実行してみると結果は
ScreenFlip = 17 ms
FPS(終値)= 60.16
となり、実行中の数値を見ても大体60に近い数値を出していました。
どこがどうなって改善されたのかまだよくわからないので、そこをご説明いただけたらと思います。
220ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..中級者(10,360ポイント)
Date: 2009/03/29(日) 11:24
No:31350
|
|
Title: Re:FPSが60にならない
|
|
>whileのdevice is runningの書き方
分かりにくくてごめんなさい。オレンジ色の部分は「〜の意味」のものが入ります。
device is running が分かる関数や変数に書き換えてくださいってことです。
というか、16.6666の時は、何もしなければしないほど60に近くなるんですが、
処理をすればするほど60よりも遅くなるので、61〜66(?)程度の誤差は良しとして、
余りの0.6をほかの処理(判定や裏画面)時間に充てた方が良いんじゃないでしょうか@@
「時間進行を完全管理したい」っていうのであれば、フレーム進行ではなく、
時間進行にするという手もあります。while ( device is running ) {
NowTime = GetNowCount();
EffectSize = NowTime - BeforeTime;
if ( !EffectSize )
continue;
BeforeTime = NowTime;
}
_
291ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,662ポイント)
Date: 2009/03/29(日) 17:36
No:31357
|
|
Title: Re:FPSが60にならない
|
|
ScreenFlip = 17 ms
FPS(終値)= 60.16
となり、実行中の数値を見ても大体60に近い数値を出していました。
ということは、元のプログラムでFPS算出方法がちょっとおかしいかもしれません。
元のプログラムで描画している画像の量によっては本当に処理落ちしているかも知れませんが・・・
画像の量とかどのくらいですか?
朽木さん
>device is running
まず「デバイスが実行中」の意味を定義しなければなりません。
deviceがDirectXで使うデバイスインターフェイスを指すならば、普通は「使用可能」とでも表現するでしょうが、そもそもDXライブラリではデバイスという概念が隠されています。
103ポイント を手に入れた。
|
|
|
|
|
Name: AS ..入門者(3,688ポイント)
Date: 2009/03/30(月) 10:07
No:31383
|
|
Title: Re:FPSが60にならない
|
|
算出方法ですか…。最初にも書いたように16.6666666のところを25に変えれば正しく40FPSとなり、20に変えればこちらも正しく50FPSになるので、算出方法には問題ないかと思っていたのですが…。
画像の量ですが、タイトル画面の場合たった一つだけです。そして今回の場合画像の量、処理の量が増えるプレイ中でもタイトル画面時とFPSが変わらないというのもあります。
一応表示にかかわる算出方法は以下です。
static int t=0,f[60];
static double ave=0;
f[fps-1] = GetNowCount() - t;//-1はfpsが0ではなく1から始まるため
t = GetNowCount();
if(fps==60){
ave=0;
for(int i=0; i<60; i++)
ave += f[i];
ave /= 60;
}
if(ave!=0){
DrawFormatString(20,440,GetColor(0,255,0),"%.2fFPS",1000.0/ave);
DrawFormatString(20,460,GetColor(0,255,0),"%.2fms",ave);
}
それと何かの原因でどこかの処理で時間を食っているのではないかと思う現象が一つあります。
以前whileで規定の時間まで時間を稼がせるようにしていると書きましたが↓
while(GetNowCount() - gametime <= 16.66666666 * fps){}//60Hzにあわせる
この{}内にDrawFormatString(200,200,GetColor(255,0,0),"B");と書いてみたのです。
つまり時間稼ぎの為に一度でもループ内に入ったら画面に「B」と表示されるのです。
結果はたまにBと表示されるというものでした。
なので時間稼ぎなどしている余裕はない。むしろ時間が足りていないことを表わしているのではないかと思います。
16.66666666の部分を25(40FPS)などにすれば、やはりBが表示される時間は長くなっていました(それでもたまに消えるほどです…)
31ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,682ポイント)
Date: 2009/03/30(月) 14:34
No:31393
|
|
Title: Re:FPSが60にならない
|
|
SetWaitVSyncFlag(FALSE);を追加してみてください。
20ポイント を手に入れた。
|
|
|
|
|
Name: AS ..入門者(3,757ポイント)
Date: 2009/03/30(月) 17:26
No:31400
|
|
Title: Re:FPSが60にならない
|
|
SCIさん>
その一行を追加してみると上手くできました。ありがとうございますm(__)m
どんな命令だったのかとDXライブラリのHPに行くと…
ScreenFlip関数の実行時にCRTの垂直同期信号を待つか、を 決めるフラグを設定する関数です。基本的に待ったほうが画面の ちらつきが減り綺麗に表示されます。
この関数は垂直同期信号の意味を理解していて、その上で状態を 変更したい方だけが使用してください。恐らく普通は変更する必要は ないと思います。
…これはどういう意味なのでしょうか…?
綺麗に表示…のくだりを見ると何かを犠牲にしているような書き方ですね…
普通変更の必要はないみたいですが、今回変更したということは何かしら私の環境は普通ではなかったのでしょうか?
69ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(75,451ポイント)
Date: 2009/03/30(月) 17:49
No:31404
|
|
Title: Re:FPSが60にならない
|
|
垂直同期(VSync で検索すると出てきます)というのは、画面全体の転送(描画)が終わるのを待ち、転送中の色情報が書き換わることによる
チラつきを抑える役割をはたしています。
画面を60Hz(ディスプレイによって違いますが)間隔で垂直同期が行なわれ、転送を行なっているのですが、
この待ち時間がうまくいかないディスプレイが(他にも要因はありますが)あり、
何もしていなくても AS さんのように FPS が 60 に届かなかったり、逆に 60 を超えることがあります。
この垂直同期を切るという事は、画面の転送タイミングを無視して画面の更新を行なうことができ、
上記要因による不具合が解消されることを意味します。
(代わりにチラつきや転送の境目の線が出ます)
ただし、待ち処理を CPU 側で行なうため、 CPU の占有率が飛躍的に上がります(シングルコアの CPU なら100% まで上昇)。
今回の場合、
while(GetNowCount() - gametime <= 16.66666666 * fps){}//60Hzにあわせる
とあるので、望みどおりの時間までここをループし続けているため、 CPU を占有しています。
# Sleep を使えば CPU をさほど占有せずに済みますが、精度が悪いので、更新がカクつきます。
345ポイント を手に入れた。
|
|
|
|
|
Name: ね〜す ..初心者(5,625ポイント)
Date: 2009/03/31(火) 02:35
No:31422
|
|
Title: Re:FPSが60にならない
|
|
東方シリーズでVSyncの利用をユーザー側で決められるのは、
このような事例があるからなんですね。
一つ、勉強になりました。
(もっとも、私は質問者ではありませんが。)
63ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,741ポイント)
Date: 2009/03/31(火) 12:36
No:31427
|
|
Title: Re:FPSが60にならない
|
|
例えば、75FPSや50FPSで更新しているPCでプログラムを起動すると、移動処理をフレーム当たりの移動量で計算していた場合、移動速度が変わります。
プログラム側でFPSを調整するか、もしくは移動処理を時間で計算するかなどで処理速度を一定にします。
59ポイント を手に入れた。
|
|
|
|
|
Name: AS ..入門者(4,381ポイント)
Date: 2009/03/31(火) 14:59
No:31433
|
|
Title: Re:FPSが60にならない
|
|
なるほど…勉強になりました…
調べてみるとFPSの問題は結構皆さん苦労されてるようですね。
VSyncをオフにすることも一つの手段として皆さんやっておられる印象でした。
チラつきは今のところ気になりません。CPUの方も垂直同期によってかなりの差があることを確認できました(私の場合100%まで上がりました)
しかしこうなるとやはり100%だなんて大丈夫だろうか…?という心配が出てきます。
何か弊害が現れそうな雰囲気ですが、どうなんでしょうか…?
通常、垂直同期を切る必要はないということは私のディスプレイが特殊なタイプであったのかと思いますが、そうなると東方は「垂直同期を取らない」のチェックが外れていた(オンになっている)にもかかわらず、何故60FPSになることができたのかという疑問が新たに出てきてしまいます。
さらに少し調べているときにフルスクリーンとウィンドウでも差が出るというのを見かけたので、今まではウィンドウで作成を進めていましたが、久しぶりにフルスクリーンで起動してみると垂直同期をオフにしなくても60前後で安定をするという、これまた難解な動作をしてきました。
ちなみに東方をウィンドウで起動してみると、こちらはウィンドウであっても60前後で安定してました。
このあたりはどう解釈したらよいのでしょうか?
垂直同期をオフにしてCPU使用率が上がっても問題はない。であるのなら一挙解決ですが、どうもそう上手くはいかない雰囲気を感じ取っています…
624ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,725ポイント)
Date: 2009/03/31(火) 15:23
No:31434
|
|
Title: Re:FPSが60にならない
|
|
> しかしこうなるとやはり100%だなんて大丈夫だろうか…?という心配が出てきます。
ゲームをしながら別の重要な仕事をする、などを保障外にしてしまえばいいです(笑
ただ、そのままではCPUがオーバワークなので、Sleep(1)を入れるのが一般的です。
> 通常、垂直同期を切る必要はないということは私のディスプレイが特殊なタイプであったのかと思いますが
いや、今回の場合、ScreenFlip()による信号待ちと、while回しによる時間稼ぎを両方行っていたためかと思われます。
ASさんのディスプレイは60Hzです。
東方はフレーム毎の移動量を計算しているので、60Hzで動くことを想定しています。
ここで、ディスプレイが50Hzとかだった場合、素直に信号待ちしていると速度がおかしくなるので、この場合はプログラムの方で時間調整をします。
#追記
「両方行う」は原因ではないですね。
詳細なコードが分からないのでテストできませんが、整数と小数の比較での精度が問題でしょう。
「 < 16.66」と書くと、左辺がdoubleに型変換されるので、実質17ms待ちとなります。
上で出したサンプルコードでは、「 < 16」としているので、理論上60FPS以上となります。
16ポイント を落としてしまった。
|
|
|
|
|
Name: AS ..入門者(4,470ポイント)
Date: 2009/04/01(水) 12:14
No:31473
|
|
Title: Re:FPSが60にならない
|
|
保障外(笑)確かにそれもありですね。
Sleep(1)を入れるとCPU使用率が激減しました。
東方は60Hzで動くことを想定している。なのでディスプレイ設定が60Hzであったならwhileによる時間調整などは行わない。なぜなら60Hzの設定になっているので、ほっといても60FPSになるから。
ただし50Hzや75Hzだった場合は垂直同期を切るなどのなんらかの時間調節を行って60Hz環境を作り出す。その代わりティアリングなどが起こるかもしれない。
…ということですよね?
しかし今回の私の場合、whileによる時間稼ぎの行をなくして、垂直同期を切らないように(つまりディスプレイの60Hz設定にあわせる)しても、60FPSにならない(約50〜55)のは何故でしょう…?理解が及ばず申し訳ないです。
普通このような設定にすれば、60Hz環境では60FPS、75Hz環境では75FPSになると思うのですが…
もちろんwhileによる時間稼ぎの行をなくして、垂直同期を切るとものすごいスピードでゲームが進行しました(笑)
89ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(75,751ポイント)
Date: 2009/04/01(水) 13:28
No:31481
|
|
Title: Re:FPSが60にならない
|
|
ウインドウモード時では、画面への描画処理にコピーモード(描画データへコピーする処理)しか行なえないため、
垂直同期を取っていても転送遅延やちらつきが出ます。
(私の昔のノートPCでは40〜60を行き来していました)
これは転送タイミングをうまくあわせることで 60 に安定させることが可能ではないかと思います。
フルスクリーンモードの場合、ほぼ完全に画面処理を占拠でき、
且つ描画処理にフリップモード(描画データへのアドレスを入れ替える処理)が行なえるので、
垂直同期を待つだけで容易に指定されたFPSを維持できます。
2倍のポイントを手に入れた! 274ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,603ポイント)
Date: 2009/04/01(水) 14:37
No:31486
|
|
Title: Re:FPSが60にならない
|
|
>しかし今回の私の場合、whileによる時間稼ぎの行をなくして、垂直同期を切らないように(つまりディスプレイの60Hz設定にあわせる)
>しても、60FPSにならない(約50〜55)のは何故でしょう…?理解が及ばず申し訳ないです。
この場合、Sleep(1)は入れてないですよね?
whileを入れた場合の原因は型変換ですが、ScreenFlip()だけの場合でも60FPSにならないなら、原因はちょっとわかりません。
スペック不足でもないし、計算方法も間違ってはいないようなので・・・
122ポイント を落としてしまった。
|
|
|
|
|
Name: SCI ..上級者(21,677ポイント)
Date: 2009/04/01(水) 14:48
No:31489
|
|
Title: Re:FPSが60にならない
|
|
またASさんの場合、過去に
ScreenFlip = 17 ms
という結果が出ているので、少なくとも58.82FPS以上は出るはずです。
74ポイント を手に入れた。
|
|
|
|
|
Name: AS ..入門者(4,712ポイント)
Date: 2009/04/02(木) 10:35
No:31557
|
|
Title: Re:FPSが60にならない
|
|
お二方ありがとうございます
SCIさん>
Sleep(1)は入れておりません。完全に待ち時間ゼロの状態です。なのに…うーん何なんでしょうか…
過去に17msという数値を出しましたが、あれは垂直同期をオフにした時の結果です。
垂直同期をオンにするとやはり50〜55あたりになってしまいます。
垂直同期をオフにすれば60FPSにはできますが、ティアリングが起こっているのを確認できてしまったため、垂直同期をオンにしたまま60FPSを確保したいのです。
御津凪さん>
>私の昔のノートPCでは40〜60を行き来していました
私の現状と似た感じかもしれませんね。ウィンドウ時のみFPSの低下が起こります。
転送タイミングを合わせるとはどういうことでしょう?
242ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(76,116ポイント)
Date: 2009/04/02(木) 11:55
No:31560
|
|
Title: Re:FPSが60にならない
|
|
> 転送タイミングを合わせるとはどういうことでしょう?
ウインドウモードでは垂直同期自体がずれているのが原因でFPSにズレが出ているはずなので、
FPSのズレに応じて移動処理関数の呼び出しをコントロールする、というものです。
これにより、描画の間隔は変わりませんが、実際のゲーム速度は変わらないようにすることが出来ます。
これはいわゆるフレームスキップというもので、描画に時間がかかったらフレーム時間を合わせるために
移動処理関数を複数回呼び出すことで転送タイミングとあわせます。
ただ、シューティング・アクション系などの常に動くゲームに対してフレームスキップ処理をすると、
処理が重くなった時にゲームにならなくなります。
(描画されていない間も移動処理していることになるため)
一般のPCゲームでもフルスクリーンとウインドウでの描画更新自体に差があるのがほとんどです。
ですので、いっその事フルスクリーン推薦としておくのも一つの手かなと思います。
ちなみに、東方地霊殿でもウインドウモード・60FPSに合わせた設定でティアリングが起こりました。
365ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(22,273ポイント)
Date: 2009/04/02(木) 22:41
No:31618
|
|
Title: Re:FPSが60にならない
|
|
>過去に17msという数値を出しましたが、あれは垂直同期をオフにした時の結果です。
私の提示したプログラムのことを言っているので、これは違います。あれはオフにする前の結果を取っています。
>ティアリングが起こっているのを確認できてしまったため
ダブルバッファリングをしていますか?
84ポイント を手に入れた。
|
|
|
|
|
Name: AS ..初心者(5,280ポイント)
Date: 2009/04/03(金) 10:58
No:31630
|
|
Title: Re:FPSが60にならない
|
|
SCIさん>
書き込みナンバー(?)31336のときに提示していただいたソースですよね?
確かに初めの一回は垂直同期オンの状態で計測していますが、やはり一度だけなので早いときもあれば遅いときもある、といった感じではないでしょうか?
試しに一度目を計測しファイル出力する関数を少し改変し、一度だけではなく180回の平均を出すようにしてみたところ
ScreenFlip = 21.166666 msや20.1 ms、最速でも18.727778 ms
となりました。
5回ほど実行した中で最速記録をもってしても約53FPSです。
改変したものは以下です。
int t3=0;
for(int i=0; i<180; i++){
ScreenFlip();
int t1 = timeGetTime();
ScreenFlip();
int t2 = timeGetTime();
t3 += t2 - t1;
}
double a=t3/180.0;
FILE *fp = fopen("AppLog.txt", "w");
fprintf(fp, "ScreenFlip = %f ms\n", a);
fclose(fp);
あとダブルバッファリングですがSetDrawScreen(DX_SCREEN_BACK)を書き加えた後、ScreenFlipで裏画面と表画面を入れ替えて表示させることですよね?それならば問題なく出来てると思います。
御津凪さん>
なるほど。その方法でしたか。実はかなり前になりますが、作成当初はその方法を用いていました(笑)
ですが、それよりは現在の方法のほうがよいのでは?と考え変えた次第です(まぁその方法で今引っかかってるわけですが…)
フルスクリーン推奨ですか…確かにもうそれぐらいしかないかもしれないですね…
ただフルスクリーンもフルスクリーンでディスプレイによって不具合が起きたりするとどこかで見かけたことがあるので、今後また引っかかって、この掲示板でお世話になることがあるかもしれません。
かの東方でもウィンドウモードだとティアリングが起きるということで、この問題はかなり難しく皆さんそれぞれある程度妥協をしているのかもしれませんね…
568ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(22,429ポイント)
Date: 2009/04/03(金) 12:02
No:31632
|
|
Title: Re:FPSが60にならない
|
|
>確かに初めの一回は垂直同期オンの状態で計測していますが、
ですよね。この部分について言及したつもりですが、分かりにくかったようで。
>あとダブルバッファリングですが・・・
いよいよスペック不足な気がしてきました。
一度もスペックを明示していないので「十分なスペック」と勝手に仮定していましたが、どうも早計だったようです。
とりあえず、ダブルバッファリングしていればティアリングはある程度抑えられるはずですが、それは私のPCだけかも知れませんね。
妖々夢でウィンドウ・同期無しでもティアリングは発生しないので。
156ポイント を手に入れた。
|
|
|
|
|
Name: AS ..初心者(5,514ポイント)
Date: 2009/04/04(土) 15:11
No:31674
|
|
Title: Re:FPSが60にならない
|
|
スペック不足ですか。
それならそれで原因もはっきりして、ある意味解決かなとも思いますが…
妖々夢はウィンドウ、同期なしですと、少しだけティアリングを起こします。
しかし、私のプログラムと比べるとティアリングの起こる頻度は私のほうが上なようにも思えました。この比較が正しいかはちょっと自信がないですが、そんな気がするという感じです。
あと妖々夢はウィンドウ、同期ありでもやってみたところ、60FPSを保てていました…
スペックは確かにあまり高いとは言えませんが、逆に低すぎるものでもないのではないかと思っております。
Celeron CPU1.6GHz
メモリ1GB
で、OSはXPです。
234ポイント を手に入れた。
|
|
|
|
Name: s-rush ..熟練のプログラマー(45,227ポイント)
Date: 2009/03/30(月) 11:55
No:31389
|
|
Title: 名前の入力画面
|
|
いつもお世話になってます。
今RPGによく見かける主人公等の名前の入力画面を実装しています。
仕様としては、キーボードからの直接入力ではなく、
RPGで一般的な文字を選択するタイプを考えています。
イメージ図を張らせていただきます。
しかし、この制御をするよいアイデアが思いつきません。
というのも、文字にはひらがな、カタカナ、アルファベット(全角大文字)と
個の3種類がおもに用いられると思うのですが、
馬鹿正直に座標ですべてを制御するなら、swtich文で、約120通りの条件わけをする必要があると思います。
でもこのようにしてしまうと、120通りの条件わけをするのも面倒ですし、
何よりソースコードが無駄に長くなってしまい、デバッグも大変になると思います。
この文字を選択する制御の部分で、良いアイデアがあればご教授お願いします。
まだアイデアというか実装方法を模索中なので、ソースコードはありませんがよろしくお願いします。
今回は環境はあまり関係ないかもしれませんが、開発環境はVC++ 2008 EEです。
365ポイント を手に入れた。
|
|
|
|
Name: Mist ..熟練のプログラマー(57,717ポイント)
Date: 2009/03/30(月) 12:10
No:31391
|
|
Title: Re:名前の入力画面
|
|
私だったらテーブルにします。
typedef struct {
int x; // X座標
int y; // Y座標
char h_mozi[3]; // ひらがな文字
char k_mozi[3]; // カタカナ文字
} ST_MOZI;
const ST_MOZI mozitbl[] = {
{ 100, 100, "あ", "ア" },
{ 100, 120, "い", "イ" },
・
・
{ -1, -1, "", "" }, // テーブルエンド
};
ST_MOZI *ptbl;
for (ptbl = mozitbl; ptbl->x != -1; ptbl++) {
if (今の座標と一致するか) {
;
}
}
158ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(11,529ポイント)
Date: 2009/03/30(月) 13:21
No:31392
|
|
Title: Re:名前の入力画面
|
|
文字データを確保しておいて、
char ndat1[5*11][] = { "あ","い","う","え","お", ..(略
char ndat2[5*11][] = { "ア","イ","ウ", ..(略
char ndat3[5*11][] = { "A","B","C", ..(略
// 名前5文字分
int name_num[5][2] = { 0,0,0,0,0, 0,0,0,0,0 } ; // 0 で初期化しておく
char name[16] = {""} ;
0 1 2 3 4
0 あ い う え お
1 か き く け こ
2 さ し す せ そ
3 た ち つ て と
4 な に[ぬ]ね の
5 は ひ ふ へ ほ
6 ま み む め も
7 ら り る れ ろ
8 や ゆ よ わ を
9 ん 〜 ー ゛ V
A ! ? $ &
「ぬ」の部分にカーソルがあるとすると
X=2,Y=4
// 修正変更する事を考慮して番号だけ記憶しておく
name_num[ 書き込み位置 ][0] = 種類 ; // 1 ひらがな/2 カタカナ/3 アルファベット
name_num[ 書き込み位置 ][1] = Y*5+X ;
// 最終決定で name_num から名前の文字列を作成する。
for( int i=0; i<5; i++ )
{
if( name_num[i][0] == 1 )
strcat( name, ndat1[ name_num[i][1] ] ) ;
if( name_num[i][0] == 2 )
strcat( name, ndat2[ name_num[i][1] ] ) ;
if( name_num[i][0] == 3 )
strcat( name, ndat3[ name_num[i][1] ] ) ;
}
後は応用で。
467ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(45,378ポイント)
Date: 2009/03/30(月) 15:01
No:31397
|
|
Title: Re:名前の入力画面
|
|
yuさん、Mistさん、SooAさん、丁寧な解答ありがとうございます。
Mistさんのおっしゃるようにテーブル化したほうが後の管理がしやすそうですね。
最終的な名前の決定のやり方をSooAさんのソースを参考にして、
少しプログラムを書いてみます。
プログラムを書いているときに、わからないことが出てくるかもしれないので、
まだ解決ボタンは押さないでおきます。
151ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(45,562ポイント)
Date: 2009/04/04(土) 10:57
No:31661
|
|
Title: Re:名前の入力画面
|
|
Mistさんのプログラムで少し疑問があります。
typedef struct {
int x; // X座標
int y; // Y座標
char h_mozi[3]; // ひらがな文字
char k_mozi[3]; // カタカナ文字
} ST_MOZI;
このh_mozi[3];は3バイト分ですよね?
ひらがなやカタカナって2バイトなので(←間違っていたらすいません
配列要素は2で充分だと思うのですが・・・
何か終端文字が付加されて配列要素は3になるのでしょうか?
いまこのあたりのプログラムを作っているのですが、
ここをちゃんと理解しないと名前入力部のプログラムができないので、
どなたかご教授お願いします。
184ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(24,041ポイント)
Date: 2009/04/04(土) 11:12
No:31662
|
|
Title: Re:名前の入力画面
|
|
文字か文字列の違いですかね?
(プログラムを勉強しているわけではないのでしっかりしたことは言えないです;)
文字列だと最後に \0 がいるので3バイトだと思います。
唯の文字 を入れるの なら2バイトじゃないですか?
#すみません、間違っていました。orz
71ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(45,665ポイント)
Date: 2009/04/04(土) 11:31
No:31664
|
|
Title: Re:名前の入力画面
|
|
文字をテーブルに入れて初期化しようとしているのですが、
配列の要素数を2にするとエラーが出ています。
初期化子が多いとかなんとか・・・
最後に\0が入っていると考えてもよろしいのでしょうか?
103ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(24,062ポイント)
Date: 2009/04/04(土) 11:46
No:31666
|
|
Title: Re:名前の入力画面
|
|
あまり詳しいことは言えないのですが、
全角文字は1つの文字ではなく複数の文字を組み合わせて1つの全角文字を作っているらしいです。
だからその全角文字ひとつをそのまま文字として入れるのはできないと思います。
(間違っていたらすみません; というか間違っていそう・・・)
文字列で扱ったほうが良いと思います。
21ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(13,375ポイント)
Date: 2009/04/04(土) 13:39
No:31670
|
|
Title: Re:名前の入力画面
|
|
初期化部分で "" を使用して代入していますが
"" は文字列を表すので自動的に \0 が含まれ、
+1バイト必要になります。
■今回では必要ないと思いますが、
今後の為に2バイトで制御する場合の
データのあり方を書いておきます。
例えば「あ」を数値化すると 0x82 と 0xA0 ですので
h_mozi[0] = 0x82 ;
h_mozi[1] = 0xA0 ;
とすれば「あ」の情報自体は保持できます。
但し扱いは個々の数値とされるため文字列関数では使用できません。
下記のように文字列にしてから使うか、
char s[3] ;
s[0] = h_mozi[0] ;
s[1] = h_mozi[1] ;
s[2] = '\0' ;
strcpy( Name, s ) ;
Name に直接代入して \0 位置を制御する必要があります。
327ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(45,814ポイント)
Date: 2009/04/04(土) 14:58
No:31673
|
|
Title: Re:名前の入力画面
|
|
SooAさん、ご丁寧にありがとうございます。
やっぱり、自動的に\0が含まれるのですね。
その点でエラーが出ていたので悩んでいたのですが、
おかげで解決することができました。
今は文字を選択する処理で悩んでいますが、
もう少し頑張ってみようと思います。
またお聞きするかと思いますが、その時はよろしくお願いします。
123ポイント を手に入れた。
|
|
|
|
Name: ちゃき ..ぴよぴよ(165ポイント)
Date: 2009/04/03(金) 17:24
No:31640
|
|
Title: 龍神録プログラミング9章
|
|
キャラクタの移動なのですが
@ 横に動く時に比べて、縦に動く時の方がスピードが遅い。
A 動ける範囲を飛び出しても、なぜか速度が落ちるだけで、
一向に止まってくれない。(横に動いた時だけ)
i.k.l.さんNo:31213と同じような症状になってしまいます
ソースコードは9章のものを貼り付けたものです
どうかご教授よろしくお願いします
165ポイント を手に入れた。
|
|
|
|
Name: 初 ..ぴよぴよ(4ポイント)
Date: 2009/04/04(土) 09:09
No:31656
|
|
Title: Re:龍神録プログラミング9章
|
|
9章 char.cppのcalc_chをよく見たら幸せになれると思う
4ポイント を手に入れた。
|
|
|
|
Name: yu [URL] ..上級者(23,813ポイント)
Date: 2009/04/03(金) 19:05
No:31646
|
|
Title: VC++のグローバル変数
|
|
VC++2008EとDXライブラリを使っているのですが、
グローバル変数にカーソルを当てて右クリック後に定義へ移動をクリックすると
シンボル'xxxx'は定義されていません、と言われてしまいます。orz
これを直すにはどうしたら良いでしょうか?
そもそもソースが間違っているということは考えられますか?
コンパイルは通りますし、ちゃんと動作はします。
ですが、作業進行が著しく低下したため、質問させていただきました;
よろしくお願いしますm(_ _;)m
OS:windows vista
#1 最初からではなくて、ソースを書いている途中で問題が生じました。
#1 他のプロジェクトでは大丈夫でした。
#2 グローバル関数でも同様なことが起こりました。
#2 定義してあるところで"定義へ移動"をすると全く関係のない所に飛ばされます。
#2 "シンボルxxxxは定義されていません"は出ませんでした。
223ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(337,113ポイント)
Date: 2009/04/03(金) 23:06
No:31653
|
|
Title: Re:VC++のグローバル変数
|
|
よくあることです。
>これを直すにはどうしたら良いでしょうか?
ソリューションを閉じて、ncbファイルを削除してから
ソリューションを開いてみてください。
それで情報が再構築されるので、解消されている可能性があります。
>作業進行が著しく低下したため
基本的に C++だとそういう機能(インテリセンスも含めて)に対して
過度な期待や依存はしない方がいいかと……。
244ポイント を手に入れた。
|
|
|
|
|
Name: yu [URL] ..上級者(23,970ポイント)
Date: 2009/04/04(土) 07:37
No:31655
|
|
Title: Re:VC++のグローバル変数
|
|
無事に直すことができました。
ありがとうございました。m(_ _)m
>よくあることです。
よくあることだったのですか・・・。
初めて起こったのでちょっと驚きました;
>基本的に C++だとそういう機能(インテリセンスも含めて)に対して
>過度な期待や依存はしない方がいいかと……。
確かに頼りすぎは良く無いですね・・・
自分の場合は変数名とかよく忘れてしまい、頼りがちになってしまっています。
同じような役割をする変数でも変数名が統一してないのが原因です;
157ポイント を手に入れた。
|
|
|
|
Name: 新ZAN ..ぴよぴよ(117ポイント)
Date: 2009/04/03(金) 12:20
No:31633
|
|
Title: 全くの駆け出しの者の質問なんですが
|
|
他のC言語の入門者用のサイトのことで、検索すると沢山ひっかかっるんですが教え方として一番よいサイトを上級者様から紹介していただきたいのですがどこが良いでしょうか?
昨日、本格的に始めてから一番困ってます。
URL載せて頂くと有難いです。
117ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(75,922ポイント)
Date: 2009/04/03(金) 12:35
No:31634
|
|
Title: Re:全くの駆け出しの者の質問なんですが
|
|
自分が最後まで一通り読めるように書いてあるページが一番良いと思います。
人によって、図がないとどうも・・・って人もいれば、
サンプル解説が詳しくないと・・・って人も。十人十色ですね。
参考までに、自分が勉強させていただいたサイトを挙げてみます。
初心者のためのポイント学習C言語
ttp://www9.plala.or.jp/sgwr-t/
苦しんで覚えるC言語
ttp://homepage3.nifty.com/mmgames/c_guide/
っといっても、自分はネットで勉強していると、
すぐyahooのニューストピックや他人のブログとか目移りしてしまうタイプなので、
入門書でもっぱら勉強しました^^;(ほとんど柴田望洋先生のですがw)
229ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..初心者(5,290ポイント)
Date: 2009/04/04(土) 06:27
No:31654
|
|
Title: Re:全くの駆け出しの者の質問なんですが
|
|
私の場合はぱっと見つかる限り、すべて見て回りました。
理解できる範囲内ならば、あるったけのサイトを回るといいと思います。
やはり、サイトによって情報は様々ですから、1つに限らずたくさん回る事も重要です。
個人的な意見でした<(_ _)>
8ポイント を手に入れた。
|
|
|
|
Name: じゃが ..かけだし(1,755ポイント)
Date: 2009/04/03(金) 01:47
No:31620
|
|
Title: (C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数
|
|
また分からない問題に直面してしまったので質問します。
C++で二つの整数値xとyの最大公約数をユークリッドの互除法を使って求めたいのですが
int gcd(int x, int y);
一応、xが大きければ求めることはできたのですがyの値を大きくするとエラーになってしまいます。
どなたかご指摘お願いしますm(_ _)m
#include<iostream>
#include<iomanip>
#include<ctime>
using namespace std;
int gcd(int x,int y);
int main(){
int x,y;
cout << "xの値:"; cin >> x;
cout << "yの値:"; cin >> y;
cout << "xとyの最大公約数をユークリッド互除法で求めると" << gcd(x,y) << "です。\n";
return 0;
}
int gcd(int x, int y){
int t = 0;
t = (x + y) / 2;
if(x && y != t){
if(x > y)
return gcd(x = x - x / y * y,y);
else if (x < y)
return gcd(x,y = y - y / x * x);
}
else if(x > y)
return t = x;
else
return t = y;
}
小数点以下切捨ての方法が分からないのでintで整数にしているのですが・・・。
無駄な部分・簡単にできる部分もありましたらご指摘お願いします。
以下、問題の文のコピーです。
ユークリッドの互除法は、二つの整数を長方形の変の長さとする。短いほうの辺を一辺とする正方形で埋め尽くす。
残った長方形に対して同じ操作を繰り返す。正方形のみで埋め尽くされたとき、その正方形の辺の長さが最大公約数である。
507ポイント を手に入れた。
|
|
|
|
Name: fatens ..かけだし(1,891ポイント)
Date: 2009/04/03(金) 09:08
No:31623
|
|
Title: Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数
|
|
#include <math.h>
int gcd(double x, double y)
{
int m = (int)floor(x);
int n = (int)floor(y);
int r;
do {
r = m % n;
m = n;
n = r;
} while (r != 0);
return m;
}
こんなのでどうでしょう?
floor関数(math.hをインクルード)で小数点以下を切り捨てています。
一応 y > x でも計算できるようになっているはずです。
コメント入れてませんが、デバッグして動きを確認してみてください。
あと、エラー処理は入れていないので、yに0などをわたさないでください。
119ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(39,284ポイント)
Date: 2009/04/03(金) 09:09
No:31624
|
|
Title: Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数
|
|
問題文に対し、
「じゃが」さんが使われている、tの意味がわかりません。
それに、小数点以下がどうのこうのって????
もしかして、余りを求める演算子をご存じないのでは?
x % y ですよ。
73ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(39,347ポイント)
Date: 2009/04/03(金) 09:10
No:31625
|
|
Title: Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数
|
|
簡単に書きたいなら、
int gcd(int x, int y)
{
return y==0 ? x:gcd(y,x % y);
}
63ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..初心者(8,422ポイント)
Date: 2009/04/03(金) 18:50
No:31644
|
|
Title: Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数
|
|
再帰関数を用いないのならこんな感じでしょうか。
int gcd(int x, int y)
{
int temp;
while (y != 0) {
temp = y;
y = x % y;
x = temp;
}
return (x);
}
110ポイント を手に入れた。
|
|
|
|
|
Name: じゃが ..かけだし(1,811ポイント)
Date: 2009/04/03(金) 19:26
No:31647
| 解決!
|
Title: Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数
|
|
なるほど、あまりを求める方法でよかったのですか・・・。
そこまで簡単にできるなんて@@;
動作しました。今回はありがとうございました。
56ポイント を手に入れた。
|
|
|
|
Name: piyo ..入門者(2,899ポイント)
Date: 2009/04/03(金) 10:00
No:31627
|
|
Title: 改行コードの変換
|
|
sqlでテーブルデータを取得する際、
replaceで改行コードを変換して取得しています。
元々はCRLFだけを意識していたので、
SELECT replace(biko,'\r\n','{\\\\n}') FROM a_table WHERE a_no = '1'
としていましたが、
unixから登録したデータについては正しく変換されなかったので、
replaceしたものをLFだけさらに変換しようとして、
SELECT replace(replace(biko,'\r\n','{\\\\n}'),'\n','{\\\\n}') FROM a_table WHERE a_no = '1'
としたところ、
変換がうまくおこなわれませんでした。
(1行改行したところにも{\n}{\n}と2つでました)
どなたかちゃんと変換できるよう教えてください。。
178ポイント を手に入れた。
|
|
|
|
Name: piyo ..入門者(2,932ポイント)
Date: 2009/04/03(金) 10:10
No:31628
| 解決!
|
Title: Re:改行コードの変換
|
|
申し訳ないです。
データの確認ミスです。
ちゃんと変換されていました。
33ポイント を手に入れた。
|
|
|
|
Name: ヴィズ ..ぴよぴよ(42ポイント)
Date: 2009/04/03(金) 08:49
No:31622
|
|
Title: Win32アプリケーションウィザードで…
|
|
プログラミングに対する質問でないので、ここで質問してもいいのかがわかりませんが、大変困ってるので質問させていただきます。
Visual Studio 2008 Express Editionsを使っています。
そこで新規にプロジェクトをつくるため、「新しいプロジェクト」で「win32」を選択し、「win32コンソールアプリケーション」を選んで「ok」を押して次に「Win32アプリケーションウィザード」が表示されるんですが、
その「Win32アプリケーションウィザード」がまったく反応しません…
「現在のプロジェクト設定」の下には黒い点が3つあるだけで「コンソールアプリケーン」等が表示されておらず、「前へ」「次へ」ボタンも表示されてません。
「完了」、「キャンセル」をクリックしても「押せる」だけであってなにも反応が返ってきません…。
「アプリケーションの設定」も反応なしです…
前までは普通にできたのですが…。
ただし、右上の「閉じるボタン」と「ヘルプボタン」はちゃんと反応しました。
再インストールしても状況は変わらなかったです。
原因とか、解決方法がわかる人がいましたら、助言をお願いします。
42ポイント を手に入れた。
|
|
|
Name: nikoniko ..ぴよぴよ(195ポイント)
Date: 2009/04/02(木) 00:07
No:31544
|
|
Title: 龍神録のDrawRotaGraphFdFについて
|
|
DrawRotaGraphFdFの「識別子がみつかりません」とでてコンパイルできません
頭のほうに
int DrawRotaGraphFdF( double xd, double yd, double ExRate, double Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE) {
return DrawRotaGraphF((float)xd+FIELD_X+dn.x,(float)yd+FIELD_Y+dn.y,ExRate,Angle,GrHandle,TransFlag,TurnFlag);
}
とちゃんと定義しているのですが、うまくできません
一応下のような使い方をしています
DrawRotaGraphFdf(shot[i].bullet[j].x, shot[i].bullet[j].y,1.0, disp_angle,img_bullet[shot[i].bullet[j].knd][shot[i].bullet[j].col],TRUE);
なんとなく、img_bullet[][]のせいだと思うのですが……どこで定義してるのか……
よろしくお願いします
195ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(75,321ポイント)
Date: 2009/04/02(木) 00:35
No:31546
|
|
Title: Re:龍神録のDrawRotaGraphFdFについて
|
|
DrawRotaGraphFdF()がどこに書いてあり、
どこでDrawRotaGraphFdF()を呼び出しているのかが定かではないので
なんとも言えませんが、
>DrawRotaGraphFdFの「識別子がみつかりません」
はその名の通り識別子がないが原因ですので、
DrawRotaGraphFdF()の実体と呼び出しが別ファイルor実体の前に呼び出しをしている
→プロトタイプ宣言がうまくできているか確認
それ以外
→綴りミス確認
ぐらいしか今は言えない気がします。。
どこまでうまくいって、どこを挿入したらうまくいいかなくなったのか、
具体的な章をあげるとよい回答が得られるかも知れません。
190ポイント を手に入れた。
|
|
|
|
|
Name: BEMANI ..上級者(23,857ポイント)
Date: 2009/04/02(木) 01:22
No:31548
|
|
Title: Re:龍神録のDrawRotaGraphFdFについて
|
|
DrawRotaGraphFdF と定義しいているのであれば、
DrawRotaGraphFdf と使用するのは間違いです。
最後の F が小文字の f になっています。
48ポイント を手に入れた。
|
|
|
|
|
Name: nikoniko ..ぴよぴよ(251ポイント)
Date: 2009/04/03(金) 00:09
No:31619
| 解決!
|
Title: Re:龍神録のDrawRotaGraphFdFについて
|
|
確かにFがfになっていました
こんな簡単なミスに気がつかないだなんて……orz
ありがとうございました
利用規約も読んでおきます
すいません
56ポイント を手に入れた。
|
|
|
|
Name: EX ..ぴよぴよ(67ポイント)
Date: 2009/04/01(水) 18:48
No:31503
|
|
Title: どうやって
|
|
龍神録プログラムの館で表示結果とかあるんですが、何をどう表示するんですか
21ポイント を手に入れた。
|
|
|
|
Name: hss12 ..初心者(8,312ポイント)
Date: 2009/04/01(水) 20:43
No:31510
|
|
Title: Re:どうやって
|
|
何を聞きたいのか良く分かりません。
規約に書いてある
1 自分は今何がしたくて
2 どう取り組んで(作ったプログラムはどれで)
3 どのようなエラーやトラブルで困っていて
4 自分は何が今わからないのか、知りたいのか
5 自分のCの知識は今どの程度なのか
を答えてくれませんか。
私の予想ですが、
ゲームプログラミングの館
http://dixq.net/g/
を良く読んで理解してから、龍神録プログラミングの館に進んではどうでしょうか。
167ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ウィザード(1,012,938ポイント)
Date: 2009/04/02(木) 21:36
No:31616
|
|
Title: Re:どうやって
|
|
社会人をなめていたDixqですこんばんは。
皆様ご無沙汰して申し訳ないです。
管理を放棄したりしているわけではありませんのでf^_^;
EXさん、
hss12さんがおっしゃっている事にまずお答え頂けますでしょうか。
情報をこちらに提示していただかないとこちらも何をアドバイスしていいのかわかりませんので。
とりあえずコンパイラは扱えるのでしょうか?
DXライブラリの導入からよくわからない場合は本家HPに詳しく設定方法が書いてあるのでご覧下さい。
175ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(75,576ポイント)
Date: 2009/04/02(木) 19:24
No:31608
|
|
Title: constメンバの初期化
|
|
お邪魔します。
抽象的なタイトルしかつけれませんでした。。
まず下のコードを見てください。
class x{
private:
const int abc;
public:
x();
~x() {}
}
x::x()
{
y::CreateInstance();//シングルトンclass y の生成、初期化
abc(y::accesser());//初期化するにも上には持って行けない・・・
}
やりたいことは、シングルトンクラスy生成後、
yのアクセッサで戻ってくる値でクラスxのメンバabcを初期化したいのです。
もちろん上のようには書けません。
どうしたらうまく初期化ができるのでしょうか?
もし不可能だとしたらどうしたらよいでしょうか?
自分なりに考えて、クラスを作りました。
一度代入されたらそれ以後は代入を受け付けない
っというようなものです。(constをまねする感じです)
が、これだと、どこで一番最初に代入されたのかが分かりづらくなります。
なので、このクラスは廃止しました。。
よろしくお願いします。
295ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(336,426ポイント)
Date: 2009/04/02(木) 19:48
No:31611
|
|
Title: Re:constメンバの初期化
|
|
>どうしたらうまく初期化ができるのでしょうか
技術的には
x::x()
: abc((y::CreateInstance(), y::accesser()))
{
}
でできますが、根本的にこのシングルトンを事前に生成しておくのがいいかと
思います。
あるいは、accesser()の中でシングルトンを生成してしまっても
いいかもしれません。
142ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(75,693ポイント)
Date: 2009/04/02(木) 20:15
No:31613
| 解決!
|
Title: Re:constメンバの初期化
|
|
Justyさん、ご回答ありがとうございます!
>根本的にこのシングルトンを事前に生成しておくのがいい
自分もそう思いました^^;
初期化はやはりその意味のみを持たせたほうがいいですね。
今回は事前に生成っということで解決にさせていただきます。
ご回答ありがとうございました!
92ポイント を手に入れた。
|
|
|
|
Name: 狼太郎 ..ぴよぴよ(975ポイント)
Date: 2009/04/01(水) 18:16
No:31496
|
|
Title: たびたび質問すみません。。
|
|
四方向にキャラを歩かせるプログラムで
#include "DxLib.h"
typedef struct{
int a,b,c;
} ch_t;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
int image[16];
int muki=3; //A
int flag=0;
char Key[256];
ch_t ch;
ch.a=320;
ch.b=160;
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image );//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
if(ch.a%32==0 && ch.b%32==0){
flag=1;
if(Key[KEY_INPUT_RIGHT]==1)
muki=3;
else if(Key[KEY_INPUT_LEFT]==1)
muki=1;
else if(Key[KEY_INPUT_UP]==1)
muki=0;
else if(Key[KEY_INPUT_DOWN]==1)
muki=2;
else
flag=0;
}
if(flag==1){
switch(muki){
case 3:
ch.a++;
break;
case 1:
ch.a--;
break;
case 0:
ch.b--;
break;
case 2:
ch.b++;
break;
}
}
ch.c=image[(ch.a%32+ch.b%32)/8 + muki*4];
DrawGraph( ch.a , ch.b , ch.c , TRUE ) ;//[12]の画像を描画
ScreenFlip();
}
DxLib_End();
return 0;
}
この
int muki=3;
の部分を
int muki;
にするとアクセス違反が起きるのですが、、、なぜですか?
461ポイント を手に入れた。
|
|
|
|
Name: Mist ..熟練のプログラマー(58,027ポイント)
Date: 2009/04/01(水) 18:31
No:31497
|
|
Title: Re:たびたび質問すみません。。
|
|
規約を守ってソースはpreタグで字下げしてください。
mukiを初期化せずにキーを押していない状態だと最初のif文でmukiが更新されないので不定値のままです。
その結果
ch.c=image[(ch.a%32+ch.b%32)/8 + muki*4];
で、範囲外にアクセスする可能性があります。
110ポイント を手に入れた。
|
|
|
|
|
Name: 狼太郎 ..かけだし(1,010ポイント)
Date: 2009/04/01(水) 19:38
No:31506
|
|
Title: Re:たびたび質問すみません。。
|
|
ありがとうございます。
int muki=0;など
初期化しても同じ結果になってしまいます。
35ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(58,087ポイント)
Date: 2009/04/01(水) 19:42
No:31507
|
|
Title: Re:たびたび質問すみません。。
|
|
取り合えず字下げしたソースを張ってもらえませんか。
ソースが読みにくくて間違いが見つけにくいです。
ステップ実行した場合にどこまでどの部分で違反が起こるかは調べられていますか?
60ポイント を手に入れた。
|
|
|
|
|
Name: 狼太郎 ..かけだし(1,027ポイント)
Date: 2009/04/02(木) 19:53
No:31612
| 解決!
|
Title: Re:たびたび質問すみません。。
|
|
すみません・・自己解決できました。。
次からは字下げしときます。。
17ポイント を手に入れた。
|
|
|
|
Name: ピル ..ぴよぴよ(194ポイント)
Date: 2009/04/01(水) 22:07
No:31517
|
|
Title: バグ?ウイルス?
|
|
C言語プログラミングの館で
0. (導入)DXライブラリを手に入れる。(全てはココから) に書いてあったとおり
やったら画像(http://dixq.net/g/img/1-19.PNG)が出ました。
しかし、消えなくなってしまいました。
Escで消そうとしましたが画像が消えるだけで画面は黒のままで・・・・。
本体のボタンを押してもPCが立ち上がったままだったのでコンセントを抜いて終わらせました。
どういうことでしょう。
怖くてもう進められません・・・
194ポイント を手に入れた。
|
|
|
|
Name: ピル ..ぴよぴよ(215ポイント)
Date: 2009/04/01(水) 22:20
No:31524
|
|
Title: Re:バグ?ウイルス?
|
|
Windows XPで、Visual C++ EE2008でsy
21ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(22,132ポイント)
Date: 2009/04/01(水) 22:25
No:31525
|
|
Title: Re:バグ?ウイルス?
|
|
サンプルコードですから、DxLib_End()を忘れているとかはないですよね?
「消えなくなった」とは、ウィンドウの枠がそのまま残ったということでしょうか。
56ポイント を手に入れた。
|
|
|
|
|
Name: ピル ..ぴよぴよ(188ポイント)
Date: 2009/04/01(水) 22:31
No:31526
|
|
Title: Re:バグ?ウイルス?
|
|
画面が黒のまま、ということです。
最初はマウスも表示されてました
27ポイント を落としてしまった。
|
|
|
|
|
Name: SCI ..上級者(22,189ポイント)
Date: 2009/04/02(木) 00:03
No:31543
|
|
Title: Re:バグ?ウイルス?
|
|
画面全体が、ですか?
それはつまり、フルスクリーン状態から復帰しない、ということでしょうか。イマイチ状況が掴めません・・・
57ポイント を手に入れた。
|
|
|
|
|
Name: nayo ..中級者(10,098ポイント)
Date: 2009/04/02(木) 13:19
No:31564
|
|
Title: Re:バグ?ウイルス?
|
|
ちなみにパソコンの電源は電源ボタンを5秒ほど押しっぱなしにしておかないと切れませんよ
そのプログラムはサンプルコードをそのままコピペしただけなのでしょうか?
41ポイント を手に入れた。
|
|
|
|
|
Name: ピル ..ぴよぴよ(306ポイント)
Date: 2009/04/02(木) 14:00
No:31568
|
|
Title: Re:バグ?ウイルス?
|
|
十分ほど押してました・・・
それと、全くプログラムはいじっていません。
2倍のポイントを手に入れた! 40ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(29,364ポイント)
Date: 2009/04/02(木) 16:04
No:31591
|
|
Title: Re:バグ?ウイルス?
|
|
あのサンプルはフルスクリーンで起動して何かキーを入力すると終了するようになっています
どうもフルスクリーンから普通のデスクトップ画面に戻られてないようですね
サンプルプログラム実行用フォルダにLogまたはLog.txtが作成されてるはずですのでその内容をコピーして貼り付けてもらうと何かわかるかもしれません
2倍のポイントを手に入れた! 272ポイント を手に入れた。
|
|
|
|
|
Name: ピル ..入門者(2,810ポイント)
Date: 2009/04/02(木) 17:33
No:31597
|
|
Title: Re:バグ?ウイルス?
|
|
1:システムの情報を出力します
3: DXライブラリ Ver2.25
5: OS WindowsXP ( Build 2600 Service Pack 3 )
109: CPU動作速度:大体2.18GHz
113: MMX命令を使用します
115: SSE命令が使用可能です
118: SSE2命令が使用可能です
120: CPUベンダ:AuthenticAMD
129: CPU名:AMD Athlon(tm) 64 Processor 3500+
131:COMの初期化... 成功しました
178:メモリ総量:1982.42MB 空きメモリ領域:1078.84MB
180:タイマーの精度を検査します
183:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
185: パフォーマンスカウンターを使用します タイマー分解能 : 3579.545000 KHz
188: ソフトの二重起動検査... 二重起動はされていませんでした
194:ウインドウクラスを登録します... 登録に成功しました
198:フルスクリーンモード用のウインドウを作成します
255:カーソルを不可視にしました
257:IMEを無効にしました
460:DirectInput関係初期化処理
465: DirectInput7 の取得中... 成功
551: 引き続き初期化処理... 初期化成功
560: ジョイパッドの初期化...
566: ジョイパッドの初期化は正常に終了しました
569: マウスデバイスの初期化... 初期化成功
574: キーボードデバイスの初期化... 初期化成功
581:DirectInput 関連の初期化は正常に終了しました
583:DirectSound の初期化を行います
587:DirectSound インターフェースの取得を行います.... 成功
600:引き続きインターフェースの初期化処理... 成功
766: DirectSound デバイスを列挙します
774: モジュール名: ドライバ記述:プライマリ サウンド ドライバ
777: モジュール名: usbaudio.sys ドライバ記述:C-Media USB Headphone Set
780: モジュール名: sthda.sys ドライバ記述:SigmaTel Audio
783: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz
787: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB
790: 利用可能サンプリング精度
792: プライマリ 16bit = OK 8bit = OK
795: セカンダリ 16bit = OK 8bit = OK
797: 利用可能チャンネル
802: プライマリ MONO = OK STEREO = OK
805: セカンダリ MONO = OK STEREO = OK
807:DirectSound の初期化は正常に終了しました
810:DirectDraw 関連の初期化を行います
812: DirectDraw オブジェクトの取得を行います.... 成功
833: 引き続き初期化処理... 初期化に成功しました
841: ビデオカードの情報
844: 画面モード変更処理を開始します
907: ウインドウスタイルをフルスクリーンモード用に変更します... 完了
914: 画面モードの変更処理を開始します 640 x 480 16 bit
917: 画面解像度を変更します... 成功しました
1233: 画面モードの変更は正常に終了しました
1235: カラー情報
1238: A:00000000 B:0000f800 G:000007e0 B:0000001f
1241: 出力画面用の DirectDrawSurface を作成します
1267: 各スクリーンメモリの配置位置
1271: PrimaryBuffer : VIDEOMEMORY
1275: BaskBuffer : VIDEOMEMORY
1279: 出力画面用の DirectDrawSurface の作成は正常に終了しました
1285: Direct3D 関連の初期化を行います
1294: Direct3Dオブジェクトを取得します
1311: Direct3Dオブジェクトを取得しました
1314: HALデバイスを発見しました
1317: ハードウエアT&Lデバイスを発見しました
1326: 3Dデバイスを作成します... 3Dデバイスの作成に成功しました
1336: テクスチャ最大幅:4096 最小幅:1
1339: 描画制限: D_D3DPTEXTURECAPS_POW2 = 0 D_D3DPTEXTURECAPS_SQUAREONLY = 0
1342: 最大テクスチャステージ数 = 8 最大テクスチャブレンド数 = 8
1344: テクスチャピクセルフォーマット
1347: 通常グラフィック用
1349: BIT:16 RED:5 GREEN:6 BLUE:5
1353: RED:00f800 GREEN:0007e0 BLUE:00001f
1355: BIT:32 RED:8 GREEN:8 BLUE:8
1358: RED:ff0000 GREEN:00ff00 BLUE:0000ff
1361: アルファチャンネル付きグラフィック用
1363: BIT:16 ALPHA:4 RED:4 GREEN:4 BLUE:4
1366: ALPHA:0000f000 RED:00000f00 GREEN:000000f0 BLUE:0000000f
1369: BIT:32 ALPHA:8 RED:8 GREEN:8 BLUE:8
1370: ALPHA:ff000000 RED:00ff0000 GREEN:0000ff00 BLUE:000000ff
1373: Direct3D 関連の初期化は正常に終了しました
1376: グラフィック管理系の初期化を行います
1380: 3Dグラフィック描画機能を使用します
1383: フォントの初期化を行います
1389: フォントの初期化は正常に終了しました
1392: グラフィック管理系の初期化は正常に終了しました
1412: サーフェス間転送には BitBlt を使用します
1415: BitBlt:5900μs BltFast:8172μs
1417: スキャンラインの数:480
1545: 1フレーム当たりの時間は 17 msecです
1551: Tri00:17 msec
1555: Tri01:17 msec
1557: Tri02:18 msec
1560: Tri03:15 msec
1566: 画面モード変更処理は正常に終了しました
1578: オーバーレイサーフェスを使用します UYVY
1583: DirectDraw 関連の初期化は正常に終了しました
1587: 文字コードバッファの初期化を行います... 完了しました
2894: DirectDraw 関連の終了処理をおこないます
2898: フォントの初期化を行います
2903: フォントの初期化は正常に終了しました
2906: グラフィック管理系の終了処理は正常に終了しました
2909: Direct3D 関連の終了処理を行います
2912: 3Dデバイスの削除は正常に終了しました
2915: Direct3D 関連の終了処理は正常に終了しました
2918: メインサーフェスを破棄をします... 完了しました
2925: DirectDrawオブジェクトを解放します
3286: DirectDrawオブジェクトを解放しました
3289: DirectDraw 関連の終了処理は正常に終了しました
3293: DirectInput 関連の終了処理... 完了
3328: DirectSound の終了処理は正常に終了しました
3519: ウインドウを閉じようとしています
3542: ウインドウが破棄されようとしています
3545: ソフトを終了する準備が整いました
3911:
3918: Alloc memory dump Total size:0(0.000kb) Alloc num:0
3922:
2,504ポイント を手に入れた。
|
|
|
|
Name: じゃが ..ぴよぴよ(944ポイント)
Date: 2009/04/01(水) 00:58
No:31460
|
|
Title: 文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
文字列sに含まれる最も先頭に位置する文字cの添字を返す関数strch_idxをつくり
int strch_idx(const char *s, char c);
文字cが含まれない場合は-1を返すように作りたいです。
int strch_idx(const char* s,char c);
int main(){
char s[50],c;
cout << "文字列s:";
cin >> s;
strch_idx(s,c);
cout << s[0];
}
int strch_idx(const char* s,char c){
while(s)
c = 1;
return c;
}
自分なりに考えてみたのですが途中で訳が分からなくなり、コンパイルもできない状態になってしまいました;
また、別件なんですがポインタについての理解が浅く、なにか良いサイト・本・イメージなどお勧めの物はありますか?
よろしくお願いします。
8ポイント を手に入れた。
|
|
|
|
Name: pooka ..ぴよぴよ(227ポイント)
Date: 2009/04/01(水) 01:59
No:31461
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
こんな感じでしょうか?
#include <iostream>
using namespace std;
int strch_idx(const char *s,char c);
int main(void){
char s[50],c;
int n;
cout << "文字列s:";
cin >> s;
cout << "文字c:";
cin >> c;
if((n = strch_idx(s,c)) == -1)
cout << "エラー" << endl;
else
cout << "添字:" << n << endl;
return 0;
}
int strch_idx(const char *s,char c){
int count = 0;
while(s[count] != '\0'){
if(s[count] == c)
return count;
++count;
}
return -1;
}
文字cも入力してもらうようにして、strch_idx関数で文字cと一致したときの添字を返すようにしています。
一致しなかったときは-1を返して、「エラー」と表示するようにしました。
(もし意図した事と違っていたらごめんなさい・・・)
>ポインタについて
私は以下のサイトが分かりやすかったです。
ttp://homepage3.nifty.com/mmgames/c_guide/
2倍のポイントを手に入れた! 88ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..中級者(10,689ポイント)
Date: 2009/04/01(水) 06:38
No:31463
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
番兵まで辿り着いたら-1で良いのでは@@
15ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(94,853ポイント)
Date: 2009/04/01(水) 06:57
No:31464
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
そんな面倒なことをしなくても、
int strch_idx(const char* s, char c)
{
const char* ss = std::strchr(s, c);
return ss != 0 ? ss - s : -1;
}
でよいのでは?
103ポイント を手に入れた。
|
|
|
|
|
Name: pooka ..ぴよぴよ(260ポイント)
Date: 2009/04/01(水) 10:57
No:31469
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
番兵法は以前学校で習った気がします;
strchrという関数があるんですね。
勉強になります。φ(..;)
33ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(16,845ポイント)
Date: 2009/04/01(水) 18:02
No:31494
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
#include <stdio.h>
int strch_idx( const char *str, char c )
{
int i;
for( i=0; str[i]>0; i++ )
{
if( str[i] == c )
return i;
}
return -1;
}
void main()
{
char *s1 = "This is string1.";
char c = 's';
char c2= 'g';
char c3= 'z';
printf( "%d\n", strch_idx( s1, c ) );
printf( "%d\n", strch_idx( s1, c2) );
printf( "%d\n", strch_idx( s1, c3) );
}
パッパとつくったのですがどうでしょうか?
ポインタはサイトより一冊の本を納得がいくまで読み返しましたね
48ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,948ポイント)
Date: 2009/04/01(水) 18:33
No:31498
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
文字定数がchar型ということでC++と仮定しますと、それを書くなら
#include <stdio.h>
int strch_idx(const char *str, char c)
{
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] == c) return i;
}
return -1;
}
int main()
{
char *s1 = "テストThis is string1.";
char c1 = 's';
char c2 = 'g';
char c3 = 'z';
printf("%d\n", strch_idx(s1, c1));
printf("%d\n", strch_idx(s1, c2));
printf("%d\n", strch_idx(s1, c3));
}
strに多バイト文字が含まれないとは限らないので、こんな感じです。
これでも最下位バイトが0x00になるような文字がたまたまあった場合は困りますが、具体的にそのような文字が思いつかないので触れないでおきます(笑
271ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(16,876ポイント)
Date: 2009/04/01(水) 18:37
No:31499
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
そうですね 0x00 か \0 かで迷いましたが
マルチバイトにも対応できるstrchrの方がいいかもしれないですね
31ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(22,069ポイント)
Date: 2009/04/01(水) 18:44
No:31500
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
まず、CとC++では文字定数の型が異なります。文字定数をcharとしている以上、比較もchar定数とした方がいいでしょう。
また、char型がunsigned charかsigned charか分からないので、多バイト文字が0x80以上の値を表す1バイト長ビット列をもつとき、「str[i] > 0」ではじかれてしまいます。
少なくとも、私の環境ではsigned charなので、先頭にかな文字をおくとすべて-1が返りました。
121ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(16,920ポイント)
Date: 2009/04/01(水) 20:05
No:31508
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
文字列sが日本語などマルチバイトの場合
私のソースでは正常に作動しませんね
すいませんでした
44ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(17,056ポイント)
Date: 2009/04/01(水) 20:44
No:31511
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
改良版を作りました
#include <stdio.h>
#include <string.h>
void main()
{
char *s = "テストthis is string.\n";
printf( "searching 'z'...\n" );
char *p = strchr( s, 'z' );
if( p == NULL )
printf( "-1\n" );
else
printf( "%s\n", p );
}
これを関数化すれば目的は達成できますね
136ポイント を手に入れた。
|
|
|
|
|
Name: じゃが ..かけだし(1,089ポイント)
Date: 2009/04/01(水) 20:54
No:31512
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
たくさんの回答ありがとうございます。
すいません、C++かC言語書いていませんでしたね。。C++でお願いします。
なるほど、strchr(s,c)はsの文字列のcを探すということでしょうか?
だとしたら
const char* ss = std::strchr(s, c);
この部分は分かるのですが、
return ss != 0 ? ss - s : -1;
この部分が分からないです;
145ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(4,323ポイント)
Date: 2009/04/01(水) 21:08
No:31513
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
!=0
で、見つかったかどうかを判定しています。
見つかったら、
ss-s
で、何バイト目で見つかったかを求めています。見つからなかったら-1を返します。
41ポイント を手に入れた。
|
|
|
|
|
Name: じゃが ..かけだし(1,193ポイント)
Date: 2009/04/02(木) 01:23
No:31549
| 解決!
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
ありがとうございます。
ようやく理解できました;
ポインタの方も頑張って覚えてみようと思います。
ただpookaさんが教えてくださったサイトはC言語みたいなんですがC++しか勉強していない私でも大丈夫でしょうか?
dicさんの勉強方法ですと、やはり数回読んだだけではダメですね;
何回も読み直してみます。
104ポイント を手に入れた。
|
|
|
|
|
Name: pooka ..ぴよぴよ(350ポイント)
Date: 2009/04/02(木) 14:40
No:31576
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
Cもわかるつもりで紹介してしまいました(^^;
すみませんm(_ _)m
C++は最近勉強し始めたばかりで詳しいことは分かりませんが、
ポインタの概念というかイメージは同じだと思うので、
サイトを見て少しでもイメージをつかんで頂ければと思い紹介しました。
90ポイント を手に入れた。
|
|
|
|
|
Name: じゃが ..かけだし(1,248ポイント)
Date: 2009/04/02(木) 18:56
No:31605
|
|
Title: Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
|
|
すいません、C++しか勉強してないんですよね。。
確かに、読んだところ少し理解ができた気がします。
理解できるように頑張ります。
55ポイント を手に入れた。
|
|
|
|
Name: +END+ ..ぴよぴよ(56ポイント)
Date: 2009/04/02(木) 17:35
No:31598
|
|
Title: 画像を表示することができません
|
|
"3・画像を表示する"がどうしてもうまくいきません。
プログラムをこぴぺしてデバックを行っているのでプログラムに誤りはないと思います。
ここまで僕が行ってきた設定などで多少このせいかな、というものが数点あるので上げたいと思います;
1、DxLib_VCフォルダ内の、"サンプルプログラム実行用フォルダ"の中の、"DxLib_VC2008_and_2005用.sln"を起動することができない
2、起動できなかった際に、気になって"DxLib_VC2005用.vcproj"をダブルクリックしたら変換だのなんだのと出てきたので変換を行ってみたところ、"DxLib_VC2008_and_2005用.sln"を起動できた。
サンプルプログラムのところの"DxLib_VC2008_and_2005用.sln"の立ち上げ方がいけなかったのかなとか思ったりしています。けど起動できないんです・・・、
VC++をサンプルプログラム実行用フォルダから立ち上げることに意味があるのでしょうか
起動できない原因として何が考えられるのかまったくわかりません。
以前このような質問をしたのですが、結局理由がわからず、PCの中で動作がぐじゃぐじゃになってしまいました
なので1から設定等をやり直し、点を打つプログラム、全画面でウィンドウを開く方法、小さなウィンドウを開く方法など問題なくクリアしてきたのですが、画像でやはり行き詰ります。
どうしても自分のやってる動作のどこに問題があるのかに気がつきたいです・・・。
わがままを言ってすみません。
もしよろしければ教えてください。お願いします。
56ポイント を手に入れた。
|
|
|
|
Name: end ..ぴよぴよ(12ポイント)
Date: 2009/04/02(木) 17:49
No:31599
| 解決!
|
Title: Re:画像を表示することができません
|
|
すみません、名前を変えて書き直させてください。本来の名前を思い出したので。
12ポイント を手に入れた。
|
|
|
|
Name: ざこ ..熟練のプログラマー(42,774ポイント)
Date: 2009/04/02(木) 14:07
No:31569
|
|
Title: CStringArrayの要素比較
|
|
VC++6.0のMFCでCStringArrayを最近よく使ってるのですが
例えばドロップしてきたファイルとリストビューに表示されているファイルが一致している場合の
処理を考えると
CStringArray xxx;
CStringArray yyy;
int index=-1;
for(int i=0; f<=__argc;i++){
xxx.Add(__argv[i]);
while((index=m_list.GetNextItem(index,LVNI_ALL))!=-1){
CString str=m_list.GetItemText(index,0);
yyy.Add(str);
}
if(xxx[i]==yyy[i]){
//処理
}
}
と試しにしてみましたがif(xxx[i]==yyy[i]){ の所でDebug Assertion Failedと出て辿ってみると
_AFXCOLL_INLINE CString& CStringArray::ElementAt(int nIndex)
{ASSERT(nIndex>=0&&nIndex<m_nSize);
return m_pData[nIndex];}
となっておりました。
CStringArray同士の要素比較はできないのでしょうか?
355ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(137,541ポイント)
Date: 2009/04/02(木) 14:13
No:31570
|
|
Title: Re:CStringArrayの要素比較
|
|
> for(int i=0; f<=__argc;i++){
変数 i の上限のガードがかかっていなくて、
i の値は増えっぱなしであるように見えます。
そんなことはないですか?
30ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..熟練のプログラマー(42,822ポイント)
Date: 2009/04/02(木) 14:18
No:31571
|
|
Title: Re:CStringArrayの要素比較
|
|
すいません
i<=__argc のミスです。
サンプルプログラムを組みながら書いたのでコピペしませんでした。
48ポイント を手に入れた。
|
|
|
|
|
Name: Blue ..中級者(9,138ポイント)
Date: 2009/04/02(木) 14:21
No:31572
|
|
Title: Re:CStringArrayの要素比較
|
|
数が一致していますか?
if (xxx.GetSize() != yyy.GetSize()) {
AfxMeesageBox(_T("中身見るまでもなく、ちげぇ"));
}
60ポイント を手に入れた。
|
|
|
|
|
Name: Blue ..中級者(9,172ポイント)
Date: 2009/04/02(木) 14:37
No:31575
|
|
Title: Re:CStringArrayの要素比較
|
|
( ゜Д゜)<ハァ?
サイズが違う=全部が同じになるわけがない
ということではないの?
途中まであっていれば一致している?
34ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..熟練のプログラマー(42,943ポイント)
Date: 2009/04/02(木) 14:46
No:31577
|
|
Title: Re:CStringArrayの要素比較
|
|
あああそういうことですか。そりゃ全部が同じになるわけがないですね。やり方がどうやらおかしいようです。
xxxとyyyの要素が一致している場合の処理をしたいんですけどこの場合どうやったらいいのでしょうか?
2倍のポイントを手に入れた! 102ポイント を手に入れた。
|
|
|
|
|
Name: Blue ..中級者(9,326ポイント)
Date: 2009/04/02(木) 14:50
No:31579
|
|
Title: Re:CStringArrayの要素比較
|
|
そのままなのでは?
bool bSame = true;
if (xxx.GetSize() != yyy.GetSize()) {
bSame = false;
}
else
{
for (int i = 0; i < xxx.GetSize(); ++i)
{
if (xxx[i] != yyy[i])
{
bSame = false;
break;
}
}
}
// 一致した場合
if (bSame)
{
154ポイント を手に入れた。
|
|
|
|
|
Name: Blue ..中級者(9,418ポイント)
Date: 2009/04/02(木) 14:52
No:31580
|
|
Title: Re:CStringArrayの要素比較
|
|
>しかしサイズが同じでも同じエラーがでますね。
というか、ループの中でAddしているのであれば、タイミングによって同じになったりしますよね。
まずは、追加しながら比較せず、どちらの配列も追加し終わった後に比較しましょう。
92ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..熟練のプログラマー(43,019ポイント)
Date: 2009/04/02(木) 14:55
No:31581
|
|
Title: Re:CStringArrayの要素比較
|
|
そういうことでしたか、ヤフーとかで調べてるのですがどうも情報が少なく質問しました。
色々いじくって理解してみます。ありがとうございました。
56ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..熟練のプログラマー(43,499ポイント)
Date: 2009/04/02(木) 15:13
No:31584
|
|
Title: Re:CStringArrayの要素比較
|
|
ああ、やはりサイズが同じじゃないと比較できないのかな。どうもそこがしっくりきません。
xxx[1]=C:\\○
xxx[2]=C:\\△
xxx[3]=C:\\□
xxx[4]=C:\\×
yyy[1]=C:\\+
yyy[2]=C:\\@
yyy[3]=C:\\△
だったときにxxx[4]のときとyyy[3]のときを取り出したい。
ちょっとサンプルプログラム変更してみて
for(int i=1;i<__argc;i++){
xxx.Add(__argv[i]);
}
while((index=m_list.GetNextItem(index,LVNI_ALL))!=-1){
CString str=m_list.GetItemText(index,0);
yyy.Add(str);
}
//両方の配列コレクションの要素格納完了
for(int p=1;p<=c;p++){
for(int q=0; q<yyy.GetSie();q++){
if(xxx[p]==yyy[q]){
//処理
}
}
}
でも同じ結果でした。
2倍のポイントを手に入れた! 480ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..熟練のプログラマー(43,556ポイント)
Date: 2009/04/02(木) 15:55
No:31590
|
|
Title: Re:CStringArrayの要素比較
|
|
できればCStringArrayで格納しておいて使いたいんです。今後色々つかえそうだしこんなことができるなら
結構幅広がりますしね。
16ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(29,474ポイント)
Date: 2009/04/02(木) 16:16
No:31592
|
|
Title: Re:CStringArrayの要素比較
|
|
//両方の配列コレクションの要素格納完了
for(int p=1;p<=c;p++){
for(int q=0; q<yyy.GetSie();q++){
if(xxx[p]==yyy[q]){
//処理
}
}
}
やりかたはこの2重ループでよいと思いますが
for(int p=1;p<=c;p++){
は
for(int p = 0; p < (__argc - 1); p++){
でしょう
110ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(155,045ポイント)
Date: 2009/04/02(木) 16:17
No:31593
|
|
Title: Re:CStringArrayの要素比較
|
|
こんな感じ?
cmp1とcmp2が比較用のCStringArrayで、bufにcmp1とcmp2を比較した結果見つかった同じCStringが格納されるようになってます。
ただし、同じデータが2つ以上あった場合にダブって検出されるんで、その辺の抑止は自分で考えてみてください。
void cmpStringArray(CStringArray& cmp1, CStringArray& cmp2, CStringArray& buf)
{
for (int i = 0; i < cmp1.GetSize(); ++i)
{
for (int j = 0; j < cmp2.GetSize(); ++j)
{
if (cmp1.GetAt(i) == cmp2.GetAt(j))
{
buf.Add(cmp1.GetAt(i));
}
}
}
}
233ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..熟練のプログラマー(43,622ポイント)
Date: 2009/04/02(木) 16:20
No:31594
|
|
Title: Re:CStringArrayの要素比較
|
|
cは__argc-1に置き換えてました。。
しかしそれに直してもやはり同じエラーです。
2倍のポイントを手に入れた! 66ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..熟練のプログラマー(43,675ポイント)
Date: 2009/04/02(木) 16:36
No:31595
|
|
Title: Re:CStringArrayの要素比較
|
|
うううむ、pの上限をp<__argc-1ではなく
p<xxx.GetSize()にしたらエラーでなくなりました。
中身みたら同じ値でしたが、これは何かおかしいのでしょうか?
53ポイント を手に入れた。
|
|
|
|
Name: ice ..入門者(4,460ポイント)
Date: 2009/03/28(土) 13:43
No:31318
|
|
Title: グラフィックの奥、乗せ関係
|
|
こんにちは
以前よりお世話になっておりますiceです。
今DXライブラリで、RPG(2次元ドットタイプ)を制作しているのですが
PCとNPCが重なるときに
NPCより上に居るときはPCが隠れる
NPCより下に居るときはPCが見える
というふうにしたいのですが、どうすればいいでしょうか。
以下はPCの移動、NPCの描画で使用してるソースです。
void playercontrol1()
{
DrawGraph( (int)pl[1].x , (int)pl[1].y , pl[1].img , TRUE ) ;//キャラの描画
dash=1;
if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_C )
{
dash=2;
}
if(pl[1].kou==0)
if(pl[1].kou>=0)
{
if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP && GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT )
pl[1].kou=8;
if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP && GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT )
pl[1].kou=2;
if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN && GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT )
pl[1].kou=6;
if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN && GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT )
pl[1].kou=4;
if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT ) == 0 && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 0 )
pl[1].kou=1;
if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT ) == 0 && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 0 )
pl[1].kou=5;
if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP ) == 0 && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN ) == 0 )
pl[1].kou=7;
if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP ) == 0 && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN ) == 0 )
pl[1].kou=3;
if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP ) == 0 &&( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT ) == 0
&&( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN ) == 0 &&( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 0 )
pl[1].kou=0;
}
}
void npc()
{
DrawGraph( (int)en[1].x , (int)en[1].y , en[1].img , TRUE ) ;//NPCの描画
if( pl[1].kou==1 )
en[1].y+=2.5*dash;
if( pl[1].kou==2 )
en[1].y+=2.5*dash,en[1].x-=2.5*dash;
if( pl[1].kou==3 )
en[1].x-=2.5*dash;
if( pl[1].kou==4 )
en[1].y-=2.5*dash,en[1].x-=2.5*dash;
if( pl[1].kou==5 )
en[1].y-=2.5*dash;
if( pl[1].kou==6 )
en[1].y-=3*dash,en[1].x+=2.5*dash;
if( pl[1].kou==7 )
en[1].x+=2.5*dash;
if( pl[1].kou==8 )
en[1].y+=2.5*dash,en[1].x+=2.5*dash;
}
背景スクロールタイプなのでこのようなソースになってます。
簡略化できるところとかあれば加えてご教授お願いします。
またNPCを複数出したい際に同じソースを何度も書かなくて良いようにする方法はありますでしょうか。
以上よろしくお願いします。
1,090ポイント を手に入れた。
|
|
|
|
Name: fatens ..ぴよぴよ(913ポイント)
Date: 2009/03/28(土) 14:36
No:31319
|
|
Title: Re:グラフィックの奥、乗せ関係
|
|
ソースはプレタグを使ってください。
>簡略化できるところとかあれば加えてご教授お願いします。
PCの移動の際に何度もGetJoypadInputStateを呼ぶのは効率的ではありません。
playercontrol1関数の最初で
pad_input = GetJoypadInputState(DX_INPUT_KEY_PAD1)
などとしておき、if文ではこれを用いる方がいいと思います。
>またNPCを複数出したい際に同じソースを何度も書かなくて良いようにする方法はありますでしょうか。
配列にしているようなので、移動や描画の処理でfor文を使えばいいのでは?
本題でないことばかり書いてしまった...
252ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(335,545ポイント)
Date: 2009/03/28(土) 15:07
No:31320
|
|
Title: Re:グラフィックの奥、乗せ関係
|
|
>どうすればいいでしょうか
各オブジェクトにプライオリティ(優先度)をつけてリストに追加します。
そのリストを描画前にプライオリティでソートしてから、リストの順に表示すれば
描画順番はプライオリティに応じて入れ替わります。
79ポイント を手に入れた。
|
|
|
|
|
Name: ice ..入門者(4,953ポイント)
Date: 2009/03/28(土) 19:22
No:31323
|
|
Title: Re:グラフィックの奥、乗せ関係
|
|
fatens様
プレタグ了解しました。規約と注意事項にかかれてますね・・・
今回の修正しておきました、次回からきをつけます。
>PCの移動の際に何度もGetJoypadInputStateを呼ぶのは効率的ではありません。
>playercontrol1関数の最初で
>pad_input = GetJoypadInputState(DX_INPUT_KEY_PAD1)
やってみました。うまくいったようです。有難うございます。
>>またNPCを複数出したい際に同じソースを何度も書かなくて良いようにする方法はありますでしょうか。
>配列にしているようなので、移動や描画の処理でfor文を使えばいいのでは?
for(ループだったっけ?)についてよく理解していないのでこちらはわからないです。
もう少し詳しく教えていただけますでしょうか。
Justy様
>各オブジェクトにプライオリティ(優先度)をつけてリストに追加します。
>そのリストを描画前にプライオリティでソートしてから、リストの順に表示すれば
>描画順番はプライオリティに応じて入れ替わります。
イメージは理解できるのですが、具体的にはどのような方法で行えるのでしょうか。
参考になるものがあれば教えてください。
それとこのような記事を見つけたのですが近い類のものでしょうか。
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1146
493ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..かけだし(1,609ポイント)
Date: 2009/03/28(土) 20:40
No:31324
|
|
Title: Re:グラフィックの奥、乗せ関係
|
|
forは例えばこんな感じになるでしょうか。
#include "DxLib.h"
//キャラの構造体
struct {
int x, y; //座標
int vx, vy; //速度
} Chara[3];
int ImgChara; //キャラの画像
//キャラの移動処理
void MoveChara()
{
for (int i = 0; i < 3; i++) {
Chara[i].x += Chara[i].vx;
Chara[i].y += Chara[i].vy;
}
}
//キャラの描画処理
void DrawChara()
{
for (int i = 0; i < 3; i++)
DrawGraph(Chara[i].x, Chara[i].y, ImgChara, TRUE);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); //スクリーンモード
if (DxLib_Init() == -1) //DXライブラリの初期化
return -1;
SetDrawScreen(DX_SCREEN_BACK); //裏画面を使用
ImgChara = LoadGraph("Chara.bmp"); //画像をロード
//速度を設定
Chara[0].vx = 1;
Chara[1].vx = 1;
Chara[1].vy = 1;
Chara[2].vy = 1;
while (ProcessMessage() == 0) {
ClearDrawScreen(); //描画をクリア
MoveChara(); //移動処理
DrawChara(); //描画処理
ScreenFlip(); //裏画面を表画面に転送
}
DxLib_End(); //DXライブラリの終了
return 0;
}
シューティングゲーム?のサンプルソースです。
画像さえあれば実行できるようになっています。
参考にならないかも知れませんが、for文の使い方を分かっていただけたら。
P.S
プレタグを使うと横長になりすぎましたね...
696ポイント を手に入れた。
|
|
|
|
|
Name: ice ..入門者(4,968ポイント)
Date: 2009/03/29(日) 21:38
No:31359
|
|
Title: Re:グラフィックの奥、乗せ関係
|
|
fatens様
for文なんとなく理解しました。
使ってみたところうまくいったようです。有難うございました。
Justy様
すごく難解ですね・・・
サンプル、test.cppを見ても
何処から何処までが私に必要なソースなのかがさっぱりでした。
弾の処理はおいといて、該当するプライオリティに必要なソースはどの当たりになるのでしょうか。
15ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(335,994ポイント)
Date: 2009/03/30(月) 02:42
No:31369
|
|
Title: Re:グラフィックの奥、乗せ関係
|
|
>必要なソースはどの当たりになるのでしょうか
たかだが 150行程度のコードなので、がんばって読み解いてほしいところですが、
強いていうなら SortBullet関数ということになります。
ただ、MyQsort()び中身についてはメンバ yの大小関係でソートして並び替えていることが
理解できれば十分です。
100ポイント を手に入れた。
|
|
|
|
|
Name: ice ..初心者(5,436ポイント)
Date: 2009/03/30(月) 19:08
No:31410
|
|
Title: Re:グラフィックの奥、乗せ関係
|
|
Justy様
ソースみてやってることはなんとなく理解できたのですが、
自分では書くことが出来そうになかったのでこういう発想をしてみました。
処理の最後の最後、表示のところなんですが・・・
while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0)
{
RefreshTime = GetNowCount(); //今の時間を取得
ClearDrawScreen(); //裏画面のデータを全て削除
if(pl[1].y < en[1].y)
{
playercontrol1();
npc();
}
else if(pl[1].y >= en[1].y)
{
npc();
playercontrol1();
}
ScreenFlip(); //裏画面データを表画面へ反映
counter++;
if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了
while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
}
一応、NPCより上に居るときはPCが隠れる、NPCより下に居るときはPCが見える
というのは満たしましたが、移動するごとに徐々にNPCがずれていきます。
こんなところで処理を行うのが問題でしょうか。
468ポイント を手に入れた。
|
|
|
|
|
Name: fatens ..かけだし(1,772ポイント)
Date: 2009/03/30(月) 20:12
No:31417
|
|
Title: Re:グラフィックの奥、乗せ関係
|
|
関数内で、描画処理と移動処理を両方行っているからです。
それぞれを別の関数に分ければ今の形でもいけます。
if文の外で移動処理、if文の中で描画処理という感じで。
それと、 else if(pl[1].y >= en[1].y) は else でいけると思います。
>こんなところで処理を行うのが問題でしょうか。
上で書いたようにするとできると思いますが、このまま進めていくとおそらくWinMain関数が長くなりすぎるので、
別の関数を作ってそこで処理を行うようにするといいかもしれません。
163ポイント を手に入れた。
|
|
|
|
|
Name: ice ..初心者(5,458ポイント)
Date: 2009/04/01(水) 20:20
No:31509
| 解決!
|
Title: Re:グラフィックの奥、乗せ関係
|
|
fatens様
遅くなりましたがヒント有難うございます。
解決できました。
また機会があればよろしくお願いしまっす。
22ポイント を手に入れた。
|
|
|
|
Name: EX ..ぴよぴよ(13ポイント)
Date: 2009/03/31(火) 20:04
No:31441
|
|
Title: ソリューションファイル
|
|
slnが開けません。
みなさんはどうやって開いていますか?
13ポイント を手に入れた。
|
|
|
|
Name: TKOZ ..上級者(20,273ポイント)
Date: 2009/03/31(火) 20:58
No:31443
|
|
Title: Re:ソリューションファイル
|
|
とても基本的な事を聞くので申し訳ないんですが、
VisualC++2005、2008(ExpressEdition)はインストールされていますか?
42ポイント を手に入れた。
|
|
|
|
|
Name: カズ ..かけだし(1,149ポイント)
Date: 2009/03/31(火) 20:59
No:31444
|
|
Title: Re:ソリューションファイル
|
|
Windows XP HomeEdition SP3
を使っていますが、私は Visual C++ EE2008をインストールした状態でslnファイルをダブルクリックすれば開けます。
もしくはアプリケーション側が対応していれば『開く』なり『Open』なりで開けるかと思います。
こんなへっぽこな回答で申し訳ありません。お役に立てれば幸いです。
110ポイント を落としてしまった。
|
|
|
|
|
Name: EX ..ぴよぴよ(40ポイント)
Date: 2009/03/31(火) 20:59
No:31445
|
|
Title: Re:ソリューションファイル
|
|
分かりません。
ダウンロードサイトどこですか?
27ポイント を手に入れた。
|
|
|
|
|
Name: カズ ..かけだし(1,399ポイント)
Date: 2009/03/31(火) 21:04
No:31446
|
|
Title: Re:ソリューションファイル
|
|
http://www.microsoft.com/japan/msdn/vstudio/Express/
こちらのページ中央部にある黄色いバーナーですね。
『Visual C++ はよりパワフルで柔軟な開発環境を提供し、Windows ネイティブなアプリケーションやおよび 3D の2Dゲーム開発を支援します。Win32 API を完全活用したアプリケーションを作成できる Windows Platform SDK も同梱されています。』
と書かれています。
» Web インストール (ダウンロード)
» はじめての方のためのインストール方法
からダウンロードとインストールができます。
250ポイント を手に入れた。
|
|
|
|
Name: スー ..入門者(3,101ポイント)
Date: 2009/04/01(水) 05:00
No:31462
|
|
Title: WindowsAPIでちらつきをなくす方法
|
|
皆様こんばんわ。
私はいまWindowsAPIでスクリーンセーバーを作っています。
デザインは東方の「波と粒の境界」(以下、波粒)という弾幕を表示するようにしています。
スクリーンセーバーで波粒を表示させる所まではできたのですが、画面のちらつきが激しいです。
画面のちらつきを無くしたいのですが、DXライブラリの
ClearDrawScreen() ;
ScreenFlip() ;
などの関数は私が調べた限り見つけることができなかったです。
ちょっとした興味でWindowsAPIをつついてみたので知識はほとんどない状態です。;;
ちらつきを無くす方法がありましたら、教えてください。
どうぞよろしくお願いします。
環境は
VC++2005
windowsXP
です。
以下ソースです。
#include <windows.h>
#include <scrnsave.h>
#include <math.h>
#include <time.h>
//スクリーンセーバを作るためのライブラリ
#pragma comment(lib,"ScrnSave.lib")
#pragma comment(lib,"Comctl32.lib")
//タイマーのID
#define ID_TIMER 32767
#define PI 3.1415926535897932384626433832795
#define RAD 57.295779513082320876798154814105
//弾の最大数
#define MAX 65536
int i,j;
int wx,wy;
int count = 0;
//弾幕の制御変数 とりあえずグローバルで
float angle = 0;
float plus_angle = 1;
bool angle_flag = false;
//Ball::Draw() で
//RoundRect(hdc , x , y , x+size , y+size , size , size);
//と書いてもhdcがありません とエラーがでるのでポインタを使ってみた
HDC *p_hdc;
//弾幕のクラス
class Ball{
public:
float x,y,vx,vy;
int size;
bool used;
Ball();
void Add(float X, float Y, float SP, float ANGLE);
void Draw();
void Action();
};
//コンストラクタ
Ball::Ball(){
x = 0;
y = 0;
vx = 0;
vy = 0;
size = 20;
used = false;
}
// 弾幕を発射する X Y 速度 角度
void Ball::Add(float X, float Y, float SP, float ANGLE){
x = X;
y = Y;
vx = cos(ANGLE/RAD)*SP;
vy = sin(ANGLE/RAD)*SP;
used = true;
}
// 弾幕の描写
void Ball::Draw(){
RoundRect(*p_hdc , x , y , x+size , y+size , size , size);
}
// 弾幕の制御
void Ball::Action(){
x += vx;
y += vy;
//画面外にでたら消す
if(x < -size || x > wx)used = false;
if(y < -size || y > wy)used = false;
}
Ball ball[MAX];
//for文とif文を弾幕を発射するたびに書くのではめんどくさいので関数に
void Add(float X, float Y, float SP, float ANGLE){
for(i=0;i<MAX;i++){
if(ball[i].used == false){
ball[i].Add(X,Y,SP,ANGLE);
break;
}
}
}
LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
srand((unsigned)time(NULL));
RECT rc;
HDC hdc;
p_hdc = &hdc;
HBRUSH hBrush,hOldBrush;
switch(msg)
{ case WM_CREATE:
GetClientRect(hWnd,&rc);
wx = rc.right-rc.left;
wy = rc.bottom-rc.top;
SetTimer(hWnd,ID_TIMER,16,NULL);
break;
case WM_TIMER:
//画面の初期化 画面の全範囲を黒で塗りつぶす
hdc = GetDC(hWnd);
hBrush= CreateSolidBrush(RGB(0,0,0));
hOldBrush= (HBRUSH)SelectObject(hdc,hBrush);
Rectangle(hdc,0,0,wx,wy);
SelectObject(hdc,hOldBrush);
DeleteObject(hBrush);
ReleaseDC(hWnd,hdc);
hdc = GetDC(hWnd);
hBrush= CreateSolidBrush(RGB(200,0,200));
hOldBrush= (HBRUSH)SelectObject(hdc,hBrush);
for(i=0;i<MAX;i++){
if(ball[i].used == true){
ball[i].Draw();
ball[i].Action();
}
}
SelectObject(hdc,hOldBrush);
DeleteObject(hBrush);
ReleaseDC(hWnd,hdc);
if(count++ % 2 == 0){
for(j=0;j<6;j++)
Add(wx/2,wy/4,8,angle+j*60);
}
angle += plus_angle;
if(angle_flag == false)plus_angle += 0.1;
if(angle_flag == true)plus_angle -= 0.1;
if(plus_angle > 350)angle_flag = true;
if(plus_angle < 10)angle_flag = false;
InvalidateRect( hWnd, NULL, FALSE );
break;
case WM_DESTROY:
KillTimer(hWnd,ID_TIMER);
PostQuitMessage(0);
return 0;
default:
break;
}
return DefScreenSaverProc(hWnd, msg, wParam, lParam);
}
BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
return TRUE;
}
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
}
タイトルを無題にしてしまったのですぐ修正しました
1,011ポイント を手に入れた。
|
|
|
|
Name: スー ..入門者(3,153ポイント)
Date: 2009/04/01(水) 14:38
No:31487
| 解決!
|
Title: Re:WindowsAPIでちらつきをなくす方法
|
|
バグさんレスありがとうございます。
無事画面のちらつきを無くすことができました。
ありがとうございます。
ダブルバッファで調べるとたくさんできてきました。
私の調べ不足でした><;
今後はもう入念に調べてから質問をするようにしたいです。
52ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(154,797ポイント)
Date: 2009/04/01(水) 14:46
No:31488
|
|
Title: Re:WindowsAPIでちらつきをなくす方法
|
|
いえ、私も同じ質問をここでしたことがありましたので…(笑)
33ポイント を落としてしまった。
|
|
|
|
Name: ひよこ ..上級者(24,723ポイント)
Date: 2009/04/01(水) 11:23
No:31470
|
|
Title: 構造体でエラーが
|
|
構造体でエラーがでます。下のソースなんですけどなぜか
error C2144: 構文エラー : 'int' は ';' によって先行されなければなりません。
とでて
typedef struct{
int x,y,counter;
}logo
logo color;
color.x=0;
color.y=0;
color.counter=0;
をなくすとエラーが無くなり実行できるのですがどうしてでしょうか?
#include "DxLib.h"
#include "GlobalVariable.h"
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
typedef struct{
int x;
int y; //座標
int WheelRotVol;//ホイールの回転量
unsigned int Button[8]; //ボタンの押した状態
}Mouse_t;
Mouse_t Mouse;
int GetHitMouseStateAll_2(Mouse_t *Nezumi){
if(GetMousePoint( &Nezumi->x, &Nezumi->y ) == -1){ //マウスの位置取得
return -1;
}
int MouseInput=GetMouseInput(); //マウスの押した状態取得
for(int i=0; i<4; i++){ //マウスのキーは最大4個まで確認出来る
if( (MouseInput & 1<<i ) != 0 ) Nezumi->Button[i]++; //押されていたらカウントアップ
else Nezumi->Button[i] = 0; //押されてなかったら0
}
Nezumi->WheelRotVol = GetMouseWheelRotVol() ; //ホイール回転量取得
return 0;
}
extern void img_sound_load();
typedef struct{
int x,y,counter;
}logo
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
// 透過色を変更 白を透過
SetTransColor( 255 , 255 ,255 );
int White=GetColor(255,255,255);
logo color;
color.x=0;
color.y=0;
color.counter=0;
img_sound_load();
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
GetHitMouseStateAll_2(&Mouse); //マウスの入力状態取得
//ココ!!
DrawFormatString(0,0,White,"座標[%d,%d],回転量:%d,",Mouse.x,Mouse.y,Mouse.WheelRotVol);
for(int i=0; i<4; i++){
DrawFormatString(0, 20+20*i, White, "ボタン%d:%u", i, Mouse.Button[i]);
}
DrawGraph(191,150,img_logo,TRUE);
ScreenFlip();
}
DxLib_End();
return 0;
}
822ポイント を手に入れた。
|
|
|
|
Name: ひよこ ..上級者(24,766ポイント)
Date: 2009/04/01(水) 11:29
No:31472
| 解決!
|
Title: Re:構造体でエラーが
|
|
ありゃりゃそんなところにまちがいがあった。
実行できるようになりました。
バグさん、ありがとうございます。
43ポイント を手に入れた。
|
|
|
|
Name: ざこ ..熟練のプログラマー(42,382ポイント)
Date: 2009/03/30(月) 18:27
No:31407
|
|
Title: 変数の受け渡し
|
|
何か似た質問になってしまいますがちょっと混乱していますのでご了承ください。
環境はVC++6.0のMFCです。
メインクラスCDragDropDlgクラス
新クラス CTestクラスの2つがあります。CTestのリストビューの中身をメインクラスにもっていきたいんですが
CTestクラス
void CTest::OnOK()
{
CDragDropDlg DLG;
int index=-1;
while((index=m_list.GetNextItem(index,LVNI_ALL)!=-1){
s2=m_list.GetItemText(index,0);
}
CDialog::OnOK();
}
CDragDropDlgクラス
・
・
CTest Tdlg;
CString SS;
Tdlg.s2=SS;
MoveFile(SS,●);
とするとCTestクラスのリストビューの中の最後の行しか移りません。中身が更新されているので
当然のような気もしますが、どうすればいいのかがわかりません。少し混乱してます。
TestクラスのOKボタンを押すとリストビューの中身を全て取得し、メインクラスに送る ことが目的です。
どうすれば全て送れるのか教えて下さい。。
474ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(154,689ポイント)
Date: 2009/03/31(火) 09:18
No:31424
|
|
Title: Re:変数の受け渡し
|
|
メインダイアログに送るというのはどういうことですか?
CTestクラスのOnOKの中で使用されているs2という変数の型は何ですか?(CStringクラスのssに代入していることから考えると、CStringクラスでしょうか?)
リストビューのアイテムの数は可変ですか?固定ですか?
なんにせよ、ご自身も言われている通り、s2のアイテムはどんどん更新されていく訳ですから、最後のアイテムしか取得できないのは当たり前です。
私だったら、リストビューのアイテムを取得する為のメンバ関数をCTestに追加しておいて、DoModal関数の戻り値がIDOKの場合にそのメンバ関数からアイテムを取得する…という流れにしますね。
206ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(154,807ポイント)
Date: 2009/03/31(火) 09:51
No:31425
|
|
Title: Re:変数の受け渡し
|
|
すみません、勘違いしてました(^_^;)
DoModal関数を抜けた時点でオブジェクトは破棄されてしまうので、前記の方法では無理でしたね。
メインダイアログからCStringのポインタを渡して、リストビュー内のアイテムの数の分だけ領域を動的に確保して書き込むのが簡単でしょうか?
118ポイント を手に入れた。
|
|
|
|
|
Name: Blue ..中級者(9,078ポイント)
Date: 2009/03/31(火) 10:16
No:31426
|
|
Title: Re:変数の受け渡し
|
|
CXXAppクラスをつかてみては?
アプリ全体で使う値であればそこのメンバにしておけばいいし。
(SDI/MDIでドキュメント単位であれば、CXXDocクラスのメンバにする。)
呼び出し元でしか使わないのであれば、呼び出し元で設定する領域を渡すとか。
それと、文字列の配列であれば、CStringArrayとかstd::vector<CString>とかを使ったほうが楽ですよ。
139ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..熟練のプログラマー(42,419ポイント)
Date: 2009/04/01(水) 09:25
No:31467
| 解決!
|
Title: Re:変数の受け渡し
|
|
CStringArrayについて知らなかったので勉強して活用した所きちんとできました。
他の方法も試してみます。ありがとうございました。
37ポイント を手に入れた。
|
|
|
|
Name: カズ ..かけだし(1,259ポイント)
Date: 2009/03/31(火) 20:54
No:31442
| 解決!
|
Title: DxLib.lib リンカエラー…?
|
|
初めまして、カズと申します。
現在、四聖龍神録を通して、Cド素人レベルから弾幕シューティングゲームを作ろうと勉強しているのですが、
『まずは実行させてみよう』(http://dixq.net/rp/2.html)こちらにある通りにコンパイル、実行しようとDXライブラリの導入からVC++の設定まで済ませ、ビルドしてみたところ、
GV.h内の
"../../../include/DxLib.h"
を
"DxLib.h"
に書き直していないがためのエラーが発生し、それは質問掲示板の現行ログや過去ログを見て解決できたのですが、今度は
LINK : fatal error LNK1104: ファイル '..\include\DxLib.lib' を開くことができません。
というエラーが発生し、グーグルで検索してみたり質問掲示板の過去ログを調べたりしているのですが、さっぱり進展致しません。
ただ、調べた結果、ログにも同様の質問が書き込みされていたので、陥りやすいエラーなのかなぁとは思いましたが解決には至りませんでした。
VC++ディレクトリの『インクルード ファイル』『ライブラリ ファイル』はしっかりダウンロードしたDXライブラリ下部の『プロジェクトに追加すべきファイル_VC用』になっています。
一度DXライブラリフォルダの場所を『デスクトップ』から別のフォルダに移動しましたが、それに伴ってパスも修正し、個人的見解ですが『インクルード』側はちゃんと『プロジェクトに追加すべきファイル_VC用』になっていると思うのですが、同じパスを持つ『ライブラリ』側に読み込みエラーが起こるのが分かりません。
結果的にはLNK1104エラーを解消したいのですが、どうしてこのエラーが起こるのかということも教えて頂けると幸いです。
使用しているコンパイラは『Visual C++ 2008 Express Edition』
ライブラリは『DXライブラリ』
OSは『WindowsXP HomeEdition SP3』です。
プロジェクトの一括ダウンロードを行って、新規というよりも編集の形をとって勉強しております。
ソースコードはまるっきりコピーですが、このようになっております。
------------------------------------------------
[main.cpp]
#define GLOBAL_INSTANCE
#include "../include/GV.h"
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
//ココ!!
ScreenFlip();
}
DxLib_End();
return 0;
}
------------------------------------------------
[GV.h]
#include "DxLib.h"
#include "define.h"
------------------------------------------------
お手上げ状態で困っています、皆さんの知識を貸して下さい。よろしくお願いいたします。
なにぶんヒドイ素人なので、重要な情報を書いていなく「こんな程度の情報じゃ答られんよ」ということもあるかもしれませんが、その際は改めて訊き直して頂けると幸いです。
乱文・雑文を失礼致しました。どうかよろしくお願いいたします。
1,259ポイント を手に入れた。
|
|
|
|
Name: カズ ..かけだし(1,476ポイント)
Date: 2009/03/31(火) 21:19
No:31448
|
|
Title: Re:DxLib.lib リンカエラー…?
|
|
お返事ありがとうございます。
リビルドというのは、私が認識している範囲だと
[ビルド]→[ソリューションのリビルド]
[ビルド]→[RyuJinのリビルド]
[ビルド]→[プロジェクトのみ]→[RyuJinのみをリビルド]
これでしょうか?もしもこれのことならば、それぞれ行っております。
77ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..中級者(10,674ポイント)
Date: 2009/03/31(火) 21:29
No:31449
|
|
Title: Re:DxLib.lib リンカエラー…?
|
|
前に似たような記事があるので、探して試してみてはいかがでしょうか。
@@
35ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(12,092ポイント)
Date: 2009/03/31(火) 22:13
No:31452
|
|
Title: Re:DxLib.lib リンカエラー…?
|
|
ダウンロードして確認してみました。
プロジェクト内の(ソリューションエクスプローラ)
リソースファイルにDXライブラリのファイルが登録されているので
全て消してリビルドしてみてください。
92ポイント を手に入れた。
|
|
|
|
|
Name: カズ ..かけだし(2,022ポイント)
Date: 2009/03/31(火) 22:23
No:31453
|
|
Title: Re:DxLib.lib リンカエラー…?
|
|
SooA様、朽木様お返事ありがとうございます。
>朽木様
恐らくSooA様のリンクしてくださった記事やそれに類する記事だと思うのですが、私が発見し、かつ理解できた投稿では解決いたしませんでした。
リビルドも前記事から既に行っていましたが、、、もう一度やってもやはり駄目なようです。
お手数かけましてすみません、そしてありがとうございます。
>SooA様
ソリューションのクリーンもやってみましたがやはりダメでした…
そちらのリンク先の記事は調べてる最中に何度か拝見いたしましたが…そうなんですよね、いまいち解決したのかしてないのか分からないのです…。症状が同じなので解決しているようなら現状と比較して相違点が分かるかも…と思っていたのですが、結局分からずじまいの直らずじまいで…。
>..\include\
>はいらないと思います
という投稿の意味するところも私の知識では理解できませんでした。
Windowsアプリケーションも、可能性の一つとしては考えましたが、DLしてきたslnなので大丈夫だと判断しております。
>原因はこれかな
>龍神録プログラミングの館のソースであればincludeフォルダを作ってその中にヘッダやライブラリを入れるように記述してあるのでソースだけコピーしてもエラーになります
こちらの記事は、DLしてきたslnと同じフォルダ内の『mydat』内部にある『include』だと判断して『プロジェクトに追加すべきファイル_VC用』の中身の「.h」や「.lib」をコピーしてみたのですが、出来ませんでした。
何が悪いんでしょうかね…そろそろ情報系の専門学校に通うのですが、なんだか先行き不安になってきました…
546ポイント を手に入れた。
|
|
|
|
|
Name: カズ ..かけだし(1,898ポイント)
Date: 2009/03/31(火) 22:27
No:31454
|
|
Title: Re:DxLib.lib リンカエラー…?
|
|
>SooA様<No.31452>
お手数かけて申し訳ありません、加えてありがとうございます。
>リソースファイルにDXライブラリのファイルが登録されているので
>全て消してリビルドしてみてください。
了解しました、本当にありがとうございます。
確認なのですが、slnファイル内のリソースフォルダ下部を空っぽにしてソリューションのリビルドということで宜しいのでしょうか?
124ポイント を落としてしまった。
|
|
|
|
|
Name: カズ ..かけだし(1,979ポイント)
Date: 2009/03/31(火) 22:38
No:31455
|
|
Title: Re:DxLib.lib リンカエラー…?
|
|
>SooA様<No.31452>
バックアップをとり、教えていただいた通りに行った結果、エラーを解消することができました。
本当にありがとうございます。
社交的に良く使われる言葉なのですが、本当に、心から感謝致します。
ありがとうございます。
調べている時に「LNK1104エラーは、他で起動していると上書きできずにエラーを出す」というような内容(すみません、色々読んだので混同しています。間違っていたらすみません)を拝見しました。
そこで、自分なりの見解なのですが、slnファイルをVisual C++で開いていることで、リソースフォルダ内のファイルも起動させ、結果的に「上書きできない状態」、上記の状態になっていた。だからエラーが起きたと思いました。
とにかく、解決したのでとても助かりました。
しかし、やはり原因が分かっていれば後に自分にも誰かにも役に立つかも…
いずれにしても、ありがとうございました。本当に助かりました。
また質問を書き込むかもしれません、その時は親切にしていただけると嬉しいです。
81ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(12,193ポイント)
Date: 2009/03/31(火) 22:38
No:31456
|
|
Title: Re:DxLib.lib リンカエラー…?
|
|
プロジェクトを開いて「ソリューションエクスプローラ」タブを開くと
■プロジェクト名
+ソースファイル
+ヘッダーファイル
+リソースファイル
という項目がありますよね?
リソースファイルにDXライブラリ関係のファイルが登録されています、
パスを通している場合は必要ありませんので登録から外します。
(ファイルそのものは削除してもしなくてもかまいません。)
101ポイント を手に入れた。
|
|
|
|
Name: 狼太郎 ..ぴよぴよ(538ポイント)
Date: 2009/03/31(火) 17:33
No:31436
|
|
Title: C言語ゲームプログラミングの館〜21について〜
|
|
この前はありがとうございました。
そしてまた分からないところが出てきたので質問します。
C言語ゲームプログラミングの館の21章
”キャラを一区間歩かせる。”
の項目がよく理解できません・・・
”例えば32ピクセルを1区間で考えたいわけですが、そうすると、2ピクセル目も34ピクセル目も32ピクセルと言う区間の単位としては
左から2ピクセル目と言う意味では同じことです。つまりx座標を32で割ったあまりを計算する事で区間に区切れると言う事です。”
とはどういう意味なのでしょうか?
223ポイント を手に入れた。
|
|
|
|
Name: 朽木 ..中級者(10,639ポイント)
Date: 2009/03/31(火) 18:25
No:31437
|
|
Title: Re:C言語ゲームプログラミングの館〜21について〜
|
|
腕を真上に上げて、左右どちらかに数回回し、更に適当な位置で止めます。
今、何回回しましたか?(区間単位の座標)
今、手は何時の方向を向いていますか?(区間内の座標)
最初の状態に戻すには、逆方向に、あとどの位動か(まわ)す必要がありますか?(0地点からの距離=現在の座標)
分かりやすくするように努力してみましたが、理解できなかったらごめんなさい@@
157ポイント を手に入れた。
|
|
|
|
|
Name: hss12 ..初心者(8,145ポイント)
Date: 2009/03/31(火) 19:21
No:31438
|
|
Title: Re:C言語ゲームプログラミングの館〜21について〜
|
|
例えば、時計だと60分を1区間としているわけですが、
2分も62分も時計の長針を見たら同じ2分てことですね。
例えば、0時00分から100分たちました。今何時?
という問題があったとして
これは
100÷60=1、あまり40
つまり1時40分と分かるわけです。
画像を表示したいわけですが、時計の例だと
00〜14分、画像1
15〜29分、画像2
30〜44分、画像3
45〜59分、画像4
を表示するということです。
100分後だと1時40分なので、画像3になるわけです。
200分後だと3時20分なので、画像2ですね。
これなら分かりますか。
166ポイント を手に入れた。
|
|
|
|
|
Name: 狼太郎 ..ぴよぴよ(514ポイント)
Date: 2009/03/31(火) 19:56
No:31440
| 解決!
|
Title: Re:C言語ゲームプログラミングの館〜21について〜
|
|
ありがとうございます!
大分わかってきました!
24ポイント を落としてしまった。
|
|
|
|
Name: bomb ..ぴよぴよ(149ポイント)
Date: 2009/03/31(火) 01:51
No:31420
|
|
Title: ボンバーマンの移動システムについて
|
|
はじめまして、今DXライブラリを使用してボンバーマンもどきを作っています。
一通りのシステムは完成したのですが、今のシステムは一度「→」を押すと1マス分移動してしまいます。
実際のものはドット単位で管理しているようにみえたので、そのように改良しようかと思ったのですが、
移動のアルゴリズムが予想以上に難しかったのでアドバイスをいただければと思い投稿しました。
単純に「→」を押せば数ドット移動、などは簡単なのですが
ブロック幅と、プレイヤーの当たり判定幅が同じなので少しでもブロックに接触していると移動できなくなったりするのです。
実物をプレイすると
ボンバーマン→○
ハードブロック→□
ソフトブロック→■
..○
□ □
といった状況の場合に↓を押すと
○
□ □
の状態になるまで↓を押しているのに右に移動してくれるようになっています。
..○
□■□
この状態だと↓を押しても移動しません。
この様な移動システムではどのように判定をしているのか、手順だけでもアドバイスをいただければと思います。
マップのデータは
mapdata[11][17]という配列に
0は何もなし、1はハードブロック、2はソフトブロックというように入っています。
149ポイント を手に入れた。
|
|
|
|
Name: SooA [URL] ..中級者(11,850ポイント)
Date: 2009/03/31(火) 12:52
No:31428
|
|
Title: Re:ボンバーマンの移動システムについて
|
|
例えばマップで4x4の位置に居るとして
↓キーが押された場合に 4 のチップよりも
右に居るのか左に居るのか割り出します。
○→
□□□□□■
0 1 2 3 4 5
進行方向が判れば mapdata[x+1][y+1] を
チェックして通路であれば進行させる。
やりかたは色々とあると思いますが、
基本的な考え方としてはこんな感じです。
追記
4 と 5 が通路である場合
4 と 5 がブロックである場合
4 が 通路 5 がブロックである場合
4 が ブロック 5 が通路である場合
それぞれを考えてみてください。
237ポイント を手に入れた。
|
|
|
|
|
Name: bomb ..ぴよぴよ(173ポイント)
Date: 2009/03/31(火) 17:01
No:31435
| 解決!
|
Title: Re:ボンバーマンの移動システムについて
|
|
ありがとうございます。
無事に移動システムを完成させることができました。
24ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(11,873ポイント)
Date: 2009/03/31(火) 19:48
No:31439
|
|
Title: Re:ボンバーマンの移動システムについて
|
|
> 無事に移動システムを完成させることができました。
変な文章になってしまい、ダメかなと心配していましたが
完成してなによりです。
ご希望のものとは少し違うかもしれませんが、
それっぽいサンプルを作ったので
一応載せておきます。
23ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..中級者(13,708ポイント)
Date: 2009/03/30(月) 20:51
No:31418
|
|
Title: DXライブラリのバージョンアップ?
|
|
掲示板で知ったんですが、DXライブラリは定期的にバージョンアップされているんでしょうか?
されているとしたら、私も最新版を利用したいのでどうやって手に入れればいいのか教えてください。
あと、バージョンアップすると、また色々設定しなくてはいけないんでしょうか?
72ポイント を手に入れた。
|
|
|
|
Name: yu [URL] ..上級者(22,963ポイント)
Date: 2009/03/30(月) 21:02
No:31419
|
|
Title: Re:DXライブラリのバージョンアップ?
|
|
最新版というかテスト版ですが
ttp://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用
ttp://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用
ライブラリはDXライブラリの管理者様の所でダウンロードすることができます。
今あるライブラリをダウンロードしたものに変えて、
VCだと リビルド
BCCだと 再構築
して頂ければ使用できるようになります。
そんなに難しい作業ではありませんのですぐにできると思いますよ。
122ポイント を落としてしまった。
|
|
|
|
|
Name: 匿名 ..中級者(13,810ポイント)
Date: 2009/03/31(火) 13:18
No:31429
|
|
Title: Re:DXライブラリのバージョンアップ?
|
|
ダウンロードしたヘッダファイルとかを古い物と置き換えたらうまくいきました。
どうもありがとうございます。
ところで色々と機能が追加されたようですが、新しく加わった関数の使い方が書いてあるサイトとかがあったら教えてください。
102ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(57,852ポイント)
Date: 2009/03/31(火) 14:22
No:31431
|
|
Title: Re:DXライブラリのバージョンアップ?
|
|
本家のリファレンスに記載されていない隠し関数についてまとめて説明しているサイトは無いです。
基本的にはDxLib.hを読んで自分で動かして調べる、ここや本家の掲示板で過去ログを調べるしかないです。
10ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..中級者(14,224ポイント)
Date: 2009/03/31(火) 14:34
No:31432
| 解決!
|
Title: Re:DXライブラリのバージョンアップ?
|
|
なるほど、やってみます。
どうもありがとうございました。
30ポイント を手に入れた。
|
|
|
|
Name: yussanstar ..ぴよぴよ(581ポイント)
Date: 2009/03/30(月) 03:35
No:31370
|
|
Title: DXライブラリとエクセルのコラボ
|
|
今、DXライブラリでRPGを作っています。
そこで、町や村、ダンジョンを作るのに
エクセルでマップのようなものを描いて、
色により、どんな素材を置くかを判断させたいです。
(例:黒→../../../item/草地.png 青→../../../item/井戸.png)
どうすればいいでしょうか。よろしくお願いします。
141ポイント を手に入れた。
|
|
|
|
Name: 朽木 ..中級者(10,437ポイント)
Date: 2009/03/30(月) 04:22
No:31371
|
|
Title: Re:DXライブラリとエクセルのコラボ
|
|
色だけ、ではなくて、1 1 1 1
0 0 0 1
1 0 0 1
1 1 1 1 にして、数字に合わせて色付けするのが良いと思うんですがダメなんでしょうか。
色については、xlsとtxt(タブ)に分けてするのが簡単な方法かと@@
77ポイント を手に入れた。
|
|
|
|
|
Name: yussanstar ..ぴよぴよ(637ポイント)
Date: 2009/03/30(月) 04:25
No:31372
|
|
Title: Re:DXライブラリとエクセルのコラボ
|
|
うーん、ちょっとよく分かりません。
もう少し詳しく教えてください。
どうプログラムを書けばいいか、とか。。。
再びよろしくお願いします。
56ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..中級者(10,524ポイント)
Date: 2009/03/30(月) 05:47
No:31375
|
|
Title: Re:DXライブラリとエクセルのコラボ
|
|
ごめんなさい。求める部分が良く分からないので上で書いた通りに作りました。
参考程度でお願いします。
main.cpp ... ソースコード
map.wld ... map.xlsをタブtxt出力したもの
map.xls ... マップ編集用Excelファイル
87ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..中級者(10,310ポイント)
Date: 2009/03/30(月) 06:10
No:31376
|
|
Title: Re:DXライブラリとエクセルのコラボ
|
|
あっ、ごめんなさい。後々に map.wld を手編集したので map.xls との中身が異なっています。
出力し直して実行すると、大きさが違う(足りない)ために 2 が返るので注意して下さい。
あと、fscanfの返り値の判定が間違っていました。
20行目の、if ( fscanf(fp, "%d", &map_data[loop_y][loop_x]) == 0 ) { を、if ( fscanf(fp, "%d", &map_data[loop_y][loop_x]) == EOF ) { に直して下さい。
追:
8行目の、static unsigned int map_data[MAP_WIDTH][MAP_HEIGHT]; を、static unsigned int map_data[MAP_HEIGHT][MAP_WIDTH]; に。
ミスありすぎで怖くなってきました。本当に参考程度にして下さいね。@@;
214ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(74,598ポイント)
Date: 2009/03/30(月) 10:17
No:31385
|
|
Title: Re:DXライブラリとエクセルのコラボ
|
|
エクセルでの色のついたセルをtxt(タブ)で出力すると、セル内の値(と位置)のみ出力され、
色情報が失われてしまうのでこの方法では無理ですが、
Ruby 等のOLE機能を使ってエクセルを直接読み込み、色を取得する方法はあります。
(そのサンプルがほとんど無いのがつらいところではありますが)
2倍のポイントを手に入れた! 252ポイント を手に入れた。
|
|
|
|
|
Name: yussanstar ..ぴよぴよ(795ポイント)
Date: 2009/03/30(月) 19:08
No:31411
|
|
Title: Re:DXライブラリとエクセルのコラボ
|
|
朽木さんへ.....
ビルドしてみたのですが、
プロジェクト : error PRJ0002 : エラーの結果 -1 が '' より返されました。
とエラーが出てしまいます。
もちろん、修正していただいた箇所は直しました。
もし、どうしても実行不可能というのなら、実行結果だけでも教えて欲しいのですが。
お手数をおかけいたします。
158ポイント を手に入れた。
|
|
|
|
|
Name: 朽木 ..中級者(10,482ポイント)
Date: 2009/03/31(火) 08:04
No:31423
|
|
Title: Re:DXライブラリとエクセルのコラボ
|
|
ごめんなさい。原因が良く分かりませんでした。
実行結果:
LoadMapData("./map.wld", 5, 5) ... return 0
map_data = {
{1, 1, 1, 1, 1},
{0, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{1, 1, 1, 1, 1}
}
e 此方では空プロジェクトで作っているんですが、もしそれでもダメならexe入りを…
172ポイント を手に入れた。
|
|
|
|
Name: red ..ぴよぴよ(38ポイント)
Date: 2009/03/30(月) 19:48
No:31415
|
|
Title: Lunaの使い方を教えてください。
|
|
初めまして。redです。
今Lunaでゲーム製作をしています。
C言語の使い方は少しわかるんですが、
Luna::
(例)
LunaPad::GetState
Luna::SelectBox
・
・
・
・
のような物の使い方がわからないので、
紹介しているサイトがあったら教えてもらえませんか?
おねがいします。
38ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(336,284ポイント)
Date: 2009/03/31(火) 01:56
No:31421
|
|
Title: Re:Lunaの使い方を教えてください。
|
|
>のような物の使い方がわからないので、
>紹介しているサイトがあったら教えてもらえませんか?
のようなもの、が今ひとつわかりませんが、Lunaの使い方なら、
付属のマニュアルとサンプルが一番わかりやすいと思います。
それではだめですか?
2倍のポイントを手に入れた! 290ポイント を手に入れた。
|
|
|
|
Name: enka ..ぴよぴよ(65ポイント)
Date: 2009/03/30(月) 18:25
No:31406
|
|
Title: 初歩的なことかもしれないんですが・・・
|
|
VisualC++2008をインストールし、DXライブラリ本体もDLしました。
その後、DxLib VC というフォルダのサンプルプログラム実行用フォルダ内の「DxLib_VC2008_and_2005用.sln」というのを開こうとしたんですが、なぜか開きません。
なにか設定とか必要だったんでしょうか?
ちなみに自分まだC言語を習い始めたばっかりであまりコンピュータに詳しくありません。
原因とか分かる方いらっしゃいましたら教えてください。
65ポイント を手に入れた。
|
|
|
|
Name: Mist ..熟練のプログラマー(57,842ポイント)
Date: 2009/03/30(月) 18:45
No:31409
|
|
Title: Re:初歩的なことかもしれないんですが・・・
|
|
VC++2008を起動して「ファイル」→「開く」→「プロジェクト/ソリューション」を選択。
ダイアログで「DxLib_VC2008_and_2005用.sln」を選択。
2008への変換ウィザードが起動しますので指示に従って変換してください。
この作業後はslnからVCが起動できるようになります。
#この質問定期的に来るね(^^;
125ポイント を手に入れた。
|
|
|
|
|
Name: enka ..ぴよぴよ(91ポイント)
Date: 2009/03/30(月) 19:57
No:31416
| 解決!
|
Title: Re:初歩的なことかもしれないんですが・・・
|
|
言われたとおりVisualC++2008を起動した後に開くことができました。
ありがとうございました
26ポイント を手に入れた。
|
|
|
|
Name: lbfuvab ..上級者(19,123ポイント)
Date: 2009/03/27(金) 02:45
No:31280
|
|
Title: 無題
|
|
ある戦闘シミュレーションのプログラムを書いているのですが、誤差の出し方が分かりません。
具体的に言うと、最初にパラメータが設定されたA軍とB軍を一万回戦わせてそれぞれの勝率を得ています。
正規分布や誤差分布で調べてみたのですが、さっぱり分かりませんでしたorz
86ポイント を手に入れた。
|
|
|
|
Name: やそ ..比類無きプログラマー(89,220ポイント)
Date: 2009/03/27(金) 13:27
No:31295
|
|
Title: Re:無題
|
|
コンピュータは乱数や手入力などによる不確定要素を持ち込ませない限り、
毎回同じ結果となり、誤差は出ないと思います。
もう少し情報を出されないと有用な回答は得られないでしょう・・・
67ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..上級者(19,255ポイント)
Date: 2009/03/27(金) 15:08
No:31300
|
|
Title: Re:無題
|
|
戦闘自体は乱数で制御しているので結果は異なってきます。
後、銃での撃ち合いを想定しています。
例えば
A軍
人数:1000人
銃の命中率:40%
B軍
人数:2000人
銃の命中率:10%
でほぼ拮抗し勝率は
A軍:49.5%
B軍:50.5%
などとなるのですが、これに±○%の様に誤差の表示を付けたいのです。
132ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..上級者(18,906ポイント)
Date: 2009/03/27(金) 16:46
No:31301
|
|
Title: Re:無題
|
|
「誤差」は何を指してますか?
勝率に±ってのは概念上存在しないと思うのですが。
それとも計算の(精度的な)誤差とか・・・ってのは無さそうですね。
これだと正規分布とか関係ないですし。
もしかして分散か何かのことでしょうか。
分散だとしたら、何回かごとに分けて勝率を計算して、それの分散を出せばいいのかな。多分。
例えば100回ごとに分けて、49勝が50回と50勝が50回なら分散は丁度0.5ですよね。
183ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..上級者(21,173ポイント)
Date: 2009/03/28(土) 01:39
No:31306
|
|
Title: Re:無題
|
|
>戦闘自体は乱数で制御しているので結果は異なってきます。
本当ですか?「異なっているように見える」だけですよ。パターンは高々有限個です。
>誤差の表示
計算結果に精度保証を明示したい、ということですか?
105ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..上級者(19,164ポイント)
Date: 2009/03/28(土) 23:19
No:31335
|
|
Title: Re:無題
|
|
>本当ですか?「異なっているように見える」だけですよ。パターンは高々有限個です。
それはそうですけど・・・
>計算結果に精度保証を明示したい、ということですか?
多分そうです。
91ポイント を落としてしまった。
|
|
|
|
|
Name: lbfuvab ..上級者(19,221ポイント)
Date: 2009/03/30(月) 01:37
No:31366
| 解決!
|
Title: Re:無題
|
|
質問が良くなかったのが原因でもう回答が得られないようですので
ここで終わらせていただきます。
やそ様、ibis様、SCI様 有難うございました。
57ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(86,930ポイント)
Date: 2009/03/30(月) 19:48
No:31414
|
|
Title: Re:無題
|
|
トピ主さんへ
ちょっと意地悪に見えたかもしれませんが、
たしかに質問のされ方があいまいに見えましたので、非常に答えにくいです^^;
というのは・・・
他の方もおっしゃっていますが、「誤差」をどのような意図で考えているのか、
また戦闘の方法が分からず、兵数と命中率だけでは「互角」かどうか判断しづらいです。
「戦闘自体は乱数で・・・」とあったものの、戦闘のどこに、どのような形で乱数による処理を入れているのか分かりませんでした。
パッと見ですと2通り考えられました。
A軍
人数:1000人
銃の命中率:40%
B軍
人数:2000人
銃の命中率:10%
銃の発射(攻撃)は両軍同時に行うものとする。
敵軍に与えるダメージは「自軍の人数×(0〜命中率上限%の乱数)」
とする。
最低でも1のダメージを与えることが出来るものとする。(ダメージが1未満となった場合”1”固定)
と・・・
1ターン終了後
A軍人数は1000−(2000×(0〜10%))となり最大1000、最少800となる。
B軍人数は2000−(1000×(0〜40%))となり最大2000、最少1600となる。
というの(最少人数に減る(=ダメージ最大)で考える)を繰り返すと・・・
2ターン後
A軍人数は800−(1600×(10%))となり最少800−160=640となる。
B軍人数は1600−(800×(40%))となり最少1600−320=1280となる。
3ターン後
A軍人数は640−(1280×(10%))となり最少640−128=512となる。
B軍人数は1280−(640×(40%))となり最少1280−256=1024となる。
4ターン後
A軍人数は512−(1024×(10%))となり最少512−102=410となる。
B軍人数は1024−(512×(40%))となり最少1024−204=820となる。
5ターン後
A軍人数は410−(820×(10%))となり最少410−82=328となる。
B軍人数は820−(410×(40%))となり最少820−164=656となる。
6ターン後
A軍人数は328−(656×(10%))となり最少328−65=263となる。
B軍人数は656−(328×(40%))となり最少656−131=525となる。
7ターン後
A軍人数は263−(525×(10%))となり最少263−52=211となる。
B軍人数は525−(263×(40%))となり最少525−105=420となる。
8ターン後
A軍人数は211−(420×(10%))となり最少211−42=169となる。
B軍人数は420−(211×(40%))となり最少420−84=336となる。
9ターン後
A軍人数は169−(336×(10%))となり最少169−33=136となる。
B軍人数は336−(169×(40%))となり最少336−67=269となる。
10ターン後
A軍人数は136−(269×(10%))となり最少136−26=110となる。
B軍人数は269−(136×(40%))となり最少269−54=215となる。
11ターン後
A軍人数は110−(215×(10%))となり最少110−21=89となる。
B軍人数は215−(110×(40%))となり最少21544=171となる。
12ターン後
A軍人数は89−(171×(10%))となり最少89−17=72となる。
B軍人数は171−(89×(40%))となり最少171−35=136となる。
13ターン後
A軍人数は72−(136×(10%))となり最少72−13=59となる。
B軍人数は136−(72×(40%))となり最少136−28=108となる。
14ターン後
A軍人数は59−(108×(10%))となり最少59−10=49となる。
B軍人数は108−(59×(40%))となり最少108−23=85となる。
15ターン後
A軍人数は49−(85×(10%))となり最少49−8=41となる。
B軍人数は85−(49×(40%))となり最少85−19=66となる。
16ターン後
A軍人数は41−(66×(10%))となり最少41−6=35となる。
B軍人数は66−(41×(40%))となり最少66−16=50となる。
17ターン後
A軍人数は35−(50×(10%))となり最少35−5=30となる。
B軍人数は50−(35×(40%))となり最少50−14=36となる。
18ターン後
A軍人数は30−(36×(10%))となり最少30−3=27となる。
B軍人数は36−(30×(40%))となり最少36−12=24となる。
19ターン後
A軍人数は27−(24×(10%))となり最少27−2=25となる。
B軍人数は24−(27×(40%))となり最少24−10=14となる。
20ターン後
A軍人数は25−(14×(10%))となり最少25−1=24となる。
B軍人数は14−(25×(40%))となり最少14−10=4となる。
21ターン後
A軍人数は24−(4×(10%))となり最少24−1=23となる。
B軍人数は4−(24×(40%))となり最少4−9=−5となる。
のでA軍の勝ちです。
この命中率を乱数で取得してダメージ計算すれば勝利軍が変わることもあるでしょう。
パターン2
銃の発射(攻撃)は両軍同時に行うものとする。
命中率は固定
兵士一人ずつ命中判定を行う。
最低でも1のダメージを与えることが出来るものとする。(ダメージが1未満となった場合”1”固定)
(最少ダメージ”1”、最大ダメージ=現在の兵数となる)
と・・・
1ターンで両軍全滅もありうる(笑)
という感じで勝った負けたを数えていくわけですよね。
A軍の最少ダメージ&B軍の最大ダメージ
A軍の最少ダメージ&B軍の最少ダメージ
A軍の最大ダメージ&B軍の最少ダメージ
A軍の平均ダメージ&B軍の平均ダメージ
で計算してみるとどちらが勝ちやすい(有利)なのかある程度推測できるのではないでしょうか。
そこで、最初の疑問である「誤差」とは何を指すのか?
です。
うーん・・・分かりません(笑)
2,290ポイント を落としてしまった。
|
|
|
|
Name: nanasi ..ぴよぴよ(356ポイント)
Date: 2009/03/30(月) 00:53
No:31364
|
|
Title: 龍神録プログラミングの館の13章についての質問です
|
|
コピペの貼り付けの存在で申し訳ないんですが、
music.cppのsound_se
enemy.cppのenter_shot
shot.cppのshot_bullet
boss_shotH.cppのshot_search(n)
boss_shotH.cppのshotatan2(n)
がパソコン側から
「識別子がみつかりませんでした」
もしくは
「定義されていない識別子です」
と言われ、コンパイルできません
関数なので自分で適当に作るわけにもいかないし……どうしようかと悩んでいます
一応、確認したので見逃したとかそういうわけではないと思うのですが……
初投稿なので拙いところもあるかもしれませんが、よろしくお願いします
248ポイント を手に入れた。
|
|
|
|
Name: nanasi ..ぴよぴよ(398ポイント)
Date: 2009/03/30(月) 14:42
No:31395
|
|
Title: Re:龍神録プログラミングの館の13章についての質問です
|
|
やっぱりそれしかないんでしょうか
なんかそれをやってしまうと負けた感じがして嫌なのですが……
わがままですみません
42ポイント を手に入れた。
|
|
|
|
Name: シュウ ..ぴよぴよ(525ポイント)
Date: 2009/03/30(月) 17:19
No:31399
|
|
Title: チェインの繋ぎ方……?
|
|
初めまして、シュウといいます。
現在、とあるC言語入門書に載っている下記の『自己参照構造体(チェイン)』のプログラムが理解できず、
悩んでいます。
ポインタによるアドレス・関数の受け渡しや制御文の意味などは理解でき、実際に記述してコンパイル→実行もできたのですが、どうしてもこのプログラムの41行目にある
for(wp=start; wp->next != NULL; wp = wp->next)
という部分が理解できません。
wp は start のアドレスを示しており、start->next は NULL の筈なのに、どうしてこの for文 が何の問題もなく実行されるのでしょうか?
何方か、分かりやすい説明をお願いします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct person {
char name[30];
int age;
struct person *next;
};
main()
{
struct person dmy;
struct person *start=&dmy;
struct person *wkdata;
struct person *wp;
char name[30]=" ",buf[10];
int tosi;
start=&dmy;
start->next=NULL;
while(1){
printf("名前=");
gets(name);
if(strcmp(name,"") == 0) break;
printf("年齢=");
gets(buf); tosi=atoi(buf);
wkdata=(struct person *)malloc(sizeof(struct person));
if(wkdata==NULL){
printf("メモリ確保できません.\n");
exit(1);
}
strcpy(wkdata->name,name);
wkdata->age = tosi;
for(wp=start; wp->next != NULL; wp = wp->next){
if(tosi < wp->next->age){
wkdata->next = wp->next;
wp->next = wkdata;
break;
}
}
if(wp->next == NULL){
wkdata->next = NULL;
wp->next = wkdata;
}
}
for(wp = start->next; wp != NULL; wp = wp->next){
printf("%s %d\n",wp->name,wp->age);
}
}
525ポイント を手に入れた。
|
|
|
|
Name: toyo ..プログラマー(28,799ポイント)
Date: 2009/03/30(月) 17:29
No:31401
|
|
Title: Re:チェインの繋ぎ方……?
|
|
start->nextがNULLなのは1回目だけです
1回目はNULLなので最初のfor文の中はもちろん実行されません
if(wp->next == NULL){
wkdata->next = NULL;
wp->next = wkdata;
}
}
のところでwp(=start)->nextにwkdataが代入されますので2回目からはforの中が実行されます
139ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(75,106ポイント)
Date: 2009/03/30(月) 17:30
No:31402
|
|
Title: Re:チェインの繋ぎ方……?
|
|
> for(wp=start; wp->next != NULL; wp = wp->next)
一番最初に呼ばれる時、このfor文では、
最初の条件で( wp->next が NULL でないかをチェックしているため)偽となり、
for文の中身を実行せずにスルーします。
(for文に書かれている処理の実行順序は分かりますか?)
88ポイント を手に入れた。
|
|
|
|
|
Name: シュウ ..ぴよぴよ(677ポイント)
Date: 2009/03/30(月) 17:45
No:31403
|
|
Title: Re:チェインの繋ぎ方……?
|
|
>>toyo様
一回目は if文 を実行した後、上の for文 に二回目として戻る……ということですか?
喉まで出掛かってる感じ……あと一押しで理解できそうなのに、何故か理解できない……。
>>御津凪様
for(最初だけ初期化して; こうなら実行; その後こうしてまた判定) ……ですよね?
一番上の for文 をスルーした後、下の if文 を経て、更にその下の for文 へと移る訳ではないのですか?
152ポイント を手に入れた。
|
|
|
|
|
Name: シュウ ..ぴよぴよ(833ポイント)
Date: 2009/03/30(月) 18:02
No:31405
| 解決!
|
Title: Re:チェインの繋ぎ方……?
|
|
toyo様と御津凪様のお二人の返答を吟味してもう一度プログラムを読み解いていった結果、漸く理解することができました。
一人以下なら whileループ 後のプログラムが実行されるのは一度だけで、二人以上の場合はそれが複数回実行されるということだったのですね!
懇切丁寧な説明、どうもありがとうございました。
これからも、どうしても理解できない問題が出てきたときは頼りにさせていただきたく思います。
156ポイント を手に入れた。
|
|
|
|
Name: 新人 ..入門者(2,838ポイント)
Date: 2009/03/27(金) 11:40
No:31286
|
|
Title: 無題
|
|
C++でゲームを製作中なのですが、敵の思考スクリプトやテクスチャ素材を外から参照できないようにファイルパックするツールを作りたいのですが、
ファイルを読み込んでパック化するアルゴリズムがいまいちわかりません。
必要なファイル情報はfreadで抜き出して結合させるのでしょうか?
アドバイスお願いします。
42ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(72,930ポイント)
Date: 2009/03/27(金) 13:31
No:31296
|
|
Title: Re:無題
|
|
プログラムでバイナリファイルを扱ったことはありますか?
ファイルをパックするなら、下記のようなデータ構造でまとめると簡単に出来ます。
・ファイルヘッダ部分
0x0000 : パックされているファイル数(4Byte)
0x0004 : 各ファイルデータへのファイル先頭からのバイトオフセット値(4Byte * パックされているファイル数)
…以降、各ファイルデータ
・各ファイルデータ部分
0x0000 : ファイル名(64Byte)←扱いやすいように64文字の固定長にしているが、構造を変えれば可変長も可。
0x0040 : ファイルデータサイズ(4Byte)
0x0044 : ファイルデータ(ファイルデータサイズ)
少々抽象的ですが、このようなデータ構造とそれを処理する読み書き処理を実装すれば、
実現が可能です。
ただし、単に一つのファイルにパックしているだけなので、
データ構造を解析されてしまえば、簡単にファイルを抜き出されてしまいます。
そのため、機密性を高めるためには、この構造に加え、データの暗号化を施す必要があります。
# ちなみに、私のサイトのところで(構造は全く違いますが)同様のファイルパックツール・ライブラリがあります。
# 動作や処理の参考までにどうぞ。
520ポイント を手に入れた。
|
|
|
|
|
Name: 新人 ..入門者(2,881ポイント)
Date: 2009/03/28(土) 13:26
No:31317
|
|
Title: Re:無題
|
|
ファイルの読み込みはfopenのバイナリモードで読み込んで、freadでデータ抽出し、fwriteでまとめて書き込む形で可能なのでしょうか?
43ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(74,086ポイント)
Date: 2009/03/28(土) 16:03
No:31321
|
|
Title: Re:無題
|
|
パックファイルへの書き込みならそれで可能です。
ただ、上記にあるデータ構造は、ヘッダ部分にパックしたファイル分のデータオフセット値があるので、
書き込むファイル数が事前に確定していなくてはなりません。
(別の構造にすれば、後から追加書き込みできるようにも出来ます)
これは、書き込むファイルのリストを用意してから、まとめて処理を行なえば可能です。
ファイルデータ書き込み部分だけですが、書いてみたので載せておきます。
/*
read_fp からデータを読み出し、
pack_fp にデータサイズとデータを書き込む。
戻り値は正しく書き込めたかどうか。
*/
bool WriteDataToPack( FILE* pack_fp, FILE* read_fp ){
long size = 0;
long file_size;
size_t read_size;
unsigned char buffer[65536];
// ↑バッファサイズは出来るだけ大きいほうが処理が高速化出来るが、
// スタックオーバーフローの問題もあるためこの程度(64K)にしておく。
// ファイルサイズ取得
fseek(read_fp, 0, SEEK_END);
file_size = ftell(read_fp);
// シーク位置を先頭に戻す
fseek(read_fp, 0, SEEK_SET);
// ファイルサイズを書き込む
fwrite(&file_size, 1, 4, pack_fp);
// 以下ファイルデータ書き込み
do {
read_size = fread(buffer, 1, sizeof(buffer), read_fp);
if(read_size == 0) break;
if(fwrite(buffer, 1, read_size, pack_fp) != read_size){
return false; // 書き込みエラー
}
size += read_size;
}while(feof(read_fp) == 0);
return (read_size == size); // true: 成功, false: 読み込みエラー(サイズ不一致)
}
# コンパイル・実行チェックはしておりませんので悪しからず。
2倍のポイントを手に入れた! 1,156ポイント を手に入れた。
|
|
|
|
|
Name: 新人 ..入門者(2,901ポイント)
Date: 2009/03/29(日) 22:20
No:31360
|
|
Title: Re:無題
|
|
書き込み方法は理解できました。
{
CHAR[] ファイル名
LONG データサイズ
UCHAR[] データバッファ
}
のような構造体をリスト構造のようにし、for文で書き込み行うという考え方か
それともヘッダとデータ部に分けて
ファイル名
データ部の先頭アドレス(位置)
ファイル名
データ部の先頭アドレス(位置)
・
・
・
データ本体
データ本体
のような構造のどちら方が読み込みしやすいのでしょうか?
2倍のポイントを手に入れた! 20ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(74,346ポイント)
Date: 2009/03/29(日) 22:39
No:31361
|
|
Title: Re:無題
|
|
前者の場合、後からファイルを追加できますが、
ある特定のファイルを読み込もうとした場合、ファイルの先頭からチェックしていく必要があるので、
ファイルシーク処理を多用する必要があります。
(その分ファイルへのアクセス量が増える)
後者の場合、(上記事にも書きましたが)後からファイルを容易に追加することは出来ませんが、
ヘッダ部分を一度に読むだけで、パックしたファイルの情報が全て読み取れる利点があります。
書き込む場合は前者の形式が楽で、
読み込む場合は後者の形式が楽、
と、どちらも長所・短所がありますが、私は後者の方を薦めます。
ヘッダを読み込むだけでひとまず何のファイルがあるか分かる上、
CPU負荷やファイルアクセスなど、色々な負担も軽減できます。
260ポイント を手に入れた。
|
|
|
|
|
Name: 新人 ..入門者(2,934ポイント)
Date: 2009/03/30(月) 09:47
No:31382
|
|
Title: Re:無題
|
|
後者の場合、ヘッダを先に書き込むと思ったですが、データの先頭アドレスを取得するにはデータを先に書き込み、変数に格納する形になるのでしょうか?
33ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..比類無きプログラマー(75,018ポイント)
Date: 2009/03/30(月) 10:52
No:31387
|
|
Title: Re:無題
|
|
ファイル内のとある位置のデータを示す時、アドレスの0ベース位置はファイルの先頭位置にあります。
(メモリのアドレスとは違いますので注意・ここではオフセットと呼んだ方が良いかも知れません)
ファイルデータへのオフセット位置は、
データ先頭へのオフセット位置 = ヘッダ部のサイズ + 今までのデータの格納されたサイズ
となるので、ヘッダのサイズ・書き込むファイルの順番とサイズが決まっていれば、
これらの情報を使って先にヘッダ部を書き込むことが出来ます。
逆に、これらが決まっていないと最後にヘッダ部を書き込む形になります。
(例外もありますが話がそれるので割愛します)
上記の式ですが、分かりやすく例えてみます。
ヘッダサイズが 100 Byte とし、ファイルを以下の順番で格納(読み込み)するとします。
・ファイルA(64 Byte)
・ファイルB(32 Byte)
・ファイルC(96 Byte)
このとき、
ファイルAのデータ先頭へのオフセット値は、 100 (ヘッダサイズのみ)、
ファイルBのデータ先頭へのオフセット値は、 164 (ヘッダサイズ + ファイルAのサイズ)、
ファイルCのデータ先頭へのオフセット値は、 196 (ヘッダサイズ + ファイルA・Bのサイズ)、
となります。
420ポイント を手に入れた。
|
|
|
|
Name: 昴 ..かけだし(2,075ポイント)
Date: 2009/03/29(日) 09:28
No:31339
|
|
Title: rand関数
|
|
いつも、お世話になっています。
現在、C言語の初心者のテキストを見ながら進めています。
WindowsのVistaを使っています。
数を当てさせるプログラムを作っているのですが、その中で-999から999の整数を
rand関数を用いて生成するのですが、rand関数は0以上の整数しか生成できないのですよね?
どうしたら、負の整数を生成できるのですか?
アドバイスをお願いします。
2倍のポイントを手に入れた! 202ポイント を手に入れた。
|
|
|
|
Name: Mato ..ぴよぴよ(435ポイント)
Date: 2009/03/29(日) 09:40
No:31340
|
|
Title: Re:rand関数
|
|
例えば、0〜1999までの数字をrandで生成した後、1000引けばいいんじゃないでしょうか。
int x = rand() % 1999 - 1000;
ですかね。
(確認してません)
52ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(57,559ポイント)
Date: 2009/03/29(日) 09:47
No:31341
|
|
Title: Re:rand関数
|
|
別解
1. int配列1999個作って-999から999までセットする
2. randで0〜1998までの乱数を発生させる
3. 乱数を添え字にして配列の値を使用する
57ポイント を手に入れた。
|
|
|
|
|
Name: TKOZ ..上級者(20,231ポイント)
Date: 2009/03/29(日) 10:22
No:31343
|
|
Title: Re:rand関数
|
|
Mistさんへ
0-1999ってことは、int配列2000個ではないでしょうか?
勘違いでしたら、すみません。
45ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(44,798ポイント)
Date: 2009/03/29(日) 10:47
No:31345
|
|
Title: Re:rand関数
|
|
>>TKOZさん
配列の個数は1999個であってると思いますよ。
なぜなら2000で考えると”0”を2度含んでしまっています。
ですので、配列の個数は2000から重複している”0”1個分を引いた1999個です。
72ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..初心者(5,248ポイント)
Date: 2009/03/29(日) 10:51
No:31346
|
|
Title: Re:rand関数
|
|
>int x = rand() % 1999 - 1000; //(rand は0〜1999)
これだと、rand() が 1999 であるときと、 0であるときの xの値は両方とも 0 になるため
結果的には、 2000 -1 で、 1999個。
範囲は、-1000 <= x <= 999 になってしまうのでは?
int x = rand() - 999; //(rand は 0〜1998)
が一番良いかと。
160ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..熟練のプログラマー(44,862ポイント)
Date: 2009/03/29(日) 10:52
No:31347
|
|
Title: Re:rand関数
|
|
負の整数を作るのであれば、単純に−1を掛けてもいいんではないですか?
乱数で、0〜999の整数を生成する。
同じく乱数で、0なら1、1なら−1を掛ける。
このようにしても乱数は作れると思います。
64ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..初心者(5,282ポイント)
Date: 2009/03/29(日) 10:55
No:31348
|
|
Title: Re:rand関数
|
|
>範囲は、-1000 <= x <= 999 になってしまうのでは?
すいません誤りでした。
>int x = rand() % 1999 - 1000; //(rand は0〜1999)
正しくは、 -1000 <= x <= 998
に、ならないでしょうか?
rand % 1999 の最小値は、 0 最大値は 1998 ですので
0- 1000 <= x <= 1998 - 1000
すなわち
-1000 <= x <= 998
だと思いました。
(rand()は整数値を返すと仮定しています。)
34ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(10,952ポイント)
Date: 2009/03/29(日) 11:30
No:31351
|
|
Title: Re:rand関数
|
|
rand が 0 を返した場合 = 0-999 = -999
rand が 999 を返した場合 = 999-999 = 0
rand が 1998 を返した場合 = 1998-999 = 999
実際に rand が最小値、最大値を出したときの計算を
行ってみるといいですね。
73ポイント を落としてしまった。
|
|
|
|
|
Name: 昴 ..かけだし(2,142ポイント)
Date: 2009/03/30(月) 02:06
No:31367
|
|
Title: Re:rand関数
|
|
1. int配列1999個作って-999から999までセットする
2. randで0〜1998までの乱数を発生させる
3. 乱数を添え字にして配列の値を使用する
この乱数の値を添え字にするということは、どういうことなのでしょうか?
ans = rand() % 1999;
num[ans];
添え字を変数にすることはできないですよね。
67ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(11,062ポイント)
Date: 2009/03/30(月) 08:26
No:31380
|
|
Title: Re:rand関数
|
|
int i, num[1999] ;
// 配列に -999〜999までの値をセット
for( i=0; i<1999; i++ )
num[i] = i-999 ;
ans = num[ rand() % 1999 ] ;
rand が 0 を返した場合 = num[0]の値 = -999
rand が 999 を返した場合 = num[999]の値 = 0
rand が 1998 を返した場合 = num[1998]の値 = 999
rand が出した値に対応した配列値を引き出すという事です。
110ポイント を手に入れた。
|
|
|
|
|
Name: 昴 ..かけだし(2,170ポイント)
Date: 2009/03/30(月) 10:23
No:31386
| 解決!
|
Title: Re:rand関数
|
|
>>試してみましたか?
試していませんでした・・・
試したら、出来ました(^^;
28ポイント を手に入れた。
|
|
|
|
Name: bagsac ..ぴよぴよ(0ポイント)
Date: 2009/03/27(金) 23:13
No:31302
|
|
Title: インベーダーゲーム
|
|
いつもお世話になっています
今回はC言語ベースにインベーダーゲームを作りたいと思っています。ゲーム作成にあたっては初心者なので、ネット上でインベーダーゲームの作り方を紹介してあるおすすめサイトなどありましたら、どなたか教えていただけないかと思い投稿させていただきました。よろしくお願いします。
101ポイント を落としてしまった。
|
|
|
|
Name: bagsac ..ぴよぴよ(29ポイント)
Date: 2009/03/30(月) 01:28
No:31365
|
|
Title: Re:インベーダーゲーム
|
|
いろいろググってみたのですが、いまいち良いサイトがなくて困っています。よろしければ、どなたかサイトを教えてくださぃ。
29ポイント を手に入れた。
|
|
|
|
|
Name: cosmo ..中級者(9,649ポイント)
Date: 2009/03/30(月) 08:06
No:31377
|
|
Title: Re:インベーダーゲーム
|
|
C言語でインベーダーゲームを製作なさろうとしているのですか…
VBなら、
ttp://www.microsoft.com/japan/athome/magazine/ucontents/users/recipe/016/intro.aspx
と言うサイトがありました。
C言語のほかにも色々なサンプルが載っているサイトとしては、
ttp://codezine.jp/
があります。
サンプルをダウンロードする時はメールアドレスの登録が必要です。
登録だけしておいても損は無いでしょう。
但し、よくメールマガジンが送られてくるので、その辺も考えて登録してください。
ここのサイトの中にインベーダーゲームのサンプルがありましたが、
SDL . NET(DXライブラリよりも機能が多いマルチメディアライブラリ?)
と言うオープンソースライブラリを使用していました。
このサイトの中には、タスクシステムを用いたシューティングのサンプルもありました。
他には、
ttp://akita-nct.jp/yamamoto/lecture/2007/2E/24th/html/game.html
と言うサイトも。
このサイトは秋田の高専のサイトみたいですが、インベーダーゲームのソースコードが公開されています。
このソースコードはざっと見た感じではC言語とOpenGLの知識が必要なようです。
OpenGLのダウンロードとインストール、Visual Studioの設定は
ttp://opengl.softwarecarpenter.biz/?eid=949759
を参考にすると良いでしょう。
私がググった中ではこんなところでしょうか…。
411ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(154,438ポイント)
Date: 2009/03/30(月) 08:16
No:31378
|
|
Title: Re:インベーダーゲーム
|
|
ドコモ携帯アプリ開発用の環境&ライブラリであるDojaの少し前のバージョンにインベーダーゲームのサンプルがありました。開発言語はJAVAですが参考になる箇所は少なくないと思います。
61ポイント を手に入れた。
|
|
|
|
Name: i.k.l. ..ぴよぴよ(259ポイント)
Date: 2009/03/25(水) 04:45
No:31213
|
|
Title: 龍神録プログラミング9章の謎
|
|
現在、龍神録プログラミングの館を利用して、
ゲームプログラミングの勉強をしております。
ところで、9章で思わぬ壁にぶつかってしまいました。
9章までの通りに、プログラミングを書いたのですが、
実行してみると、二つの問題が起こりました。
@ 横に動く時に比べて、縦に動く時の方がスピードが遅い。
A 動ける範囲を飛び出しても、なぜか速度が落ちるだけで、
一向に止まってくれない。(横に動いた時だけ)
何が原因でしょう?
また、プログラミングが間違っているのだとしたら、どういう間違いが考えられますか?
よろしくお願いします。
259ポイント を手に入れた。
|
|
|
|
Name: BEMANI ..上級者(23,481ポイント)
Date: 2009/03/25(水) 08:49
No:31217
|
|
Title: Re:龍神録プログラミング9章の謎
|
|
>>i.k.l.さん
>@横に動く時に比べて、縦に動く時の方がスピードが遅い。
移動処理自体が間違っているか、移動速度の値が、X, Yで異なっているのだと思います。
もう一度、移動処理はあっているのか、移動時に使っている変数の中身が正しい値か確認してみて下さい。
>A動ける範囲を飛び出しても、なぜか速度が落ちるだけで、
>一向に止まってくれない。(横に動いた時だけ)
これも@と同じ症状が原因ではないかな〜と思います。
正しく座標制御出来ているか確認してみて下さい。
具体的にどのような移動処理を行っているか分からないので、
i.k.l.さん御自身で解決できないのであれば、コードをアップしてみると回答が得やすいかもしれません。
208ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..熟練のプログラマー(48,988ポイント)
Date: 2009/03/25(水) 14:26
No:31219
|
|
Title: Re:龍神録プログラミング9章の謎
|
|
BEMANIさんの回答以上の事は言えませんが、キー入力は正常に判断しているみたいなので、赤文字部分の値が間違ってるのではないかと思います。
double x,y,mx,my,naname=1;
・
・
・
・
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;//実際に移動させる
}
}
}
Aに関しては青部分の判断に不十分があるか、単に間違ってるのではないでしょうか
599ポイント を手に入れた。
|
|
|
|
Name: けんたろうちゃん ..かけだし(2,160ポイント)
Date: 2009/03/29(日) 04:18
No:31337
|
|
Title: キー&パッド入力を扱うクラスがうまく動作しない
|
|
龍神録プログラムの館の8章を参考にして、キーコンフィグに対応したクラスを作成しました
しかし、なぜかうまく動作してくれません
具体的な不具合は
・パッドの方は設定されたボタンを押すときちんと動作してくれる
・しかし、キーボードの方はなぜかどれを押しても全て下入力とされてしまう
作成した入力クラスを使用したサンプルを用意しました
中身は
プロジェクトファイル
main.cpp
GameFrame.cpp GameFrame.h (ゲームの骨組み)
Input.cpp Input.h (キー&パッドの入力を扱うクラス)
Definition.h (定義など)
となっています
原因が他の場所にあるのかもしれません・・・
どなたか不具合の原因を教えてください
299ポイント を落としてしまった。
|
|
|
|
Name: けんたろうちゃん ..かけだし(2,262ポイント)
Date: 2009/03/29(日) 10:31
No:31344
| 解決!
|
Title: Re:キー&パッド入力を扱うクラスがうまく動作しない
|
|
すいません自己解決しました
DXライブラリの最新バージョンではSetJoypadInputToKeyInputという非常に便利な関数があるんですね・・・
これでキーボード、ジョイパッドのどちらもキーコンフィグに対応させることができそうです
102ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..比類無きプログラマー(75,033ポイント)
Date: 2009/03/29(日) 11:08
No:31349
| 解決!
|
Title: Re:キー&パッド入力を扱うクラスがうまく動作しない
|
|
自己解決したようですが、一応解決策はinitGame()を廃止し、
static const configpad_t configpad={1,3,2,0,5,4,7,6,8,10,9,11,13,12};
とすれば一応はうまくいきます。
追加
staticはつけなくてもよかったですね^^;
118ポイント を手に入れた。
|
|
|
|
|
Name: けんたろうちゃん ..かけだし(2,309ポイント)
Date: 2009/03/30(月) 04:32
No:31373
|
|
Title: Re:キー&パッド入力を扱うクラスがうまく動作しない
|
|
返信ありがとうございます
constをつけるという方法で解決できるんですね
しかし、ゲームプレイ中にキーコンフィグをできるようにするためにこの方法とは別のやり方で修正(というか根本的な変更)しました
今では目的どおりキーボードとジョイパッドどちらもプレイ中にボタン変更できるようになりました
47ポイント を手に入れた。
|
|
|
|
Name: みー ..入門者(2,821ポイント)
Date: 2009/03/29(日) 12:22
No:31352
|
|
Title: malloc()の動作
|
|
int i[10];
i=(int)malloc(20);
とした場合、変数宣言時に確保されたメモリはどうなるのですか??
宣言時のメモリは解放され、malloc()で新たに確保された領域のみが配列として使用されるのでしょうか??
それから配列のアドレスを表示しようとして、
printf("str[0]:%p",str[0]);
と書いたのですが、どうもおかしな値が出力されます。
これはポインタ変数を使わないといけないのでしょうか??
19ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(137,402ポイント)
Date: 2009/03/29(日) 12:41
No:31353
|
|
Title: Re:malloc()の動作
|
|
> int i[10];
> i=(int)malloc(20);
> とした場合、変数宣言時に確保されたメモリはどうなるのですか??
こういうことはできません。コンパイルエラーが出ます。
配列として確保した領域 i の先頭要素へのアドレスを、
malloc()の戻り値で上書きすることはできません。
それとも、お手元にあるコンパイラでは上記のことができたのでしょうか?
> それから配列のアドレスを表示しようとして、
> printf("str[0]:%p",str[0]);
> と書いたのですが、どうもおかしな値が出力されます。
str[]の先頭要素のアドレスを出力する場合、
printf("str[0]:%p",str);
のように配列名だけを書くか、あるいは
printf("str[0]:%p",&str[0]);
のように、配列の先頭要素str[0]のアドレスであることを明示するかです。
C言語では、配列名は当該配列の先頭要素のアドレスを表わします。
2倍のポイントを手に入れた! 414ポイント を手に入れた。
|
|
|
|
|
Name: みー ..入門者(3,119ポイント)
Date: 2009/03/29(日) 12:51
No:31354
|
|
Title: Re:malloc()の動作
|
|
僕の勘違いでした。申し訳ありません。
//ソース
#include <stdio.h>
int main (void)
{
char str[4][4];
int count1=0,count2=0;
while(count1<=4)
{
printf("str[%d][%d]:%p\n",count1,count2,&str[count1][count2]);
count2++;
if (count2==5)
{
count2=0;
count1++;
}
}
return 0;
}
//出力結果
str[0][0]:0012FF7C
str[0][1]:0012FF7D
str[0][2]:0012FF7E
str[0][3]:0012FF7F
str[0][4]:0012FF80
str[1][0]:0012FF80
str[1][1]:0012FF81
str[1][2]:0012FF82
str[1][3]:0012FF83
str[1][4]:0012FF84
str[2][0]:0012FF84
str[2][1]:0012FF85
str[2][2]:0012FF86
str[2][3]:0012FF87
str[2][4]:0012FF88
str[3][0]:0012FF88
str[3][1]:0012FF89
str[3][2]:0012FF8A
str[3][3]:0012FF8B
str[3][4]:0012FF8C
str[4][0]:0012FF8C
str[4][1]:0012FF8D
str[4][2]:0012FF8E
str[4][3]:0012FF8F
str[4][4]:0012FF90
となったのですが、ひとつ質問があります。
例えばstr[3][4]とstr[4][0]、同じアドレスを出力していますよね。これは同じメモリを使っているということですか??
つまりstr[3][4]==str[4][0]ということなのでしょうか??
298ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(137,511ポイント)
Date: 2009/03/29(日) 12:55
No:31355
|
|
Title: Re:malloc()の動作
|
|
>char str[4][4];
この定義だと、
>str[0][4]:0012FF80
>str[1][4]:0012FF84
>str[2][4]:0012FF88
>str[3][4]:0012FF8C
>str[4][0]:0012FF8C
>str[4][1]:0012FF8D
>str[4][2]:0012FF8E
>str[4][3]:0012FF8F
>str[4][4]:0012FF90
これらは配列の定義範囲外であることはおわかりですか?
109ポイント を手に入れた。
|
|
|
|
|
Name: みー ..入門者(3,145ポイント)
Date: 2009/03/29(日) 12:55
No:31356
| 解決!
|
Title: Re:malloc()の動作
|
|
すみません。変な事いいました。忘れてください。
ありがとうございましたw。
26ポイント を手に入れた。
|
|
|
|
Name: 昴 ..かけだし(1,805ポイント)
Date: 2009/03/24(火) 01:22
No:31193
|
|
Title: strcmp関数に関して
|
|
こんばんは、いつもお世話になっています。
現在、C言語の初歩的なテキストを見ながら進めています。
WindowsのVistaを使っています。
strcmp関数についてなんですけれども
char str[] = "ABC";
char str1[] = "ABC";
char str2[] = "ABD";
strcmp(str, str1); ----@
strcmp(str, str2); ----A
@とAの実行結果では0と-1になりました(処理系に値は異なります)。
strcmp関数は文字列と文字列を比較して、それぞれ、正の値、負の値、0を戻り値として返すのですよね。
文字列と文字列の大小の比較と何を基準に比較するのでしょうか?
5と3だったら、5のほうが大きいと分かりますが、"ABC"と"ABD"の文字列の大小の比較なんてできるのでしょうか?
よろしくお願いします。
331ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(94,139ポイント)
Date: 2009/03/24(火) 01:36
No:31194
|
|
Title: Re:strcmp関数に関して
|
|
> 文字列と文字列の大小の比較と何を基準に比較するのでしょうか?
文字列中の各文字をunsigned char型の数値とみなして単純比較します。
前から順に比較していき、値が異なった時点で、その文字の大小関係を比較していると考えてかまいません。
46ポイント を落としてしまった。
|
|
|
|
|
Name: 昴 ..かけだし(1,854ポイント)
Date: 2009/03/24(火) 01:49
No:31195
|
|
Title: Re:strcmp関数に関して
|
|
回答ありがとうございます。
unsigned char型の数値とは何でしょうか。
insignedだから符号なしということですよね。符号なしのchar型の数値…?
49ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(94,183ポイント)
Date: 2009/03/24(火) 02:00
No:31197
|
|
Title: Re:strcmp関数に関して
|
|
> unsigned char型の数値とは何でしょうか。
> insignedだから符号なしということですよね。符号なしのchar型の数値…?
strcmpに渡す引数はconst char*ですが、char型が符号付きか符号無しかは処理系定義です。
ですので、strcmpの内部では、unsigned charであるとみなして比較を行います。
44ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(28,469ポイント)
Date: 2009/03/24(火) 08:18
No:31201
|
|
Title: Re:strcmp関数に関して
|
|
>>昴さん
他人のソースを見るのも勉強になりますよ
これはunsignedで比較
int
strcmp(const char *s1, const char *s2)
{
while (*s1 == *s2++)
if (*s1++ == 0)
return (0);
return (*(unsigned char *)s1 - *(unsigned char *)--s2);
}
これは片方の文字列が終わったときだけunsignedで
int
strcmp (const char *s1, const char *s2)
{
while (*s1 != 0 && *s1 == *s2)
s1++, s2++;
if (*s1 == 0 || *s2 == 0)
return (unsigned char) *s1 - (unsigned char) *s2;
return *s1 - *s2;
}
これは戻り値が1, 0, -1のみ
int
strcmp(char *s1, char *s2)
{
unsigned c1, c2;
for(;;) {
c1 = *s1++;
c2 = *s2++;
if(c1 != c2) {
if(c1 > c2)
return 1;
return -1;
}
if(c1 == 0)
return 0;
}
}
363ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(4,262ポイント)
Date: 2009/03/24(火) 10:00
No:31202
|
|
Title: Re:strcmp関数に関して
|
|
char型は、int型などよりせまい範囲の整数を扱う型であると
理解するのがよいかもしれません。
|
|
|
|
|
Name: hss12 ..初心者(7,979ポイント)
Date: 2009/03/24(火) 20:16
No:31204
|
|
Title: Re:strcmp関数に関して
|
|
例えば
Aの文字コードが65で、Bの文字コードが66ですので
Bの文字のほうが大きいと分かります。
strcmp関数が文字コードで比較しているかは
これこそ処理系によって異なります、なのかもしれませんが。
ちなみに文字コードはunsigned char型の数値です。(違う場合もあり)
106ポイント を落としてしまった。
|
|
|
|
|
Name: 昴 ..かけだし(1,873ポイント)
Date: 2009/03/29(日) 09:20
No:31338
| 解決!
|
Title: Re:strcmp関数に関して
|
|
皆様、回答ありがとうございました。
よく、分かりました。
19ポイント を手に入れた。
|
|
|
|
Name: dic ..上級者(16,769ポイント)
Date: 2009/03/28(土) 21:08
No:31326
|
|
Title: ・・・hasの関係
|
|
ちょっとつまづいたので質問させてもらいます
現在設計を行っているのですが図の解釈がちょっと分からなくなったので
Game has Scene という関係を持たせるには
図の1〜4のうちどれでしたでしょうか?
59ポイント を落としてしまった。
|
|
|
|
Name: Justy ..伝説なるハッカー(335,597ポイント)
Date: 2009/03/28(土) 21:41
No:31329
|
|
Title: Re:・・・hasの関係
|
|
菱形の方向がおかしい1と3は論外として、2か4です。
Sceneがどういうものなのかははっきりしないので、2か4のどちらというのは
ちょっと断定できません。
52ポイント を手に入れた。
|
|
|
|
|
Name: dic ..上級者(16,770ポイント)
Date: 2009/03/28(土) 21:57
No:31330
| 解決!
|
Title: Re:・・・hasの関係
|
|
Justyさん回答ありがとうございます
辞書で意味を調べたところ解決しました
Scene は Game を構成するという意味だったので4にします
Sceneはタイトルや選択画面、ゲームなどを一場面を表す抽象的なクラスでした
1ポイント を手に入れた。
|
|
|
|
Name: Ma ..入門者(4,980ポイント)
Date: 2009/03/28(土) 10:37
No:31312
|
|
Title: 基底クラスのポインタから、継承クラスのサイズを求める
|
|
またお世話になります<(_ _)>
BCC Developer と DXライブラリ を使用している者ですが、
今、基底クラス enemy のポインタの集合を、標準ライブラリのdequeを用いて保存しています。
deque<enemy*> list;
enemy というクラスは、多数のクラスに継承しています。
listは、enemyを継承したクラスのポインタの集まりです。
つまり、goblin がenemyを継承したクラスとすると、
enemy* temp = new goblin();
list.push_back(temp);
のような感じです。(規約は読んでます。この方が読みやすいと思うので…)
継承したクラスによって、メンバー変数が変わりますから、ファイルサイズも変わってくるのですが、
このlistに保存されているポインタだけで、継承したクラスのサイズを求める事はできるのでしょうか?
sizeof(list[0]) ではポインタなので4バイト
sizeof(*list[0]) では、クラスenemy のサイズになってしまいます。
継承したクラス自体の重さはどのようにして求められるでしょうか?
*質問した理由
このデック list にある情報をすべてファイルに書き出そうと思ったのですが、
deque の中身を保存して完全に復元するには、中のデータを一個一個保存しなくてはならないと思ったため、
ひとつひとつのデータのサイズを求めようとした時に、つまづきました。
もし、ひとつひとつ保存する必要がない良い方法があるなら是非ご教授お願いします<(_ _)>
自分で考えてみた方法は、すべてのクラスに、ある仮想関数を設置して、その関数から、
どのクラスのポインタであるのか判断できるようすれば、サイズも分かる。という方法ですが、
なんだか、もっと良い方法がある気がします。
もしくは、そのクラスのサイズ自体返すとか。
(↑ return sizeof(this); とすればできるのかな?)
よろしくお願いします<(_ _)>
317ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(94,669ポイント)
Date: 2009/03/28(土) 12:59
No:31314
|
|
Title: Re:基底クラスのポインタから、継承クラスのサイズを求める
|
|
(スマートポインタを用いる方法も含めて)何らかの方法でサイズを埋め込むか、サイズを返す仮想関数を用意する以外の方法は原則としてありません。
それ以外の方法も2つありますが、いずれもあまりお勧めしません。
1. クラスにoperator newを定義して、各オブジェクトの外部でサイズを管理する。
2. クラスにoperator delete(void*, std::size_t)を定義して、いったんdeleteしてみる。
ただし、本当に解体されないように、サイズ確認の際には、事前にフラグを設定しておくなどする(決してお勧めしない方法)。
2倍のポイントを手に入れた! 470ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(94,750ポイント)
Date: 2009/03/28(土) 13:06
No:31315
|
|
Title: Re:基底クラスのポインタから、継承クラスのサイズを求める
|
|
事前にどんな派生クラスがあるのか把握できることが前提であれば、もうひとつ方法があります。
typeidでstd::type_infoのconst参照が取れますので、個々の派生クラスのtypeidと比較して、一致するものを探せば何とかなります。
ただ、このような型スイッチは禁じ手ともいえる方法なので、やはりお勧めはしません。
81ポイント を手に入れた。
|
|
|
|
|
Name: Ma ..初心者(5,088ポイント)
Date: 2009/03/28(土) 21:01
No:31325
| 解決!
|
Title: Re:基底クラスのポインタから、継承クラスのサイズを求める
|
|
>スマートポインタ
スマートポインタって便利ですね!←いままで知らなかったw
>typeid
typeid は、以前避けた方がいいと読んだ事があります。
やはり禁じ手なのですか。。
>boostのReflection
自分も使った事ないです><
サイズを返す仮想関数を用意するのが、一番簡単そうですね。
ありがとうございました<(_ _)>
108ポイント を手に入れた。
|
|
|
|
Name: bitter_orange ..ぴよぴよ(126ポイント)
Date: 2009/03/28(土) 06:04
No:31307
|
|
Title: C言語のファイル操作で質問です。
|
|
初めまして。
題名の通りファイル操作について質問させていただきます。
ファイルから文字列を読み込みその文字列をバイナリファイルで出力し、そのバイナリファイルを読み込みたいのですがうまくいきません。
理由はわかりませんが、バイナリファイルをうまく読み込めていない状態です。
また、文字列をバイナリファイルで出力してもメモ帳等で開くと普通に読めるのでしょうか。
数字で試したときは関係のない文字等が出てきたのですが文字列をバイナリで出力しても変わりありません。
その時、改行が無効になってしまいます。
(元:おはよう。(改行)→(改行)→こんにちは。 出力後:おはよう。こんにちは。 という状態です)
自分は下記のようなプログラムにしています。コンパイルエラーはありません。
OSは[Windows Vista]で開発環境は[Microsoft Visual C++ 2008 Express Edition]です。
// 以下プログラム
#include <stdio.h>
#include <string.h>
// 警告防止用
#pragma warning( disable: 4996 )
int main(int argv,char *argc[])
{
FILE *fp;
int loop = 0;
char str1[3][256] = {};
char str2[3][256] = {};
// 読み込み(事前にname.txtというファイルを作成して文字列を入力しました)
if(!(fp = fopen("name.txt", "r+"))){
perror("ファイルの読みに失敗しました。");
return -1; }
for(loop = 0; loop < 3;loop++)
fgets(str1[loop],256,fp);
fclose(fp);
// 確認用
for(loop = 0; loop < 3;loop++)
printf("str1 = %s",str1[loop]);
// バイナリモードで書き込み
fp = fopen( "name_r.txt", "wb");
for(loop = 0; loop < 3;loop++)
fwrite(str1[loop],sizeof(char),strlen(str1[loop]),fp);
fclose(fp);
// バイナリモードで読み込み
fp = fopen( "name_r.txt", "rb");
for(loop = 0; loop < 3;loop++)
fread(str2[loop],sizeof(char),strlen(str2[loop]),fp);
fclose(fp);
// 確認用
for(loop = 0; loop < 3;loop++)
printf("str2 = %s",str2[loop]);
return 0;
}
// 以上
どのように訂正したらよいのでしょうか?
よろしくお願いします。
126ポイント を手に入れた。
|
|
|
|
Name: SCI ..上級者(21,459ポイント)
Date: 2009/03/28(土) 07:05
No:31308
|
|
Title: Re:C言語のファイル操作で質問です。
|
|
一部に全角空白があったので、そのままではエラーになりますね。
> char str1[3][256] = {};
> char str2[3][256] = {};
BCCではエラーです。
> // バイナリモードで書き込み
> fp = fopen( "name_r.txt", "wb");
バイナリモードでは改行コードが変換(0x0A→0x0D0A)されないので、後からテキストとしてみたときに改行が消えたように見えます。
書き込みモードを"w"にすれば改行がちゃんと入ります。
あ、それから一番最初の読み込みでは、書き込む予定がないなら"r"で十分ですよ。
> fread(str2[loop],sizeof(char),strlen(str2[loop]),fp);
(初期化されていれば)str2にはまだ文字列が入っていないので、ここでstr2に対してstrlenすると読み込むサイズは0バイトです。
初期化されていなかったら、そのサイズも不定になります。
テキストデータもバイナリデータの一部なので、バイナリモードで書き込んでもデータ隠蔽にはなりません。
数値データが記号の羅列になったように見えることについては、文字コードについて調べてみると分かりますよ。
286ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(10,782ポイント)
Date: 2009/03/28(土) 07:06
No:31309
|
|
Title: Re:C言語のファイル操作で質問です。
|
|
// バイナリモードで読み込み
fp = fopen( "name_r.txt", "rb");
for(loop = 0; loop < 3;loop++)
fread(str2[loop],sizeof(char),strlen(str2[loop]),fp);
fclose(fp);
保存されたデータを読み込むところですが、
この時点で str2[]にデータが入っていないので
strlen( str2[loop] ) としても文字列の長さは返りません。
fgets() を使って読み込むか、str1から長さを取得する、
保存時に固定長で保存する、などしましょう。
257ポイント を手に入れた。
|
|
|
|
|
Name: SooA [URL] ..中級者(10,873ポイント)
Date: 2009/03/28(土) 07:21
No:31310
|
|
Title: Re:C言語のファイル操作で質問です。
|
|
追記
以下■の部分に全角スペースが使われています。
投稿コメントにのみ追加したならプログラム的には問題ありませんが…
if(!(fp = fopen("name.txt", "r+"))){
■■■■■■■■perror("ファイルの読みに失敗しました。");
return -1; }
for(loop = 0; loop < 3;loop++)
■■■■■■■fgets(str1[loop],256,fp);
91ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..プログラマー(28,660ポイント)
Date: 2009/03/28(土) 09:25
No:31311
|
|
Title: Re:C言語のファイル操作で質問です。
|
|
バイナリモードとテキストモードの違いはWindowsでは改行コード変換の有無だけです
読み込み時にはCR+LFの2バイトがLFの1バイトに変換(このままバイナリで書き込むとメモ帳では改行が反映されなくなります)
書き込み時にはLFの1バイトがCR+LFの2バイトに変換(メモ帳でも改行がちゃんと表示されます)
Linuxでは両者に違いはなくバイナリモード、テキストモードの部分は無視されます
107ポイント を手に入れた。
|
|
|
|
|
Name: bitter_orange ..ぴよぴよ(240ポイント)
Date: 2009/03/28(土) 11:32
No:31313
| 解決!
|
Title: Re:C言語のファイル操作で質問です。
|
|
多くのご返信ありがとうございます。
fgetsに置き換えたらうまくいきました。
皆様、ご指導ありがとうございました。
全角の空欄は編集して半角の空欄に訂正しました。
<pre></pre>がうまく使えなかったので、その一部分を空白で補いましたがミスで全角で入力してしまいました。
すみませんでした。
114ポイント を手に入れた。
|
|
|
|
|