2008-5-6 17:22
全局变量D
YesNoDialog.tjs图片窗口版(不支持半透明)
[code]
// 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;
//不同询问窗口的底图
if (message=="是否退出?")
primaryLayer.loadImages("yn_exit_cn");
else if (message=="是否回到开始?")
primaryLayer.loadImages("yn_return_cn");
else
primaryLayer.loadImages("yn_bgd");
primaryLayer.setSizeToImageSize();
// 文字样式设定
primaryLayer.font.face="黑体";
primaryLayer.font.height=28;
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;
// ウィンドウ位置の調整
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文字的描绘
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, messages[i],0xFFFFFF);
msgpos_y += lh + 10; // 调整行间距
}
}
// Yesボタン
add(yesButton = new ButtonLayer(this, primaryLayer));
yesButton.loadButtons("yn_yes_cn_1.png","yn_yes_cn_2.png","yn_yes_cn_2.png");//确认按钮的图片
yesButton.top = 135;//调整按钮显示位置
yesButton.left = (primaryLayer.width/3)-(yesButton.width/2);//调整按钮显示位置
yesButton.visible = true;
// Noボタン
add(noButton = new ButtonLayer(this, primaryLayer));
noButton.loadButtons("yn_no_cn_1.png","yn_no_cn_2.png","yn_no_cn_2.png");//取消按钮的图片
noButton.top = 135;//调整按钮显示位置
noButton.left = (primaryLayer.width*2/3)-(yesButton.width/2);;//调整按钮显示位置
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);
}
}
[/code]
[attach]319[/attach]
把代码和范例素材一起丢进system文件夹里覆盖同名文件就可以了。
感谢翔嵐绘制的范例素材~
[[i] 本帖最后由 全局变量D 于 2012-3-23 11:00 编辑 [/i]]
2008-5-6 17:35
godxq1986
谢谢大大的无私分享啊:'(
2008-5-6 17:43
全局变量D
1基础代码来自:
shawind
[url]http://www.rpgchina.com/bbs/read-htm-tid-19562-fpage-3.html[/url]
2在询问窗口文字(通常在Mainwindow.tjs里的askyesno函数调用的地方,自己找吧...)中使用\n可以进行手动换行功能来自教程:
Arai Kou
[url]http://project-lips.net/products/krkr.htm[/url]
[[i] 本帖最后由 全局变量D 于 2011-11-22 14:06 编辑 [/i]]
2008-5-7 00:52
sarah707
这个很有爱啊~卡卡~下次如果挖新坑的话用用看看~
2008-5-7 15:24
kider
[code]D大真有爱,我再锦上添花吧。
primaryLayer.font.face="黑体";
primaryLayer.font.height=28;
更改字体、字号,加到“\\message文字的描绘”的下面即可。
primaryLayer.drawText(msgpos_x, msgpos_y, messages[i], 0xFFFFFF, 255, true, 255, 0x000000, 5, 2, 2);
这个改动是给提示文字的右下角(2,2)位置填加宽度为5的阴影。
以上注意是在不用font.tft的前提下。[/code]
[[i] 本帖最后由 kider 于 2008-5-7 15:26 编辑 [/i]]
2008-5-7 18:58
全局变量D
编辑了字体部分上去...XD
原来drawtext还有阴影属性的..(一直都直接用描绘两次来搞定阴影XDD)
[[i] 本帖最后由 全局变量D 于 2008-5-7 19:06 编辑 [/i]]
2008-5-8 15:25
godxq1986
哦~原来字体大小使用primaryLayer.font.height啊,我说我写了primaryLayer.font.size怎么不管用呢:L
另外字体设定那里还有primaryLayer.font.bold = true之类的可以用到,edge和shadow啦等等
2008-6-25 22:33
sarah707
win.showModal();
如果不是为了这个……我真想用layer做……T-T
2008-8-10 22:01
全局变量D
Window.setMaskRegion
機能/意味
ウィンドウリージョンをマスクに従って設定
タイプ
Windowクラスのメソッド
構文
setMaskRegion(threshold=1)
引数
threshold マスクのスレッショルド ( 敷居値 ) を指定します。
プライマリレイヤのマスク ( レイヤの不透明度の情報 ) のうち、この値よりも大きい部分の形に ウィンドウが切り取られて表示されます。
戻り値
なし (void)
説明
ウィンドウリージョンをプライマリレイヤのマスク ( レイヤの不透明度の情報 ) に従って設定します。
ウィンドウを不定形にする事ができます。
表示されるプライマリレイヤと、ウィンドウの大きさ、位置がずれないようにするには 以下のことを行う必要があります。
Window.borderStyle は bsNone に設定します。
Window.innerSunken は false に設定します。
Window.layerLeft および Window.layerTop は 0 に設定します。
Layer.imageLeft および Layer.imageTop は 0 に設定します。
参照
Window.removeMaskRegion
----------------------------------------------
即是说,在primaryLayer创造出来以后,可以加入命令
setMaskRegion(数值);
则作为窗口背景使用的图片上,有某点的透明度小于该数值时,这一点将会被透明化...形成非方型窗口的效果.
但是,无法支持半透明.
2009-7-31 10:35
nozomiqx
本人菜鸟~~~
真的很好用,但是不好意思问一下,tlg可以用什么软件查看?(总不能要看的时候都要打开游戏吧~~本人菜鸟~~~)
2011-11-21 19:33
全局变量D
格式范例:
一般的按钮,三张图:
一般:[attach]313[/attach]
按下:[attach]314[/attach]
选中:[attach]315[/attach]
YESNO里需要用到的按钮,一张图:
[attach]316[/attach]
2011-11-21 19:55
全局变量D
使用普通按钮的方法:
还有,第二个办法是:
在一开始的
var yesButton; // [はい] ボタン
var noButton; // [いいえ] ボタン
这两行后面,加入:
var tempLayer;
property temporaryLayer
{
// ワークエリアとして一時的に使用できるレイヤを返す
getter()
{
if(tempLayer === void)
{
tempLayer = new KAGLayer(this, primaryLayer);
tempLayer.name = "一時ワークレイヤ";
}
return tempLayer;
}
}
然后再采用
add(noButton = new ButtonLayer(this, primaryLayer));
noButton.loadButtons("normal", "over", "on");
的方式来处理按钮。
页:
[1]
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.