忍者ブログ
windowsやブラウザ のゲーム作ったりとか。
前回までのあらすじ。

アツマールのバカゲーコンテストに、ニコ生ゲーム賞なるものが登場したので
ニコ生ゲームについて、調べてみた。
なお、ニコニコ自作ゲームフェス2021にもニコ生ゲーム賞があるそうだ。
Akashic Engineというものを使って作るそうだ。

とりあえず、スコアボード機能付きで「Hello World」を新規作成して
プレイヤーの画像を変更してみたよ。

じゃあ、今日は「Shot」の画像をハートに変更して
ランダムな方向に発射するようにしてみるよ。
とりあえず、8方向でいいかな。

まず、ランダムな数値を取得する命令を探します。

var wawa = Math.floor(g.game.random.generate() * 8);//0以上8未満の整数を変数wawaに取得

となるらしい、これを(変数名のwawaは適当に自分でつけたやで)
// 弾の初期座標を、プレイヤーの少し右に設定します
のとこに配置。
理由はよくわからないけど
// 弾を右に動かし、弾の動きを表現します
のとこに配置すると飛んでいかずにわらわらする。
まあそれも悪くない気がしたけど、今回は飛んでってもらいたい。

で、// 弾を右に動かし、弾の動きを表現しますのとこは
if文で、8通りの方向へ飛ばす。

if (wawa == 3) {
shot.y += -10;//変数wawaが3の弾は上へ移動
}
if (wawa == 4) {
shot.y += -10;//変数wawaが4の弾は右上へ移動
shot.x += 10;
}

上記は一部だけど、8方向分書いたで。
まあ、いわゆる恥ずかしいコードっていうやつなんだと思うけど
基本のif文使ってるだけだから、何をしているのか後で見てもわかりやすいで?
と、開き直っておこう。(関数とか方程式苦手なんよ)

これで完成としてもいいんだけど、ゲームが終わったことがわかりにくいので
タイマーが0になったら、「リロードしてね」って表示したいよ。

逆引きリファレンス「文字列を表示する」を読んでみよう。
まるっとこぴっぺして

// カウントダウンを止めるためにこのイベントハンドラを削除します
の、次の行ぐらいに放り込めばよさそうだ。

さて、後は、ゲーム開始のタイミングを、画面をクリックしたらにしたいんだけど
クリック・タップできるようにする」等で変数を変更し、
ゲーム部分をifで囲めばいいかと思ったけど、これはダメのようです。
他にそれらしいサンプルを探してみます。

うーん、ダウンロードできるサンプルは軒並み複雑で
私には読み解けそうにありません。

Hopping Witch」も難しいなあ。
シーンを切り替える」あたりかなと思ったけど
私にはちょっと読み解けなかったです。

逆引きじゃないリファレンスで、g.game.pushScene()を検索するもヒットせず。
このリファレンスはどう使うものなのかな。
クリックでゲーム開始とか、ウェイトを入れてとか
わかりやすいサンプルが欲しいよね・・・
単体のサンプルじゃなくて
Hello World」にスタートボタンをを追加するとか
スタートのカウントダウンを追加する、みたいなサンプルが欲しいですね。

あと、クイズゲームのサンプルとか欲しいっすね。

今日から始めるニコ生ゲーとかいう配信を見つけたので、見てみる。
サンプルカタログなるページがあるらしい。
が、欲しいパーツは見つからなかった。

まあ気が向いたら、もうちょっと調べてみるか公式さんに聞いてみることにして
とりあえず完成にしとく。
公式さんに教えてもらって、作れるようになりました!
 詳しくはこちら

念頭に「わからない」が真っ先に来るようになったら
どんなに頑張っても「わからない」のループだからね。

というわけで、アツマールに投稿してテスト。
よしよし、動てる動いてる。
しかしどうやら、連打してると、スコアボードが開いても
見る前にクリックで閉じてしまう事案が発生w
スコアを表示するボタンくらいは配置しておこう。
さすがにこれは「クリック・タップできるようにする」でできるやろ。

・・・できた。(良かった)
このボタンは、最初から設置しておいてもよさそうだけど
一応、タイマーが止まってから表示することにしよう。



//このゲームのmain.js
//-----------------------
exports.main = void 0;
function main(param) {
    var scene = new g.Scene({
        game: g.game,
        // このシーンで利用するアセットのIDを列挙し、シーンに通知します
assetIds: ["player", "shot", "switch", "se"]
    });
    var time = 10; // 制限時間
    if (param.sessionParameter.totalTimeLimit) {
        time = param.sessionParameter.totalTimeLimit; // セッションパラメータで制限時間が指定されたらその値を使用します
    }
//---------------------------------------------------
// 任意に追加した変数
var wawa = 0;//ハートが飛ぶ方向
//---------------------------------------------------
    // 市場コンテンツのランキングモードでは、g.game.vars.gameState.score の値をスコアとして扱います
    g.game.vars.gameState = { score: 0 };
    scene.onLoad.add(function () {
        // ここからゲーム内容を記述します
//---------------------------------------------------
        // 各アセットオブジェクトを取得します
        var playerImageAsset = scene.asset.getImageById("player");
        var shotImageAsset = scene.asset.getImageById("shot");
        var swImageAsset = scene.asset.getImageById("switch");
        var seAudioAsset = scene.asset.getAudioById("se");
//---------------------------------------------------
        // フォントの生成
        var font = new g.DynamicFont({
            game: g.game,
            fontFamily: "sans-serif",
            size: 48
        });
//---------------------------------------------------
// 背景
var bg = new g.FilledRect({
scene: scene,
cssColor: "#CCFFFF",
x: 0,
y: 0,
width: g.game.width,
height: g.game.height
});
scene.append(bg);
//---------------------------------------------------
//ゲームの説明
var label = new g.Label({
scene: scene,
font: font,
text: "画面をクリックせよ!",
textAlign: "center",
width: g.game.width,
widthAutoAdjust: false,
fontSize: 32,
x: 0,
y: g.game.height/1.5
});
scene.append(label);
scene.setTimeout(function() {
  // 約10秒後に行う処理
scene.remove(label); //メッセージを消す
}, 9990);
//---------------------------------------------------
        // プレイヤーを生成します
        var player = new g.Sprite({
            scene: scene,
            src: scene.asset.getImageById("player"),
            width: playerImageAsset.width,
            height: playerImageAsset.height
        });
        // スコア表示用のラベル
        var scoreLabel = new g.Label({
            scene: scene,
            text: "SCORE: 0",
            font: font,
            fontSize: font.size / 2,
            textColor: "black"
        });
        scene.append(scoreLabel);
        // 残り時間表示用ラベル
        var timeLabel = new g.Label({
            scene: scene,
            text: "TIME: 0",
            font: font,
            fontSize: font.size / 2,
            textColor: "black",
            x: 0.65 * g.game.width
        });
        scene.append(timeLabel);
        // プレイヤーの初期座標を、画面の中心に設定します
        player.x = (g.game.width - player.width) / 2;
        player.y = (g.game.height - player.height) / 2;
        player.onUpdate.add(function () {
            // 毎フレームでY座標を再計算し、プレイヤーの飛んでいる動きを表現します
            // ここではMath.sinを利用して、時間経過によって増加するg.game.ageと組み合わせて
            //player.y = (g.game.height - player.height) / 2 + Math.sin(g.game.age % (g.game.fps * 10) / 4) * 10;
            // プレイヤーの座標に変更があった場合、 modified() を実行して変更をゲームに通知します
           // player.modified();
        });
        scene.append(player);
        // 画面をタッチしたとき、
        scene.onPointDownCapture.add(function () {
            // 制限時間以内であればタッチ1回ごとにSCOREに+1します
            if (time > 0) {
                g.game.vars.gameState.score++;
                scoreLabel.text = "SCORE: " + g.game.vars.gameState.score;
                scoreLabel.invalidate();
            }
            seAudioAsset.play();//SEを鳴らします
            // プレイヤーが発射する弾を生成します
var wawa = Math.floor(g.game.random.generate() * 8);//0以上8未満の整数を変数wawaに取得
            var shot = new g.Sprite({
                scene: scene,
                src: shotImageAsset,
                width: shotImageAsset.width,
                height: shotImageAsset.height
            });
            // 弾の初期座標を、プレイヤーの少し右に設定します
shot.x = player.x + player.width / 2 -20;
shot.y = player.y + player.height / 2;
            shot.onUpdate.add(function () {
                // 毎フレームで座標を確認し、画面外に出ていたら弾をシーンから取り除きます
                if (shot.x > g.game.width)
                    shot.destroy();
//---------------------------------------------------
                // 弾の動きを表現します
if (wawa == 0) {
shot.x += 10;//変数wawaが0の弾は右へ移動
}
if (wawa == 1) {
shot.x += -10;//変数wawaが1の弾は左へ移動
}
if (wawa == 2) {
shot.y += 10;//変数wawaが2の弾は下へ移動
}
if (wawa == 3) {
shot.y += -10;//変数wawaが3の弾は上へ移動
}
if (wawa == 4) {
shot.y += -10;//変数wawaが4の弾は右上へ移動
shot.x += 10;
}
if (wawa == 5) {
shot.y += -10;//変数wawaが5の弾は左上へ移動
shot.x += -10;
}
if (wawa == 6) {
shot.y += 10;//変数wawaが6の弾は右下へ移動
shot.x += 10;
}
if (wawa == 7) {
shot.y += 10;//変数wawaが0の弾は左下へ移動
shot.x += -10;
}
//---------------------------------------------------
                // 変更をゲームに通知します
                shot.modified();
            });
            scene.append(shot);
        });
        var updateHandler = function () {
            if (time <= 0) {
                // ゲームアツマール環境であればランキングを表示します
                if (param.isAtsumaru) {
                    var boardId_1 = 1;
                    window.RPGAtsumaru.experimental.scoreboards.setRecord(boardId_1, g.game.vars.gameState.score).then(function () {
                        window.RPGAtsumaru.experimental.scoreboards.display(boardId_1);
                    });
                }
                scene.onUpdate.remove(updateHandler); // カウントダウンを止めるためにこのイベントハンドラを削除します
//---------------------------------------------------
//ゲームが終わったので、リセットを促すテキストを表示
var label = new g.Label({
scene: scene,
font: font,
text: "おしまーい、リロードしてね",
textAlign: "center",
width: g.game.width,
widthAutoAdjust: false,
fontSize: 32,
x: 0,
y: g.game.height/1.5,
});
scene.append(label);
//ボタンを押すとランキング表示
var sw = new g.Sprite({
  scene: scene,
  src: scene.asset.getImageById("switch"), 
x: 0,
y: g.game.height-48,
touchable: true
});
scene.append(sw);
sw.onPointDown.add(function(e) {
                        window.RPGAtsumaru.experimental.scoreboards.display(boardId_1);
});
//---------------------------------------------------
            }
            // カウントダウン処理
            time -= 1 / g.game.fps;
            timeLabel.text = "TIME: " + Math.ceil(time);
            timeLabel.invalidate();
        };
        scene.onUpdate.add(updateHandler);
        // 
        // 
        // 
        // ここまでゲーム内容を記述します
        // 
        // 
        // 
        // 
    });
    g.game.pushScene(scene);
}
exports.main = main;

拍手[0回]

PR
この記事にコメントする
name
title
color
mail
URL
comment
pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
secret (チェックを入れると管理人だけに表示できます)
広告枠
アクセス解析

ATOM  
ATOM 
RSS  
RSS 


ソフトウェア制作講座





Copyright ©   YUWAKA'S SOFT   All Rights Reserved
Design by MMIT / TemplateB3  Powered by NINJA TOOLS
忍者ブログ [PR]