[I7] Gérer deux fenêtres

Bonjour à tous,

la dernière fois Azathoth m’a dit qu’il cherchait comment gérer 2 fenêtres dans la fenêtre de jeu. Après avoir bidouillé j’ai réussi à gérer une fenêtre supérieure qui affiche une image correspondant au lieu où vous vous trouvez, ainsi qu’une fenêtre latérale qui affiche le texte que vous souhaitez. Je sais pas si c’était vraiment utile de poster ça là, mais bon, si ça peut être utile à quelqu’un, servez-vous ! D’ailleurs si vous avez des suggestions pour raccourcir le code, je suis preneur.

[spoiler]« Double fenêtre » by Thibault D.

Include Flexible Windows by Jon Ingold. [C’est la seule extension nécessaire. L’extension « Location images » vous permet aussi de gérer une image liée à un lieu, mais ne permet d’ouvrir qu’une seule fenêtre.]

Figure 1 is the file « jungle.jpg ». [La liste des figures nécessaires.]
Jungle is a room.

[La fenêtre latérale :]

The side-window is a text-buffer g-window spawned by the main-window. [Vous pouvez toujours appliquer des propriétés, telles qu’un fond de couleur à la fenêtre ici.]

The measurement of the side-window is 30. [Modifiable, bien entendu.]

A window-drawing rule for the side-window (this is the construct inventory rule):
move focus to side-window, clearing the window;
say « [line break]Tapis dans les feuillages, vous guettez les cacatoès sauvages. »;
return to main screen.

Every turn when the side-window is g-present: follow the window-drawing rules for the side-window.

[La fenêtre supérieure :]

The graphics-window is a graphics g-window spawned by the main-window. The position of the graphics-window is g-placeabove.

The current image is a figure-name that varies.

Before looking when the player is in Jungle:
depict Figure 1.

To depict (f - a figure-name):
now the current image is f;
follow the window-drawing rules for the graphics-window.

Window-drawing rule for the graphics-window (this is the draw scaled image rule):
if graphics-window is g-unpresent, rule fails;
clear the graphics-window;
draw scaled copy of current image in graphics-window.

When play begins:
open up the graphics-window;
open up the side-window.

To draw scaled copy of (f - a figure-name) in (g - a g-window):
(- DrawScaled({f}, {g}); -) .

Include (-

	! Doing scaling calculations in I6 lets us handle bigger numbers

	[ GetImageSize curimg index result;
		result = glk_image_get_info( ResourceIDsOfFigures-->curimg, gg_arguments,  gg_arguments+WORDSIZE);
		return gg_arguments-->index;
	];

	[ DrawScaled figure g w_total h_total graph_height graph_width w_offset h_offset;
	graph_height = WindowSize(g, 1);
	graph_width = gg_arguments-->0;
	w_total = GetImageSize(figure, 0);
	h_total = gg_arguments-->1;

	if (graph_height - h_total < 0) !	if the image won't fit, find the scaling factor
	{
		w_total = (graph_height * w_total)/h_total;
		h_total = graph_height;

	}

	if (graph_width - w_total < 0)
	{
		h_total = (graph_width * h_total)/w_total;
		w_total = graph_width;
	}

	w_offset = (graph_width - w_total)/2; if (w_offset < 0) w_offset = 0;
	h_offset = (graph_height - h_total)/2; if (h_offset < 0) h_offset = 0;

	glk_image_draw_scaled(g.ref_number, ResourceIDsOfFigures-->figure, w_offset, h_offset, w_total, h_total); 
	];

-) .[/spoiler]

En situation, ça donne ça : (l’image est en 2000x400 ça là, ce sont a priori les dimensions optimales)

[spoiler][/spoiler]

Je remonte ce topic s’il y a des gens à qui ça peut servir :slight_smile:

Je précise que ce n’est valable que pour 6G60, au cas où.

Avec 6L, c’est plus facile car l’extension Simple Graphical Window utilise maintenant Flexible Windows, donc on peut avoir la fenêtre d’image plus d’autres fenêtres de texte sans avoir à tout coder.

Je vais fonder un site dissident entièrement dédié à 6G60, je pense.