전투관련
2012.11.25 01:43

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

조회 수 3850 추천 수 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
분류 제목 글쓴이 날짜 조회 수 추천 수
긴급상황 발생시 연락처 안내 독도2005 2012.11.28 2203 0
니오팅 이용 규칙 (2013.01.05 3차 개정) 7 file 소녀쿤 2012.01.15 15580 0
여러분의 의견을 받습니다. 20 file 니오팅 2010.01.29 4236 2
공지사항 일본어 스크립트를 번역하기 좋은 번역사이트 두곳입니다 ruby 2010.01.09 21506 0
공지사항 스크립트 게시판 관리자' ruby ' 입니다 ruby 2010.01.09 20476 0
공지사항 일본 스크립트/소스 공유 포럼 4 니오티 2010.01.05 21905 0
대화관련 한글자씩 글자 나오는거 완전판!!(오류 하나도 없음) 만원만주라 2013.07.09 1531 0
전투관련 누구나 쉽게 만드는 액션알피지 6 펜릴 2012.11.25 3850 0
공통 Script 화면이 부드럽게 이동돼는 스크립트 2 ★Best갱신★ 2012.09.27 1505 0
맵관련 혹시나해서 일정키로 스크롤X 화면 부드럽게만...(스크립트를 삭제를 조금 했습니다) 호호리터엉 2012.02.13 1666 0
장르변경 2D 로 가는길! 횡스크롤 이닷! 공냑군 2012.01.24 1930 0
기타 게이지바 스크립트!! 최고!! 12 file 코아 코스튬 2011.08.08 3752 0
대화관련 대화 창에 얼굴 넣기 스크립트 4 file 노르 2011.08.08 2969 0
맵관련 조금 다른 맵표시 스크립트 file 노르 2011.08.08 1789 0
시각적 효과 NPC 위에 이름표시 하기 스크립트 2 file 노르 2011.08.08 2354 0
전투관련 초간단 XAS 오리지널. 1 file 호호리터엉 2011.08.04 2511 0
스킬관련 전투 비슷??????????? 아오오오오옹니 2011.07.29 1766 0
기능추가 전체키 스크립트 8 닉네임이없습니다 2011.07.19 2104 0
기타 이름입력 스크립트 2 닉네임이없습니다 2011.07.16 2077 0
맵관련 맵이름 띄우기 (오류없이 진짜나옵니다) 6 지나가던개 2011.07.06 2158 0
메뉴관련 간단한 링 메뉴 스크립트(처음올리는 스크립트) 1 lts1503 2011.05.22 2053 0
온라인 이것은약간온라인이랑섞인듯? 어쨋든 클릭스크립트!! 2 file 호호리터엉 2011.02.23 2127 0
맵관련 W키눌러서 미니맵표시 12 호호리터엉 2011.01.22 2677 1
맵관련 Shift키누르고 방향키누르면 화면스크롤되는것 7 file 호호리터엉 2011.01.21 2471 0
맵관련 맵이름 띄우기, 케릭터 ID띄우기 15 file 꼬마쟁이 2011.01.05 7237 0
기타 중복일것 같은데;; [한글 이름 입력] 1 꼬마쟁이 2011.01.05 4398 0
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6

Copyright ⓒ Nioting All Rights Reserved. (since 1999)   개인정보취급방침