介绍

在 11 中,我们添加了选项模式。
这次我想加个排名。

关于排名

我们将使从标题屏幕进入排名屏幕并在那里检查排名成为可能。
基本上,它将与添加最后一个选项屏幕相同。

[过渡图像]
ブラウザゲームを作ってみよう(その12:サンプルゲーム作成その5)

我们使用本地存储来存储排名。

使用本地存储

基本上,只要记住数据的存储、检索和删除这三种类型,就可以应付。

保持
您可以使用 localStorage.setItem( 'key', 'val' ) 或 localStorage.key= 'val' 保存。

localStorage.js
localStorage.setItem( 'key', 'val' );
localStorage.saveKey = 'val';

获得
您可以使用 localStorage.getItem('key') 或 localStorage.key 获取值。

localStorage.js
var val1 = localStorage.getItem( 'key' );
var val2 = localStorage.key;

删除
使用 localStorage.removeItem( 'key' ) 删除特定键的值,
您可以使用 localStorage.clear() 删除所有数据。

localStorage.js
localStorage.removeItem( 'key' );
localStorage.clear();

源代码

首先,添加处理初始化本地存储,并在游戏开始时读取排名数据。
源代码如下。

本地存储初始化、保存、加载

// 変数
var localScores = new Array();
var localRankinPos;     // ゲーム後のローカルランキングの順位(1以上:順位、-1:ランク外、-2:オプション設定が初期値ではないため保存無し)

function init(){
{
    // ローカルランキングスコア取得
    localScores = localStorage.scores;
    if( localScores == null ){
        // 保存されていない場合は初期化して保存
        localScores = new Array( 5 );
        for( var i=0; i<localScores.length; i++ ){
            localScores[i] = 0;
        }
        localStorage.scores = localScores;
    } else {
        localScores = localScores.split( ',' );
    }
}

■ 实施要点

  • 如果没有数据,则从本地存储读取并设置初始值
  • 如果数据已经存在,则设置为变量
    * 虽然保存为数组,但实际上是本地存储内部的字符串,所以读取后必须转换为数组变量。

接下来,标题画面的源代码如下。

标题画面

// タイトル画面ループ
function titleMainLoop()
{
    drawText( "コインゲット", 0, 20, '#000000', 12, TEXT_HCENTER );


    drawText( "ゲーム開始", 0, SC_H - 100, '#000000', 12, TEXT_HCENTER );
    drawText( "オプション", 0, SC_H - 70, '#000000', 12, TEXT_HCENTER );
    drawText( "ローカルランキング", 0, SC_H - 40, '#000000', 12, TEXT_HCENTER );

    if( keyTrg == KEY_UP ){
        cursorNum--;
        if( cursorNum < 0 ) cursorNum = 0;
    }
    if( keyTrg == KEY_DOWN ){
        cursorNum++;
        if( cursorNum > 2 ) cursorNum = 2;
    }
    // 選択カーソル表示
    if( cursorNum == 0 ){
        drawFill( 100, SC_H - 98, 12, 12, 0x0000FF, null );
        drawFill( 188, SC_H - 98, 12, 12, 0x0000FF, null );

    } else if( cursorNum == 1 ){
        drawFill( 100, SC_H - 68, 12, 12, 0x0000FF, null );
        drawFill( 188, SC_H - 68, 12, 12, 0x0000FF, null );

    } else if( cursorNum == 2 ){
        drawFill( 78, SC_H - 38, 12, 12, 0x0000FF, null );
        drawFill( 208, SC_H - 38, 12, 12, 0x0000FF, null );

    }

    if( keyTrg == KEY_SPACE ){
        if( cursorNum == 0 ){
            gameInit();  // ゲーム画面初期化へ
        } else if( cursorNum == 1 ){
            optionInit();  // オプション画面初期化へ
        } else if( cursorNum == 2 ){
            localRankingInit();  // ローカルランキング画面初期化へ
        }
    }
}

■ 积分

  • 基本上与之前的选项画面添加相同的修改。

接下来,排名画面的源码如下。

排名画面
// ローカルランキング画面ループ
function localRankingMainLoop()
{
    drawText( "ローカルランキング", 0, 15, '#000000', 16, TEXT_HCENTER );

	for( var i=0; i<localScores.length; i++ ){
		drawText( ""+(i+1)+"", (SC_W >> 1) - 100, 50+(i*30), '#000000', 12, TEXT_NONE );
		drawText( ""+localScores[i]+"", (SC_W >> 1) + 50, 50+(i*30), '#000000', 12, TEXT_NONE );
	}

	if( keyTrg == KEY_SPACE ){
        titleInit();	// タイトル初期化へ
	}
}

■ 积分

  • 由于“localScores”变量包含5个排名数据,它们按顺序显示。

接下来,将反映排名数据并显示结果。

排名数据反映,结果展示

// ゲーム結果画面初期化
function resultInit()
{
    localRankinPos = -2;

    if( updateLife == initLife &&
        updateCoinChangeScore == initCoinChangeScore &&
        updateCoinShowNumScore == initCoinShowNumScore &&
        updateCoinShowNum == initCoinShowNum ){

            localRankinPos = saveLocalRanking( score );
    }

    gameState = 2;    // ゲーム結果画面ループへ
}

// ゲーム結果画面ループ
function resultMainLoop()
{
    // ローカルランキングのランクイン状態表示
    if( localRankinPos == -2 ){
        drawText( "オプションが変更されているためランキング保存されません", 0, 70, '#000000', 10, TEXT_HCENTER );

    } else if( localRankinPos == -1 ){
        drawText( "ランク外でした", 0, 70, '#000000', 10, TEXT_HCENTER );

    } else {
        drawText( ""+localRankinPos+"位」にランクインしました", 0, 70, '#000000', 10, TEXT_HCENTER );

    }
}

//-----------------------------------------------------------
//    saveLocalRanking : ローカルランキング保存
//                引数 : 保存データ
//              戻り値 : データ保存位置(-1で保存無し)
//-----------------------------------------------------------
function saveLocalRanking( saveData )
{
	var savePos = -1;		// データ保存位置
	var i;

	// データの挿入位置をチェック
	for( i=0; i<localScores.length; i++ ){
		if( saveData > localScores[i] ){
			savePos = i;
			break;
		}
	}

	if( savePos != -1 ){	// ランクインした時のみローカルストレージに保存
		for( i=localScores.length-1; i>savePos; i-- ){
			localScores[i] = localScores[i-1];	// データを1つずらす
		}
		localScores[savePos] = saveData;
        localStorage.scores = localScores;
		savePos++;
	}

	return savePos;
}

■ 积分

  • 仅在选项设置未更改时应用排名数据
  • 您是否在结果屏幕中排名?显示

样本更新

下面是一个反映所有这些变化的例子。

看笔Qiita23_sample01通过野岛(@noji505) 上代码笔.

请尝试排名是否保存。

在最后

这一次,我可以使用本地存储来保存排名。
我认为有一些场景可以在web系统上使用本地存储,所以我认为值得了解。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308632013.html

相关文章: