Project1

标题: 【算法时间】如何让一个精灵围绕着屏幕中心公转? [打印本页]

作者: 上帝的眼睛    时间: 2010-7-7 22:56
标题: 【算法时间】如何让一个精灵围绕着屏幕中心公转?
咱表示咱是为了活跃被SSD同学们僵化的大脑……
天天看着$game_XXXX $data_XXXX Scene_XXXX觉得大脑都不会思考了,所以决定来这里找一下灵感

当然,作为出题者,也是提供了相当丰厚的奖励的……同时我也会派遣马甲来这里回答问题(= =|||)

如果除了我的马甲没有人把答案上交的话那么就很可怜……这1VIP就物归原主了……

下面提供框架,具体实现脚本请自己YY
  1. class Scene_Demo

  2.   def main

  3.     @tip = Sprite.new(Viewport.new(0,0,640,480))

  4.     @tip.bitmap = Bitmap.new(12*32,32)

  5.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)

  6.     @sprite = Sprite.new(Viewport.new(0,0,640,480))

  7.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……

  8.     #此处添加脚本

  9.     # 执行过渡

  10.     Graphics.transition

  11.     # 主循环

  12.     loop do

  13.       # 刷新游戏画面

  14.       Graphics.update

  15.       # 刷新输入信息

  16.       Input.update

  17.       # 刷新画面

  18.       update

  19.       # 如果切换画面就中断循环

  20.       if $scene != self

  21.         break

  22.       end

  23.     end

  24.     # 准备过渡

  25.     Graphics.freeze

  26.     @tip.dispose

  27.     @sprite.dispose

  28.   end

  29.   def update

  30.     if Input.trigger?(Input::B)

  31.       # 演奏取消 SE

  32.       $game_system.se_play($data_system.cancel_se)

  33.       # 切换的地图画面

  34.       $scene = Scene_Map.new

  35.       return

  36.     end

  37. #此处添加脚本

  38.   end

  39. end
复制代码

作者: zhangbanxian    时间: 2010-7-7 22:56
放个最弱智的算法。
  1. class Scene_Demo
  2.   def initialize
  3.     @半径 = 200
  4.     @度数 = 0
  5.   end

  6.   def main

  7.     @tip = Sprite.new(Viewport.new(0,0,640,480))

  8.     @tip.bitmap = Bitmap.new(12*32,32)

  9.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)

  10.     @sprite = Sprite.new(Viewport.new(0,0,640,480))

  11.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……

  12.     #此处添加脚本


  13.     # 执行过渡

  14.     Graphics.transition

  15.     # 主循环

  16.     loop do

  17.       # 刷新游戏画面

  18.       Graphics.update

  19.       # 刷新输入信息

  20.       Input.update

  21.       # 刷新画面

  22.       update

  23.       # 如果切换画面就中断循环

  24.       if $scene != self

  25.         break

  26.       end

  27.     end

  28.     # 准备过渡

  29.     Graphics.freeze

  30.     @tip.dispose

  31.     @sprite.dispose

  32.   end

  33.   def update

  34.     if Input.trigger?(Input::B)

  35.       # 演奏取消 SE

  36.       $game_system.se_play($data_system.cancel_se)

  37.       # 切换的地图画面

  38.       $scene = Scene_Map.new

  39.       return

  40.     end

  41. #此处添加脚本
  42.      @度数 += 0.1
  43.      @sprite.x = Math.sin(@度数) * @半径 + 320
  44.      @sprite.y = Math.cos(@度数) * @半径 + 240
  45.   end

  46. end
复制代码

作者: wbsy8241    时间: 2010-7-7 23:58
  1. class Scene_Demo
  2.   def main
  3.     @tip = Sprite.new(Viewport.new(0,0,640,480))
  4.     @tip.bitmap = Bitmap.new(12*32,32)
  5.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)
  6.     @sprite = Sprite.new(Viewport.new(0,0,640,480))
  7.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……

  8.     #此处添加脚本                           #│
  9.     @x = 320 #目标点                        #│
  10.     @y = 240 #目标点                        #│
  11.     @sprite.ox = @sprite.bitmap.width/2     #│
  12.     @sprite.oy = @sprite.bitmap.height/2    #├NEW
  13.     @s = 0                                  #│
  14.     @speed = 5    # 旋转速度                #│
  15.     @a = 100      # 旋转直径                #│
  16.     @pi = 3.141592653                       #│

  17.     # 执行过渡
  18.     Graphics.transition
  19.     # 主循环
  20.     loop do
  21.       # 刷新游戏画面
  22.       Graphics.update
  23.       # 刷新输入信息
  24.       Input.update
  25.       # 刷新画面
  26.       update
  27.       # 如果切换画面就中断循环
  28.       if $scene != self
  29.         break
  30.       end
  31.     end
  32.     # 准备过渡
  33.     Graphics.freeze
  34.     @tip.dispose
  35.     @sprite.dispose
  36.   end
  37.   def update
  38.     if Input.trigger?(Input::B)
  39.       # 演奏取消 SE
  40.       $game_system.se_play($data_system.cancel_se)
  41.       # 切换的地图画面
  42.       $scene = Scene_Map.new
  43.       return
  44.     end
  45. #此处添加脚本
  46.     @s += @speed                                #│
  47.     @sprite.angle = @s                          #│
  48.     @sprite.x = Math.sin(@s*@pi/180) * @a + @x  #├NEW
  49.     @sprite.y = Math.cos(@s*@pi/180) * @a + @y  #│

  50.   end
  51. end
复制代码

作者: 紫苏    时间: 2010-7-8 02:10
(x-w)^2+(x-h)^2=r^2 的方法:
  1. class Scene_Demo
  2.   RADIUS = 50
  3.   DIR = 1 # {0, 1}
  4.   SPEED = 1
  5.   RADIUS2 = RADIUS * RADIUS
  6.   OX = 320
  7.   OY = 240
  8.   OFFSET = RADIUS / Math.sqrt(2)
  9.   X1 = OX - OFFSET
  10.   X2 = OX + OFFSET
  11.   Y1 = OY - OFFSET
  12.   def main
  13.     @tip = Sprite.new(Viewport.new(0,0,640,480))
  14.     @tip.bitmap = Bitmap.new(640, 480)
  15.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)
  16.     @sprite = Sprite.new(Viewport.new(0,0,640,480))
  17.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……
  18.     @sprite.ox = @sprite.bitmap.width >> 1
  19.     @sprite.oy = @sprite.bitmap.height >> 1
  20.     #此处添加脚本
  21.     @sprite.x = OX - RADIUS
  22.     @sprite.y = OY
  23.     # 执行过渡
  24.     Graphics.transition
  25.     # 主循环
  26.     loop do
  27.       # 刷新游戏画面
  28.       Graphics.update
  29.       # 刷新输入信息
  30.       Input.update
  31.       # 刷新画面
  32.       update
  33.       # 如果切换画面就中断循环
  34.       if $scene != self
  35.         break
  36.       end
  37.     end
  38.     # 准备过渡
  39.     Graphics.freeze
  40.     @tip.dispose
  41.     @sprite.dispose
  42.   end

  43.   def update
  44.     if Input.trigger?(Input::B)
  45.       # 演奏取消 SE
  46.       $game_system.se_play($data_system.cancel_se)
  47.       # 切换的地图画面
  48.       $scene = Scene_Map.new
  49.       return
  50.     end
  51.     #此处添加脚本
  52.     x = @sprite.x
  53.     y = @sprite.y
  54.     dir = [:+, :-]
  55.     if x >= X1 && x <= X2
  56.       x = @sprite.send(:x=, x.send(dir[y <= Y1 ? ~DIR : DIR], SPEED)) - OX
  57.       y = Math.sqrt(RADIUS2 - x * x)
  58.       @sprite.y = (@sprite.y <= OY ? OY - y : y + OY).round
  59.     else
  60.       y = @sprite.send(:y=, y.send(dir[x <= X1 ? DIR : ~DIR], SPEED)) - OY
  61.       x = Math.sqrt(RADIUS2 - y * y)
  62.       @sprite.x = (@sprite.x <= OX ? OX - x : x + OX).round
  63.     end
  64.     @tip.bitmap.set_pixel(@sprite.x, @sprite.y, Color.new(255, 0, 0))
  65.   end

  66. end
复制代码

作者: 败笔    时间: 2010-7-8 02:40
本帖最后由 败笔 于 2010-7-8 15:26 编辑
  1. class Scene_Demo

  2.   def main

  3.     @tip = Sprite.new(Viewport.new(0,0,640,480))

  4.     @tip.bitmap = Bitmap.new(12*32,32)

  5.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)

  6.     @sprite = Sprite.new(Viewport.new(0,0,640,480))

  7.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……

  8.     #此处添加脚本
  9.     @sprite.x = 320
  10.       @sprite.y = 240

  11.     # 执行过渡

  12.     Graphics.transition

  13.     # 主循环

  14.     loop do

  15.       # 刷新游戏画面

  16.       Graphics.update

  17.       # 刷新输入信息

  18.       Input.update

  19.       # 刷新画面

  20.       update

  21.       # 如果切换画面就中断循环

  22.       if $scene != self

  23.         break

  24.       end

  25.     end

  26.     # 准备过渡

  27.     Graphics.freeze

  28.     @tip.dispose

  29.     @sprite.dispose

  30.   end

  31.   def update

  32.     if Input.trigger?(Input::B)

  33.       # 演奏取消 SE

  34.       $game_system.se_play($data_system.cancel_se)

  35.       # 切换的地图画面

  36.       $scene = Scene_Map.new

  37.       return

  38.     end

  39. #此处添加脚本
  40.     @sprite.angle += 5

  41.   end

  42. end
复制代码

作者: kukurui00    时间: 2010-7-8 08:48
哇  人才很多啊
作者: IamI    时间: 2010-7-8 11:37
偷天换柱,小声路过
  1. class Scene_Demo
  2.   def main
  3.     @tip = Sprite.new(Viewport.new(0,0,640,480))
  4.     @tip.bitmap = Bitmap.new(12*32,32)
  5.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)
  6.     @sprite = Sprite.new(Viewport.new(0,0,640,480))
  7.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……
  8.     b = Bitmap.new(640,480)
  9.     b.blt(20,20,@sprite.bitmap,@sprite.bitmap.rect)
  10.     @sprite.bitmap.dispose
  11.     @sprite.bitmap = b
  12.     @sprite.ox = @sprite.x = 320
  13.     @sprite.oy = @sprite.y = 240
  14.     #此处添加脚本
  15.     # 执行过渡
  16.     Graphics.transition
  17.     # 主循环
  18.     loop do
  19.       # 刷新游戏画面
  20.       Graphics.update
  21.       # 刷新输入信息
  22.       Input.update
  23.       # 刷新画面
  24.       update

  25.       # 如果切换画面就中断循环
  26.       if $scene != self
  27.         break
  28.       end
  29.     end
  30.     # 准备过渡
  31.     Graphics.freeze
  32.     @tip.dispose
  33.     @sprite.dispose
  34.   end
  35.   RAD = 1 / Math::PI
  36.   def update
  37.     @sprite.angle += RAD
  38.     if Input.trigger?(Input::B)
  39.       # 演奏取消 SE
  40.       $game_system.se_play($data_system.cancel_se)
  41.       # 切换的地图画面
  42.       $scene = Scene_Map.new
  43.       return
  44.     end
  45. #此处添加脚本
  46.   end
  47. end
复制代码





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