查看: 1830|回复: 2

[已经过期] 很奇怪的问题:RMXP中的 Viewport 端口竟然没有 disposed? 方法?

[复制链接]
梦石
0
星屑
784
在线时间
380 小时
注册时间
2009-3-9
回帖
336
发表于 2013-8-29 00:11:58 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
刚才无意间发现一个BUG:

很奇怪的问题:RMXP中的 Viewport 端口竟然没有 disposed? 方法?

但是我查了F1:里面明确的指出——是有这个方法的,但是调用不成功。。。。

求高手解答!
新手学习中.....努力吧!!

Fuzzy Ginkgo

梦石
0
星屑
61105
在线时间
1933 小时
注册时间
2010-6-26
回帖
1535

烫烫烫开拓者

发表于 2013-8-29 04:22:02 | 显示全部楼层
本帖最后由 orzfly 于 2013-8-29 05:15 编辑

因为你说求高手解答,所以不是高手的人都不敢给你回答问题了(大雾)
所以我也不是高手我很菜的所以我就不回答你了。
------------------
Enterbrain 又调皮了,确实没有 disposed? 这个方法。
XP、VX、VX Ace 都没有的说。

[pre lang="c" line="1"]void __cdecl Init_RGSSViewport()
{
  if ( !rb_cViewport )
  {
    rb_cViewport = rb_define_class("Viewport");
    rb_define_alloc_func(rb_cViewport, rgss_viewport_allocate);
    rb_define_method(rb_cViewport, "clone", (int)rgss_viewport_clone, 0);
    rb_define_method(rb_cViewport, "dup", (int)rgss_viewport_dup, 0);
    rb_define_method(rb_cViewport, "initialize", (int)rgss_viewport_initialize, -1);
    rb_define_method(rb_cViewport, "dispose", (int)rgss_viewport_dispose, 0);
    rb_define_method(rb_cViewport, "flash", (int)rgss_viewport_flash, 2);
    rb_define_method(rb_cViewport, "update", (int)rgss_viewport_update, 0);
    rb_define_method(rb_cViewport, "rect", (int)rgss_viewport_rect, 0);
    rb_define_method(rb_cViewport, "rect=", (int)rgss_viewport_rect_set, 1);
    rb_define_method(rb_cViewport, "visible", (int)rgss_viewport_visible, 0);
    rb_define_method(rb_cViewport, "visible=", (int)rgss_viewport_visible_set, 1);
    rb_define_method(rb_cViewport, "z", (int)rgss_viewport_z, 0);
    rb_define_method(rb_cViewport, "z=", (int)rgss_viewport_z_set, 1);
    rb_define_method(rb_cViewport, "ox", (int)rgss_viewport_ox, 0);
    rb_define_method(rb_cViewport, "ox=", (int)rgss_viewport_ox_set, 1);
    rb_define_method(rb_cViewport, "oy", (int)rgss_viewport_oy, 0);
    rb_define_method(rb_cViewport, "oy=", (int)rgss_viewport_oy_set, 1);
    rb_define_method(rb_cViewport, "color", (int)rgss_viewport_color, 0);
    rb_define_method(rb_cViewport, "color=", (int)rgss_viewport_color_set, 1);
    rb_define_method(rb_cViewport, "tone", (int)rgss_viewport_tone, 0);
    rb_define_method(rb_cViewport, "tone=", (int)rgss_viewport_tone_set, 1);
  }
}
[/pre]
---------
继续研究的报告:
[pre lang="c" line="1"]
a1 = object_id * 2;
result = *(_DWORD *)(a1 + 16);
if ( !*(_DWORD *)(result + 8) )
  rb_raise(rb_cRGSSError, "disposed viewport");
[/pre]

所以我们可以自己写一个 disposed? 了:

[pre lang="ruby" line="1"]class ::Viewport
  RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  
  def disposed?
    buffer = " " * 4
    ad = object_id * 2 + 16
    RtlMoveMemory_pi.call(buffer, ad, 4)
    ad = buffer.unpack("L")[0] + 8
    RtlMoveMemory_pi.call(buffer, ad, 4)
    return buffer.unpack("L")[0] == 0 ? true : false
  end
end
[/pre]

@晴兰

点评

好黑的科技+1  发表于 2013-8-29 09:18
囧叔好黑的科技  发表于 2013-8-29 06:55

评分

参与人数 2星屑 +150 收起 理由
弗雷德 + 84 膜拜
凌童鞋 + 66 糖

查看全部评分

我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

梦石
0
星屑
784
在线时间
380 小时
注册时间
2009-3-9
回帖
336
 楼主| 发表于 2013-8-29 09:20:22 | 显示全部楼层
哇。。。好厉害,连RGSS102J里面的函数都能研究出来,佩服了!!!

PS:弱弱的问一句—RMXP的800*600地图,除了拼接3个Viewport外,还有好的方法吗?
新手学习中.....努力吧!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部