| Membre VIP |
 |
 |
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 :  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 :  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.
|
|