RPG Creator : créez votre MMORPG ou RPG sans aucune connaissance en programmation


Disponible le 4 Juin !




- Jouez à votre jeu sur tablettes tactiles, Smartphones et navigateurs Web
- Personnalisez vos menus
- Dessinez facilement et rapidement vos cartes
- Créez des actions pour le combat A-RPG


www.rpgcreator.net


Heures au format UTC + 1 heure [ Heure d’été ]


Règles du forum


Consultez la liste des Scripts : cliquez ici



Publier un nouveau sujet Répondre au sujet  [ 2 messages ] 
Auteur Message
 Sujet du message: Spriteset_Zone : Définir une zone de contact.
MessagePublié: 27 Avr 2011, 11:41 
Membre VIP
Membre VIP
Avatar de l’utilisateur

Inscrit le: 27 Oct 2006, 00:00
Messages: 1238
Niveau RPG Maker: Correct
Logiciel(s) préféré(s): XP
Point(s) Fort(s): Aucune spécialité
Sexe: Masculin
Points d'aide: 60/60

Créations :

Voir ses créations

Spriteset_Zone


Auteur : Mack

Description : Ce script permet de vérifier qu'un évent soit dans une zone prédéfinie, et ensuite dessiner la zone. ( Cf screen )

Ressources nécessaires :
Pour ce script, il faut des pictures de 32*32. Ces pictures serviront à être afficher au niveau du sol, pour délimiter la zone.
Voila un exemple de picture :
Image

Utilisation :
Il suffit de mettre ce code dans insérer un script/condition : Script.
Code: Tout sélectionner
contactevent(eventname,r,bitmap,event_id,type)

event_name : Le nom de l'event pour que la condition soit vrai. Si vous voulez juste dessiner la zone, ce nom n'a pas d'importance. Pour vérifier que ce soit le héros qui soit dans la zone, il suffit de mettre : "Player".
r : C'est le rayon de la zone.
bitmap : Le nom de la picture qui s'affichera. Mettez "" pour ne rien afficher. De base, c'est la picture "Zone" qui s'affichera.
event_id : C'est l'id de la zone. Ainsi, il est possible d'attribuer plusieurs zones à un même évent. Le moyen le plus simple, c'est de mettre @event_id. ( Ça permet d'avoir la même id que l'évent. )
type : Ca permet de définir le type de zone que vous voulez : 0 donne un losange, 1 un rond, et 2 un carré.

Screen :
Image

Script :
Il y a un seul script "Spriteset_Zone" à ajouter au dessus de main :
Code: Tout sélectionner
=begin
                            Spriteset_Zone

                        Script de Mack, Avril 2011

Ce script permet de vérifier qu'un évent soit dans une zone prédéfinie, et
ensuite dessiner la zone.

Utilisation :
Il suffit de mettre ce code dans insérer un script/condition : Script.

contactevent(eventname,r,bitmap,event_id,type)

Si vous voulez

juste dessiner la zone, ce nom n'a pas d'importance. Pour vérifier que ce soit
le héros qui soit dans la zone, il suffit de mettre : "Player".

r : C'est le rayon de la zone.

bitmap : Le nom de la picture qui s'affichera. Mettez "" pour ne rien afficher.

event_id : C'est l'id de la zone. Ainsi, il est possible d'attribuer plusieurs
zones à un même évent. Le moyen le plus simple, c'est de mettre @event_id.
( Ça permet d'avoir la même id que l'évent. )
=end

class Spriteset_Map
  alias initialize_old initialize
  def initialize
    @sprite_zone = []
    for i in 0...999
      @sprite_zone[i] = []
    end
    initialize_old
  end
  def zone(tiles,bitmap,id)
    for sprite in @sprite_zone[id]
      sprite.visible = false# if @sprite_zone[id][i]
    end
    for i in 0...tiles.size
      if @sprite_zone[id][i] == nil
        @sprite_zone[id][i] = Sprite.new(@viewport1)
        @sprite_zone[id][i].bitmap = RPG::Cache.picture(bitmap)
      end
      @sprite_zone[id][i].visible = true
      x = (tiles[i][0]*32)-($game_map.display_x/4)#$game_player.x-$game_map.width)*32
      y = (tiles[i][1]*32)-($game_map.display_y/4)#$game_player.y-$game_map.height)*32
      @sprite_zone[id][i].x = x
      @sprite_zone[id][i].y = y
    end
  end
  def zone_delete(id)
    @sprite_zone[id] = []
  end
end
class Interpreter   
  def contactevent(eventname,r=1,bitmap="Zone",event_id=@event_id,type=0)
    map = $game_map
    player = $game_map.events[@event_id]
    tiles = []
    if type > 2
      t = type-3
      tiles = zone_plus(player.x,player.y,player.direction,t,r)
    else
      for x in 0...map.width
        for y in 0...map.height
          if type == 0
            tiles << [x,y] if (x-player.x).abs + (y-player.y).abs <= r
          elsif type == 1
            tiles << [x,y] if ((x-player.x)**2 + (y-player.y)**2)**0.5 <= r
          elsif type == 2
            tiles << [x,y] if [(x-player.x).abs, (y-player.y).abs].max <= r
          end
        end
      end
    end
     if eventname != "Player"
       for e in $game_map.events.values
         if e.name.include?(eventname)
           event = e
           if $scene.is_a?(Scene_Map)
              $scene.spriteset.zone(tiles,bitmap,event_id)
            end
            if tiles.include?([event.x,event.y])
              return true
            end
         end
       end
     else
      event = $game_player
      if $scene.is_a?(Scene_Map)
        $scene.spriteset.zone(tiles,bitmap,event_id)
      end
      if tiles.include?([event.x,event.y])
        return true
      end
    end
    return false
  end
  def delete_zone(id)
    if $scene.is_a?(Scene_Map)
      $scene.spriteset.zone_delete(id)
    end
  end
  def zone_plus(x2,y2,d,t=0,r=1)
=begin
C'est la partie du script qui permet de géré les nouvelles zones.

Pour créer une nouvelle zone, rajoutez :
elsif t == X 
en dessous de :
tab = ["devant_1","devant_1, gauche_1","gauche_1","gauche_1, derriere_1","derriere_1","derriere_1, droite_1","droite_1","droite_1, devant_1"]
avec X pour l'"id" de votre nouvelle zone ( Pour pouvoir le reconnaitre plus tard.
Si cette zone ne dépend pas du rayon, rajoutez :
tab = [votre liste]
Sachant que votre liste doit être composer de :
"devant_X", "derriere_X","gauche_X", ou "droite_X".
X étant un nombre.
Si je met "devant_2", la case qui sera deux cases devant mon évent sera pris en compte.
De même pour "gauche_4", c'est la case 4 fois à gauche qui sera prise.
On peut combiner les deux pour avoir des trucs comme : "derriere_1, gauche_2", Ca donnera la case deux fois à gauche, et une fois derrière l’évent.
Voila, vous pouvez aussi jeter un oeil aux zones déjà créer pour voir comment ça marche
=end
    if t == 0
      tab = []
      for i in 0..r
        tab.push("devant_"+i.to_s)
      end
    elsif t == 1
      tab = []
      for i in 0..r
        tab.push("devant_"+i.to_s)
        if i != 0
          tab.push("derriere_"+i.to_s)
          tab.push("gauche_"+i.to_s)
          tab.push("droite_"+i.to_s)
        end
      end
    elsif t == 2
      tab = ["devant_1","devant_1, gauche_1","gauche_1","gauche_1, derriere_1","derriere_1","derriere_1, droite_1","droite_1","droite_1, devant_1"]
    end
    zone = []
    tab.each { |i|
      a = 0 ; b = 0
      if i.include?(",")
        i = i.split(",")
        for i2 in i
          if i2.include?("devant_")
            b+= i2.gsub("devant_", "").to_i
          elsif i2.include?("gauche_")
            a-= i2.gsub("gauche_", "").to_i
          elsif i2.include?("droite_")
            a+= i2.gsub("droite_", "").to_i
          elsif i2.include?("derriere_")
            b -= i2.gsub("derriere_", "").to_i
          end
        end
      else
        if i.include?("devant_")
          b+= i.gsub("devant_", "").to_i
        elsif i.include?("gauche_")
          a-= i.gsub("gauche_", "").to_i
        elsif i.include?("droite_")
          a+= i.gsub("droite_", "").to_i
        elsif i.include?("derriere_")
          b -= i.gsub("derriere_", "").to_i
        end
      end
      case d
      when 2
        x = x2 - a ; y = y2 + b
      when 4
        x = x2 - b ; y = y2 - a
      when 6
        x = x2 + b ; y = y2 + a
      when 8
        x = x2 + a ; y = y2 - b
      end
      zone.push([x,y])}
      return zone
    end
end
class Game_Event
  attr_reader :name
  attr_accessor :direction
  alias k_name_initialize initialize
  def initialize(map_id, event)
    @name = event.name
    k_name_initialize(map_id, event)
  end
end
class Scene_Map
  attr_reader :spriteset
end

_________________
Sihara : Démonstration Technique


Dernière édition par Mack le 18 Mai 2011, 14:57, édité 1 fois au total.

Haut
 Profil  
 
 Sujet du message: Re: Spriteset_Zone : Définir une zone de contact.
MessagePublié: 18 Mai 2011, 14:56 
Membre VIP
Membre VIP
Avatar de l’utilisateur

Inscrit le: 27 Oct 2006, 00:00
Messages: 1238
Niveau RPG Maker: Correct
Logiciel(s) préféré(s): XP
Point(s) Fort(s): Aucune spécialité
Sexe: Masculin
Points d'aide: 60/60

Créations :

Voir ses créations

MaJ du Mercredi 18/05 :
- Correction d'un bug. ( Lorsque la zone va en dehors de l'écran, elle s'affiche normalement )
- Ajout d'un système de création de zone simplement :
Il suffit de définir quelles cases seront affecté à partir de mot :
"devant_X", "derriere_X","gauche_X", et "droite_X".
Pour ceux qui connaissent, c'est le même principe que pour les attaques dans la A-RPG de Darkléo :
Si je met "devant_2", la case qui sera deux cases devant mon évent sera pris en compte.
De même pour "gauche_4", c'est la case 4 fois à gauche qui sera prise.
On peut combiner les deux pour avoir des trucs comme : "derriere_1, gauche_2", Ca donnera la case deux fois à gauche, et une fois derrière l’évent.
Exemple concret :
Code: Tout sélectionner
"devant_1","devant_1, gauche_1","gauche_1","gauche_1, derriere_1","derriere_1","derriere_1, droite_1","droite_1","droite_1, devant_1"

Donnera :
XXX
XoX
XXX
X, la zone "occupé", et o l’évent d'où part la zone.

Tout ce passera dans la définition "zone_plus".

Premier post éditer.


Un grand merci à Darkléo pour m'avoir aider sur les nouvelles zones.

_________________
Sihara : Démonstration Technique


Haut
 Profil  
 
Afficher les messages depuis:  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 2 messages ] 

Heures au format UTC + 1 heure [ Heure d’été ]


Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 2 invités


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Rechercher pour:
Sauter vers:  
cron
RPG Creative Forum version 5 ; Tous droits réservés
phpBB Group (Traduit par Xaphos)
Optimisé pour une résolution 1024*728