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    #2
07.11.2010 08:02

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

https://qsp.org

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

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

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

Неактивен

Powered by PunBB
© copyright 2001–2026 iFiction.Ru