bueno, voy a empezar mostrando lo q he hecho. no es gran cosa, pero a lo mejor os sirve de ayuda. he creado una nueva clase llamada window_radar q es la siguiente: code#============================================================================= = # �� window_radar #-----------------------------------------------------------------------------#muestra en el mapa la posicion del eroe y de los enemigos #============================================================================== class window_radar < window_base #-------------------------------------------------------------------------# - inicializar objeto # actor : objetivo #-------------------------------------------------------------------------def initialize super(480, 0, 160, 120) self.contents = bitmap.new(width - 32, height - 32) self.contents.font.name = $fontface self.contents.font.size = $fontsize self.back_opacity = 0 end end y luego en scene_map he a�adido lo siguiente: en el main: code@radar = window_radar.new (recordad de acer el dispose de @radar despues del loop del main). luego, dentro de scene_map, he a�adido el siguiente metodo, justo despues del main. codedef mostrar_posicion_heroe @heroe.x = ($game_player.x/4) + 480 @heroe.y = ($game_player.y/4) end y en el metodo update de la misma clase, justo despues de def update he a�adido codemostrar_posicion_heroe es decir, voy llamando al metodo mostrar_posicion_heroe. vale, problemas con los q me encuentro: la posicion del heroe esta representada mediante titles, mientras q la de la imagen esta representada mediante pixels. el problema esta primero de todo pasar de title a pixel y luego, una vez tenemos las coordenadas a pixel, canviar de escala. aki es ya donde me pierdo. el fallo en concreto se encuentra en el metodo mostrar_posicion_heroe. yo lo q he hecho es simplemente dividir cada coordenada entre 4, ya q la ventana del radar es 1/4 del tama�o de un mapa estandard. es decir, un mapa estandar mide 640*480 y la ventana del radar mide 160*120. el problema esta en q como e dicho antes, la posicion del prota se expresa en titles mientras q la posicion de la imagen se expresa en pixels, lo q ace q la posicion en el radar no corresponda exactamente con la posicion en el mapa, no se si me explico. a ver si alguien sabe como seguir, o le
sirve esto de alguna ayuda edit: ostias, me e dejado una cosa: en el metodo main de la clase scene_map debeis a�adir tambien code@heroe = sprite.new @heroe.bitmap = rpg::cache.picture("heroe") y debeis acer una imagen (un punto por ejemplo) q se llame "heroe" y guardarla en la carpeta pictures del proyecto traigo una nueva actualizacion. he conseguido (o eso creo), q el puntero del heroe se muestre exactamente donde corresponde con la posicion del heroe en el mapa. canviad el metodo mostrar_posicion_heroe de la clase scene_map q colgue ayer por el siguiente: codedef mostrar_posicion_heroe @heroe.x = ($game_player.x*(160/$game_map.width)) + 480 @heroe.y = $game_player.y*(120/$game_map.height) end en game_event, debemos a�adir un nuevo attr codeattr_accessor:enemigo y en el metodo initialize se inicializa a falso code@enemigo = false este interruptor determina si un evento del mapa es enemigo o no. en game_map se a�ade el siguiente metodo: code#------funcion q declara los enemigos--def declarar_rivales(id_event) @events[id_event].enemigo = true end nos vamos a scene_map y en el main declaramos las siguientes variables: code@yasta = false @x = 0 @y = 0 @rivales = [] y en la misma clase, a�adimos el siguiente metodo: code def encontrar_rivales if @yasta == false id_event = $game_map.check_event(@x,@y) if id_event != nil then print id_event if $game_map.events[id_event].enemigo == true then @rivales[id_event] = sprite.new @rivales[id_event].bitmap = rpg::cache.picture("rival")
@rivales[id_event].x = $game_map.events[id_event].x @rivales[id_event].y = $game_map.events[id_event].y $game_map.need_refresh = true end end @x+=1 if @x == $game_map.width then @x = 0 @y+=1 end if @y == $game_map.height then @yasta = true end end end luego en el metodo update, tambien de la misma clase, se a�ade la siguiente linea de codigo: codeencontrar_rivales bueno, explicacion de como funciona. para declarar a un enemigo, en el mapa se crea una accion tipo inicio automatico y aceis un llamar script con la siguiente informacion: llamar script-->$game_map.declarar_rivales(id1) $game_map.declarar_rivales(id2) etc donde id1, id2, ... son los ids de los eventos q declarais como enemigos en el mapa. una vez hecho esto, recordad de activar algun interruptor general para q no se repita la accion indefinidamente. vale, ya tenemos los enemigos declarados. luego, lo q ace la funcion encontrar_rivales de scene_map, es q va checkeando todo el mapa, comprueba si en la posicion q esta mirando hay evento, y si este es un enemigo (es decir, mira el parametro enemigo de este evento). si lo es, pilla el id de este evento y en la posicion del vector rivales q marca este id, crea un sprite con el punto q representa al rival. muy bien, asta aki perfecto, yo creo q funcionaria bien si no fuese por lo siguiente: si al llamar la funcion q me detecta si en una determinada posicion hay un evento o no (es decir, la llamada a $game_map.check_event(@x,@y)), si en esa posicion no hay un evento, en lugar de devolverme nil (q seria lo logico), me devuelve algo como la imagen q adjunto. y como no es nil, cumple la condicion y intenta buscar el evento en el mapa q tiene como id todo el rollo ese, dice q no encuentra tal evento (logico) y salta el programa. la cuestion es, pq cuando no hay un evento, me sale eso como id del evento en lugar de poner simplemente nil? bueno, a ver si alguien puede ayudarme, q creo q esto mas o menos va por buen camino dew! edit: si no veis la imagen, le dais con el boton derecho, guardar destino como, y la mirais desde vuestro disco duro. code$rivales = [] en game_map, en el metodo initialize a�adimos la siguiente variable:
code@index = 0 canviamos la funcion declarar_rivales q colgue ayer por la siguiente: code#------funcion q declara los enemigos--def declarar_rivales(id_event) @events[id_event].enemigo = true $rivales[@index] = id_event @index+=1 end # -----------------------------------creamos una nueva clase encima de scene_map llamada rivales q es la siguiente: codeclass rivales attr_accessor:sprite attr_accessor:inicializado #----------------------------def initialize @sprite = sprite.new @inicializado = false end end en el main de scene_map a�adimos lo siguiente: code@index = 0 @rivales = [] inicializar_rivales copiamos el siguiente metodo dentro de scene_map codedef inicializar_rivales i = 0 while i != 100 @rivales[i] = rivales.new i+=1 end end y canviamos el metodo encontrar_rivales q puse ayer por el siguiente: code def encontrar_rivales if $rivales[@index] != nil then id_event = $rivales[@index] if @rivales[id_event].inicializado == false then @rivales[id_event].sprite.bitmap = rpg::cache.picture("rival") @rivales[id_event].inicializado = true end @rivales[id_event].sprite.x = ($game_map.events[id_event].x*(160/$game_map.width)) + 480 @rivales[id_event].sprite.y = $game_map.events[id_event].y*(120/$game_map.height) $game_map.need_refresh = true end @index+=1 if $rivales[@index] == nil then
@index = 0 end end y ya sta, con todo esto ya muestra la posicion del heroe y de los rivales q se an declarado en el radar dew! nota: si hay un rival cuya id es superior a 100, no se detectaria. para ello, simplemente debe modificarse la condicion del while de inicializar_rivales. por ejemplo, poneis : codewhile i != 200 en game_character1 tiene q a�adirse los siguientes parametros: code#--------radar------------attr_accessor :rival #indica si el evento es un rival attr_accessor :radar_point #es el sprite q muestra la pos en el radar # -----------------------------------en el initialize de la misma clase inicializamos los parametros de la siguiente forma: code#----inicializacion variables radar--------@rival = false @radar_point = sprite.new @radar_point.z = 300 #----------------------------------------en game_event, en el update, despues de la linea q dice super, introducir: code#---si es un rival, actualizamos la posicion al radar if @rival == true then @radar_point.bitmap = rpg::cache.picture("rival") @radar_point.x = (@x*(160/$game_map.width)) + 480 @radar_point.y = @y*(120/$game_map.height) + 360 end #---------------------------------------------------en game_player, en el update se a�ade: code#---------actualitzacio del punt del radar--------@radar_point.bitmap = rpg::cache.picture("heroe") @radar_point.x = (@x*(160/$game_map.width)) + 480 @radar_point.y = @y*(120/$game_map.height) + 360 #--------fi actualitzacio del punt del radar----------en la clase interpreter, pagina5 (osea interpreter5) al metodo command_201, justo antes de la linia q dice $game_temp.player_transferring = true se a�ade: code#------borramos los puntos de los enemigos del radar for event in $game_map.events.values if $game_map.events[event.id].rival == true then $game_map.events[event.id].radar_point.bitmap.dispose $game_map.events[event.id].radar_point.dispose
end end #-----------------------------------i finalment, en el main de scene_map se a�ade: code#-----imagen radar---------------@radar = sprite.new @radar.bitmap = rpg::cache.picture("radar") @radar.z = 299 @radar.x = 480 @radar.y = 360 #--------------------------------y en el mismo main, hacemos el dispose del sprite, es decir, despues de la linea graphics.freeze a�adir:
[email protected] @radar.dispose vale, despues en cada mapa deveis poner un evento en inicio automatico (y luego borrarlo) q le indike al programa q eventos son los enemigos, y por tanto, esos seran los q apareceran en el radar. dicho evento contiene lo siguiente: >script @i = id del primer event q es monstre >ciclo >script $game_map.evets[@i].rival = true >script @i+=1 >condiciones y efectos por script--> @i > id del ultim event q es rival >romper ciclo >end if >end ciclo >borrar evento i eso es todo. por cierto, dejo el proyecto de prueba q e usado para crear el radar, para q veais como funciona y tal. el evento del q hablo se encuentra en la posicion 0,0 de cada mapa, podreis ver como esta montado. es aconsejable ademas q los ids de los enemigos sean consecutivos, pq si no tendreis q declararlos uno a uno. todos los scripts q he modificado tienen este simbolo [*] y creo q ya no me dejo nada mas. dew! pd:ya se q he hecho doble post, pero ha sido para updatear el tema, puesto que ya era muy antiguo y si hubiese editado nadie se habria dado cuenta. edit: tengo problemas para adjuntar el proyecto. ire probando a ver si hay suerte edit2: me olvidava, necesitareis estas imagenes para q funcione correctamente. debeis de ponerlas en la carpeta pictures del proyecto y tienen q llamarse "heroe", "radar" y "rival" respectivamente (sin comillas, claro)