DJ R-techがFL studio でサイケやテクノを作る

主にテクノ、テック・ハウスを作成しています。名古屋を中心に活動しています。トラックメイカーが主ですがたまにDJ。クラブ・ミュージックに興味を持った方々のお役に立てるブログを運営しています。

音楽室を実装

やっと実装できました。

音楽再生するだけだから簡単だろうと思っていましたが意外と難関でした。







 曲が流れている時に他の曲を流すためには前の曲を止めないといけないんですネ。それを止めるためには今流れているのがなんという曲かを把握(取得)しなければなりません。そして曲を止めるのですが、止まってから次の曲が再生される一瞬の間だけ曲が流れていない状態になるんです。その時にエラーが起きるorz///


 原因は曲を番号で管理するという点にあります。int型変数で流れている曲を把握するのですが、止まった瞬間に空っぽになってしまいます。その際に”それはだめだよ”っていうことでエラーとなるのです。

 プログラミングで初めて知ったことなのですが、ゼロ0と空っぽは違うんですね。

 
 intをNULL許容型にして解決しました。

 
 と思ったら今度は再生メソッドが”NULL型はだめだよ”と言ってきました。まあこれはキャストして解決です。



・EXITの実装


 これも簡単そうでやっかいでした。EXITを押して直接終了処理をしてしまうとメイン関数がもつ終了メソッドと重複してしまうためエラーを起こします。
 
 そこで
public static bool escape=false

 というグローバル変数を作り、EXITを押すと

escape=true

 となる仕様にしました。グローバル変数は使わないほうがいいと言われているのであとで不都合が起きないか不安なとこです。




・今後の課題

  • 起動時にタイトル曲が流れるようにしたい
  • プレイ中esc押下でポーズさせる
  • ポーズ画面には 続ける タイトルに戻る のセレクトを用意



DTM ブログランキングへ

残機表示を実装する


 ゲームではお馴染みの残機表示を 実装します。
 
 blog3
 
 
 もうドット絵作るのがめんどくなってきたので
  1. フォトショップ
  2. テキスト”★”を入力
  3. トリミング 
 とやって作りました。カーソルも同じように△をそのまま使います。お手軽にハイクオリティです。


 ただ、この残機表示は被弾しても減りませんorz
 
 

Class player

 public override void OnCollide(CollidableObject obj)
        {
            Engine.AddObject2D(new BreakObjectEffect(Position));
            Engine.Sound.Play(SoundDeathnd);
            Zanki--;
            if (Zanki < 0) Dispose();
        }
 


Class SceneGame

 protected override void OnUpdated()
        {
            for(int i = 0; i < player.Zanki; i++)
            {
                var pictzanki = new PictgramZanki(i);
                LayerUi.AddObject(pictzanki);
            }
            updateStage();            
        }
     
  

これで いけると思ったのですが...うーん。一度表示した★を消去するメソッドが無いからでしょうか・・・ 

会話シーン作成2

前回の続きです。


無事に会話を進めることができました。

blog


Zボタンを押すと、前のセリフが消え、次のセリフが表示されます。


blog2



 ”一つ前のセリフ(インスタンス)を消去する”という予定でしたが、会話レイヤーのオブジェクト全部を消してしまったほうが簡単な記述で済みます。そのために新規で会話のみのレイヤーを追加しました。

 




  protected override void OnUpdated()
        {
            base.OnUpdated();
            if (kaiwaStage1.Count > 0)
            {
                if (Engine.Keyboard.GetKeyState(Keys.Z) == KeyState.Push)
                {
                    layerKaiwa.Clear();
                    layerKaiwa.AddObject(kaiwaStage1.Dequeue());
                }
            }

        } 

会話シーン作成

blog

 東方でおなじみの掛けあいシーンを作りました。ボス戦前の一休みですね。これがあることで敵キャラクターも印象的に見せることができストーリーも伝えることができます。一昔前のSTGはただステージが進んでいくだけでストーリーは説明書に書いてあるくらいでしたが、東方以降プレイ中にストーリーを追っていくという手法が増えた気がします。

 
 Zボタンを押すと会話が進むようにしたのですが、


 blog2

 
 その前のセリフを消す方法がわかりません・・・。Queueクラスにテキストを格納してZを押した時にそれが出てくるようにしてます。押した時点で”一個前のインスタンスを消去する”という式がかければいいのですが、コレクションクラスの使い方が全然わかっていませんorz


            Kaiwa techno5 = new Kaiwa(font_Midori, "困ったな・・・頭おかしい子かな・・・");
            Kaiwa altir6 = new Kaiwa(font_Enji, "(生きるためにがんばるぞ!うう・・・怖いよ〜)");

            kaiwaStage1.Enqueue(altir1);
            kaiwaStage1.Enqueue(techno1);
            kaiwaStage1.Enqueue(altir2);
            kaiwaStage1.Enqueue(techno2);
            kaiwaStage1.Enqueue(altir3);
            kaiwaStage1.Enqueue(techno3);
            kaiwaStage1.Enqueue(altir4);
            kaiwaStage1.Enqueue(techno4);
            kaiwaStage1.Enqueue(altir5);
            kaiwaStage1.Enqueue(techno5);
            kaiwaStage1.Enqueue(altir6);

        }



        protected override void OnUpdated()
        {
            base.OnUpdated();
            if (Engine.Keyboard.GetKeyState(Keys.Z) == KeyState.Push)
            {

ここにひとつ前のインスタンスを消すメソッドを書く
   
                layerKaiwa.AddObject(kaiwaStage1.Dequeue());
            }

        } 


 
続きの記事



DTM ブログランキングへ

ゲーム画面をもっとおしゃれに

blog

 今のとこUIはこんな感じです。敵を倒すとアイテムが出るようになりました。まだ取ることはできません。

  1. アイテムと自機の接触判定
  2. パワー変数加算
  3. パワー変数が10上がるたびにショット強化

 というコードが必要ですね。1,2はOnCollideで、3はOnUpdateでショット威力に関する変数に加算することでしょう。ということはショット威力を制御する変数が必要になります。パワーアップはSTGの醍醐味ですのでなんとしても実装したいです。
 
 一応ためうちまでできるようになりました。これは簡単でした。ためうちは貫通攻撃にする予定です。通常ショットからオブジェクト破棄のメソッドを取り除けばいいだけなのですぐ実装できそうですね。



 コードが増えてきてごちゃごちゃしてきました。上級プログラマーはどうやって整理してるんでしょうか。10行くらいのクラスでも新しいファイルにしたほうがいいのかな・・・


 


Altseedにて作成してます。