전투관련
2012.11.25 01:43

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

조회 수 4374 추천 수 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
    갑자기 능력치가 메소드인가 뭔가에 않보이네요

  1. 일본어 스크립트를 번역하기 좋은 번역사이트 두곳입니다

    Date2010.01.09 Category공지사항 Byruby Views22088 Votes0
    read more
  2. 스크립트 게시판 관리자' ruby ' 입니다

    Date2010.01.09 Category공지사항 Byruby Views20728 Votes0
    read more
  3. 일본 스크립트/소스 공유 포럼

    Date2010.01.05 Category공지사항 By니오티 Views22259 Votes0
    read more
  4. 누구나 쉽게 만드는 액션알피지

    Date2012.11.25 Category전투관련 By펜릴 Views4374 Votes0
    Read More
  5. 초간단 XAS 오리지널.

    Date2011.08.04 Category전투관련 By호호리터엉 Views2621 Votes0
    Read More
  6. ZTBS

    Date2010.06.05 Category전투관련 By강현문 Views3566 Votes0
    Read More
  7. 턴제 전투방식 스크립트!!!!!!!

    Date2010.04.30 Category전투관련 ByXP 팬 Views3330 Votes0
    Read More
  8. 간단한 액션알피지용 스크립트 Ver.1.01 (게임오버 추가)

    Date2010.04.11 Category전투관련 By펜릴 Views8763 Votes0
    Read More
  9. ABP 액알 예제

    Date2010.02.10 Category전투관련 Byruby Views3531 Votes1
    Read More
  10. 어떤 한 몬스터를 공격지정할때 그 몬스터가 줌되는 스크립트

    Date2010.01.13 Category전투관련 Bywindshy Views2183 Votes0
    Read More
  11. 리얼타임을 이용한 딜레이 구현

    Date2010.01.10 Category전투관련 By펜릴 Views4197 Votes0
    Read More
  12. 레벨업시 체력 회복 스크립트

    Date2010.01.05 Category전투관련 By루시아스 Views2113 Votes0
    Read More
  13. 파괴효과 스크립트 이벤트적용 <사용법>

    Date2007.12.06 Category전투관련 By아하하 Views2691 Votes3
    Read More
  14. 파괴효과 추천스크립트

    Date2007.12.06 Category전투관련 By아하하 Views3588 Votes1
    Read More
  15. 콤보 스크립트

    Date2007.12.05 Category전투관련 By아하하 Views3700 Votes4
    Read More
  16. 턴알 게이지바 변경 스크립트 (HP/SP)

    Date2007.02.20 Category전투관련 By니오티 Views3984 Votes2
    Read More
  17. 게이지 확인창 스크립트 (HP/SP/EXP)

    Date2007.02.20 Category전투관련 By니오티 Views3540 Votes5
    Read More
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