Pokémon Script Project Forum Index

Manuel | Search
 Information des admins 
Si vous désirez parler de PSP ou obtenir du soutient là dessus, merci d'aller faire un tour sur https://pokemonworkshop.com/forum/index.php Imbécile heureux

Couper l'herbe sous le pied du joueur (version 3)
Goto page: 1, 2  >
 
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Scripts
Previous topic :: Next topic   
Author Message
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Wed 14 Oct - 08:00 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

Un matin je me suis levé (ou plutôt un soir j'ai tardé à aller me coucher) et je me suis dit "Mais comment les maps peuvent elles bien être gérées ? Il faut forcément que chaque carreau soit identifié d'une facon ou d'une autre !"... Et là je me suis rappelé de quelques expériences lointaines, sur la facon dont était constituée la map. Lorsque soudain... :idea: Tout était devenu limpide pour moi =)

Et c'est pourquoi, après quelques petites heures de dur labeur, de calculs intensifs (ma calculatrice se remet encore assez mal du 5+3 que je lui ai demandé !), et de scripting tout aussi frénétique, mon attaque a énormément augmenté ! je suis en mesure de vous expliquer comment ca marche (préparez l'aspirine !) mais aussi comment intervenir là dessus !

Voici donc venu le temps des cathédraaaaaaaaaaaleuh ! :

COMMENT CHANGER UN CARREAU QUELCONQUE D'UNE MAP !


    I) Introduction

Avant toute chose, sachez que pour pouvoir profiter pleinement de cette fonction, il va vous falloir comprendre pas mal de trucs... Eh bien, commençons !


Voici le schéma d'un carreau d'une map. En bleu, vous distinguez la couche la plus haute (accessible par F7). En vert, vous distinguez la couche du milieu (accessible par F6). Et enfin, en rouge, vous distinguez la couche la plus basse (accessible par F5) de votre map.
Ca peut paraitre idiot de le rappeler, mais croyez moi, ca sera indispensable pour la suite. D'ailleurs, non seulement pour me faciliter la vie, mais aussi parce que c'est ainsi que sont désignées les couches dans le système, j'appellerai couche 0 la couche basse, couche 1 la couche médiane, et couche 2 la couche haute.

Passons ensuite aux généralités concernant les maps :
Les coordonnées X et Y d'un carreau d'une map (l'emplacement d'un carreau sur la map) sont calculées à partir de 0. Le carreau 0, 0 représente le carreau le plus en haut à gauche de votre map. Il n'est pas en dehors. Là encore, il va falloir y faire gaffe pour la suite.

Et terminons par le plus terrible, les tilesets. Souvenez vous de ce que je vous ai dit : chaque carreau est représenté par une coordonnée X, Y, Z (les coordonnées X & Y du carreau, ainsi que sa couche) mais il fait aussi référence à un nombre barbare qui correspond à un carreau du tileset (autotiles compris) ! C'est comme ca que le système sait que tel ou tel carreau est à afficher à tel ou tel endroit. Et c'est aussi pour ca que lorsque vous changez le tileset d'une map déjà existante, il a tendance à tout remplacer par n'importe quoi =)
Le plus drôle, c'est qu'entre les autotiles et le tileset à proprement parler, il y a une "légère" différence... Bref, à vos calculatrices, les amis !


Vous reconnaitrez ici une maquette de tileset. A ceci près qu'en rouge, vous avez les emplacements des autotiles, et en bleu, les emplacements du tileset normal. Et c'est maintenant que nous allons commencer à compter.
L'ID d'un carreau de ce tileset dépend de sa position dans le tileset. Wouah, original n'est ce pas ? Eh bien si, c'est vrai... Mais n'espérez pas faire comme pour les carreaux de votre map, une coordonnée X / Y pour désigner la ligne & la colonne de votre carreau sur le tileset ! Non ! En fait ca part (une fois encore) de 0, et ca se compte en ligne. Chaque carreau du tileset valant 1.
"Donc en gros, pour avoir le carreau placé sur la 4° ligne, 2° colonne du tileset, j'ai juste à faire 8 (emplacements des autotiles) + (3 * 8) (les 3 lignes au dessus du carreau qui m'intéresse) + 2 (la colonne du carreau qui m'intéresse) ?"
Oui mais... non... J'ai bien dit que les éléments du tileset valaient 1. Les autotiles sont très différents ! (sinon, pourquoi je me serais embêté à les colorier autrement ?) Chaque emplacement pour autotile vaut 48 et non 1 ! Faites vos comptes, et vous arriverez à la même conclusion que moi : le 1° élément de votre tileset ne vaut pas 8 mais 384 ! (rappel : tout part de 0, donc les autotiles occupent les emplacements 0 à 383 inclus)
Aussi, le carreau placé sur la ligne 3 (c'est bien la 4° ligne, mais on compte à partir de la ligne 0) colonne 1 (idem, on compte à partir de 0 !) sera à la position :
384 (les autotiles) + 3 * 8 (ligne n°3) + 1 (colonne n°1) = 409
Le carreau placé l3/c1 (ligne n°3 / colonne n°1) aura comme ID carreau le nombre 409.


On y arrive ! Si vous avez compris ce principe de calcul (qui, je vous l'accorde, est on ne peut plus tordu !) alors vous êtes les rois du pétrole ou au moins du changement de carreaux sur une map ! Sinon, relisez tranquillement, n'hésitez pas à utiliser des exemples divers, ni à poser des questions, je le redis ce n'est pas simple.

Les plus observateurs auront cependant remarqué ces 3 magnifiques croix (une verte, une violette et une bleu claire) qui trônent au milieu de ma maquette de tileset. Ce sont trois petits exercices que je vous propose, afin de vous assurer que vous avez bien compris la méthode de calcul (vous n'êtes pas obligés de les faire non plus, je les mets à disposition pour vous)
Ci dessous, la solution, mais je vous conseille de la regarder que pour vérifier votre résultat (sinon ca n'a plus beaucoup d'intérêts)

La croix verte se trouve en l1/c2 (ligne 1 & colonne 2 du tileset, on commence à la ligne 0 & à la colonne 0, n'oubliez pas !).

384 (les autotiles) + 0 * 8 (ligne 0) + 2 (colonne 2) = 386

La croix violette se trouve en l2/c3 (ligne 2 / colonne 3)

384 + 2 * 8 + 3 = 403

La croix bleue se trouve en l4/c6

384 + 4 * 8 + 6 = 422


    II) Le script

Les explications générales, c'est bien beau, mais si vous vous tapez mon pavé, c'est avant tout pour avoir ce script, non ? Alors le voici :
Code:
#=============================================================
# Transformation du sol de la map courante
#   - sert à modifier un ou plusieurs carreaux de la map de facon plus ou moins
#     temporaire (les transformations disparaissent à la sortie de la map ou du jeu)
#   by Sphinx 13/10/09
#=============================================================
# UPD_TERRAINS :
#   -> sert au remplacement de certains carreaux par d'autres, lorsque le joueur passe dessus.
#   -> peut servir au mouvement de l'herbe
#   
#   ID du tileset : n° du tileset paramétré dans la BDD
#   id n carreau 1 : n° du n°ième carreau à remplacer lorsque le joueur est dessus
#             => id n carreau 1 = 383 + (n° de la ligne où se trouve le carreau dans le tileset * 8)
#                                           + (n° de la colonne où se trouve le carreau dans le tileset)
#   id n carreau 2 : n° du n°ième carreau qui va remplacer le carreau 'id carreau 1'
#             => id n carreau 2 = 383 + (n° de la ligne où se trouve le carreau dans le tileset * 8)
#                                           + (n° de la colonne où se trouve le carreau dans le tileset)
#   la liste des carreaux à remplacer doit être mise entre crochets, et chaque paire
#       ([carreau à remplacer, carreau remplacant]) doit être séparée d'une virgule
#   persistance : false - le carreau redevient normal (comme avant) lorsque le joueur quitte
#                                      la case
#                            true - le carreau reste transformé y compris après que le joueur ait quitté
#                                      la case
#=============================================================
UPD_TERRAINS = {
#                                  Format à respecter :
#                                  ID du tileset => {"upd" => [[id 1 carreau 1, id 1 carreau 2], ...,
#                                  [id n carreau 1, id n carreau 2]], "persistance" => persistance},
                                   }

class Game_Player < Game_Character
 
  alias_method :alias_by_sphinx_move_up, :move_up unless method_defined?(:alias_by_sphinx_move_up)
  alias_method :alias_by_sphinx_move_left, :move_left unless method_defined?(:alias_by_sphinx_move_left)
  alias_method :alias_by_sphinx_move_right, :move_right unless method_defined?(:alias_by_sphinx_move_right)
  alias_method :alias_by_sphinx_move_down, :move_down unless method_defined?(:alias_by_sphinx_move_down)

# Dans tous les cas, la modification d'un carreau ne persiste pas après que le joueur ait quitté
#   la carte, ou alors qu'il ait quitté sa partie (même si sauvegarde il y a).

# Je ne vais détailler que les deux nouvelles fonctions de morphing du terrain, ainsi que
#   move_up. move_left, move_right et move_down fonctionnent sur le même principe que
#   move_up
 
  def morphing_p1(direction)
    # Ici j'enregistre les nouvelles ainsi que les anciennes coordonnées du joueur
    case direction
    when 2
      new_x = @x
      new_y = @y - 1
    when 4
      new_x = @x - 1
      new_y = @y
    when 6
      new_x = @x + 1
      new_y = @y
    when 8
      new_x = @x
      new_y = @y + 1
    end
    # et j'initialise un tableau qui contiendra par la suite les id des carreaux de la map si besoin
    #   est, ainsi qu'un tableau de vrai / faux qui va me servir pour éviter qu'une modification soit
    #   annulée par la suivante
    temp = [nil, nil, nil]
    bool = [false, false, false]
   
    # Tout d'abord je vérifie si le tileset est défini dans UPD_TERRAINS (qui recense les
    #   tilesets concernés par au moins un remplacement) et si la liste des remplacements
    #   existe (qu'elle soit vide ou non)
    if UPD_TERRAINS[$game_map.map.tileset_id] != nil and
        UPD_TERRAINS[$game_map.map.tileset_id]["upd"].is_a?(Array)
      # je fait donc le tour de la liste des remplacements à faire pour vérifier si le carreau
      #   sur lequel est le joueur doit être modifié ou non
      for j in UPD_TERRAINS[$game_map.map.tileset_id]["upd"]
        for k in 0..2
          # j'inscrit dans temp l'id du carreau d'origine (si temp[k] vaut nil, c'est que rien n'y
          #   a été inscrit, sinon il ne vaudra plus nil, et donc il ne faudra pas retoucher à sa valeur)
          temp[k] = $game_map.data[new_x, new_y, k] if temp[k].nil?
          # puis je procède au remplacement si besoin est, c'est à dire si l'id du carreau sur
          #   lequel est le joueur correspond à l'id à remplacer, par l'id du carreau de
          #   remplacement paramétré, en vérifiant toutefois
          if $game_map.data[new_x, new_y, k] == j[0]
            $game_map.data[new_x, new_y, k] = j[1] unless bool[k]
            bool[k] = true
          end
        end
        # Si la persistance est définie sur true (vrai)
        if UPD_TERRAINS[$game_map.map.tileset_id]["persistance"]
          # alors je ne garde aucune trace des valeurs précédentes (enregistrée dans temp)
          #   et je donne la valeur true à $game_variables[5000]["upd_terr"]
          $game_variables[5000]["upd_terr"] = true
        else
          # sinon $game_variables[5000]["upd_terr"] enregistre l'id d'origine du carreau sur
          #   lequel est le joueur, pour pouvoir le remettre en l'état après que le joueur ait quitté
          #   cette case
          $game_variables[5000]["upd_terr"][1] = (temp + [new_x, new_y])
        end
        # Si les trois valeurs (bool[0], bool[1] et bool[2]) sont vraies, alors ce n'est plus la peine
        #   que je parcourre le tableau UPD_TERRAINS[Map_ID]["upd_terr"], je quitte donc
        #   cette boucle
        break if bool[0] and bool[1] and bool[2]
      end
    end
  end
 
  def morphing_p2
    # Je remets en l'état le carreau sur lequel était le joueur, à moins que
    #   $game_variables[5000]["upd_terr"][0] ne représente pas des traces
    #   (ce tableau à 5 valeurs qui contient les informations d'origine du
    #   carreau quitté)
    if $game_variables[5000]["upd_terr"].is_a?(Array) and
          $game_variables[5000]["upd_terr"][0].is_a?(Array) and
          $game_variables[5000]["upd_terr"][0].size == 5
      # Je récupère les anciennes coordonnées du joueur
      old_x = $game_variables[5000]["upd_terr"][0][3]
      old_y = $game_variables[5000]["upd_terr"][0][4]
      for i in 0..2
        $game_map.data[old_x, old_y, i]  = $game_variables[5000]["upd_terr"][0][i]
      end
      $game_variables[5000]["upd_terr"].shift
    elsif $game_variables[5000]["upd_terr"].is_a?(Array)
      # Si $game_variables[5000]["upd_terr"] est bien un tableau, mais si le 1° élément du
      #   tableau n'est pas une trace, alors je l'élimine
      $game_variables[5000]["upd_terr"].shift
    end
  end
 
  def move_up(turn_enabled = true)
    # J'appelle la première partie de la transformation du terrain
    morphing_p1(2)
    # puis j'opère au déplacement du joueur vers le haut
    alias_by_sphinx_move_up(turn_enabled)
    # et enfin, j'appelle la seconde partie de la transformation du terrain
    morphing_p2
  end
 
  def move_left(turn_enabled = true)
    morphing_p1(4)
    alias_by_sphinx_move_left(turn_enabled)
    morphing_p2
  end
 
  def move_right(turn_enabled = true)
    morphing_p1(6)
    alias_by_sphinx_move_right(turn_enabled)
    morphing_p2
  end
 
  def move_down(turn_enabled = true)
    morphing_p1(8)
    alias_by_sphinx_move_down(turn_enabled)
    morphing_p2
  end
end

# Dans cette partie, je ne fais que recharger la map même si le fichier MapXXX.rxdata
# n'a pas changé. La condition est là pour ne pas lui faire recharger la map inutilement
# (par défaut elle est rechargée dès lors que le jeu a été sauvegardé entre temps)
class Scene_Title
  alias_method :re_read_save_data, :read_save_data unless method_defined?(:re_read_save_data)
  def read_save_data(file)
    re_read_save_data(file)
    if $game_system.magic_number == $data_system.magic_number
      $game_map.setup($game_map.map_id)
      $game_player.center($game_player.x, $game_player.y)
    end
  end
end

class Game_Map
  attr_accessor :map
 
  def modifier_carreau(x, y, z, id_new_carreau)
    # Ici j'inclue une commande pour pouvoir changer manuellement un carreau donné
    #   sachant qu'elle ne doit s'exécuter que si le carreau x, y, z appartient à la carte
    #   donc si x, y ne désigne pas une position en dehors de la carte, et si z ne désigne
    #   pas une couche non définie (inférieure à 0 ou supérieure à 2)
    #   et bien sur, si le carreau de remplacement existe dans le tileset.
    return unless x.between(0, width - 1)
    return unless y.between(0, height - 1)
    return unless z.between(0, 2)
    return unless id_new_carreau.between(0, @terrain_tags.xsize - 1)
    # Une fois ces quelques conditions remplies, le changement peut se faire.
    self.data[x, y, z] = id_new_carreau
  end
 
  def obtenir_carreau(x, y, z)
    # Et là c'est une commande pour pouvoir obtenir
    # le n° du carreau en position X, Y, Z sur la map
    # courante.
    return unless x.between(0, width - 1)
    return unless y.between(0, height - 1)
    return unless z.between(0, 2)
    return self.data[x, y, z]
  end
 
end

module RPG
  class Tileset
    # width : définie surtout en tant que contrepartie à height, elle retourne le nombre de cases
    #   du tileset, en largeur
    def width
      return 8
    end
   
    # height : elle retourne le nombre de cases du tileset, en hauteur
    def height
      return (@terrain_tags.xsize - 384) / 8
    end
  end
end


Ce script a deux modes de fonctionnement : il peut être utilisé soit via une commande d'évent pour modifier n'importe quel carreau de la map, soit de facon automatisée pour modifier le carreau qui se trouve sous les pieds du joueur. Mais je vais détailler tout cela au paragraphe suivant.

    III) Utilisation(s ?)

Comme dit juste au dessus, ce script est adapté à deux usages. Il peut être utilisé dans un évent pour modifier un carreau d'une map, mais il peut aussi être réglé pour remplacer automatiquement, dans certains cas, le carreau situé sous le joueur.

Voyons le plus simple, la commande d'évent :
Code:
$game_map.modifier_carreau(x, y, z, new_tile_id)

J'espère que vous n'avez pas oublié ce que vous avez lu au paragraphe I), car ca va grandement vous servir ici !
x, y : coordonnées X & Y du carreau à modifier
z : couche du carreau à modifier
new_tile_id : ID (dans le tileset) du nouveau carreau à mettre à la place du carreau X, Y, Z

exemple :
Code:
$game_map.modifier_carreau(2, 2, 0, 413)

Là je modifie la couche basse du carreau 2, 2, pour la remplacer par le carreau d'id tile 413 (ce qui correspond à la pokéball, dans le tileset basic de PSP0.7 & 4G+)

Si vous avez bien compris le 1° paragraphe, vous ne devriez pas avoir de problèmes à comprendre ce paragraphe jusque là. Maintenant ca va se compliquer encore un peu, je vais vous expliquer comment régler l'automatisation d'un remplacement pour un ou plusieurs tilesets.
Tout d'abord, ca se passe au début du script (à partir de la ligne 25) :
Code:
UPD_TERRAINS = {
#                                  Format à respecter :
#                                  ID du tileset => {"upd" => [[id 1 carreau 1, id 1 carreau 2], ...,
#                                  [id n carreau 1, id n carreau 2]], "persistance" => persistance},
                                   }

ID du tileset : c'est l'id du tileset concerné, tel qu'il est dans votre base de données. Attention, vous ne pouvez définir qu'une seule règle de remplacement pour chaque tileset
[[id 1 carreau 1, id 1 carreau 2], ..., [id n carreau 1, id n carreau 2]] : les différents remplacements à faire, mais je vais y revenir juste en dessous
persistance : true si la transformation doit durer jusqu'à ce que vous quittiez la map ou le jeu, false si elle doit disparaitre dès que vous changez de case.

Revenons au réglage des différents remplacements :
Code:
[[id 1 carreau 1, id 1 carreau 2], ..., [id n carreau 1, id n carreau 2]]

cette forme indique que vous pouvez paramétrer de 0 ([] mettez des vides) à n remplacements automatiques. Mais à mon avis, vous ne devriez pas en avoir besoin de plus d'un ou deux.
NB : bien sur, plus vous ajouterez de remplacements automatiques, plus ca risque de lagger.
Voyons plus en détail comment paramétrer un remplacement automatique :
Code:
[id carreau 1, id carreau 2]

id carreau 1 : id du carreau à remplacer lorsque le joueur marche dessus
id carreau 2 : id du carreau qui viendra remplacer celui sur lequel le joueur marche

Exemple pour le tileset basic, pour transformer l'herbe en pokéball au passage du joueur, puis pour la retransformer en herbe ensuite :
Code:
1 => {"upd" => [[392, 409], [409, 392]], "persistance" => true}

1 (le tileset basic est le 1° de la BDD)
[[392, 409], [409, 392]] (deux règles : remplacer le carreau 392 (herbe) par le carreau 409 (sable) lorsque le joueur marche dessus, et remplacer le carreau 409 (sable) par le carreau 392 (herbe) quand le joueur remarche dessus)
true (la transformation ne doit pas disparaitre lorsque le joueur quitte la case)
Ici, mes deux règles sont contradictoires, mais ce n'est pas un problème. En effet, une couche d'un carreau ne peut pas être modifiée plusieurs fois à chaque pas. Le seul soucis, c'est que la persistance des traces, couplé à des règles contradictoires, va donner de drôles de résultats lorsque le joueur va vouloir faire demi-tour. Il est donc conseillé d'éviter d'utiliser mon exemple Clin d'œil foireux Des règles contradictoires ne sont pas un soucis, tant que la persistance n'est pas active, puisque la transformation ne durera de toute facon, qu'un seul pas.

    IV) Pas de coins des scripteurs aujourd'hui ?

Eh bien non, amis scripteurs, pas de coins ofe ze scripteurs aujourd'hui. Mais ne soyez pas tristes, j'ai commenté l'intégralité du code, pour ceux qui auraient envie de le décortiquer de A à Z ^o^

    V) Un mot de la fin, tout de même !

Une fois de plus, un petit codage qui m'a beaucoup intéressé =) J'espère qu'il en sera de même pour vous =)
(ps : ne m'oubliez pas si jamais vous utilisez ce script ^o^)

    VI) Intégrer ce système à PSP0.7

Comme beaucoup d'autres des systèmes développés sous 4G+, celui ci fait appel à la très célèbre variable 5000, et plus précisément à une nouvelle information que je crée :
Code:
$game_variables[5000]["upd_terr"]

>> En remplacant toutes les occurrences de cette variable par :
Code:
$upd_terr

les utilisateurs de 0.7 pourront utiliser sans aucun soucis ce système ! Clin d'œil foireux


Last edited by Sphinx on Fri 16 Oct - 05:56 (2009); edited 1 time in total
Back to top
Publicité






PostPosted: Wed 14 Oct - 08:00 (2009)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
Newtiteuf
Membre


Joined: 22 May 2008
Posts: 5,090
Localisation: Sur PC (enfin devant ...)

PostPosted: Wed 14 Oct - 10:58 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

Je vais essayé de relire et de comprendre !
Back to top
Visit poster’s website
Suicune31
Membre


Joined: 08 Aug 2008
Posts: 1,161
Localisation: Haute-garonne (31)
Masculin

PostPosted: Wed 14 Oct - 11:10 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

J'ai un bug au moment ou je fait un pas =/

 
Code:


 ---------- Erreur de script :  ----------
 ----- Type
 NoMethodError
   
 ----- Message
 - ARGS - []
 undefined method `map' for #<Game_Map:0x9176c10>
   
 ----- Position dans 
 Ligne 70
   
 ----- Backtrace
 Script :  | Ligne : 70 | Méthode : in `morphing_p1'
 Script :  | Ligne : 150 | Méthode : in `move_down'
 Script : Game_Player | Ligne : 20 | Méthode : in `dash_update'
 Script : Courir | Ligne : 63 | Méthode : in `update'
 Script : Scene_Map | Ligne : 49 | Méthode : in `alias_update'
 Script : Scene_Map | Ligne : 46 | Méthode : in `loop'
 Script : Scene_Map | Ligne : 63 | Méthode : in `alias_update'
 Script : MAPPANEL | Ligne : 90 | Méthode : in `old_update'
 Script : TempsJourNuit | Ligne : 248 | Méthode : in `update_passminimap'
 Script : Minimap | Ligne : 44 | Méthode : in `update'
 Script : Scene_Map | Ligne : 25 | Méthode : in `old_main'
 Script : Scene_Map | Ligne : 19 | Méthode : in `loop'
 Script : Scene_Map | Ligne : 30 | Méthode : in `old_main'
 Script : TempsJourNuit | Ligne : 237 | Méthode : in `main_passminimap'
 Script : Minimap | Ligne : 31 | Méthode : in `main'
 Script : Main | Ligne : 53
   
 



C'est à cause de la taille du tileset ?

PS : Je n'ai pas chercher à l'utiliser, J'ai juste ajouter le script pour pas avoir à le faire après x) (je sais c'est bête ^^)
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Wed 14 Oct - 12:17 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

:/ Il ne reconnait pas $game_map.map ? Ca c'est pas normal... Tu pourrais m'envoyer une copie du projet sur lequel tu as testé (en non crypté que j'étudie la question) stp ?
Back to top
Suicune31
Membre


Joined: 08 Aug 2008
Posts: 1,161
Localisation: Haute-garonne (31)
Masculin

PostPosted: Thu 15 Oct - 07:37 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

si je créer un projet vierge et que je met tout les script sava ? parce que mon projet prend beaucoup de place j'ai pas encore le haut débit u_u Me faudrait une nuit pour uploader mon projet xD
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Thu 15 Oct - 07:38 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

>> pas de pbs (dès l'instant que le bug se produit aussi sur le projet vierge)

Clin d'œil foireux je veux chercher d'où vient ce bug, donc n'importe quel projet (vierge ou non) fera l'affaire dès lors que ton bug se produit dessus
Back to top
Crystal
Membre


Joined: 05 Jan 2008
Posts: 140

PostPosted: Fri 16 Oct - 00:57 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

C'est normal qu'il y ait une erreur, par défaut @map n'est pas un attribut, ni lisible ni éditable, de la classe Game_Map.
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Fri 16 Oct - 05:58 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

>> arf !

en effet, je viens de comprendre pourquoi chez moi ca marchait : chez moi j'ai aussi un script de clonage d'évents (repris sur rpg-maker.fr si j'ai bonne mémoire) que je voulais tester, et entre autre, il ajoute un attr_accessor :map dans la classe Game_Map... ^o^"

Bon la solution est on ne peut plus simple :

- Remplacer :
Code:
class Game_Map
 
  def modifier_carreau(x, y, z, id_new_carreau)
    # Ici j'inclue une commande pour pouvoir changer manuellement un carreau donné
    #   sachant qu'elle ne doit s'exécuter que si le carreau x, y, z appartient à la carte
    #   donc si x, y ne désigne pas une position en dehors de la carte, et si z ne désigne

- par :
Code:
class Game_Map
  attr_accessor :map
 
  def modifier_carreau(x, y, z, id_new_carreau)
    # Ici j'inclue une commande pour pouvoir changer manuellement un carreau donné
    #   sachant qu'elle ne doit s'exécuter que si le carreau x, y, z appartient à la carte
    #   donc si x, y ne désigne pas une position en dehors de la carte, et si z ne désigne


Clin d'œil foireux je rectifie le script du premier post

edit : premier post rectifié et ajout d'une méthode annexe, obtenir_carreau, qui s'utilise de la facon suivante :
Code:
$game_map.obtenir_carreau(x, y, z)

(où x, y, & z sont les coordonnées du carreau dont vous voulez connaitre le n° de tile)
Back to top
Suicune31
Membre


Joined: 08 Aug 2008
Posts: 1,161
Localisation: Haute-garonne (31)
Masculin

PostPosted: Fri 16 Oct - 08:25 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

Bug en utilisant la commande : Modifier le déplacement du Héros --> Un pas vers le bas si je me souviens bien

 
Code:
 ---------- Erreur de script : Carreau ----------
----- Type
TypeError

----- Message
cannot convert String into Integer

----- Position dans Carreau
Ligne 111

----- Backtrace
Script : Carreau | Ligne : 111 | Méthode : in `[]'
Script : Carreau | Ligne : 111 | Méthode : in `morphing_p2'
Script : Carreau | Ligne : 152 | Méthode : in `move_down'
Script : Game_Character 2 | Ligne : 212 | Méthode : in `move_type_custom'
Script : Game_Character 1 | Ligne : 118 | Méthode : in `force_move_route'
Script : Interpreter 5 | Ligne : 201 | Méthode : in `command_209'
Script : Interpreter 2 | Ligne : 107 | Méthode : in `execute_command'
Script : Interpreter 1 | Ligne : 199 | Méthode : in `update'
Script : Interpreter 1 | Ligne : 113 | Méthode : in `loop'
Script : Interpreter 1 | Ligne : 204 | Méthode : in `update'
Script : Game_Event | Ligne : 221 | Méthode : in `update'
Script : Game_Map | Ligne : 393 | Méthode : in `update'
Script : Game_Map | Ligne : 392 | Méthode : in `each'
Script : Game_Map | Ligne : 392 | Méthode : in `update'
Script : Scene_Map | Ligne : 194 | Méthode : in `transfer_passminimap'
Script : Minimap | Ligne : 50 | Méthode : in `transfer_player'
Script : Scene_Map | Ligne : 59 | Méthode : in `alias_update'
Script : Scene_Map | Ligne : 46 | Méthode : in `loop'
Script : Scene_Map | Ligne : 63 | Méthode : in `alias_update'
Script : MAPPANEL | Ligne : 90 | Méthode : in `old_update'
Script : TempsJourNuit | Ligne : 248 | Méthode : in `update_passminimap'
Script : Minimap | Ligne : 44 | Méthode : in `update'
Script : Scene_Map | Ligne : 25 | Méthode : in `old_main'
Script : Scene_Map | Ligne : 19 | Méthode : in `loop'
Script : Scene_Map | Ligne : 30 | Méthode : in `old_main'
Script : TempsJourNuit | Ligne : 237 | Méthode : in `main_passminimap'
Script : Minimap | Ligne : 31 | Méthode : in `main'
Script : Main | Ligne : 53


Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Fri 16 Oct - 09:20 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

arf, oui ^o^" j'ai oublié ces commandes d'évent dans mes tests...


je vais y regarder de nouveau ce soir Imbécile heureux
Back to top
Empire1601
Ex-staff


Joined: 01 May 2008
Posts: 3,216
Localisation: La haut sur la montagne ...

PostPosted: Fri 16 Oct - 11:09 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

Très intéressant comme script Imbécile heureux
Ainsi on pourra faire des sols friables comme dans la tour de Raykaza en ajoutant tout simplement un petit event commun de téléportation avec un calcul de la position du joueur si il tombe Clin d'œil foireux
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Sat 17 Oct - 09:54 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

En fait, le "problème" avec les commandes Déplacer le héros, c'est qu'il faut que le jeu ait le temps de se charger, pour que ca marche correctement

Ajoute une attente de 2 frames au tout début de ton jeu, après ca marchera sans soucis ! =)


En outre, j'ai avancé sur la facon dont fonctionnent les autotiles. Jusqu'à présent, je savais qu'ils comptaient pour 48, mais maintenant je sais comment ils sont comptés.

Voici tout d'abord le tileset de test qui m'a permis de "décrypter" la décomposition des 48 apparences de l'autotile :

puis voici ce qu'on obtient lorsqu'on double clic sur l'apparence de l'autotile dans l'éditeur de maps. (zoom x2 pour y voir plus clair, et ajout de séparation des 48 apparences de l'autotile)


Les id des carreaux de l'autotile se comptent en ligne sur cette seconde image. Ainsi, puisque j'ai 6 autres autotiles avant celui ci, dans le tileset de ma map, l'id de la première apparence de l'autotile (la case entièrement jaune, en haut à gauche) sera :
6 (nbre d'autotiles positionnés avant dans le tileset de l'éditeur) * 48 (nbre d'apparences sur les autotiles précédents) + 0 (puisqu'on veut la première apparence de cet autotile) = 288
$game_map.modifier_carreau(X, Y, Z, 288) remplacera donc le contenu du carreau X/Y/Z par la première apparence de cet autotile, le carreau entièrement jaune.

C'est assez complexe à comprendre, j'en conviens... Mais c'est aussi fort utile, si vous voulez utiliser la puissance des autotiles dans cette commande Clin d'œil foireux
Back to top
Lén
Ex-staff


Joined: 11 Jan 2009
Posts: 1,725
Localisation: Aix
Masculin

PostPosted: Thu 31 Dec - 19:09 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

Je me permet un petit necro post:

Code:
$game_map.modifier_carreau(x, y, z, new_tile_id)


Je pense que l'explication, bien que très interessante a mon gout, rend l'utilisation de ton script plus dure.

pourquoi ne pas:

Code:
$game_map.modifier_carreau(x, y, z, colonne, ligne)


et faire le calcul dans le script ? Il faudrait bien sur prévenir que la première colonne et la colonne 0 et la première ligne idem.
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Thu 31 Dec - 19:22 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

Tu veux dire colonne / ligne du nouveau carreau dans le tileset ?

En effet, ca peut facilement s'adapter ainsi, c'est même une excellente idée !
Je regarde ca vite fait et je te dis ce qu'il en est Clin d'œil foireux
Back to top
Lén
Ex-staff


Joined: 11 Jan 2009
Posts: 1,725
Localisation: Aix
Masculin

PostPosted: Thu 31 Dec - 20:16 (2009)    Post subject: Couper l'herbe sous le pied du joueur (version 3)

Oui, on envoi la colonne et la ligne du carreau (coordonnées en carreaux quoi) et on te laisse faire le calcul en arrière plan.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Scripts All times are GMT + 1 Hour
Goto page: 1, 2  >
Page 1 of 2

 
Jump to:  

Index | Free forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Thème par Thomas et l'équipe de la refonte PSP 2012 (version 1.0)