※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

入門編・7
シューティングゲームもどきを作る

自機を作成する

今回は、ゲームオブジェクトクラスの作成を行います。
自機の表示は次回まで持ち越しです。
先はまだ長いですが、頑張りましょう。

ゲームオブジェクトを定義する

スクリプトでは、例えば戦闘シーンのパーティと敵キャラなど、要素に分けられるものを
別途、ゲームオブジェクトとして定義していました。
これに倣って、シューティングゲームにおける『自機』『敵キャラ』『弾』も、ゲームオブジェクトとして作成することにします。
(とりあえずは、しばらく自機だけです。)

自機クラス、Game_MyMachine(マイマシン、つまり自機)を、素材・ここに追加の下に追加しましょう。
デフォルトのスクリプトでは、ゲームオブジェクトはシーンより上に位置していますので、
ここではScene_Shootingの上の行に追加しました。
ちなみに、素材・ここに追加の所ではなく、ゲームオブジェクトのところに置いたりしてもエラーにはなりません。
あまり多くのクラスを作成する場合、素材・ここに追加の下に全部置くと多少見にくいかも知れません。

さて、ゲームオブジェクトもクラスの一つなので、クラスと同様に定義します。
class Game_MyMachine
(この中に中身)
end
が最小の構造です。
この中に、 クラスの持つ変数(プロパティという方が正確)、クラスのメソッド、あと『定数』 を定義することが出来ます。
定数というのは初めて出てきたかと思いますが、これは変数のようなもので、ただし変更しないもののことを言います。
例えば、自機の縦横のサイズは定数として定めておくと、後で便利です。
では、自機に必要な変数を考えてみましょう。まず最初に思い浮かぶのが、位置。x座標とy座標です。
(RPGでは32×32マスを単位として座標を決めていますが、ここではピクセル、点の位置で決めます。)
定数も含めて定義すると、下のようになります。
#==============================================================================
# ■ Game_MyMachine
#------------------------------------------------------------------------------
#  シューティングゲームの自機を扱うクラスです。
#==============================================================================

class Game_MyMachine
 #--------------------------------------------------------------------------
 # ● 公開インスタンス変数
 #--------------------------------------------------------------------------
 attr_accessor   :x                        # 自機画像の左上 X 座標
 attr_accessor   :y                        # 左上 Y 座標
 #--------------------------------------------------------------------------
 # ● 定数
 #--------------------------------------------------------------------------
 SIZE_X = 32 #自機の幅(ピクセル)
 SIZE_Y = 32 #自機の高さ(ピクセル)
 WND_X = 544 #ウィンドウのサイズ
 WND_Y = 416
end
一応、画面のサイズも定数として決めました。変数は後から増やしますが、とりあえずこれだけで。
コメントは多めに、あるいはデフォルトのものに従った形でつけておくと見やすいです。
attr_accessorというのは、Rubyの文法で、変数に対するアクセスの権限を定めるものですが、
とりあえずここでは全ての変数をこの形で記述しておくものとします。一番アクセスがしやすい形なので、不便が少ないです。
定数は、 Rubyでは一文字目を大文字にした変数名をつけると定数になります
慣例から、定数はここでは全て大文字で記述します。
逆に言うと、一文字目が大文字の可変の変数は作れないので変数名をつける時に大文字を誤って使わないよう気をつけましょう。

initializeメソッドの作成

変数と定数の他に、通常、ゲームオブジェクトについて必ず作るのが、initializeメソッドです。
これは、変数の初期値を決定するのが主な内容の、 newによってオブジェクトを作成した時に呼び出されるメソッド です。
定数の定義の下、最後の行のendの上に、以下の文を付け加えてください。
def initialize
   @x=120
   @y=200
 end
自機の初期位置を、(120,200)の位置に定めました(数字は適当です)。
これにより、ゲームオブジェクトを作成した時に、初期値が定められます。
なお、"@"は、インスタンス変数といって、ゲームオブジェクトの持つ変数(ここではx,y)にアクセスする時につけるもので、
これが無いと自機のx座標と関係ない別の変数xに代入して、しかもそのxはinitializeメソッドの終了時に
破棄されるので、何もしていないことになります。クラスの変数を操作する際には大抵つけるので、注意しましょう。

newによって、ゲームオブジェクトを作成してみる

Scene_Shootingに、自機オブジェクトを作成するスクリプトを加えてみましょう。
内容は前回の背景表示とあまり変わらないので、結果だけ示します。
 def start
   create_background  # 背景の作成
   create_my_machine # 自機の作成のメソッドを追加
 end
下でcreate_my_machineを定義。
 def create_my_machine
   @myMachine = Game_MyMachine.new
 end
myMachineという変数にGame_MyMachineクラスのオブジェクトを割り当てました。
このmyMachineに@がついているのは、Scene_Shootingクラスに属する変数だからです。
また、終了時にはやはり廃棄する必要があり、
 def terminate
   dispose_background  # 背景画像の解放
   dispose_my_machine  # 自機の解放を追加
 end
dispose_my_machineを定義
 def dispose_my_machine
   @myMachine.dispose
 end  
となります。
ただし、このまま実行しても、自機は表示されません。
自機を表示するためのスプライトが無いし、だいたいにおいて自機のグラフィックをどこにも指定していません。
次回、スプライトを自機とリンクさせ、画面に表示させる方法をやります。


  • すごくわかりやすいです!!
    わかりやすい講座を探していたのでありがたいです。
    続き楽しみにしています! -- (名無しさん) 2009-04-11 17:41:26
  • コメントありがとうございます。
    こんなに早く反応があるとは……。
    ヘルプの解説を含め、シーンの構造などを説明しているものが
    ほとんどなかったのが不満で、作ってみました。
    本当に実はあんまり分かっていないので、至らないところも
    多いかと思いますが、よろしくお願いします。 -- (管理人) 2009-04-11 18:58:22
  • すいません、『自機を表示する』の記述に誤りがありました。
    updateの中身を書かないと、自機の位置が正しく反映されません。
    記事を修正しておきます。 -- (管理人) 2009-04-14 21:59:20
  • ツクール古参ですがRGSSに四苦八苦でした(^^;)
    が、シーンの基本構造を解説した記事にガチで救われました
    応援してるんで、がんばってください!!続き楽しみです。

    -- (うきぶくろ) 2009-04-27 12:17:15
  • コメントありがとうございます。
    一番書きたかったそのあたりは書いたもののなんだか忙しい+
    自分でもRGSSの解読に手間取っているためになかなか更新できていません。
    どの程度まで書けるか分かりませんがよろしくお願いします。 -- (管理人) 2009-04-28 08:40:35
  • 敵キャラを作成する・2の最後の方に、
    updateの際に敵キャラを扱うスプライトの更新を行うのを忘れていたのを修正しました。
    イタリック体で修正が入っている部分です。 -- (管理人) 2009-05-02 22:10:23
  • UFOが見にくかったので画像に縁取りをつけました。 -- (管理人) 2009-05-04 08:56:56
  • ホントにスゴイと思います。尊敬します。
    大変だと思いますが少しずつでいいんで頑張ってください。 -- (ユウ) 2009-05-12 00:07:40
  • コメントありがとうございます。
    恐らくこれを見て作る側はすぐなんでたいそうもどかしいと思いますが……。
    ところで、今のところはちゃんとこの講座の通りで動くようになっているのでしょうか?
    一応チェックはしてますが、多少ポカはすると思ってたので指摘が無いのがむしろ意外です。 -- (管理人) 2009-05-13 21:11:52
  • 大丈夫です。ちゃんと動いています。
    頑張ってください。続きが楽しみです。 -- (ユウ) 2009-05-18 01:06:59
  • 1段目と言われている部分は『RGSS2』
    2段目と言われている部分は『プリセットのスクリプト』
    と言われると、より解り易い表現なのでは? -- (通行人) 2009-11-05 12:48:40
  • @enemies[i] = Game_Enemy.new(200 + rand(312), rand(384))
    ↑argumentErrorが発生しました。wrong number of arguments(2 for 0)
    どうすればいいでしょうか、頼みます。
    -- (help me!!) 2010-01-05 00:22:50
  • マウス入力はできますぜ。
    Win32とかなんやらをつかって。
    キーボードもできるみたいですが見つかりません。
    探してます。 -- (シャミラ) 2010-03-24 05:28:28
  • 勉強させてもらってます、とても参考になります。
    入門編・10 にあるGame_Ememiesのクラスの
    attr_accessor ;s_enemies ですが、;を:に変えないとエラーを吐きますので
    コピペでやった人は修正した方がよさそうです
    -- (邯鄲) 2010-09-04 17:27:18
  • @enemies[i] = Game_Enemy.new(200 + rand(312), rand(384))
    ↑argumentErrorが発生しました。wrong number of arguments(2 for 0)

    Game_Enemyクラスって最初からありますよね。
    それが原因では? -- (ぽん) 2010-10-03 23:11:42
  • 製作初心者なのでとても助かります!! -- (ありがとうございます!) 2011-02-05 12:44:03
  • セーブ/ロードまわりはMarshalを使ってスクリプトで記述されていますし、
    ファイルの読み書きもRubyと同様にできますから、
    セーブやロードをいじるのはスクリプト操作でできることでは? -- (ななし) 2011-05-20 13:04:19
  • ダンジョンなら3D化できると、下記サイトに書いてありました。 -- (だれかさん) 2011-08-18 07:26:19
  • アルバイトはじめましたd(´∀`*)グッ♪ http://64n.co/ -- (私だ) 2012-01-09 04:49:41
  • 風俗店を探よりココ!!男性は報酬あり!d(´∀`*)→ http://www.44m4.net/ -- (江梨子) 2012-08-20 17:11:02
名前:
コメント:

すべてのコメントを見る