夏休みブログリレーセミファイナルです。
こんばんわ。
17JCのSigma1023です。この記事を書き始めたのが9/23午前11時20分です。
まだ時間に余裕がありますが、進捗状況は50%くらいですね。間に合うのでしょうか。
作るって言ってたものは?
最初僕はxecua君のゲームを作ると言っていました。
具体的には3Dアクションゲームです。
システムとかギミックはまあまあ出来ていたんですよ。しかしモデリングという最大の壁を破れませんでした。
まあしょうがないですね。
本題
ゲームを作るものを作るとはどういうことなのかというとエディタを作るということですね。ちょうどシューティングゲームが作りたくなったのでシューティングゲームのエディタを作ります。
僕はJava信者なのでJavaで書きます。
Eclipse最高↑↑
ぶっちゃけシューティングゲームをただ作るだけならゲームのシーンにただただ書いていって関数分けするだけなので簡単(?)なんですよ。ただ僕が作りたいのは柔軟性のあるエディタなんですね。
まあとりあえずシューティングゲームを作ります。
シューティングゲームに必要なものを整理しておきます
- プレイヤー
- 敵
- 弾
この三つです
ここでこの三つの共通点を上げましょう。
- 画像
- 位置
- 当たり判定
はい。実際にはもう少し変数を増やしていますがとりあえずこの三つです。
最初の三つをもう少し細かく分けてみましょう
- プレイヤー
- 敵
- 雑魚
- ボス
- 弾
- 自機弾
- 敵弾
こんな感じです。また、プレイヤー以外にはもう一つの共通点があります。それは"自立して動く"ということです。そこで、自立して動くために必要な変数をこれらに追加します。
これで大体の構造が出来ました。プログラムを書いて行きます
プ
はじめに、3つの変数(位置、画像、当たり判定)を持ったクラスを作ります(修飾子等気にせず適当にかきます)
class BaseObject{
Point point;
BufferedImage image;
double collision;
}
次にこれを継承します(Commandは自律するのに必要な奴です)
class Player extends BaseObject{
}
//Enemy,Bulletのもとになるやつ
class BaseObject2 extends BaseObject{
Command command;
}
class Enemy extends BaseObject2{
}
class Bullet extends BaseObject2{
}
ここで、Commandクラスを詳しく作っていきましょう
Commandに必要なものは
- 何をするのか
- どのようにするのか
- した後にどうするのか
です
こんな感じです
class Command{
String id;
String contents[];
Command commands[];
}
ここまで来たら簡単ですね
cloneメソッドとコンストラクタを作るだけで大体の形ができます。
書いて実際にプレイヤーを呼び出してみました
new Player(new DoublePoint((double) GameWIN_WIDTH / 2, (double) GameWIN_HEIGHT / 4 * 3), 10, Image.image("shooting/player.png"), 15, 10, 5, 4, new ArrayList<ArrayList<PlayerBullet>>(), 0, new DoublePoint(Image.image("shooting/player.png").getWidth(), Image.image("shooting/player.png").getHeight()));
先ほど書いたものと微妙に違うんですがまあ見づらいですね。(PlayerのImageを3回も書いているからだと思う)
さらに、これに先ほど書いていない自機弾というものを持たせる必要があるのでもう少し増えます。
敵を1つ作る,弾を1つ作る場合もこのようなスクリプトを書いたりクローンしたりしています。(敵や弾の変数のcommandはCommandを持っているので無限に増やせます)
とりあえず書けたので次は自機の移動、コマンドの実装です。
自機の移動は書くだけなので、コマンドの実装をします。
例えば斜めに行くコマンドはこんな感じです
new Command("OBLIQUE", new String[] { "50","100" }, null)
これは
→x
↓y
で考えたときにx軸の方向から100度(左下です)の向きに毎フレーム50の速さで進むというものです。
実装的には
b.point.x += Math.cos(Double.parseDouble(cont[1]) / 180 * Math.PI) * Double.parseDouble(cont[0]);
b.point.y += Math.sin(Double.parseDouble(cont[1]) / 180 * Math.PI) * Double.parseDouble(cont[0]);
という風に書きました。
最後に描画や関数の実行、判定に仕事させれば
はい!完成!!
シューティングゲームができるようになりました。
こうやって書いてみると単純で簡単なんですが試行錯誤&Javaの勉強(継承周りとかcloneしてないときのバグとの闘い)をしながらだったのでとてもつらいです。
画像とか音とかいろいろ足りないものがあるんですが間に合わないのでもういいです。
エディタは間に合わないので冬のAdCで完成版を見せようと思います(作っていたら)(今回作ったものは重いので改良します!)
あと当たり前のことなんですが
コメントを書こう
コメントはそのプログラムを書く前に書いた方がいいと思います。
いろいろあって3~40くらいのクラスを作ったんですがコメントの数は全部で20くらいしかありません。今日に間に合わせるために初期化の関数内がやばいことになっています。3日空いたら他人のコードになるようなプログラムは書かないようにしましょう。
まとめ
字だらけの読みづらい文章に付き合ってもらってありがとうございました。僕自身Javaをちゃんと書き始めたのがちょうど1年前(それまでプログラムはfor,while,ifしか使わない、数値はintオンリー,配列?なにそれ?おいしいの?状態)なのでまだまだ初心者ですがプログラミング楽しいです。Javaは楽しい&エディタが優秀なので初心者向けで、おすすめです。
+
いよいよ明日がブログリレー最終日(@Yosotsu)ですよ!
むっちゃドキドキしてきた…。
皆さん、今日くらいは進捗は休んで明日に備えますよね?