Partagez
Aller en bas
avatar
Garruk
Membre

Nombre de messages : 986
Age : 34
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

RPG Maker VX [Résolu] Collision avec la commande "au-dessous du héros"

le Sam 29 Sep 2018 - 14:12
Bonjour.
Ça fait un petit moment que j'essaie de corriger ce problème d'affichage, malgré ma détermination de chercher une solution par moi-même, je n'y arrive toujours pas, du coup je fais cette demande en espérant que ce problème soit enfin réglé. x)
Cette partie de script de mon système modifie la condition "au-dessous du héros", le résultat fait que le héros peut toujours entrer en collision avec l’événement  (disons que la case 32x32 ne disparaît pas).


Code:
#==============================================================================
# ■ Game_Character
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :cw                 # スプライトの横サイズ
  attr_reader   :ch                 # スプライトの縦サイズ
  attr_reader   :collision          # 接触判定に使う四隅の座標(real_x,yに加算)
  attr_reader   :update_flag        # 更新フラグ
  attr_reader   :lift               # リフト属性
  attr_reader   :hit_skill          # 接触スキル
  attr_accessor :gravity            # 重力
  attr_accessor :undead             # 無敵
  attr_accessor :real_x             # マップ X 座標 (実座標 * 256)
  attr_accessor :real_y             # マップ Y 座標 (実座標 * 256)
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias act_game_character_initialize initialize
  def initialize
    act_game_character_initialize
    @lift = false
    @gravity = 5
    @undead = true
    @vx = @vy = 0
    @cw = @ch = 256
    @collision = [0, 0, 256, 256]
    @update_flag = true
    @jump_flag = false
    @jump_lock = 0
    @touch_flag = -1
    @ladder = false
    @move_count = 0
    @dead_count = 0
    @dash_timer = 0
  end
  #--------------------------------------------------------------------------
  # ● 移動中判定
  #--------------------------------------------------------------------------
  def moving?
    return @move_count > 0
  end
  #--------------------------------------------------------------------------
  # ● 左に移動
  #     turn_ok : その場での向き変更を許可
  #--------------------------------------------------------------------------
  def move_left(turn_ok = true)
    turn_left
    d = 2 ** @move_speed
    @vx = 0 - d
    @move_count = 256 / d
  end
  #--------------------------------------------------------------------------
  # ● 右に移動
  #     turn_ok : その場での向き変更を許可
  #--------------------------------------------------------------------------
  def move_right(turn_ok = true)
    turn_right
    d = 2 ** @move_speed
    @vx = d
    @move_count = 256 / d
  end
  #--------------------------------------------------------------------------
  # ● 上に移動
  #     turn_ok : その場での向き変更を許可
  #--------------------------------------------------------------------------
  def move_up(turn_ok = true)
    @stop_count = 0
    d = 2 ** @move_speed
    @vy = 0 - d
    @move_count = 256 / d
  end
  #--------------------------------------------------------------------------
  # ● 下に移動
  #     turn_ok : その場での向き変更を許可
  #--------------------------------------------------------------------------
  def move_down(turn_ok = true)
    @stop_count = 0
    d = 2 ** @move_speed
    @vy = d
    @move_count = 256 / d
  end
  #--------------------------------------------------------------------------
  # ● 左下に移動
  #--------------------------------------------------------------------------
  def move_lower_left
    turn_left
    d = 2 ** @move_speed
    @vx = 0 - d
    @vy = d
    @move_count = 256 / d
  end
  #--------------------------------------------------------------------------
  # ● 右下に移動
  #--------------------------------------------------------------------------
  def move_lower_right
    turn_right
    d = 2 ** @move_speed
    @vx = d
    @vy = d
    @move_count = 256 / d
  end
  #--------------------------------------------------------------------------
  # ● 左上に移動
  #--------------------------------------------------------------------------
  def move_upper_left
    turn_left
    d = 2 ** @move_speed
    @vx = 0 - d
    @vy = 0 - d
    @move_count = 256 / d
  end
  #--------------------------------------------------------------------------
  # ● 右上に移動
  #--------------------------------------------------------------------------
  def move_upper_right
    turn_right
    d = 2 ** @move_speed
    @vx = d
    @vy = 0 - d
    @move_count = 256 / d
  end
  #--------------------------------------------------------------------------
  # ● マップ通行可能判定
  #     mode : 0でx方向、1でy方向
  #--------------------------------------------------------------------------
  def map_passable?(mode)
    left_x  = @real_x + 32  >> 8  # 4 <<3
    right_x = @real_x + 224 >> 8  # 28 << 3
    up_y    = @real_y + 16  >> 8  # 2 << 3
    down_y  = @real_y + 224 >> 8  # 28 << 3
    if mode == 0  # X方向の判定
      if @vx > 0
        return false unless $game_map.map_pass?(right_x, up_y)
        return false unless $game_map.map_pass?(right_x, down_y)
      else
        return false unless $game_map.map_pass?(left_x, up_y)
        return false unless $game_map.map_pass?(left_x, down_y)
      end
    else          # Y方向の判定
      if @vy > 0
        unless $game_map.map_pass?(left_x, down_y) and
               $game_map.map_pass?(right_x, down_y)
          @real_y = (down_y <<  - 225
          return false
        end
        if $game_map.map_pass_through?(left_x, down_y) or
           $game_map.map_pass_through?(right_x, down_y) and not @ladder
          @real_y = (down_y <<  - 225
          return false
        end
      else
        unless $game_map.map_pass?(left_x, up_y) and
               $game_map.map_pass?(right_x, up_y)
          @real_y = up_y + 1 << 8
          return false
        end
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 通行可能判定
  #     mode : 0でx方向、1でy方向
  #--------------------------------------------------------------------------
  def passable?(mode = 0)
    unless @through or debug_through?      # すり抜け ON?
           return false if collide_with_characters?(mode)  
    end
    return false unless map_passable?(mode)         # マップが通行不能?
    return true                                     # 通行可
  end
  #--------------------------------------------------------------------------
  # ● 接触判定
  #     real_x : X 座標
  #     real_y : Y 座標
  #--------------------------------------------------------------------------
  def hit_pos?(real_x, real_y)
    return (@real_x + 32 < real_x + 224 and real_x + 32 < @real_x + 224 and
            @real_y < real_y + (@lift ? 232 : 224) and real_y < @real_y + 224)
  end
  #--------------------------------------------------------------------------
  # ● キャラクター衝突判定
  #     x : X 座標
  #     y : Y 座標
  #    プレイヤーと乗り物を含め、通常キャラの衝突を検出する。
  #--------------------------------------------------------------------------
  def collide_with_characters?(mode)
    for event in $game_map.events.values          # 全イベントを検索
      next if event.through                       # すり抜け OFF?
      next if event.id == self.id                 # 自分自身を無視
      if hit_pos?(event.real_x, event.real_y)
        if @lift    # リフト属性がある場合
          if mode == 0
                    collide_with_characters?(mode)
            event.real_x += @vx
            event.real_x -= @vx if event.collide_with_characters?(mode)
          else
            event.real_y += @vy
            event.real_y -= @vy if event.collide_with_characters?(mode)
          end
        else
          @real_y = event.real_y + (@vy > 0 ? -225 : 224) if mode == 1
          @touch_flag = event.id
          return true
        end
    end
          end
                   if @priority_type == 1                 # 自分が通常キャラ
      unless self.is_a?(Game_Player)
        if hit_pos?($game_player.real_x, $game_player.real_y) # プレイヤーと接触
          if @lift    # リフト属性がある場合
            if mode == 0
              $game_player.real_x += @vx
              if $game_player.collide_with_characters?(mode)
                $game_player.real_x -= @vx
              else
                $game_player.update_scroll($game_player.real_x - @vx, $game_player.real_y)
              end
            else
              $game_player.real_y += @vy
              if $game_player.collide_with_characters?(mode)
                $game_player.real_y -= @vy
              else
                $game_player.update_scroll($game_player.real_x, $game_player.real_y - @vy)
              end
            end
          else
            @real_y = $game_player.real_y + (@vy > 0 ? -225 : 224) if mode == 1
            @touch_flag = 0
            return true
          end
        end
      end
    end
      return false
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    if dash?
      @move_count = 1
      @dash_timer -= 1
    end
    update_x
    update_y
    if moving?    # 移動中
      @move_count -= 1
      if @walk_anime
        @anime_count += 1.5
      elsif @step_anime
        @anime_count += 1
      end
    else          # 停止中
      if @step_anime
        @anime_count += 1
      elsif @pattern != @original_pattern
        @anime_count += 1.5
      end
      @stop_count += 1 unless @locked
    end
    if @wait_count > 0          # ウェイト中
      @wait_count -= 1
    elsif @move_route_forcing   # 移動ルート強制中
      move_type_custom
    elsif not @locked           # ロック中以外
      update_self_movement
    end
    update_animation
  end
  #--------------------------------------------------------------------------
  # ● x座標の更新
  #--------------------------------------------------------------------------
  def update_x
    unless @jump_flag or moving?
      @vx = 0
      return
    end
    last_x = @real_x
    @real_x += @vx
    @x = @real_x >> 8
    @touch_flag = -1
    unless passable?(0)
      @real_x = last_x
      @x = @real_x >> 8
      @vx = 0
      check_event_trigger_touch()   # 接触起動判定
    end
  end
  #--------------------------------------------------------------------------
  # ● y座標の更新
  #--------------------------------------------------------------------------
  def update_y
    if  @gravity > 0
      @vy = [@vy + @gravity, 64].min
    elsif !moving?
      @vy = 0
      return
    end
    @real_y += @vy
    @y = @real_y >> 8
    @touch_flag = -1
    unless passable?(1)
      @y = @real_y >> 8
      if @vy > 0
        if @vy > 20
          $game_temp.anime_heap.push([@real_x + 128, @real_y + 256, ACT::ANIME_GROUND])
        end
        @jump_flag = false
        get_off if @ladder
      end
      @vy = 0
      check_event_trigger_touch()   # 接触起動判定
    end
  end
  #--------------------------------------------------------------------------
  # ● プレイヤーの方を向く
  #--------------------------------------------------------------------------
  def turn_toward_player
    @real_x < $game_player.real_x ? turn_right : turn_left
  end
  #--------------------------------------------------------------------------
  # ● ランダムに移動
  #--------------------------------------------------------------------------
  def move_random
    case rand(@gravity == 0 ? 4 : 2)
    when 0;  move_left(false)
    when 1;  move_right(false)
    when 2;  move_up(false)
    when 3;  move_down(false)
    end
  end
  #--------------------------------------------------------------------------
  # ● プレイヤーに近づく
  #--------------------------------------------------------------------------
  def move_toward_player
    distance_x_from_player > 0 ? move_left : move_right
  end
  #--------------------------------------------------------------------------
  # ● プレイヤーから遠ざかる
  #--------------------------------------------------------------------------
  def move_away_from_player
    distance_x_from_player > 0 ? move_right : move_left
  end
  #--------------------------------------------------------------------------
  # ● ジャンプ
  #--------------------------------------------------------------------------
  def jump(vy = -80, vx = 0)
    return if @jump_flag
    $game_temp.anime_heap.push([@real_x + 128, @real_y + 256, ACT::ANIME_JUMP])
    @vy = vy
    @jump_flag = true
    @stop_count = 0
  end
  #--------------------------------------------------------------------------
  # ● 接触イベントの起動判定
  #--------------------------------------------------------------------------
  def check_event_trigger_touch()
  end
  #--------------------------------------------------------------------------
  # ○ nウェイショット
  #--------------------------------------------------------------------------
  def nway_shot(n, space, angle, speed, aim, timer, gravity, name,
                skill_id, throw = false)
    return unless @update_flag    # 画面外なら発射しない
    x = @real_x + 128
    y = @real_y + 128
    d = angle
    d += $game_player.get_angle(x, y) if aim
   d = d - ( space * ( n - 1 ) / 2 )
    for i in 0...n
      $game_map.add_bullet(x, y, (Math.cos(d) * speed).to_i,
        (Math.sin(d) * speed).to_i, timer, gravity, name, battler,
        skill_id, d, throw)
      d += space
    end
  end
  #--------------------------------------------------------------------------
  # ○ 全方位ショット
  #--------------------------------------------------------------------------
  def nall_shot(n, angle, speed, aim, timer, gravity, name,
                skill_id, throw = false)
    return unless @update_flag    # 画面外なら発射しない
    x = @real_x + 128
    y = @real_y + 128
    a = angle
    a += $game_player.get_angle(x, y) if aim
    d = Math::PI * 2 / n
    for i in 0...n
      $game_map.add_bullet(x, y, (Math.cos(a) * speed).to_i,
        (Math.sin(a) * speed).to_i, timer, gravity, name, battler,
        skill_id, a, throw)
      a += d
    end
  end
end

Je voudrais tout simplement que la commande de base du logiciel soit réintégrée, j'ai réussi à faire quelques modifs, mais après ce sont les conditions "même niveau et au-dessus" qui ne fonctionnent pas correctement. ><
Je remercie par avance les personnes qui sauront régler ce problème. Smile


Dernière édition par Garruk le Lun 19 Nov 2018 - 17:50, édité 1 fois
avatar
Zouzaka
Membre

Nombre de messages : 302
Age : 20
Distinction : aucune
Date d'inscription : 25/12/2011

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Mar 16 Oct 2018 - 22:19
Pourrais tu expliquer avec un exemple, car j'arrive pas a comprendre ce que tu souhaite faire :/
avatar
Garruk
Membre

Nombre de messages : 986
Age : 34
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Mer 17 Oct 2018 - 0:22
Hey Zouzaka ça fait un bail, je savais pas que tu makais toujours. Smile



En gros, le script modifie la fonction d'affichage des événements, ce qui fait que la commande "en-dessous" fait apparaître les évents aux même niveaux que le héros.
La troisième image c'est ce que j'essaie de corriger, pour que les événements apparaissent en-dessous quand j'utilise cette fonction (comme le fait normalement le logiciel).
La commande "Traverse tout" ne donne rien, car elle casse les collisions, j'ai tenté des modifications sur ce script, mais je n'arrive pas à obtenir des résultats concluants, les événements apparaissent bien en-dessous mais plus aucune collision n'est possible ou alors tous les événements et peu importe la priorité d'affichage passent en dessous du héros.
Si tu veux plus de détails ou d'informations, n'hésites pas à me le signaler. Wink
avatar
johnseed
Membre

Nombre de messages : 71
Age : 35
Distinction : aucune
Date d'inscription : 03/03/2013
http://seedsoft.moe/

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Mer 17 Oct 2018 - 9:00
Tu veut faire un system a la super mario?
Je pense que le soucis du en dessou du hero est si tu superpose les couche.
Essaye de faire un event transparent au dessu de ton monstre que tu ne peut pas traverser . Qui suis ton monstre

avatar
Zouzaka
Membre

Nombre de messages : 302
Age : 20
Distinction : aucune
Date d'inscription : 25/12/2011

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Mer 17 Oct 2018 - 19:20
Je crois comprendre, tu cherche un truc de collision comme le fait Game Maker ou Game Factory, je prend ton script je bidouille un peu, et je te rend ma réponse demain, a moins que quelqu'un me devance ^^
avatar
Garruk
Membre

Nombre de messages : 986
Age : 34
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Mer 17 Oct 2018 - 20:31
johnseed > Pas du tout, le problème vient du script qui modifie la fonction, sans modification du script c,'est impossible de le faire autrement. :/

Zouzaka > Comme le fait normalement Rpg maker même ^^, le héros doit passer à travers un événement quand la priorité d'affichage est censé être en dessous, avec se script peu importe comment tu règles ton événement il apparaît toujours au même niveau, je veux simplement que les événements soit traversables quand la priorité est réglé sur "en-dessous du héros".
Merci de m'aider. Smile
avatar
Zouzaka
Membre

Nombre de messages : 302
Age : 20
Distinction : aucune
Date d'inscription : 25/12/2011

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Ven 19 Oct 2018 - 17:57
Le script modifie la méthode de base "map_passable?", je crois que c'est ce morceau qui gère ça
Code:
 #--------------------------------------------------------------------------
  # ● マップ通行可能判定
  #     mode : 0でx方向、1でy方向
  #--------------------------------------------------------------------------
  def map_passable?(mode)
    left_x  = @real_x + 32  >> 8  # 4 <<3
    right_x = @real_x + 224 >> 8  # 28 << 3
    up_y    = @real_y + 16  >> 8  # 2 << 3
    down_y  = @real_y + 224 >> 8  # 28 << 3
    if mode == 0  # X方向の判定
      if @vx > 0
        return false unless $game_map.map_pass?(right_x, up_y)
        return false unless $game_map.map_pass?(right_x, down_y)
      else
        return false unless $game_map.map_pass?(left_x, up_y)
        return false unless $game_map.map_pass?(left_x, down_y)
      end
    else          # Y方向の判定
      if @vy > 0
        unless $game_map.map_pass?(left_x, down_y) and
               $game_map.map_pass?(right_x, down_y)
          @real_y = (down_y <<  - 225
          return false
        end
        if $game_map.map_pass_through?(left_x, down_y) or
           $game_map.map_pass_through?(right_x, down_y) and not @ladder
          @real_y = (down_y <<  - 225
          return false
        end
      else
        unless $game_map.map_pass?(left_x, up_y) and
               $game_map.map_pass?(right_x, up_y)
          @real_y = up_y + 1 << 8
          return false
        end
      end
    end
    return true
  end

du coup j'aurais besoin du reste du script, ou du moins les parties en relation avec "$game_map.map_pass?"
avatar
Garruk
Membre

Nombre de messages : 986
Age : 34
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Sam 20 Oct 2018 - 16:53
Je te compile une démo, je te l'envois par MP quand c'est prêt. Wink

Edit: Envoyé.
avatar
Zouzaka
Membre

Nombre de messages : 302
Age : 20
Distinction : aucune
Date d'inscription : 25/12/2011

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Mer 24 Oct 2018 - 19:57
alors voila normalement tu ajoute ca, et le problème de collision devrais etre reglé :
Code:
class Game_Character
  def collide_with_characters?(mode)
    for event in $game_map.events.values          # 全イベントを検索
      next if event.through                      # すり抜け OFF?
      next if event.id == self.id                # 自分自身を無視
      if hit_pos?(event.real_x, event.real_y)
        if @lift    # リフト属性がある場合
          if mode == 0
                    collide_with_characters?(mode)
            event.real_x += @vx
            event.real_x -= @vx if event.collide_with_characters?(mode)
          else
            event.real_y += @vy
            event.real_y -= @vy if event.collide_with_characters?(mode)
          end
        else
          if event.priority_type == 1
            @real_y = event.real_y + (@vy > 0 ? -225 : 224) if mode == 1
            return true
          end
          @touch_flag = event.id
        end
      end
    end
    if @priority_type == 1                # 自分が通常キャラ
      unless self.is_a?(Game_Player)
        if hit_pos?($game_player.real_x, $game_player.real_y) # プレイヤーと接触
          if @lift    # リフト属性がある場合
            if mode == 0
              $game_player.real_x += @vx
              if $game_player.collide_with_characters?(mode)
                $game_player.real_x -= @vx
              else
                $game_player.update_scroll($game_player.real_x - @vx, $game_player.real_y)
              end
            else
              $game_player.real_y += @vy
              if $game_player.collide_with_characters?(mode)
                $game_player.real_y -= @vy
              else
                $game_player.update_scroll($game_player.real_x, $game_player.real_y - @vy)
              end
            end
          else
            @real_y = $game_player.real_y + (@vy > 0 ? -225 : 224) if mode == 1
            @touch_flag = 0
            return true
          end
        end
      end
    end
      return false
  end
end

le petit probleme qui reste est que: imaginons que tu veille afficher un message au contact de l'event, le message s'affichera infiniment en boucle tant que le héro restera superposé avec l'event
si tu veut que je m'y colle pour essaier de trouver une solution, fait signe ^^
avatar
Garruk
Membre

Nombre de messages : 986
Age : 34
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Jeu 25 Oct 2018 - 9:53
T'embête pas pour ça, j'utiliserais un interrupteur + nouvelle page au pire. :p

Edit j'ai un petit soucis, tous mes events au contacts ne marchent plus x), j'ai voulu testé le premier niveau, il fonctionnait nickel jusqu'à ce que j'arrive sur cet évent:
Spoiler:


J'ai également voulu changé l’évent de mes pièces pour que ça soit moins gourmand et ça ne marche pas non plus. ^^
J'ai mis le code à la suite de celui que j'avais posté plus haut, puis j'ai testé en le mettant tout à la fin, même effet, tu as une solution, c'est normal ou ?
avatar
Zouzaka
Membre

Nombre de messages : 302
Age : 20
Distinction : aucune
Date d'inscription : 25/12/2011

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Jeu 25 Oct 2018 - 14:25
Bizarre, et sans le morceau de script que je t'est donnée, ca fonctionne normal ?
étant donnée que je n'est fait qu'ajouter une condition qui vérifie la priorité d'affichage sans toucher au déclenchement :/
avatar
Garruk
Membre

Nombre de messages : 986
Age : 34
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Jeu 25 Oct 2018 - 15:24
Sans oui ça fonctionne normalement, je pense qu’il doit avoir un code qui modifie la collision suivant l’affichage dans l’autre série scripts.
avatar
Garruk
Membre

Nombre de messages : 986
Age : 34
Localisation : Evreux 27
Distinction : The Master Show de 2011
Date d'inscription : 13/09/2009

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

le Lun 19 Nov 2018 - 17:51
J'ai finalement réussi à résoudre ce problème moi-même, un grand merci a Zoukaka pour avoir essayé de m'aider.
Contenu sponsorisé

RPG Maker VX Re: [Résolu] Collision avec la commande "au-dessous du héros"

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum