Тема закрыта
Разрабатывая свой Адский движок®, я столкнулся со следующей ситуацией: На экране (html-режим) присутствуют несколько областей, содержимое которых нужно менять, не трогая остальное. Т.е. банально давать команду на обновление экрана не хотелось бы — может поменяться содержимое других областей.
У себя я решил проблему так:
A. Нужные области на экране помечаются тегом <gameobject type="ID">Содержимое области</gameobject>, где ID — уникальный идентфикатор области.
B. Для того, чтобы получить содержимое области (без тегов <gameobject>) с нужным идентификатором, я использую функцию:
#Экран_ПолучитьОбласть
$Result=''
!----------
if $ARGS[1]='': EXIT
if $ARGS[0]='': $ARGS[0]=MAINTXT
!----------
$ARGS[11]='<gameobject type="<<LCASE($ARGS[1])>>">(.+?)</gameobject>'
if strpos($ARGS[0],$ARGS[11]):
$Result=MID($strfind($ARGS[0],$ARGS[11]),21+LEN($ARGS[1]))
$Result=MID($Result,1,LEN($Result)-13)
end
-В функцию передаются следующие параметры:
1. Содержимое экрана (если пусто, то берётся текущее содержимое экрана).
2. Идентификатор блока.
С. Для того, чтобы установить содержимое области с нужным идентификатором, я использую функцию:
#Экран_УстановитьОбласть
if $ARGS[1]='': EXIT
if $ARGS[0]='': $ARGS[0]=MAINTXT
!if ARRSIZE('ARGS')<2: $ARGS[2]='' Данная строка избыточна, её можно удалить (см. ниже переписку с Байтом)
!----------
$ARGS[2]='<gameobject type="<<LCASE($ARGS[1])>>">'+$ARGS[2]+'</gameobject>'
!----------
$ARGS['область']='<gameobject type="<<LCASE($ARGS[1])>>">(.+?)</gameobject>'
ARGS['позиция']=strpos($ARGS[0],$ARGS['область'])
if ARGS['позиция']:
$Result=$mid($ARGS[0],1,ARGS['позиция']-1)+$ARGS[2]+$mid($ARGS[0],ARGS['позиция']+len($strfind($ARGS[0],$ARGS['область'])))
else
$Result=$ARGS[0]
end
*CLR
*P $Result
-В функцию передаются следующие параметры:
1. Содержимое экрана (если пусто, то берётся текущее содержимое экрана).
2. Идентификатор блока.
3. Новое содержимое (без тегов <gameobject>).
Да, при этом экран конечно же перерисовывается, но при этом ничего не меняется за исключением нужной области. Что, собственно, и требовалось.
Если кто знает, как это сделать лучше — буду премного благодарен.
Посмотреть, как выглядит то, что я описал, можно с помощью приложенного файла с примером.
P.S. Нет, это не демо игры. И не демо Адского движка®. Это просто пример работы двух функций.
Неактивен
Сама "проблема" яйца выеденного не стоит.
Эта ситуация в QSP решается так:
Описание выводим в коде "при посещении".
*P 'Вы на кухне.'
IF роджер=1: ' Здесь находится Роджер.' ELSE ' Кроме вас, здесь никого нет.'
Неактивен
На экране (html-режим) присутствуют несколько областей, содержимое которых нужно менять, не трогая остальное.
Задача: изменять описание локации в зависимости от состояния игры.
Решение, которое привел я - многократно опробованное, простое, логичное, понятное.
Решение "присвою тег блоку и заменю кусок текста", которое привел ты, хоть и вполне рабочее, неудобно, запутано и порождает массу проблем.
Неактивен
Тема закрыта