Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.16 ) |
- 名前:管理人 日時:2009/02/12 22:27
> このプログラムを分けて送ったらどうでしょうか?
お手間ではないのでしたらそうして下さい
> 14歳からはじめるc言語ゲームプログラミング教室という本を改造していて、
> その改造がうまくいかないから、教えてもらっています。
そうですか・・・
初心者さんがどのくらい書籍の内容を理解しているのか知りたいので、
できれば初心者さんが改造を加えた正常に動作しないというプログラムを送ってください
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.17 ) |
- 名前:初心者 日時:2009/02/13 21:13
はい。変更してあるものを、分けて送ります。(実行ファイルは送りません。)
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.18 ) |
- 名前:初心者 日時:2009/02/16 21:13
英語で書いてあるメールと.txtファイルが送られてきましたけど・・・
何ですか?
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.19 ) |
- 名前:管理人 日時:2009/02/16 22:15
私の方には何も届いていません
メールアドレスを間違えていませんでしょうか?
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.20 ) |
- 名前:初心者 日時:2009/02/18 17:12
The original message was received at Wed, 18 Feb 2009 17:01:48 +0900 from mbox307-3.nf.nifty.com [172.22.240.237]
----- The following addresses had permanent fatal errors ----- <メールアドレス>
(reason: 552 Message size exceeds maximum value)
----- Transcript of session follows ----- ... while talking to mfsmax.docomo.ne.jp.:
>>> MAIL From:<メールアドレス> SIZE=5467751
<<< 552 Message size exceeds maximum value
554 5.0.0 Service unavailable
とこんな感じのが送られてきます。
付属ファイルも付いてます。
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.21 ) |
- 名前:通 日時:2009/02/18 17:46
>><<< 552 Message size exceeds maximum value
まだ、メールのサイズが大きすぎるようです。
画像とか音声とか入ってませんか?
ソースコードだけ送るのがいいと思いますが。。。
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.22 ) |
- 名前:初心者 日時:2009/02/18 20:41
音楽ファイルや画像ファイルを削除しても送れそうにないので、4つに分けます。
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.23 ) |
- 名前:管理人 日時:2009/02/19 12:44
メールが届きました、沢山送られてきてどれがどれだかちょっと混乱しましたが、
プログラムが実行できたので多分問題ないと思います
では時間がたってしまいましたが 1月21日 に初心者さんが書かれた質問にお答えします
> 以上の文を書くと当たり判定がなくなったり、1回当たったらすぐゲームオーバーになってしまいます。
> なぜそうなるか、どこが間違っているかを教えてください。
「なぜそうなるか」ですが、プログラムを拝見した限りでは、なぜそうなるかの前に、
初心者さん自身がご自分で組まれたプログラムがどのような効果を発揮するか理解できて
いないのではないかと思いました、なので「そうなるようにプログラムが組まれているから」
としかお答えのしようがありません
あわせて「どこが間違っているか」も、自キャラにライフを持たせるという点に
おいては「ライフ用の変数を追加した」ということ意外は全部間違っていると言えます
ではどうすれば自キャラにライフを持たせることができるかですが、まず Enemy構造体に
自キャラのライフを追加していますが、これは間違いです、敵キャラクターの情報に
自キャラのライフの情報があるというのは変だということは直感でお分かりいただけると思います
なので、自キャラのライフは 1月21日 のお書き込みにあったように、グローバル変数として
自キャラのライフを保持する変数を追加すればOKです
自キャラのライフはGoGameMain関数の中で初期化( 自キャラのライフ値を代入 )するのが
良いと思います
そして、敵キャラや敵の弾に当たった際にその自キャラのライフ値を1減らして、0に
なっていたら TRUE を返して自キャラがやられたことにすれば実装完了です
一度ダメージを受けたら一定時間ダメージを受けないようにしたい場合は無敵処理を
実装する必要があります
無敵処理はまた別に説明が必要ですので、とりあえずライフだけをまず実装してみてください
無敵処理を実装しないと1秒間に約60ライフ分のダメージを受けますので、自キャラの
ライフは180などにしておくと良いと思います
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.24 ) |
- 名前:初心者 日時:2009/02/20 22:30
//敵と自キャラの当たり判定
Ball2D m = { g_jikipos, 18 };
if ( HitTestBallAndBall( b, m ) == TRUE ){
jiki_life--;
}
if (jiki_life == 0){
return TRUE;
}
}
}
//敵の弾と自キャラの当たり判定
for (int i=0; i<MAXBULLET; i++){
if (g_ebullets[i].used == TRUE){
Ball2D m = { g_jikipos, 18 };
if ( HitTestBallAndBall( g_ebullets[i].bpos, m ) == TRUE ){
jiki_life--;
}
}
if (jiki_life == 0){
return TRUE;
}
}
return FALSE;
}
こんな感じに変更しましたけど、
------ ビルド開始: プロジェクト: chap3.4.5.6.7, 構成: Debug Win32 ------
コンパイルしています...
mymain.cpp
リンクしています...
chap5.obj : error LNK2005: "int jiki_life" (?jiki_life@@3HA) は既に chap4.obj で定義されています。
chap6.obj : error LNK2005: "int jiki_life" (?jiki_life@@3HA) は既に chap4.obj で定義されています。
chap7.obj : error LNK2005: "int jiki_life" (?jiki_life@@3HA) は既に chap4.obj で定義されています。
chap8.obj : error LNK2005: "int jiki_life" (?jiki_life@@3HA) は既に chap4.obj で定義されています。
myhelper.obj : error LNK2005: "int jiki_life" (?jiki_life@@3HA) は既に chap4.obj で定義されています。
mymain.obj : error LNK2005: "int jiki_life" (?jiki_life@@3HA) は既に chap4.obj で定義されています。
C:\Users\hashimoto\Documents\Visual Studio 2008\Projects\chap3.4.5.6.7\Debug\chap3.4.5.6.7.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
ビルドログは "file://c:\Users\hashimoto\Documents\Visual Studio 2008\Projects\chap3.4.5.6.7\Debug\BuildLog.htm" に保存されました。
chap3.4.5.6.7 - エラー 7、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
とエラーが出ます。
どうすればいいでしょうか?
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.25 ) |
- 名前:管理人 日時:2009/02/21 11:15
> "int jiki_life" (?jiki_life@@3HA) は既に chap4.obj で定義されています。
こちらのエラーはグローバル変数 jiki_life の実体が複数あるのが原因です
一つのソフトで同一名のグローバル変数を複数定義することはできませんので、
jiki_life という名前のグローバル変数の実体が幾つも定義されていることでエラーが発生したわけです
ヘッダファイルに jiki_life を宣言する際に extern を付け忘れていないでしょうか?
C言語わくわくゲームプログラミング教室(VS2008版)にも extern の説明がありますのでご確認下さい
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.26 ) |
- 名前:初心者 日時:2009/02/22 14:02
今度は、extern宣言をmymain.hで付けましたが、
------ ビルド開始: プロジェクト: chap3.4.5.6.7, 構成: Debug Win32 ------
リンクしています...
mymain.obj : error LNK2001: 外部シンボル ""int jiki_life" (?jiki_life@@3HA)" は未解決です。
C:\Users\hashimoto\Documents\Visual Studio 2008\Projects\chap3.4.5.6.7\Debug\chap3.4.5.6.7.exe : fatal error LNK1120: 外部参照 1 が未解決です。
ビルドログは "file://c:\Users\hashimoto\Documents\Visual Studio 2008\Projects\chap3.4.5.6.7\Debug\BuildLog.htm" に保存されました。
chap3.4.5.6.7 - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
と、エラーが出ます。
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.27 ) |
- 名前:Will 日時:2009/02/23 10:07
単に「int jiki_life;」と書いていたところにexternを付けただけでは変数の実体がなくなってしまいます。
以下のページを参考に勉強してください。
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1147
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.28 ) |
- 名前:管理人 日時:2009/02/23 14:03
Willさんのご返信に補足させていただきます
ヘッダファイルに書かれた int jiki_life ; に単純に extern をつけて
extern int jiki_life ; としてしまいますと、Willさんの仰られている通り実体がどこにも無いため
貼り付けていただいたようなエラーが発生します
なので、どこかのソースファイルに実体を定義してあげる必要があります
mymain.cpp にでも int jiki_life ; という記述を追加して実体を定義してみてください
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.29 ) |
- 名前:通 日時:2009/02/23 18:33
>ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1147
URLミス???
今回のポイントです。
・グローバル変数
グローバル変数はコンパイルされるとき、
同名のオブジェクトを見つけるとそれを1つに
統一しようとしますが、見つかったものが
すべて「定義」だとどれが本物か分からないので
エラーにします。
============: 間違った例:==================
--- A.c -------------------------
#include "A.h"//<-ここで1つjiki_lifeが定義される
BOOL a_func()
{
if(jiki_life<0)//2つ「定義」があるのでエラー
{
return TRUE;
}
return FALSE;
}
---------------------------------
--- A.h -------------------------
#ifndef A_HEADER
#defien A_HEADER
int jiki_life; // <-「定義」
#ednfif A_HEADER
---------------------------------
----B.c--------------------------
#include "A.h"//<-ここで1つjiki_lifeが定義される
BOOL b_func()
{
if(jiki_life<0)//2つ「定義」があるのでエラー
{
return TRUE;
}
return FALSE;
}
---------------------------------
============================================
これを回避する為に、本物をひとつだけ「定義」
しておき、同じグローバル変数を使用する
他のソースファイルではこの変数を使うという
「宣言」を行います。
============: 正しい例:==================
--- A.c -------------------------
#include "A.h"
int jiki_life; //<-「定義」
BOOL a_func()
{
if(jiki_life<0)//「実態」は上のjiki_life
{
return TRUE;
}
return FALSE;
}
---------------------------------
--- A.h -------------------------
#ifndef A_HEADER
#defien A_HEADER
//int jiki_life; //<-こう書くと「定義」になる
extern int jiki_life; // <-「宣言」にする為
#ednfif A_HEADER
---------------------------------
----B.c--------------------------
#include "A.h"
BOOL b_func()
{
if(jiki_life<0)//<-実体はA.cのjiki_life
{
return TRUE;
}
return FALSE;
}
---------------------------------
========================================
こうすることで、jiki_lifeという変数を使用する
ソースファイルは、A.hというヘッダファイルを
インクルードするだけで使用することができる様に
なります。
ここで、「実体」はA.cの「int jiki_life;」だけ
になります。
しかし、逆に「定義」が無い場合、
その変数が解決できないので
これもエラーになります。
============: 間違った例:==================
--- A.c -------------------------
#include "A.h"
extern int jiki_life; //<-これは「宣言」
---------------------------------
--- A.h -------------------------
#ifndef A_HEADER
#defien A_HEADER
extern int jiki_life; // <-これも「宣言」
BOOL a_func()
{
if(jiki_life<0)//「定義」が無いのでエラー
{
return TRUE;
}
return FALSE;
}
#ednfif A_HEADER
---------------------------------
----B.c--------------------------
#include "A.h"
BOOL b_func()
{
if(jiki_life<0)//<-「定義」されていないのでエラー
{
return TRUE;
}
return FALSE;
}
---------------------------------
============================================
上記の場合は、jiki_lifeという変数の
「実体」がどこにも存在しないのでエラーです。
大雑把に説明しましたが、
要するに超簡単に言ってしまえば、
「全部にextern」つけちゃダメって事です。
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.30 ) |
- 名前:初心者 日時:2009/02/23 19:29
エラーは発生しなくなりましたが、今度は、スタートするとすぐ死んでしまいます。
//敵と自キャラの当たり判定
Ball2D m = { g_jikipos, 18 };
if ( HitTestBallAndBall( b, m ) == TRUE ){
jiki_life--;
}
if (jiki_life == 0){
return TRUE;
}
}
}
//敵の弾と自キャラの当たり判定
for (int i=0; i<MAXBULLET; i++){
if (g_ebullets[i].used == TRUE){
Ball2D m = { g_jikipos, 18 };
if ( HitTestBallAndBall( g_ebullets[i].bpos, m ) == TRUE ){
jiki_life--;
}
}
if (jiki_life == 0){
return TRUE;
}
}
return FALSE;
}
こんなな感じです。
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.31 ) |
- 名前:管理人 日時:2009/02/23 23:47
jiki_life に自キャラの初期ライフを代入するコードを追加し忘れていませんか?
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.32 ) |
- 名前:通 日時:2009/02/24 12:11
グローバル変数やスタティック変数などは
プログラム開始時から、終了時までずっと
存在している変数になります。
これらの変数は特に明示的に初期化を行わなければ
0になります。
int global_var;//<-グローバル変数なので0で初期化される
void a_func()
{
static int static_var;//<-静的変数なので0で初期化される
int var;//<-動的変数なので初期値は不定
int var2 = 0;//<-動的変数だが0で初期化される
}
今回の場合は、一番上のグローバル変数の場合で、
何も初期値に設定していないのでライフ0から
スタートしているのでは?ということです。
int global_var = 120;//<-グローバル変数だが明示的に120で初期化される
初心者さんは、もう少しC言語の基礎を
勉強したほうが良いかも知れませんね。
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.33 ) |
- 名前:初心者 日時:2009/02/24 18:23
できました。
通さん分かりやすい回答ありがとうございます。
>初心者さんは、もう少しC言語の基礎を
>勉強したほうが良いかも知れませんね。
そうですね。ですがこれは、完成させたいので質問させてください。
管理人さん、無敵処理のやり方を教えてください。
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.34 ) |
- 名前:通りすがった 日時:2009/02/24 22:13
>そうですね。ですがこれは、完成させたいので質問させてください
でしたら、なおさら基礎を学んでください
遠回りに見えますが一番の近道です
(回答者に)作ってもらう、の間違いでしょ?といわれても反論できませんよ?
考え方の一例だけ書いておきます
無敵フラグを作って、無敵にしたい時にフラグを立てる(1にする)
無敵フラグが1の時は当たり判定の処理を飛ばす(処理をしない)
無敵で無くなった時に無敵フラグを折る(0にする)
|
Re: 14歳からはじめるc言語ゲームプログラミング教室 Visua ( No.35 ) |
- 名前:管理人 日時:2009/02/25 13:41
初心者さんはどの程度の改造を加えようと思っているのでしょうか?
その規模次第では改造するよりも1から作った方が早いということも考えられます
無敵処理ですが、まず無敵時間を保存する変数を新たにグローバル変数として用意します
無敵時間の変数が0のときは無敵ではなく、0以外の時は無敵、ということにします
そして、ダメージを受けた( ライフが減った )ときにその変数に無敵時間の数値を代入します( 約1秒無敵にしたい場合は 60 を代入します )
これで自キャラは無敵状態になります
次に当たり判定の処理の変更として無敵時間の変数が0ではないとき( 無敵状態のとき )は自キャラがダメージを
受けるような当たり判定処理を実行しないように if 文で分岐するようにします、何処を if 文で区切れば良いかわからない
場合はとりあえずライフを減らす処理を無敵時間の変数が0のときのみ実行するようにしてみてください
( 無敵時間の変数に値を代入する処理も、ライフが減ったときのみ実行するようにしてください )
最後に無敵状態がずっと続かないようにするために無敵時間の変数が0ではない場合は1フレーム毎に
無敵時間の変数の値を1減らす処理を追加します、これは1フレームに1回実行される部分でなら何処に
書いても良いです( CollisionCharacter 関数の中など )
|