雷撃の記憶

非常に不親切な備忘録

beatoraja リザルトスキン制作日記 レート差分の表示

■レートの差分計算

beatorajaのSkinProperty(valueのrefで数字を指定する時に使うID一覧)には、自分が確認した範囲では自己ベスト(以降「ベスト」)と今回のスコア(以降「カレント」)のレートの差」を返すものは存在しない。

102:NUMBER_SCORE_RATE
103:NUMBER_SCORE_RATE_AFTERDOT(小数点以下2桁)
183:NUMBER_BEST_RATE
184:NUMBER_BEST_RATE_AFTERDOT

の4つを使って、どうにか差分を計算するコードを組めたので、考え方も含めてここにメモしておく。

もし直接取得する方法があったら泣く。

■前提となる機能

beatorajaには、実行中のゲームの状態から特定の数値を求めることの出来る仕組みが存在する。

github.com

local main_state = require("main_state")
と、モジュールmain_stateを最初の方で読み込んでおけば、これを利用してrefを使わずにvalueに整数値を設定したり、textに文字列を指定することが出来る。
refで実装できる値の場合はそちらの方が軽いので、わざわざこの方法を用いる必要はない。

これを利用して、102,103,183,184の数値を取得し、引き算を行うことで、レートの差分を表示しようという算段である。

ただ、この機能は効率が悪いとMainStateAccessor.javaに書いてあるため、呼び出し回数が少なくなるように工夫する(おそらく数値1つ辺り1回で大丈夫?)

また、当然ながらこの4つはそれぞれ2桁の整数で提供される。valueの表示の時に小数点が発生すると面倒なので、整数部分と小数部分で分けて表示するようにコードを書いてみた。

■実際の手順

まず、差分を計算するために、以下のような手順を踏むことにする。

・ベスト、カレントの整数部分を取得し、100倍する。
・ベスト、カレントの小数部分を取得する。
・ベスト同士、カレント同士で足す。これでレートを100倍して整数になったベストとカレントが出来る。
・100倍になったベストとカレント同士を引き算する。
・引き算した結果を絶対値の形にする(マイナス符号が発生した場合に取り除く)
・4桁の整数である引き算の結果を、本来の整数部分(上2桁)と本来の小数部分(下2桁)に分け、変数に格納する。
valueで数値を定義し、destinationで表示して終わり

■実際のコード

諸々の計算をやってもらう関数はmainの外に出しておく。

--レート差分計算の関数

--1000の位と100の位のみを抽出し、2桁の整数として格納する
local function Rate_spliter01(number)
    local thousands = math.floor(number / 1000)
    local hundreds = math.floor((number % 1000) / 100)
    return (thousands*10) + hundreds
end

--10の位と1の位のみを抽出し、2桁の整数として格納する
local function Rate_spliter02(number)
    local tens = math.floor((number % 100) / 10)
    local ones = math.floor(number % 10)
    return (tens*10) + ones
end

--絶対値計算用関数
function calculateAbsoluteValue(number)
    if number < 0 then   
    --自己べ-カレントがマイナス = 自己べを更新している
        return -number

    elseif number > 0 then 
    --自己べ-カレントがプラス = 自己べが更新できていない
        return number

    else
    --プラスでもマイナスでもない = 0 
        return 0
    end
end

--main_stateモジュール読み込み
local main_state = require("main_state")

main()関数の初めの方で、今回使う変数を定義する。
あらかじめ書いておいた関数に引数を渡して返り値をもらうだけ。

 --レート差計算の変数定義
    --ベストスコア
    local BEST_RATE_2 = main_state.number(183)*100 + main_state.number(184)
    --カレントスコア
    local CURRENT_RATE_INT_2 = main_state.number(102)*100 + main_state.number(103)
        --差
    local DIFF_RATE_2     = calculateAbsoluteValue(BEST_RATE_2 -  CURRENT_RATE_INT_2)    
    --差を格納
    local DIFF_RATE_BIG = Rate_spliter01(DIFF_RATE_2)
    local DIFF_RATE_SMALL=Rate_spliter02(DIFF_RATE_2)

skin.valueには以下のように定義しておく。

skin.value{
    --私のスキンでは本来文字色を分けているが、今回は黄色のvalueのみ
        {id = "DIFF_RATE_INT_YELLOW" , src="src_number_2",x = 0, y = 0, w = 350, h = 50, divx = 10 , digit = 3 
        , value = function()
        return DIFF_RATE_BIG
        end
        ,align = 0},
        
        
        {id = "DIFF_RATE_AD_YELLOW"  , src="src_number_2",x = 0, y = 0, w = 350, h = 50, divx = 10 , digit = 2 
        , value = function()
        return DIFF_RATE_SMALL
        end
        ,align = 0,padding = 1},
    
}

■結果

ちゃんと計算できてる

■参考元

github.com

github.com