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

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

サンプルに毛が生えただけの処女作がこちら

そしてついに、オリジナルのミニゲーム作ったよ!
15秒間に動くハートに何回タッチできたかを
ランキングで競うゲームだよ!

ハートにタッチ」遊んでね!

ユーフルカさんの各種素材をお借りました。
ありがとうございます。

処女作でできなかったタイトルの演出は、結局自力では無理と判断して
公式さんに教えてもらったので、ばっちりです!

方法はとても簡単だったけど、私は可能性から除外していた方法だったので
目からうろこが落ちました。

定期的に処理を実行する、を使えばよかったのでした。

一応、機能確認で命令文自体は試していましたが、使い方が違っていたのでした。
321とカウントしてゲームを開始する具体的な作例は、以下の通り。

scene.setInterval(function () {
   if (残り秒数が 0) {
     // 繰り返し解除
     // ゲーム本編の処理(エンティティ生成など)
   } else {
     // 残り秒数を表示
     // 残り秒数を1減らす
   }
}, 1000); // 1000ミリ秒(1秒)おきに繰り返し処理

とのことで。

クリックしてからカウントを始めるには、もうちょっとひとひねり必要なのですが
私は以下の方法でつくりました。

クリックできるエンティティを作成
上記の秒数をカウントする変数を操作して、カウントを始めるようにする。
else の内容である、秒を減らす処理もif文で制御。

これで、クリック待ちのウエイトや、開始のカウントダウンのウェイトができました。
公式さんありがとうございました。

スクリプトの勉強せずに作れるのはここまでかな。
基本的な命令文だけでもアイデア次第で色々作れそうなので
もし興味を持ったら、とりあえずチャレンジしてみてね。

//このゲームのmain.js
//-----------------------
exports.main = void 0;
function main(param) {
    var scene = new g.Scene({
        game: g.game,
        // このシーンで利用するアセットのIDを列挙し、シーンに通知します
assetIds: ["player", "shot", "switch", "start", "se", "se2", "se3", "se4", "se5", "bgm1"]
    });
//---------------------------------------------------
    var time = 15; // 制限時間
    if (param.sessionParameter.totalTimeLimit) {
        time = param.sessionParameter.totalTimeLimit; // セッションパラメータで制限時間が指定されたらその値を使用します
    }
//---------------------------------------------------
    // 市場コンテンツのランキングモードでは、g.game.vars.gameState.score の値をスコアとして扱います
    g.game.vars.gameState = { score: 0 };
    scene.onLoad.add(function () {
        // ここからゲーム内容を記述します
//---------------------------------------------------
//自分用に作った変数の初期値。(function()で囲われた場所以外だと上手く動作しないので注意。
var kaisi=4;//タイトルからゲーム開始までを制御する
var wawa=10;//ハートのy軸の動くスピード
var papase=0;//パパの声援制御
//---------------------------------------------------
        // 各アセットオブジェクトを取得します
        var playerImageAsset = scene.asset.getImageById("player");
        var shotImageAsset = scene.asset.getImageById("shot");
        var swImageAsset = scene.asset.getImageById("switch");
        var startImageAsset = scene.asset.getImageById("start");
        var seAudioAsset = scene.asset.getAudioById("se");
        var se2AudioAsset = scene.asset.getAudioById("se2");
        var se3AudioAsset = scene.asset.getAudioById("se3");
        var se4AudioAsset = scene.asset.getAudioById("se4");
        var se5AudioAsset = scene.asset.getAudioById("se5");
        var bgm1AudioAsset = scene.asset.getAudioById("bgm1");
//---------------------------------------------------
var bgmPlayer = scene.asset.getAudioById("bgm1").play();//BGM演奏開始
bgmPlayer.changeVolume(0.5);//BGM音量変更
//---------------------------------------------------
        // フォントの生成
        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 player2 = new g.Sprite({
            scene: scene,
            src: scene.asset.getImageById("shot"),
anchorX: 0.5,//中心
anchorY: 0.5,//中心
x: g.game.width / 2,
y: g.game.height / 2,
scaleX: 2,   // 横方向に 2 倍拡大する
scaleY: 2,   // 縦方向に 2 倍拡大する
        });
        scene.append(player2);
//ゲームの説明
var label = new g.Label({
scene: scene,
font: font,
text: "ハートにタッチ!",
textAlign: "center",
width: g.game.width,
widthAutoAdjust: false,
fontSize: 32,
x: 0,
y: 80
});
scene.append(label);
//スタートボタン配置
var sw = new g.Sprite({
  scene: scene,
  src: scene.asset.getImageById("start"), 
anchorX: 0.5,//中心
anchorY: 0.5,//中心
x: g.game.width/2,
y: 270,
touchable: true
});
scene.append(sw);
sw.onPointDown.add(function(e) {
kaisi=3;//カウントダウン開始
scene.remove(sw); // シーンから削除する
});
//------------------------------------------ここまでタイトル
//毎秒並列処理する命令で、3秒間カウントダウンをテキストで表示し
//変数kaisiが0になったら、並列処理を解除して、ゲーム本体を開始する。
//カウントダウンの処理は、一番下。
var intervalId = scene.setInterval(function() {
  // 1 秒毎に行う処理
if(kaisi==0) {
scene.clearInterval(intervalId); // scene.setIntervalで作成した定期処理を解除
//------------------------------------------------ここからゲーム本編
        // プレイヤーを生成します
        var player = new g.Sprite({
            scene: scene,
            src: scene.asset.getImageById("shot"),
x: g.game.width / 2,
y: g.game.height / 2,
anchorX: 0.5,//中心
anchorY: 0.5,//中心
scaleX: 2,   // 横方向に 2 倍拡大する
scaleY: 2,   // 縦方向に 2 倍拡大する
touchable: true // 触れられるオブジェクトにする
        });
        scene.append(player);
//プレイヤーをタッチした時の動作
player.onPointDown.add(function(e) {
            seAudioAsset.play();//SEを鳴らします
            // 制限時間以内であればタッチ1回ごとにSCOREに+1します
            if (time > 0) {
                g.game.vars.gameState.score++;
                scoreLabel.text = "SCORE: " + g.game.vars.gameState.score;
                scoreLabel.invalidate();
            }
//タッチしたらハートがドクンとするアニメ
player.scaleX =1.5; // 縦方向に  倍拡大する
player.scaleY = 1.5; // 縦方向に 2 倍拡大する
player.modified(); // modified() で表示に反映
scene.setTimeout(function() {  // 約○秒後に行う処理
player.scaleX = 2; // クリックで小さくなったのを戻す
player.scaleY = 2; // 同じく
player.modified(); // modified() で表示に反映
}, 100);
});
//------------------------------------------------
//パパアニメを非表示で作成します。表示や移動は、ハートの移動と同じとこに入ってます。
        var papa = new g.FrameSprite({
            scene: scene,
            src: scene.asset.getImageById("player"),
width: 240,
height: 460,
srcWidth: 240,
srcHeight: 460,
x: g.game.width -200,
y: g.game.height / 6.5,
frames: [0, 0, 0, 0, 1, 1, 1, 1],//フレームインデックス
loop: true,//ループアニメ
hidden: true // 非表示にした状態で生成する
        });
        scene.append(papa);
//------------------------------------------------
        // スコア表示用のラベル
        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.onUpdate.add(function () {
//1秒ごとに動きを変更。ランダムじゃないよ。
if (time <= 15 && time > 14){
player.y += 5;
if (time <= 14 && time > 13){
player.y -= wawa;
player.x = 50;
if (time <= 13 && time > 12){
player.y += wawa;
if (time <= 12 && time > 11){
player.y -= wawa;
player.x = 400;
if (time <= 11 && time > 10){
player.y += wawa;
//------
if (time <= 10 && time > 9){
player.y -= wawa;
player.x = 70;
papa.show();//パパを表示します。
papa.start();//パパアニメ開始
papa.x -= wawa*2;//パパの移動
var label = new g.Label({
scene: scene,
font: font,
text: "おーっと、選手の親御さんが応援に駆けつけた!",
textAlign: "center",
width: g.game.width,
widthAutoAdjust: false,
fontSize: 24,
x: 0,
y: g.game.height/1.4,
});
scene.append(label);
scene.setTimeout(function() {  // 約○秒後に行う処理
scene.remove(label); //メッセージを消す
}, 1000);
if(papase == 0){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
//-----
if (time <= 9 && time > 8){
player.y += wawa;
papa.x += wawa*2;
if(papase == 1){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
if (time <= 8 && time > 7){
player.y -= wawa;
player.x = 300;
papa.x -= wawa*2;
if(papase == 2){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
if (time <= 7 && time > 6){
player.y += wawa;
papa.x += wawa*2;
if(papase == 3){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
if (time <= 6 && time >5){
player.y -= wawa;
player.x = 200;
papa.x -= wawa*2;
if(papase == 4){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
if (time <= 5 && time >4){
player.y += wawa;
papa.x += wawa*2;
if(papase == 5){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
if (time <= 4 && time >3){
player.y -= wawa;
player.x = 500;
papa.x -= wawa*2;
if(papase == 6){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
}
if (time <= 3 && time >2){
player.y += wawa;
papa.x += wawa*2;
if(papase == 7){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
if (time <= 2 && time >1){
player.y -= wawa;
player.x = g.game.width / 2+45;
papa.x -= wawa*2;
if(papase == 8){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
}
if (time <= 1  && time >0){
player.y += wawa/1.5;
papa.x += wawa;
if(papase == 9){//パパの声援
            se4AudioAsset.play();//SEを鳴らします
papase += 1;
}
}
            player.modified();//ハート再描画
            papa.modified();//パパ再描画
        });
//------------------------------------------------
        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); // カウントダウンを止めるためにこのイベントハンドラを削除します
//---------------------------------------------------
//ゲームが終わったので、リセットを促すテキストを表示
            se5AudioAsset.play();//SEを鳴らします
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);
//-------------------------------------------------ここまでゲーム本編
} else {//ここからゲーム開始前のカウントダウンを表示する処理
//-------------------------------------------------
if(kaisi==3){
se2AudioAsset.play();//SEを鳴らします
var label2 = new g.Label({
scene: scene,
font: font,
text: "3",
textAlign: "center",
width: g.game.width,
widthAutoAdjust: false,
fontSize: 48,
x: 0,
y: g.game.height/1.3
});
scene.append(label2);
scene.setTimeout(function() {  // 約○秒後に行う処理
scene.remove(label2); //メッセージを消す
}, 500);
}
//-------------------------------------------------
if(kaisi==2){
            se2AudioAsset.play();//SEを鳴らします
var label2 = new g.Label({
scene: scene,
font: font,
text: "2",
textAlign: "center",
width: g.game.width,
widthAutoAdjust: false,
fontSize: 48,
x: 0,
y: g.game.height/1.3
});
scene.append(label2);
scene.setTimeout(function() {  // 約○秒後に行う処理
scene.remove(label2); //上記メッセージを消す
}, 500);
}
//-------------------------------------------------
if(kaisi==1){
            se2AudioAsset.play();//SEを鳴らします
var label2 = new g.Label({
scene: scene,
font: font,
text: "1",
textAlign: "center",
width: g.game.width,
widthAutoAdjust: false,
fontSize: 48,
x: 0,
y: g.game.height/1.3
});
scene.append(label2);
scene.setTimeout(function() {  // 約○秒後に行う処理
scene.remove(label2); //「上記メッセージを消す
scene.remove(label); //ゲーム説明用のメッセージを消す
}, 500);
scene.setTimeout(function() {  // 約○秒後に行う処理
            se3AudioAsset.play();//SEを鳴らします
scene.remove(player2); // タイトルを飾ってるハートをシーンから削除する
}, 1000);
}//if(kaisi==1)の相方
//-------------------------------------------------
}//elseの相方
//-------------------------------------------------
if(kaisi<=3 && kaisi>0){//スタート前のカウントダウンをしている
kaisi=kaisi-1
}
//-------------------------------------------------
}, 1000);// 1000ミリ秒(1秒)おきに繰り返し処
//-------------------------------------------------
        // 
        // 
        // 
        // 
        // ここまでゲーム内容を記述します
        // 
        // 
        // 
        // 
    });
    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]