請注意這是「NVL 3.55繁體中文」的修改方式
文字都嵌在底圖中,並且修改離開遊戲、返回主選單、存檔、讀檔四個地方的詢問視窗
其他版本的寫法可能略有不同,以下教學僅供參考
之所以將文字都嵌在圖中是因為改字型很麻煩的關係~"~
(我改了幾次都不成功,不喜歡系統預設的字型啊~!索性將字都嵌進圖裡...XD)
個人程式底子也沒有說很好,以下修改方式僅供參考XDDDD
另外3.07版可以參考翔嵐的的分享與教學XDDD
修改確認視窗方法(YesNoDialog)需要改幾個檔案&準備一些png圖檔
(圖檔檔名僅供參考,可以隨自己高興命名,不過程式裡要統一名稱喔~)
-------------------------------------------------------------------------------------------------------
nvl資料夾內的MySaveLoadFunction.tjs
system資料夾內的YesNoDialog.tjs
另外準備幾張確認視窗(YesNoDialog)的底圖
由於這版不支援透明度設定,所以不要拿半透明的底圖過來喔~!
check_BG_exit(詢問是否要離開遊戲)
check_BG_title(詢問是否要返回主選單)
check_BG_load(詢問是否要讀檔)
check_BG_save(詢問是否要存檔)
check_BG(一般泛用底圖,上頭沒有字)
check_b_y-1、check_b_y-2、check_b_y-3(yes按鈕,點選前、點選中、點選後)
check_b_n-1、check_b_n-2、check_b_n-3(no按鈕,點選前、點選中、點選後)
按鈕你共用同一張,或是三張都不同,看個人需求
-------------------------------------------------------------------------------------------------------
●步驟一,修改nvl資料夾內的MySaveLoadFunction.tjs
搜尋「詢問文字」,可以找到四個地方
保存詢問文字、讀取詢問文字、返回標題詢問文字、退出詢問文字
前兩個和存檔相關的,預設是讀取檔名變數,再顯示在詢問視窗上
因為我不想讓它顯示檔名(有時檔名太長會超出我的底圖框...)
所以全部註解掉,只保留prompt的內容
《存檔部分》
//if(num < numBookMarks) prompt += (num + 1);
//if(bookMarkDates[num] != "") // bookMarkDates 空文字場合刊存在
//prompt += "\n將「" + bookMarkNames[num] + "」";
//prompt += "\n保存為「"+ pcflags.currentPageName + "」嗎?";
prompt += "請問確定要存檔嗎?";
askYesNo(prompt, "確認", saveBookMark, kag.process(,"*刷新畫面"), num, SaveUpDate);
《讀檔部分》
//if(num < numBookMarks) prompt += (num + 1);
//prompt += "\n讀取存檔「"+ bookMarkNames[num] + "」嗎?";
prompt += "請問確定要讀檔嗎?";
askYesNo(prompt, "確認", loadBookMark, void, num, kag.process(,"*刷新畫面"));
《返回標題部分》
askYesNo("確定要返回主選單嗎?", "確認", goToStart);
《關閉遊戲部分》
if (currentDialog === void) {
askYesNo("確定要離開遊戲嗎?", "確認", onCloseYes);
改完了!主要就是改成底下這四句XDDDD
----------------------------------------
請問確定要存檔嗎?
請問確定要讀檔嗎?
確定要返回主選單嗎?
確定要離開遊戲嗎?
----------------------------------------
設定用程式顯示詢問文字的情況下,想修改詢問文字的話,主要也是改這裡
不過記得之後YesNoDialog.tjs裡的句子也要跟著一起改才對應得到喔~!
●步驟二,修改system資料夾內的YesNoDialog.tjs
將以下代碼剪下然後整個蓋過YesNoDialog.tjs的內容XD
可修改處我用顏色標起來了,紅色字是我這個版本要修改的地方
藍色字是如果你想用系統顯示字的話再寫就好了
-----------------------------------------------------------------------------------------
// YesNoDialog.tjs - はい/いいえを選択するダイアログボックス
// Copyright (C)2001-2006, W.Dee and contributors 改変・配布は自由です
class YesNoDialogWindow extends Window
{
var yesButton; // [はい] ボタン
var noButton; // [いいえ] ボタン
var result = false; // no:false yes:true
//添加臨時層
var tempLayer;
property temporaryLayer
{
// ワークエリアとして一時的に使用できるレイヤを返す
getter()
{
if(tempLayer === void)
{
tempLayer = new KAGLayer(this, primaryLayer);
tempLayer.name = "一時ワークレイヤ";
}
return tempLayer;
}
}
function YesNoDialogWindow(message, cap)
{
super.Window();
// メインウィンドウから cursor**** の情報をとってくる
if(global.Window.mainWindow !== null &&
typeof global.Window.mainWindow.cursorDefault != "undefined")
this.cursorDefault = global.Window.mainWindow.cursorDefault;
if(global.Window.mainWindow !== null &&
typeof global.Window.mainWindow.cursorPointed != "undefined")
this.cursorPointed = global.Window.mainWindow.cursorPointed;
// 外見の調整
borderStyle = bsNone;
innerSunken = false;
caption = cap;
// プライマリレイヤの作成
add(new Layer(this, null));
// プライマリのマウスカーソルを設定
if(typeof this.cursorDefault !== "undefined")
primaryLayer.cursor = cursorDefault;
//不同詢問窗口的底圖,底下這幾句要和MySaveLoadFunction.tjs改的內容相同才對應得到喔!
if (message=="確定要離開遊戲嗎?")
primaryLayer.loadImages("check_BG_exit"); // 詢問離開遊戲的底圖
else if (message=="確定要返回主選單嗎?")
primaryLayer.loadImages("check_BG_title"); // 詢問回主選單的底圖
else if (message=="請問確定要讀檔嗎?")
primaryLayer.loadImages("check_BG_load"); // 詢問讀檔的底圖
else if (message=="請問確定要存檔嗎?")
primaryLayer.loadImages("check_BG_save"); // 詢問存檔的底圖
else
primaryLayer.loadImages("check_BG"); // 其他泛用底圖(無字)
primaryLayer.setSizeToImageSize();
// 文字樣式設定
primaryLayer.font.face="微軟正黑體"; //文字字型,如果有要用程式顯示詢問文字可修改這裡
primaryLayer.font.height=22; //文字大小,如果有要用程式顯示詢問文字可修改這裡
var tw = primaryLayer.font.getTextWidth(message);
var th = primaryLayer.font.getTextHeight(message);
// サイズを決定
var max_tw = 0;
var sum_th = 0;
var messages = message.split('\n');
for (var i=0; i < messages.count; i++)
{
var lw = primaryLayer.font.getTextWidth(messages[i]);
var lh = primaryLayer.font.getTextHeight(messages[i]);
if (lw > max_tw)
max_tw = tw;
sum_th += lh + 0; // 行間が必要なら+0より大きくする
}
tw = max_tw;
th = sum_th;
var w =primaryLayer.width;
var h = primaryLayer.height;
setInnerSize(w, h);
primaryLayer.width = w;
primaryLayer.height = h;
// ウィンドウ位置の調整(視窗位置調整,預設是自動置中,想自己設定也可以XD)
if(global.Window.mainWindow !== null && global.Window.mainWindow isvalid)
{
var win = global.Window.mainWindow;
var l, t;
l = ((win.width - width)>>1) + win.left;
t = ((win.height - height)>>1) + win.top;
if(l < 0) l = 0;
if(t < 0) t = 0;
if(l + width > System.screenWidth) l = System.screenWidth - width;
if(t + height > System.screenHeight) t = System.screenHeight - height;
setPos(l, t);
}
else
{
setPos((System.screenWidth - width)>>1, (System.screenHeight - height)>>1);
}
// message文字的描繪
//(以下這段由於我沒有讓系統顯示詢問文字,所以全部註解掉了)
//如果要使用的話把前面的「//」給拿掉就好
//另外這版本是只讓離開遊戲&返回主選單「之外」的詢問文字用程式顯示喔
//連這兩個視窗都要用程式顯示詢問文字的話請自行將if判斷式拿掉0.0/
//另外message要和之前MySaveLoadFunction.tjs改的文字內容相同才對應的到喔
//var msgpos_y = 60;
//if (message!="確定要離開遊戲嗎?" && message!="確定要返回主選單嗎?")
//{
// for (var i=0; i < messages.count; i++)
// {
// var lw = primaryLayer.font.getTextWidth(messages[i]);
// var lh = primaryLayer.font.getTextHeight(messages[i]);
// var msgpos_x = (w - lw)\2;
// primaryLayer.drawText(msgpos_x, msgpos_y+50, messages[i],0xFFFFFF); //文字位置調整
// msgpos_y += lh + 10; // 調整行間距
// }
//}
// Yes按鈕的設定
add(yesButton = new ButtonLayer(this, primaryLayer));
yesButton.loadButtons("check_b_y-1.png","check_b_y-2.png","check_b_y-3.png"); //確認按鈕的圖片
yesButton.top = 170; //調整按鈕顯示位置(X軸)
yesButton.left = 95; //調整按鈕顯示位置(Y軸)
yesButton.visible = true;
// Noボタン
add(noButton = new ButtonLayer(this, primaryLayer));
noButton.loadButtons("check_b_n-1.png","check_b_n-2.png","check_b_n-3.png"); //取消按鈕的圖片
noButton.top = 170; //調整按鈕顯示位置(X軸)
noButton.left = 205 ; //調整按鈕顯示位置(Y軸)
noButton.visible = true;
}
function finalize()
{
super.finalize(...);
}
function action(ev)
{
// action
if(ev.type == "onClick")
{
if(ev.target == yesButton)
{
result = true;
close();
}
else if(ev.target == noButton)
{
result = false;
close();
}
}
else if(ev.type == "onKeyDown" && ev.target === this)
{
// パッド入力に対応する処理
switch(ev.key)
{
case VK_PADLEFT:
yesButton.focus();
break;
case VK_PADRIGHT:
noButton.focus();
break;
case VK_PAD1:
if(focusedLayer == yesButton)
{
result = true;
close();
}
else if(focusedLayer == noButton)
{
result = false;
close();
}
break;
case VK_PAD2:
result = false;
close();
break;
}
}
}
function onKeyDown(key, shift)
{
super.onKeyDown(...);
if(key == VK_ESCAPE)
{
// ESC キーが押された
// 「いいえ」として処理
result = false;
close();
}
}
}
// Yes か No かはっきりさせる関數
function askYesNo(message, caption = "確認", yesFunc=void, noFunc=void, param=void, doneFunc=void)
{
var win = new YesNoDialogWindow(message, caption);
win.showModal();
var res = win.result;
invalidate win;
if (res) {
if (yesFunc !== void) {
yesFunc(param);
}
} else {
if (noFunc !== void) {
noFunc(param);
}
}
if (doneFunc !== void) {
doneFunc(param);
}
}
-----------------------------------------------------------------------------------------
●其他補充,關於以程式顯示詢問文字
補充一下,關於以程式顯示詢問文字
主要是system資料夾內的YesNoDialog.tjs裡底下這一段(剛剛上面被我註解掉的)
if (message!="確定要離開遊戲嗎?" && message!="確定要返回主選單嗎?")
這句話代表『當訊息非"確定要離開遊戲嗎?"以及"確定要返回主選單嗎?"時,執行以下語法』
翻得更白話一點,也就是說「離開遊戲&返回主選單之外的詢問視窗都用程式顯示詢問文字」
如果要取消掉返回主選單的限制條件,改成也用程式顯示訊息文字
只要改成把它的判斷式拿掉就好了,也就是以下這條
if (message!="確定要離開遊戲嗎?")
相反的如果要增加判斷式,就是在括號裡再多加個&& message!="詢問文字內容"
存檔訊息和讀檔訊息有檔名變數的,可能不能直接填入"詢問文字內容"中,詳細的這裡暫且不提
當然像我寫的那樣整個註解掉的話,所有詢問視窗就不會顯示任何訊息文字,全都要嵌在圖裡了
底圖部分就看上面那段「//不同詢問窗口的底圖」底下那幾行嘍
改的方法很類似,自己研究吧XDD
沒有對應到+也不去特別設定的話,一律都是用「primaryLayer.loadImages("check_BG"); // 其他泛用底圖(無字)」這個來顯示
其他像是『是否要覆蓋檔案』、『是否要XXX』其他的詢問視窗,由於這版的NVL沒有特別設定的樣子,也不會顯示詢問視窗
這裡就不多提了XDDDDDDD
請自己去試吧XDDDD