Radar

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Radar as PDF for free.

More details

  • Words: 1,566
  • Pages: 6
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)

Related Documents

Radar
June 2020 15
Radar
May 2020 20
Radar
August 2019 41
Radar
October 2019 29
Radar
November 2019 25
Radar
May 2020 16