.lost .player {
background: rgb(160, 64, 64);
}
.won .player {
box-shadow: -4px -7px 8px white, 4px -7px 8px white;
}
ΠΠΎΡΠ»Π΅ ΠΏΡΠΈΠΊΠΎΡΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΊ Π»Π°Π²Π΅ ΡΠ²Π΅ΡΠ° ΠΈΠ³ΡΠΎΠΊΠ° ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΡΡΠΌΠ½ΠΎ-ΠΊΡΠ°ΡΠ½ΡΠΌΠΈ, Π±ΡΠ΄ΡΠΎ ΠΎΠ½ ΡΠ³ΠΎΡΠ΅Π». ΠΠΎΠ³Π΄Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΌΠΎΠ½Π΅ΡΠΊΠ° ΡΠΎΠ±ΡΠ°Π½Π°, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ°Π·ΠΌΡΡΡΠ΅ ΡΠ΅Π½ΠΈ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠ° ΡΠΈΡΠ½ΠΈΡ.
ΠΠ΅Π»ΡΠ·Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ ΡΡΠΎΠ²Π½ΠΈ Π²ΡΠ΅Π³Π΄Π° Π²ΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΎΠΊΠ½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ°. ΠΠΎΡΡΠΎΠΌΡ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ scrollPlayerIntoView β ΠΎΠ½ Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΡΠΎΠ²Π΅Π½Ρ Π½Π΅ Π²Π»Π΅Π·Π°Π΅Ρ Π² ΠΎΠΊΠ½ΠΎ, ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΊΡΡΡΠ΅Π½, ΡΡΠΎΠ±Ρ ΠΈΠ³ΡΠΎΠΊ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ» Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ ΡΠ΅Π½ΡΡΡ. Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ CSS Π·Π°Π΄Π°ΡΡ ΠΎΠ±ΡΡΡΠΊΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ, ΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π²ΡΡ Π²ΡΠ»Π΅Π·Π°ΡΡΠ΅Π΅ Π·Π° Π½Π΅Π³ΠΎ Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ Π·Π°Π΄Π°ΡΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ relative, ΡΡΠΎΠ±Ρ Π°ΠΊΡΡΡΡ Π²Π½ΡΡΡΠΈ Π½Π΅Π³ΠΎ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π»ΠΈΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΠ³Π»Π°.
.game {
overflow: hidden;
max-width: 600px;
max-height: 450px;
position: relative;
}
Π ΠΌΠ΅ΡΠΎΠ΄Π΅ scrollPlayerIntoView ΠΌΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ³ΡΠΎΠΊΠ° ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ ΠΎΠ±ΡΡΡΡΠ²Π°ΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. ΠΡ ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ, ΡΠ°Π±ΠΎΡΠ°Ρ ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ scrollLeft ΠΈ scrollTop, ΠΊΠΎΠ³Π΄Π° ΠΈΠ³ΡΠΎΠΊ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ ΠΊΡΠ°Ρ.
DOMDisplay.prototype.scrollPlayerIntoView = function() {
var width = this.wrap.clientWidth;
var height = this.wrap.clientHeight;
var margin = width / 3;
// The viewport
var left = this.wrap.scrollLeft, right = left + width;
var top = this.wrap.scrollTop, bottom = top + height;
var player = this.level.player;
var center = player.pos.plus(player.size.times(0.5))
.times(scale);
if (center.x < left + margin)
this.wrap.scrollLeft = center.x - margin;
else if (center.x > right - margin)
this.wrap.scrollLeft = center.x + margin - width;
if (center.y < top + margin)
this.wrap.scrollTop = center.y - margin;
else if (center.y > bottom - margin)
this.wrap.scrollTop = center.y + margin - height;
};
ΠΠ΅ΡΠΎΠ΄ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΅Π½ΡΡΠ° ΠΈΠ³ΡΠΎΠΊΠ° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΌΠ΅ΡΠΎΠ΄Ρ Π½Π°ΡΠΈΡ ΡΠΈΠΏΠΎΠ² Vector ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠ°ΡΡΡΡΡ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΠ΅ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ, Π½Π°Π³Π»ΡΠ΄Π½ΠΎ. Π§ΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΡΠ΅Π½ΡΡ Π°ΠΊΡΡΡΠ°, ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΡ (Π΅Π³ΠΎ Π»Π΅Π²ΡΠΉ Π²Π΅ΡΡ Π½ΠΈΠΉ ΡΠ³ΠΎΠ») ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ Π²ΡΡΠΎΡΡ. ΠΡΠΎ ΡΠ΅Π½ΡΡ Π² ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°Ρ ΡΡΠΎΠ²Π½Ρ, Π½ΠΎ Π½Π°ΠΌ ΠΎΠ½ Π½ΡΠΆΠ΅Π½ Π² ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°Ρ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΡΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ Π²Π΅ΠΊΡΠΎΡ Π½Π° Π½Π°Ρ ΠΌΠ°ΡΡΡΠ°Π±.
ΠΠ°ΡΠ΅ΠΌ ΡΠ΅ΡΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ ΠΈΠ³ΡΠΎΠΊ Π½Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°. ΠΠ½ΠΎΠ³Π΄Π° Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π±ΡΠ΄ΡΡ Π·Π°Π΄Π°Π½Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ, Π½ΠΈΠΆΠ΅ Π½ΡΠ»Ρ ΠΈΠ»ΠΈ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΎΠΊΡΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. ΠΠΎ ΡΡΠΎ Π½Π΅ ΡΡΡΠ°ΡΠ½ΠΎ β DOM Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡ ΠΈΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΡΠ»ΠΈ Π½Π°Π·Π½Π°ΡΠΈΡΡ scrollLeft Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ -10, ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π΅Π½ 0.
ΠΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ ΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠΊΡΡΡΠΈΠ²Π°ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° Π² ΡΠ΅Π½ΡΡ ΠΎΠΊΠ½Π° ΠΏΡΠΎΡΠΌΠΎΡΡΠ° β Π½ΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π΅ΠΏΡΠΈΡΡΠ½ΡΠΉ Π΄ΡΠΎΠΆΠ°ΡΠΈΠΉ ΡΡΡΠ΅ΠΊΡ. ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΡΠΆΠΊΠΎΠ² Π²ΠΈΠ΄ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ Π²Π²Π΅ΡΡ ΠΈ Π²Π½ΠΈΠ·. ΠΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠΈΡΡΠ½Π΅Π΅ ΠΈΠΌΠ΅ΡΡ Β«Π½Π΅ΠΉΡΡΠ°Π»ΡΠ½ΡΡΒ» Π·ΠΎΠ½Ρ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ ΡΠΊΡΠ°Π½Π°, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ, Π½Π΅ Π²ΡΠ·ΡΠ²Π°Ρ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ.
ΠΡΡ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠΈΡΠ°ΡΡ ΡΡΠΎΠ²Π΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΈΠ»ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Π·Π°Π½ΠΎΠ²ΠΎ.
DOMDisplay.prototype.clear = function() {
this.wrap.parentNode.removeChild(this.wrap);
};
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π½Π°Ρ ΡΡΠΎΠ²Π΅Π½Ρ.
<link rel="stylesheet" href="css/game.css">
<script>
var simpleLevel = new Level(simpleLevelPlan);
var display = new DOMDisplay(document.body, simpleLevel);
</script>
Π’ΡΠ³ <link> ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ rel="stylesheet" ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΠ°ΠΉΠ» Ρ CSS. Π€Π°ΠΉΠ» game.css ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΠΈΠ³ΡΡ ΡΡΠΈΠ»ΠΈ.
ΠΠ²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ β ΡΠ°ΠΌΠΎΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ΅ Π² ΠΈΠ³ΡΠ΅. ΠΡΠΎΡΡΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ³Ρ β ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΎΡΡΠ΅Π·ΠΊΠΈ, ΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ ΡΠ΄Π²ΠΈΠ³Π°ΡΡ Π°ΠΊΡΡΡΠΎΠ² Π½Π° Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΠΈΡ ΡΠΊΠΎΡΠΎΡΡΠΈ (ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ), ΡΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π½Π° Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡΡΠ΅Π·ΠΊΠ° (Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ ).
ΠΡΠΎ ΠΏΡΠΎΡΡΠΎ. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½Π°Π΄ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠΎΠ². ΠΠΎΠ³Π΄Π° ΠΈΠ³ΡΠΎΠΊ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»Π° ΠΈΠ»ΠΈ ΡΡΠ΅Π½Ρ, ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ Π½Π°ΡΠΊΠ²ΠΎΠ·Ρ. ΠΠ³ΡΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΠΌΠ΅ΡΠ°ΡΡ, ΠΊΠΎΠ³Π΄Π° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΈ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. Π‘ΡΠ΅Π½Ρ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅, ΠΌΠΎΠ½Π΅ΡΡ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ, ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ° Π·Π°Π΄Π°ΡΠ° Π½Π΅ ΡΠ°ΠΊΠ°Ρ ΠΏΡΠΎΡΡΠ°Ρ. ΠΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΎΠ±ΡΡΠ½ΠΎ Π½Π°Π·ΡΠ²Π°ΡΡΠΈΠ΅ΡΡ Β«ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈΒ», ΡΠΈΠΌΡΠ»ΠΈΡΡΡΡΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Π² Π΄Π²ΡΡ ΠΈΠ»ΠΈ ΡΡΡΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡΡ . Π ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ ΠΏΠΎΡΡΡΠΏΠΈΠΌ ΠΏΡΠΎΡΠ΅, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΠ΄Π²ΠΈΠ½ΡΡΡ ΠΈΠ³ΡΠΎΠΊΠ° ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊ Π»Π°Π²Ρ, ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π½Π΅ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ Π»ΠΈ Π½Π°Ρ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²Π½ΡΡΡΡ Π½Π΅ΠΏΡΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΠΎΠ½Π°. ΠΡΠ»ΠΈ Π΄Π° β ΠΌΡ ΠΎΡΠΌΠ΅Π½ΡΠ΅ΠΌ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅. Π Π΅Π°ΠΊΡΠΈΡ Π½Π° ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΡΠΈΠΏΠ° Π°ΠΊΡΡΡΠ° β ΠΈΠ³ΡΠΎΠΊ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ, Π»Π°Π²Π° ΠΎΡΡΠΊΠ°ΠΊΠΈΠ²Π°Π΅Ρ.
ΠΠΎΠ΄Ρ ΠΎΠ΄ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΎΡΡΠ΅Π·ΠΊΠΎΠ² Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π»ΠΈΡΡ Π΄ΠΎ ΡΠΎΠΏΡΠΈΠΊΠΎΡΠ½ΠΎΠ²Π΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π²Π·ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΎΡΡΠ΅Π·ΠΊΠΈ, ΠΈΠ³ΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ Π·Π°Π²ΠΈΡΠ°ΡΡ Π½Π°Π΄ Π·Π΅ΠΌΠ»ΡΠΉ. ΠΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ β Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΌΠ΅ΡΡΠΎ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΏΡΠΈΠΊΠΎΡΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ΄Π²ΠΈΠ½ΡΡΡ Π°ΠΊΡΡΡΠ° ΡΡΠ΄Π°. ΠΡ ΠΏΠΎΡΡΡΠΏΠΈΠΌ ΠΏΡΠΎΡΠ΅, ΠΈ ΡΠΊΡΠΎΠ΅ΠΌ Π΅Π³ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π²ΡΠ±ΡΠ°Π² Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΡΡΠ΅Π·ΠΊΠΈ.
ΠΠ΅ΡΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ, Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°Π΅ΡΡΡ Π»ΠΈ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ (Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ) Ρ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ Π½Π΅ΠΏΡΡΡΡΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΠΌ ΡΠΎΠ½ΠΎΠ²ΠΎΠΉ ΡΠ΅ΡΡΡΠΊΠΈ.
Level.prototype.obstacleAt = function(pos, size) {
var xStart = Math.floor(pos.x);
var xEnd = Math.ceil(pos.x + size.x);
var yStart = Math.floor(pos.y);
var yEnd = Math.ceil(pos.y + size.y);
if (xStart < 0 || xEnd > this.width || yStart < 0)
return "wall";
if (yEnd > this.height)
return "lava";
for (var y = yStart; y < yEnd; y++) {
for (var x = xStart; x < xEnd; x++) {
var fieldType = this.grid[y][x];
if (fieldType) return fieldType;
}
}
};
ΠΠ΅ΡΠΎΠ΄ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡΠ΅ ΡΠ΅Π»ΠΎΠΌ ΡΡΠ΅ΠΉΠΊΠΈ ΡΠ΅ΡΡΡΠΊΠΈ, ΠΏΡΠΈΠΌΠ΅Π½ΡΡ Math.floor ΠΈ Math.ceil Π½Π° ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°Ρ ΡΠ΅Π»Π°. ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΡΠ΅Π΅ΠΊ β 1Γ1 Π΅Π΄ΠΈΠ½ΠΈΡ. ΠΠΊΡΡΠ³Π»ΡΡ Π³ΡΠ°Π½ΠΈΡΡ ΡΠ΅Π»Π° Π²Π²Π΅ΡΡ ΠΈ Π²Π½ΠΈΠ·, ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΠΊ ΠΈΠ· ΡΡΠ΅Π΅ΠΊ ΡΠΎΠ½Π°, ΠΊΠΎΡΠΎΡΡΡ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΡΠ΅Π»ΠΎ.
ΠΠΎΠΈΡΠΊ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΉ Π½Π° ΡΠ΅ΡΡΡΠΊΠ΅
ΠΡΠ»ΠΈ ΡΠ΅Π»ΠΎ Π²ΡΡΠΎΠ²ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· ΡΡΠΎΠ²Π½Ρ, ΠΌΡ Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ βwallβ Π΄Π»Ρ Π΄Π²ΡΡ ΡΡΠΎΡΠΎΠ½ ΠΈ Π²Π΅ΡΡ Π° ΠΈ βlavaβ Π΄Π»Ρ Π½ΠΈΠ·Π°. ΠΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡ Π³ΠΈΠ±Π΅Π»Ρ ΠΈΠ³ΡΠΎΠΊΠ° ΠΏΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΡΡΠΎΠ²Π½Ρ. ΠΠΎΠ³Π΄Π° ΡΠ΅Π»ΠΎ Π²Π½ΡΡΡΠΈ ΡΠ΅ΡΡΡΠΊΠΈ, ΠΌΡ Π² ΡΠΈΠΊΠ»Π΅ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΠΌ Π±Π»ΠΎΠΊ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΎΠ² ΡΠ΅ΡΡΡΠΊΠΈ, Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠΉ ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ, ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π½Π΅ΠΏΡΡΡΠΎΠ³ΠΎ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΠΊΠ°.
Π‘ΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ° Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π°ΠΊΡΡΡΠ°ΠΌΠΈ (ΠΌΠΎΠ½Π΅ΡΡ, Π΄Π²ΠΈΠΆΡΡΠ°ΡΡΡ Π»Π°Π²Π°) ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠ΄Π²ΠΈΠ³Π° ΠΈΠ³ΡΠΎΠΊΠ°. ΠΠΎΠ³Π΄Π° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ Π΅Π³ΠΎ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ Π°ΠΊΡΡΡΡ, ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΡΡΠ΅ΠΊΡ (ΡΠ±ΠΎΡ ΠΌΠΎΠ½Π΅Ρ ΠΈΠ»ΠΈ Π³ΠΈΠ±Π΅Π»Ρ).
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ ΠΌΠ°ΡΡΠΈΠ² Π°ΠΊΡΡΡΠΎΠ², Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΡΠΎΠ³ΠΎ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΡΡΡ Π½Π° Π·Π°Π΄Π°Π½Π½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ:
Level.prototype.actorAt = function(actor) {
for (var i = 0; i < this.actors.length; i++) {
var other = this.actors[i];
if (other != actor &&
actor.pos.x + actor.size.x > other.pos.x &&
actor.pos.x < other.pos.x + other.size.x &&
actor.pos.y + actor.size.y > other.pos.y &&
actor.pos.y < other.pos.y + other.size.y)
return other;
}
};
ΠΠΊΡΡΡΡ ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
ΠΠ΅ΡΠΎΠ΄ animate ΡΠΈΠΏΠ° Level Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠ΅ΠΌ Π°ΠΊΡΡΡΠ°ΠΌ ΡΡΠΎΠ²Π½Ρ ΡΠ΄Π²ΠΈΠ½ΡΡΡΡΡ. ΠΡΠ³ΡΠΌΠ΅Π½Ρ step Π·Π°Π΄Π°ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΠΊ. ΠΠ±ΡΠ΅ΠΊΡ keys ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΡΠΎ ΡΡΡΠ΅Π»ΠΊΠΈ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ, Π½Π°ΠΆΠ°ΡΡΠ΅ ΠΈΠ³ΡΠΎΠΊΠΎΠΌ.
var maxStep = 0.05;
Level.prototype.animate = function(step, keys) {
if (this.status != null)
this.finishDelay -= step;
while (step > 0) {
var thisStep = Math.min(step, maxStep);
this.actors.forEach(function(actor) {
actor.act(thisStep, this, keys);
}, this);
step -= thisStep;
}
};
ΠΠΎΠ³Π΄Π° Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΡΠΎΠ²Π½Ρ status Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΎΡΠ»ΠΈΡΠ½ΠΎΠ΅ ΠΎΡ null (Π° ΡΡΠΎ Π±ΡΠ²Π°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° ΠΈΠ³ΡΠΎΠΊ Π²ΡΠΈΠ³ΡΠ°Π» ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»), ΠΌΡ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ Π΄ΠΎ Π½ΡΠ»Ρ ΡΡΡΡΡΠΈΠΊ finishDelay, ΡΡΠΈΡΠ°ΡΡΠΈΠΉ Π²ΡΠ΅ΠΌΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠΈΠ·ΠΎΡΡΠ» Π²ΡΠΈΠ³ΡΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΠ³ΡΡΡ ΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ΠΎ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡ ΠΏΠΎΠΊΠ°Π· ΡΡΠΎΠ²Π½Ρ.
Π¦ΠΈΠΊΠ» while Π΄Π΅Π»ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π½Π° ΡΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ ΠΊΡΡΠΊΠΈ. ΠΠ½ ΡΠ»Π΅Π΄ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠΈ Π±ΡΠ»ΠΈ Π½Π΅ Π±ΠΎΠ»ΡΡΠ΅ maxStep. Π ΠΏΡΠΈΠΌΠ΅ΡΡ, ΡΠ°Π³ Π² 0,12 ΡΠ΅ΠΊΡΠ½Π΄Ρ Π±ΡΠ΄Π΅Ρ Π½Π°ΡΠ΅Π·Π°Π½ Π½Π° Π΄Π²Π° ΡΠ°Π³Π° ΠΏΠΎ 0,05 ΠΈ ΠΎΡΡΠ°ΡΠΎΠΊ Π² 0,02
Π£ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π°ΠΊΡΡΡΠΎΠ² Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ act, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ°Π³, ΠΎΠ±ΡΠ΅ΠΊΡ level ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ keys. ΠΠΎΡ ΠΎΠ½ Π΄Π»Ρ ΡΠΈΠΏΠ° Lava, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ key:
Lava.prototype.act = function(step, level) {
var newPos = this.pos.plus(this.speed.times(step));
if (!level.obstacleAt(newPos, this.size))
this.pos = newPos;
else if (this.repeatPos)
this.pos = this.repeatPos;