Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #1
07.11.2010 03:40

Olegus t.Gl.
Участник (+1056, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2881
Вебсайт

Замена содержимого части экрана (html)

Разрабатывая свой Адский движок®, я столкнулся со следующей ситуацией: На экране (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. Нет, это не демо игры. И не демо Адского движка®. Это просто пример работы двух функций.


Прикрепленные файлы:
example_screen_update.zip, Размер: 1,226 байт, Скачано: 543

Неактивен

0    0    #2
07.11.2010 08:02

HzD_Byte
Модератор (+2, -1)
Откуда: Далеко
Зарегистрирован: 15.04.2006
Сообщений: 282
Вебсайт

https://qsp.org

Re: Замена содержимого части экрана (html)

1. Думаю, лучше не создавать отдельный тег, а сделать через div: <div id="gameobject_ID">...</div>

2. Во второй функции строчка if ARRSIZE('ARGS')<2: $ARGS[2]='' не нужна.

Неактивен

0    0    #3
07.11.2010 10:10

Olegus t.Gl.
Участник (+1056, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2881
Вебсайт

Re: Замена содержимого части экрана (html)

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.

Неактивен

0    0    #8
07.11.2010 15:14

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

Re: Замена содержимого части экрана (html)

Сама "проблема" яйца выеденного не стоит.

Эта ситуация в QSP решается так:

Описание выводим в коде "при посещении".

*P 'Вы на кухне.'
IF роджер=1: ' Здесь находится Роджер.' ELSE ' Кроме вас, здесь никого нет.'

Неактивен

0    0    #9
07.11.2010 16:58

Olegus t.Gl.
Участник (+1056, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2881
Вебсайт

Re: Замена содержимого части экрана (html)

Nex написал:

Сама "проблема" яйца выеденного не стоит.
Эта ситуация в QSP решается так:
Описание выводим в коде "при посещении".
*P 'Вы на кухне.'
IF роджер=1: ' Здесь находится Роджер.' ELSE ' Кроме вас, здесь никого нет.'

Nex, ты как всегда ничего не понял, но чтобы твой энтузиазм не пропадал втуне, попробуй в приведенном мной примере заменить содержимое одного из блоков, чтобы не изменились остальные, но без промежуточных переменных для хранения содержимого, которое не хотелось бы трогать.
Либо просто не лезь в вопросы, в которых ты ничего не понимаешь. И не засоряй тему.

Неактивен

0    0    #10
07.11.2010 20:05

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

Re: Замена содержимого части экрана (html)

На экране (html-режим) присутствуют несколько областей, содержимое которых нужно менять, не трогая остальное.

Задача: изменять описание локации в зависимости от состояния игры.

Решение, которое привел я - многократно опробованное, простое, логичное, понятное.

Решение "присвою тег блоку и заменю кусок текста", которое привел ты, хоть и вполне рабочее, неудобно, запутано и порождает массу проблем.

Неактивен

0    0    #11
18.05.2011 19:53

Olegus t.Gl.
Участник (+1056, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2881
Вебсайт

Re: Замена содержимого части экрана (html)

Данный функционал реализован в виде отдельного модуля "QSP: Экран". Тема модуля: здесь.

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru