09/02/24 01:55:47 bo0/H7dJ
引き続きマウスの入力分をかきこき
>>563
あわわ;チェック厳しいのも場合によりますね
ユーザ側でゆるめられる設定とかあればいいんですが
566: ◆Fp.xSEIREI
09/02/24 03:18:11 5+X9BMJV
関数に構造体ポインタの渡し方がよくわからない(・∀・)
というか構造体ポインタの宣言?がよくわkあああああああああ
構造体が配列になってる時はどうすればいいんだろう(・∀・)
567:名前は開発中のものです。
09/02/24 06:03:45 uqndkdFp
/* 何がわからないのか知らんが! */
#include "stdio.h"
#define MS "z'goku"
/* 構造体とその別名の定義 */
typedef struct tagS { char the_red_comet; } S;
/* 構造体のポインタをとる関数
ポインタ経由の場合「->」で要素にアクセス */
void func1(S *ps){ ps->the_red_comet = '3'; }
/* 構造体の配列をとる関数
関数に渡すとサイズの情報が欠落するので
渡す配列のサイズ(要素数)を一緒に渡す */
void func2(S ps[], int num){
int i;
for (i=0; i<num; i++)
ps[i].the_red_comet = MS[i];
}
int main(void){
S s, as[sizeof MS];
int i;
func1(&s); /* &で変数のアドレス(ポインタ) */
printf("%c\n", s.the_red_comet);
func2(as, sizeof as/sizeof as[0]);
for (i=0; i<sizeof as/sizeof as[0]; i++)
printf("%c", as[i].the_red_comet);
return 0;
}
568: ◆Fp.xSEIREI
09/02/24 11:51:58 5+X9BMJV
うぉぉ(・∀・)こんなに難解なのか…
もうちょっとがんばってみる
ともかく㌧
569:名前は開発中のものです。
09/02/24 14:01:41 cPcauKWt
>>568
あー、いや、そんなむずいもんじゃないにょ。
多分俺の書き方が悪い。ぶっちゃけズゴックって言いたかっただけ。
構造体に限らず、変数はメモリのどっか特定のアドレスに格納される。
変数のアドレスは変数名の前に&付けると取り出せて、ポインタ変数へ保存できる。
int *pi;でint型のポインタ変数piが作れるように、S *ps;でS型のポインタ変数psが作れる。
int ai[num];でint型num個の配列aiが作れるように、 S as[num];でS型num個の配列asが作れる。
構造体のメンバにポインタ経由でアクセスする時は「.」じゃなく「->」。
構造体配列sのi番目の要素のメンバにアクセスする時はs[i].member。
>>567のtypedefのとこは純C用の書き方。C++ならふつーにstruct S{char the_red_comet};でいい。
ちなみにfunc2(S ps[], int num)のとこは実際はfunc2(S *ps, int num)と同じだったりする。
配列にsizeof使うと配列全体のサイズが取れるけど、関数に渡した場合その中では
配列じゃなくポインタが正体なんで、sizeof使ってもポインタのサイズしか取れないのに注意。
配列の名前は単体で使うと先頭要素のアドレスを指すポインタになるんで、
呼ぶ時にfunc2(&as[0], sizeof as/sizeof as[0])としても同じ。
(関数に配列渡してる訳じゃなく、ポインタを渡してる)
うん、確かに自分で言ってて難解な気がしてきた。俺は説明が下手だ。
このへんは構造体の話というより配列とポインタの話やね。
細かいこと気にせず動きゃいーんだの精神でがんがれ!
570:名前は開発中のものです。
09/02/24 14:16:53 cPcauKWt
う、よく見返したら'\0'まで出力してんな。恥ずっ。
571: ◆Fp.xSEIREI
09/02/24 14:28:51 5+X9BMJV
>>569
MSとかズゴックがCの関数か何かかと思った俺は
うちのソース風にやりたいこと書くと
~~ヘッダー~~~~~~
typedef struct{
char the_red_comet;
} S;
void func1(ぽいんたっぽい引数){うんたら};
~~~~~~~~~~~~
~~別のソースファイル~~
extern void func1(ぽいんたっぽい引数);
extern S MOBILE_SUIT[100];
void func2{
int i;
for(i=0;i<100;i++){
funk1 (ここにMOBILE_SUIT[i]のthe_red_cometのポインタをあげたい);
}
}
こんな感じ。ちなみにmainとかは行数の都合により省略。mainは別のファイルにあるよっ
あとDXライブラリだからstdio.hは入れられないんだ
572:名前は開発中のものです。
09/02/24 15:27:17 cPcauKWt
>>571
↓こんな感じ。
void func1(char *p) {
/* 何かの処理 */
}
void func2(void) {
int i;
for (i=0; i<100; i++) {
func1( &(MOBILE_SUIT[i].the_red_comet) );
}
}
アドレス取得の「&」よりメンバ選択の「.」が優先度低い演算子なので、
括弧で順序を指定してやる必要がある。
URLリンク(takagi.in)
573: ◆Fp.xSEIREI
09/02/24 15:37:15 5+X9BMJV
>>572
うおおおおおおおおおおおお!!!?コンパイル通ったwwwwwwwwwきちんと動いたSUGEEEEEEEEEEEEEEEEEEEEEE
できたうっひょおおおおおおおおおおおおおおおおおぴょおおおおおおおおおおお
某関数がシンプルになったぜええええええええええええええええええええええYEAAAAAAAAAAAAAAAA
ありがとう、ありがとうズゴック先生(;∀;)
てか->とか * とか考えなくても &つけりゃよかったのねorz
574: ◆Fp.xSEIREI
09/02/24 15:45:04 5+X9BMJV
URLリンク(www.dotup.org)
ここに使われますた
ポインタって便利だね
575:SGGK ◆6pZCoAtaxk
09/02/24 23:16:12 AWriAbTE
>>564-565
チェック厳しいですが、なんとかVC++2008EEでやってみようと思います。
ソース上書きしてしまって直前の内容には戻れなくなったしw
>>566-574
ポインタっていつ見てもややこしいですね~。勉強してる時はなんとなく分かった感じになっても
しばらくして自分で書こうとするとまた分からなくなってしまってたりする・・・w
今日もコンパイラの使い方で足踏み状態。
既にあるソースをコンパイルに含める方法はわかったので、もう前のバージョンに上書きされる事は無くなった。
プロジェクトファイルのフォルダにソースをコピーしてから、「新しい項目の追加」の▼押して「既存項目の追加」で出来る。
処理がどこで止まっているかわからないので、画面右下の「呼び出し履歴」を表示させたいが、
デバッグでプログラムが止まった時に出るエラー画面でデバッグの「中止」を押すと、「呼び出し履歴」が消えてしまう。
これはエラー画面でデバッグの「再試行」を押し、次に出る画面で「中断」を押せば、「呼び出し履歴」が残る。
履歴は上からじゃなく下から上に向かっている事に気付くのに時間掛かった。
とりあえず、ゴールのデータを初期化する所で止まっているらしい。
ちなみにエラー画面の英文は、イテレータがどうのこうのという感じの内容でよく分からなかったけど、
たしかにそういうのを使っているので、その辺が原因かも?というところまで来てマス。
576:436
09/02/25 01:06:52 ueY3gPVj
マウスとホイールの挙動も大体出来て、今はコンフィグ画面を組み立て中
577:SGGK ◆6pZCoAtaxk
09/02/25 23:02:59 yn9MVXN6
バグ変化無し・・・。
一行ずつ実行させようとすると勝手にWinMain関数から始まり、内部の関数を呼ぶところで
「現在の場所のソースコードを記述できません」と表示され先に進まず。
それならばと思い、昨日問題があると思ったゴール関係の処理関数内部一行目にブレークポイントを設定し、デバッグ開始し、
ブレークポイントで止まったところからF11キーを押して一行ずつ実行させてみたら
いつの間にかエディタ画面内に「list」というタブが付いた画面が表示され、
その画面中身は見覚えのない理解不能なソースが書かれていて、何故か一行実行がこの画面に移ってしまっている・・・orz
ちなみにエラー文は、「Experssion:list iterator not dereferencable」
一応検索してみたけど、自分に分かりそうなのは見つからず・・・。
気持ちを切り替えた方がいいと思い、今日はここで終了。
578:名前は開発中のものです。
09/02/25 23:18:59 M83kTzla
リリースモードでやって、逆アセの画面みてるとかw
MOV AX,BXとかそういうんあった?
579:436
09/02/26 01:18:57 F2EPEs+N
引き続きコンフィグ画面を~
580:名前は開発中のものです。
09/02/26 04:04:36 qHLjortN
>>577
ひょっとしてiteratorを++とかやってたり
581:名前は開発中のものです。
09/02/26 04:13:26 qHLjortN
いや、ちがうなんだっけ
えーとstd::list.iterator itr とかしたとき何かができなかったような…
582: ◆Fp.xSEIREI
09/02/26 10:02:19 0TSvd06Q
二次元上での物体の自由落下についていろいろ(・∀・)
既存の関数を利用してそれっぽいのなら作れそう
583: ◆Fp.xSEIREI
09/02/26 11:43:11 EbeM2R2x
矩形の4点座標を計算する関数に便利機能をつけたら引数14個のアホみたいな関数になってしまった
584:SGGK ◆6pZCoAtaxk
09/02/26 22:12:21 1SuK1bkP
>>578
確認したところデバッグモードでした。listというタブと逆アセンブルというタブの付いたウィンドウが出てきて
デバッグを中断すると見れます。MOVとかは逆アセンブルの方に出ていて
listのウィンドウは、
#if _HAS_ITERATOR_DEBUGGING
if (this->_Mycont == 0
|| _Ptr == 0
|| _Ptr == ((_Myt *)this->_Mycont)->_Myhead)
{
_DEBUG_ERROR("list iterator not dereferencable");
_SCL_SECURE_TRAITS_OUT_OF_RANGE;
}
#else
・・・のような感じで意味不明な文が延々と1300行近く出力されます・・・。
>>579
早くバグを取って自分も先に進みたいです。w
>>580、581
iteratorをあまり理解しないうちにプログラムを書いていたら、
やっぱりそういうところがバグになって現れてしまうみたいです。
iteratorはプログラム内のあちこちで使ってるので大変ですが、
とりあえず本当にすべてのiteratorを使っているところでバグになるのか
切り分けをしてみようと考えてます。
>>582,583
自分もいつか選手にジャンプ&自由落下させてみたいけれど、バグが・・・w
585:436
09/02/27 00:36:41 JFxOaYgu
まだまだコンフィグ画面
項目をオンマウスでアクティブ、から、オンマウス+クリックでアクティブ、に変更
たったそれだけの変更でもあちこち書き換えなきゃならない羽目に
仕様は予め細部まで熟考しとく事!>自分
586: ◆Fp.xSEIREI
09/02/27 02:03:40 gp2A0UAm
>>584
俺はそんなことなったこと無いなぁ…難しいことしてないからかもしれないけど
レーザーの幅と長さに対する倍率で当たり判定のサイズを指定できるようにしてみた
長さ0.9倍、幅0.5倍を当たり判定に指定するとこの赤い四角が当たり判定に(・∀・)一枚目:最大時 二枚目:消滅時
きちんとレーザーの状態に合わせて自動で当たり判定のサイズも変わる便利仕様
URLリンク(www.dotup.org)
587:SGGK ◆6pZCoAtaxk
09/02/27 23:24:49 U/xgHr9a
>>585
なんだか自分も仕様について考えてみたくなってきました。w
>525の頃に言っていた「やる事リスト」の前に仕様決めた方がいいのかも・・・。
>>586
製作中は当たり判定表示した方が便利そうですね~。(引数が15個に増えてる~!)
自分もバグ取れたらちょっと考えてみたいです。
バグはまだ取れないけど、iteratorを使っている関数(選手、ボール、ゴールの初期化、
選手、ボール、ゴールの移動、当たり判定)の内、コンパイラで停止した関数がゴール関係だったので、
とりあえずゴールの初期化と移動の関数を呼び出す行に // をつけて注釈文にしたら、画面が表示された!
なので、ゴール関係関数と他の関数でのiteratorの使い方に違いが無いか見比べてみるつもり。
588:436
09/02/28 01:22:18 BN0uPU4y
そう、コンフィグです、今日も
>>586
複雑そう・・・自分には無理だ;
>>587
おぉ復活しつつあるようで、ひとまずホッとしました
589:SGGK ◆6pZCoAtaxk
09/02/28 23:41:24 6cM45uPX
なんとかコンパイルできるようになりました。
初期化関数については、元々上手くいってる選手やボールの初期化関数ではiteratorを使ってませんでした。
ゴール関係初期化関数だけiteratorを何故か使ってしまっていてそれがプログラム実行中のエラーになっていたらしい。
結局>577のエラーメッセージの意味は分からなかったので、先がちょっと不安な感じ。
何故か移動用関数内では、(*it). で要素にアクセスできているので不思議~。
これでやっと>539のバグ取りに戻れる・・・orz
(プログラム実行時エラーになる書き方、詳細は略)
init(){
goallist.clear(); //GoalData型(ゴール関係のデータが入ってるクラス)のリストgoallistの要素を空にする。
list<GoalData>::iterator it; //GoalData型リストgoallistのどれかを指定するためのiteratorを設定
it=goaldata.begin; //iteratorをGoalData型リストgoallistの先頭を指すようにする
(データの数だけループ){
(*it).x1=10; //GoalData型の要素に初期データを代入する
(*it).x2=50;
++it; //iteratorを1つ上げて次のGoalData型の要素を指すようにする。
}
(プログラムが無事実行できた書き方、詳細は略)
init(){
GoalData gd; //GoalData 型データ1個分を仮保存するためのローカル変数gdを定義
(データの数だけループ){
gd.x1=10; //GoalData型の要素に初期データを代入する
gd.x2=50;
goallist.push_back(gd); //gdに仮保存したgoallistの要素一個分のデータをまとめてgoallistの最後尾の要素に登録
}
590:436
09/03/01 02:02:50 fK/bT0En
>>589
お~おめでとうございます 自分は停滞気味・・・
591:SGGK ◆6pZCoAtaxk
09/03/01 22:35:05 4AGEbIXn
>>590
ありがとうございます~。 今日はほとんど進みませんでした。orz
この数日のバグ取りの反動かもw
592:436
09/03/02 01:26:59 yUGCkh1E
マウスオン+クリックで選択できる様に変更
もう3月!今年も残り10ヶ月を切ったぞーいそげいそげ
593: ◆Fp.xSEIREI
09/03/02 17:23:38 O2JzSRpM
list<GoalData>::iterator it;
こ…これはいったい何をしているんだ…俺にはわからない…/(^o^)\
ゲームシステムについていろいろ(・∀・)
面白くするにはどうすればいいか、を考えてみる
クソゲーを観察してみるのも勉強になるみたいね
594:SGGK ◆6pZCoAtaxk
09/03/02 23:46:06 MvrVI/rB
>>592
そういえばもう3月ですね~、時間の流れが速すぎる~。
>>593
C++で、配列みたいに複数のデータを管理できるコンテナクラスというのが標準でいろいろ用意されていて、
そのひとつにlistクラスというのがあり、そのlistクラスでGoalData型(←これは自分でプログラムの中で宣言して作った型)のデータを複数管理したいので、
どのGoalData型かを指し示す為にイテレータit(←配列変数の要素にアクセスするための添え字みたいなやつ)というものを宣言しますみたいな感じで自分は理解していますが、
自信はあまり無いです・・・orz
ボール動かないバグ取れないですね~。
if(ボール蹴る時のキーが押されてる)&&(ボールと選手の当たり判定用フラグ変数==true)の条件部分が真になっていない感じ。
ボールと選手の当たり判定用フラグ変数が、当たり判定関数で当たり=1と成っていても
if文に来る直前でprintfDX()使って表示させて確認してみると何故か0になってる。
プログラム中では同じ変数名で書いていても中身は違うとなると
変数のスコープ(有効範囲みたいなやつ?)をよく分かっていなくてそれが原因なのかもしれないというのが思いついたけど
それを確かめる方法が無い・・・orz
595:名前は開発中のものです。
09/03/03 00:53:43 j/EdIaTK
ひょっとして「押されている」と思ってるのが「押されたとき」だったり
【ハウツー】最初にマスターしたいVisual Studioのデバッグ機能 - 基本編 (1) ブレークポイント | エンタープライズ | マイコミジャーナル
URLリンク(journal.mycom.co.jp)
596:436
09/03/03 01:13:26 B6hdHZko
ウィンドウモード変更・表示倍率変更・フレームレート変更・FPS表示切替を選択できる様になりました
>>593
面白く・・・最大の問題すなぁ・・・
597: ◆Fp.xSEIREI
09/03/03 21:05:59 9wM7nouk
URLリンク(www.dotup.org)
回転行列による矩形と点の当たり判定実装(・∀・)
598:SGGK ◆6pZCoAtaxk
09/03/03 22:56:23 vs8eMq8g
>>595
ありがとうございます~。デバッグは機能が色々ある様なので少しずつ覚えていこうと思います。
キー入力の状態については、実は自分はまだよく理解できぬままプログラムやってます・・・orz
>>596
かなり順調にいっててうらやましいですー。
>>597
回転行列を当たり判定に使う・・・、む・・・難しそうな世界。
ボール動かないバグの原因なんとなく見えた。
フラグ用変数のスコープが違ってて名前は同じでもアドレスが異なっている別々の変数を
それぞれの関数内で操作してるのではないかと思ったけど、どうもそうではなさそう。
ボールが選手に当たっている状態を表すフラグの立て方に原因があったと思われる。
これを説明するには一週間分の書き込みスペースを使ってしまいそうな感じ。
599:436
09/03/04 01:23:23 +kKOKlkp
フルスクリーンから復帰すると古い方の拡大率になってたのに気付いて修正
マウスで窓枠ドラッグした時の拡大率を取得出来る様にした
今になってもっとシンプルなインタフェイスを思いつく・・・あ~全体的に作り直したい
>>595
勉強になります
>>598
一つの結果が出るまでのスパンというか下ごしらえが段々長く大変になってきました;
600:せいれい
09/03/04 21:55:43 1TDttkKc
もうちょっと調整したらゲームシステム部分の作成に移れそう
そろそろ背景やファイル入出力もいじらねば(・∀・)
601:SGGK ◆6pZCoAtaxk
09/03/04 22:20:50 M0lqZAHx
こちらは、まだまだバグ取り中~。
昨日言っていたバグの原因は、プログラムをかなり略して書くと、
メインループ(){
選手.move();//選手の移動処理
ボール.move();//ボールの移動処理
ゴール.move();//ゴールの移動?処理
当たり判定();//それぞれのオブジェクトの当たり判定をここでまとめて行う
}
・・・となっていて、当たり判定関数の中では、
while(最後の選手まで繰り返す){
if( 選手とボールが当たっているか? ){
a->atari=true;// 選手のメンバ変数atariのフラグをONする。
b->atari=true;// ボールのメンバ変数atariのフラグをONする。
}
else{
a->atari=false;// 選手のメンバ変数atariのフラグをOFFする。
b->atari=false;// ボールのメンバ変数atariのフラグをOFFする。
}
ボールを蹴る処理は、メインループの「ボール.move();//ボールの移動処理」の中にあって、蹴れる条件は、
(Xキーが押されている)&&(ボールのatariフラグがONである)
なのに対し、今のプログラムでは、自分がコントロールできるのは一番目の選手だけなので、
選手をボールに接触させてatariフラグをONにしても当たり判定関数のwhile内で最後の選手まで
判定するので、最後の選手はボールに触れてないから、b->atari=falseになって、ボールのatariフラグは結局最後にはOFFにされてしまう。
その状態でメインループのボール移動関数に戻るので、いつまでたってもボールを蹴れる条件が成立しない・・・orz
602:名前は開発中のものです。
09/03/04 22:40:39 /ZV4wLD2
何故else条件でボールのフラグを落とすのか、40文字以内で説明せよ(5点)
フラグ落とすのは選手だけでいいと思うんだが。そもそもボールのフラグもいらない。
ボール持ってる選手しか蹴る(移動の初期値を与える)ことができないのなら
ボール支配できたときにボール蹴る関数にでも飛ばせばいいと思うが、どうか。
603:436
09/03/05 00:50:31 LR5dYdvr
ああああせりました;
窓枠ドラッグ時の拡大率を取得する為SetAlwaysRunFlag();をON-OFF多用してたら
なぜかSetAlwaysRunFlag();をOFFにするとデバッグに行く途中で止まり、
ON状態の一文を入れないと動かなくなり、とうとうそれを入れても入れなくても動かなくなり・・・
VCリインストールしたら今度はヘッダファイルを読まなくなり(パスは渡してるのに)、
レジストリからVC関連を全消去してリインストール、さっきようやくまともに動いたっぽい
SetAlwaysRunFlag();を乱用乱発してたのが悪かったのかなぁ
604:SGGK ◆6pZCoAtaxk
09/03/05 23:27:28 hIYt1MGi
>>602
else条件でボールのフラグを落とすのは、(Xキー押し)&&(ボール接触フラグON)がボールを蹴れる条件なので、
選手がボールから離れている(else)時には、ボール接触フラグをOFFにする必要があった為。
今のプログラムでは、ボールに接触してるので蹴ろうとしても、ボールに接触していない選手がいたら、elseが成立してしまい
ボールの接触フラグをOFFされてしまうという問題がありました・・・。
確かに今思うとボールのフラグは必要無かった様です。
選手全てにボールに接触してるかどうかを表すフラグを持たせておいたのは、同時に複数の選手がボールを蹴る様な場合を考えてました。
同時蹴りの時にボールに接触してる複数の選手から一人を選ぶ仕組みが必要かと思いながら実装の案はまだ何もなし・・・。
バグの修正はもう少し検討中~、今のボール移動関数は、選手のデータを引数に持っていないので、選手のフラグ変数を使えないのデス・・・orz
>>603
レジストリとか全然わからないので、自分もその関数には注意しておきます~。
605:名前は開発中のものです。
09/03/06 00:01:32 zNsEmWk0
>同時に複数の選手がボールを蹴る様な場合を考えてました。
それは「蹴った」時の処理であって、
接触したかどうか判定する時点では関係ないんじゃないかな。
同時蹴りの優先度は確かに悩むところだね。
606:436
09/03/06 00:30:05 SvQUccHR
拡大率取得する関数がすでにあったorz
拡大率変えるとSetMousePointが元のウィンドウの大きさ基準で動く為、
元の解像度を超える座標を指定出来ないorz
ので、新たに思い付いたインタフェース案はモロにその影響を受ける為、
すっぱりあきらめられたw
今は構造をもっとスッキリ出来ないかイジクリ中
>>604
今後は念の為C:とソースのバックアップを取る様にしました;
607:SGGK ◆6pZCoAtaxk
09/03/06 23:39:57 Fo+vpfkW
>それは「蹴った」時の処理であって、
>接触したかどうか判定する時点では関係ないんじゃないかな。
た・・・確かにそうです。
メインループ内での処理を移動、当たり判定に分けておいて、当たり判定内で
いろいろな組み合わせの当たり判定をあらかじめ行い、その結果を各種フラグ変数に記憶させておいて
移動関数でそのフラグ変数を参照するようにすれば、移動関数から当たり判定関数を呼ばなくても済み、
プログラムが整理できそうな気がしたけど、なかなか上手く行っていないです・・・orz
>>606
そういえば自分もバックアップ全然取っていないです。もしもハードディスクがクラッシュしたら・・・。(汗;)
やっと>539のバグがなんとか取れました。(もっと日数かかるかと思ってた)
このスレでやってたおかげでVC++2008EEに移れた影響も大きかった。
ボール移動関数に選手のオブジェクトのアドレスを渡して、選手のメンバ変数の中から
ボールとの当たり判定用フラグにアクセスして、(Xキー押し)&&(ボールとの当たり判定用フラグON)が真なら
ボール移動処理に移る様にするとOK!