中文偽春菜後援會論壇  

打印

[問題] 关于用yaya系统写程序的刷新显示问题

关于用yaya系统写程序的刷新显示问题

请教各位大大以下问题
问题一:如何用一个函数控制SSP对话框界面的刷新时间,比何我有一个函数,每次运行一次这个函数,对话框得到一个不同位置的图像,我想在一定时间内运行n次这个函数,以得到不同的动态显示效果,当然这个动态显示可以不是连续的,而是有一定等待时间的,该怎么做?
问题二:以上动态显示如何能控制SSP对话框不闪烁,不然的话,刷新一次闪一次不好看啊。
以上。如果不能解决这两个问题,很多具有动态效果的高级程序就没法在YAYA上实现啊,如比贪食蛇,射击游戏什么的。

TOP

回復 1# fancyang 的帖子

這個嗎~
你可能要等其他高手上了
他們比我還要厲害

TOP

第二个问题自己解决了,第一个不好处理啊,想用while循环处理\_w加这个动作函数,可是这样健盘输入就不管用了。想到用Onsecondchange实现时间脉冲,可是一运行函数,second就不改变了,停留在了进入函数的值,导致Onsecondchange不动作。谁知道刷新时间的函数是什么?

TOP

\_w是SakuraScript標籤不是函数。Onsecondchange或OnKeyPress是事件。
事件被觸發-->SSP向aya發送事件消息-->aya處理并返回SakuraScript文本-->SSP處理執行SakuraScript文本.
偽春菜按這樣的消息循環執行的。
因此,Onsecondchange或OnKeyPress是依次處理的,aya處理時畫面就會定格,返回SakuraScript文本中有\_w時SSP再等待。
所以,想用健盘改變已經返回的SakuraScript文本是不可能的。

用Onsecondchange实现时间脉冲倒是可行,雖然我覺得時間延遲太長。
先在OnBoot初始化:
testflag=0
testflag2=0

再在OnSecondChange設定變化:
testflag=testflag+10;
if testflag>=100
{
testflag=0
}
"\_l[%(testflag),%(testflag2)]\_qTarget\_q"

最後在OnKeyPress里控制變化量:
if reference0 == "up" {
testflag2=testflag2-10
}
elseif reference0 == "down" {
testflag2=testflag2+10
}
elseif reference0 == "left" {
testflag=testflag-10
}
elseif reference0 == "right" {
testflag=testflag+10
}

如上,渲染始終在Onsecondchange里,健盘只是改變變量而已。
一般即時演算的畫面都是像上面那樣按一定幀數刷新的,ssp畢竟不是游戲引擎,還不如用外接程序來運行比較好。

另外,SSP对话框是先繪製的,又沒有雙緩存。即使用\_q也會因為延遲而闪烁。你是如何解決的?
皮格马利翁效应(Pygmalion Effect):只要有爱,伪春菜也能和人类一样.

TOP

回復 4# Pygmalion 的帖子

万分感谢大大提供思路。
这样改就完美了,又不闪又能自动走又没延迟。
OnSecondChange
testflag=testflag+10;
if testflag>=200
{
testflag=0
}
"\C\_q\c\_l[%(testflag),%(testflag2)]Target"
OnKeyPress

if reference0 == "up" {
testflag2=testflag2-10
}
elseif reference0 == "down" {
testflag2=testflag2+10
}
elseif reference0 == "left" {
testflag=testflag-10
}
elseif reference0 == "right" {
testflag=testflag+10
}
"\C\_q\c\_l[%(testflag),%(testflag2)]Target"

[ 本帖最後由 fancyang 於 2012-4-28 08:48 編輯 ]

TOP

回復 4# Pygmalion 的帖子

还有一个问题,如果用while语句实现时间脉冲,如何控制while等待一定时间才执行一次循环。
如while start==1
{
"\_w[500]"+OnMove
}
这样貌似无效啊,OnMove只是在开始等待0.5秒后,就一直循环运行。

TOP

回復 6# fancyang 的帖子

\C\c追加后清屏,原来如此,我试试。
用while语句实现时间脉冲,应该不行。
因为while是aya命令,所以循环时控制权始终都到不了SSP本体上,当然不可能刷新。
不过可以用递归来做,这的确是个好方法:
Ontest
{
testflag=testflag+10;
if testflag>=100
{
testflag=0
}
"\C\_q\c\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[500]\![raise,Ontest]"
}
这样还可以控制间隔时间,还能保证可以点击。
只要添加\q[◇测试,Ontest]按钮就可以了,不用OnSecondChange了。

[ 本帖最後由 Pygmalion 於 2012-4-28 22:01 編輯 ]
皮格马利翁效应(Pygmalion Effect):只要有爱,伪春菜也能和人类一样.

TOP

回復 7# Pygmalion 的帖子

哦,这样也行,不过测试时有一定的操作延时,不流畅,也许是加了_w[500]的原因,如何让它既有间隔时间,又没控制延时呢。

TOP

我的解决方法是这样,多个递归,降低等待时间,不过这样代码量就多了
Ontest
{

testflag=testflag+10;
if testflag>=200
{
testflag=0
}
"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest0]"

}


Ontest0
{

"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest1]"
}

Ontest1
{
"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest2]"
}

Ontest2
{
"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest3]"
}

Ontest3
{
"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest4]"
}


Ontest4
{


"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest5]"

}


Ontest5
{

"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest6]"
}

Ontest6
{
"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest7]"
}

Ontest7
{
"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest8]"
}

Ontest8
{
"\C\_q\c\b[2]\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest]"
}

TOP

回復 7# Pygmalion 的帖子

除了9楼,还有没更好的方法

TOP

回復 10# fancyang 的帖子

事实上Ontest~Ontest8返回的内容都一样,只是第一句多个判断后循环8次而已,可以用参数来区分。
Ontest
{
_s=reference0
if _s==9
_s=0
if _s==0
{
testflag=testflag+10;
if testflag>=200
{
testflag=0
}
}
_s++
"\C\_q\c\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\_w[50]\![raise,Ontest,%(_s)]"
}

开始时添加按钮改成\q[◇测试,Ontest,0]就成了。
皮格马利翁效应(Pygmalion Effect):只要有爱,伪春菜也能和人类一样.

TOP

回復 11# Pygmalion 的帖子

嗯,这样也行,那还有就是当循环次数多了或者重新调用多次Ontest的时候,变得卡起来了,估计是多次使用内存,内存的数据没被释放,变得卡起来,有什么方法能释放伪春菜内存吗,只有当重新从菜单起动Ontest的时候才不卡,中间是不是自动释放了内存。如果有,这个函数是什么?

TOP

回復 12# fancyang 的帖子

刚才把时间调短,次数增多,任务管理器里内存没有明显的增长。
倒是出现了MenuCancel后又raise了Ontest的现象,应该是间隔短了来不及打断的原因吧。
皮格马利翁效应(Pygmalion Effect):只要有爱,伪春菜也能和人类一样.

TOP

回復 13# Pygmalion 的帖子

Ontest
{
if s==9
s=0
if s==0
{
testflag=testflag+10;
if testflag>=200
{
testflag=0
}
}
s++
"\C\_q\c\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\![raise,Ontest]"
}

奇怪啊,这样就可以了,估计是频繁读取reference0导致的速度变慢吧

[ 本帖最後由 fancyang 於 2012-4-29 21:46 編輯 ]

TOP

回復 13# Pygmalion 的帖子

应该加个变量控制,如
Ontest
{
if s==9
s=0
if s==0
{
testflag=testflag+10;
if testflag>=200
{
testflag=0
}
}
s++
if testmode==1
"\C\_q\c\_l[%(testflag),%(testflag2)]Target\q[◇取消,MenuCancel]\![raise,Ontest]"
}

OntestOver
{
testmode=0
}

结束时调用OntestOver
话说今天又测试了下,运行新的入口函数多了还是有点卡,找不到释放内存的方法吗?

TOP



當前時區 GMT+8, 現在時間是 2018-10-21 13:31

Processed in 0.019112 second(s), 9 queries, Gzip enabled.

清除 Cookies - 聯繫我們 - 中文偽春菜後援會 - Archiver - WAP - TOP - 界面風格