RPGXP: Airship

Thảo luận trong 'Demo - Project' bắt đầu bởi >VoDich<, 14/4/06.

  1. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: AirShip

    người request hơi nhìu mà lão dương dê chẳng thèm share, tui cũng chưa thấy cái airship bao giờ nhưng nghe tên gọi thì có vẻ là 1 cái thuyền bay,
    thôi thì mấy bạn dùng tạm cái airship này vậy, có thể ko = của lão dương nhưng cũng ngon lành lắm

    sử dụng 3 event chính:
    - airport: dùng để hạ cánh hoặc leo lên airship
    - ship_motion_controller : tạo 1 hiệu ứng nhỏ làm airship đong đưa lắc lư
    - air_ship: nó đó

    về mặt graphics bạn cần 4 hình airship với 4 direction (left,right,up,down) add vô Pictures Resource, 4 hình tiếp theo cho 4 cái bóng của airship theo 4 hướng cũng cho dzô Pictures Resource.

    Ok, phần chi tiết xem demo nhé

    giờ tới variables: sử dụng 6 variables

    0001: ship_x
    0002: ship_y
    0003: ship_motion
    0004: flag
    0005: ship_motion2
    0006: enter_ship

    nếu ko sử dụng mặc định 6 variable đầu này thì bạn cần sửa lại các thứ tự variable cho đúng trong 3 event trên. chú ý, variable 6: enter_ship có sử dụng trong script, vì vậy nhớ thay đồi trong script lun (sửa chỗ nào thì xem tiếp)

    tiếp theo là script, airship này có modify vài chỗ nhỏ trong 3 script (tôi có để dấu ** trong demo)

    Game_Character 2
    Game_Character 3
    Game_Event

    với 1 số bạn khi đem airship này vào game của mình thì có thể 3 script trên trong game của bạn đã có thể có sự thay đồi so với script mặc định. vì vậy tôi ko thể biết số dòng chính xác để có thể hướng dẫn thêm vào cho các bạn. hướng dẫn thêm vào sau cho script mặc định

    ---------------------------------------------
    trong Game_Character 2 tìm dòng 81

    Mã:
    distance = 2 ** @move_speed
    
    thay =

    Mã:
        if $game_variables[6]==0 #thay số 6 thành variable bạn tự chọn cho (enter_ship)
          @ship_speed=4 #tốc tộ mặc định của character là 4
        else 
           @ship_speed=2 #tốc độ của airship
         end
        distance = 2 ** @ship_speed
    
    --------------------------------------------
    thay đồi trong Game_Character 3 thì hơi nhìu nên bạn cứ copy hết đoạn script này rùi paste dzô

    Mã:
    #==============================================================================
    # ■ Game_Character (分割定義 3)
    #------------------------------------------------------------------------------
    #  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
    # クラスのスーパークラスとして使用されます。
    #==============================================================================
    
    class Game_Character
      #--------------------------------------------------------------------------
      # ● 下に移動
      #     turn_enabled : その場での向き変更を許可するフラグ
      #--------------------------------------------------------------------------
      def move_down(turn_enabled = true)
        # 下を向く
        if turn_enabled
          turn_down
        end
         #MODIFY-----------MODIFY--------------MODIFY
         # tiny modify
    if $game_variables[6]==0  #false thay số 6 thành variable bạn tự chọn cho (enter_ship)
        if passable?(@x, @y, 2)
          turn_down
          @y += 1
          increase_steps
        else
          check_event_trigger_touch(@x, @y+1)
        end
      else #enter ship
          turn_down
          @y += 1
          increase_steps
    end
    #end
     #MODIFY-----------MODIFY--------------MODIFY
      end
      #--------------------------------------------------------------------------
      # ● 左に移動
      #     turn_enabled : その場での向き変更を許可するフラグ
      #--------------------------------------------------------------------------
      def move_left(turn_enabled = true)
        # 左を向く
        if turn_enabled
          turn_left
        end
     #MODIFY-----------MODIFY--------------MODIFY
         # tiny modify 
    if $game_variables[6]==0  #false thay số 6 thành variable bạn tự chọn cho (enter_ship)
        if passable?(@x, @y, 4)
          turn_left
          @x -= 1
          increase_steps
        else
          check_event_trigger_touch(@x-1, @y)
        end
    else #enter ship
          turn_left
          @x -= 1
          increase_steps
    end
    #end 
    #MODIFY-----------MODIFY--------------MODIFY
      end
      #--------------------------------------------------------------------------
      # ● 右に移動
      #     turn_enabled : その場での向き変更を許可するフラグ
      #--------------------------------------------------------------------------
      def move_right(turn_enabled = true)
        # 右を向く
        if turn_enabled
          turn_right
        end
     #MODIFY-----------MODIFY--------------MODIFY
     # tiny modify
    if $game_variables[6]==0  #false thay số 6 thành variable bạn tự chọn cho (enter_ship)
        if passable?(@x, @y, 6)
          turn_right
          @x += 1
          increase_steps
        else
          check_event_trigger_touch(@x+1, @y)
        end
    else #enter ship
          turn_right
          @x += 1
          increase_steps
    end
    #end
     #MODIFY-----------MODIFY--------------MODIFY
      end
      #--------------------------------------------------------------------------
      # ● 上に移動
      #     turn_enabled : その場での向き変更を許可するフラグ
      #--------------------------------------------------------------------------
      def move_up(turn_enabled = true)
        # 上を向く
        if turn_enabled
          turn_up
        end
     #MODIFY-----------MODIFY--------------MODIFY
         # tiny modify
    if $game_variables[6]==0  #false thay số 6 thành variable bạn tự chọn cho (enter_ship)
        if passable?(@x, @y, 8)
          turn_up
          @y -= 1
          increase_steps
        else
          check_event_trigger_touch(@x, @y-1)
        end
    else #enter ship
          turn_up
          @y -= 1
          increase_steps
    end
    #end
     #MODIFY-----------MODIFY--------------MODIFY
      end
      #--------------------------------------------------------------------------
      # ● 左下に移動
      #--------------------------------------------------------------------------
      def move_lower_left
        # 向き固定でない場合
        unless @direction_fix
          # 右向きだった場合は左を、上向きだった場合は下を向く
          @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
        end
        # 下→左、左→下 のどちらかのコースが通行可能な場合
        if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
           (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
          # 座標を更新
          @x -= 1
          @y += 1
          # 歩数増加
          increase_steps
        end
      end
      #--------------------------------------------------------------------------
      # ● 右下に移動
      #--------------------------------------------------------------------------
      def move_lower_right
        # 向き固定でない場合
        unless @direction_fix
          # 左向きだった場合は右を、上向きだった場合は下を向く
          @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
        end
        # 下→右、右→下 のどちらかのコースが通行可能な場合
        if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or
           (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
          # 座標を更新
          @x += 1
          @y += 1
          # 歩数増加
          increase_steps
        end
      end
      #--------------------------------------------------------------------------
      # ● 左上に移動
      #--------------------------------------------------------------------------
      def move_upper_left
        # 向き固定でない場合
        unless @direction_fix
          # 右向きだった場合は左を、下向きだった場合は上を向く
          @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
        end
        # 上→左、左→上 のどちらかのコースが通行可能な場合
        if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or
           (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
          # 座標を更新
          @x -= 1
          @y -= 1
          # 歩数増加
          increase_steps
        end
      end
      #--------------------------------------------------------------------------
      # ● 右上に移動
      #--------------------------------------------------------------------------
      def move_upper_right
        # 向き固定でない場合
        unless @direction_fix
          # 左向きだった場合は右を、下向きだった場合は上を向く
          @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
        end
        # 上→右、右→上 のどちらかのコースが通行可能な場合
        if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or
           (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
          # 座標を更新
          @x += 1
          @y -= 1
          # 歩数増加
          increase_steps
        end
      end
      #--------------------------------------------------------------------------
      # ● ランダムに移動
      #--------------------------------------------------------------------------
      def move_random
        case rand(4)
        when 0  # 下に移動
          move_down(false)
        when 1  # 左に移動
          move_left(false)
        when 2  # 右に移動
          move_right(false)
        when 3  # 上に移動
          move_up(false)
        end
      end
      #--------------------------------------------------------------------------
      # ● プレイヤーに近づく
      #--------------------------------------------------------------------------
      def move_toward_player
        # プレイヤーの座標との差を求める
        sx = @x - $game_player.x
        sy = @y - $game_player.y
        # 座標が等しい場合
        if sx == 0 and sy == 0
          return
        end
        # 差の絶対値を求める
        abs_sx = sx.abs
        abs_sy = sy.abs
        # 横の距離と縦の距離が等しい場合
        if abs_sx == abs_sy
          # ランダムでどちらかを 1 増やす
          rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
        end
        # 横の距離のほうが長い場合
        if abs_sx > abs_sy
          # 左右方向を優先し、プレイヤーのいるほうへ移動
          sx > 0 ? move_left : move_right
          if not moving? and sy != 0
            sy > 0 ? move_up : move_down
          end
        # 縦の距離のほうが長い場合
        else
          # 上下方向を優先し、プレイヤーのいるほうへ移動
          sy > 0 ? move_up : move_down
          if not moving? and sx != 0
            sx > 0 ? move_left : move_right
          end
        end
      end
      #--------------------------------------------------------------------------
      # ● プレイヤーから遠ざかる
      #--------------------------------------------------------------------------
      def move_away_from_player
        # プレイヤーの座標との差を求める
        sx = @x - $game_player.x
        sy = @y - $game_player.y
        # 座標が等しい場合
        if sx == 0 and sy == 0
          return
        end
        # 差の絶対値を求める
        abs_sx = sx.abs
        abs_sy = sy.abs
        # 横の距離と縦の距離が等しい場合
        if abs_sx == abs_sy
          # ランダムでどちらかを 1 増やす
          rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
        end
        # 横の距離のほうが長い場合
        if abs_sx > abs_sy
          # 左右方向を優先し、プレイヤーのいないほうへ移動
          sx > 0 ? move_right : move_left
          if not moving? and sy != 0
            sy > 0 ? move_down : move_up
          end
        # 縦の距離のほうが長い場合
        else
          # 上下方向を優先し、プレイヤーのいないほうへ移動
          sy > 0 ? move_down : move_up
          if not moving? and sx != 0
            sx > 0 ? move_right : move_left
          end
        end
      end
      #--------------------------------------------------------------------------
      # ● 一歩前進
      #--------------------------------------------------------------------------
      def move_forward
        case @direction
        when 2
          move_down(false)
        when 4
          move_left(false)
        when 6
          move_right(false)
        when 8
          move_up(false)
        end
      end
      #--------------------------------------------------------------------------
      # ● 一歩後退
      #--------------------------------------------------------------------------
      def move_backward
        # 向き固定の状態を記憶
        last_direction_fix = @direction_fix
        # 強制的に向き固定
        @direction_fix = true
        # 向きで分岐
        case @direction
        when 2  # 下
          move_up(false)
        when 4  # 左
          move_right(false)
        when 6  # 右
          move_left(false)
        when 8  # 上
          move_down(false)
        end
        # 向き固定の状態を元に戻す
        @direction_fix = last_direction_fix
      end
      #--------------------------------------------------------------------------
      # ● ジャンプ
      #     x_plus : X 座標加算値
      #     y_plus : Y 座標加算値
      #--------------------------------------------------------------------------
      def jump(x_plus, y_plus)
        # 加算値が (0,0) ではない場合
        if x_plus != 0 or y_plus != 0
          # 横の距離のほうが長い場合
          if x_plus.abs > y_plus.abs
            # 左右どちらかに向き変更
            x_plus < 0 ? turn_left : turn_right
          # 縦の距離のほうが長いか等しい場合
          else
            # 上下どちらかに向き変更
            y_plus < 0 ? turn_up : turn_down
          end
        end
        # 新しい座標を計算
        new_x = @x + x_plus
        new_y = @y + y_plus
        # 加算値が (0,0) の場合か、ジャンプ先が通行可能な場合
        if (x_plus == 0 and y_plus == 0) or passable?(new_x, new_y, 0)
          # 姿勢を矯正
          straighten
          # 座標を更新
          @x = new_x
          @y = new_y
          # 距離を計算
          distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round
          # ジャンプカウントを設定
          @jump_peak = 10 + distance - @move_speed
          @jump_count = @jump_peak * 2
          # 停止カウントをクリア
          @stop_count = 0
        end
      end
      #--------------------------------------------------------------------------
      # ● 下を向く
      #--------------------------------------------------------------------------
      def turn_down
        unless @direction_fix
          @direction = 2
          @stop_count = 0
        end
      end
      #--------------------------------------------------------------------------
      # ● 左を向く
      #--------------------------------------------------------------------------
      def turn_left
        unless @direction_fix
          @direction = 4
          @stop_count = 0
        end
      end
      #--------------------------------------------------------------------------
      # ● 右を向く
      #--------------------------------------------------------------------------
      def turn_right
        unless @direction_fix
          @direction = 6
          @stop_count = 0
        end
      end
      #--------------------------------------------------------------------------
      # ● 上を向く
      #--------------------------------------------------------------------------
      def turn_up
        unless @direction_fix
          @direction = 8
          @stop_count = 0
        end
      end
      #--------------------------------------------------------------------------
      # ● 右に 90 度回転
      #--------------------------------------------------------------------------
      def turn_right_90
        case @direction
        when 2
          turn_left
        when 4
          turn_up
        when 6
          turn_down
        when 8
          turn_right
        end
      end
      #--------------------------------------------------------------------------
      # ● 左に 90 度回転
      #--------------------------------------------------------------------------
      def turn_left_90
        case @direction
        when 2
          turn_right
        when 4
          turn_down
        when 6
          turn_up
        when 8
          turn_left
        end
      end
      #--------------------------------------------------------------------------
      # ● 180 度回転
      #--------------------------------------------------------------------------
      def turn_180
        case @direction
        when 2
          turn_up
        when 4
          turn_right
        when 6
          turn_left
        when 8
          turn_down
        end
      end
      #--------------------------------------------------------------------------
      # ● 右か左に 90 度回転
      #--------------------------------------------------------------------------
      def turn_right_or_left_90
        if rand(2) == 0
          turn_right_90
        else
          turn_left_90
        end
      end
      #--------------------------------------------------------------------------
      # ● ランダムに方向転換
      #--------------------------------------------------------------------------
      def turn_random
        case rand(4)
        when 0
          turn_up
        when 1
          turn_right
        when 2
          turn_left
        when 3
          turn_down
        end
      end
      #--------------------------------------------------------------------------
      # ● プレイヤーの方を向く
      #--------------------------------------------------------------------------
      def turn_toward_player
        # プレイヤーの座標との差を求める
        sx = @x - $game_player.x
        sy = @y - $game_player.y
        # 座標が等しい場合
        if sx == 0 and sy == 0
          return
        end
        # 横の距離のほうが長い場合
        if sx.abs > sy.abs
          # 左右方向でプレイヤーのいるほうを向く
          sx > 0 ? turn_left : turn_right
        # 縦の距離のほうが長い場合
        else
          # 上下方向でプレイヤーのいるほうを向く
          sy > 0 ? turn_up : turn_down
        end
      end
      #--------------------------------------------------------------------------
      # ● プレイヤーの逆を向く
      #--------------------------------------------------------------------------
      def turn_away_from_player
        # プレイヤーの座標との差を求める
        sx = @x - $game_player.x
        sy = @y - $game_player.y
        # 座標が等しい場合
        if sx == 0 and sy == 0
          return
        end
        # 横の距離のほうが長い場合
        if sx.abs > sy.abs
          # 左右方向でプレイヤーのいないほうを向く
          sx > 0 ? turn_right : turn_left
        # 縦の距離のほうが長い場合
        else
          # 上下方向でプレイヤーのいないほうを向く
          sy > 0 ? turn_down : turn_up
        end
      end
    end
    
    -------------------------------------------------
    tìm trong script Game_Event đến dòng 209

    Mã:
      def update
        super
        # 自動イベントの起動判定
    
    copy và paste đoạn code sau bên trên dòng 209

    Mã:
       def update_move
        distance = 2 ** @move_speed
        if @y * 128 > @real_y
          @real_y = [@real_y + distance, @y * 128].min
        end
        if @x * 128 < @real_x
          @real_x = [@real_x - distance, @x * 128].max
        end
        if @x * 128 > @real_x
          @real_x = [@real_x + distance, @x * 128].min
        end
        if @y * 128 < @real_y
          @real_y = [@real_y - distance, @y * 128].max
        end
        if @walk_anime
          @anime_count += 1.5
        elsif @step_anime
          @anime_count += 1
        end
      end
    
    OK vậy là xong, tôi có gửi kèm demo (not encrypt) bạn mở demo ra vọc là hiểu cách thức nó hoạt động liền
    Have fun!!!

    [​IMG]
    :@}
     

    Các file đính kèm:

  2. Kid1443

    Kid1443 Mega Man

    Tham gia ngày:
    19/6/03
    Bài viết:
    3,038
    Nơi ở:
    Một Hồi Ức
    Cái Air ship của lão dương hay đấy...nhưng kid muốn khi lên airship thì không thêm teleport sang map khác thì phải làm sao

    Vodich co' Y!M không...cho kid xi nd9i....on line dễ thảo luận ^__^
     
  3. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: Y!M: zeroonea
    bạn nói ngắn gọn quá tôi ko hiểu bạn mún cái gì nữa ^^ :@}
     
  4. Dương44

    Dương44 Donkey Kong

    Tham gia ngày:
    8/2/06
    Bài viết:
    314
    Nơi ở:
    Hải Phòng
    Cái Air Ship này lỗi 1 số chỗ ông Guardian Angel ơi ( tức Vo Dich đó )
     
  5. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: cha ken trừ điểm bậy quá, nhòm giờ post 2 bài đều 9 giờ 01 phút thì 100 % do bug rùi, tui có cố tình đâu nào,
    lỗi ở đâu thì nói ra đi cụ dương ới ời ơi

    :@}
     
  6. dekarvn

    dekarvn Donkey Kong

    Tham gia ngày:
    23/1/05
    Bài viết:
    369
    Nơi ở:
    Law City of Zenebatos
    Công nhận, tui test không thấy lỗi..
    Hoan nghênh tinh thần của Vodich :D share tại chỗ, kô encrypt, hướng dẫn dễ hiểu
     
  7. Dương44

    Dương44 Donkey Kong

    Tham gia ngày:
    8/2/06
    Bài viết:
    314
    Nơi ở:
    Hải Phòng
    Để tui chỉ cho luôn nhe :
    _ Cái Air Ship này ko đáp xuống đất BT đc mà chỉ hạ cánh ở những chỗ cố định
    _ AS của tui có thể đáp xuống bất cứ lúc nào , trừ biển và 1 số nơi ko cho phép nó đáp
    Thế cơ mà ^^ , chắc ông chưa chơi FF nên chưa hỉu cách vận hành AS thui , chơi qua đi nghen :p
     
  8. Holy_Healing

    Holy_Healing Youtube Master Race

    Tham gia ngày:
    4/4/05
    Bài viết:
    53
    Tưởng VD chuyên nghề Game Maker sao nghiên cứu cả RPG XP nữa vậy?
    Nếu như mà RPG XP làm việc được với phần mềm nhúng thì sẽ có rất nhiều chuyện để nghĩ, tiếc là không có time để tìm hiểu.
     
  9. dekarvn

    dekarvn Donkey Kong

    Tham gia ngày:
    23/1/05
    Bài viết:
    369
    Nơi ở:
    Law City of Zenebatos
    còn tùy game và nhu cầu sử dụng, chơi qua wild arms 2 sẽ thấy được cái hay của nó.
    Còn airship cứ bạ đâu nhét đó thì nó thành 1 cái xe đạp chứ kô được coi trọng = 1 cái máy bay nữa.......

    Và nếu ông kô ngại, hay kô giấu diếm thì share bản airship của ông xem
    sao cứ gì cũng phải giống FF thế nhỉ?
     
  10. Dương44

    Dương44 Donkey Kong

    Tham gia ngày:
    8/2/06
    Bài viết:
    314
    Nơi ở:
    Hải Phòng
    Air Ship đó đâu phải FF mà đa số các game RPG đều như thế cả ông ạ :x
     
  11. dekarvn

    dekarvn Donkey Kong

    Tham gia ngày:
    23/1/05
    Bài viết:
    369
    Nơi ở:
    Law City of Zenebatos
    vì thế mới bị bó gọt vào 1 nhãn hiệu, đã RPG là phải như thế, đã RPG là phải giống FF.............
    ông share cái as của ông xem nào, hay định làm loãng topic rồi Ken chém?
     
  12. Dương44

    Dương44 Donkey Kong

    Tham gia ngày:
    8/2/06
    Bài viết:
    314
    Nơi ở:
    Hải Phòng
    Ủa , mà tui nhớ có up lên gòi mà , mà sao ông nặng lời với tui dậy ?
     
  13. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: @duong44, dekarvn: thanks, nói cho cùng cái bug ông nói ra cũng ko phải là bug, nó chỉ là 1 tính năng thui,
    tui ít chơi game lắm nên, chẳng game nào chơi quá 1 ngày ^^ chơi riết cũng chán, nói chung là modify vài event nhỏ là mún đáp đâu cũng được, cơ bản là vậy.
    @HH: e hèm, nói chung là học xong 1 khóa lập trình cơ bản, mình hiểu nó, nó hiểu mình thì việc tìm hiểu các ngôn ngữ khác cũng ko có gì khó đâu bạn, thử xem ^^.
    ------
    tóm lại người 'năm xưa' spam ở đây ko phải tại hạ, sư huynh ken chớ hiểu nhầm, nick này xài của thằng bạn (nó đó), nick trước là hahaha123 gì đó đệ bỏ lâu rùi.
    ps:sao ko bỏ điểm trừ đi ken ui
    :@}
     
  14. Dương44

    Dương44 Donkey Kong

    Tham gia ngày:
    8/2/06
    Bài viết:
    314
    Nơi ở:
    Hải Phòng
    Oái , các ông bằng tuổi nhau mà sao lại huynh đệ gì :(( , ông Ken cũng 1987 như tui thoai :D
    Mà cái Air Ship ông thử sửa cho nó đáp đâu cũng đc coi , tui muốn xem 1 số cái nữa xem có Bug ko :-/
     
  15. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: nói chung 1 là tự làm đi, tui chẳng rãnh mà update lại, trình độ ông thì dư sức rùi, còn ko thích thì thui vậy, dzay nha :@}
     

Chia sẻ trang này