1人でゲームが作れるように修行します。2
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2010/05/04(火) 00:44:29ID:HN0quC1A前スレ
1人でゲームが作れるように修行します。
http://pc11.2ch.net/test/read.cgi/gamedev/1006284805/
0006名前は開発中のものです。
2010/05/05(水) 17:11:20ID:zqw2r7FZ0007SGGK ◆6pZCoAtaxk
2010/05/06(木) 00:35:45ID:3I0cpMiEお互い頑張りましょ〜!
自分は進捗止まりそうですが、細々とでもやっていくつもりです。
前スレで書いてた小目標、「選手の守備範囲にボールが入ったときにだけ選手がボールを追うようにする」は
ちょっと止めておいて、この前実装した、「前半から結果表示までの流れ」を遷移図のような感じで表現できないかを
試してみる予定。大雑把な遷移図は以前書いてアップした事があったけど、その後の実装は全く別な感じになったので
一度見直してみて、今後の作業の参考になればと思ったから。
0008名前は開発中のものです。
2010/05/06(木) 02:12:39ID:eUAJiIs7最近製作スレはVIPに移動したりしてるし・・・
スレが簡単に落ちないのはいいことだけど
0009名前は開発中のものです。
2010/05/06(木) 02:45:12ID:JbTMIa/Nそのせいもあるかと。
0010名前は開発中のものです。
2010/05/06(木) 07:15:06ID:SMYLunWk乙です。
前のスレでクォータービューは描画だけで重いと言っていました。どうも僕です。
DXライブラリの仕様を調べていると描画範囲の外はクリッピングとか言う処理がなされて描画自体されないと聞いていて
確かに画像を描画範囲から出すとFPSは安定したので、納得していたんですが
CPUはあんまり減りませんでした。気づきませんでした。
そこで画面の表示範囲外はDrawGraphを行わないような処理を加えると、かなりぬるぬる動きました。
色々遠回りしたけど結局これだけでそこそこ実用に耐えられそうな性能を発揮したのでこれでなんとかなりそうです。
また、チップを組み合わせたブロックを生成して一つの画像として表示するような仕組みを作って利用すればさらに軽量化できそうです。
外部から参照するファイルというか、文字列って何かと難しそうですけどマップエディタを作れたら作ります。
せっかくなんで今回のテストプログラムを置いておきます。
ゲ製板のアップローダが過疎でなんか逆に恥ずかしいんですけど
ttp://gamdev4.hp.infoseek.co.jp/cgi-bin/up/No_0101zip.html
迷ったあげくおソースもついてます。これでもまじめに書いたんです。
FPSがふらふらするのは仕様です。けどこのままでいいのかなぁ・・・
0011名前は開発中のものです。
2010/05/06(木) 21:02:02ID:eUAJiIs7横スクアクション作ってるけど、重力設定とかややこしいな
0012887
2010/05/06(木) 22:31:58ID:HGB4ep5Jしかも結構重要な機能。=1+2が保存できない。
あきらめるかと思って、データ打ち込むのにフリーで楽そうなのないかなあと探していたら
Google Docsを見つけた。しかも、どんなファイルでもアップロードできるみたい。
ソースコードは今 http://github.com/happana/srpg で管理してるけど
データ管理をどうしようかと思っていたので丁度いいかもしれない。
ただ、google アカウント作るのが面倒だなあ。
0013SGGK ◆6pZCoAtaxk
2010/05/06(木) 22:32:34ID:GlB3Y70A同意です。数か月書きこまなくてもスレが落ちないのが救いです。
>>9
確かに。新企画ってなんだか難しそうなイメージあります。
>>10
動き見れました。チップがスムーズにスクロール出来てました〜。
>>11
自分もDXライブラリです。重力っぽい動きにはサッカーゲームでもいつか挑戦してみたいです。
今日は>7での作業を少しだけ。持続力が無くて少しずつの作業になってしまってます。
ソースもちょっと考えてみます。
0014名前は開発中のものです。
2010/05/07(金) 13:42:02ID:ZZNz05BZ0015887
2010/05/07(金) 16:53:14ID:3Ul87uT/1だけ持ってるんだけど、今はいくつまで出てるんだろう。7?
参考になるけど全部買うのは無理だ…
0016名前は開発中のものです。
2010/05/07(金) 19:50:35ID:eeBXJ7GH洋書でもいいなら
Best of Game Programming Gems
0017SGGK ◆6pZCoAtaxk
2010/05/08(土) 00:04:29ID:lZFiwz/wGoogle Docs、ググってみました。エクセルで書いた遷移図を共有するような使い方も出来るような雰囲気。
>>14
アンカー付全レスでプログラムが進んでないと、そう思われてしまうかもしれないけど、やる気維持に役立てています〜。
>>15、16
Gems、難しそうで立ち読みすらしなかったけど今度見てみようかな…。
ソースの件、以前は付けてたけど過去に指摘があって付けなくなってました。
でもたまにはという事で先日upしたSGGK019のときのソースを載せておきます。
清書しようかと思ったけど、そのままの状態でアップしてます…。
ttp://gamdev4.hp.infoseek.co.jp/cgi-bin/up/No_0102zip.html
0018SGGK ◆6pZCoAtaxk
2010/05/08(土) 00:41:02ID:HtkhpRQD不定期登場、レスもその時のタイミングに応じて書いたり書かなかったり…みたいになるかもしれないです。
でももちろん全部見てますのでよろしくです〜。では…。
>7の作業は今日も終わらず…。
0019887
2010/05/08(土) 01:19:28ID:Qe4xM2Bu戦闘時のコマンド実行の実装の仕方が思いつかない…
色々とごちゃごちゃになってきたんで、戦闘部分だけCUI版とかで別プログラムを一から書いてみようかな。
一番大事な部分なのに…振り出しに戻った…
0020887
2010/05/08(土) 06:43:31ID:Qe4xM2Bu戦闘システム実装練習用に新たにプロジェクトを作った。
こっちはグラフィックは文字だけになる予定。
ある程度目処が立ったらSRPGと統合する。
0021名前は開発中のものです。
2010/05/09(日) 23:11:16ID:aiTWM3+o0022名前は開発中のものです。
2010/05/10(月) 00:27:01ID:rQgi2tSO887先生とSGGK先生のおソースを拝見しました。
あらゆる書籍を持たず完全独学なんで非常に参考になります。
僕がやたらレベルが低いので理解にまでは至りませんけども
別のスクリプト組み込んだりとかクラスオブジェクトを使いこなしたりとかは雲の上の話です。
書籍とか形のある知識を持ってないとこういう得た情報をどこにしまったか忘れてしまうんで
サーバを使わないローカルで動く超個人的wikiみたいなのがあったらいいな
と思ってたらありますね。世界は広いっす。
たくさんあったけれど「ひとりwiki」がまさしくこのスレにぴったりな名前なんで
これで最終的にはゲーム製作の虎の穴として書籍になってウハウハ
マップチップのひし形部分とマウスの当たり判定をとりあえず実装するために
クリックボタンのクラスを作りました。
これを継承して例えばスタートボタンにしたり
マップエディタでクリックでチップを置いたり
そういう方法で正解なのかしら?クラスはよくわかりません。
>>21
ロベールのC++教室という有名なサイトを見ながら
1週間でC言語のポインタまで理解したつもりでしたが半年たっても使いこなせないです。
0023887
2010/05/10(月) 01:31:44ID:9myjIzu+Cから始めて大体分かったなと思うまで1年
その後C++に移行しつつ
- STL, template 周り
- Windows API
- オブジェクト指向
同時並行な感じで1,2年。
これから後はあんまり成長してない気がする。
プログラム勉強しだして8年くらい。
0024名前は開発中のものです。
2010/05/10(月) 01:40:23ID:OawYtSG+0025887
2010/05/10(月) 01:48:23ID:9myjIzu+多分このスレ一番の年寄りだろう。
0026STG
2010/05/10(月) 01:54:52ID:ruVit98w・最初にRPGツクール5を高校時代に
・社会に出てからRPGツクール2000へ
・ツクール投げてHSPを半年使う
・HSP投げてC++を勉強〜二年で今に至る
ポインタやクラスあたりはもう無くてはならない存在。STLも超基本にだけ触れた程度かな
クラスは構造体の延長みたいな感じで使ってる。
0027STG
2010/05/10(月) 01:57:58ID:ruVit98w0028名前は開発中のものです。
2010/05/10(月) 21:39:11ID:V6qtfDQ70029887
2010/05/10(月) 23:22:22ID:9myjIzu+そんな本が出てたんですね。調べてみます。
>>22
先生とかめっそうも無い。
ポインタは最初の1歩で1ヶ月くらい悩んだような気がする。
1. 値渡しとポインタ渡しの使い分け。(これが分かるまで1ヶ月くらいかかった)
2. 配列&ポインタ、構造体&ポインタの理解。
3. 双方向リンクが作れるようになる。
くらいの段階を踏んでだんだんと理解していったような気がする。
2とか分かってくると a[1] は *(a + 1) のシンタックスシュガーみたいなもんだから
a[1] == *(a + 1) == *(1 + a) == 1[a] で 1[a] とかでもコンパイルできることが面白かったりするんですよね。
>>28
個人的には意見交換とか参考にするのはOKだと思うんですけどね。
一緒に作りませんか?みたいなのはスレ違いな気がしますけど。
0030SGGK ◆6pZCoAtaxk
2010/05/11(火) 00:44:39ID:3ZUxXN6nそれにソースを解読できるのって凄いと思います。(自分は解読とか全然出来ないし)
時間については2007年の8月頃にこの板の某スレに書き込んだのをきっかけに開始。
14歳のC++本のサンプルを改造するために最低限の知識をCとC++の文法書で調べただけで、
プログラミングにあまり詳しくないので、いつどうなるかわからない状況でバグを取ってます。
0031887
2010/05/11(火) 03:09:27ID:ecU8F6rN武器やアイテムの仕様やプログラムの設計ことも書いている。
なかなか使いやすくていい感じ。
エクスポートも出来るので PDF でアクター周りの設計を書いたものをアップしてみる。
ttp://gamdev4.hp.infoseek.co.jp/cgi-bin/up/No_0103pdf.html
ここらへんの設計。
ttp://github.com/happana/srpg/tree/master/srpg/
プログラムが進まなくてもドキュメントを書いていると進んだ気になる!不思議!
0032名前は開発中のものです。
2010/05/12(水) 01:21:16ID:H213asARという本がポインタ理解に役立った
書籍や技術サイトじゃ個別の疑問は解決し切れないので
直接指導してくれる人がいるのが最善だけれども
0033名前は開発中のものです。
2010/05/12(水) 05:47:51ID:nteqJ1cd>>29
1はそこそこ程度に使えるようになりましたけど
2. 配列&ポインタ、構造体&ポインタの理解。
3. 双方向リンクが作れるようになる。
ここからですね。
構造体は毎回エラーの壁を越えられないんで避けてます。さらにポインタまで考えるともう・・・
すでにD&Dが出来るクラスを作ってしまいましたが、
思い切って1度構造体でデータを作って動作を妄想しながらクラスにすべき物としない物とに分ける手法を考えて実践してみました。
データ主体という言葉を愚直に捉えた発想なんですけど悩みすぎて気づいたら朝チュンです。
当たり前ですが座標を持つものは座標をデータとして持っていないといけないわけで座標を構造体にして
そこから肉付けして画像データ構造体や範囲データ構造体を追加して
それらを用途別に組み合わせた物が「実体を得し者」、オブジェクトとして活躍する仕組みなんですけど
妄想しながらデータを作っている段階で
別のオブジェクトの座標や種類みたいなのを取得するような動作や
オブジェクトを動的に配列に格納できないとうまく動かないみたいで
どうやらここで高レベルなポインタの出番のようです。さらに多分コンテナみたいなのも使わないとダメっぽいです。
でもこれで思い通りの操作になればマップエディタどころかちょっとしたファイラすら作れそうな勢いです。嘘です。
朝チュンまでして詰むのは悔しいので一旦開発はストップしてポインタのおさらいとSTLをまじめに学ぶことにします。
0034887
2010/05/13(木) 13:42:13ID:ml734QBW決まった順序で遷移する状態を switch でやると流れが分かりにくい。
int state;
switch(state) {
case IN: in(); break;
case LOOP: loop(); break;
case OUT: out(); break;
}
IN->LOOP->OUT の順番は決まってる。
in();
while(is_loop()) {
loop();
}
out();
みたいに書けないかなと思っていたらこんなの見つけた。
ttp://f3.aaa.livedoor.jp/~gsyoku/index.php?[[Fiber]]#content:3
機能をゴリゴリ削って使うところだけ自分なりに実装してみた。
ttp://github.com/happana/srpg/blob/master/srpg/base/flow.hpp
ttp://github.com/happana/srpg/blob/master/srpg/scene/battlescene.cpp#L36
0035名前は開発中のものです。
2010/05/14(金) 23:53:56ID:aIk67VKF・・・って企画たててよかったのか?
003735
2010/05/15(土) 16:31:45ID:XqTbv+Zzさて、AVD×SRPGな感じで作っていきますよっと。
何すればいいかよくわからんがスクリプトエンジンを作ればいいのかね?
ちびちび作っていくのでよろしく。
0038887
2010/05/15(土) 17:55:24ID:D0Xi8/Suプレイヤーと敵のダメージ、死にモーションを作った。
あと1ヶ月くらいで「たたかう」を選んで殴りあえる位までは出来そうな気がしてきた。
0039887
2010/05/15(土) 23:32:48ID:D0Xi8/Su貯めて後で順番に実行するって仕組みを作っているんだけど
実行する段階で対象がすでに死んでいた場合の対象の再検索とか結構面倒。
後、敵のAIをどうしよう・・・Luaとかのスクリプトを使うのが一般的なんだろうか。
0040887
2010/05/16(日) 15:55:40ID:Mo8dO9rdSRPG version 0.0.12
戦闘のコマンド実行とダメージ処理の追加。
全員、自動で「たたかう」を選んで実行するだけです。
細々としたところでモーションの追加とか武器の追加とか。
これから、コマンド選択UI、ゲームオーバー処理とかを作る。
0041SGGK ◆6pZCoAtaxk
2010/05/17(月) 23:22:34ID:RpiuCETK戦闘シーン確認出来ました〜。
サッカーゲームの遷移も前半→ハーフタイム→後半は一方通行で似ているかもしれないので、参考にしてみようと思います。
>>35
ど〜ぞよろしく〜!
こちらは進捗が思い通りにならなくて、これはもしかするとソースをUpして
なんとなくホッとしてしまったからかもしれない…と自己分析していた矢先に来月の15日頃予定で転勤が決まりそうな感じ。
もしかすると最低でもこの前後1カ月ぐらいは落ち着かないと思うので進捗が無いかもしれない予感。
0042SGGK ◆6pZCoAtaxk
2010/05/19(水) 00:20:03ID:+kD8rOAe別にフェードアウトするフラグでは無いので…(汗)。
一応>>7をやって頭の整理をするところまではやらねば〜!。
0043887
2010/05/23(日) 02:17:27ID:ne7zja47SRPG version 0.0.13
バトル時のコマンド選択など追加。後ダメージも武器の値を使うようにした。
カメラの制御が難しい。
なんかモチベーションが下がってきて駄目な感じになってきた。
0044名前は開発中のものです。
2010/05/23(日) 21:58:24ID:VDqMKVb3RPGな気もするが、動作はちゃんとできている。
まだ製作序盤だと思うが、クリア、全滅があると面白いと思う。
洞窟にゴール地点を作ったり、敵を強くしたり。
0045887
2010/05/23(日) 23:27:33ID:ne7zja47ごめん。SRPGって書いてるけどRPGなんだ。
SimpleなRPGってことでSRPGにしたら、シミュレーションRPGとかぶっちゃったんだ。
分かった。全滅とか作ってみる。
ちょっと敵も増やしてみようかな。
意見もらえてモチベーション上がった。ありがとう。
0046SGGK ◆6pZCoAtaxk
2010/07/14(水) 23:35:58ID:E0crx8nl887氏、もしかして開発中止だろうか。
再開して戻って来れるように、こちらの進捗0でも何か書いてみる。
自分の方は2か月の空白を作ってしまい、>>42で辞めないと言ったものの、開発続行はやはり怪しい。
とりあえず、>>42、>>7で言った頭の整理は時間が掛かりすぎるので中止。
ゲームのメインの部分で前半、後半で同じような内容が書かれてあり、
長すぎてわかりにくい感じがするので、少し改善できないか考えてみる予定。
0047SGGK ◆6pZCoAtaxk
2010/07/15(木) 22:11:02ID:K2yOe2RIバグが出てるわけでもないし、わかりにくくてもなんとかソースを読むこともできるから、
整理に時間をかける程でもないなと思った。
とりあえずこのままにして、前スレで言っていた以下の目標をやってみる。
>967 :SGGK ◆6pZCoAtaxk [sage]:2010/04/27(火) 23:03:19 ID:puWvjObW
>次の小目標は、
>今まですべての選手が一斉にボールを追いかけていたのをやめて、
>FWは前1/3、MFは中1/3、DFは後ろ1/3の範囲にボールがある時だけ
>ボールを追いかけるようにプログラムを直す。
>…にしてみる予定。
0048SGGK ◆6pZCoAtaxk
2010/07/19(月) 23:53:37ID:Enn47Jg4まず、メインループの中にある選手の移動関数について。
移動関数の中で今が前半か後半かを判断する変数を使えるようにしたいけど、
いまのままではおそらく使えないと予想。
現在のプログラムは、選手関係の変数や関数をひとまとめにしたクラスの
オブジェクトをゲーム処理を主とした関数内に作ってあり、そのオブジェクトのメンバ関数で選手移動処理をするようになってるので、
ゲーム処理を主とした関数で定義した変数を認識させるにはたぶんその変数のアドレスを渡さなければいけないと思い、
とりあえず、
1.選手関係の変数や関数をひとまとめにしたクラスを宣言してるヘッダファイルに「前半か後半かを判断する変数」を
定義してる別のヘッダファイルを加える。
2.選手関係の変数や関数をひとまとめにしたクラスを宣言してるヘッダファイルの中の
選手移動処理の関数の引数に「前半か後半かを判断する変数」を追加する。
3.選手移動処理の関数の定義がfieldplayercontrol.cppの中にあるので、
これにも同様に「前半か後半かを判断する変数」を追加する。
ここまで書けば関数の中身を後回しにしてもコンパイラは通るはずだと思い、
コンパイルするとエラー。
error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。
運よくバグは取れたけど、詳細は進まない作業の代わりにネタおよび自分の作業メモとして少しずつ書く予定。
てっきり、また全角の空白をどこかに入れてしまったのかと思ったが、そうではなかった。
知ってれば一瞬なのに何時間か掛かってしまい、これがプログラムのしんどいところ。
0049STG
2010/07/21(水) 20:04:43ID:jGZViznhゲーム仕様でどうしても2Dでは実現しづらい部分が出てきたので3Dに移行。
サンプルプログラムで大体どんな感じに組めばいいかはわかったのでモデル製作の勉強開始。
モデリングソフト高すぎワロタ…のでBlenderを使うことに。
0050SGGK ◆6pZCoAtaxk
2010/07/22(木) 00:32:00ID:umEPonN6こんばんは!。見ている人がいるからには、諦めずにもう少し頑張ってみようと思います。
自分もいつかは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"を消したら、コンパイルできた!…という話。
0051SGGK ◆6pZCoAtaxk
2010/07/22(木) 22:16:41ID:lTzR4XWCソースはifとswitchの組み合わせなので長文になってしまっているのが相変わらずの難点。
次の目標は、出来れば走ったり、ジャンプをさせたりとかいろいろ思いつくけど、
選手それぞれの近くにライフゲージを表示させて、ライフが少しずつ減り、0になったら
選手が停止する
に挑戦。
0052名前は開発中のものです。
2010/07/23(金) 02:53:39ID:C4gQhbldつまり・・・どういうことだってばよ
いやすまん、偶然スレ覗いたら気になったんでちょっと質問させて欲しい
enum A{};
enum A{};
void main{}
例えばこう書くと、VisualC++では「error C2011: 'A' : 'enum' 型の再定義」っていうエラーになるんだけど
>>50の下6行で言いたいのは、こういう事とは違うの?
0053SGGK ◆6pZCoAtaxk
2010/07/25(日) 12:32:50ID:p6Ls+avhそうです。その通りです。
「選手移動処理の関数」に「前半か後半かを判断する変数」つまり
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' の前に必要です。
というエラーが出てるのかと思った。
0054SGGK ◆6pZCoAtaxk
2010/07/25(日) 12:35:16ID:p6Ls+avhenum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
だけを直接書きこんでみると、
error C2011: 'MATCHSTATE' : 'enum' 型の再定義
というエラーが出た。
自分が思っていたバグの原因は間違いで、
>>50で
>#include "soccergame.h"を消したら、コンパイルできた!
ときのコンパイルできた理由はほかにあるらしく、
しかもenum MATCHSTATE{略};は問題なく認識されていたらしい…orz
(>>52←指摘ありがとうございます!)
0055SGGK ◆6pZCoAtaxk
2010/07/25(日) 14:01:28ID:p6Ls+avh#include "soccergame.h"で発生したバグだから、そのsoccergame.hの中に';' が抜けてるところがあるのかと思ったが、良く見たけど見つからない。
他のヘッダーファイルに#include "soccergame.h"をやってコンパイルすると、
「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」
が出る。"soccergame.h"に何かあるのか…。
もしかするとヘッダーファイル2重読み込み防止(いわゆるインクルードガード)の書き方が
"soccergame.h"だけ何かの作業でずれたか消えたかしてたか?と見てみたがなんともない。
ためしに「ヘッダファイル 2重読み込み」で検索するとやっぱりこれといったのが無く、しかし、
その中に「ヘッダーファイルは慎重に扱わないと危険です」という言葉が目に付き、
クリックすると内容が難しすぎて解らなかったけど、雰囲気的に「循環参照」というのが気になる。
0056SGGK ◆6pZCoAtaxk
2010/07/25(日) 14:03:02ID:p6Ls+avhfieldplayercontrol.h に soccergame.h をインクルードしたときを考えてみる。
soccergame.h は #include "fieldplayercontrol.h" してるので、
お互いがお互いをインクルードしあってる。
念のため、soccergame.h がインクルードしてないヘッダーファイルにsoccergame.hをインクルードしてみる。
これなら循環じゃないから、バグが出ないはずだと思ったが、
バグが出る場合と出ない場合がある。
バグが出ないと予想したのにバグが出たヘッダーファイルは、もしかするとsoccergame.hのインクルードしたヘッダーファイルからまたヘッダーファイルが呼ばれてて…のような感じで呼ばれていたのかもしれないが、調べきれず。
さらに
error C2146: 構文エラー : ';' が、識別子 の前に必要です。 ヘッダーファイル 循環参照
で検索してみると、掲示板関係ばかり引っかかるけど、どうも循環参照が原因の可能性が高い。
「ヘッダーファイル内でのインクルードはできるだけ避けたい。」という書き込みもあるし。
仮に循環参照が原因として何故、「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」というメッセージになるのかわからないけど、
とりあえずヘッダーファイルをインクルードしているうちに循環参照になっていたのが原因の可能性が一番高いと考えて、
>>51の課題挑戦を再開。
0057名前は開発中のものです。
2010/07/25(日) 16:05:50ID:7RX0IWHa0058名前は開発中のものです。
2010/07/25(日) 16:13:03ID:Vl6SpnXHまずヘッダーの重複読み込みを気にしているようだけど、「#pragma once」は記述している?
ちなみにマクロを使って同じ事も出来る
ttp://www.geocities.co.jp/SiliconValley/6071/technic/16.html
そして「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行くらいから下をコメントアウト、さらにその半分、さらにその半分・・・と機械的に絞り込む事が出来る
0059名前は開発中のものです。
2010/07/25(日) 16:24:34ID:vN3nsQ+l0060名前は開発中のものです。
2010/07/25(日) 20:13:54ID:bN26srjK>>52
インクルードガード関係ない可能性が高い
0061SGGK ◆6pZCoAtaxk
2010/07/26(月) 22:44:04ID:HmEvw+7Eたぶんまだ正解ではないんだろうなという雰囲気が伝わってきたので、再考。
まず、>>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"なんてしてないから、インクルードガードされないんじゃないかなと思ったので。
0062SGGK ◆6pZCoAtaxk
2010/07/26(月) 23:01:02ID:HmEvw+7E「ヘッダファイルは、自分とは別のヘッダファイルを #include でインクルードできるので、(略)」 という記述があったので、
それ前提でソースをエクセルに張って考えてみたら、自分としては今までで一番正解に近そうな答えが出た。
soccergame.hをfieldplayercontrol.hにインクルードしたときにsoccergame.hの中にある#include"fieldplayercontrol.h"がキャンセルされていたら、
soccergame.hからインクルードした部分の処理を進めているときは、まだFieldPlayerControlクラス型が宣言されてないから、
soccergame.hからインクルードした部分にFieldPlayerControl fieldplayercnt;
と書いても、
「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」
というエラーが出る…というのが答えかもしれない。
一応、エクセル→jpgでうp
ttp://gamdev4.hp.infoseek.co.jp/cgi-bin/up/No_0129.jpg
0063STG
2010/07/28(水) 04:37:11ID:ttdS5Bl4忘れていたわくわく感があふれてくるっ
知らない用語がどんどん出てくるこの冒険感っ
練習ソフトクリーム
http://www.dotup.org/uploda/www.dotup.org1057678.jpg
0064SGGK ◆6pZCoAtaxk
2010/07/28(水) 23:06:54ID:6+SmVQnU自分もサッカーゲームの3D化を目指して開発を急ぎたいです。
>>51の課題に挑戦。
ソースはまだ書いてないけど、選手クラスにライフ値を記録するためのメンバ変数を追加して、
選手の描画関数を実行するときに選手の座標を基準にDXライブラリの四角形描画関数を2回使重ね書きして実現できないかなと脳内設計。
ライフ値をソースのどこでどのくらい減らせばいいのかを検討中。
0065SGGK ◆6pZCoAtaxk
2010/08/03(火) 22:32:31ID:nPEW7e3nライフ値は、各選手が移動関数を実行した直後に少しずつ減らすようにしておき、
「 現時点のライフ値/最大ライフ値xライフゲージ最大長さ 」を計算して長方形をその長さで描画する。
減り具合は完全ではないけど、今は調整する予定なし。
次の目標
●共通(ゴールキーパー以外)
(実装済)歩く Z+マウス操作
1 走る X+マウス操作
2 進行方向固定 Shiftキー
3 特殊技術(ボールが頭上ならヘディング、足元ならダイビングヘッド) Spaceバー
●ボールキープ時
4 ジャンプ(タックル避けにもなる) C
5 ロングパス 左クリック
6 ショートパス 右クリック
7 シュート 左右同時クリック
8 パス/シュートは,押す長さで強さを調整
●非ボールキープ時
9 タックル 左クリック
10 カット 右クリック
これらの内6個でも実装できれば上出来と考えて挑戦する予定。
期限を決めてやるのは無理そうな感じ…orz
0066STG
2010/08/28(土) 03:50:26ID:gP4FgSviBlenderの仕様でいろいろ不都合が出てきたのでメタセコイアにのりかえ中
0067SGGK ◆6pZCoAtaxk
2010/08/29(日) 22:43:31ID:HGm0TpTIアクセス規制が続いていて、実は現在も書き込めない状態でご無沙汰してました。
メタセコイアはフリー版あるらしいので、ドットが不得意な自分もいつかは触ってみたいソフトです。
3〜4週間の2chアクセス規制が頻繁にあり過ぎて製作活動ペースが落ちてくるので(言い訳)、
運営の思う壷かもしれないけど、試しにp2とやらで今日から1年間だけ書き込めるようにしてみた。
肝心の進捗の方は思わしくなく、>65の目標をみると、今のゲーム画面は視点がおかしいので悩む。
フィールドは真上から見てるのに、選手は真横から見た絵になっている。
蹴ったボールをいずれは曲線を描くようにしたいけど、この画面ではそれを表現するのが難しい事に気づく。
そしてボールの座標は(x,y)だけでは足りなくて(x、y、z)にしておかなければな後々不便な事になるような気がしてきた。
これはベクトルの表現を取り入れたプログラムに書き直しておいた方がいいかなと思い始めたところ、
偶然手元に「14歳からはじめるわくわくC言語プログラミング教室VS2008編」という本があり、
運よくこれの第3章がベクトルの説明をしていたので、読んでみることにした。
もう少しで読み終わるけど、解り辛い…。
0068SGGK ◆6pZCoAtaxk
2010/08/30(月) 23:32:27ID:0WWGfdkP書き込み規制の原因は荒らしをする人にあるわけだから。
とりあえず3章だけを読み終えた。
明日も時間が出来ればベクトルを取り入れたプログラムに書きなおしてみる予定。
0069SGGK ◆6pZCoAtaxk
2010/08/31(火) 23:49:31ID:5x9cPfBx参考にした本は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;
と書き直したら、コンパイラが通った。
クラスの定義の中では初期値を書けないのをすっかり忘れていた。
思い出せたのは運が良かった。
0070SGGK ◆6pZCoAtaxk
2010/09/02(木) 23:42:53ID:N3a4x6peそれらの変数や関数を定義したファイル、vector3.cppを作成してみた。
とは言うものの、中身は変数を3つ持つ構造体とその構造体の型を持つ変数を引数にもつ関数で
関数は、
ベクトル=ベクトル+ベクトル
微小時間後の位置を示すベクトル=現在の位置を示すベクトル+微小時間xその時点での速度を表すベクトル
の2式だけ。
この微小時間がいわゆるフレームタイムであり、今までのプログラムだと
メインループ関数の中で、DXライブラリのScreenFlip()関数を30回ループしてその平均を
フレームタイムとしてる。ScreenFlip()関数は画面のリフレッシュレートとやらと同期して動くらしいので
そういうやり方でフレームタイムが計算できるらしい。
でも、これだとメインループ関数の外側で宣言・定義されてる微小時間後の位置を示すベクトルを計算するための
関数に必要な微小時間(フレームタイム)が読み取れないと予想。
とりあえず、30回ループする部分を関数にして、vector3.h、vector3.cppで宣言・定義して、
その30回ループする部分を関数にしたのをメインループで呼び出してなんとかできないかと思ったところで終了。
0071名前は開発中のものです。
2010/09/04(土) 10:45:00ID:BWH+wHQ4> + の意味を定義しなおす機能があるようなので、これかなと思ったけど、あまりにも内容が難しいので、諦める。
class Vector3{
public:
float x;
Vector3(){}
Vector3(float x_) : x(x_){}
Vector3 operator+(Vector3 &obj){
return Vector3(x + obj.x);
}
};
class A{
public:
A(float x) : vec(x){}
Vector3 vec;
};
void main(){
A a(1),b(2);
a.vec = a.vec + b.vec;
cout << a.vec.x << endl;
}
こういう事?
operator+はその性質上、returnで新しいクラスを作る必要があるから処理速度の面で微妙
俺だったら使わない
0072SGGK ◆6pZCoAtaxk
2010/09/05(日) 00:15:21ID:t7yjfHHgす…凄いです。そうです!そのoperatorがなんとかというそれでした。
まだ自分は答えを見ても何がわからないかもわからない初心レベルですが感謝します。
処理速度が微妙であるとのコメントを参考にして、なんとか>70のやり方(C言語風?)でやれるよう頑張ってみます。
0073SGGK ◆6pZCoAtaxk
2010/09/05(日) 23:38:53ID:glSoiJ6Gvector3.hにfloat frametime=0;と書いてコンパイルすると
frametimeは既に定義されてると言う内容のエラーが続々発生。
これは、vector3.hがいろんなcppファイルのヘッダーファイルにインクルードされてるからだろうと予想。
float frametime;と書き直しても同じ結果。初期化の有無は関係なかった様子。
vector3.hの中でfloat frametime;と書いておき、他のcppファイルでframetimeを使いたい場合には、
そのcppファイルのヘッダーファイルでなく、cppファイルの上の方の行でextern float frametime;と書いたら直った。
たぶんこれでframetimeは外部変数扱いになってどこからでも使える変数になったかなと思うけど、
ベクトル計算の関数定義の中で使おうと考えているframetimeの値が外部変数として渡すやり方だと
なんとなく後々の問題になりそうなので、ベクトル計算用関数の引数を増やして、その引数に値経由でframetimeを渡せないかと考えて終了。
そして、frametimeの外部変数化も中止。(あまり進まず。)
0074名前は開発中のものです。
2010/09/06(月) 06:18:19ID:WWj0DWld・適当なcppにて、float Vector3::frametime=初期値;
ということがしたいのかな?
0075SGGK ◆6pZCoAtaxk
2010/09/06(月) 23:10:19ID:5jVgy4R8その通りです。
ただVector3.hでは、クラスの宣言や定義はしていなくて、ベクトルを表す構造体などを引数にしてベクトルを表す構造体をreturnする関数を宣言するのみ。
そうすればベクトル関係の関数は外部関数になってどのcppファイルからでも使えるかなというのを期待して書いてます。
そしてVector3.cppでその関数の定義をしようとすると関数内のframetimeという変数がメインループで計算するframetimeと名前を同じにしても
このままでは中身が別物なはずなので、Vector3.hかframetimeを使うcppファイルのどこかで1度だけ
frametimeを定義して、他の残りについては、extern float frametime;とすれば動きそうだと思ったわけです。
externにしたのは、cppファイルが複数あるからstaticよりこちらがいいかなと思っただけであまり自信無し。
「extern static 違い C言語」で検索するとろいろ出てきて読むと自信無くなってきたけど
なんとかトライしてみます。
0076SGGK ◆6pZCoAtaxk
2010/09/07(火) 23:20:38ID:qyxrqbqYとりえあず先にヘッダーファイルだけを変更する予定。
しかし、ヘッダーファイルを変えただけでコンパイルすればcppファイルの方でエラーが出るはずなので、
ヘッダーファイルを全部コピーしてファイル名の前の方にv_を付けてファイル名を変えた方で変更作業する。
そうすれば、cppファイルと矛盾してエラーが出るという状態を避けられるはず。
そしてヘッダーファイルの変更が終われば、古いヘッダーファイルを削除して、新しいヘッダーファイルのファイル名からv_を取り除いて、
今度はcppファイルを直す。
変なやり方かもしれないけど、やってみる。
0077SGGK ◆6pZCoAtaxk
2010/09/08(水) 23:42:12ID:2FQaVedhあと12個残ってる。
0078SGGK ◆6pZCoAtaxk
2010/09/09(木) 23:34:11ID:u4JUxGaqcppファイルを直す時に泥沼状態になる事を予想して、
変更箇所を表計算ソフト(エクセルのこと)にメモしながら進めてるから作業が遅いのかもしれない。
0079SGGK ◆6pZCoAtaxk
2010/09/12(日) 23:34:04ID:zuikLtmEこれは選手の移動関数を定義してるファイルだけど、気になる箇所があった。
今のプログラムは、どのような速度のパソコンでも60Hzで1フレーム時間あたりの移動量を1〜20ドットにしたい場合の移動量を
20個の配列を用意して入れてるんだけど、これが外部の移動関数から読めてる。
…というのは知ってたけどそういえばextern使ってないのに何故だろうと思い、14歳わくわくC++を調べてみると、
メンバ関数やメンバ変数にstaticを付けるとグローバルな関数、変数扱いに出来るとのこと。
そして呼び出すときには、クラス名::変数または関数とすればよいらしい。
さらに変数の場合は、外部に実体の定義が必要。
忘れてた…。
これは>>74氏のそのままでOKではないか〜!ということでextern無しで書くことにした。
よって>>73で言ってた
>ベクトル計算用関数の引数を増やして、その引数に値経由でframetimeを渡せないかと
も中止。
とりあえず、最後に残ったヘッダファイルにある移動関数の一つを書き直してコンパイルしてみたら通った。
移動関数はあと3つ残ってる。
0080SGGK ◆6pZCoAtaxk
2010/09/13(月) 22:59:37ID:621XmSry何もヘッダファイルを読み込んでないヘッダファイルを先に直して、
ヘッダファイルの読み込みの少ないヘッダファイルを先に直すような順番で書き直していったからかどうかはわからないけど、
あまりバグが出なかった。次はcppファイルの書き直しに挑戦。たぶんもっと時間がかかるはず。
0081SGGK ◆6pZCoAtaxk
2010/09/14(火) 22:23:51ID:8SPHlgRSそのcppファイルがインクルードしてるヘッダファイルのファイル名の頭に付けてたv_(←修正中のヘッダファイルに付けてたやつ)をはずして、
そのままでは古いヘッダファイルと同じ名前になってしまうので、先に古いヘッダファイルは別のフォルダに移動しておく。
そしてコンパイルしてみる。
一個ずつ直してみたがバグがなかなか減らないし、ヘッダファイルもコンパイルの画面に新旧入り混じっている状態では
かえってややこしくなってくる。
cppファイルも一個ずつ順番に直してバグが無くなったら次に…と思っていたが、
うまく説明できないが、そうはならないはずとの考えに至る。
cppファイル単位できれいに独立してるわけではなくて、あるcppファイルのオブジェクトが呼ぶオブジェクトは別のcppファイルで定義されてて
そこからまた他のところへ…、するとそのcppファイルでインクルードしてるヘッダファイルも直した方のヘッダファイルに入れ替えなければならない。
結局、全部のヘッダファイルを新しい方だけ残して全部一気にコンパイルしてしまった。
エラーの総数が今現在349個。
ヘッダファイルの修正箇所をエクセルにメモする作業が無駄になってしまったかもしれない。
0082SGGK ◆6pZCoAtaxk
2010/09/15(水) 22:31:31ID:/g+buLkbそうした上でのバグ349個。
その後の修正で何故かバグが358個まで増えたけど、なんとかして344個に減ったところで終了。(今日はちょっと疲労気味なので…)
0083名前は開発中のものです。
2010/09/16(木) 03:09:59ID:OhUUY93b0084STG
2010/09/16(木) 03:35:20ID:YtfF1rT+0085名前は開発中のものです。
2010/09/16(木) 03:50:06ID:OhUUY93bガンガレ超ガンガレ
俺もそろそろ頑張ってみるか…
0086SGGK ◆6pZCoAtaxk
2010/09/16(木) 23:40:48ID:62n4CZRN自分はこの板のおかげでゲーム作りへの挑戦は約3年1ヶ月程続いているけど、あまり進んでいないかもしれません。が…頑張ります!。
>>84>>85
お互い頑張りましょ〜!期待してます。
0087SGGK ◆6pZCoAtaxk
2010/09/17(金) 00:11:53ID:iwt7bbkw座標その他のメンバ変数を初期化するときには、例えば初期化関数の内部で
オブジェクト.x=848;
オブジェクト.y=544;
オブジェクト.z=0;
としていたのを
オブジェクト.構造体変数名 = {848、544、0};
にできるのではと期待して書いてみるとエラーになる。
略)\source\ballcontrol.cpp(45) : error C2059: 構文エラー : '{'
略)\source\ballcontrol.cpp(45) : error C2143: 構文エラー : ';' が '{' の前にありません。
略)\source\ballcontrol.cpp(45) : error C2143: 構文エラー : ';' が '}' の前にありません。
これと同じようなエラーをクラスのオブジェクトでやった経験を思い出し、
オブジェクト.構造体変数名.x=848;
オブジェクト.構造体変数名.y=544;
オブジェクト.構造体変数名.z=0;
と書いたらエラーは出なくなった。
これだけならまだしも関数の引数にも構造体を使おうとしているので、
これもエラーになったらどうしようかと思いつつ、動作している事を優先して作業を進め、 現在のバグは274個。
ネットで調べると自分では構造体を書いたつもりでいても、Cの構造体とC++の構造体には違いがあるらしくて、
自分が見たサイトの説明によれば、
実は、構造体はメンバがデフォルトで公開されているクラスである。
つまり、
"stuct X{" = "class X{ public :"
となる。クラスと構造体の差異はそれだけである。
との事。
Cで書いたベクトルの記事を本で見て、それを今まで書いてたC++のソースに
使おうとしたから、自分の気付かない理由で上手くいってない感じ。
まずは今のままで進めてみて関数にベクトル構造体を引数にしたところでも
問題が出るようなら、また考え直すつもり。
0088名前は開発中のものです。
2010/09/17(金) 02:15:46ID:zNJRouQ+見方を変えると「Cの構造体に関数も書けるようにしたものがC++の構造体」とも言えると思う
Cの構造体で出来ることはC++でもそっくりそのまま書けると思うんだけどね
>自分の気付かない理由で上手くいってない感じ。
バグに関して絶対こうだとは言えないが、CとC++の違いが原因ではないような気がするなー
0089名前は開発中のものです。
2010/09/17(金) 22:28:19ID:pd/LBTtix、y、zを初期化するコンストラクタを定義されていれば
オブジェクト.構造体変数名 = クラス名(848,544,0);
のような代入ができる。
もしくは、構造体変数をセットするメンバ関数を定義してもいいかも。
0090名前は開発中のものです。
2010/09/17(金) 22:40:10ID:pd/LBTtiコンストラクタを定義していなければ、
オブジェクト.構造体変数名 = {848,544,0};
のような代入もできる。
0091名前は開発中のものです。
2010/09/17(金) 23:57:56ID:iQtTD6+Iそれは初期化時のみじゃない?
struct vector{
int x,y,z;
};
void main(){
vector a = { 1,2,3 }; //ok
a = { 4,5,6 }; //エラー
}
0092SGGK ◆6pZCoAtaxk
2010/09/18(土) 01:00:44ID:wU0YURT9>>88
たしかにバグの原因がCとC++の違いだと思い込んでしまうと他の原因の可能性を見落としやすくなりそうなので気をつけます。
>>89
今のソースではベクトル関係がクラスでなく構造体で表現されていてコンストラクタについてはまだ考えてませんでした。
バグが結局取り切れなかった場合、勉強しなおしてベクトル関係もクラス化する最終手段に挑戦してみようと思います。
>>90
コンストラクタの定義はしてないのですが、何故かエラーになってしまうので、
今は以下に書くとりあえず的なやり方でエラーを回避してます。
>>91
「構造体の初期化」で検索したところ、とあるサイトにそのような感じの
「構造体変数の初期化は、変数の宣言時には常に行うことが出来る点に注意しよう。」とあり、これを参考に以下のようにしてます。
ベクトル関係のヘッダファイルで
struct Vector3{float x,y,z;};
あるオブジェクトの初期化用関数の内部では昨日のやり方から少し変更して、
Vector3 a1={848,544,0};
fp.xy(←これは昨日書いていたオブジェクト.構造体変数名の事)=a1;
と書いてもバグが出ないのでこれでやってみようと思います。
今日は調べただけなので、バグは減ってないけど、全部取れるまで頑張ってみます。
0093名前は開発中のものです。
2010/09/18(土) 01:45:54ID:ZJvrb5gA>ベクトル関係もクラス化する最終手段に挑戦してみようと思います。
>>87は自分で書いててよく分かってないみたいだけど、classとstructは根本的には同じもの
struct Vector3{
Vector3(float x_, float y_, float z_): x(x_), y(y_), z(z_){}
float x,y,z;
};
void main(){
Vector3 a(1,2,3);
cout << a.x << " : " << a.y << " : " << a.z << endl;
a = Vector3(4,5,6);
cout << a.x << " : " << a.y << " : " << a.z << endl;
}
0094名前は開発中のものです。
2010/09/18(土) 01:56:17ID:ZJvrb5gA>Vector3 a1={848,544,0};
>fp.xy(←これは昨日書いていたオブジェクト.構造体変数名の事)=a1;
ちょっとこのレスで、代入のコストが気になったんで検証してみた
struct A{
A(){}
A(int x_, int y_, int z_): x(x_), y(y_), z(z_){}
int x,y,z;
};
struct B{
B(){}
B(int x_, int y_, int z_): x(x_), y(y_), z(z_){}
int x,y,z;
void operator=(B &val){
x=val.x; y=val.y; z=val.z;
}
};
AとBの違いはoperator=を使用してるかどうかだけ
A a,b;
a = b;
こんな感じでただ代入するだけの式を、それぞれ100万回ずつ実行
結果は予想外にもBの方が7倍も遅かった(単位はミリ秒)
A 5
B 35
そこで試しに、構造体に「double a[256];」を追加して実行
今度はBは変わらず、Aが極端に遅くなった
A 255
B 36
0095名前は開発中のものです。
2010/09/18(土) 02:09:34ID:ZJvrb5gAつまり関数オーバーヘッド分の差が出たのだろう
変数を増やすとAが遅くなるのは、ほぼ間違いなくコピーコンストラクタが発生してるからだろう
ここら辺は言語仕様のレベルでBのような代入にしてくれてもいいような気がするなー
ま、結論としてはoperator=は弄らない方が速い
0096SGGK ◆6pZCoAtaxk
2010/09/20(月) 00:00:13ID:y8zi6Evk詳細な解説に感謝します。
自分にはまだ難しすぎるのですが、「c++ 構造体の代入 問題点」で検索してみたところ、
以下のHPがこれらを理解するのに参考になり(理解は出来ず雰囲気だけなんとなく自分に伝わったような感じ。)、
リンク先はpdfなので要注意かもしれませんが、
ttp://ist.ksc.kwansei.ac.jp/~ishiura/xcpl/note/cpp3.pdf
の12〜13ページあたりで、C++にはいろいろな種類のコンストラクタがあり、
結果は同じようでもその書き方によっては、コンストラクタが多く呼び出されて処理に時間がかかるらしい。
あと>>94のコンストラクタの書き方が見たことない書き方だったけど、
ちょうど17ページにある説明と似てるので、これかな?と思ってみたりで勉強になりました。
バグの方は、126個まで減少。
0097SGGK ◆6pZCoAtaxk
2010/09/20(月) 23:18:29ID:L4tJFEVm0098SGGK ◆6pZCoAtaxk
2010/09/21(火) 23:17:03ID:48pAG2m3しかし、画面でスタート直後にボールに近い選手が通常よりも早いスピードで画面外に出ていくような動きをして、
画面端に到達してそこから動かなくなる問題が出た。
やっぱり出た。エラーメッセージの出ないバグが…。
もしも、>>96のようなコンストラクタがどうのこうのが理由で動かないとなるとやっかいな予感。
自分は>>96はもちろんのこと今までに難しいといったところはなかなか理解が出来てないから…。
0099SGGK ◆6pZCoAtaxk
2010/09/22(水) 23:13:48ID:gcFU0B9v選手が画面やレーダーに表示されてるという事は、画面の表示範囲を決めてるカメラ関係のところに原因があるという可能性はなさそう。
選手の座標を計算してる箇所を調べる。今書いてる計算式は、説明を省くのでわかりにくいけど、以下のような内容。
fp->xy = AddVector(fp->xy,MulVector(sv,Application::frametime/sq));
Application::frametimeの中身が気になったので、printfDx( " frametime = %f \n" , frametime ) ;で調べると、
15.100000と表示された。もう一回やり直すと15.633333と出た。
このframetimeは、dxライブラリのGetNowCount()を毎ループに1回計算し、
ループ前後の差を30回足して、それを30で割った平均値を意味してる。
調べるまで忘れてたけど、GetNowCount()の単位はミリ秒なので、先ほどの式では、1フレームで15ドット近い移動量になっているだろうから、
1秒が約60hzのパソコンだと1秒で1000ドット近く移動するはずなので、昨日の早すぎる移動スピードの原因だけはわかった。
とりあえず、
fp->xy = AddVector(fp->xy,MulVector(sv,Application::frametime/sq/1000));
のように書き直したら、選手がほとんど動かないけど、単位の間違いが原因だとわかった。
選手がボールに向かってくれない原因は未解決。
0100SGGK ◆6pZCoAtaxk
2010/09/23(木) 21:24:02ID:3ixO7vXf選手とボールの距離とそのx、y成分を計算するために座標の引き算をしたが、
選手座標 − ボール座標としてたのが間違い。
ボール座標 − 選手座標が正解。
でも何故かこれでもバグは解消されなかった。
本当の原因は、
違う場所を直していた。
という事だった。
自分のプログラムは移動関数を4種類用意してあり、
1.その場停止
2.マウスに向かう
3.ボールに向かう
4.指定したX、Y座標の位置に向かう
なんだけど、いつからか4番の関数だけ使えば十分だろうと思い、
4の関数にマウス座標やボール座標を渡していた。
でも、そのことを忘れていて、ボールに向かわないバグだから
ボールに向かう関数を直さねばと思い、その関数だけを直していた。
昨日スピードのバグが直ったのは、その時だけたまたまPC画面が小さくてプログラム行が下がっていたのに気付かず4番の関数を書き直していたのだろうと思われる。
ある意味1日で気付けたのは運が良かったのかもしれない…。
0101SGGK ◆6pZCoAtaxk
2010/09/23(木) 21:46:24ID:3ixO7vXfこれはあくまで>>65の目標に取り組めるようにするための準備段階なので、
次は画面関係の修正に挑戦する予定。
まだ方法を考えてる段階なので簡単には進みそうにない予感。
少し斜めから見たフィールド画像でプレイできるようにするのが目標だけど、
ネットではパースというキーワードで検索するものの即取り入れ可能な事を書いてるホームページにはまだ出会えていない。
他には動画サイトで昔のサッカーゲームの画像を見て、参考に出来るところが無いか調査中。
0102SGGK ◆6pZCoAtaxk
2010/09/25(土) 00:13:42ID:Q7QeFJjpいますぐどこかの3Dライブラリを理解できるレベルではないのでかなり困った状況。
大体イラスト関係のホームページがよくヒットして消失点という言葉が出てきて、
これを考えればフィールドの形を遠近法的な台形形状に書くことは出来るだろうけど、
例えばその台形のフィールドに奥行きと高さ方向にメッシュを入れる時、何を基準にすればよいのかを詳しく説明してるところを見つけられず、
結局参考にならなかった。奥行きのメッシュは遠くになるにつれて間隔が狭くなると思うけど、それを決定する基準がわからないという意味。
そしてしばらくまた探していると、とあるホームページで人間の目は並行ではなく放射状にものを見ているとの記述があり、
これが参考になりそうなので、方法を考えているところ。
0103名前は開発中のものです。
2010/09/25(土) 00:26:55ID:j8zDlksV3Dライブラリを使うのが結局は楽だよ
(描画効率を無視するとして)
フィールドのモデルとプレイヤーのモデルを配置
カメラ位置・方向を決定したら draw 一発
難しい事を考えなくて済む
0104名前は開発中のものです。
2010/09/25(土) 00:50:55ID:Djp6Vs3v確かに3Dライブラリを教科書どおりに使えば簡単にできることだけど
敢えて自力で計算してみようというなら
「透視投影変換」、「同次座標表現」で検索するといいかも。
0105SGGK ◆6pZCoAtaxk
2010/09/26(日) 01:06:29ID:CCDwSOVy>>103
3Dの勉強を全くしていない状態なので、知識のない自分には3Dライブラリを使うのは無理かと思ってたけど、
すぐに諦める前にもう少しだけ調べてみようと思います。
>>104
「透視投影変換」、「同次座標表現」のキーワード、感謝します。パース等ではなかなか役立つホームページがヒットしなかったので…。
すぐには理解できないけど、検索結果のホームページの内容の方が自分の思いつきより洗練されてるので、3Dライブラリ使用が無理な場合、次の手段として挑戦しようと思います。
とりあえずDXライブラリで出来ないか考えてみる事にした。
ホームぺージから最新版をダウンロードしたら、3.04だった。
いままでのは2.25、リファレンスの球を表示する部分を丸ごとコピペしてコンパイルしたら
球が表示されたので、もし2Dとソースが共存できるなら今までのプログラムを3Dライブラリで丸ごと書き直さなくてもすむかもしれないと思って終了。
0106SGGK ◆6pZCoAtaxk
2010/09/29(水) 23:24:31ID:ixkP0mUbDXライブラリ置き場ホームページに行き、サンプルプログラムの
32.3Dアクション基本 を見るが複雑すぎて今は無理と判断。
31.迷路を3Dで表示 も難しいが、プログラムのソースにあるカメラの命令のリファレンスを見てみるもののやっぱりよくわからない。
>>102で言ってた2Dだけで自分で計算するか悩んだが、その前にあと一つ試せる方法があったのでやってみた。
今まで書いてたプログラムの状態や画面の遷移、得点、時間表示などを削除し、
3D円錐の描画命令をコピペし、上記で言ってたカメラの命令をコピペしてみたら描画された。
最初からプログラムを作り直さなくても3D命令のテストが出来たのは運が良かったかもしれない。
カメラの関数の引数を変えると円錐の向き大きさも変化したが、座標系がよくわからないので、
何故このように見えるのかが今はまだわからない。
カメラ関数の引数を変えても2Dの選手やフィールドの絵には変化が無かった。
もしかすると結局はすべて3Dのライブラリ関数で書き直すしかないのかもしれないと思って終了。
■ このスレッドは過去ログ倉庫に格納されています