본문 바로가기
게임이야기./RPG 만들기 XP

동영상 재생 스크립트[AVI,MPG 포맷 사용 가능]

by 아방스 2010. 5. 25.

처음으로 스크립트 게시판에 글을 올려 보는군요.

제가 처음 소개할 스크립트는 동영상 재생 스크립트입니다.

이 스크립트는 XP 뿐만 아니라 VX에서도 적용됩니다.

아래 글 부터 복사 해주세요.

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#                            -  Game_Film II - reloaded ^^
#  par berka
#                          www.rpgmakervx-fr.com                                         
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#  Rgss 1&2                  v 1.0
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#
# #<사용방법(이벤트-스크립트에서)>
# [film]                # 맨 위줄
# film = monfilm.avi    # avi파일 이름
#
# #<세부설정>
# #각 설명
# x = 12                # x축
# y = 1                  # y축
# w = 150                # 가로크기
# h = 150                # 세로크기
#
# full = true            # true = 풀스크린 false = 풀스크린 x
# vol = 750              # 볼륨 [0~1000까지 설정가능]
# bass = 999            # 베이스 [0~1000까지 설정가능]
# aig = 250              # ?
# #commandes:
# B(ESC)누르면 동영상 나가기 , C(ENTER)누르면 재생/정지
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

 
class Game_Film
  def initialize(hash)
    hash.has_key?(:film) ? film=hash[:film] : return
    hash.has_key?(:x) ? @x=hash[:x]+" " : @x="0"
    hash.has_key?(:y) ? @y=hash[:y]+" " : @y="0"
    hash.has_key?(:w) ? @w=hash[:w]+" " : @w=""
    hash.has_key?(:h) ? @h=hash[:h]+" " : @h=""
    hash.has_key?(:vol) ? @vol=hash[:vol]+" " : @vol="1000"
    hash.has_key?(:bass) ? @bass=hash[:bass]+" " : @bass="1000"
    hash.has_key?(:aig) ? @aig=hash[:aig]+" " : @aig="1000"
    hash.has_key?(:pos) ? @pos="at pos #{hash[:pos].to_i*1000} " : @pos="at pos 0 "
    @full=hash[:full] if hash.has_key?(:full)
    @full&&dim_ecran !=[640,480] ? @plee="fullscreen " : @plee=""
    @type=" "
    @type=" type mpegvideo" if File.extname(film)==(".mpg"||".mpeg")
    @type=" type avivideo" if File.extname(film)==".avi"
    @nom='./Films/'+film
    (p "파일 #{@nom}를 찾을 수 없습니다.";return) if !FileTest.exist?(@nom)
    @film=Win32API.new('winmm','mciSendString','ppll','v')
    lecture
  end
  def handle
    jeu="\0"*256
    ini=Win32API.new('kernel32','GetPrivateProfileStringA','pppplp', 'l')
    ini.call('Game','Title','',jeu,255,".\\Game.ini")
    return Win32API.new('user32','FindWindowEx','llpp','l').call(0,0,nil,jeu.delete!("\0"))
  end
  def lecture
    v,t,status,pause=version,Time.now," "*255,false
    @film.call("open #{@nom} alias FILE#{@type} style child parent "+handle.to_s,0,0,0)
    @film.call("put FILE window at #{@x}#{@y}#{@w}#{@h}",status,255,0)
    @film.call("setaudio File volume to #{@vol}",status,255,0)
    @film.call("setaudio File bass to #{@bass}",status,255,0)
    @film.call("setaudio File trebble to #{@bass}",status,255,0)
    @film.call("play FILE #{@plee} notify",status,255,handle)
    loop{sleep(0.1)
      Input.update
      @film.call("status FILE mode notify",status,255,0)
      break if status.unpack("aaaa")=="stop".split(//)||Input.trigger?(Input::B)
      if Input.trigger?(Input::C)
        if !pause;@film.call("pause FILE notify",status,255,handle);pause=true
        else;@film.call("play FILE #{@plee} notify",status,255,handle);pause=false
        end     
      end
      (t=maj(t))if v=='xp'}
    @film.call("close FILE notify",0,0,handle)
    $scene=Scene_Map.new
  end
  def dim_ecran
    lw=Win32API.new('user32','GetSystemMetrics','i','i')
    return lw.call(0),lw.call(1)
  end
  def maj(t)
    (Graphics.update;return Time.now)if t.sec<=Time.now.sec-9||t.min !=Time.now.min
    return t
  end
  def version;FileTest.exist?('./Data/scripts.rvdata') ? 'vx': 'xp';end
end
Dir.open("./Films") rescue Dir::mkdir("./Films",0777)
class Game_Interpreter;def eval(script);cmd_eval(script);end;end#rmvx
class Interpreter;def eval(script);cmd_eval(script);end;end#rmxp
def cmd_eval(script)
  if script.include?("[film]")
    hash={}
    script.gsub!("[film]"){}
    list=script.split("\n")
    list.each{|e|e.gsub!(" "){};f=e.split("=");hash[f[0].to_sym]=f[1] if !f[1].nil?}
    Game_Film.new(hash)
  else;return Kernel.eval(script)
  end
end

 

설명 들어가겠습니다.

(일단 스크립트 넣은 후 실행하면 자동으로 폴더가 생성되기도 하지만,

게임 폴더 안에 Films 란 폴더 이름을 만들고, 그 곳에 동영상을 넣어주세요)

1. 이 스크립트를 main 섹션 위에 따로 만들어서 붙여넣기 해 주세요.

2. 그 다음 나와서 맵에 이벤트를 만들고 이벤트를 '스크립트'로 하나 만듭니다.

3.만약 동영상이름이 test.avi 라고 했을 때, 이벤트 - '스크립트' 에

[film]
film = test.avi
full=true

라고 넣어 주세요.

동영상이 풀 스크린으로 재생되는 것을 볼 수 있습니다.

만약 풀 스크린을 원치 않을 경우에는,

full=true 를

full=false로 고쳐주시면 됩니다.

 기타 옵션은 스크립트 글 자체에 제가 한글로 심플하게 적어놨습니다.

 

<필독>

avi,mpg 형식을 지원하는 데, 확인 결과 코덱 방식 지원이 많이 없었습니다.

avi가 아마 무압축 코덱을 지원하는 것 같았죠.

그래서 개인적인 생각으로는 짧은 동영상은 mpg가 무난하고, 2분넘어가는건 avi가 좋습니다.

동영상크기는 640x480보다 작아야 가장 좋습니다.

제가 실험 해 본 결과, 게임을 풀스크린으로 할 때와 안 할 때가 표시되는게 각각 다르더군요.

그나마 저 픽셀보다 작아야 그나마 실행이 잘 되더라구요.

기타 질문 사항은

http://cafe.naver.com/rgss 에 문의 주시기 바랍니다.

그래도 이해 안가시면,

제가 테스트 게임을 첨부 하겠습니다.

그거 보고 따라 해 보세요.

동영상을 멈추실 때는 재생 될 때 enter를 누르면 멈춤, 한번 더 누르면 재생됩니다.

동영상에서 빠져 나가실 때는

esc를 누르시면 됩니다.

 

 

<주의사항>

1.코덱에 따라 동영상이 재생될 수도 있고, 안 될 수도 있음을 명심 해주시기 바랍니다.

2.현재까지 확인해 본 바, avi 코덱중 가장 좋은 코덱 방식은,

DivX MPEG-4 Fast-motion

방식이었습니다.

mpg 확장자는 왠만한건 다 재생 되더라구요.

근데 단점이 정지가 잘 안먹힌다는 거죠.

avi는 코덱 여하에 따라 재생 유무가 판가름납니다.

 

3.만약 esc를 눌러도 안빠져 나갈경우에는

esc를 2~3초간 계속 눌러보세요

그럼 빠져나가집니다.



원본 게시물 주소 : http://avangs.info/zbxe/1103844

반응형