Project1

标题: 因为总被吐槽回合制落伍所以一嘚劲把回合制做成这样 [打印本页]

作者: 零教授    时间: 2018-2-24 05:05
标题: 因为总被吐槽回合制落伍所以一嘚劲把回合制做成这样
本帖最后由 零教授 于 2018-2-25 07:14 编辑



为啥一定要做ARPG,RM根本就不适合做ARPG,回合制永远是最经典的系统
让你见识一下你口中陈旧的系统能达到何种皂化XD


【嘛,其实这个RPSG系统是给BOSS做的,BOSS根据血量会转换多种弹幕,比如100%-80%:无弹幕;80%-60%:弹幕1;60-40%:无弹幕;40%-20%:弹幕2;20%-0%:弹幕3
这样能比较直观的看到BOSS转阶段并且有不同的技能啦】



作者: 89444640    时间: 2018-2-24 08:47
说回合制落后的人你理他干嘛,上下嘴唇一张一合,上顶天下接地。

说起来还真能战斗中实现弹幕效果呀~
我确实挺想弄一部分,直接用纵版stg模式来战斗的,但是无奈牵扯xp程序弄不出来……
本来试图实现各种经典弹幕,用手硬拼,后来发现不可能……简单子弹模式,或者复杂的单帧还行,动态没法弄……
如下……


这种横版弹幕好难躲的……给保弹幕苦手来三个险炸过去吧XD……

子弹圆形的还好,菱形的,排列不太规律了啊,不是圆形了。
作者: yang1zhi    时间: 2018-2-24 09:41
回合弹幕
作者: 寂静的夜里    时间: 2018-2-24 09:50
回合制不落后 落后的是回合制的相似玩法
如果大多数回合制的玩法都相似 那自然就是落后的
只要有一些不同于前人的地方 那无疑就是先进的。

作者: 余音·魔眼    时间: 2018-2-24 10:46
说回合制落后的人都是因为他根本就不知道回合制是什么,回合制千万不能用默认的那种(因为那才是真正的落后),回合制其实可以创造出比ARPG更多更好的玩法,因为回合制更讲究策略,而现在优秀的回合制游戏已经很少了,所以做出来的基本都是默认的那种回合,所以根本就不受欢迎,而玩家们也就很少见到那种不一样且优秀的回合了…
作者: 落雪鸦杀    时间: 2018-2-24 12:18
干脆做成qte多好,像《秋○原之旅》那样(
这套系统对于玩家来说很不友好,我宁愿选择回合制(
作者: Distoy    时间: 2018-2-24 12:26
本帖最后由 Distoy 于 2018-2-24 12:51 编辑

回合制可不落伍,而是相反回合制太高端多才没落的。
那种所谓动作RPG无外乎把平淡没有变化无策略的回合制变成了平淡没有变化的重复作业的QTE而已。
但是这两种给人的感觉确实相当不同,前作不能给人在玩游戏的假象,后者却能骗骗小白以为在玩游戏。
看了LZ这个,其实Undertale那样就很好。结合STG和RPG。
作者: 月下耶鲁夫    时间: 2018-2-24 12:57
感觉被触到
作者: soulsaga    时间: 2018-2-24 13:03
回合制加繁琐的操作感觉很累人的..
作者: colorlemon    时间: 2018-2-24 13:51
害怕,您做个格斗如何(x
作者: 百里_飞柳    时间: 2018-2-24 14:56
害怕,这个弹幕与玩家角色的碰撞处理是怎么做的,不会卡吗……
作者: chd114    时间: 2018-2-24 16:12
如果主要是彈幕,那你後兩個直接另外做一個模式就好了···
作者: 零教授    时间: 2018-2-24 17:54
本帖最后由 零教授 于 2018-2-25 07:15 编辑

我随便发一下四叶草弹的代码,因为我感觉我已经优化不下去了
这东西真的是卡......

RUBY 代码复制
  1. Sprite_Siyecao.new($game_troop.enemies[0],12)
  2.       Sprite_Siyecao.new($game_troop.enemies[0],12)
  3.       Sprite_Siyecao.new($game_troop.enemies[0],12)
  4.       Sprite_Siyecao.new($game_troop.enemies[0],12)
  5.       Sprite_Siyecao.new($game_troop.enemies[0],12)

主发射循环(一般循环5次,每次12组,即发射5*12组四叶草弹幕)
RUBY 代码复制
  1. class Sprite_Siyecao < Sprite
  2.   # character :发射者
  3.   # times     :发射子弹数
  4.   def initialize(character,times)
  5.     @viewport = $scene.spriteset.viewport3 #视野为战斗场面viewport3
  6.     super(@viewport)
  7.     @character = character
  8.     @ch = @character
  9.     @times = times
  10.     self.visible = true
  11.     reset
  12.   end
  13.  
  14.   ########################################
  15.  
  16. def reset
  17. #设置炮弹
  18.   return if $bullet.size >= 4096
  19. for i in 0...@times
  20. #检查指针上界
  21.         break if $bullet.size >= 4096 #子弹总数限制4096
  22.   angle = Math::PI / @times * i * 2 #角度为子弹数平分
  23.   sprite = Sprite_Small1.new(@viewport,@ch,angle) #建立小玉
  24.   s1 = Sprite_Heart1.new(@viewport,@ch,0,sprite) #建立心弹
  25.   s2 = Sprite_Heart1.new(@viewport,@ch,1,sprite)
  26.   s3 = Sprite_Heart1.new(@viewport,@ch,2,sprite)
  27.   s4 = Sprite_Heart1.new(@viewport,@ch,3,sprite)
  28.   $bullet.push(s1)
  29.   s1.z = 100+$bullet.size
  30.   $bullet.push(s2)
  31.   s2.z = 100+$bullet.size
  32.   $bullet.push(s3)
  33.   s3.z = 100+$bullet.size
  34.   $bullet.push(s4)
  35.   s4.z = 100+$bullet.size
  36.   $bullet.push(sprite)
  37.   sprite.z = 100+$bullet.size
  38. end
  39. Audio.thndj_se_play("Audio/SE/bullet_2",80,100)
  40. dispose
  41. end
  42.  
  43.   #--------------------------------------------------------------------------
  44.   # ● 释放
  45.   #--------------------------------------------------------------------------
  46.   def dispose
  47.     if self.bitmap != nil
  48.       self.bitmap.dispose
  49.       self.visible = false
  50.     end
  51.     super
  52.   end
  53.  
  54.  
  55.   #--------------------------------------------------------------------------
  56.   # ● 更新画面
  57.   #--------------------------------------------------------------------------
  58.   def update
  59.     super
  60.     dispose
  61.   end
  62.  
  63.  
  64.  
  65. end


小于(四叶草中心)
RUBY 代码复制
  1. class Sprite_Small1 < Sprite
  2.   attr_accessor :available
  3.   attr_accessor :vx #x 速度
  4.   attr_accessor :vy #y 速度
  5.   attr_accessor :ax #x 加速度
  6.   attr_accessor :ay #y 加速度
  7.   attr_accessor :vx0 #x 初速度
  8.   attr_accessor :vy0 #y 初速度
  9.   attr_accessor :an #角度
  10.   attr_accessor :an0 #初速度角度
  11.   attr_accessor :omiga #角速度
  12.   attr_accessor :aomiga #角速度加速度
  13.   attr_accessor :rr #向心运动半径
  14.  
  15.   attr_accessor :lifespan # 存活时间
  16.   attr_accessor :lifetime # 已存活时间
  17.   #attr_accessor :event_list # change behaviors according to time
  18.                                                                                                           # [eventtime,new_vx,new_vy,new_ax,new_ay,sound_effect]
  19.                                                                                                           # e.g. eventlist.push([300,5,5,1,1,""])
  20.   attr_accessor :actor_or_enemy #敌我识别,0为我,1为敌
  21.   attr_accessor :row_flag #旋转标志
  22.   #--------------------------------------------------------------------------
  23.   # ● 初始化对像
  24.   #     viewport : 显示端口
  25.   #     character: 发射者
  26.   #     angle    : 弧度
  27.   #--------------------------------------------------------------------------
  28.  
  29.   def initialize(viewport,character,angle)
  30.     super(viewport)
  31.     @character = character
  32.     if @character.is_a?(Game_Actor)
  33.       @actor_or_enemy = 0
  34.     else
  35.       @actor_or_enemy = 1
  36.     end
  37.     self.blend_type = 0
  38.     @chox = @character.screen_x+10
  39.     @choy = @character.screen_y-100
  40.     @x = @chox #发射点X
  41.     @y = @choy #发射点Y
  42.     #if @x <= 19 and @y <= 14
  43.     #  @x = enemy.x * 32
  44.     #  @y = enemy.y * 32
  45.     #end
  46.     @an = angle #角度
  47.     @an0 = angle #初速度角度
  48.     #p @an * 180 / Math::PI
  49.     @mathx = (Math.cos(@an))*18
  50.     @mathy = (Math.sin(@an))*18
  51.     reset
  52.     self.bitmap = RPG::Cache.picture("bullet/小玉-黄")
  53.     self.available = true
  54.     self.visible = true
  55.     #self.zoom_x = 0.5
  56.     #self.zoom_y = 0.5
  57.     update
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # ● 设置对像
  61.   #--------------------------------------------------------------------------
  62.   def reset
  63.           return if self.disposed?
  64.     self.ox = 8 #图片半径8
  65.     self.oy = 8
  66.     self.x = @x
  67.     self.y = @y
  68.           #@screen_x = @character.true_x#-100
  69.           #@screen_y = @character.true_y#-100
  70.     @vx0 = @mathx #初速x
  71.     @vy0 = @mathy #初速y
  72.     self.vx = @vx0 #速度x
  73.     self.vy = @vy0 #速度y
  74.     self.omiga = 0 #角速度
  75.     self.aomiga = 0 #角速度加速度
  76.     @an = self.get_angle #角度
  77.     self.rr = 130 #旋转半径
  78.     self.ax = 0 #@rv**2/rr*(Math.cos(@an))
  79.     self.ay = 0 #@rv**2/rr*(Math.sin(@an))
  80.  
  81.     self.lifespan = 1024 #存活时间
  82.     self.lifetime = 0
  83.     #self.event_list = []
  84.     self.available = false
  85.     self.visible = false
  86.     #@x = self.get_screen_pos[0]
  87.     #@y = self.get_screen_pos[1]
  88.   end
  89.  
  90.   def can_be_seen?(recal = true)
  91.     #self.x = recal ? get_screen_pos[0] : @screen_x
  92.     #self.y = recal ? get_screen_pos[1] : @screen_y
  93.           if self.x>-640 and self.x<$width+640 and self.y>-480 and self.y<$height+480
  94.       return true
  95.           else
  96.                   return false
  97.           end
  98.   end
  99.   def get_angle #角度获取:以发射点为圆心,极坐标判定角度
  100.     sign = (self.x-@chox)>0 ? 0 : Math::PI
  101.     return Math.atan((self.y-@choy)/((self.x-@chox) == 0 ? 1 : (self.x-@chox)))+sign
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ● 释放
  105.   #--------------------------------------------------------------------------
  106.   def dispose
  107.     if self.bitmap != nil
  108.       self.visible = false
  109.     end
  110.     super
  111.   end
  112.   def move
  113.     return false if self.visible == false
  114.     ########################
  115.     if self.available
  116.             if self.lifetime < self.lifespan
  117.  
  118.         case self.lifetime
  119.         when 1..26 #减速运动,每t速度衰减1.13
  120.           if @vx0.abs > 0
  121.             if @vx.abs <= 1
  122.               @vx0 = 0
  123.               self.vx = 0
  124.             else
  125.               @vx0 /= 1.13
  126.               self.vx /= 1.13
  127.             end
  128.           end
  129.           if @vy0.abs > 0
  130.             if @vy.abs <= 1
  131.               @vy0 = 0
  132.               self.vy = 0
  133.             else
  134.               @vy0 /= 1.13
  135.               self.vy /= 1.13
  136.             end
  137.           end #速度为0时开始旋转
  138.           if @vx0 == 0 and @vy0 == 0 and @row_flag != true
  139.             self.x = @chox + @rr*Math.cos(@an0) #X定点为初方向对应的圆周
  140.             self.y = @choy + @rr*Math.sin(@an0) #Y定点为初方向对应的圆周
  141.             @row_flag = true
  142.           end
  143.         when 27 #旋转的角速度加速度为0.3
  144.           if @row_flag != true
  145.             self.x = @chox + @rr*Math.cos(@an0)
  146.             self.y = @choy + @rr*Math.sin(@an0)
  147.             @row_flag = true
  148.           end
  149.           self.aomiga = 0.3
  150.         when 28..37 #转动半径-1
  151.           @rr -= 1
  152.         when 38..48 #转动半径-3
  153.           @rr -= 3
  154.         when 49..50 #转动半径-2
  155.           @rr -= 2
  156.         when 51..60 #转动半径-1
  157.           @rr -= 1
  158.         when 70..79 #转动半径+1
  159.           @rr += 1
  160.         when 80..89 #转动半径+2
  161.           @rr += 2
  162.         when 90 #加速63t,角速度达到18.9
  163.           self.aomiga = -1+0.01*rand(100) #角速度代入随机负值
  164.           @randr = rand(11) #转动半径增加值代入随机值
  165.         when 91..102 #转动半径+4*0.1*随机值
  166.           @rr += 4 + 0.1*@randr
  167.         when 103..113 #转动半径+随机值
  168.           @rr += @randr
  169.         when 114 #关闭转动,将当前的速度变为X速度和Y速度,置一初速度VX0,
  170.           @row_flag = false #将四叶草甩出去
  171.           v = self.omiga*Math::PI/180*((self.y-@choy)*(self.y-@choy)+(self.x-@chox)*(self.x-@chox))**0.5
  172.           an = self.get_angle
  173.           self.vx = v*Math.cos(an)
  174.           self.vy = v*Math.sin(an)
  175.           @vx0 = self.vx
  176.         when 114..139 #减速运动,速度衰减1.11
  177.           if @vx0.abs > 1
  178.             @vx0 /= 1.11
  179.             self.vx /= 1.11
  180.             self.vy /= 1.11
  181.             if @vx0.abs <= 1
  182.               @vx0 = 0
  183.               self.vx = 0
  184.               self.vy = 0
  185.             end  
  186.           end
  187.         when 140 #速度归零
  188.           self.vx = 0
  189.           self.vy = 0
  190.         when 240 #小玉代入随机加速度,匀加速离开场景
  191.           an = rand(360)*Math::PI/180
  192.           v = rand(5)
  193.           self.ax = (0.1+0.05*v)*Math.cos(an)
  194.           self.ay = (0.1+0.05*v)*Math.sin(an)
  195.         end
  196.  
  197.         if @row_flag #转动模式,x和y直接由角速度和转动半径决定
  198.           @an = self.get_angle
  199.           @an += self.omiga*Math::PI/180
  200.           self.omiga += self.aomiga
  201.           self.x = @chox + @rr*Math.cos(@an)
  202.           self.y = @choy + @rr*Math.sin(@an)
  203.         else #加速模式,x和y由正常的加速减速运动
  204.                 self.x += self.vx
  205.                 self.y += self.vy
  206.                 self.vx += self.ax
  207.                 self.vy += self.ay
  208.         end
  209.  
  210.        # if self.lifetime == 115
  211.        #   @row_flag = false
  212.        # end
  213.  
  214.               #for e in self.event_list
  215.               #        if e[0] == self.lifetime
  216.               #                self.vx = e[1] unless e[1].nil?
  217.               #                self.vy = e[2] unless e[2].nil?
  218.               #                self.ax = e[3] unless e[3].nil?
  219.               #                self.ay = e[4] unless e[4].nil?
  220.               #                Audio.thndj_se_play(e[5])  unless e[5].nil?
  221.               #                break
  222.               #        end
  223.               #end
  224.               if self.can_be_seen?(false)
  225.                       self.visible = true unless self.visible
  226.                       #self.set_screen_pos(false)
  227.                       #angle = self.get_angle
  228.                       #if self.angle != angle
  229.                             #  self.angle = angle
  230.                       #end
  231.                     else
  232.                             self.visible = false if self.visible
  233.           #p "v4"
  234.               end
  235.               self.lifetime += 1
  236.             else
  237.               self.visible = false if self.visible
  238.               self.available = false if self.available
  239.         #p "v2"
  240.             end
  241.            # if self.can_be_seen?(false)
  242.             #        super()
  243.             #end
  244.            else
  245.             if self.visible       
  246.         #p "v1"
  247.               self.visible = false   
  248.              # super()
  249.             end
  250.     end
  251.    ##############################
  252.     #return false if @x > 640 or @y > 480 or @x < 0 or @y < 0
  253.     #@x = self.get_screen_pos[0]
  254.     #@y = self.get_screen_pos[1]
  255.     check
  256.   end
  257.  
  258.   #--------------------------------------------------------------------------
  259.   # ● 更新画面
  260.   #--------------------------------------------------------------------------
  261.   def update
  262.     super
  263.     #p self.visible
  264.     return if self.visible == false
  265.     if move == false
  266.       return "delete"
  267.     end
  268.   end
  269.  
  270.   def check
  271.     return unless $scene.is_a?(Scene_Battle)
  272.     dx = self.x#+self.bitmap.width*0.5*0.75
  273.     dy = self.y#+self.bitmap.height*0.5*0.75
  274.     ra = 64 #子弹判定半径7,判定点半径1,合计8
  275.     if self.actor_or_enemy == 1 #敌军
  276.       for i in 0...$game_party.actors.size
  277.         actor = $game_party.actors[i]
  278.         sprite = $scene.spriteset.actor_sprites[$game_party.actors.size-1-i]
  279.         tx = actor.screen_x-sprite.cw*0.05 #根据位图大小取判定点位置X
  280.         ty = actor.screen_y-sprite.ch*0.445 #根据位图大小取判定点位置Y
  281.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra #圆函数判定
  282.           value = 1 + rand(5)
  283.           value /= 2 if actor.guarding?
  284.           actor.hp -= value
  285.           actor.damage["event"] = value
  286.           actor.damage_pop["event"] = true
  287.           actor.animation.push([807+rand(3),true]) #击中动画
  288.           $scene.status_window.refresh
  289.           self.visible = false
  290.         end
  291.         if $game_party.all_dead?
  292.             # 切换到游戏结束画面
  293.             $scene = Scene_Gameover.new
  294.             return
  295.         end
  296.         #p "v5"
  297.       end#for
  298.     else #我军弹幕
  299.       for i in 0...$game_troop.enemies.size
  300.         actor = $game_troop.enemies[i]
  301.         sprite = $scene.spriteset.enemy_sprites[$game_troop.enemies.size-1-i]
  302.         tx = actor.screen_x+sprite.cw*0.1 #根据位图大小取判定点位置X
  303.         ty = actor.screen_y-sprite.ch*0.445 #根据位图大小取判定点位置Y
  304.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra #圆函数判定
  305.           value = 1 + rand(5)
  306.           value /= 2 if actor.guarding?
  307.           actor.hp -= value
  308.           actor.damage["event"] = value
  309.           actor.damage_pop["event"] = true
  310.           actor.animation.push([807+rand(3),true]) #击中动画
  311.           $scene.status_window.refresh
  312.           self.visible = false
  313.         end
  314.       end #for
  315.     end #if
  316.   end #def
  317.  
  318.  
  319. end


心弹(四叶草花瓣)
RUBY 代码复制
  1. class Sprite_Heart1 < Sprite
  2.   attr_accessor :available
  3.   attr_accessor :vx #x 速度
  4.   attr_accessor :vy #y 速度
  5.   attr_accessor :ax #x 加速度
  6.   attr_accessor :ay #y 加速度
  7.   attr_accessor :an0 #最初的角度
  8.   attr_accessor :lifespan # 存活时间
  9.   attr_accessor :lifetime # 已存活时间
  10.   #attr_accessor :event_list # change behaviors according to time
  11.                                                                                                           # [eventtime,new_vx,new_vy,new_ax,new_ay,sound_effect]
  12.                                                                                                           # e.g. eventlist.push([300,5,5,1,1,""])
  13.   attr_accessor :actor_or_enemy #敌我识别,0为我,1为敌
  14.   attr_accessor :relese_flag #释放标志
  15.  
  16.   #--------------------------------------------------------------------------
  17.   # ● 初始化对像
  18.   #     viewport : 显示端口
  19.   #     angle    : 弧度 0=0 1=90 2=180 3=270
  20.   #--------------------------------------------------------------------------
  21.  
  22.   def initialize(viewport,character,angle,target)
  23.     super(viewport)
  24.     @character = character
  25.     if @character.is_a?(Game_Actor)
  26.       @actor_or_enemy = 0
  27.     else
  28.       @actor_or_enemy = 1
  29.     end
  30.     self.blend_type = 0
  31.     self.lifetime = 0
  32.     @target = target
  33.     @chox = @target.x
  34.     @choy = @target.y
  35.     @an = angle*Math::PI/2
  36.     @an0 = angle*90
  37.  
  38.     @x = @chox+16*Math.cos(@an)
  39.     @y = @choy+16*Math.sin(@an)
  40.     #if @x <= 19 and @y <= 14
  41.     #  @x = enemy.x * 32
  42.     #  @y = enemy.y * 32
  43.     #end
  44.     #p @an * 180 / Math::PI
  45.     reset
  46.     self.bitmap = RPG::Cache.picture("bullet/心弹-绿")
  47.     self.available = true
  48.     self.visible = true
  49.     @release_flag = false
  50.     #self.zoom_x = 0.5
  51.     #self.zoom_y = 0.5
  52.     update
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● 设置对像
  56.   #--------------------------------------------------------------------------
  57.   def reset
  58.           return if self.disposed?
  59.     self.ox = 16 #子弹半径16
  60.     self.oy = 16
  61.     self.x = @x
  62.     self.y = @y
  63.           #@screen_x = @character.true_x#-100
  64.           #@screen_y = @character.true_y#-100
  65.     self.vx = 0 #速度X
  66.     self.vy = 0 #速度Y
  67.     @an = self.get_angle #角度
  68.     self.ax = 0#@rv**2/rr*(Math.cos(@an))
  69.     self.ay = 0#@rv**2/rr*(Math.sin(@an))
  70.  
  71.     self.lifespan = 1024
  72.     self.lifetime = 0
  73.     #self.event_list = []
  74.     self.available = false
  75.     self.visible = false
  76.     #@x = self.get_screen_pos[0]
  77.     #@y = self.get_screen_pos[1]
  78.   end
  79.  
  80.   def can_be_seen?(recal = true)
  81.     #self.x = recal ? get_screen_pos[0] : @screen_x
  82.     #self.y = recal ? get_screen_pos[1] : @screen_y
  83.           if self.x>-640 and self.x<$width+640 and self.y>-480 and self.y<$height+480
  84.       return true
  85.           else
  86.                   return false
  87.           end
  88.   end
  89.   def get_angle #角度获取:以小玉为圆心,初位置+转动相位作为角度
  90.     @chox = @target.x #小玉X
  91.     @choy = @target.y #小玉Y
  92.     #sign = (self.x-@chox)>0 ? 0 : Math::PI
  93.     an = (self.lifetime%360*8+@an0)*Math::PI/180 #每t转动8度
  94.     #心弹自身的角度为相位负值+90度+初相位方向修正
  95.     self.angle = -self.lifetime%360*8+90+(@an0%180 == 0 ? @an0 : @an0+180)
  96.     return an
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 释放
  100.   #--------------------------------------------------------------------------
  101.   def dispose
  102.     if self.bitmap != nil
  103.       self.visible = false
  104.     end
  105.     super
  106.   end
  107.   def move
  108.     return false if self.visible == false
  109.     ########################
  110.     if self.available
  111.             if self.lifetime < self.lifespan
  112.         if self.lifetime == 140 #第140t时释放
  113.           #p self.angle
  114.           get_angle #获取角度,置对应角度加速度
  115.           ang = (self.angle+(@an0%180 == 0 ? 180 : 0))*Math::PI/180
  116.           self.vx = 0
  117.           self.vy = 0
  118.           self.ax = Math.cos(ang)*0.2
  119.           self.ay = Math.sin(ang)*0.2
  120.           @release_flag = true
  121.         end
  122.  
  123.         if @release_flag == true #释放后
  124.                 self.x += self.vx
  125.                 self.y += self.vy
  126.                 self.vx += self.ax
  127.                 self.vy += self.ay
  128.           if (self.vx*self.vx+self.vy*self.vy)**0.5 >= 20 #速度大于20变为匀速
  129.             self.ay = 0
  130.             self.ax = 0
  131.           end  
  132.         else #释放前
  133.           @an = self.get_angle #获取角度
  134.           self.x = @chox+16*Math.cos(@an) #X定位为小玉圆周
  135.           self.y = @choy+16*Math.sin(@an) #Y定位为小玉圆周
  136.         end
  137.  
  138.               #for e in self.event_list
  139.               #        if e[0] == self.lifetime
  140.               #                self.vx = e[1] unless e[1].nil?
  141.               #                self.vy = e[2] unless e[2].nil?
  142.               #                self.ax = e[3] unless e[3].nil?
  143.               #                self.ay = e[4] unless e[4].nil?
  144.               #                Audio.thndj_se_play(e[5])  unless e[5].nil?
  145.               #                break
  146.               #        end
  147.               #end
  148.               if self.can_be_seen?(false)
  149.                       self.visible = true unless self.visible
  150.                       #self.set_screen_pos(false)
  151.                       #angle = self.get_angle
  152.                       #if self.angle != angle
  153.                             #  self.angle = angle
  154.                       #end
  155.                     else
  156.                             self.visible = false if self.visible
  157.           #p "v4"
  158.               end
  159.               self.lifetime += 1
  160.             else
  161.               self.visible = false if self.visible
  162.               self.available = false if self.available
  163.         #p "v2"
  164.             end
  165.            # if self.can_be_seen?(false)
  166.             #        super()
  167.             #end
  168.            else
  169.             if self.visible       
  170.         #p "v1"
  171.               self.visible = false   
  172.              # super()
  173.             end
  174.     end
  175.    ##############################
  176.     #return false if @x > 640 or @y > 480 or @x < 0 or @y < 0
  177.     #@x = self.get_screen_pos[0]
  178.     #@y = self.get_screen_pos[1]
  179.     check
  180.   end
  181.  
  182.   #--------------------------------------------------------------------------
  183.   # ● 更新画面
  184.   #--------------------------------------------------------------------------
  185.   def update
  186.     super
  187.     #p self.visible
  188.     return if self.visible == false
  189.     if move == false
  190.       return "delete"
  191.     end
  192.   end
  193.  
  194.   def check
  195.     return unless $scene.is_a?(Scene_Battle)
  196.     dx = self.x#+self.bitmap.width*0.5*0.75
  197.     dy = self.y#+self.bitmap.height*0.5*0.75
  198.     ra = 256 #图形判定区15,判定点1,合计16
  199.     if self.actor_or_enemy == 1 #敌军
  200.       for i in 0...$game_party.actors.size
  201.         actor = $game_party.actors[i]
  202.         sprite = $scene.spriteset.actor_sprites[$game_party.actors.size-1-i]
  203.         tx = actor.screen_x-sprite.cw*0.05 #根据位图尺寸决定判定点
  204.         ty = actor.screen_y-sprite.ch*0.445
  205.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra
  206.           value = 1 + rand(5)
  207.           value /= 2 if actor.guarding?
  208.           actor.hp -= value
  209.           actor.damage["event"] = value
  210.           actor.damage_pop["event"] = true
  211.           actor.animation.push([807+rand(3),true]) #命中动画
  212.           $scene.status_window.refresh
  213.           self.visible = false
  214.         end
  215.         if $game_party.all_dead?
  216.             # 切换到游戏结束画面
  217.             $scene = Scene_Gameover.new
  218.             return
  219.         end
  220.         #p "v5"
  221.       end#for
  222.     else #我军弹幕
  223.       for i in 0...$game_troop.enemies.size
  224.         actor = $game_troop.enemies[i]
  225.         sprite = $scene.spriteset.enemy_sprites[$game_troop.enemies.size-1-i]
  226.         tx = actor.screen_x+sprite.cw*0.1 #根据位图尺寸决定判定点
  227.         ty = actor.screen_y-sprite.ch*0.445
  228.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra
  229.           value = 1 + rand(5)
  230.           value /= 2 if actor.guarding?
  231.           actor.hp -= value
  232.           actor.damage["event"] = value
  233.           actor.damage_pop["event"] = true
  234.           actor.animation.push([807+rand(3),true]) #命中动画
  235.           $scene.status_window.refresh
  236.           self.visible = false
  237.         end
  238.       end #for
  239.     end #if
  240.   end #def
  241.  
  242.  
  243. end



最后这个效果上可以说能令人满意
但这才12*5*5=300个子弹啊
我就能觉得卡了

作者: guoxiaomi    时间: 2018-2-24 21:26
上面的运算是可以优化的,
1. 在 for 循环里,ra 的值看上去是个常数,直接将 ra*ra 算出来保存,避免一次乘法运算
2. 在判断距离之前直接比较一下,dx - tx 是否在 -ra ~ +ra 之间, dy - ty 同样
3. 把 x**2 替换成 x*x
此外,不知道 select 方法会不会比 for循环 更快
作者: WantMy蕙    时间: 2018-2-24 22:54
666
ARPG还是有好作品的吧比如XAS?
然后那啥,我的想法是把战斗和炫舞那类结合起来
比如手搓技能2333
这个也不错哇,可以增加互动
作者: 零教授    时间: 2018-2-25 03:22
本帖最后由 零教授 于 2018-2-25 07:17 编辑


@89444640  
做出来了XD
作者: phantomz    时间: 2018-2-25 06:52
本帖最后由 phantomz 于 2018-2-25 07:00 编辑

在回合制中插弹幕战让我想到梦幻伪乡
个人不太喜欢回合制游戏中出现需要反应力的机制
像GBA上的马里奥RPG就是接受极限了
作者: 89444640    时间: 2018-2-25 08:14
零教授 发表于 2018-2-25 03:22
@89444640  
做出来了XD

- -b还原度100%
这第三下完全看不出往哪边躲……我stg苦手
那个右边的gif是原作的吧?没玩过。
这个系统……牵扯运算、程序、数学太多……就算可以兼容我也用不了……完全不会调……
只能看看了。
话说……从美工角度考虑,最靠谱的是做个工具,能输出透明背景的弹幕,然后录640*320输出透明背景图像,然后播片。还是按照rpg回合制模式打。
作者: 针巢衣    时间: 2018-2-25 18:04
所有的游戏都是回合制
作者: M.Winderic.    时间: 2018-2-25 20:38
本帖最后由 M.Winderic. 于 2018-2-25 22:11 编辑
零教授 发表于 2018-2-24 17:54
我随便发一下四叶草弹的代码,因为我感觉我已经优化不下去了
这东西真的是卡......


Em......
1st 提前算好弹幕路径,缓存打表……
2nd 考虑 R-Tree,优化碰撞检测……
3rd 找一只程序猿搞定 1 & 2 ……
然后就不卡啦【雾


作者: guoxiaomi    时间: 2018-2-25 21:44
本帖最后由 guoxiaomi 于 2018-2-25 21:49 编辑

仅供参考,不一定正确。你可以搜索 change 看看

如果你的 status_window.refresh 方法中,调用了 draw_text 方法,那应该是主要被这个东西限制了效率。如果可能的话,使用图片来绘制数字。

RUBY 代码复制
  1. e0 = $game_troop.enemies[0]
  2. 5.times do
  3.   Sprite_Siyecao.new(e0, 12)
  4. end
  5.  
  6. class Sprite_Siyecao < Sprite
  7.   # character :发射者
  8.   # times     :发射子弹数
  9.   def initialize(character,times)
  10.     @viewport = $scene.spriteset.viewport3 #视野为战斗场面viewport3
  11.     super(@viewport)
  12.     @character = character
  13.     @ch = @character
  14.     @times = times
  15.     self.visible = true
  16.     reset
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # 设置炮弹
  20.   #--------------------------------------------------------------------------
  21.   def reset
  22.     return if $bullet.size >= 4096
  23.     for i in 0...@times
  24.     #检查指针上界
  25.       break if $bullet.size >= 4096 #子弹总数限制4096
  26.       angle = Math::PI / @times * i * 2 #角度为子弹数平分
  27.       sprite = Sprite_Small1.new(@viewport,@ch,angle) #建立小玉
  28.       s1 = Sprite_Heart1.new(@viewport, @ch, 0, sprite) #建立心弹
  29.       s2 = Sprite_Heart1.new(@viewport, @ch, 1, sprite)
  30.       s3 = Sprite_Heart1.new(@viewport, @ch, 2, sprite)
  31.       s4 = Sprite_Heart1.new(@viewport, @ch, 3, sprite)
  32.       $bullet.push(s1)
  33.       s1.z = 100 + $bullet.size
  34.       $bullet.push(s2)
  35.       s2.z = 100 + $bullet.size
  36.       $bullet.push(s3)
  37.       s3.z = 100 + $bullet.size
  38.       $bullet.push(s4)
  39.       s4.z = 100 + $bullet.size
  40.       $bullet.push(sprite)
  41.       sprite.z = 100 + $bullet.size
  42.     end
  43.     Audio.thndj_se_play("Audio/SE/bullet_2",80,100)
  44.     dispose
  45.   end
  46.   #--------------------------------------------------------------------------
  47.   # ● 释放
  48.   #--------------------------------------------------------------------------
  49.   def dispose
  50.     if self.bitmap != nil
  51.       self.bitmap.dispose
  52.       self.visible = false
  53.     end
  54.     super
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 更新画面
  58.   #--------------------------------------------------------------------------
  59.   def update
  60.     super
  61.     dispose
  62.   end
  63. end
  64.  
  65. #--------------------------------------------------------------------------
  66. # Small
  67. #--------------------------------------------------------------------------
  68. class Sprite_Small1 < Sprite
  69.   attr_accessor :available
  70.   attr_accessor :vx #x 速度
  71.   attr_accessor :vy #y 速度
  72.   attr_accessor :ax #x 加速度
  73.   attr_accessor :ay #y 加速度
  74.   attr_accessor :vx0 #x 初速度
  75.   attr_accessor :vy0 #y 初速度
  76.   attr_accessor :an #角度
  77.   attr_accessor :an0 #初速度角度
  78.   attr_accessor :omiga #角速度
  79.   attr_accessor :aomiga #角速度加速度
  80.   attr_accessor :rr #向心运动半径
  81.  
  82.   attr_accessor :lifespan # 存活时间
  83.   attr_accessor :lifetime # 已存活时间
  84.   #attr_accessor :event_list # change behaviors according to time
  85.   # [eventtime,new_vx,new_vy,new_ax,new_ay,sound_effect]
  86.   # e.g. eventlist.push([300,5,5,1,1,""])
  87.   attr_accessor :actor_or_enemy #敌我识别,0为我,1为敌
  88.   attr_accessor :row_flag #旋转标志
  89.   #--------------------------------------------------------------------------
  90.   # ● 初始化对像
  91.   #     viewport : 显示端口
  92.   #     character: 发射者
  93.   #     angle    : 弧度
  94.   #--------------------------------------------------------------------------
  95.  
  96.   def initialize(viewport,character,angle)
  97.     super(viewport)
  98.     @character = character
  99.     if @character.is_a?(Game_Actor)
  100.       @actor_or_enemy = 0
  101.     else
  102.       @actor_or_enemy = 1
  103.     end
  104.     self.blend_type = 0
  105.     @chox = @character.screen_x + 10
  106.     @choy = @character.screen_y - 100
  107.     @x = @chox #发射点X
  108.     @y = @choy #发射点Y
  109.     @an = angle #角度
  110.     @an0 = angle #初速度角度
  111.     @mathx = (Math.cos(@an))*18
  112.     @mathy = (Math.sin(@an))*18
  113.     reset
  114.     self.bitmap = RPG::Cache.picture("bullet/小玉-黄")
  115.     self.available = true
  116.     self.visible = true
  117.     update
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● 设置对像
  121.   #--------------------------------------------------------------------------
  122.   def reset
  123.     return if self.disposed?
  124.     self.ox = 8 #图片半径8
  125.     self.oy = 8
  126.     self.x = @x
  127.     self.y = @y
  128.     @vx0 = @mathx #初速x
  129.     @vy0 = @mathy #初速y
  130.     self.vx = @vx0 #速度x
  131.     self.vy = @vy0 #速度y
  132.     self.omiga = 0 #角速度 应该是 'omega'
  133.     self.aomiga = 0 #角速度加速度
  134.     @an = self.get_angle #角度
  135.     self.rr = 130 #旋转半径
  136.     self.ax = 0 #@rv**2/rr*(Math.cos(@an))
  137.     self.ay = 0 #@rv**2/rr*(Math.sin(@an))
  138.  
  139.     self.lifespan = 1024 #存活时间
  140.     self.lifetime = 0
  141.  
  142.     self.available = false
  143.     self.visible = false
  144.   end
  145.  
  146.   # def can_be_seen?(recal = true)
  147.   #   if self.x>-640 and self.x<$width+640 and self.y>-480 and self.y<$height+480
  148.   #     return true
  149.   #   else
  150.   #     return false
  151.   #   end
  152.   # end
  153.  
  154.   # change 1, use && instead and
  155.   def can_be_seen?(recal = true)
  156.     return self.x > -640 && self.x < $width + 640 && self.y > -480 && self.y < $height + 480
  157.   end
  158.  
  159.   # def get_angle #角度获取:以发射点为圆心,极坐标判定角度
  160.   #   sign = (self.x - @chox) > 0 ? 0 : Math::PI
  161.   #   return Math.atan((self.y - @choy) / ((self.x - @chox) == 0 ? 1 : (self.x - @chox))) + sign
  162.   # end
  163.  
  164.   # change 2 * 重要 *
  165.   # 如果是获取角度,这个函数才是正确的,返回值在 -PI ~ +PI 之间
  166.   def get_angle
  167.     dx = self.x - @chox
  168.     dy = self.y - @choy
  169.     return Math.atan2(dy, dx)
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ● 释放
  173.   #--------------------------------------------------------------------------
  174.   def dispose
  175.     if self.bitmap != nil
  176.       self.visible = false
  177.     end
  178.     super
  179.   end
  180.  
  181.   # change 3
  182.   def move
  183.     # return false if self.visible == false
  184.     return false if !self.visible # 3.1
  185.  
  186.     if self.available
  187.       if self.lifetime < self.lifespan
  188.  
  189.         case self.lifetime
  190.         when 1..26 #减速运动,每t速度衰减1.13
  191.           # if @vx0.abs > 0
  192.           if @vx0 != 0 # 3.2
  193.             if @vx.abs <= 1
  194.               @vx0 = 0
  195.               self.vx = 0
  196.             else
  197.               @vx0 /= 1.13
  198.               self.vx /= 1.13
  199.             end
  200.           end
  201.  
  202.           # if @vy0.abs > 0 # 3.3
  203.           if @vy0 != 0
  204.             if @vy.abs <= 1
  205.               @vy0 = 0
  206.               self.vy = 0
  207.             else
  208.               @vy0 /= 1.13
  209.               self.vy /= 1.13
  210.             end
  211.           end #速度为0时开始旋转
  212.  
  213.           if @vx0 == 0 and @vy0 == 0 and @row_flag != true
  214.             self.x = @chox + @rr * Math.cos(@an0) #X定点为初方向对应的圆周
  215.             self.y = @choy + @rr * Math.sin(@an0) #Y定点为初方向对应的圆周
  216.             @row_flag = true
  217.           end
  218.  
  219.         when 27 #旋转的角速度加速度为0.3
  220.           if @row_flag != true
  221.             self.x = @chox + @rr * Math.cos(@an0)
  222.             self.y = @choy + @rr * Math.sin(@an0)
  223.             @row_flag = true
  224.           end
  225.           self.aomiga = 0.3
  226.         when 28..37 #转动半径-1
  227.           @rr -= 1
  228.         when 38..48 #转动半径-3
  229.           @rr -= 3
  230.         when 49..50 #转动半径-2
  231.           @rr -= 2
  232.         when 51..60 #转动半径-1
  233.           @rr -= 1
  234.         when 70..79 #转动半径+1
  235.           @rr += 1
  236.         when 80..89 #转动半径+2
  237.           @rr += 2
  238.         when 90 #加速63t,角速度达到18.9
  239.           # self.aomiga = -1+0.01*rand(100) #角速度代入随机负值
  240.           self.aomiga = -1 + rand # 3.4
  241.           @randr = rand(11) #转动半径增加值代入随机值
  242.         when 91..102 #转动半径+4*0.1*随机值
  243.           @rr += 4 + 0.1 * @randr
  244.         when 103..113 #转动半径+随机值
  245.           @rr += @randr
  246.         when 114 #关闭转动,将当前的速度变为X速度和Y速度,置一初速度VX0,
  247.           @row_flag = false #将四叶草甩出去
  248.           # v = self.omiga * Math::PI/180 * ((self.y-@choy) * (self.y-@choy) + (self.x-@chox) * (self.x-@chox)) ** 0.5
  249.           # an = self.get_angle
  250.           # self.vx = v * Math.cos(an)
  251.           # self.vy = v * Math.sin(an)
  252.           # @vx0 = self.vx
  253.  
  254.           # 3.5
  255.           _x, _y = self.x - @chox, self.y - @choy
  256.           _r = Math.sqrt(_x * _x + _y * _y)
  257.           v = self.omiga * Math::PI / 180 * _r
  258.           self.vx = v * _x / _r
  259.           self.vy = v * _y / _r
  260.           @vx0 = self.vx
  261.           # -- 3.5 不知道这样算对不对,因为 get_angle 和普通的 arctan 还是有区别
  262.  
  263.         when 114..139 #减速运动,速度衰减1.11
  264.           if @vx0.abs > 1
  265.             @vx0 /= 1.11
  266.             self.vx /= 1.11
  267.             self.vy /= 1.11
  268.             if @vx0.abs <= 1
  269.               @vx0 = 0
  270.               self.vx = 0
  271.               self.vy = 0
  272.             end
  273.           end
  274.         when 140 #速度归零
  275.           self.vx = 0
  276.           self.vy = 0
  277.         when 240 #小玉代入随机加速度,匀加速离开场景
  278.           # an = rand(360) * Math::PI/180
  279.           # v = rand(5)
  280.           # self.ax = (0.1 + 0.05 * v) * Math.cos(an)
  281.           # self.ay = (0.1 + 0.05 * v) * Math.sin(an)
  282.           # 3.6
  283.           self.ax = (0.2 + rand * 0.4) * (rand(2) - 0.5)
  284.           self.ay = (0.2 + rand * 0.4) * (rand(2) - 0.5)
  285.           # -- 3.6 这里不一定必须使速度均匀分布在一个环面内
  286.         end
  287.  
  288.         if @row_flag #转动模式,x和y直接由角速度和转动半径决定
  289.           @an = self.get_angle
  290.           @an += self.omiga * Math::PI / 180
  291.           self.omiga += self.aomiga
  292.           self.x = @chox + @rr * Math.cos(@an)
  293.           self.y = @choy + @rr * Math.sin(@an)
  294.         else #加速模式,x和y由正常的加速减速运动
  295.           self.x += self.vx
  296.           self.y += self.vy
  297.           self.vx += self.ax
  298.           self.vy += self.ay
  299.         end
  300.  
  301.         if self.can_be_seen?(false)
  302.           self.visible = true unless self.visible
  303.         else
  304.           self.visible = false if self.visible
  305.         end
  306.         self.lifetime += 1
  307.       else
  308.         self.visible = false if self.visible
  309.         self.available = false if self.available
  310.       end
  311.     else
  312.       # if self.visible
  313.       #   self.visible = false
  314.       # end
  315.       self.visible &&= false # 3.7 上面也可以这样改,未必能提升效率但是很酷
  316.     end
  317.     check
  318.   end
  319.  
  320.   #--------------------------------------------------------------------------
  321.   # ● 更新画面
  322.   #--------------------------------------------------------------------------
  323.   def update
  324.     super
  325.     #p self.visible
  326.     return if self.visible == false
  327.     if move == false
  328.       return "delete"
  329.     end
  330.   end
  331.  
  332.   # change 4
  333.   def check
  334.     return unless $scene.is_a?(Scene_Battle)
  335.     dx = self.x#+self.bitmap.width*0.5*0.75
  336.     dy = self.y#+self.bitmap.height*0.5*0.75
  337.     ra = 64 #子弹判定半径7,判定点半径1,合计8
  338.     # 4.1
  339.     ra_sq = 8 * 1.42
  340.     # -- 4.1
  341.     if self.actor_or_enemy == 1 #敌军
  342.       for i in 0...$game_party.actors.size
  343.         actor = $game_party.actors[i]
  344.         sprite = $scene.spriteset.actor_sprites[$game_party.actors.size-1-i]
  345.         tx = actor.screen_x - sprite.cw*0.05 #根据位图大小取判定点位置X
  346.         ty = actor.screen_y - sprite.ch*0.445 #根据位图大小取判定点位置Y
  347.         # if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra #圆函数判定
  348.         # 4.2
  349.         _x, _y = (dx - tx).abs, (dy - ty).abs
  350.         if _x + _y < ra_sq && (_x*_x + _y*_y) <= ra
  351.         # -- 4.2 先做一个粗略的判断
  352.           value = 1 + rand(5)
  353.           value /= 2 if actor.guarding?
  354.           actor.hp -= value
  355.           actor.damage["event"] = value
  356.           actor.damage_pop["event"] = true
  357.           actor.animation.push([807+rand(3),true]) #击中动画
  358.           # 4.3 *重要*
  359.           # $scene.status_window.refresh
  360.           $battle_status_need_refresh = true
  361.           # --4.3 阻止多次刷新窗口,请在 Scene_Battle 的 update 方法中判断 $battle_status_need_refresh 再刷新窗口
  362.           # 因为通常在 status_window.refresh 中调用了 draw_text 方法,这是耗时极高的方法
  363.           # see change 5
  364.           self.visible = false
  365.         end
  366.  
  367.         if $game_party.all_dead?
  368.             # 切换到游戏结束画面
  369.             $scene = Scene_Gameover.new
  370.             return
  371.         end
  372.       end#for
  373.     else #我军弹幕
  374.       for i in 0...$game_troop.enemies.size
  375.         actor = $game_troop.enemies[i]
  376.         sprite = $scene.spriteset.enemy_sprites[$game_troop.enemies.size-1-i]
  377.         tx = actor.screen_x+sprite.cw*0.1 #根据位图大小取判定点位置X
  378.         ty = actor.screen_y-sprite.ch*0.445 #根据位图大小取判定点位置Y
  379.         # see change 4.2 and 4.3
  380.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra #圆函数判定
  381.           value = 1 + rand(5)
  382.           value /= 2 if actor.guarding?
  383.           actor.hp -= value
  384.           actor.damage["event"] = value
  385.           actor.damage_pop["event"] = true
  386.           actor.animation.push([807+rand(3),true]) #击中动画
  387.           $scene.status_window.refresh
  388.           self.visible = false
  389.         end
  390.       end #for
  391.     end #if
  392.   end #def
  393. end
  394.  
  395. # change 5
  396. class Scene_Battle
  397.   alias _balabala_update update
  398.   def update
  399.     if $battle_status_need_refresh
  400.       @status_window.refresh
  401.     end
  402.     _balabala_update
  403.   end
  404. end
  405.  
  406. #--------------------------------------------------------------------------
  407. # Heart
  408. #--------------------------------------------------------------------------
  409. class Sprite_Heart1 < Sprite
  410.   attr_accessor :available
  411.   attr_accessor :vx #x 速度
  412.   attr_accessor :vy #y 速度
  413.   attr_accessor :ax #x 加速度
  414.   attr_accessor :ay #y 加速度
  415.   attr_accessor :an0 #最初的角度
  416.   attr_accessor :lifespan # 存活时间
  417.   attr_accessor :lifetime # 已存活时间
  418.   #attr_accessor :event_list # change behaviors according to time
  419.   # [eventtime,new_vx,new_vy,new_ax,new_ay,sound_effect]
  420.   # e.g. eventlist.push([300,5,5,1,1,""])
  421.   attr_accessor :actor_or_enemy #敌我识别,0为我,1为敌
  422.   attr_accessor :relese_flag #释放标志
  423.  
  424.   #--------------------------------------------------------------------------
  425.   # ● 初始化对像
  426.   #     viewport : 显示端口
  427.   #     angle    : 弧度 0=0 1=90 2=180 3=270
  428.   #--------------------------------------------------------------------------
  429.  
  430.   def initialize(viewport,character,angle,target)
  431.     super(viewport)
  432.     @character = character
  433.     if @character.is_a?(Game_Actor)
  434.       @actor_or_enemy = 0
  435.     else
  436.       @actor_or_enemy = 1
  437.     end
  438.     self.blend_type = 0
  439.     self.lifetime = 0
  440.     @target = target
  441.     @chox = @target.x
  442.     @choy = @target.y
  443.     @an = angle * Math::PI/2
  444.     @an0 = angle * 90
  445.  
  446.     @x = @chox + 16*Math.cos(@an)
  447.     @y = @choy + 16*Math.sin(@an)
  448.  
  449.     reset
  450.  
  451.     self.bitmap = RPG::Cache.picture("bullet/心弹-绿")
  452.     self.available = true
  453.     self.visible = true
  454.     @release_flag = false
  455.  
  456.     update
  457.   end
  458.   #--------------------------------------------------------------------------
  459.   # ● 设置对像
  460.   #--------------------------------------------------------------------------
  461.   def reset
  462.     return if self.disposed?
  463.     self.ox = 16 #子弹半径16
  464.     self.oy = 16
  465.     self.x = @x
  466.     self.y = @y
  467.     self.vx = 0 #速度X
  468.     self.vy = 0 #速度Y
  469.     @an = self.get_angle #角度
  470.     self.ax = 0#@rv**2/rr*(Math.cos(@an))
  471.     self.ay = 0#@rv**2/rr*(Math.sin(@an))
  472.  
  473.     self.lifespan = 1024
  474.     self.lifetime = 0
  475.  
  476.     self.available = false
  477.     self.visible = false
  478.   end
  479.  
  480.   def can_be_seen?(recal = true)
  481.     if self.x >-640 and self.x< $width + 640 and self.y > -480 and self.y < $height + 480
  482.       return true
  483.     else
  484.       return false
  485.     end
  486.   end  # see change 1
  487.  
  488.   def get_angle #角度获取:以小玉为圆心,初位置+转动相位作为角度
  489.     @chox = @target.x #小玉X
  490.     @choy = @target.y #小玉Y
  491.     an = (self.lifetime % 360 * 8 + @an0) * Math::PI / 180 #每t转动8度
  492.     #心弹自身的角度为相位负值+90度+初相位方向修正
  493.     self.angle = -self.lifetime % 360 * 8 + 90 + (@an0 % 180 == 0 ? @an0 : @an0 + 180)
  494.     return an
  495.   end  # see change 2
  496.   #--------------------------------------------------------------------------
  497.   # ● 释放
  498.   #--------------------------------------------------------------------------
  499.   def dispose
  500.     if self.bitmap != nil
  501.       self.visible = false
  502.     end
  503.     super
  504.   end
  505.  
  506.   # change 6
  507.   def move
  508.     return false if self.visible == false
  509.     ########################
  510.     if self.available
  511.       if self.lifetime < self.lifespan
  512.         if self.lifetime == 140 #第140t时释放
  513.           get_angle #获取角度,置对应角度加速度
  514.           ang = (self.angle+(@an0%180 == 0 ? 180 : 0))*Math::PI/180
  515.           self.vx = 0
  516.           self.vy = 0
  517.           self.ax = Math.cos(ang)*0.2
  518.           self.ay = Math.sin(ang)*0.2
  519.           @release_flag = true
  520.         end
  521.  
  522.         if @release_flag == true #释放后
  523.           self.x += self.vx
  524.           self.y += self.vy
  525.           self.vx += self.ax
  526.           self.vy += self.ay
  527.  
  528.           # if (self.vx*self.vx+self.vy*self.vy)**0.5 >= 20 #速度大于20变为匀速
  529.           if self.vx.abs + self.vy.abs > 20 && (self.vx*self.vx+self.vy*self.vy) >= 400 # 6.1
  530.             self.ay = 0
  531.             self.ax = 0
  532.           end
  533.         else #释放前
  534.           @an = self.get_angle #获取角度
  535.           self.x = @chox + 16 * Math.cos(@an) #X定位为小玉圆周
  536.           self.y = @choy + 16 * Math.sin(@an) #Y定位为小玉圆周
  537.         end
  538.         if self.can_be_seen?(false)
  539.           self.visible = true unless self.visible
  540.         else
  541.           self.visible = false if self.visible
  542.         end
  543.         self.lifetime += 1
  544.       else
  545.         self.visible = false if self.visible
  546.         self.available = false if self.available
  547.       end
  548.     else
  549.       if self.visible
  550.         self.visible = false
  551.       end
  552.     end
  553.  
  554.     check
  555.   end
  556.  
  557.   #--------------------------------------------------------------------------
  558.   # ● 更新画面
  559.   #--------------------------------------------------------------------------
  560.   def update
  561.     super
  562.     #p self.visible
  563.     return if self.visible == false
  564.     if move == false
  565.       return "delete"
  566.     end
  567.   end
  568.  
  569.   # see change 4
  570.   def check
  571.     return unless $scene.is_a?(Scene_Battle)
  572.     dx = self.x#+self.bitmap.width*0.5*0.75
  573.     dy = self.y#+self.bitmap.height*0.5*0.75
  574.     ra = 256 #图形判定区15,判定点1,合计16
  575.     if self.actor_or_enemy == 1 #敌军
  576.       for i in 0...$game_party.actors.size
  577.         actor = $game_party.actors[i]
  578.         sprite = $scene.spriteset.actor_sprites[$game_party.actors.size-1-i]
  579.         tx = actor.screen_x-sprite.cw*0.05 #根据位图尺寸决定判定点
  580.         ty = actor.screen_y-sprite.ch*0.445
  581.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra
  582.           value = 1 + rand(5)
  583.           value /= 2 if actor.guarding?
  584.           actor.hp -= value
  585.           actor.damage["event"] = value
  586.           actor.damage_pop["event"] = true
  587.           actor.animation.push([807+rand(3),true]) #命中动画
  588.           $scene.status_window.refresh
  589.           self.visible = false
  590.         end
  591.         if $game_party.all_dead?
  592.             # 切换到游戏结束画面
  593.             $scene = Scene_Gameover.new
  594.             return
  595.         end
  596.       end#for
  597.     else #我军弹幕
  598.       for i in 0...$game_troop.enemies.size
  599.         actor = $game_troop.enemies[i]
  600.         sprite = $scene.spriteset.enemy_sprites[$game_troop.enemies.size-1-i]
  601.         tx = actor.screen_x+sprite.cw*0.1 #根据位图尺寸决定判定点
  602.         ty = actor.screen_y-sprite.ch*0.445
  603.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra
  604.           value = 1 + rand(5)
  605.           value /= 2 if actor.guarding?
  606.           actor.hp -= value
  607.           actor.damage["event"] = value
  608.           actor.damage_pop["event"] = true
  609.           actor.animation.push([807+rand(3),true]) #命中动画
  610.           $scene.status_window.refresh
  611.           self.visible = false
  612.         end
  613.       end #for
  614.     end #if
  615.   end #def
  616. end

作者: 大魔术师    时间: 2018-2-28 23:22
余音·魔眼 发表于 2018-2-24 10:46
说回合制落后的人都是因为他根本就不知道回合制是什么,回合制千万不能用默认的那种(因为那才是真正的落后 ...

这确实回合制被诟病的原因!
但是回合制不仅仅可以讲策略,还可以结合剧情道具事件起到增强游戏的可玩性!
比如说结合剧情可以选择剧情多线发展,创造多结局!
结合道具可以让敌人变强或变弱增加乐趣!
结合事件可以多收人,多捡道具,增加额外剧情都是可以的!
作者: woshibingfajia    时间: 2022-5-10 11:49
没看到脚本呀




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