设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4472|回复: 14
打印 上一主题 下一主题

禁止窗体移动 + EXIT动画

 关闭 [复制链接]

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

跳转到指定楼层
1
发表于 2009-6-7 20:52:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
1.禁止窗体移动
  禁止RM窗口的移动 当鼠标拖动RM窗口后 又会设置回原来的位置
  思路: 1.用Win32API 函数 getWindowRect 获取原来的窗口位置
        2.窗口消息处理 (需要夏娜的RmWndProc支持)
        3.接受到 WM_MOVE 消息后 设置窗口位置(原来的位置)
2.Exit动画
  就是按窗口右上角那个x关闭按钮 就会播放一段exit动画
  原理很简单 具体见脚本 可以根据需要制定自己的游戏的exit动画

范例下载:
http://rpg.blue/upload_program/d ... ��体_124808674.rar

脚本
1.RmWin 部分
class RmWin
  attr_accessor :left,:top,:right,:bottom
  attr_accessor :hwnd
  def initialize
    @left = 0
    @top = 0
    @right = 0
    @bottom = 0
    @hwnd = 0
  end  
end  


$rmWin = RmWin.new
window_Rect = Win32API.new("user32","GetWindowRect","lp","l")

val = "\0"*256
gps = Win32API.new("kernel32", "GetPrivateProfileString",%w(p p p p l p), "l")
gps.call("Game", "Title", "", val, 256, ".\\Game.ini")
val.delete!("\0")
   
fw = Win32API.new("user32", "FindWindow", %(p, p), "i")
$rmWin.hwnd = fw.call("RGSS Player", val)

pos = "\0"*16
result = window_Rect.call($rmWin.hwnd,pos)
if result != 0
  rect = pos.unpack("C*")
end

$wndmove = false
posLeft,posTop,posRight,posBottom = 0,4,8,12
$rmWin.left    = rect[posLeft+1]   * 0xFF + rect[posLeft]
$rmWin.top     = rect[posTop+1]    * 0xFF + rect[posTop]
$rmWin.right   = rect[posRight+1]  * 0xFF + rect[posRight]
$rmWin.bottom  = rect[posBottom+1] * 0xFF + rect[posBottom]

2.Graphics 和 Kernel 函数修改部分
module Graphics
  @ori = method("update") if @ori.nil?
  @swp = Win32API.new("user32", "SetWindowPos", %(l, l, i, i, i, i, i),"'i")
  def self.update(*args)
    @ori.call(*args)
    if $wndmove
      left = $rmWin.left
      top  = $rmWin.top
      @swp.call($rmWin.hwnd, -1, left, top,  640, 480, 1)
      $wndmove = false
    end  
  end  
end  

module Kernel
  alias ori_exit exit unless method_defined? :exit
  def exit(*args)
    Graphics.freeze
    Graphics.transition(20)
    @sp = Sprite.new
    @sp.x,@sp.y,@sp.z = 0,0,999999999
    @sp.bitmap = Bitmap.new(640,480)
    count = 0
    size = 6
    begin
      count += 1
      size += 1
      @sp.bitmap.clear
      @sp.bitmap.fill_rect(0,0,640,480,Color.new(0,0,0,255))
      @sp.bitmap.font.size = size
      @sp.bitmap.draw_text(0,200,640,100,"Thank You For Your Play",1)
      Graphics.update
    end until count == 40
    20.times{Graphics.update}
    ori_exit(*args)
  end  
end  

3.RmWndProc部分
#==============================================================================
# ■ RmWndProc
#------------------------------------------------------------------------------
#  处理RM窗口过程的模块。
#
#   v1.1
#
#   by 灼眼的夏娜
#
#   ※ 这个模块名以及该模块中的方法名字请勿更改!!!
#==============================================================================

module RmWndProc
  #--------------------------------------------------------------------------
  # ● API函数声明
  #--------------------------------------------------------------------------
  Replace = Win32API.new("Lib/RmWndProc","_replace","v","i")
  Restore = Win32API.new("Lib/RmWndProc","_restore","v","v")
  #--------------------------------------------------------------------------
  # ● 窗口过程函数 ※ 该名字切勿更改
  #--------------------------------------------------------------------------
  def self.wnd_proc(hwnd,msg,wparam,lparam)
    # 消息分歧
    case msg
    when 0x0003
      $wndmove = true
      return
    end
    # 调用默认窗口过程
    self.default_proc
  end
  #--------------------------------------------------------------------------
  # ● 转换窗口到RM脚本中进行处理
  #--------------------------------------------------------------------------
  def self.replace
    Replace.call
  end
  #--------------------------------------------------------------------------
  # ● 还原窗口过程
  #--------------------------------------------------------------------------
  def self.restore
    Restore.call
  end
  #--------------------------------------------------------------------------
  # ● 默认窗口过程 ※ 对于没有进行处理的消息我们在最后调用该方法来调用默认窗
  #                    口过程。
  #--------------------------------------------------------------------------
  def self.default_proc
    raise "default_proc"
  end
end

RmWndProc.replace



http://rpg.blue/upload_program/files/hide_xiu_96911465.png

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2006-12-20
帖子
213
2
发表于 2009-6-7 20:59:41 | 只看该作者
{/hx}偶是来做沙发的。。
哼哼。。。。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2009-6-7 21:00:04 | 只看该作者
Exit还有动画……
真华丽了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦·贤者

梦石
0
星屑
50
在线时间
1141 小时
注册时间
2007-12-15
帖子
4100
4
发表于 2009-6-7 21:01:26 | 只看该作者
这么一来,退出游戏可以不用“$scene = nil”了{/dy}

强势收下了{/qiang}
http://rpg.blue/home.php?mod=space&uid=34951&do=blog&id=12799
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-20
帖子
258
5
发表于 2009-6-7 21:01:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
6
发表于 2009-6-7 21:24:08 | 只看该作者
第一个应该可以直接屏蔽 WM_NCLBUTTONDOWN 吧,消息循环如果 wParam == HTCAPTION 就直接返回 HTNOWHERE~
  #--------------------------------------------------------------------------
  # ● 窗口过程函数 ※ 该名字切勿更改
  #--------------------------------------------------------------------------
  def self.wnd_proc(hwnd,msg,wparam,lparam)
    # 消息分歧
    case msg
    when 0x00A1
      return 0 if wparam == 2
    end
    # 调用默认窗口过程
    self.default_proc
  end
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-5
帖子
730
7
发表于 2009-6-7 21:29:01 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-20
帖子
258
8
发表于 2009-6-7 21:36:03 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
9
发表于 2009-6-7 21:38:10 | 只看该作者
以下引用一路一风尘于2009-6-7 13:29:01的发言:

呵呵,移动与鼠标点击都算消息,应都可拦截。

嗯,只不过 WM_MOVE 是左键弹起后才发送的,所以玩家还是可以按下左键拖拽窗口~~

刚测试了下,在系统菜单里面用移动,光屏蔽左键就不行了 =w=
看来还是要加上秀秀的方法,或者屏蔽系统菜单里面的移动
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-5
帖子
730
10
发表于 2009-6-7 21:44:11 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 09:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表