This is a documentation for Board Game Arena: play board games online !

Сцроллмап

Извор: Board Game Arena
Пређи на навигацију Пређи на претрагу

Сцроллмап ис а БГА цлиент сиде цомпонент то дисплаy ан инфините гаме ареа.

Ин соме гамес, плаyерс аре буилдинг тхе маин гаме ареа wитх тилес ор цардс. Еxамплес:

  • Царцассонне
  • Саботеур
  • Такеноко
  • Талува
  • ...

Оф цоурсе тхис цаусе ан аддитионал диффицултy фор тхе адаптатион, бецаусе wе хаве то дисплаy ан инфините гаме ареа инто а фините спаце он тхе сцреен. Тхис ис wхере Сцроллмап цомпонент цан хелп yоу.

Сцроллмап ин ацтион

Иф yоу wант то сее хоw Сцроллмап лоокс лике, плеасе трy "Саботеур" ор "Такеноко" гамес он БГА, ор wатцх а гаме ин прогресс.

Ин ботх гамес, yоу цан сее тхат тхере аре арроw цонтролс ароунд тхе маин гаме ареа, со тхат плаyерс цан усе тхем то сцролл тхе виеw. Yоу цан алсо драг'н'дроп тхе гаме ареа то сцролл.

Хоw то усе Сцроллмап

Ат фирст, дон'т форгет то адд "ебг/сцроллмап" ас а депенденцy:

define([
    "dojo","dojo/_base/declare",
    "ebg/core/gamegui",
    "ebg/counter",
    "ebg/scrollmap"     /// <==== HERE
],


Тхен, децларе а неw вариабле ин yоур цласс фор тхе Сцроллмап објецт:

        constructor: function(){
        console.log('yourgame constructor');
              
        // Scrollable area        	
        this.scrollmap = new ebg.scrollmap();

Ноw, опен yоур темплате (ТПЛ) филе анд адд тхис ХТМЛ цоде:

    <div id="map_container">
    	<div id="map_scrollable"></div>
        <div id="map_surface"></div>
        <div id="map_scrollable_oversurface"></div>
        <a id="movetop" href="#"></a>
        <a id="moveleft" href="#"></a>
        <a id="moveright" href="#"></a>
        <a id="movedown" href="#"></a>
    </div>

Тхере аре алсо соме линес то адд то yоур ЦСС стyлесхеет. Плеасе ноте тхат yоу цан адапт ит то yоур неедс, еспециаллy тхе дефаулт wидтх оф тхе сцроллабле ареа:

/** Scrollable area **/

#map_container {
    position: relative;
    width: 100%;
    height: 400px;
    overflow: hidden;
}
#map_scrollable, #map_scrollable_oversurface {
    position: absolute;
    top: 205px;
    left:  315px;
}
#map_surface {
    position: absolute;
    top: 0px;
    left: 0px;
    width: 100%;
    height: 100%;
    cursor: move;
}
#map_footer {
    text-align: center;
}

Финаллy, то линк yоур ХТМЛ цоде wитх yоур Јавасцрипт, плаце тхис ин yоур Јавасцрипт "Сетуп" метход:

   	// Make map scrollable        	
        this.scrollmap.create( $('map_container'),$('map_scrollable'),$('map_surface'),$('map_scrollable_oversurface') );
        this.scrollmap.setupOnScreenArrows( 150 );

Тхис ис ит! Ноw, yоу схоулд сее он yоур гаме интерфаце а сцроллабле гаме ареа. Тхис ис нот реаллy импрессиве тхоугх, бецаусе yоу дидн'т адд анyтхинг он тхе гаме ареа yет. Тхис ис тхе неxт степ.

Сцроллабле ареа лаyерс

Тхере аре 2 - анд онлy 2 - плацес wхере yоу схоулд плаце yоур ХТМЛ стуфф ин yоур сцроллабле ареа:

  • инсиде "мап_сцроллабле" див
  • инсиде "мап_сцроллабле_оверсурфаце" див

Тхе дифференце ис верy импортант: "мап_сцроллабле" ис бенеатх тхе сурфаце тхат ис усед то драг'н'дроп тхе гаме ареа, анд "мап_сцроллабле_оверсурфаце" ис абове тхис сурфаце. Ин працтице:

  • Иф соме елемент он тхе гаме ареа неед то бе цлицкед (ор анy кинд оф усер интерацтион), yоу схоулд плаце ит ин мап_сцроллабле_оверсурфаце, отхерwисе но цлицк цан реацх ит.
  • Иф соме елемент он тхе гаме ареа дон'т неед то бе цлицкед, yоу'д беттер плаце ит ин "мап_сцроллабле", со ит ис поссибле то драг'н'дроп тхе гаме ареа фром а поинт он тхис елемент.

Оф цоурсе, алл лаyерс аре сцроллед сyнцхроноуслy.

Типс: ин соме ситуатион, ит'с алсо усефул то плаце а гаме елемент он мап_сцроллабле анд а цорреспондинг инвисибле елемент овер тхе сурфаце то манаге тхе интерацтионс. Еxампле: wхен ан интерацтиве елемент муст бе плацед бенеатх а нон интерацтиве елемент фор дисплаy реасон.

Поситионинг елементс он гаме ареа

Алл елементс он тхе гаме аре муст бе абсолуте поситионед (wитх "топ" анд "лефт" аттрибутес).

Бy дефаулт, тхе гаме ареа ис центеред он 0,0 цоординатес.

Енабле мове арроwс

То схоw мове арроwс ицонс ароунд тхе сцроллмап ин ордер то енабле цлицк басед навигатион ин аддитион то драг анд дроп, адд тхесе линес то yоур ЦСС:

/** Move arrows **/

#movetop,#moveleft,#moveright,#movedown {
    display: block;
    position: absolute;
    background-image: url('../../../img/common/arrows.png');
    width: 32px;
    height: 32px;
}

#movetop {
    top: 0px;
    left: 50%;
    background-position: 0px 32px;
}
#moveleft {
    top: 50%;
    left: 0px;
    background-position: 32px 0px;
}
#moveright {
    top: 50%;
    right: 0px;
    background-position: 0px 0px;
}
#movedown {
    bottom: 0px;
    left: 50%;
    background-position: 32px 32px;
}

Ин yоур јавасцрипт, дефине тхе фоллоwинг фунцтионс:

        onMoveTop : function( evt )
        {
            console.log( "onMoveTop" );        
            evt.preventDefault();
            this.scrollmap.scroll( 0, 300 );
        },
        onMoveLeft : function( evt )
        {
            console.log( "onMoveLeft" );        
            evt.preventDefault();
            this.scrollmap.scroll( 300, 0 );
        },
        onMoveRight : function( evt )
        {
            console.log( "onMoveRight" );        
            evt.preventDefault();
            this.scrollmap.scroll( -300, 0 );
        },
        onMoveDown : function( evt )
        {
            console.log( "onMoveDown" );        
            evt.preventDefault();
            this.scrollmap.scroll( 0, -300 );
        },

Анд цоннецт онцлицк евентс он тхе арроwс то тхесе фунцтионс ин yоур јавасцрипт сетуп

        dojo.connect( $('movetop'), 'onclick', this, 'onMoveTop' );
        dojo.connect( $('moveleft'), 'onclick', this, 'onMoveLeft' );
        dojo.connect( $('moveright'), 'onclick', this, 'onMoveRight' );
        dojo.connect( $('movedown'), 'onclick', this, 'onMoveDown' );

Енабле сцроллмап зоне еxтенсион

Тхис ис оптионал, wхен тхере цан бе унусед сцреен спаце ундер тхе сцроллмап тхат а плаyер мигхт wант то усе. Адд тхис ин yоур .тпл афтер тхе сцроллмап див (тхе матцхинг цсс рулес хас алреадy беен дефинед):

<div id="map_footer" class="whiteblock">
    <a href="#" id="enlargedisplay">↓  {LABEL_ENLARGE_DISPLAY}  ↓</a>
</div>

Ин yоур јавасцрипт, дефине тхе фоллоwинг фунцтион:

        onIncreaseDisplayHeight: function( evt )
        {
        	console.log( '$$$$ Event : onIncreaseDisplayHeight' );
        	evt.preventDefault();
        	
            var cur_h = toint( dojo.style( $('map_container'), 'height' ) );
            dojo.style( $('map_container'), 'height', ( cur_h+300 ) + 'px' );
        },

анд цоннецт тхем то тхе 'енларгедисплаy' линк ин yоур сетуп:

dojo.connect( $('enlargedisplay'), 'onclick', this, 'onIncreaseDisplayHeight' );

Ин yоур виеw.пхп филе, дефине тхе темплате вариабле ЛАБЕЛ_ЕНЛАРГЕ_ДИСПЛАY со тхат ит гетс субститутед wитх аппроприате транслатабле теxт:

$this->tpl['LABEL_ENLARGE_DISPLAY'] = self::_("Enlarge display");