Тема закрыта
Разрабатывая свой Адский движок®, я столкнулся со следующей ситуацией: На экране (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. Нет, это не демо игры. И не демо Адского движка®. Это просто пример работы двух функций.
Неактивен
1. Думаю, лучше не создавать отдельный тег, а сделать через div: <div id="gameobject_ID">...</div>
2. Во второй функции строчка if ARRSIZE('ARGS')<2: $ARGS[2]='' не нужна.
Неактивен
HzD_Byte написал:
1. Думаю, лучше не создавать отдельный тег, а сделать через div: <div id="gameobject_ID">...</div>
2. Во второй функции строчка if ARRSIZE('ARGS')<2: $ARGS[2]='' не нужна.
1. Тег <div> — блочный, поэтому его использование не всегде применимо, например, когда блок находится в строке (тем более что в QSP Classic нельзя указать "display:inline"). К тому же, если выделяемая область является частью таблицы (одна или несколько ячеек), то это будет неправильно по части html.
2. Согласен (поправил). Эта строчка осталась со времён, когда в указанную область заданное содержимое прописывалось без изменений (т.е. не было строчки $ARGS[2]='<gameobject type="<<LCASE($ARGS[1])>>">'+$ARGS[2]+'</gameobject>'), поскольку в этом случае, если автор не указывал значение этого аргумента, то (из-за особенности работы QSP с массивами) он обнаруживал, что $ARGS[2]=$ARGS['область']. Описал ситуацию в FAQ.
Неактивен
Сама "проблема" яйца выеденного не стоит.
Эта ситуация в QSP решается так:
Описание выводим в коде "при посещении".
*P 'Вы на кухне.'
IF роджер=1: ' Здесь находится Роджер.' ELSE ' Кроме вас, здесь никого нет.'
Неактивен
Nex написал:
Сама "проблема" яйца выеденного не стоит.
Эта ситуация в QSP решается так:
Описание выводим в коде "при посещении".
*P 'Вы на кухне.'
IF роджер=1: ' Здесь находится Роджер.' ELSE ' Кроме вас, здесь никого нет.'
Nex, ты как всегда ничего не понял, но чтобы твой энтузиазм не пропадал втуне, попробуй в приведенном мной примере заменить содержимое одного из блоков, чтобы не изменились остальные, но без промежуточных переменных для хранения содержимого, которое не хотелось бы трогать.
Либо просто не лезь в вопросы, в которых ты ничего не понимаешь. И не засоряй тему.
Неактивен
На экране (html-режим) присутствуют несколько областей, содержимое которых нужно менять, не трогая остальное.
Задача: изменять описание локации в зависимости от состояния игры.
Решение, которое привел я - многократно опробованное, простое, логичное, понятное.
Решение "присвою тег блоку и заменю кусок текста", которое привел ты, хоть и вполне рабочее, неудобно, запутано и порождает массу проблем.
Неактивен
Данный функционал реализован в виде отдельного модуля "QSP: Экран". Тема модуля: здесь.
Неактивен
Тема закрыта