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

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

自機を表示する

今回は、前回作ったオブジェクトを使って、自機の表示を行います。かなり長丁場ですが、
ゲームオブジェクトとスプライトを対応させる一歩です。
これが出来たらもう工夫次第でいろいろ作れるので、頑張りましょう。
自機の画像は、作るのが面倒ならこれを使ってください。
もちろん緑透過で。
素材管理のインポートで、Charactersのところに入れておいてください(サイズが似てるので)。
半透明も含めた透過の処理が簡単なのもRGSSのありがたいところですなあ。

スプライトクラスを作成する

以前の背景では、スプライトはアニメーションも移動もしないものだったので、そのまま使いましたが、
あるオブジェクトと連動させたいような場合は、新たにスプライトクラスを作ります。
デフォルトの方法に倣って、Sprite_MyMachineクラスのスプライトを作成します。

#==============================================================================
# ■ Sprite_MyMachine
#------------------------------------------------------------------------------
#  自機表示用のスプライトです。Game_MyMachine クラスのインスタンスを
# 監視し、スプライトの状態を自動的に変化させます。
#==============================================================================

class Sprite_MyMachine < Sprite
 #--------------------------------------------------------------------------
 # ● 公開インスタンス変数
 #--------------------------------------------------------------------------
 attr_accessor :myMachine
 #--------------------------------------------------------------------------
 # ● オブジェクト初期化
 #     viewport  : ビューポート
 #     z         : スプライト、ビューポートのz座標
 #     myMachine : キャラクター (Game_MyMachine)
 #--------------------------------------------------------------------------
 def initialize(viewport,z,myMachine)
   super(viewport)
   @myMachine = myMachine
   self.bitmap = Cache.character(@myMachine.imgfile)
   self.z=z
   self.viewport.z=z
   update
 end
end
やや見慣れない記述が目立ちます。とりあえずコピーしてください。
class Sprite_MyMachine < Sprite
これは、シーンでもやった、クラスの継承です。Spriteの基本機能はそのまま使いたいので、
Spriteクラスを継承させています。
 attr_accessor :myMachine
これは、自機の座標のようにクラスの持つ変数ですが、ここでは数字ではありません。
Game_MyMachineクラスのオブジェクト です。
このスプライトは、この変数で指定したGame_MyMachineオブジェクトと連動したスプライトです。
Game_MyMachineオブジェクトの位置などが変わると、スプライトの位置も自動で変わるようになります。

ビューポート

スプライトは、内部に ビューポート というものを持っています。
ビューポートというのは、画面上に存在する四角形の穴のようなもので、画像表示の際に、
ビューポートで定めた四角形の中だけに画像を描画する
という決まりがあります。
これについてはここではあまり詳しくは述べません。後ほど自機を動かせるようになった時に少し実験をしてみます。
使い方によっては面白いものですが、通常のスプライト(今回の自機も含む)は画面の場所によって切り取ったりしないので、
このビューポートは『画面全体』を指定してやります。

Sprite_MyMachineの使い方

記述の説明は後にして、とりあえず使い方から見ていくことにします。
 #--------------------------------------------------------------------------
 # ● 自機の作成
 #--------------------------------------------------------------------------
 def create_my_machine
   @myMachine = Game_MyMachine.new
   @v_myMachine = Viewport.new(0,0,544,416) #画面全体
   @s_myMachine = Sprite_MyMachine.new(@v_myMachine,100,@myMachine)
 end
先ほどのSprite_MyMachineクラスのinitializeメソッドには、
 def initialize(viewport,z,myMachine)
と、()の中にいくつかの要素(viewport,z,myMachine)が入ったものが記述されていました。
これは、 引数(ひきすう) と呼ばれるもので、newする際に、この引数に対応する要素を()の中に入れる必要があります。
create_my_machineメソッドの
   @s_myMachine = Sprite_MyMachine.new(@v_myMachine,100,@myMachine)
がその部分です。
@v_myMachineがviewportに、100がzに、@myMachineがmyMachineにそれぞれ対応する要素です。
@myMachineは、前回作成したGame_MyMachineクラスのオブジェクトですね。
@v_myMachineは、スプライトに対して適用する Viewportクラスのオブジェクト で、引用部分三行目でnewによって生成しています。
Viewportは、RGSS2組み込みのクラス(いじれない部分)で、その使い方、newの仕方などはヘルプ→目次→RGSSリファレンス→RGSS組み込みクラスに記述があります。詳しくは省略しますが、画面全体を指すビューポートをnewしています。
そして、これらのオブジェクト、および100という数値を引数として、スプライトをnewします。
すると、これらの引数を使ったinitializeメソッドが実行されます。

initializeメソッドの実行

 def initialize(viewport,z,myMachine)
   super(viewport)
   @myMachine = myMachine
   self.bitmap = Cache.character("MyMachine")
   self.z=z
   self.viewport.z=z
   update
 end
では、initializeメソッドの中身を見ていきましょう。
1行目が定義開始、

2行目は、このクラスの派生元であるSpriteクラスのinitializeメソッドを、viewportを引数に実行しています。
この内容はRGSS内部なのでよく分かりませんが、viewportをスプライトに適用しているはずです。
今後Spriteクラスから派生させたクラスを作る際も、このsuper(viewport)は決まって行います。

3行目は、Sprite_MyMachineクラスのインスタンス変数であるmyMachineに、引数として受け取ったmyMachine(Game_MyMachineクラスのオブジェクト)を代入しています。
ここで、Sprite_MyMachineとGame_MyMachineの間に対応関係が出来るわけです。

4行目では、見慣れないself.というのが出てきます。
これは、自分自身のオブジェクトを指す単語で、
   self.bitmap = Cache.character("MyMachine")
は、このオブジェクトの変数bitmapに、MyMachineの画像を割り当てるという意味です。
以前背景でやった時は、
   @background.bitmap = Cache.parallax("Mountains")
のように、Scene_Shootingクラスから指定しましたが、このようにSpriteクラスの内部から指定することも出来ます。
処理内容としてはどちらも変わりません。

5,6行目では、スプライト及び、スプライトに対応するビューポートの、 z座標 を定めています。
z座標というのは、スプライトの重ね合わせの時に関係する数値で、数値の大きいスプライトほど上に表示されます。
また、 ビューポートにもz座標があり、このz座標はスプライトと同じ値でないとスプライトが表示されません
なぜビューポートにz座標を定めたのかよく分からないのですが、多分スクリプトの内容によっては便利なのでしょう。

7行目のupdateが、スプライトとゲームオブジェクトを連携させるための重要な行です。
スプライトを生成したのはいいのですが、今の段階ではゲームオブジェクトのx,y座標と、スプライトのx,y座標が
連動していません。
Sprite_MyMachineクラスに、以下のupdateメソッドを追加します。
  def update
     self.x = @myMachine.x
     self.y = @myMachine.y
 end
スプライトの持つGame_MyMachineオブジェクトのx,yの値を、このスプライト(self)の
x,y座標に代入します。
これにより、このupdateメソッドが呼び出されるたび、スプライトの位置が@myMachineに指定したオブジェクトMyMachineの
座標に合わせて修正されます。
このupdateメソッドは画面の更新のたびに呼び出されます。

さて、実行してみましょう。
背景の上、中央左のあたりに自機が表示されたら成功です。

後処理も忘れず

さて、うまくいったら後処理もやっておきましょう。
Scene_Shootingクラスのdispose_my_machineメソッド(前回作ったやつ)に以下の行を追加します。
   @v_myMachine.dispose
   @s_myMachine.dispose
これについては今までと同様なので特に説明は不要でしょう。

引数の意味

引数の意味を最後に説明しておきます。
と言っても、何となく分かってれば読まなくてもいいですが。
引数は、作るオブジェクトにバリエーションを持たせるためのパラメータなのです。
zの値を変えれば、z座標の違う自機を作成したり、
例えば、今回はやっていませんが、ファイル名を引数にすればいろんなグラフィックの自機を場合に応じて作れるようになります。
また、自機の初期位置を決めることも出来そうですね(余裕があれば、Game_MyMachineクラスを初期位置を引数で渡すように改造してみましょう)。

さて、次は入力を受け取ります。だんだんゲームっぽくなってきますよ。


  • すごくわかりやすいです!!
    わかりやすい講座を探していたのでありがたいです。
    続き楽しみにしています! -- (名無しさん) 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
名前:
コメント:

すべてのコメントを見る
添付ファイル