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

Project1

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

[已经过期] 插入动画,游戏画面就卡住了

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
16 小时
注册时间
2016-1-7
帖子
12
跳转到指定楼层
1
发表于 2016-1-26 09:36:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 hiscky 于 2016-1-26 09:37 编辑

我是让他跟NPC对话先跳动画,动画档是SWF,已经先在资料夹放好影片((影片资料夹是放在Graphics))
但是一根NPC讲话游戏画面就卡住了

我是用以下脚本
class String
  
  CP_ACP = 0
  CP_UTF8 = 65001
  
  def u2s
    m2w = Win32API.new("kernel32", "MultiByteToWideChar", "ilpipi", "i")
    w2m = Win32API.new("kernel32", "WideCharToMultiByte", "ilpipipp", "i")
   
    len = m2w.call(CP_UTF8, 0, self, -1, nil, 0)
    buf = "\0" * (len*2)
    m2w.call(CP_UTF8, 0, self, -1, buf, buf.size/2)
   
    len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
    ret = "\0" * len
    w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
   
    return ret
  end
  
  def s2u
    m2w = Win32API.new("kernel32", "MultiByteToWideChar", "ilpipi", "i")
    w2m = Win32API.new("kernel32", "WideCharToMultiByte", "ilpipipp", "i")
  
    len = m2w.call(CP_ACP, 0, self, -1, nil, 0);
    buf = "\0" * (len*2)
    m2w.call(CP_ACP, 0, self, -1, buf, buf.size/2);
  
    len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
    ret = "\0" * len
    w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
     
    return ret
  end

  def s2u!
    self[0, length] = s2u
  end  
  
  def u2s!
    self[0, length] = u2s
  end
  
end

class Bitmap
  
  RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')

  def address
    buffer, ad = "xxxx", object_id * 2 + 16
    RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 8
    RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 16
    RtlMoveMemory_pi.call(buffer, ad, 4); return buffer.unpack("L")[0]
  end
  
end

class RMFlash

API_NEW        = Win32API.new("RMFlash", "_new", "piil", "l")
API_UPDATE     = Win32API.new("RMFlash", "_update", "l", "v")
API_FREE       = Win32API.new("RMFlash", "_free", "l", "v")
API_PLAYING     = Win32API.new("RMFlash", "_is_playing", "l", "i")
API_PAUSE       = Win32API.new("RMFlash", "_pause", "l", "v")
API_RESUME     = Win32API.new("RMFlash", "_resume", "l", "v")
API_BACK       = Win32API.new("RMFlash", "_back", "l", "v")
API_REWIND     = Win32API.new("RMFlash", "_rewind", "l", "v")
API_FORWARD     = Win32API.new("RMFlash", "_forward", "l", "v")
API_CURFRAME   = Win32API.new("RMFlash", "_cur_frame", "l", "i")
API_TOTALFRAME = Win32API.new("RMFlash", "_total_frames", "l", "i")
API_GOTOFRAME   = Win32API.new("RMFlash", "_goto_frame", "li", "v")
API_GETLOOP    = Win32API.new("RMFlash", "_get_loop", "l", "i")
API_SETLOOP    = Win32API.new("RMFlash", "_set_loop", "li", "v")
API_CLEARALL   = Win32API.new("RMFlash", "_clear_all", "v", "v")
  API_VALID       = Win32API.new("RMFlash", "_valid", "l", "i")
  API_SENDMSG     = Win32API.new("RMFlash", "_send_message", "liii", "l")

  CUR_PATH        = Dir.pwd
  
def self.get_version

end

def self.clear_all
  API_CLEARALL.call
end
  
  def self.load(name, width, height, v = nil)
    new("#{CUR_PATH}/#{name}".u2s, width, height, v)
  end
  
  attr_reader   :valid

def initialize(flash_name, flash_width, flash_height, viewport = nil)
  @sprite = Sprite.new(viewport)
  @sprite.bitmap = Bitmap.new(flash_width, flash_height)
  @value = API_NEW.call(flash_name, flash_width, flash_height, @sprite.bitmap.address)
  @loop = API_GETLOOP.call(@value) > 0
    @valid = API_VALID.call(@value) > 0
end

def viewport
  @sprite.viewport
end

def update
  API_UPDATE.call(@value)
end

def dispose
  API_FREE.call(@sprite.bitmap.address)
end

def playing?
  API_PLAYING.call(@value) > 0
end

def pause
  API_PAUSE.call(@value)
end

def resume
  API_RESUME.call(@value)
end

def back
  API_BACK.call(@value)
end

def rewind
  API_REWIND.call(@value)
end

def forward
  API_FORWARD.call(@value)
end

def current_frame
  API_CURFRAME.call(@value)
end

def total_frames
  API_TOTALFRAME.call(@value)
end

def goto_frame(goal_frame)
  API_GOTOFRAME.call(@value, goal_frame)
end

def x
  @sprite.x
end

def x=(v)
  @sprite.x = v
end

def y
  @sprite.y
end

def y=(v)
  @sprite.y = v
end

def z
  @sprite.z
end

def z=(v)
  @sprite.z = v
end

def width
  @sprite.bitmap.width
end

def height
  @sprite.bitmap.height
end

def loop?
  @loop
end

def loop=(v)
  if @loop != v
   @loop = v
   API_SETLOOP.call(@value, v)
  end
end
  
  def msg_to_flash(msg, wParam, lParam)
    return API_SENDMSG.call(@value, msg, wParam, lParam)
  end
  
  #  例
  WM_MOUSEMOVE  = 0x0200
  
  def make_long(a, b)
    return (a & 0xffff ) | (b & 0xffff) << 16
  end
  
  def on_mouse_move(x, y)
    return msg_to_flash(WM_MOUSEMOVE, 0, make_long(x, y))
  end

end

module Kernel

  alias origin_exit exit unless method_defined? :exit
  
  def exit(*args)
    RMFlash.clear_all
    origin_exit(*args)
  end
  
end

事件里的脚本
fls = RMFlash.load("片頭測試.swf", 640, 480)
fls.loop = 1
while true
Graphics.update
Input.update
fls.update
break if !fls.playing?
end
fls.dispose

请问画面为什么会卡住

  

Lv3.寻梦者

梦石
0
星屑
1358
在线时间
1295 小时
注册时间
2012-8-4
帖子
749
2
发表于 2016-1-26 23:11:11 | 只看该作者
while true
Graphics.update
Input.update
fls.update
break if !fls.playing?
end
这是循环的
,应该不用后面的吧。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-12 00:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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