ソフトウェア設計及び演習用の班Wiki

13::gr09::発表

プロジェクト名

  • ゆうしゃのぼうけん(仮): 仮は取れませんでした。

プロジェクト説明

  • 横スクロール型アクションRPG。ですがロールプレイング要素は「プレイヤーが勇者」くらい。そしてスクロールは大変そうなので、横移動型に。

ゲーム概要

  • 障害物を乗り越えながら、ステージ上に存在する敵を倒していく。
  • 敵の倒し方は、武器を持たない状態なのでジャンプのみとなる。
  • 敵に接触するなどでダメージを受けて体力がなくなると、スタート地点に戻される。
  • 操作
    • 左右矢印:左右移動
    • 上矢印:ジャンプ

各モジュールとヘッダファイルについて

  • プレイヤー(担当:加藤)
    • キー入力の取得
    • 当たり判定:障害物、敵との接触。プレイヤー、敵、ステージ座標の数値を元にする。
    • プレイヤーHP(体力値):敵との当たり判定から回数を計測。
    • アクション制御:プレイヤーの動作は人間のキーボード操作によるもの。左右移動、ジャンプ(プレイヤー座標の変動)
  • 敵(担当:加藤)
    • アクション制御:コンピュータによる自動移動。左右移動、ジャンプの繰り返し。
    • 敵HP(体力値):プレイヤーの下方部分(足パーツ)との当たり判定によって減少。
  • アクション制御のヘッダファイル(action.h)
    • #define SPEED 5
    • #define GRAVITY 1
    • #define JUMPPOWER 15
    • void my_player_move(mySprite *sprite);
    • void my_enemy_move(mySprite *sprite);
    • int chara_collision(mySprite *sprite);
  • プレイヤー情報のヘッダファイル(player_data.h)
  • gchar *chara_pics[] = {"../images/yusya.png","../images/enemy1.png"};
  • typedef struct {
    • GtkWidget *drawing_area; //描画領域
    • GdkPixmap *bg_pixmap; //背景
    • gint width;
    • gint height;
    • gint timeout;
    • GList *sprites; //スプライトのリスト
    • } myAnimeArea;
  • typedef struct {
    • myAnimeArea *anime_area; // のっかっているアニメーション領域
    • GdkPixbuf *pixbuf; // スプライト用画像(ピクスバッファ)
    • gint timeout; // スプライトのタイムアウト
    • gint width; // 幅
    • gint height; // 高さ
    • gint x, y,dx,dy;  // 座標
    • gint hp;         //HP
    • gint mode;        //キャラクタの種類(0…プレイヤー、その他)
    • } mySprite;
  • ヘッダファイル(key_event.h)
    • gboolean g_up,g_down,g_right,g_left;
    • void cb_key_press_event(GtkWidget *widget, GdkEventKey *event);
    • void cb_key_release_event(GtkWidget *widget, GdkEventKey *event); :以上。key event callback function
    • void set_cb_key_event(GtkWidget *window); :キーイベントのコールバック関数一括設定用関数

  • ステージ構成(担当:小笠原)
    • 各障害物の配置:テキストファイルに数値化したものを読み込み、当たり判定時の分岐条件とする。
    • 地面、足場:プレイヤーが上を移動できる。足場の場合正面、頭上にあると移動を阻害される。
  • ステージ構成のヘッダファイル(stage.h)
    • #define ST_WIDTH 16  :ステージの横幅、16分割
    • #define ST_HEIGHT 10 :ステージの縦幅、10分割
    • int g_stage_hit[ST_HEIGHT][ST_WIDTH];
      • 障害物用の当たり判定数値保存のための二次元配列。
    • int g_stage_eve[ST_HEIGHT][ST_WIDTH];
      • イベント用当たり判定数値保存のための二次元配列。
    • void stage_read(int file_num);
      • 引数:ステージ番号、テキストファイルで用意した各ステージの情報を読み込む。読み込まれた情報は、上記の二次元配列内へ保存される。

  • イベント判定(担当:鈴木)
    • ゴールイベント:ライフがゼロになると発生。
      • ゲームオーバー:穴に落ちていた場合発生。
      • ゲームクリア:穴に落ちていない場合発生。
    • スコア:敵を一体倒すと+100point、穴に落ちると-100point
  • 各グラフィック(ゆうしゃ、各障害物、ゲームオーバー画面等)
  • ゲーム終了時のヘッダファイル(gameend.h)
    • void gameend(int ene, int hole);
      • ゲーム終了画面を表示。引数(倒した敵の数、穴に落ちた回数)によって、ゲームクリアかゲームオーバーかを判定する。
  • スコア表示のヘッダファイル(score.h)
    • typdef struct {
      • GtkWidget *lay;
      • GtkWidget *num[10];  スコア表示用の数字
      • GtkWidget *gameover;  ゲームオーバー用
      • GtkWidget *gameclear;  ゲームクリア用
      • } G_ImgScore;
    • void score_init(G_ImgScore *gb);
      • スコア表示のための画像やレイアウトコンテナを用意する。
    • void draw_score(G_ImgScore *gb, int ene, int hole);
      • スコアを計算して表示する。

  • 画面表示(担当:石井)
    • スタート画面の作成
    • ステージ構造の表示:背景、地面、各障害物などを表示する。
    • プレイヤーの表示:プレイヤーの画像をプレイヤー座標により表示。
    • 敵の表示:敵の画像を敵座標により表示。
    • ライフの表示:プレイヤーが敵に当たったり穴に落ちるとライフが1つ減る。
  • ステージサイズのヘッダファイル(stage_size.h)
    • #define AreaWidth 640
    • #define AreaHeight 400
  • 画面表示のヘッダファイル(stage_anime.h)
    • #include "stage_size.h"
    • #include "player_data.h"
    • typedef struct {
      • GtkWidget *lay;
      • GtkWidget *img_stage;
      • GtkWidget *img_stage2;
      • GtkWidget *img_player;
      • GtkWidget *img_enemy;
      • GtkWidget *img_life1;
      • GtkWidget *img_life2;
      • GtkWidget *img_life3;
      • }G_Imgbox;
    • void draw_life(G_Imgbox *gb);
    • void scroll(G_Imgbox *gb);

動作スクリーンショット

Screenshot_from_2014-02-06 13:57:44.png

うまくいったこと、うまくいかなかったこと

  • うまくいった
    • 作りたいもの、それに付随した作らなければならない要素の洗い出しなどは、それなりに多く、早めにできた。アクションゲームということである程度型が決まっていた部分などの組み合わせもできた。
    • ステージ、プレイヤー、敵などの画像がとてもきれいにできた。
  • うまくいかなかった
    • モジュールの分担内容:作りたい内容から分けたモジュールだったが、各班員の負担が大きく異なり、作業内容に差が出てしまった。
    • ステージが変わるときにスクロールをするようにしたかったのだが、スクロールのやり方が分からず、次の画面を貼り付ける形になってしまった。
    • ステージ上にアイテムを置いてそのアイテムによってプレイヤーの攻撃が変わるようにしたかったが、攻撃は体当たりだけになってしまった。

担当者の感想

  • 加藤(班長)
    • チームで一つのものを作るという経験は初めてだったので新鮮だった。班員ごとのプロジェクトへの理解に差があったり、意思疎通がしっかり取れずに作業の遅れにつながった。個人の得手不得手やGDKに対する理解度の差もあり、それらを踏まえたモジュール分担にする必要があったと感じた。せっかくインターフェースをWikiに載せたり、サブバージョンで共有しているのにもかかわらず、それを有効に活用できなかったことで起きた問題も多々あった。また、有用なサンプルプログラム(Ball等)があったのに、有効に活用できていなかった。
  • 鈴木(副班長)
    • テーマ決めや洗い出し等の話し合いは順調に進んだと思いますが、その後の役割分担に差が出てしまったのが一番の反省点です。自分の事で手一杯で、GDKについて担当の範囲しか理解しておらず、他の人がうまく行かずに困っていても何も手助けできませんでした。もっと広く勉強してGDKの理解を深めておくべきだったと思います。また最後の方になって、上手く繋がらず使用が変更になる点が多く、情報共有の不足を感じましたが、臨機応変に対応できたのは良かったと思います。まぁなんだかんだでひと通り動いたので一安心です。副班長何もしなくてすみません。
  • 石井
    • まず、svnを理解するのに時間がかかり過ぎました。ゲームを作る段階でも仕事が遅く、班のみんなには迷惑をおかけしました。最後の方になってやっとプログラム全体ののことが分かり、そこからは順調に進められたと思います。また、TAの松尾さんには大変お世話になりました。毎回いろいろなことを教えていただいてるのに何もできない僕を見捨てずご指導いただきありがとうございました。今回のゲーム作りで、班のみんなの大切さ、TAの方の大切さ、プログラミングの難しさを改めて学びました。
  • 小笠原
    • プロジェクトの内容や、作っていくモジュールについて話し合う段階ではいろいろと作業が進められたと思いましたが、実際にプログラムを組むという段階で、作りたいものを実装するためどうプログラムを組めば、というところで躓いたり。実際に作ってみても処理が通らなかったりとそのあたりの実習不足を痛感しました。
    • それでも処理は一番ラクな部分だったので、発表用の資料を作成したり、裏方を少しずつしてみました。


最終更新日:2014/02/12 11:25:13