전투관련
2012.11.25 01:43

누구나 쉽게 만드는 액션알피지

조회 수 4344 추천 수 0 댓글 6
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
라이센스 기타 라이센스
출처 내가만듬
강의종류 텍스트
사용/적용순서 F11열고
main바로 위에 붙여넣어주세요

#================================================#
#○쉬운 액션 알피지 1.00 Ver   by [Niotsoft.펜릴]
#버그발견시 www.nioting.com 에 글남겨주세요.
#================================================#
class Game_Character
  attr_accessor :monster
  alias status_initialize initialize
 
  def initialize
    status_initialize
    @monster = Game_Monster.new
  end
end

 

#================================================#
#○몬스터 객체를 생성
#   능력치들이 자동으로 저장될 공간을 생성
#================================================#
class Game_Monster
  attr_accessor :status
  attr_accessor :hp
  attr_accessor :maxhp
  attr_accessor :인식
 
  def initialize
    @status = nil
    @hp = nil        #○몬스터hp는 DB에 존재하지 않는 값이라 새객체에 maxhp값을 담아 사용
    @maxhp = nil  #○maxhp는 자주사용되는 값이기에 새 객체에 담아 사용
    @인식 = 0
  end
end

 

#================================================#
#○DB에 있는 몬스터 능력치를 이벤트로 담아온다.
#================================================#
class Game_Map < Game_Map
   
  def setup(map_id)  #○맵이 열리자마자 monster_setup이 호출된다.
    super
    monster_setup
  end
 
  def monster_setup
    for event_id in @map.events.keys #○현재 맵에 존재하는 맵이벤트 해시키를 배열화
      for monster_id in 1 .. $data_enemies.size #○DB에 존재하는 몬스터(에너미) 갯수
        if @map.events[event_id] != nil and $data_enemies[monster_id] != nil #○nil값(빈값)방지 or 에러방지
          #○맵이벤트의 이름과 DB상의 몬스터 이름이 같다면
          if @map.events[event_id].name == $data_enemies[monster_id].name
            #○몬스터객체에 DB상의 몬스터 능력치를 대입한다.
            $game_map.events[event_id].monster.status = $data_enemies[monster_id]
            $game_map.events[event_id].monster.maxhp = $game_map.events[event_id].monster.status.maxhp
            $game_map.events[event_id].monster.hp = $game_map.events[event_id].monster.maxhp
            break
          end
        end
      end
    end
  end
end


#===============================================#
#○각종 정의에 필요한 몬스터값을 변수에 담아 값을 리턴
#===============================================#
class Game_Event < Game_Event
 
  def monster_pdef
    return $monster_pdef = @monster.status.pdef
  end
 
  def monster_mdef
    return $monster_mdef = @monster.status.mdef
  end
 
  def monster_atk
    return $monster_atk = @monster.status.atk
  end
 
  def monster_str
    return $monster_str = @monster.status.str
  end
 
  def monster_dex
    return $monster_dex = @monster.status.dex
  end
 
  def monster_int
    return $monster_int = @monster.status.int
  end
 
  def monster_spd
    return $monster_spd = @monster.status.agi
  end
end

# 버그발견시 www.nioting.com 에 글남겨주세요. by [Niotsoft.펜릴]
#===============================================#
#○각종 정의에 필요한 주인공 능력치를 메소드에 담는다.
#===============================================#
class Game_Player < Game_Character
 
  def player_pdef
    return $game_party.actors[0].pdef
  end
 
  def player_mdef
    return $game_party.actors[0].mdef
  end
 
  def player_atk
    return $game_party.actors[0].atk
  end
 
  def player_str
    return $game_party.actors[0].str
  end
 
  def player_dex
    return $game_party.actors[0].dex
  end
 
  def player_int
    return $game_party.actors[0].int
  end
 
  def player_spd
    return $game_party.actors[0].agi
  end
end
#===============================================#
#○몬스터 행동 정의
#===============================================#
class Game_Event < Game_Event
  attr_accessor :gauge
  attr_accessor :atkdelay

  def update
    super
    return if not action?
    die! if dead?
    attack!
    인식!
  end
 
  def action?
    return (@monster.hp != nil)
  end
  # 버그발견시 www.nioting.com 에 글남겨주세요. by [Niotsoft.펜릴]
  def dead?
    return false if not action?
    return (@monster.hp <= 0)
  end
 
  def 인식!
    @monster_x = (@x - $game_player.x).abs
    @monster_y = (@y - $game_player.y).abs
    if @monster_x <= 3 and @monster_y <= 3
      if @monster.인식 == 0
        @move_type = 2
        @move_speed = 3
        @move_frequency = 6
        @animation_id=98
        return @monster.인식 = 1
      end
    end
  end

  def attack!
    if @delay == nil or @delay == 0
      @delay = 40
    else
      @delay -= 1
      return
    end
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    if $game_player.x == new_x and $game_player.y == new_y
      turn_toward_player
      $game_player.damage(monster_atk,monster_str,@monster.status.animation2_id)
    end
  end

  def turn_toward_player
    super
    $game_player.turn_right if (@direction == 4)
    $game_player.turn_left if (@direction == 6)
    $game_player.turn_up if (@direction == 2)
    $game_player.turn_down if (@direction == 8)
  end
 
  def damage(atk,status,ani)
    return if not action?
    min_dmg = (atk + status) * 0.1
    dmg = [atk + status - monster_pdef, 0].max
    dmg = min_dmg if min_dmg >= dmg
    @monster.hp = [@monster.hp - dmg, 0].max
    @gauge = @monster.hp.to_f / @monster.maxhp.to_f
    turn_toward_player
    move_backward if rand(5) <= 1
    self.animation_id = ani
  end
 
  def die!
    return if @dead
    if rand(100) <= @monster.status.treasure_prob
      $game_party.gain_weapon(@monster.status.weapon_id,1)
      $game_party.gain_armor(@monster.status.armor_id,1)
      $game_party.gain_item(@monster.status.item_id,1)
    end
    $game_party.actors[0].exp += @monster.status.exp
    $game_party.gain_gold(@monster.status.gold)
    self.animation_id = 54
    erase
    @dead = true
    @monster.hp = nil
    @atkdelay = nil
  end
end

class Game_Player < Game_Player
  attr_accessor :gauge
  attr_accessor :atkdelay
  def update
    super
    @real_time = Time.now #실제시간 변수처리
    player_die #플레이어 사망처리
    player_attack #플레이어 공격
  end
 
  def player_die
    if $game_party.actors[0].hp == 0
      $scene = Scene_Gameover.new
    end
  end

  #플레이어 공격
  def player_attack
    if Input.trigger?(Input::C) and @atkdelay.to_f <= @real_time.to_f
      for event in $game_map.events.values
        new_x = @x + (@direction == 6 ? 1 :@direction == 4 ? -1 : 0)
        new_y = @y + (@direction == 2 ? 1 :@direction == 8 ? -1 : 0)
        if event.x == new_x and event.y == new_y and event.monster.status != nil
          player_attack_speed
          event.damage(player_atk, player_str,weapon_ani)
        end
      end
    end
  end
 
  #무기 공속 무기를 벗으면 기본공속 1.0초
  def player_attack_speed
    @atkdelay = @real_time.to_f + (0.01 * weapon_speed.to_f)
  end


# 버그발견시 www.nioting.com 에 글남겨주세요. by [Niotsoft.펜릴]

  def weapon_ani
    weapon_id = $game_party.actors[0].weapon_id
    return 4 if $data_weapons[weapon_id] == nil
    return $data_weapons[weapon_id].animation2_id
  end

  def weapon_speed
    weapon_id = $game_party.actors[0].weapon_id
    return $game_party.actors[0].agi = 50 if $data_weapons[weapon_id] == nil
    return $data_weapons[weapon_id].agi_plus
  end

  def damage(atk,status,ani)
    min_dmg = (atk + status) * 0.1
    dmg = [atk + status - player_pdef, 0].max
    dmg = min_dmg if min_dmg >= dmg
    $game_party.actors[0].hp = [$game_party.actors[0].hp - dmg, 0].max
    @gauge = $game_party.actors[0].hp.to_f / $game_party.actors[0].maxhp.to_f
    move_backward if rand(5) <= 1
    self.animation_id = ani
  end
end


#===================================

#hp 게이지 테스트용 (카피라이트 모름.)

#===================================

class Sprite_Character < Sprite_Character
  def update
    super
   
    if @character.gauge != nil #and @character.gauge > 0
      gauge(@character.gauge)
      @character.gauge = nil
     
    end
    if @_gauge_setup then
      @_gauge_duration = [@_gauge_duration -5,0].max
      @_gauge_sprite_b.x = self.x
      @_gauge_sprite_b.y = self.y
      @_gauge_sprite_b.opacity = @_gauge_duration
      @_gauge_sprite.x =self.x
      @_gauge_sprite.y =self.y
      @_gauge_sprite.opacity = @_gauge_duration
    end
  end
 
  def gauge(p)
    setup_gauge if not @_gauge_setup
    @_gauge_sprite.src_rect = Rect.new(0, 0, p*30,2)
    @_gauge_duration = 255
  end
 
  def setup_gauge
    dispose_gauge
    @_gauge_setup = true
    @_gauge_sprite = Sprite.new(self.viewport)
    @_gauge_sprite.bitmap = Bitmap.new(30,2)
    @_gauge_sprite.bitmap.fill_rect(0, 0, 30, 2, Color.new(255, 0, 0))
    @_gauge_sprite.ox = 15
    @_gauge_sprite.oy = -1
    @_gauge_sprite.z = 1000
    @_gauge_sprite_b = Sprite.new(self.viewport)
    @_gauge_sprite_b.bitmap = Bitmap.new(32,4)
    @_gauge_sprite_b.bitmap.fill_rect(0,0,32,4, Color.new(0,0,0))
    @_gauge_sprite_b.bitmap.fill_rect(1,1,30,2, Color.new(0,0,0))
    @_gauge_sprite_b.ox = 16
    @_gauge_sprite_b.oy = 0
    @_gauge_sprite_b.z = 999
  end
 
  def dispose_gauge
    return if not @_gauge_setup
    @_gauge_setup = false
    @_gauge_sprite.dispose
    @_gauge_sprite_b.dispose
  end
 
  def dispose
   
    dispose_gauge
    super
  end
end


 # 버그발견시 www.nioting.com 에 글남겨주세요. by [Niotsoft.펜릴]

class Game_Actor < Game_Battler
  def exp_rate
    if @exp_list[@level+1] - @exp_list[@level] > 0
      return (@exp- @exp_list[@level]).to_f / (@exp_list[@level+1] - @exp_list[@level]).to_f
    else
      return 0
    end
  end
end


class Window_Gauge < Window_Base
  def initialize
    super(0, 0, 145,105) #<사이즈
    self.contents = Bitmap.new(width - 32, height - 32)
   
    self.contents.font = Font.new("휴먼옛체", 16) #폰트사이즈
    self.opacity = 255
    self.back_opacity = 150
   
  end
 
  def refresh
    self.contents.clear
    self.contents.draw_text(0, -4,120,30, @show_text4)
    self.contents.draw_text(0, 12, 120, 30, @show_text)
    self.contents.draw_text(0, 28, 120, 30, @show_text2)
    self.contents.draw_text(0, 47, 120, 30, @show_text3)
  end
 
  def actor
    $game_party.actors[0]
  end
  def update
    super
    text  = sprintf("HP :%d /%d", actor.hp, actor.maxhp)
    text2 = sprintf("MP :%d /%d", actor.sp, actor.maxsp)
    text3 = sprintf("EXP:%.3f%%",(actor.exp_rate*100).to_f)
    text4 = sprintf("LV:%d  %s ",actor.level,actor.name)
    if @show_text != text or @show_text2 != text2 or @show_text3 != text3 or @show_text4 != text4
      @show_text = text
      @show_text2 = text2
      @show_text3 = text3
      @show_text4 = text4
      refresh
    end
  end
end

class Scene_Map < Scene_Map
  def update
    super
    @window_gauge = Window_Gauge.new unless @window_gauge
    @window_gauge.update
    unless $scene.is_a?(Scene_Map)
      @window_gauge.dispose
      @window_gauge=nil
    end
  end
end

 

<사용법>

 사용법은_이거한장이면_ok.jpg

 

사용법2.jpg

맵이벤트 이름에 DB에 있는 이름과(좀비) 똑같이 써주기만하면됩니다.

ex) 고스트 , 좀비 , 사하긴, 코볼트 등등..

추가로 자율이동 ->타입 = "랜덤이동"  추천드립니다.

※빨간박스가 DB에서 수정가능한부분

 

 

1.20 ver 릴리즈 노트

 

1.공격속도는 DB > 무기 > 민첩 수치로 조절 가능합니다.

(민첩이 높으면 높을 수록 공격이 느려집니다. - DB >시스템 > 민첩을 공격속도로 바꿔주시면 되겠습니다.)

민첩 100 = 공격속도 1초

민첩 150 = 공격속도 1.5초

 

2.몬스터 인공지능 개선

플레이어가 몬스터 반경 3x3타일에 접근하면

느낌표 이펙트를 띄우고 엄청난 속도로 달려들게 됩니다.

  • ?
    초싸이언플라즈망 2012.12.09 14:38
    리젠은 하나요?
  • ?
    펜릴 2012.12.10 14:34
    스토리형 RPG기때문에 별도의 리젠은 없고, 다만 맵이동 시
    동일 위치에서 리젠되니 형식에 맞춰 게임을 만들어 보시기 바랍니다.
  • ?
    크그르그아 2012.12.19 18:11
    애니매이션을 장착한 무기에 따라서 바꿀순 없나요?
  • ?
    크그르그아 2012.12.19 18:23
    아 되군요. 제가 원하던 거네요 감사합니다 ㅋㅋ
  • profile
    오오봉 2012.12.29 12:47
    근데..스킬이 사용이 안되네요
  • ?
    TIME3217 2014.11.22 23:54
    갑자기 능력치가 메소드인가 뭔가에 않보이네요

List of Articles
분류 제목 글쓴이 날짜 조회 수 추천 수
공지사항 일본어 스크립트를 번역하기 좋은 번역사이트 두곳입니다 ruby 2010.01.09 22074 0
공지사항 스크립트 게시판 관리자' ruby ' 입니다 ruby 2010.01.09 20725 0
공지사항 일본 스크립트/소스 공유 포럼 4 니오티 2010.01.05 22249 0
전투관련 누구나 쉽게 만드는 액션알피지 6 펜릴 2012.11.25 4344 0
전투관련 초간단 XAS 오리지널. 1 file 호호리터엉 2011.08.04 2614 0
전투관련 ZTBS 10 file 강현문 2010.06.05 3533 0
전투관련 턴제 전투방식 스크립트!!!!!!! 7 file XP 팬 2010.04.30 3329 0
전투관련 간단한 액션알피지용 스크립트 Ver.1.01 (게임오버 추가) 38 file 펜릴 2010.04.11 8730 0
전투관련 ABP 액알 예제 4 file ruby 2010.02.10 3531 1
전투관련 어떤 한 몬스터를 공격지정할때 그 몬스터가 줌되는 스크립트 9 windshy 2010.01.13 2182 0
전투관련 리얼타임을 이용한 딜레이 구현 1 펜릴 2010.01.10 4197 0
전투관련 레벨업시 체력 회복 스크립트 4 루시아스 2010.01.05 2112 0
전투관련 파괴효과 스크립트 이벤트적용 <사용법> 11 file 아하하 2007.12.06 2691 3
전투관련 파괴효과 추천스크립트 7 file 아하하 2007.12.06 3588 1
전투관련 콤보 스크립트 10 아하하 2007.12.05 3699 4
전투관련 턴알 게이지바 변경 스크립트 (HP/SP) 3 file 니오티 2007.02.20 3984 2
전투관련 게이지 확인창 스크립트 (HP/SP/EXP) 4 file 니오티 2007.02.20 3540 5
Board Pagination Prev 1 Next
/ 1

Copyright ⓒ Nioting All Rights Reserved. (since 1999)    개인정보
        

Fatal error: Cannot access property sessionController::$lifetime in /web/old/xe/modules/session/session.controller.php on line 45