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.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Замена содержимого части экрана (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 байт, Скачано: 672

Неактивен

0    0    #3
07.11.2010 15:14

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

---

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

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

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

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

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

Неактивен

0    0    #4
07.11.2010 20:05

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

---

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

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

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

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

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

Неактивен

Powered by PunBB
© copyright 2001–2026 iFiction.Ru