Project1

标题: OpenRGSS Project (预览版已可用,求人填坑) [打印本页]

作者: zh99998    时间: 2012-9-13 16:00
标题: OpenRGSS Project (预览版已可用,求人填坑)
这不是发布帖,请不要移到原创发布区

怨念的产物,很久之前就看到各种触手们在折腾破除限制。各种win32api,内存修改,反汇编,DLL Hook,来实现一些本来非常容易根本不叫事,甚至标准库里都有的东西。
比如Socket或者HTTP的网络通信,比如XML(StringIO),比如截图导出,还有EB脑残的产物:分辨率,Reset,Hangup,后台运行之类之类,从我入坑那时代到现在都五年过去了,还在为这些破玩意脑残。因为这些破东西我已经不用RGSS了,不过依然经常被这些烦扰,某天夏娜问我ruby1.9中如何加载被移到标准库里的continuation,被雪姐拖入坑折腾exe之类。

这些特喵的都叫事么!

够了,有那些弄内存弄API弄反汇编的劲,自己写个RGSS早都不知道写多少个出来了,干嘛还去受EB的气。不就是四个类的事么,有那么难么?

以下正题:

简介:
OpenRGSS,EnterBrain 的 Ruby Game Script System 的开源实现,提供跟官方RGSS兼容的接口,运行在标准ruby上。

许可协议:
LGPL-3

项目主页:
http://openrgss.org/

https://github.com/zh99998/OpenRGSS
https://github.com/zh99998/OpenRGSS-RPGMaker (用来加载RM工程,以及调解不同RGSS坂本差异的脚本)
以后还会有个packger,用来打包工程。

截图预览:


疑问:
Q:为什么要做这个,我们不是已经有官方RGSS和RGE了么
A:官方的RGSS实现不自由并且有一开始怨念过的那诸多问题,主要是非标准解释器导致没法使用native扩展(也就是所谓的.so库)无法忍受。而RGE除了免费,其他官方RGSS有的问题它几乎都有,并没有实质性的带来什么改进。

Q:为什么用SDL,而不用XXXXX
A:我自己已经用SDL写过东西,对这个比较了解,这是个成熟的库,毛病比较少。如果OpenRGSS能够顺利实现该有的那些功能,之后可能会考虑换用其他引擎以提高效率之类。初代已经确定用SDL.

Q:纯ruby的东西打包没问题么,会不会到玩家那边必须折腾一阵子才能玩用这个做的游戏
A:没问题的,到接近能用时我会发布一个打包工具,在用户那边就跟普通游戏一样,解压(或安装)你的游戏,然后打开主程序就可以玩

如何参与本项目:
通过上面的地址fork一份,然后git clone下来修改,提交后pull request给我。如果你不会使用git/github可以联系我,邮箱/GoogleTalk/QQ: [email protected]。重要事别在这里回复,我不一定看到。
在windows上搭建运行环境需要一个ruby http://rubyforge.org/frs/download.php/76054/rubyinstaller-1.9.3-p194.exe,安装时勾选加入PATH环境变量
ruby/sdl和inifile的gem
  1. gem install rubysdl-mswin32-19 inifile
复制代码
linux下好SDL的依赖然后装那俩gem
然后用RPG Maker创建一个默认工程,跟OpenRGSS-RPGMaker放在同一目录,之后在那个目录命令行执行 ruby lib/main.rb运行。需要修改最开头的OpenRGSS所在路径


如果参与了,编写的时候注意:
0. ruby的手册在这里:http://ruby-doc.org/core/
1. ruby/SDL的手册在这里:http://www.kmc.gr.jp/~ohai/rubysdl_ref_2.en.html  主要看Surface部分
2. Window Sprite 等需要直接画在画面上的东西,include RGSS::Drawable,然后实现draw方法即可描绘到画面上。
3. 暂时先不要试图编写独有功能,先弄到能用了之后在去弄那些。尽可能的少留自己的方法,必要时可以标记为private
4. 尽可能避免使用平台限定的东西(例如:Win32API),如果一定要用,请务必加一个平台判断。 示例: if RUBY_PLATFORM['mingw'] or RUBY_PLATFORM['mswin']  #windows平台判断

进度:

整体架构 ■■■■□
Bitmap ■■■■□
Sprite ■■■□□
Window ■■■■□
Tilemap ■■□□□
Plane ■■■■□
其他RGSS内建类 ■■■■□
Audio ■■■■□
Graphics ■■■■□
Input ■■■■□


无错运行RPGVA默认工程
较好的显示RPGVA默认工程
无错运行RPGVX|RPGXP默认工程  (进行中)
制作打包器
1.0 release
接近完美的显示RPG Maker工程
效率优化
架构分离,允许其他底层引擎的实现

======================================================================

OpenRGSS 0.1.5 预览版本已发布
体验方法:
0. 安装 ruby  http://rubyforge.org/frs/downloa ... ller-1.9.3-p194.exe  安装过程中勾选加入PATH环境变量选项  (linux用户从源里安装)
1. 安装OpenRGSS:    gem install openrgss
      装完后命令行打个install_rubysdl 安装SDL的库  (linux用户从源里安装)
2. 下载OpenRGSS-RPGMaker  https://github.com/zh99998/OpenRGSS-RPGMaker/zipball/master
3. 用RPG Maker VX/VA 建立一个工程, 把OpenRGSS-RPGMaker解压到这里, 然后命令行运行 ruby lib/main.rb
作者: zx工作室2    时间: 2012-9-13 17:09
不明真相所以在此围观,坐等详细评价。
作者: yangff    时间: 2012-9-13 17:17
领取Window喵~
作者: pigsss    时间: 2012-9-13 17:56
好东西啊啊,一直想用so库 没有好的方法
虽然想参与但是没那么强的技术 0.0
作者: 咕噜    时间: 2012-9-13 18:00
我只是前排打个广告,我看不懂……
作者: harinlen    时间: 2012-9-13 18:05
这个碉堡了啊……貌似有关RM访问互联网的问题就能得到永久性解决了?现在除了工程尚未完工就是就是能不能和三代RM的游戏主程序的兼容性如何了。
貌似……调用API的限制很多?
(但是打心里支持这个工程啊!!!!!!Github果然好东西好多……)
作者: feizhaodan    时间: 2012-9-13 18:07
围观学习学习
作者: orochi2k    时间: 2012-9-13 20:16
本帖最后由 orochi2k 于 2012-9-13 20:18 编辑

很久很久很久以前,曾经有个叫ARGSS的东东……后来当“WE ARE ALMOST THERE”的时候,坑掉了……
http://sourceforge.net/projects/argss/
用的也是SDL
那个时候大家都还很年轻(大雾)
作者: 老邢    时间: 2012-9-13 20:26
ruby虽然看得懂,但写大段的代码就不灵了,前排围观,另外可参加Mac版测试
作者: 彭格列第XI代    时间: 2012-9-13 21:34
自制RM兼容版?
作者: 千葉玖濑    时间: 2012-9-13 23:12
这个是什么我看不懂……
作者: 熊的选民    时间: 2012-9-14 06:38
不太懂ruby,不过用c++写一些关键函数的话效率是不是能高一些?
作者: yangff    时间: 2012-9-14 12:25
    registry.open('Software\Enterbrain\RGSS\RTP' + $RGSS_VERSION.to_s) do |reg|

=>

    registry.open('Software\Enterbrain\RGSS3'+$RGSS_VERSION.to_s+'\RTP') do |reg|
作者: Shy07    时间: 2012-9-14 12:58
  1. #------------------------------------------------------------------------------
  2. # SDL_RSGE
  3. #------------------------------------------------------------------------------
  4. # SDL_RSGE 库,是针对 RSGE 标准库的 Ruby/SDL 库二次封装。
  5. #------------------------------------------------------------------------------

  6. module SDL_RSGE
  7.   #----------------------------------------------------------------------------
  8.   # ● 引用库
  9.   #----------------------------------------------------------------------------
  10.   require 'sdl'
  11.   require 'win32api'
  12.   #----------------------------------------------------------------------------
  13.   # ● 全局变量
  14.   #----------------------------------------------------------------------------
  15.   $SDL_title = "Untitled"
  16.   $SDL_width = 640
  17.   $SDL_height = 480
  18.   $SDL_frame_rate = 60
  19.   $SDL_frame_count = 0
  20.   $SDL_brightness = 255
  21.   $SDL_X_Adjust = 3
  22.   $SDL_Y_Adjust = 14
  23.   #----------------------------------------------------------------------------
  24.   # SDL_RSGE::Input
  25.   #----------------------------------------------------------------------------
  26.   # 管理键盘输入的模块。
  27.   #----------------------------------------------------------------------------
  28.   module Input
  29.     def update
  30.       SDL::Key.scan
  31.     end

  32.     def press?(num)
  33.       return SDL::Key.press?(num)
  34.     end

  35.     def trigger?(num)
  36.       return SDL::Key.press?(num)
  37.     end

  38.     def repeat?(num)
  39.       return SDL::Key.press?(num)
  40.     end

  41.   end
  42.   #----------------------------------------------------------------------------
  43.   # SDL_RSGE::FPS_Timer
  44.   #----------------------------------------------------------------------------
  45.   # 实现帧数控制及计时器的类。
  46.   #----------------------------------------------------------------------------
  47.   class FPS_Timer
  48.     #----------------------------------------------------------------------------
  49.     # ● 常量
  50.     #----------------------------------------------------------------------------
  51.     FPS_COUNT = 10
  52.     #--------------------------------------------------------------------------
  53.     # ● 实例变量
  54.     #--------------------------------------------------------------------------
  55.     attr_accessor :fps
  56.     attr_reader   :real_fps
  57.     attr_reader   :total_skip
  58.     attr_reader   :count_sleep
  59.     #--------------------------------------------------------------------------
  60.     # ● 初始化对像
  61.     #--------------------------------------------------------------------------
  62.     def initialize(fps = 60, accurary = 10, skip_limit = 15)
  63.       @fps = fps
  64.       @accurary = accurary / 1000.0
  65.       @skip_limit = skip_limit
  66.     end
  67.     #--------------------------------------------------------------------------
  68.     # ● 重置
  69.     #--------------------------------------------------------------------------
  70.     def reset
  71.       @old = get_ticks
  72.       @skip = 0
  73.       @real_fps = @fps
  74.       @frame_count = 0
  75.       @fps_old = @old
  76.       @count_sleep = 0
  77.       @total_skip = 0
  78.     end
  79.     #--------------------------------------------------------------------------
  80.     # ● 等待帧
  81.     #--------------------------------------------------------------------------
  82.     def wait_frame
  83.       now = get_ticks
  84.       nxt = @old + (1.0 / @fps)
  85.       if nxt > now or @skip > @skip_limit
  86.         yield
  87.         @skip = 0
  88.         delay(nxt)
  89.         @old = nxt
  90.       else
  91.         @skip += 1
  92.         @total_skip += 1
  93.         @old = get_ticks
  94.       end
  95.       calc_real_fps
  96.     end
  97.     #--------------------------------------------------------------------------
  98.     # ● 私有方法
  99.     #--------------------------------------------------------------------------
  100.     private
  101.     #--------------------------------------------------------------------------
  102.     # ● 等待 nxt 指定的毫秒数
  103.     #--------------------------------------------------------------------------
  104.     def delay(nxt)
  105.       while nxt > get_ticks + @accurary
  106.         sleep(@accurary - 0.005)
  107.         @count_sleep += 1
  108.       end
  109.       while nxt > get_ticks
  110.         # 循环超时,无操作
  111.       end
  112.     end
  113.     #--------------------------------------------------------------------------
  114.     # ● 获取当前毫秒数
  115.     #--------------------------------------------------------------------------
  116.     def get_ticks
  117.       SDL.get_ticks / 1000.0
  118.     end
  119.     #--------------------------------------------------------------------------
  120.     # ● 计算实际FPS
  121.     #--------------------------------------------------------------------------
  122.     def calc_real_fps
  123.       @frame_count += 1
  124.       if @frame_count >= FPS_COUNT
  125.         @frame_count = 0
  126.         now = get_ticks
  127.         @real_fps = FPS_COUNT / (now - @fps_old)
  128.         @fps_old = now
  129.       end
  130.     end
  131.   end
  132.   #----------------------------------------------------------------------------
  133.   # SDL_RSGE::SDL_Frame
  134.   #----------------------------------------------------------------------------
  135.   # 生成游戏主窗口的类。
  136.   #----------------------------------------------------------------------------
  137.   class SDL_Frame
  138.     #--------------------------------------------------------------------------
  139.     # ● 类变量
  140.     #--------------------------------------------------------------------------
  141.     @@GetSMetrics  = Win32API.new('user32', 'GetSystemMetrics', 'l', 'i')
  142.     @@FindWindow   = Win32API.new('user32', 'FindWindow', 'pp', 'i')
  143.     @@SetWindowPos = Win32API.new('user32', 'SetWindowPos', 'lllllll', 'i')
  144.     #--------------------------------------------------------------------------
  145.     # ● 初始化对象
  146.     #--------------------------------------------------------------------------
  147.     def initialize
  148.       @screen_width  = @@GetSMetrics.call(0)
  149.       @screen_height = @@GetSMetrics.call(1)
  150.       SDL.init(SDL::INIT_VIDEO)
  151.       SDL::WM::set_caption($SDL_title, $0)
  152.       @hwnd = @@FindWindow.call(0, $SDL_title.encode($RSGE_System_Encode))
  153.       x = (@screen_width  - $SDL_width ) / 2 - $SDL_X_Adjust
  154.       y = (@screen_height - $SDL_height) / 2 - $SDL_Y_Adjust
  155.       @@SetWindowPos.call(@hwnd, 0, x, y, 0, 0, 0)
  156.       $SDL_Screen = SDL_Screen.new
  157.       SDL::Mouse.hide if $SDL_hide_mouse
  158.       SDL::TTF.init
  159.     end
  160.   end
  161.   #----------------------------------------------------------------------------
  162.   # SDL_RSGE::SDL_Screen
  163.   #----------------------------------------------------------------------------
  164.   # 生成游戏主画面的类。
  165.   #----------------------------------------------------------------------------
  166.   class SDL_Screen
  167.     #--------------------------------------------------------------------------
  168.     # ● 类变量
  169.     #--------------------------------------------------------------------------
  170.     @@fps_timer = FPS_Timer.new($SDL_frame_rate)
  171.     #--------------------------------------------------------------------------
  172.     # ● 实例变量
  173.     #--------------------------------------------------------------------------
  174.     attr_accessor :screen
  175.     #--------------------------------------------------------------------------
  176.     # ● 初始化对象
  177.     #--------------------------------------------------------------------------
  178.     def initialize
  179.       flag = SDL::SWSURFACE
  180.       @screen = SDL::Screen.open($SDL_width, $SDL_height, 32, flag)
  181.       @screen.flip
  182.       @@fps_timer.reset
  183.       SDL::TTF.init
  184.       @font = SDL::TTF.open('simhei.ttf',18)
  185.       @font.style = SDL::TTF::STYLE_NORMAL
  186.       @sprites = []
  187.     end
  188.     #--------------------------------------------------------------------------
  189.     # ● 刷新画面
  190.     #--------------------------------------------------------------------------
  191.     def update
  192.       @@fps_timer.wait_frame do
  193.         @sprites.each { |sprite_z|
  194.           sprite_z.each { |sprite|
  195.             sprite.update unless sprite.updated
  196.             sprite.updated = true
  197.           }
  198.         }
  199.         @font.draw_blended_utf8(@screen,@@fps_timer.real_fps.round.to_s,0,0,255,255,255)
  200.         @screen.flip
  201.       end
  202.       @screen.fill_rect(0, 0, $SDL_width, $SDL_height, [0, 0, 0])
  203.     end
  204.     #--------------------------------------------------------------------------
  205.     # ●
  206.     #--------------------------------------------------------------------------
  207.     def add_sprite(sprite)
  208.       if @sprites[sprite.z] == nil
  209.         @sprites[sprite.z] = Array.new
  210.       end
  211.       @sprites[sprite.z] << sprite
  212.     end
  213.     #--------------------------------------------------------------------------
  214.     # ●
  215.     #--------------------------------------------------------------------------
  216.     def format
  217.       return @screen.format
  218.     end
  219.   end
  220.   #----------------------------------------------------------------------------
  221.   # RSGE::Bitmap
  222.   #----------------------------------------------------------------------------
  223.   # 位图的类。位图就是所谓的“图像”。
  224.   # 在画面上显示位图,必须使用精灵(Sprite 精灵类)之类的对象。
  225.   #----------------------------------------------------------------------------
  226.   class Bitmap
  227.     #--------------------------------------------------------------------------
  228.     # ● 定义实例变量
  229.     #--------------------------------------------------------------------------
  230.     attr_reader   :layer_info
  231.     #--------------------------------------------------------------------------
  232.     # ● 初始化对像
  233.     #--------------------------------------------------------------------------
  234.     def initialize(*args)
  235.       @layer_info  = []
  236.       @temp_bitmap = []
  237.       @format = $SDL_Screen.format
  238.       if args.size == 1
  239.         @surface = SDL::Surface.load(args[0])
  240.       elsif args.size == 2
  241.         @surface = SDL::Surface.new(SDL::SRCALPHA, args[0], args[1], @format)
  242.       else
  243.         p "参数错误".encode($RSGE_System_Encode)
  244.       end
  245.       @surface.display_format_alpha
  246.       @layer_info << [:nil, @surface]
  247.       @width  = @surface.w
  248.       @height = @surface.h
  249.     end
  250.     #--------------------------------------------------------------------------
  251.     # ● 释放位图。若是已经若显示端口已释放则什么都不做。
  252.     #--------------------------------------------------------------------------
  253.     def dispose
  254.       return if self.disposed?
  255.       @surface.destroy
  256.       @layer_info.clear
  257.       @temp_bitmap.each { |bmp| bmp.destroy }
  258.       @temp_bitmap.clear
  259.     end
  260.     #--------------------------------------------------------------------------
  261.     # ● 当位图已释放时返回 true。
  262.     #--------------------------------------------------------------------------
  263.     def disposed?
  264.       return @surface.destroyed?
  265.     end
  266.     #--------------------------------------------------------------------------
  267.     # ● 获取位图宽度。
  268.     #--------------------------------------------------------------------------
  269.     def width
  270.       return @width
  271.     end
  272.     #--------------------------------------------------------------------------
  273.     # ● 获取位图高度。
  274.     #--------------------------------------------------------------------------
  275.     def height
  276.       return @height
  277.     end
  278.     #--------------------------------------------------------------------------
  279.     # ● 获取位图矩形(Rect 矩形类)。
  280.     #--------------------------------------------------------------------------
  281.     def rect
  282.       return Rect.new(0, 0, @width, @height)
  283.     end
  284.     #--------------------------------------------------------------------------
  285.     # ● 执行从位图 src_bitmap 的矩形 src_rect(Rect 矩形类)
  286.     #  到指定的位图坐标 (x, y) 之间的区块过渡。
  287.     #--------------------------------------------------------------------------
  288.     def blt(x, y, src_bitmap, src_rect, opacity = 255)
  289.       temp_bitmap = src_bitmap.layer_info[0][1].\
  290.         copy_rect(src_rect.x, src_rect.y, src_rect.width, src_rect.height)
  291.       temp_bitmap.set_alpha(SDL::SRCALPHA, opacity)
  292.       info = [:blt, temp_bitmap, x, y]
  293.       @layer_info << info
  294.       @temp_bitmap << temp_bitmap
  295.     end
  296.     #--------------------------------------------------------------------------
  297.     # ● 执行从位图 src_bitmap 的矩形 src_rect(Rect 矩形类)
  298.     #  带指定的位图目标矩形 dest_rect(Rect 矩形类)之间的区块过渡。
  299.     #--------------------------------------------------------------------------
  300.     def stretch_blt(dest_rect, src_bitmap, src_rect, opacity = 255)
  301.       info = [:stretch_blt, dest_rect, src_bitmap, src_rect, opacity]
  302.       @layer_info << info
  303.     end
  304.     #--------------------------------------------------------------------------
  305.     # ● 将位图区域 (x, y, width, height) 或矩形(Rect 矩形类)
  306.     #  填满指定的颜色 color (Color 色彩类)。
  307.     #--------------------------------------------------------------------------
  308.     def fill_rect(*args)
  309.       if args.size == 5
  310.         x, y, width, height = args[0], args[1], args[2], args[3]
  311.         alpha = args[4].alpha
  312.         color = $SDL_Screen.format.map_rgba(args[4].red, args[4].green,
  313.           args[4].blue, args[4].alpha)
  314.       elsif args.size == 2
  315.         x, y, width, height = args[0].x, args[0].y, args[0].width, args[0].height
  316.         alpha = args[1].alpha
  317.         color = $SDL_Screen.format.map_rgba(args[1].red, args[1].green,
  318.           args[1].blue, args[1].alpha)
  319.       end
  320.       temp_bitmap = SDL::Surface.new(SDL::SRCALPHA, width, height, @format)
  321.       temp_bitmap.set_alpha(SDL::SRCALPHA, alpha)
  322.       temp_bitmap.draw_rect(0, 0, width, height, color, true, alpha)
  323.       info = [:fill_rect, temp_bitmap, x, y]
  324.       @layer_info << info
  325.       @temp_bitmap << temp_bitmap
  326.     end
  327.     #--------------------------------------------------------------------------
  328.     # ● 在位图区域 (x, y, width, height) 或矩形 rect (Rect 矩形类)中
  329.     #  描绘字符串 str 。
  330.     #--------------------------------------------------------------------------
  331.     def draw_text(*args)
  332.       if args.size >= 5
  333.         x, y, width, height = args[0], args[1], args[2], args[3]
  334.         str = args[4]
  335.         align = args[5] if args.size == 5
  336.       else
  337.         x, y, width, height = args[0].x, args[0].y, args[0].width, args[0].height
  338.         str = args[2]
  339.         align = args[3] if args.size == 3
  340.       end
  341.       temp_bitmap = SDL::Surface.new(SDL::SRCALPHA, width, height, @format)
  342.       font = SDL::TTF.open('simhei.ttf', 20)
  343.       font.style = SDL::TTF::STYLE_NORMAL
  344.       font.draw_blended_utf8(temp_bitmap, str, 0, 0, 255, 255, 255)
  345.       font.close
  346.       info = [:fill_rect, temp_bitmap, x, y]
  347.       @layer_info << info
  348.       @temp_bitmap << temp_bitmap
  349.     end
  350.   end
  351.   #----------------------------------------------------------------------------
  352.   # RSGE::Sprite
  353.   #----------------------------------------------------------------------------
  354.   # 精灵的类。精灵是在游戏画面上显示角色等的基本概念。
  355.   #----------------------------------------------------------------------------
  356.   class Sprite
  357.     attr_accessor :bitmap
  358.     attr_accessor :src_rect
  359.     attr_accessor :visible
  360.     attr_accessor :x
  361.     attr_accessor :y
  362.     attr_accessor :z
  363.     attr_accessor :updated
  364.     #--------------------------------------------------------------------------
  365.     # ● 初始化对像
  366.     #--------------------------------------------------------------------------
  367.     def initialize
  368.       @bitmap = nil
  369.       @src_rect = nil
  370.       @visible = true
  371.       @x = 0
  372.       @y = 0
  373.       @z = 0
  374.       @ox = 0
  375.       @oy = 0
  376.       @updated = false
  377.       $SDL_Screen.add_sprite(self)
  378.     end
  379.     #--------------------------------------------------------------------------
  380.     # ● 释放精灵。
  381.     #--------------------------------------------------------------------------
  382.     def dispose
  383.       @bitmap.dispose
  384.     end
  385.     #--------------------------------------------------------------------------
  386.     # ● 当精灵已释放则返回 true。
  387.     #--------------------------------------------------------------------------
  388.     def disposed?
  389.       return @bitmap.disposed?
  390.     end
  391.     #--------------------------------------------------------------------------
  392.     # ● 刷新画面
  393.     #--------------------------------------------------------------------------
  394.     def update
  395.       return if @bitmap == nil or not @visible
  396.       @bitmap.layer_info.each { |info|
  397.         case info[0]
  398.         when :nil
  399.           SDL::Surface.blit(info[1], @src_rect.x, @src_rect.y,
  400.             @src_rect.width, @src_rect.height, $SDL_Screen.screen, @x+@ox, @y+@oy)
  401.         when :blt
  402.           SDL::Surface.blit(info[1], 0, 0, @src_rect.width-info[2],
  403.             @src_rect.height-info[3], $SDL_Screen.screen, @x+@ox+info[2], @y+@oy+info[3])
  404.         when :stretch_blt
  405.           #待书写
  406.         when :fill_rect
  407.           SDL::Surface.blit(info[1], 0, 0, @src_rect.width-info[2],
  408.             @src_rect.height-info[3], $SDL_Screen.screen, @x+@ox+info[2], @y+@oy+info[3])
  409.         when :draw_text
  410.           SDL::Surface.blit(info[1], 0, 0, @src_rect.width-info[2],
  411.             @src_rect.height-info[3], $SDL_Screen.screen, @x+@ox+info[2], @y+@oy+info[3])
  412.         end
  413.       }
  414.       #------------------------------------------------------------------------
  415.       # ● 获取精灵的宽度,相当于 src_rect.width。
  416.       #------------------------------------------------------------------------
  417.       def width
  418.         return @src_rect.width
  419.       end
  420.       #------------------------------------------------------------------------
  421.       # ● 获取精灵的高度,相当于 src_rect.height。
  422.       #------------------------------------------------------------------------
  423.       def height
  424.         return @src_rect.height
  425.       end
  426.     end
  427.     #--------------------------------------------------------------------------
  428.     # ● 引用作为精灵起始点的位图(Bitmap 点阵图类)。
  429.     #--------------------------------------------------------------------------
  430.     def bitmap=(bmp)
  431.       @bitmap = bmp
  432.       @src_rect = Rect.new(0, 0, bmp.width, bmp.height)
  433.     end
  434.   end
  435.   #----------------------------------------------------------------------------
  436.   # SDL_RSGE::Color
  437.   #----------------------------------------------------------------------------
  438.   # 颜色的类。
  439.   #----------------------------------------------------------------------------
  440.   class Color
  441.     #--------------------------------------------------------------------------
  442.     # ● 定义实例变量
  443.     #--------------------------------------------------------------------------
  444.     attr_reader   :red
  445.     attr_reader   :green
  446.     attr_reader   :blue
  447.     attr_reader   :alpha
  448.     #--------------------------------------------------------------------------
  449.     # ● 初始化对像
  450.     #--------------------------------------------------------------------------
  451.     def initialize(red, green, blue, alpha = 255)
  452.       set(red, green, blue, alpha)
  453.     end
  454.     #--------------------------------------------------------------------------
  455.     # ● set
  456.     #  一次设置所有属性。
  457.     #--------------------------------------------------------------------------
  458.     def set(red, green, blue, alpha = 255)
  459.       @red   = red
  460.       @green = green
  461.       @blue  = blue
  462.       @alpha = alpha
  463.     end
  464.   end
  465.   #----------------------------------------------------------------------------
  466.   # SDL_RSGE::Rect
  467.   #----------------------------------------------------------------------------
  468.   # 矩形的类。
  469.   #----------------------------------------------------------------------------
  470.   class Rect
  471.     #--------------------------------------------------------------------------
  472.     # ● 定义实例变量
  473.     #--------------------------------------------------------------------------
  474.     attr_reader   :x
  475.     attr_reader   :y
  476.     attr_reader   :width
  477.     attr_reader   :height
  478.     #--------------------------------------------------------------------------
  479.     # ● 初始化对像
  480.     #--------------------------------------------------------------------------
  481.     def initialize(x, y, width, height)
  482.       set(x, y, width, height)
  483.     end
  484.     #--------------------------------------------------------------------------
  485.     # ● set
  486.     #  一次设置所有属性。
  487.     #--------------------------------------------------------------------------
  488.     def set(x, y, width, height)
  489.       @x = x
  490.       @y = y
  491.       @width  = width
  492.       @height = height
  493.     end
  494.   end
  495.   #----------------------------------------------------------------------------
  496.   # SDL_RSGE::Tone
  497.   #----------------------------------------------------------------------------
  498.   # 色调的类。
  499.   #----------------------------------------------------------------------------
  500.   class Tone
  501.     #--------------------------------------------------------------------------
  502.     # ● 定义实例变量
  503.     #--------------------------------------------------------------------------
  504.     attr_reader   :red
  505.     attr_reader   :green
  506.     attr_reader   :blue
  507.     attr_reader   :gray
  508.     #--------------------------------------------------------------------------
  509.     # ● 初始化对像
  510.     #--------------------------------------------------------------------------
  511.     def initialize(red, green, blue, gray = 0)
  512.       set(red, green, blue, gray)
  513.     end
  514.     #--------------------------------------------------------------------------
  515.     # ● set
  516.     #  一次设置所有属性。
  517.     #--------------------------------------------------------------------------
  518.     def set(red, green, blue, gray = 0)
  519.       @red   = red
  520.       @green = green
  521.       @blue  = blue
  522.       @alpha = gray
  523.     end
  524.   end
  525. end
复制代码
我的毕业论文其中就有一部分是用Ruby/SDL实现RGSS,可惜……那时我还年轻……
作者: DeathKing    时间: 2012-9-14 13:07
喵的,为啥我一上大学就忙得不可开交?
作者: Shy07    时间: 2012-9-14 18:16
如果用opengl的话可以实现alpha通道混合,不用写得这么罗嗦,但是不知道是我技术不到家还是ruby/sdl本身的问题,开了opengl之后cpu直接100% = =
另外推荐一下StarRuby,mode7实现得很不错
作者: 贴吧使用者    时间: 2012-9-14 18:29
看起来好厉害的样子
作者: 晴兰    时间: 2012-9-14 19:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: zh99998    时间: 2012-9-14 21:03
#晒进度

作者: yangff    时间: 2012-9-15 09:48
本帖最后由 yangff 于 2012-9-15 09:49 编辑

加强Tone合成……尼玛这fps能看?

对照组:

人家还有动画帧率这么高……SDL有缓存的画都这fps……不说什么了……
作者: 越前リョーマ    时间: 2012-9-15 13:32
纯粹跑过来支持zh - -
作者: 草莓    时间: 2012-9-15 13:36
当年一直以为zh是个小学生

可能是因为他总是被摸头的缘故吧

我这个笨蛋_(︰3亅∠)_
作者: 死基老    时间: 2012-9-15 15:06
程序员们都忙着做项目,挣钱呢
作者: R-零    时间: 2012-9-15 17:39
tilemap可以直接无视
作者: 老邢    时间: 2012-9-15 19:25
其实我觉得可以用Mono尝试一下,再做一个ruby解析器作用实在有限。目前rm项目组(可能是市场部门,具体职位不清楚)正在跟人合作xbox的移植工具,肯定是基于c#的,是不是Mono还不清楚,我也跟他们谈了我为什么用Lua,面对移动游戏市场广阔的前景,估计他们也会想改变现状。

下面是邮件,我英语不好,别笑话。

2012/9/15 RPGMaker Projects
Yes, I just talked to a friend of mine about it and I was told that LUA is very popular with Game Industry? If so that's a great choice because of the easy language. :D


On Sat, Sep 15, 2012 at 8:13 AM, Ye Xing wrote:
C# is a good language, but I'm not familiar with Mono, so I didn't choice C#. On the other hand, Lua is small and fast, easy to learn. At the same time, it can be modified "ruby look", so the RPG Maker users should easy to use it.


2012/9/15 RPGMaker Projects
Hi XingYe,

I'm just wondering, why not C# for the language?

Cheers!

作者: yangff    时间: 2012-9-15 19:52
老邢 发表于 2012-9-15 19:25
其实我觉得可以用Mono尝试一下,再做一个ruby解析器作用实在有限。目前rm项目组(可能是市场部门,具体职位 ...

我快给SDL Ruby跪了……
作者: 冰岩工作室    时间: 2012-9-15 20:00
没空看帖的路过
作者: satgo1546    时间: 2012-9-15 20:02
github是什么东西?能吃吗?
对于截图,我要问:is-it-linux?
作者: yangff    时间: 2012-9-15 20:26
老邢 发表于 2012-9-15 19:25
其实我觉得可以用Mono尝试一下,再做一个ruby解析器作用实在有限。目前rm项目组(可能是市场部门,具体职位 ...


说错了Ipa Free貌似……验证数据没有意义,除非你去查账……
作者: 老邢    时间: 2012-9-15 20:29
yangff 发表于 2012-9-15 20:26
说错了Ipa Free貌似……验证数据没有意义,除非你去查账……

其实是IAP(In App Purchase)

可以看看这篇文章
http://www.himigame.com/iphone-cocos2d/673.html
作者: yangff    时间: 2012-9-15 20:47
老邢 发表于 2012-9-15 20:29
其实是IAP(In App Purchase)

可以看看这篇文章

是啊……我说的就是后面那种。。伪造回执……他也没给出什么很好的保护办法。。验收信息那段直接在发送之前把transaction截获下来丢回去(你不是要receipt吗?)……虽然这样做没什么通用性,但是对于同一工具开发出来的游戏有很好效果……
作者: zh99998    时间: 2012-9-15 21:45
OpenRGSS1.x坂本已确定用ruby/SDL, 请不要再纠结其他引擎。
作者: 老邢    时间: 2012-9-15 21:47
yangff 发表于 2012-9-15 20:47
是啊……我说的就是后面那种。。伪造回执……他也没给出什么很好的保护办法。。验收信息那段直接在发送之 ...

话说没有破解不了的东西,也只能多加点保护方式然后自求多福了,比如连接特定网址取得验证码,验证设备是否越狱。实在不行把重要数据放到网上,做成单机网游好了。

有点歪楼了,说点跟项目相关的。我也用SDL有一段时间了,但是我在图形方面用得很少,大部分图形操作都是Opengl完成的,感觉SDL blit的效率不如原生API高。
作者: 冰岩工作室    时间: 2012-9-15 21:59
想玩c++不会玩rgss的路过
作者: yangff    时间: 2012-9-16 09:09
老邢 发表于 2012-9-15 21:47
话说没有破解不了的东西,也只能多加点保护方式然后自求多福了,比如连接特定网址取得验证码,验证设备是 ...

是啊……SDL的效率地的一笔。。连GDI都不如……
作者: zh99998    时间: 2012-9-21 16:20
0.1.5预览版本已发布 感谢yangff.
作者: zeldafd    时间: 2013-1-22 13:33
我找到bitmap類了==:
謝謝大神!!

用sdl的話, 會不會比eb的rgss運行時更有效率?
作者: wsffx13    时间: 2013-1-24 19:22
我来看神的,为什么不干脆自己建个跨平台游戏制作工具……
作者: pigsss    时间: 2013-1-24 19:57
求教:如何 下载和安装OpenRGSS




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1