「自機を表示する」の編集履歴(バックアップ)一覧に戻る

自機を表示する - (2009/04/14 (火) 22:05:40) のソース

入門編・8
シューティングゲームもどきを作る
*自機を表示する
今回は、前回作ったオブジェクトを使って、自機の表示を行います。かなり長丁場ですが、
ゲームオブジェクトとスプライトを対応させる一歩です。
これが出来たらもう工夫次第でいろいろ作れるので、頑張りましょう。
自機の画像は、作るのが面倒ならこれを使ってください。
#ref(MyMachine.bmp)
もちろん緑透過で。
素材管理のインポートで、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
これは、自機の座標のようにクラスの持つ変数ですが、ここでは数字ではありません。
&bold(){Game_MyMachineクラスのオブジェクト}です。
このスプライトは、この変数で指定したGame_MyMachineオブジェクトと連動したスプライトです。
Game_MyMachineオブジェクトの位置などが変わると、スプライトの位置も自動で変わるようになります。

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

**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)が入ったものが記述されていました。
これは、&bold(){引数(ひきすう)}と呼ばれるもので、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は、スプライトに対して適用する&bold(){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行目では、スプライト及び、スプライトに対応するビューポートの、&bold(){z座標}を定めています。
z座標というのは、スプライトの重ね合わせの時に関係する数値で、数値の大きいスプライトほど上に表示されます。
また、&bold(){ビューポートにも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クラスを初期位置を引数で渡すように改造してみましょう)。

さて、次は入力を受け取ります。だんだんゲームっぽくなってきますよ。
----
[[前へ>自機を作成する]]・[[次へ>入力を受け取る]]
----
#comment_num2(size=40,vsize=4,num=20,logpage=コメント一覧)
目安箱バナー