4月29日(木) みどりの日 編集者:025724K(j02024) 佐久川 まこと
とりあえず今までやってきたことを…。
- cvs内でのファイル・ディレクトリ操作
こちら?と同じなので割愛します。
補足(PS2班は実際にPS2にログインして実験するためそのコマンドである。)
611においてあるPS2(名前はpstwo1とvikingsである)にログインする。
ssh pstwo1.cr -l root もしくは ssh vikings.cr -l root(勝手に書き直したbyj02014)
作業用ディレクトリを作成。
mkdir groupadd y02
ディレクトリy02のグループ権限ををy02に変更する。
chown -R :y02 y02
記憶している限りだと、
adduser -d /home/y02/j020xx -s /bin/tcsh -g y02 j020xx
(たぶん、こんな感じでした。by kamiya..)
パスワード設定を行う。
passwd (自分で作ったアカウント名)
注)ここでpasswdだけでリターンキーを押すとスーパーユーザーのpassword変更となるので必ず自分のアカウントを最後に記述すること!!
ここまですんだら、いったんログアウトして再びPS2に入ってみる。
ssh pstwo1.cr -l (自分のアカウント) もしくは ssh vikings.cr -l (自分のアカウント)
で入れればOKです。
実機を使ったこれまでの経過内容
- 今までのゲーム班が作ったプログラムソースを参考にして、自分たちで作った3Dオブジェクト(複数)を表示し、コントローラーを使って実機で動かしてみる。(下の写真が表示されたオブジェクト)
- リスト構造やポインタなどを参考にして、双方向リストプログラムを作成し、それを組み合わせて表示されたオブジェクトの個数がコントローラーのボタンを押すことによって増えたり減ったりするプログラムを作成。
オブジェクトが増える前の状態 オブジェクトが増えた後の状態。
この段階においてのプログラムソースは以下の通り。
複数表示し、コントローラーで動かせるプログラム
リスト構造を用いて、1つのオブジェクトを増やしたり減らしたりするプログラム。(要改良)
問題点
- あるオブジェクトを表示して、個数を増やしたり減らしたりするときに、「1個ずつ」という個数単位ではできず、ボタンが押された時間によって増えていく。これをどう改良して、「1個ずつ」表示できるようになるか?
- 上の写真では増やしたときに、もとのオブジェクトと増えたオブジェクトの向きが全く違って表示されているので、それをどう直していくか
- たとえ1個のオブジェクトで動いたとしても、複数表示されたオブジェクトをコントローラーのボタンを押すことで別のオブジェクトへ移動し、コントローラーで動かすことのできるプログラムの実装(←未実装)
こんな感じでいいんでしょうか?今思いつく段階では、こんな感じでしょうか? 思いつき次第追加していこうと考えております。
PS2班のみんなも思いついたら追加して下さい。
P.S
PS2班のみんなへ。これを読んでなおしたい箇所があれば、勝手に直してかまいませんので。
4月30日(金) Makefileについて j02015:神谷貴史
Makefileの作成の仕方を書きたいと思います。
TARGET = Title
※make後にできる実行ファイル名
OBJS = main.o ......
※コンパイルするファイル(いくつでも)
INCLUDES = -I.
※*.h などを読み込むときに書く。
DEFINES = -DHELLO
DEBUGS = -g -Wall
※コンパイルを厳しくチェックするための書き込みらしい?
CFLAGS = $(INCLUDES) $(DEFINES) $(DEBUGS)
※ここで上に書いたやつを定義する
all:$(TARGET)
※実行ファイル名(最初のやつ)
$(TARGET) : $(OBJS)
※makeに必要な[*.o]ファイルを書く。この場合は上のOBJSで書いたので$(OBJS)でもいい。
$(CC) -o $@ $(OBJS)
※注意:$(CC)の前はtabで開ける事!
clean :
-rm -f $(OBJS)
※注意:-rm の前はtabで開ける事!
※make cleanコマンドラインから打ち込むとmake時にできた不要なファイルを消す事ができる。
makeファイルの見本は
こちら
です。
全体的に分かりやすくないかも。
5月1日より随時更新(Sat)...予定! Light Waveについて j02015:Kamiya
これは役に立つコマンド集
u or U : uは"undo 1段階戻る",Uは"redo 1段階進む"
tはオブジェクトを移動させる事ができる.
yはオブジェクトを回転させる事ができる.
xはオブジェクトを消去する。(注意:間違って消した場合はundo!)
5月1日(Sat) 追加項目:Light Waveで作った両手
Light Waveを駆使して作成した両手のオブジェクトをPS2で表示、動作確認!
5月3日 Lindaって何? 編集者:j02024 佐久川 まこと
611にある通信システム「Linda」について。
Lindaとは、タプルと呼ばれるIDとDataがセットになったものを、各クライアントがサーバに対して out,in,rd などのコマンドを用いて読み書きすることによって通信を行うシステムである。これを図式化すると以下のようになる。
↑まぁ、こんな感じです。
・各数字が表す動作
1. 読み込み
2.送信
3.Commandキューと同時にREPLYキューを作る
4.Commandキューにデータを溜める。
5.psx_sync_n()を実行する。
6.シーケンス番号(Tuple内)を調査し、その番号にデータがあれば、psx_replyコマンドで出力。
このLindaは、タプル送受信のAPI(out,in,rdなど)を用いることで実行できる。タプルはCOMMANDキューに溜められていき、プログラマが指定したタイミング(psx_sync_n()実行時)で、一気にサーバに送信されます。つまりAPIを実行した段階ですぐに通信が始まるわけではないのである。
また、サーバからのタプルの受信もpsx_sync_n()を実行したときに行われる。受信したタプルはREPLYキューに蓄えられ、psx_reply()で取り出します。また、コールバックを用いて受信したときのアクションを登録することができます。このコールバックを用いると、psx_sync_n()を使わずに送受信も可能になる。
- Lindaの主なAPI
Lindaの主なAPIは以下の通りです。
- void start_linda(hostname);
通信を初期化して、Linda APIが使用可能にする
- void psx_sync_n();
COMMANDキューに溜められたコマンドとデータをサーバへ送信する。
また、サーバからデータを取得し、REPLYキューへ溜める。
- int psx_out(int id, char *data, int size);
dataが示すアドレスから、指定したIDのタプルへsize byteのデータを書き込むコマンド。返り値は、このコマンドのsequence番号です。
- int psx_in(int id);
指定したID番号のタプルから、データを読み込むコマンド。このコマンドを使用した場合、サーバー上に存在するタプルは、クライアントがデータを読み込んだ後削除される。返り値として、sequence番号を取得する。
- int psx_rd(int id);
指定したID番号のタプルから、データを読み込むコマンド。 このコマンドを使用した場合、サーバー上に存在するタプルは、 クライアントがデータを読み込んだ後も残る。 返り値として、sequence番号を取得する。
上記赤でかかれた場所がpsx_in()とpsx_rd()のもっとも大きな違いである。
- int psx_wait_rd(int id);
基本的にpsx_rd()と同じであるが、サーバのタプルスペースにデータがあってもすぐには読みこまず、次にデータが書き込まれるまで待つ。データが書き込まれたときのみそのデータを読みこみ、クライアントへ送信する。返り値として、sequence番号を取得する。
上記のpsx_wait_rd()を図にすると以下のようになります。
上はpsx_out関数が実行された場合を示し、下は、psx_out()関数が実行されていない場合を示している。
この図からわかるように、psx_outが実行されるまで、データを格納しながら待ち続けるのである。
- unsigned char psx_reply(int seq);
REPLYキューからデータを取り出すときに使用。要求したデータがREPLYキューにある場合、データが格納されているTUPLEへのポインタを返す。psx_replyによって返されたポインタの先には、先頭にそのTUPLEのヘッダ情報が12bytes格納されていて、その後にデータそのものが格納されている。
詳しくはこちらをみるとわかると思います…。
そしてLindaは非同期であること、これが最重要である。
5月4日(火) アルゴリズム1とC言語簡単解説 編集者:025712F(j02012) 賀数 武幸
取り合えず、アルゴリズムについて書いていきます。
Example 1: 巡回アルゴリズム
/*ptr->son は子へのポインタ*/
/*ptr->dadは親へのポインタ*/
/*ptr->nextは兄弟へのポインタ*/
while (ptr != NULL) {
draw_obj(ptr->obj); /*描画する*/
if (ptr->son != NULL) {
ptr = ptr->son;
continue;
}
if (ptr->next != NULL) {
ptr = ptr->next;
continue;
}
while(ptr != NULL) {
ptr = ptr->dad;
if (ptr != NULL) {
if (ptr->next != NULL) {
ptr = ptr->next;
break;
} else {
continue;
}
}
}
}
Example 1 は、描画用の巡回アルゴリズムです。
このアルゴリズムでは、free() 等には対応していません。
Example 2: free()を使うときの巡回アルゴリズム(再帰呼び出し)
objTree_Fall_leaf(ptr) {
if (ptr->son != NULL) {
ptr = ptr->son;
objTree_Fall_leaf(ptr);
}
if (ptr->next != NULL) {
ptr = ptr->next;
objTTree_Fall_leaf(ptr);
}
free(ptr);
return;
}
このプログラムは再帰呼び出しとかいうので、
効率の悪いプログラムです。
PS2では1/60(sec)で画像書き換えを行っているらしいので、この様に効率の悪いプログラムを使うのは許されないのだが、今の実力ではこれで精一杯です。
C言語なんだこりゃ事典?
5月10日(Mon) Blender(3D Graphic)について 編集:Takafumi Kaniya
Blenderのショートカットキー一覧をつくってみました。
こちらです
5月11日 Lindaの通信プログラム(簡単なやつ) 編集:025724K Makoto Sakugawa
2つのPS2を用い、片方のPS2でコントローラを使ってオブジェクトを操作すると、もう片方で反映するプログラムを作成した。ソースは以下の通りである。。ただし、コメント文が非常に少なく、わかりにくいプログラムでありますが、ご了承下さい。
あと、上記に記したソースに対応するヘッダファイルがいくつかありますので、それも加えて載せておきます。
create.h
game_main.h
PadCheck.h
May 17 (Thursday) 座標変換 025712F (j02012) 編集者:賀数 武幸
座標変換についての基本的考え
元となるノードの(xyz)や(angle)が変化すると、それに連動するノードの(xyz)や(angle)も変化する。
このときの注意として
(1) 変化するときは、初期の(xyz)や(angle)に対して、transfer-matrixを変化させる。
(2) (1)を実行するためにRenewを忘れないようにする。
以上の事に注意しましょう。
座標変換関数宣言部分のページ(148 ~ 161)
June 2 (Wedensday) ミーティングの内容報告 編集者;025724K さくがわ まこと
5/31にやったことを……
- 最終的にどんなゲームを作成していくか?
とりあえずPS2Linux班の3人で話し合った結果、「迷路ゲーム」なるものを作ろうかと考え中。内容は…
- (企画用紙が手元にないため、後日(なるべく早く)載せます。)
- (迷路ゲームかぁ…)
- (頑張らなくっちゃ)
- テクスチャ張りについて
作成する内容を考えると同時に、オブジェクトにテクスチャを貼るテストを同時に行った。一応、貼れることは貼れるのだが、いくつか問題点が生じた。
- xmlファイルにテクスチャの情報が入っているかor入っていないかで貼れるor貼れないが決まってしまう。
- たとえ貼れたとしても、うまく写らず青黒くなる。(あれはあれでいいのかな?)
- テクスチャを貼るときには、PS2にある関数をうまく使うことで、解決する?
(あとは担当さんよろしくお願いします。)
(写真は後日載せます。)
- Lindaの実装状況と今後の課題
Lindaの実装状況としては、人間と何かあるオブジェクトを同時に表示させ動かすことまではできた。
(写真は後日で…。ほんとすみません)
で、今後の課題として…
- 送りたいデータを「パッケージ化」して、配列 or malloc()でデータを放り込み、変更されたオブジェクトを描画する。
(ある程度はできてるかな?あとは細かい設定。)
- 変更された座標のオブジェクトを正確にするため、構造体をいじり、オブジェクトに番号を振ってわかりやすくする。
(↑構造体、mallocを使った、資料用のテストプログラムを作成。)
- 上記を参照にしてプログラムを書き換え、人と人がコントローラーでうまく動かせるようにする。
前途多難だなぁ…
June 8 (Tue) 今週のMetting内容および来週までの課題 編集者;025724K Makoto Sakugawa
6/7(月)のMeeting内容は「どのようなゲームを作成していくか?」でした。
ゲームを作成する際に大事なこととして、
- 他人が見て(企画書等)、面白みがあるということ。
- 同じく他人が見て、斬新さを持っていること
- (後は思いつき次第)
が挙げられる。その中で、いいアイディアが思いつき、それを「シナリオ化」するまでに至らなければ、ゲーム企画書は作れない。それ相応のセンスが問われるのである。
来週までにしてくること
- 自分たちが作れるゲームとして、案を20ほど(数字はあくまでも目安)作成してくる。(もちろん、今までの作業も並行にしながら)。
- もし、これができなければ、前のゲーム班が作った「しゅがーきゅーぶ」を作っていく。
とりあえず、こんな感じ? あとは適当に付け加えてくださいね。>PS2班へ
^
June 22(Tue) 今週のmeetingで決定したこと 025724K 佐久川 まこと
我々、PS2Linux班は、「自分たちのゲームをつくる(飛び込み。水泳の)」or「しゅがーきゅーぶの引き継ぎ」というどちらかに対して、自分たちのプログラム力量などを考慮した結果、
しゅがーきゅーぶを引き継ぐ
ことに決定した。それあたって、今後はソースの読み合わせ及び移植までの段階をふまえ、オープンキャンパスまでに間に合わせるように作成していく。
また、Lindaを用いた通信プログラムを今までやってきたが…
↓
移植作業に進路が変わってしまった。
↓
途中で終了する形になってしまう。
↓
今までの努力が無駄になり勿体ない。
↓
なので……
移植作業と並行して仕上げ、最初の目標を少しでも達成し、後期のゲーム班に役立てるようにする。
S_cube改造点とデバッグ 7月18日(日) 編集者:賀数 武幸 学籍番号:025712F~
マップ表示についての変更点:sgoex_ps2.c
変更した関数:PutSprite?
変更後
void
PutSprite( int zorder, short x, short y, int number, int rgb )
{
/*
S_cube for PS2の PutSprite() は OTを使わない。OT の代わりに下のような
スタック(sp)を用意した。表示したい スプライトのリクエストは sp に
積まれて、まとめて GSにDMAされる。DMA している箇所は、Gdraw()関数の
ps2util_sprite_Draw() 関数である。
*/
ps2utilSprite* p = &sp[sprite_counter];
/*
S_cube の解像度は 元は 320 x 240 だった。しかし libps2a は
640x 480 のみをサポート する。そこで、320 x 240 で表示されていた
スプライトの パラメタを640 x 480 表示するために、下のような演算を
行っている。下の演算は 表示位置の補正である。
*/
x += (SCREEN_HALF_W/2); y += (SCREEN_HALF_H/2);
x *= 2; y *= 2;
/*
ps2util_sprite_Set_basicAttribute() 関数は、GS パケットの適切な位置に
与えられた引数を格納する。またその内部で、表示フラグをONにしている。
ps2util_sprite_Set_basicAttribute() 関数の第4, 5 引数はスプライトの
表示の際の サイズである。320x 240 から 640 x 480 表示に切替えるため
に、表示サイズを2倍 している。
*/
ps2util_sprite_Set_basicAttribute(
p,
(ushort)x, (ushort)y,
(ushort)sptable[number].w*2, (ushort)sptable[number].h*2,
(ushort)sptable[number].dx+2, (ushort)sptable[number].dy,
(ushort)sptable[number].w, (ushort)sptable[number].h,
SPRITE_PRIO_FOREGROUND );
p->attribute.r = p->attribute.g = p->attribute.b = p->attribute.a =
SPRITE_COL;
ps2util_sprite_Request( p );
sprite_counter++;
}
デバッグ手法について
S_cubeでは、#ifdefを使ってのデバッグが多数用意されています。
これらを使ってデバッグをしてみましょう。
例として、#ifdef QUBE_DEBUGを見てみます。
qube.cの中で、上の様にしてデバッグが用意されています。
これをMakefileの中で定義して、実行中の動作を見ます。
(makeするときに記述することも可 : make " DEFINES QUBE_DEBUG" )
Makefile中に定義したら、プログラムを実行します。
そしたら、実行中に別のウィンドウから、
tail -f messages
と入力する事で、実行中の動作をmessagesに入力する様を見る事が出来ます。
messagesはプログラムを実行するごとに、書き換えられます。
注意点として、ファイルの容量を気にしながら使う事。
大変遅くなりました。PS2Linux班の最終レポート上げたいと思います。