Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Usuario: Contraseña:

Autor Tema: Tutorial: INTERFAZ SCUMM!!! primera parte  (Leído 1006 veces)

nahuel36

  • Programmer
  • Administrador
  • Desconectado Desconectado
  • Mensajes: 3112
    • MSN Messenger - nahuel36@groggames.com.ar
    • Ver Perfil
    • WWW
    • Email
Introducción
¿Que es una interfaz?

La definición de interfaz es todo lo referido a la forma que tiene el juego de interactuar con el usuario. En otras palabras, la forma en que se controla el juego, la forma en que nosotros jugadores, le comunicamos al juego, que es lo que queremos hacer.
No solo a la hora de jugar,  sino también cuando guardamos/cargamos partidas,  cuando cambiamos alguna opción,  etc etc.

¿Como es la interfaz en Juegos Scumm?

En juegos Scumm (Day of Tentacle y anteriores), la interfaz principalmente se distinguía por tener abajo un espacio, donde había varios botones con acciones,  y a la derecha de este espacio, se veía el inventario. También había un texto, que decía sobre que estaba el mouse, y que acción estaba seleccionada actualmente.

Principalmente era eso. Principalmente, es lo que siempre la gente quiere copiar. Esas tres cosas, inventario, texto, y botones.
Nadie sabe la razón, pero parece que esa interfaz gustó bastante, todavía se sigue repitiendo en innumerables juegos independientes de aventura gráfica.

¿Me permite hacerlo AGS?

En AGS se puede hacer mucho mas de lo que se ve a simple vista. Para hacer una aventura gráfica (de cualquier tipo), basta y sobra, sobra bastante.

Importante: Es necesario usar AGS 3.1 o posterior para completar este tutorial. En caso de usar uno inferior, ver mi versión anterior del tutorial:
http://nahuel36.wordpress.com/ags/



Comenzando

L
os modos de Cursor

Debemos decirle a AGS cuantos modos va a haber, con que nombre se identifican, y como se verá el mouse al seleccionarlos.
Aparte de los cursores por defecto, necesitamos 4 más: Abrir, Cerrar, Empujar, Tirar.


Entonces vamos a Cursors en el panel, y renombremos cada uno:
Cursor 0: Ir a
Cursor 1: Mirar
Cursor 2: Usar
Cursor 3: Hablar
Cursor 4: Usar inv
Cursor 5: Agarrar
Cursor 6: Puntero
Cursor 7: Espera
Cursor 8: Abrir
Cursor 9: Cerrar

y agregamos dos más (Cursors -> click derecho -> New Cursor)
Cursor 10: Empujar
Cursor 11: Tirar



En cuanto a la parte estética,  si queremos que sea igual a Scumm, debemos tener una imagen de una cruz o una animación (view) de la cruz parpadeando. Y asignar ese view o sprite para todos los cursores por igual, excepto el cursor de Espera, el cual no tendría imagen.

Por defecto en AGS, cuando se selecciona un inventario se pone su imagen como cursor,  si no queremos esto vamos a General Settings -> Inventory -> Use selected inventory graphic as cursor -> False.




Las Guías
Hagamos esa famosa barra con botones, inventario y texto. Para ello, creamos nueva Guía (GUIs -> Click derecho -> New GUI).

La seleccionamos, y entre sus opciones buscamos Name, y le ponemos gScummBar. Con ese nombre la reconocerá siempre AGS.
En Layout se cambia tamaño y ubicación. Si queremos que sea como los de Scumm, entonces debería tener el mismo ancho que la resolución, por ejemplo si el juego es a resolución 320x200 es 320, si es 1024x768 entonces es 1024. El alto como mas les guste. Para la ubicación, left valdría 0, y top sería el alto de resolución menos el alto de la guía, por ejemplo si el alto es 56 y la resolución es 320x200, entonces top es 144.


Ahora hagamos los botones. Se crean desde arriba a la izquierda (ver imagen). Luego, para cambiar tamaño y ubicación en forma precisa, se usan las opciones.

Como Name es recomendable ponerles el nombre de la acción, antepuesta de una b (esto solo para evitar confusiones). Por ejemplo: bMirar, bUsar, etc.
Lo ideal también es que cada botón tenga una imagen normal y otra para cuando está el mouse arriba (Image y Mouseover Image).

Faltarían otros dos botones más, que son para cuando hay mucho inventario y necesitamos bajar o subir en los casilleros. Como Name les pondremos bSubir y bBajar.


Lo siguiente sería el texto , que lo hacemos creando un Label (ver sBarra, al lado de botón). Que tendría como Name bBarra (pueden poner otro. la b, como antes, es para evitar confusiones solamente).
Estaría ubicado sobre los botones, aunque no interesa puede ponerse distinto. 
Y pueden hacer que esté centrado (Text Alignment -> TopMiddle).

Por último creamos el inventario (el boton de la taza), y en Name le ponemosbInv.





Empezamos con el Script

Todo muy lindo y prolijo. Pero sin programar, esto no sirve para nada,  ahora le tenemos que decir a AGS como debe usar todas estas cosas que armamos.

¿Por donde empezar?
Bueno, a veces no es fácil darse cuenta. Hay que pensar que es lo que queremos, y como se puede hacer. Con la práctica van a saber como es el mecanismo de AGS y sabrán armarlo solos ;)
Recomiendo mucho que lean el tutorial de script para mejorar en este tipo de cosas.

Por empezar, vamos a hacer que esos botones funcionen!!!

Los botones

Para ello, vamos a asignar que al hacerles click, corran determinado script (Opciones del botón -> Click action-> Run script).  Luego, vamos a Events (ver imagen), y en Onclick escribimos gModo. Así se llamará la función donde pondremos que pasa al presionar cada botón.
Hacemos estos pasos con todos los botones de acciones.

Luego, en cualquiera de estos, volvemos a Events, y hacemos Click en el boton "..." que está a la derecha de OnClick. Esto nos llevará al global script, y creará una función con el nombre que le dijimos. Por el momento no pongamos nada dentro. Pasemos a lo próximo.

Luego, con las flechas al lado del inventario, es algo muy similar, pero donde pusimos gModo pondremos esta vez gScroll. Luego de hacerlo con ambas, hacemos click en el boton a la derecha de OnClick, para que cree el script, como hicimos antes.


Bueno, perfecto, ahora, a ver, pensemos.

Se necesita que constantemente el texto de la barra esté actualizandose. Entonces, no alcanzaría con cambiar el texto de la barra solo al apretar los botones, también habría que cambiarlo al pasar el mouse sobre el entorno.

Pero si constantemente cambia, ¿como sabemos cual fue el ultimo botón que apretamos? En otras palabras, el modo de cursor actual.

Por cuestión de comodidad, vamos a crear una variable global, del tipo String, donde almacenaremos esa Accion actual.
Entonces, vamos arriba de todo del global script (Scripts -> Global Script), y escribimos:
String Accion;

Ahora si, podremos continuar entonces.
Dentro del mismo global script, vayamos a la función gModo.
¿Como funciona esto? Miren al lado del titulo, lo que está entre paréntesis son las variables internas, estas varían según como se llame a la función (esta funcion tiene una llamada oculta, para mas info lean el tutorial de script)
Entonces, la variable control nos indica que botón fue presionado, y la variable button indica con que click (derecho, izquierdo, etc). A esta última no le daremos uso esta vez.

Bien, entonces, identificaremos cada botón con su Name, y asignaremos su modo de cursor correspondiente. Aparte se almacenará en Accion el texto de la acción que irá en la barra.

Entonces, sería algo así:
Código: [Select]
function gModo(GUIControl *control, MouseButton button)
 
       if(control == bCerrar){   mouse.Mode = eModeCerrar;
                               Accion = "Cerrar";}
       else if(control == bAbrir){mouse.Mode = eModeAbrir;
                               Accion = "Abrir";}
       else if(control == bDar){ mouse.Mode = eModeUsar;
                               Accion = "Dar";}
       else if(control == bCoger){mouse.Mode = eModeAgarrar;
                               Accion = "Coger";}
       else if(control == bMirar){mouse.Mode = eModeMirar;
                               Accion = "Mirar";}
       else if(control == bHablar){mouse.Mode = eModeHablar;
                                Accion = "Hablar";}
       else if(control == bUsar){mouse.Mode = eModeUsar;
                               Accion = "Usar";}
       else if(control == bEmpujar){mouse.Mode = eModeEmpujar;
                                 Accion = "Empujar";}
       else if(control == bTirar){mouse.Mode = eModeTirar;
                               Accion = "Tirar";}
}


Bueno, por ultimo, vamos a la función gScroll. Por suerte hay un comando para bajar y subir el inventario, así que no tendremos problemas (antes no había, y menudo lío era):
Código: [Select]
function gScroll(GUIControl *control, MouseButton button)
{
  if(control == bSubir)bInv.ScrollUp();
  if(control == bBajar)bInv.ScrollDown();
}
No hay mucho que explicar si se entendió lo de la función anterior, sube o baja ;)




Ahora, necesitamos agregar lo demás. Necesitamos una funcion que se ejecute constantemente.
Dentro de ella, tendremos que poner todo lo que iría en el texto de la barra, pensando en todas las posibilidades (si el mouse está sobre un objeto, sobre el inventario, sobre nada, si está usando un inventario, etc etc).

El texto de la barra

Hay que pensarlo de una forma, que pueda ejecutarse repetitivamente, y que no se acumulen cosas de más, por ejemplo una mala programación podría hacer que diga "usar pala pala pala" y cada vez se repita mas, por cada vez que se ejecuta la acción. 

Yo elijo el siguiente modo:
Tendremos una string para el inventario activo, una para un conector (por ejemplo: usar botella con, dar billete a) y una para el objetivo. Estas variables comenzarán vacías, según la situación actual, se llenará su contenido o no. Y luego se pondrán todas las variables en el texto de la barra.
De este modo, por cada ejecución se volverá a llenar la barra, pero se evita lo que dije anteriormente.

Bueno, ahora escribiré parte por parte, para que se entienda mejor, luego pongo todo el código junto.
  • Creamos las variables:
Código: [Select]
String Objetivo, InvActivo, Conector;
Objetivo = "";
InvActivo = "";
Conector = "";
  • Primer posibilidad, inventario activo
Código: [Select]
if(player.ActiveInventory!=null){
   InvActivo = player.ActiveInventory.Name;
   if(Accion == "Usar") Conector = " con ";
   else Conector = " a ";}
Además de asignar el nombre del inventario, asigna un valor a Conector según sea modo usar o dar.
  • Segunda posibilidad, mouse sobre el inventario
Código: [Select]
  if(InventoryItem.GetAtScreenXY(mouse.x, mouse.y) != null){
   InventoryItem* item = InventoryItem.GetAtScreenXY(mouse.x, mouse.y);
   Objetivo = item.Name;
Es necesario crear una variable del tipo puntero para poder programar algo sobre un inventario, eso sería lo que hace la segunda línea, basicamente le asigna el nombre item al inventario sobre el mouse.
Con la segunda linea obtenemos su nombre y lo almacenamos.

Es necesario agregar algo mas a esta última, para evitar el "error" de que se pueda usar un inventario con sí mismo.
Código: [Select]
   if(item != player.ActiveInventory) Objetivo = item.Name;Con esto asignará el nombre solo si el inventario activo es distinto del que está sobre el mouse.
  • Tercera y última, cualquier otra cosa que no sea inventario xD
Código: [Select]
if(GetLocationType(mouse.x, mouse.y)!=eLocationNothing)
   Objetivo = Game.GetLocationName(mouse.x,mouse.y);
Con esto alcanza, el comando GetLocationType funciona para todo, excepto inventario.
  • Por último, asignamos todo a el texto de la barra:
Código: [Select]
sBarra.Text = String.Format("%s %s%s%s",Accion,InvActivo,Conector,Objetivo );Presten atención a los espacios, es importante que estén bien colocados.

Por último, le pondremos un nombre a la funcion, ¿Que tal ActualizarBarra? Así quedaría completa entonces:
Código: [Select]
function ActualizarBarra(){
String Objetivo, InvActivo, Conector;
Objetivo = "";
InvActivo = "";
Conector = "";

if(player.ActiveInventory!=null){
   InvActivo = player.ActiveInventory.Name;
   if(Accion == "Usar") Conector = " con ";
   else Conector = " a ";}

   if(InventoryItem.GetAtScreenXY(mouse.x, mouse.y) != null){
    InventoryItem* item = InventoryItem.GetAtScreenXY(mouse.x, mouse.y);
    if(item != player.ActiveInventory) Objetivo = item.Name;}
if(GetLocationType(mouse.x, mouse.y)!=eLocationNothing)
   Objetivo = Game.GetLocationName(mouse.x,mouse.y);

sBarra.Text = String.Format("%s %s%s%s",Accion,InvActivo,Conector,Objetivo );
}

Ahora, necesitamos llamar a esta función, y necesitamos que se haga repetidamente. Entonces pondremos su llamada en la función repeatedly_execute del Global Script
Código: [Select]
function repeatedly_execute()
{
  ActualizarBarra();
}



Perfecto!!!
Un par de detalles y nuestro juego estilo Lucas Arts será funcional.

Ultimos detalles

Luego de cualquier click, sería cómodo que vuelva al modo "Ir a", tal como pasaba en los juegos que tanto queremos.
Entonces, vamos a la funcion on_mouse_click y agregamos estas lineas al final de todo:

Código: [Select]
    mouse.Mode = eModeIra;
    Accion = "Ir a";
    player.ActiveInventory = null;
Con esto, volverá al modo Ir a, y aparte quitará el inventario actualmente activo.
Además de esto, hagamos que al hacer click derecho, ejecute la accion mirar sobre lo que estamos apuntando.
La función quedaría así
Código: [Select]
function on_mouse_click(MouseButton button)
{
  if (IsGamePaused() == 1) // Game is paused, so do nothing (ie. don't allow mouse click)
  {
  }
  else if (button == eMouseLeft)
  {
    ProcessClick(mouse.x,mouse.y, mouse.Mode);
  }
  else if (button == eMouseRight)
  {
    ProcessClick(mouse.x,mouse.y, eModeMirar);
  }

    mouse.Mode = eModeIra;
    Accion = "Ir a";
    player.ActiveInventory = null;
}

Otro detalle, es que al comenzar el juego, la barra no dice nada. Esto se corrige agregando un par de líneas en la funcion game_start, quedaría así:
Código: [Select]
function game_start()
{
    mouse.Mode = eModeIra;
    Accion = "Ir a";
}

Listo!!!

Con esto, el juego quedará bastante funcional.
A la hora de programar su juego, tienen que tener en cuenta que las acciones Empujar, Tirar, Abrir, Cerrar, Usar y Dar, tienen un trato especial.
Las 4 primeras, como verán no aparecen en la seccion Events de los objetos, hotspots o inventarios. Pero en lugar de ello pueden usar Any click on.... Luego, dentro de ella, distinguimos entre los distintos modos usando la variable a esta altura tan usada mouse.Mode.
Por ejemplo, interacciones sobre una caja:
Código: [Select]
if(mouse.Mode == eModeTirar)
  player.Say("No puedo tirarla");
if(mouse.Mode == eModeEmpujar)
  player.Say("Está atascada");
if(mouse.Mode == eModeCerrar)
  player.Say("Ya esta cerrada");
if(mouse.Mode == eModeAbrir)
  player.Say("Hay una espada!!!");
Para el inventario, deben usar Other click on inventory item

El modo Usar, debe distinguirse de alguna forma del modo Dar (ya que si se fijan, ambos tienen el mismo modo de cursor, esto es así porque sino no funciona en AGS).
Para ello, podemos aprovechar que tenemos una variable que contiene el modo escrito en palabras, (el texto de la barra). Entonces, habría que preguntar si esta variable comienza con usar o con dar.
Recuerden que las acciones para Usar y Dar un inventario, van en Events -> Use inventory on...

Un ejemplo nunca viene mal:
Código: [Select]
if(sBarra.Text.StartsWith("usar"))
  player.Say("¡¡¡Te pego con mi espada!!!");
else
  player.Say("¡¡¡No, es mía!!!");
(con poner else, alcanza para ver si es modo dar, ya que otros modos no va a haber en Use Inventory)



Bueno, esto es todo por el momento.
Hay algunos errores que corregir, o cosas que perfeccionar y agregar. Pero este es el tutorial básico, con esto el juego ya es bastante funcional, y se puede empezar a programar.

Espero que les haya servido, cualquier cosa pregunten.
Abrazo ;)
« Última modificación: 08/06/2009, 05:04 por nahuel36 »
En línea


Si sos de staff, debes entrar acá

Pepetwingo

  • Staff
  • Desconectado Desconectado
  • Mensajes: 229
  • My name´s Bond. James Bond.
    • MSN Messenger - edu_granado10@hotmail.com
    • Ver Perfil
    • Email
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #1 : 11/06/2009, 02:01 »
Que grande Nahu ;) Esto sirve mucho y justo andaba necesitando algo así.
En línea

teby

  • Profeta
  • Staff
  • Desconectado Desconectado
  • Mensajes: 1035
  • HTC USER
    • Ver Perfil
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #2 : 11/06/2009, 03:34 »
GENIO. DIOS. SOS TODO NAHU
En línea

lin_mdotor

  • Fondos e inventario, Moderator
  • Moderador Global
  • Desconectado Desconectado
  • Mensajes: 1812
    • MSN Messenger - lin_mdotor@hotmail.com
    • Ver Perfil
    • Email
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #3 : 12/06/2009, 11:32 »
OMG Nahu, ¡cómo te lo curras! :mrgreen:
En línea
:mrgreen: Fondistas del mundo ¡Uní­os! :mrgreen:

nahuel36

  • Programmer
  • Administrador
  • Desconectado Desconectado
  • Mensajes: 3112
    • MSN Messenger - nahuel36@groggames.com.ar
    • Ver Perfil
    • WWW
    • Email
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #4 : 15/06/2009, 05:15 »
gracias chicos :P

La verdad, era una deuda que tenía desde hace mucho tiempo. Lo tenía hecho por la mitad y nunca lo seguía.
Al final, con dedicarle un solo día alcanzó para terminarlo.

Espero que sirva, y no prometo nada , pero espero poder hacer mas partes, aplicando todas las cosas que tenía el tutorial anterior.
En línea


Si sos de staff, debes entrar acá

Antonio.mdaf

  • Staff
  • Desconectado Desconectado
  • Mensajes: 659
  • be mr.geen my frien
    • MSN Messenger - antonio.mdaf@hotmail.com
    • Ver Perfil
    • Email
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #5 : 19/06/2009, 12:41 »
seee... seguro que es muy útil..... poner todos estos tutoriales tan currados en alguna parte de la página inicial... aunque sea sólo un enlace :mrgreen:
En línea
BE MR.GREEN MY FRIEND :mrgreen:

peillat.nahuel

  • Usuarios
  • Desconectado Desconectado
  • Mensajes: 55
    • MSN Messenger - peillat_nahuel@hotmail.com
    • Ver Perfil
    • Email
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #6 : 28/07/2009, 05:25 »
Nahuel, estoy teniendo problemas con la Interfaz, en esta guia faltaria que cambie el texto a cada accion no es asi?? porque por lo que vi no me lo hace. te paso el GlobalScript.asc par que lo veas a ver si tiene que tener otro orden.

Código: [Select]
// main global script file
String Accion;

function gModo(GUIControl *control, MouseButton button)
 {
       if(control == bCerrar){   mouse.Mode = eModeCerrar;
                               Accion = "Cerrar";}
       else if(control == bAbrir){mouse.Mode = eModeAbrir;
                               Accion = "Abrir";}
       else if(control == bDar){ mouse.Mode = eModeUsar;
                               Accion = "Dar";}
       else if(control == bCoger){mouse.Mode = eModeAgarrar;
                               Accion = "Coger";}
       else if(control == bMirar){mouse.Mode = eModeMirar;
                               Accion = "Mirar";}
       else if(control == bHablar){mouse.Mode = eModeHablar;
                                Accion = "Hablar";}
       else if(control == bUsar){mouse.Mode = eModeUsar;
                               Accion = "Usar";}
       else if(control == bEmpujar){mouse.Mode = eModeEmpujar;
                                 Accion = "Empujar";}
       else if(control == bTirar){mouse.Mode = eModeTirar;
                               Accion = "Tirar";}
}

function gScroll(GUIControl *control, MouseButton button)
{
  if(control == bSubir)bInv.ScrollUp();
  if(control == bBajar)bInv.ScrollDown();
}


function ActualizarBarra(){
 
String Objetivo, InvActivo, Conector;
Objetivo = "";
InvActivo = "";
Conector = "";

if(player.ActiveInventory!=null){
   InvActivo = player.ActiveInventory.Name;
   if(Accion == "Usar") Conector = " con ";
   else Conector = " a ";}

   if(InventoryItem.GetAtScreenXY(mouse.x, mouse.y) != null){
    InventoryItem* item = InventoryItem.GetAtScreenXY(mouse.x, mouse.y);
    if(item != player.ActiveInventory) Objetivo = item.Name;}
if(GetLocationType(mouse.x, mouse.y)!=eLocationNothing)
   Objetivo = Game.GetLocationName(mouse.x,mouse.y);

bBarra.Text = String.Format("%s %s%s%s",Accion,InvActivo,Conector,Objetivo );
}

// called when the game starts, before the first room is loaded
function game_start()
{
    mouse.Mode = eModeIra;
    Accion = "Ir a";
}

// put anything you want to happen every game cycle in here

function repeatedly_execute()
{
  ActualizarBarra();
}

// called when a key is pressed. keycode holds the key's ASCII code
function on_key_press(eKeyCode keycode)
{
  if (IsGamePaused()) keycode = 0; // game paused, so don't react to keypresses
 
  if (keycode == eKeyCtrlQ) QuitGame(1); // Ctrl-Q
  if (keycode == eKeyF9) RestartGame(); // F9
  if (keycode == eKeyF12) SaveScreenShot("scrnshot.pcx");  // F12
  if (keycode == eKeyCtrlS) Debug(0,0); // Ctrl-S, give all inventory
  if (keycode == eKeyCtrlV) Debug(1,0); // Ctrl-V, version
  if (keycode == eKeyCtrlA) Debug(2,0); // Ctrl-A, show walkable areas
  if (keycode == eKeyCtrlX) Debug(3,0); // Ctrl-X, teleport to room
}
#sectionend on_key_press  // DO NOT EDIT OR REMOVE THIS LINE
 

#sectionstart on_mouse_click  // DO NOT EDIT OR REMOVE THIS LINE
function on_mouse_click(MouseButton button)
{
  if (IsGamePaused() == 1) // Game is paused, so do nothing (ie. don't allow mouse click)
  {
  }
  else if (button == eMouseLeft)
  {
    ProcessClick(mouse.x,mouse.y, mouse.Mode);
  }
  else if (button == eMouseRight)
  {
    ProcessClick(mouse.x,mouse.y, eModeMirar);
  }

    mouse.Mode = eModeIra;
    Accion = "Ir a";
    player.ActiveInventory = null;
   
    mouse.Mode = eModeAbrir;
    Accion = "Abrir";
    player.ActiveInventory = null;
   
    mouse.Mode = eModeAgarrar;
    Accion = "Recoger";
    player.ActiveInventory = null;
   
}
#sectionend on_mouse_click  // DO NOT EDIT OR REMOVE THIS LINE


#sectionstart interface_click  // DO NOT EDIT OR REMOVE THIS LINE
function interface_click(int interface, int button)
{
  // OBSOLETE, NOT USED IN AGS 2.7 AND LATER VERSIONS
}
#sectionend interface_click  // DO NOT EDIT OR REMOVE THIS LINE


Muchas gracias!!!!
« Última modificación: 28/07/2009, 05:39 por peillat.nahuel »
En línea
"A los idiotas no se los puede educar, ni convertir, solo exponer a la luz." (Sherlock Holmes)

"Solo hay dos cosas infinitas: el universo y la estupidez humana, y no estoy muy seguro de lo primero." (A. Einstein)

Don't be stupid!

nahuel36

  • Programmer
  • Administrador
  • Desconectado Desconectado
  • Mensajes: 3112
    • MSN Messenger - nahuel36@groggames.com.ar
    • Ver Perfil
    • WWW
    • Email
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #7 : 31/07/2009, 03:22 »
mmm, no entiendo bien tu problema,  a que te refieres con que cambie el texto a cada acción?
yo lo probé tal cual y funcionaba bien.
En línea


Si sos de staff, debes entrar acá

peillat.nahuel

  • Usuarios
  • Desconectado Desconectado
  • Mensajes: 55
    • MSN Messenger - peillat_nahuel@hotmail.com
    • Ver Perfil
    • Email
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #8 : 10/08/2009, 07:49 »
Nahuel,te comento el problema que ando teniendo. Cuando vos mensionas que se tiene que poner en AnyClick de cada hotspot
Código: [Select]
if(mouse.Mode == eModeTirar)
  player.Say("No puedo tirarla");
if(mouse.Mode == eModeEmpujar)
  player.Say("Está atascada");
if(mouse.Mode == eModeCerrar)
  player.Say("Ya esta cerrada");
if(mouse.Mode == eModeAbrir)
  player.Say("Hay una espada!!!");

 (salvo utilizar los elementos del inventario) a mi no me finciona, me funciona cuando le saco del
Código: [Select]
mouse_on_click(){
    ...
[s]    mouse.Mode = eModeIra;[/s]
    Accion = "Ir a";
    player.ActiveInventory = null;
}
porque cuando esta, no deja a menos que se coloque por cada accion abrir, cerrar etc etc no en AnyClick() es como que nunca lo hace porque vuelve al click "Ir a". no se cual puede ser la solucion ya que cuando usas una accion y NO le sacas el mouse.Mode = eModeIra; no lo hace
Y si se lo sacas, no vuelve a la accion Ir a y tenes que ponerlo por cada accion (o sea no es generico)  :(

no se si se entiende bien

cualquier cosa preguntame!!

Un abrazo.!

Nahuel.
« Última modificación: 10/08/2009, 07:55 por peillat.nahuel »
En línea
"A los idiotas no se los puede educar, ni convertir, solo exponer a la luz." (Sherlock Holmes)

"Solo hay dos cosas infinitas: el universo y la estupidez humana, y no estoy muy seguro de lo primero." (A. Einstein)

Don't be stupid!

nahuel36

  • Programmer
  • Administrador
  • Desconectado Desconectado
  • Mensajes: 3112
    • MSN Messenger - nahuel36@groggames.com.ar
    • Ver Perfil
    • WWW
    • Email
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #9 : 14/08/2009, 12:50 »
Sip, se entiende perfecto,  pero que raro porque yo lo había probado.

Mira lo que podes hacer así a simples rasgos, es sacar lo que tachaste, y donde dice Accion = "Ir a"; pones otra cosa , por ejemplo
Accion = "Poner ir a";

entonces, en repeatedly_execute, o mejor mas prolijo en Actualizar barra, agregas esto

if(Accion == "Poner ir a")
{  mouse.Mode = eModeIra;
    Accion = "Ir a";}

Tenés que agregarlo después de que se definen las variables en la funcion, te quedaría así:

Código: [Select]
function ActualizarBarra(){
String Objetivo, InvActivo, Conector;
Objetivo = "";
InvActivo = "";
Conector = "";

if(Accion == "Poner ir a")
{  mouse.Mode = eModeIra;
    Accion = "Ir a";}


if(player.ActiveInventory!=null){
   InvActivo = player.ActiveInventory.Name;
   if(Accion == "Usar") Conector = " con ";
   else Conector = " a ";}

   if(InventoryItem.GetAtScreenXY(mouse.x, mouse.y) != null){
    InventoryItem* item = InventoryItem.GetAtScreenXY(mouse.x, mouse.y);
    if(item != player.ActiveInventory) Objetivo = item.Name;}
if(GetLocationType(mouse.x, mouse.y)!=eLocationNothing)
   Objetivo = Game.GetLocationName(mouse.x,mouse.y);

sBarra.Text = String.Format("%s %s%s%s",Accion,InvActivo,Conector,Objetivo );
}

En línea


Si sos de staff, debes entrar acá

peillat.nahuel

  • Usuarios
  • Desconectado Desconectado
  • Mensajes: 55
    • MSN Messenger - peillat_nahuel@hotmail.com
    • Ver Perfil
    • Email
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #10 : 14/08/2009, 12:59 »
Nahu, muchas gracias ( :shock: que dificil agradecer a mi tocayo! jeejeje es como a mi mismo!!!  :grog2:) sigue sin retornar al cursor eModeIra, no entiendo por que no vuelve con cada accion.

Dejando todo tal cual como estaba hecho y con todos los detalles, no vuelve

Una cosa que no puedo descifrar, ¿Como se hace para que con esta interfaz ,que no tiene la accion interactuar exactamente, para pasar de un room a otro haciendo click en un objeto??
porque con la accion "Ir a" no va a ningun lado.

¿¿ Hay que hacer algo parecido a que cuando se toque sobre el objeto pero a su vez en un hotspot debajo del mismo ??

el lo unico que REALMENTE me interesa, si no cambia el cursor no es problema, se lo pongo en la funcion y se termino (momentaneamente) pero si no tengo esto estoy frito!

Muchas gracias

 :grog2:

Nahuel
« Última modificación: 14/08/2009, 01:50 por peillat.nahuel »
En línea
"A los idiotas no se los puede educar, ni convertir, solo exponer a la luz." (Sherlock Holmes)

"Solo hay dos cosas infinitas: el universo y la estupidez humana, y no estoy muy seguro de lo primero." (A. Einstein)

Don't be stupid!

Toni

  • Usuarios
  • Desconectado Desconectado
  • Mensajes: 1
  • Colaborador
    • Ver Perfil
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #11 : 10/06/2010, 12:28 »
Ante todo un saludo a todo el mundo.

Me acabo de registrar al descubrir esta pagina dedicada a las  aventuras graficas, y sobre todo al Adventure Game Studio.
Tengo la version 3.1, no se si es la ultima, y estoy interesado en hacer una aventura grafica.
He visto este tema sobre el Scumm de Lucas Arts, y he decidido porabar a hacerlo gracias a este gran tutorial.

Pero me han surgido algunos problemas que me impiden continuarlo haciendo.

Disculpadme pero soy novato.

Son estos:

1- En el apartado LOS MODOS DE CURSOR:

Cursor 0: Ir a
Cursor 1: Mirar
Cursor 2: Usar
Cursor 3: Hablar
Cursor 4: Usar inv
Cursor 5: Agarrar
Cursor 6: Puntero
Cursor 7: Espera
Cursor 8: Abrir
Cursor 9: Cerrar

He hecho los botones, en total 14, contando subir y bajar inventario.
Me he dado cuenta que el cursor 6 poner PUNTERO, como podeis ver.
Que significa?

2- Lo ideal también es que cada botón tenga una imagen normal y otra para cuando está el mouse arriba (Image y Mouseover Image).

Como se hace una imagen, y que tipo de imagen quiere decir, podriais ponerme un ejemplo?

Por ahora estas son mis dudas, seguramente me iran surgiendo mas por el camino.

Muchas gracias.
En línea

Sadistyk

  • Usuarios
  • Desconectado Desconectado
  • Mensajes: 10
    • Ver Perfil
    • WWW
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #12 : 28/07/2010, 04:30 »
Hola. Las imágenes en sí no se hacen en AGS, se cargan. Las imágenes las podes hacer con Paint u otro programa como Photoshop y luego la cargas en AGS. Si te fijas, en el editor hay un nodo que dice 'Sprites'. Un sprite es una imagen, un archivo imagen (png, bmp, jpg, etc) que hiciste con algún programa y luego lo cargaste a AGS. Para cargar una imagen simplemente vas a Sprites y en alguna carpeta (del árbol izquierdo) haces click en el medio de la pantalla con el botón derecho ->'Inport new sprite from file' y se te va a abrir una ventana para que busques el archivo de imagen (png, bmp, jpg, etc) para cargarlo a AGS. Automaticamente AGS le va a dar un número de sprite para que después lo puedas usar en tu juego.

El modo puntero (Pointer) es un modo de mouse predefinido en AGS, y no se lo puede cambiar. Si te fijas cuando lo seleccionas la propiedad 'ScriptID' dice 'eModePointer'. Así que una de las razones porque está es porque no se lo puede borrar. La otra es porque, junto con el modo 'Use inventory' y 'Wait', es un modo especial hardcodeado que usa AGS. El juego pone el modo del mouse en puntero cuando se está mostrando un GUI modal (un GUI que pausa el juego) automáticamente. Esto lo podés leer en el manual, en la parte 'Setting up the game' bajo la sección 'Cursors'.

También el modo puntero está por razones históricas (antención: viene una sección nostálgica jaja). En los juegos de Sierra On-line siempre estaba la misma interfaz que para ver el inventario del jugador se te abría una ventanita y para seleccionar un elemento tenías la flecha (el puntero). Supongo que no tiene mucho sentido en una interfaz tipo MI, pero bueno por las razones explicadas tiene que estar.
En línea
No hay conocimiento que no sea poder

guillermoxx

  • Usuarios
  • Desconectado Desconectado
  • Mensajes: 1
  • Colaborador
    • Ver Perfil
Re: Tutorial: INTERFAZ SCUMM!!! primera parte
« responder #13 : 28/08/2010, 11:35 »
hola ahuel tengo un problema para hacer esto ..... todo lo primero va bien hasta que dice

(Luego, en cualquiera de estos, volvemos a Events, y hacemos Click en el boton "..." que está a la derecha de OnClick. Esto nos llevará al global script, y creará una función con el nombre que le dijimos. Por el momento no pongamos nada dentro. Pasemos a lo próximo.)

lo hago pero cuando voy al scrip no esta el comando gModo o gScroll ... y no se que hacer ----
por favor si alguien save responda
En línea