C++ trong rpg maker xp... Sự thật hay trò đùa ?

  • Thread starter Thread starter Atachi
  • Ngày gửi Ngày gửi
Status
Không mở trả lời sau này.

Atachi

<color="Red"><b>The Boy From Nowhere</b></color>
Tham gia ngày
6/1/05
Bài viết
9,993
Reaction score
35
Nghe mọi người tranh cãi việc ứng dụng C++ vào rpg maker xp, tôi lúc đầu nghĩ ngay đó là trò đùa, hỏi các tiền bối đều bảo là không đưọc, trong khi mấy ông VM lại bảo được. Cuối cùng thì là sao đây nhỉ ? :whew:
 
Đó là sự thật. chỉ có không ai biết cách làm mà thôi. Nếu ông vào một số trang nước ngoài thì thấy nó là bình thường.
 
chắc như gamemaker vậy, dùng ngôn ngữ khác tạo file thư viện dll rùi dùng command điều khiển file đó, ko biết RPGXP có command đó ko.
 
À không phải như vậy, ngôn ngữ RGSS căn bản giống hệt C++ nên mọi người nghĩ C++ có thể dùng đuợc trong RMXP mà thôi. Syntax của C++ có thể sử dụng được trong RGSS một cách đơn giản như script bình thường đó mà
 
Dùng lệnh từ các DLL như lúc dùng để load Movie ;) Khi đó thì nhúng cái gì vào mà chả được? Đâu cứ nhất thiết phải là C++ mà có khi Visual Basic,...đều nhúng được...
Ah nhưng mà nếu nhúng C++ dạng code (chưa compile) thì sẽ làm RPG Maker chạy hơi chậm (vì còn phải compile) ;) Cách hay nhất là cứ viết bằng C++ 1 file DLL trước rồi sau đó dùng RPG Maker gọi lệnh ra...
 
thực ra thì tạo thư viện dll cũng là 1 cách hay nhưng cái đó cực kỳ dễ bị mắc lỗi (dù đã compile) lỗi chủ yếu là conflict giữa rmxp và mấy cái thư viện dll đó. đồng thời vì nó đã ở dạng dll rồi nên rất khó debug
 
^_^ -_- T_T
Hiểu chết liền đ1o ^_^
 
devkar: conflict cái gì? ;)
Ice Dragon: U biết cách mở movie ra bằng RPG Maker XP chứ gì? Vậy thì U cũng có thể dùng cách tương tự để mở/dùng bất kỳ các lệnh gì trong các file DLL khác chứ nhỉ? ;) Nói vậy mà không hiểu nữa thì...bó tay...
 
RMXP có dll riêng (cái rgss.dll đó) 1 số mấy thứ trong đó conflict và gây ra 1 đống lỗi trong project của tui khi tui cố chèn 1 thư viện C++ vào.
Ví dụ như tui cố đưa cái iostream vào để có thể sử dụng lệnh cout, cin chẳng hạn ...
 
Để tui xem lại xem,đó giờ không quan tâm mấy đến movie ^_^
if Len(post#11)<15 then
Ice'sExp = Ice'sExp - 2
Ice'sMp = Ice'sMp -1
end if
 
nói nhìu mỏi miệng ý wên mỏi tay, cho cái ex đê khà khà
 
Tôi có post một bài về xử dụng DLL dạng thô (không phải ATL hay COM gì hết) với RPG maker XP. Bên trang "trưng bày" của Thảo luận chung. Ai rãnh vô đọc.

Chuyện này cũng có những hạn chế nhất định, nói chung tôi nghĩ không có nhiều giá trị.
 
Mà quên, nếu RPG maker XP chưa update không thể chạy DLL được.
 
Tip: nếu dùng C++ hay "cái gì đó" tạo DLL mà khi cho vào RPG Maker XP bị conflict thì hãy sửa lại các lệnh trong DLL cho dài ra thí dụ như:
write đổi thành writethisinto ;)
Cũng có khi phải sửa luôn cả tên của các Class... cho dài ra
Tui chỉ bị lỗi conflict lệnh (vì RGSS là 1 DLL có chứa hơi nhiều lệnh của Ruby nênh có thể sẽ conflict với các DLL có chứa các câu lệnh chung chung như if, else,...)
 
uh đúng rồi, tại sao lại lạ thế nhỉ, tui cho tên dài ra là chạy được, nhưng nếu dài quá ví dụ như write thành writeoutcommandnamedealingdamage0 là khỏi chạy luôn .... conflict tiếp
 
tip2: lệnh quá dài thì không tốt :D Lý do: thí dụ có lệnh ABC đi, vậy thì máy sẽ đoán là sẽ có lệnh BBC, CBC,... nên sẽ chừa chỗ ra và như vậy thì...ui chà...hơi nhiều đó...nói chung kéo dài lệnh ra nhưng mà đừng dài quá ^_^
 
Ai cho hỏi cái script movie đâu rồi ?(hic,mod làm ăn ngon lành thiệt,mấy topic vớ vẩn như Program Team thì đặt chú ý còn mấy cái như Hướng dẫn này kia thì vất mất tiêu(ít ra cũng nên nhập vào 1 chủ đề HD nào chứ)
Có ai nói rõ vụ chèn file DLL 1 chút ko? Tui định thứ bằng VB
 
Mình cũng có thể chạy được phim trong rmxp mà không cần phải gọi vào lằng nhằng thế đâu:

Dùng lệnh Scene_Movie.new(filename,length) để gọi nó vào nhé
Filename là tên phim để trong (yourgame\data, yourgame\graphics, yourgame\movies) resolution không vượt quá 640*480. ko hoạt động trên cả cái 640*48, chỉ có thể nhỏ hơn.
Length là độ dài của film tính trên giây

DEMO

Mã:
class Scene_Movie

def initialize(movie,length)
  @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
  @movie_name = Dir.getwd()+"\\Movies\\"+movie+".avi"
  @counter = length*10
  main
end

def main

  game_name = "\0" * 256
  @readini.call('Game','Title','',game_name,255,".\\Game.ini")
  game_name.delete!("\0")
  @wnd = Win32API.new('user32','FindWindowEx','%w(l,l,p,p)','L')
  @temp = @wnd.call(0,0,nil,game_name).to_s
  @movie = Win32API.new('winmm','mciSendString','%w(p,p,l,l)','V')
  @movie.call("open \""+@movie_name+"\" alias FILE style 1073741824 parent " + @temp.to_s,0,0,0)
  @message = Win32API.new('user32','SendMessage','%w(l,l,l,l)','V')
 
  @detector = Win32API.new('user32','GetSystemMetrics','%w(l)','L')
  @width = @detector.call(0)
  if @width == 640
    fullscreen
    Graphics.update
    sleep(1)
    Graphics.update
    sleep(1)
    Graphics.update
    sleep(1)
  end
 
  @movie.call("play FILE",0,0,0)
  loop do
   sleep(0.1)
   @message.call(@temp.to_i,11,0,0)
   Graphics.update
   @message.call(@temp.to_i,11,1,0)
   Input.update
   if Input.trigger?(Input::B)
     Input.update
     break
   end
   @counter = @counter - 1
   if @counter <= 0
     break
    end
  end
  @movie.call("close FILE",0,0,0)
  bail
end

def bail
  if @width == 640
    fullscreen
  end
 end
end

def fullscreen()

$full.call(18,0,0,0)
$full.call(13,0,0,0)
$full.call(18,0,2,0)
$full.call(13,0,2,0)
end
$full = Win32API.new('user32','keybd_event','%w(l,l,l,l)','')
 
Kỳ nhở? :)) Nếu đã gọi như vậy rồi thì sao không thêm cái hàm Autoresize đi (Windows Media Player làm vậy được) tui nghe nói có người làm vậy để chèn các phim có độ phân giải lớn hơn 640x480 vào (hình ảnh đẹp hơn nếu có kèm theo D3D Filter) nhưng chưa thử vì...không biết :P
Edit: thật ra việc gọi Movie hay hầu hết mọi thứ đều thông qua Kernel hay API thôi...mấy video cỡ bink mới cần gọi từ dll riêng...
 
Status
Không mở trả lời sau này.
Back
Top