1人でゲームが作れるように修行します。2 (487レス)
上下前次1-新
46(1): SGGK ◆6pZCoAtaxk [sage] 2010/07/14(水) 23:35:58 ID:E0crx8nl(1) AAS
久しぶりに書き込み。
887氏、もしかして開発中止だろうか。
再開して戻って来れるように、こちらの進捗0でも何か書いてみる。
自分の方は2か月の空白を作ってしまい、>>4242(1): SGGK ◆6pZCoAtaxk [sage] 2010/05/19(水) 00:20:03 ID:+kD8rOAe(1) AAS
次の日になって自分の書き込みを見るとなんだか赤面な感じ。
別にフェードアウトするフラグでは無いので…(汗)。
一応>>7をやって頭の整理をするところまではやらねば〜!。
で辞めないと言ったものの、開発続行はやはり怪しい。
とりあえず、>>42、>>77(4): SGGK ◆6pZCoAtaxk [sage] 2010/05/06(木) 00:35:45 ID:3I0cpMiE(1) AAS
>>6
お互い頑張りましょ〜!
自分は進捗止まりそうですが、細々とでもやっていくつもりです。
前スレで書いてた小目標、「選手の守備範囲にボールが入ったときにだけ選手がボールを追うようにする」は
ちょっと止めておいて、この前実装した、「前半から結果表示までの流れ」を遷移図のような感じで表現できないかを
試してみる予定。大雑把な遷移図は以前書いてアップした事があったけど、その後の実装は全く別な感じになったので
一度見直してみて、今後の作業の参考になればと思ったから。
で言った頭の整理は時間が掛かりすぎるので中止。
ゲームのメインの部分で前半、後半で同じような内容が書かれてあり、
長すぎてわかりにくい感じがするので、少し改善できないか考えてみる予定。
47(1): SGGK ◆6pZCoAtaxk [sage] 2010/07/15(木) 22:11:02 ID:K2yOe2RI(1) AAS
や…やめた。>>46で言ったソース改善も中止〜!
バグが出てるわけでもないし、わかりにくくてもなんとかソースを読むこともできるから、
整理に時間をかける程でもないなと思った。
とりあえずこのままにして、前スレで言っていた以下の目標をやってみる。
>967 :SGGK ◆6pZCoAtaxk [sage]:2010/04/27(火) 23:03:19 ID:puWvjObW
>次の小目標は、
>今まですべての選手が一斉にボールを追いかけていたのをやめて、
>FWは前1/3、MFは中1/3、DFは後ろ1/3の範囲にボールがある時だけ
>ボールを追いかけるようにプログラムを直す。
>…にしてみる予定。
48(1): SGGK ◆6pZCoAtaxk [sage] 2010/07/19(月) 23:53:37 ID:Enn47Jg4(1) AAS
ということで、取り組んでみたものの案の定うまくいかない…orz
まず、メインループの中にある選手の移動関数について。
移動関数の中で今が前半か後半かを判断する変数を使えるようにしたいけど、
いまのままではおそらく使えないと予想。
現在のプログラムは、選手関係の変数や関数をひとまとめにしたクラスの
オブジェクトをゲーム処理を主とした関数内に作ってあり、そのオブジェクトのメンバ関数で選手移動処理をするようになってるので、
ゲーム処理を主とした関数で定義した変数を認識させるにはたぶんその変数のアドレスを渡さなければいけないと思い、
とりあえず、
1.選手関係の変数や関数をひとまとめにしたクラスを宣言してるヘッダファイルに「前半か後半かを判断する変数」を
定義してる別のヘッダファイルを加える。
2.選手関係の変数や関数をひとまとめにしたクラスを宣言してるヘッダファイルの中の
選手移動処理の関数の引数に「前半か後半かを判断する変数」を追加する。
3.選手移動処理の関数の定義がfieldplayercontrol.cppの中にあるので、
これにも同様に「前半か後半かを判断する変数」を追加する。
ここまで書けば関数の中身を後回しにしてもコンパイラは通るはずだと思い、
コンパイルするとエラー。
error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。
運よくバグは取れたけど、詳細は進まない作業の代わりにネタおよび自分の作業メモとして少しずつ書く予定。
てっきり、また全角の空白をどこかに入れてしまったのかと思ったが、そうではなかった。
知ってれば一瞬なのに何時間か掛かってしまい、これがプログラムのしんどいところ。
49(1): STG [sage] 2010/07/21(水) 20:04:43 ID:jGZViznh(1) AAS
もうサッカーの人しかいないのかな(ヽ´ω`)
ゲーム仕様でどうしても2Dでは実現しづらい部分が出てきたので3Dに移行。
サンプルプログラムで大体どんな感じに組めばいいかはわかったのでモデル製作の勉強開始。
モデリングソフト高すぎワロタ…のでBlenderを使うことに。
50(3): SGGK ◆6pZCoAtaxk [sage] 2010/07/22(木) 00:32:00 ID:umEPonN6(1) AAS
>>49
こんばんは!。見ている人がいるからには、諦めずにもう少し頑張ってみようと思います。
自分もいつかは3Dをやりたいと思っているので、Blenderの事は記憶に留めておきます。
>48のバグは、最初「error C2146: 構文エラー : ';' が、識別子 の前に必要です。」で検索したところ、
その中で、「変数宣言の位置によってエラーになったりならなかったり ...」という言葉が目に付き、
ソースを見たところ、ヘッダファイルの左端の縦棒が太く表示されていて何かここに問題のあるしるしなのかと思い、
考えてみると、今回、選手の移動関数の引数として読み込ませたいと思っている変数は、
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
で、これはsoccergame.hで宣言されてて、しかし、選手の移動関数は
fieldplayercontrol.hで宣言されているので、ならば、fieldplayercontrol.hの上の行に
#include "soccergame.h"をいれてやればいいのではと思ってそうした。
しかし、先ほどのMATCHSTATEはクラスなどの外側に記述してあるので、コンパイルしたら、
soccergame.hと#include "soccergame.h"したfieldplayercontrol.hとで重複してしまうのではと思い、
#include "soccergame.h"を消したら、コンパイルできた!…という話。
51(3): SGGK ◆6pZCoAtaxk [sage] 2010/07/22(木) 22:16:41 ID:lTzR4XWC(1) AAS
>>47(前スレ>967)の目標完了。珍しく予想以上に早く出来た。
ソースはifとswitchの組み合わせなので長文になってしまっているのが相変わらずの難点。
次の目標は、出来れば走ったり、ジャンプをさせたりとかいろいろ思いつくけど、
選手それぞれの近くにライフゲージを表示させて、ライフが少しずつ減り、0になったら
選手が停止する
に挑戦。
52(2): 名前は開発中のものです。 [sage] 2010/07/23(金) 02:53:39 ID:C4gQhbld(1) AAS
>>50
つまり・・・どういうことだってばよ
いやすまん、偶然スレ覗いたら気になったんでちょっと質問させて欲しい
enum A{};
enum A{};
void main{}
例えばこう書くと、VisualC++では「error C2011: 'A' : 'enum' 型の再定義」っていうエラーになるんだけど
>>50の下6行で言いたいのは、こういう事とは違うの?
53: SGGK ◆6pZCoAtaxk [sage] 2010/07/25(日) 12:32:50 ID:p6Ls+avh(1/4) AAS
> >>50の下6行で言いたいのは、こういう事とは違うの?
そうです。その通りです。
「選手移動処理の関数」に「前半か後半かを判断する変数」つまり
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
を引数として持たせたい。
でも、この「前半か後半かを判断する変数」の宣言は、soccergame.hにあり、「選手移動処理の関数」の宣言はfieldplayercontrol.hにあるので、
fieldplayercontrol.hの中でsoccergame.hを#includeしなければ、引数として認識できないかなと思った。
でもそうするとfieldplayercontrol.hとsoccergame.hの両方に
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
があるので、コンパイルしたときに
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
void main{}
と2重になるので、
C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。
というエラーが出てるのかと思った。
54: SGGK ◆6pZCoAtaxk [sage] 2010/07/25(日) 12:35:16 ID:p6Ls+avh(2/4) AAS
しかし、>>52氏の指摘が気になり、試しにfieldplayercontrol.hに
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
だけを直接書きこんでみると、
error C2011: 'MATCHSTATE' : 'enum' 型の再定義
というエラーが出た。
自分が思っていたバグの原因は間違いで、
>>50で
>#include "soccergame.h"を消したら、コンパイルできた!
ときのコンパイルできた理由はほかにあるらしく、
しかもenum MATCHSTATE{略};は問題なく認識されていたらしい…orz
(>>52←指摘ありがとうございます!)
55: SGGK ◆6pZCoAtaxk [sage] 2010/07/25(日) 14:01:28 ID:p6Ls+avh(3/4) AAS
「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」というエラーメッセージが出る原因について調査。
#include "soccergame.h"で発生したバグだから、そのsoccergame.hの中に';' が抜けてるところがあるのかと思ったが、良く見たけど見つからない。
他のヘッダーファイルに#include "soccergame.h"をやってコンパイルすると、
「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」
が出る。"soccergame.h"に何かあるのか…。
もしかするとヘッダーファイル2重読み込み防止(いわゆるインクルードガード)の書き方が
"soccergame.h"だけ何かの作業でずれたか消えたかしてたか?と見てみたがなんともない。
ためしに「ヘッダファイル 2重読み込み」で検索するとやっぱりこれといったのが無く、しかし、
その中に「ヘッダーファイルは慎重に扱わないと危険です」という言葉が目に付き、
クリックすると内容が難しすぎて解らなかったけど、雰囲気的に「循環参照」というのが気になる。
56: SGGK ◆6pZCoAtaxk [sage] 2010/07/25(日) 14:03:02 ID:p6Ls+avh(4/4) AAS
自分のソースを見てみる。
fieldplayercontrol.h に soccergame.h をインクルードしたときを考えてみる。
soccergame.h は #include "fieldplayercontrol.h" してるので、
お互いがお互いをインクルードしあってる。
念のため、soccergame.h がインクルードしてないヘッダーファイルにsoccergame.hをインクルードしてみる。
これなら循環じゃないから、バグが出ないはずだと思ったが、
バグが出る場合と出ない場合がある。
バグが出ないと予想したのにバグが出たヘッダーファイルは、もしかするとsoccergame.hのインクルードしたヘッダーファイルからまたヘッダーファイルが呼ばれてて…のような感じで呼ばれていたのかもしれないが、調べきれず。
さらに
error C2146: 構文エラー : ';' が、識別子 の前に必要です。 ヘッダーファイル 循環参照
で検索してみると、掲示板関係ばかり引っかかるけど、どうも循環参照が原因の可能性が高い。
「ヘッダーファイル内でのインクルードはできるだけ避けたい。」という書き込みもあるし。
仮に循環参照が原因として何故、「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」というメッセージになるのかわからないけど、
とりあえずヘッダーファイルをインクルードしているうちに循環参照になっていたのが原因の可能性が一番高いと考えて、
>>51の課題挑戦を再開。
57(1): 名前は開発中のものです。 [sage] 2010/07/25(日) 16:05:50 ID:7RX0IWHa(1) AAS
('A`)
58(1): 名前は開発中のものです。 [sage] 2010/07/25(日) 16:13:03 ID:Vl6SpnXH(1) AAS
ふむふむ
まずヘッダーの重複読み込みを気にしているようだけど、「#pragma once」は記述している?
ちなみにマクロを使って同じ事も出来る
外部リンク[html]:www.geocities.co.jp
そして「error C2146: 構文エラー : ';' が、識別子〜」は、行数を特定しにくいエラーの一つだけど
これを発見するには、デバッグの基本技の一つ「コメントアウト」が有効
例えば、以下のように4つの関数があったとする
void A(){}
void B(){}
void C(){}
void D(){}
このCとDをコメントアウトしてコンパイル
void A(){}
void B(){}
/*
void C(){}
void D(){}
*/
これでC2146エラーが消えたようならCかD、残るようならAかBに絞り込める
消えた場合Cだけコメントアウトすれば、特定の関数まで絞り込める
この方法を使えば、例えば500行のソースが書かれている場合
その約半分250行くらいから下をコメントアウト、さらにその半分、さらにその半分・・・と機械的に絞り込む事が出来る
59(2): 名前は開発中のものです。 [sage] 2010/07/25(日) 16:24:34 ID:vN3nsQ+l(1) AAS
インクルードガードでggrks
60(1): 名前は開発中のものです。 [sage] 2010/07/25(日) 20:13:54 ID:bN26srjK(1) AAS
>>59
>>52
インクルードガード関係ない可能性が高い
61: SGGK ◆6pZCoAtaxk [sage] 2010/07/26(月) 22:44:04 ID:HmEvw+7E(1/2) AAS
>>57>>58>>59>>60
たぶんまだ正解ではないんだろうなという雰囲気が伝わってきたので、再考。
まず、>>58氏の#pragma onceを試して、もう一度soccergame.hをfieldplayercontrol.hにインクルードしてみたがやはり同じバグが発生。
でも、#pragma onceなら1行で、しかも同じ書き方でインクルードガードできるから便利。(感謝!、絞り込みも活用します。)
次に昨日書いた循環参照について。
soccergame.hをfieldplayercontrol.hにインクルードした時、soccergame.hの中では、FieldPlayerControlクラス型の実体を定義してるけど、
fieldplayercontrol.hの中でSoccerGameクラス型の実体を定義してはいないから、循環参照ではなかったかもしれないという気がしてきた。
お互いをインクルードしあってるだけでは循環参照に必ずしもなるとはいえないかもしれない。自信はないけど。
そこで、soccergame.hをfieldplayercontrol.hにインクルードした時のfieldplayercontrol.hの中身はどうなっているのかソースにして追いかけてみようとふと思った。
ひとつ気になった。
soccergame.hはその中で#include"fieldplayercontrol.h" してるので、soccergame.hをfieldplayercontrol.hにインクルードしたら、
fieldplayercontrol.h の中で #include"fieldplayercontrol.h"されるのだろうか?
なぜなら、もともとのfieldplayercontrol.hは、#include"fieldplayercontrol.h"なんてしてないから、インクルードガードされないんじゃないかなと思ったので。
62: SGGK ◆6pZCoAtaxk [sage] 2010/07/26(月) 23:01:02 ID:HmEvw+7E(2/2) AAS
そこで、「ヘッダファイルに同じヘッダファイルをインクルードできるか」のようなキーワードで何度か検索。
「ヘッダファイルは、自分とは別のヘッダファイルを #include でインクルードできるので、(略)」 という記述があったので、
それ前提でソースをエクセルに張って考えてみたら、自分としては今までで一番正解に近そうな答えが出た。
soccergame.hをfieldplayercontrol.hにインクルードしたときにsoccergame.hの中にある#include"fieldplayercontrol.h"がキャンセルされていたら、
soccergame.hからインクルードした部分の処理を進めているときは、まだFieldPlayerControlクラス型が宣言されてないから、
soccergame.hからインクルードした部分にFieldPlayerControl fieldplayercnt;
と書いても、
「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」
というエラーが出る…というのが答えかもしれない。
一応、エクセル→jpgでうp
画像リンク
63: STG [sage] 2010/07/28(水) 04:37:11 ID:ttdS5Bl4(1) AAS
3Dの勉強が楽しい
忘れていたわくわく感があふれてくるっ
知らない用語がどんどん出てくるこの冒険感っ
練習ソフトクリーム
画像リンク
64: SGGK ◆6pZCoAtaxk [sage] 2010/07/28(水) 23:06:54 ID:6+SmVQnU(1) AAS
3D、色々な事が出来そうですね。
自分もサッカーゲームの3D化を目指して開発を急ぎたいです。
>>51の課題に挑戦。
ソースはまだ書いてないけど、選手クラスにライフ値を記録するためのメンバ変数を追加して、
選手の描画関数を実行するときに選手の座標を基準にDXライブラリの四角形描画関数を2回使重ね書きして実現できないかなと脳内設計。
ライフ値をソースのどこでどのくらい減らせばいいのかを検討中。
65(4): SGGK ◆6pZCoAtaxk [sage] 2010/08/03(火) 22:32:31 ID:nPEW7e3n(1) AAS
>>51の課題が終了。
ライフ値は、各選手が移動関数を実行した直後に少しずつ減らすようにしておき、
「 現時点のライフ値/最大ライフ値xライフゲージ最大長さ 」を計算して長方形をその長さで描画する。
減り具合は完全ではないけど、今は調整する予定なし。
次の目標
●共通(ゴールキーパー以外)
(実装済)歩く Z+マウス操作
1 走る X+マウス操作
2 進行方向固定 Shiftキー
3 特殊技術(ボールが頭上ならヘディング、足元ならダイビングヘッド) Spaceバー
●ボールキープ時
4 ジャンプ(タックル避けにもなる) C
5 ロングパス 左クリック
6 ショートパス 右クリック
7 シュート 左右同時クリック
8 パス/シュートは,押す長さで強さを調整
●非ボールキープ時
9 タックル 左クリック
10 カット 右クリック
これらの内6個でも実装できれば上出来と考えて挑戦する予定。
期限を決めてやるのは無理そうな感じ…orz
66(1): STG [sage] 2010/08/28(土) 03:50:26 ID:gP4FgSvi(1) AAS
そして誰もいなくなった
Blenderの仕様でいろいろ不都合が出てきたのでメタセコイアにのりかえ中
67: SGGK ◆6pZCoAtaxk [sage] 2010/08/29(日) 22:43:31 ID:HGm0TpTI(1) AAS
>>66
アクセス規制が続いていて、実は現在も書き込めない状態でご無沙汰してました。
メタセコイアはフリー版あるらしいので、ドットが不得意な自分もいつかは触ってみたいソフトです。
3〜4週間の2chアクセス規制が頻繁にあり過ぎて製作活動ペースが落ちてくるので(言い訳)、
運営の思う壷かもしれないけど、試しにp2とやらで今日から1年間だけ書き込めるようにしてみた。
肝心の進捗の方は思わしくなく、>65の目標をみると、今のゲーム画面は視点がおかしいので悩む。
フィールドは真上から見てるのに、選手は真横から見た絵になっている。
蹴ったボールをいずれは曲線を描くようにしたいけど、この画面ではそれを表現するのが難しい事に気づく。
そしてボールの座標は(x,y)だけでは足りなくて(x、y、z)にしておかなければな後々不便な事になるような気がしてきた。
これはベクトルの表現を取り入れたプログラムに書き直しておいた方がいいかなと思い始めたところ、
偶然手元に「14歳からはじめるわくわくC言語プログラミング教室VS2008編」という本があり、
運よくこれの第3章がベクトルの説明をしていたので、読んでみることにした。
もう少しで読み終わるけど、解り辛い…。
68: SGGK ◆6pZCoAtaxk [sage] 2010/08/30(月) 23:32:27 ID:0WWGfdkP(1) AAS
昨日の書き込みを見て、思う壺という言い方が紛らわしい表現になりそうなので消したくなってきた。(赤面)
書き込み規制の原因は荒らしをする人にあるわけだから。
とりあえず3章だけを読み終えた。
明日も時間が出来ればベクトルを取り入れたプログラムに書きなおしてみる予定。
69(1): SGGK ◆6pZCoAtaxk [sage] 2010/08/31(火) 23:49:31 ID:5x9cPfBx(1) AAS
ソースをコピーして数字を一個上げた名前に変更してから作業を始めようとしたけど早速悩む。
参考にした本はCで書いてるので、C++でオブジェクトを複数種類作っているようなプログラムにどうすれば使えるか思いつかない。
とりあえず、「C++、移動、クラス、ベクトル」で検索してみたけど、いまひとつ。
C++には、例えば ベクトル+ベクトルの結果がベクトルになるような意味を持てるように
+ の意味を定義しなおす機能があるようなので、これかなと思ったけど、あまりにも内容が難しいので、諦める。
次に考えたのは、例えば vector3.h のような名前でヘッダーファイルを作り、その中に
struct Vector3{
float x,y; //とりあえずz無し
};
と書いておいて、ベクトルの必要なクラスの定義があるヘッダーファイルに #include "vector3.h" すれば外部の関数扱いになってすべてのクラスから使えるんじゃないかなと思った。
確認のために#include "vector3.h"したあるクラスの定義の中で、
Vector3 POSITION_XY={1,1};
としてみたらエラーになるので真っ青になる。(他にもう方法が思いつかないから)
しかし、
Vector3 POSITION_XY;
と書き直したら、コンパイラが通った。
クラスの定義の中では初期値を書けないのをすっかり忘れていた。
思い出せたのは運が良かった。
70(2): SGGK ◆6pZCoAtaxk [sage] 2010/09/02(木) 23:42:53 ID:N3a4x6pe(1) AAS
とりあえずベクトル関係の変数と関数を宣言したヘッダーファイル、vector3.hと
それらの変数や関数を定義したファイル、vector3.cppを作成してみた。
とは言うものの、中身は変数を3つ持つ構造体とその構造体の型を持つ変数を引数にもつ関数で
関数は、
ベクトル=ベクトル+ベクトル
微小時間後の位置を示すベクトル=現在の位置を示すベクトル+微小時間xその時点での速度を表すベクトル
の2式だけ。
この微小時間がいわゆるフレームタイムであり、今までのプログラムだと
メインループ関数の中で、DXライブラリのScreenFlip()関数を30回ループしてその平均を
フレームタイムとしてる。ScreenFlip()関数は画面のリフレッシュレートとやらと同期して動くらしいので
そういうやり方でフレームタイムが計算できるらしい。
でも、これだとメインループ関数の外側で宣言・定義されてる微小時間後の位置を示すベクトルを計算するための
関数に必要な微小時間(フレームタイム)が読み取れないと予想。
とりあえず、30回ループする部分を関数にして、vector3.h、vector3.cppで宣言・定義して、
その30回ループする部分を関数にしたのをメインループで呼び出してなんとかできないかと思ったところで終了。
上下前次1-新書関写板覧索設栞歴
あと 417 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.012s