added entitys, enemys, bats and custom attack hitboxes for players
added map loading and one-way collision (needs to move to tiled attribute tho) Signed-off-by: Pascal Syma <pascal@syma.dev>
|
After Width: | Height: | Size: 943 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 176 KiB |
@@ -0,0 +1,489 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.2" tiledversion="1.2.5" orientation="orthogonal" renderorder="right-down" width="48" height="17" tilewidth="16" tileheight="16" infinite="0" nextlayerid="20" nextobjectid="7">
|
||||
<tileset firstgid="1" name="tileset" tilewidth="16" tileheight="16" spacing="2" margin="1" tilecount="88" columns="8">
|
||||
<image source="tileset.png" trans="ff00ff" width="144" height="198"/>
|
||||
<tile id="0">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="1">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="2">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="3">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="4">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="5">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="6">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="7">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="8">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="9">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="10">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="11">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="12">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="13">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="14">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="15">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="16">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="17">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="18">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="19">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="20">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="21">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="22">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="23">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="24">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="25">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="26">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="27">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="28">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="29">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="30">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="31">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="32">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="33">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="34">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="35">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="36">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="37">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="38">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="39">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="40">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="41">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="42">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="43">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="44">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="45">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="46">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="47">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="48">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="49">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="50">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="51">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="52">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="53">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="54">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="55">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="56">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="57">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="58">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="59">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="60">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="61">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="62">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="63">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="64">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="65">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="66">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="67">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="68">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="69">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="70">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="71">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="72">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="73">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="74">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="75">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="true"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="76">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="77">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="78">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="79">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="80">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="81">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="82">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="83">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="84">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="85">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="86">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
<tile id="87">
|
||||
<properties>
|
||||
<property name="collides" type="bool" value="false"/>
|
||||
</properties>
|
||||
</tile>
|
||||
</tileset>
|
||||
<layer id="16" name="Back" width="48" height="17">
|
||||
<data encoding="base64">
|
||||
LQAAADUAAAAtAAAALQAAADQAAAA0AAAALQAAAC0AAAA0AAAANAAAADQAAAAtAAAANAAAADUAAAAtAAAANQAAADQAAAA1AAAALQAAADUAAAA0AAAALQAAAC0AAAA1AAAANAAAADUAAAA1AAAANQAAAC0AAAA1AAAANQAAADUAAAA1AAAANQAAADQAAAA0AAAALQAAAC0AAAA0AAAANQAAADUAAAAtAAAANQAAADUAAAA1AAAALQAAADQAAAA0AAAANQAAADUAAAA1AAAANAAAAC0AAAA0AAAANAAAAC0AAAAtAAAANAAAADQAAAA0AAAANAAAADQAAAAtAAAANAAAAC0AAAA0AAAALQAAADQAAAAtAAAALQAAAC0AAAA0AAAANAAAADQAAAA1AAAANAAAAC0AAAA0AAAANAAAADUAAAA1AAAANQAAADQAAAA0AAAANAAAADQAAAA0AAAANQAAADUAAAAtAAAALQAAAC0AAAA1AAAANAAAADUAAAA0AAAALQAAADQAAAA0AAAANQAAADUAAAA1AAAANAAAAC0AAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANQAAAC0AAAA1AAAALQAAADQAAAAtAAAANQAAADUAAAAtAAAALQAAADQAAAA0AAAANQAAADQAAAA0AAAALQAAADQAAAA1AAAANQAAAC0AAAAtAAAANQAAADQAAAA1AAAALQAAADUAAAA0AAAANQAAADQAAAAtAAAANQAAADQAAAA0AAAANAAAAC0AAAA0AAAANQAAAC0AAAA1AAAANAAAAC0AAAAtAAAALQAAAC0AAAA1AAAANAAAAC0AAAA0AAAANQAAAC0AAAA0AAAALQAAADQAAAA1AAAANQAAADQAAAA0AAAALQAAAC0AAAAtAAAANQAAAC0AAAA0AAAALQAAADQAAAA1AAAANAAAADQAAAA0AAAANQAAADUAAAA1AAAANAAAADUAAAA0AAAANQAAADUAAAAtAAAALQAAADUAAAAtAAAANAAAADUAAAA1AAAANAAAADQAAAA1AAAANQAAADUAAAA1AAAANQAAADQAAAA0AAAALQAAADQAAAAtAAAANQAAAC0AAAA1AAAALQAAAC0AAAA0AAAALQAAADQAAAA0AAAALQAAADQAAAA0AAAANQAAADQAAAAtAAAALQAAADQAAAA0AAAANAAAAC0AAAA1AAAANQAAAC0AAAAtAAAANQAAAC0AAAA1AAAALQAAADQAAAA0AAAALQAAADQAAAAtAAAALQAAADQAAAA1AAAANQAAADQAAAA0AAAALQAAADUAAAA0AAAANAAAADQAAAA1AAAALQAAAC0AAAA0AAAALQAAADUAAAA1AAAANAAAADQAAAA0AAAANAAAAC0AAAA0AAAANQAAAC0AAAA1AAAANQAAAC0AAAA1AAAANAAAAC0AAAA1AAAALQAAAC0AAAA1AAAANAAAADQAAAA0AAAANQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAAAC0AAAA1AAAALQAAADUAAAA0AAAALQAAADUAAAAtAAAANAAAAC0AAAAtAAAANQAAAC0AAAA0AAAANAAAADQAAAA1AAAANQAAAC0AAAA1AAAANQAAAC0AAAA1AAAANAAAADUAAAA1AAAANQAAADQAAAAtAAAANQAAADUAAAA1AAAANAAAADQAAAA1AAAANAAAAC0AAAAtAAAANAAAAC0AAAAtAAAALQAAADQAAAAtAAAANAAAADQAAAA0AAAALQAAAC0AAAA0AAAANQAAADUAAAA0AAAANAAAADUAAAAtAAAALQAAADUAAAA0AAAANQAAADUAAAA0AAAANAAAAC0AAAA0AAAANAAAADQAAAAtAAAANQAAAC0AAAAtAAAANAAAADUAAAA0AAAANQAAAC0AAAA1AAAANAAAADUAAAA1AAAALQAAADQAAAA0AAAANQAAADQAAAA0AAAANAAAAC0AAAAtAAAANQAAADUAAAA1AAAALQAAADUAAAA0AAAANAAAADUAAAAtAAAALQAAAC0AAAA0AAAANAAAADQAAAAtAAAANAAAADUAAAAtAAAANQAAADUAAAA0AAAALQAAAC0AAAA0AAAALQAAADUAAAA0AAAANQAAADUAAAA0AAAANAAAADQAAAA1AAAANQAAAC0AAAA0AAAANAAAADQAAAA1AAAALQAAADQAAAA1AAAANAAAADQAAAA0AAAANQAAADQAAAA1AAAANQAAADQAAAAtAAAALQAAADUAAAAtAAAANQAAADQAAAA1AAAANQAAAC0AAAA0AAAANAAAADUAAAA0AAAALQAAAC0AAAA0AAAANQAAAC0AAAA1AAAALQAAAC0AAAAtAAAANQAAAC0AAAA1AAAANQAAADQAAAAtAAAANAAAADUAAAA1AAAALQAAADUAAAAtAAAANQAAADQAAAA1AAAANAAAAC0AAAAtAAAANQAAADUAAAAtAAAALQAAADQAAAA1AAAALQAAAC0AAAA1AAAANAAAADQAAAA0AAAANQAAAC0AAAAtAAAANQAAADUAAAA0AAAANQAAADUAAAA1AAAALQAAAC0AAAA0AAAANQAAADUAAAAtAAAANQAAADUAAAA0AAAALQAAADUAAAA0AAAANQAAADUAAAA0AAAANQAAADQAAAAtAAAANAAAAC0AAAA1AAAALQAAADUAAAAtAAAANQAAAC0AAAA1AAAALQAAADUAAAA1AAAANQAAADUAAAA0AAAALQAAADUAAAA1AAAANQAAADQAAAA1AAAALQAAADUAAAA0AAAANQAAADUAAAA0AAAANAAAADUAAAA0AAAANQAAADUAAAA1AAAANAAAADUAAAAtAAAANAAAAC0AAAA1AAAANAAAADQAAAAtAAAALQAAAC0AAAA1AAAALQAAAC0AAAAtAAAANQAAADUAAAA0AAAANAAAADQAAAA1AAAANAAAADUAAAA1AAAANQAAADQAAAA1AAAALQAAADUAAAA1AAAANQAAADQAAAAtAAAANAAAAC0AAAA0AAAALQAAADQAAAAtAAAALQAAADUAAAA0AAAANAAAAC0AAAA0AAAALQAAADUAAAA0AAAALQAAAC0AAAA0AAAANAAAAC0AAAA0AAAALQAAADQAAAA0AAAANAAAAC0AAAA0AAAALQAAADUAAAA0AAAALQAAAC0AAAA1AAAANQAAAC0AAAAtAAAANAAAAC0AAAAtAAAALQAAADQAAAA1AAAALQAAADUAAAA1AAAALQAAADUAAAAtAAAALQAAADQAAAAtAAAALQAAADQAAAA0AAAANAAAADQAAAAtAAAANQAAADUAAAA1AAAALQAAAC0AAAAtAAAALQAAADQAAAA0AAAANAAAADUAAAAtAAAALQAAADQAAAAtAAAALQAAAC0AAAA1AAAANAAAADQAAAAtAAAANQAAADQAAAA1AAAANQAAADUAAAAtAAAALQAAAC0AAAAtAAAANQAAADQAAAAtAAAANAAAADUAAAA1AAAANQAAADQAAAAtAAAANAAAADUAAAAtAAAANQAAADQAAAAtAAAALQAAAC0AAAAtAAAANAAAADUAAAA1AAAALQAAAC0AAAA1AAAANQAAADQAAAA1AAAANQAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAAtAAAALQAAADUAAAA1AAAANQAAAC0AAAA1AAAANQAAADQAAAA1AAAALQAAADQAAAA1AAAANAAAADQAAAAtAAAANAAAAC0AAAA0AAAALQAAAC0AAAA1AAAANAAAADUAAAAtAAAANQAAADUAAAA1AAAANQAAADUAAAA0AAAANQAAADUAAAA1AAAANAAAADQAAAA1AAAALQAAAC0AAAA0AAAALQAAADUAAAA0AAAANQAAAC0AAAA0AAAALQAAAC0AAAA0AAAANQAAADQAAAA1AAAALQAAAC0AAAAtAAAALQAAADQAAAAtAAAANAAAAC0AAAAtAAAANAAAADQAAAA1AAAALQAAADQAAAAtAAAANAAAADQAAAA0AAAANAAAADQAAAA1AAAALQAAADUAAAAtAAAANAAAADQAAAAtAAAANQAAAC0AAAA0AAAANAAAADUAAAA0AAAANQAAAC0AAAAtAAAANAAAADQAAAAtAAAANQAAADUAAAA1AAAALQAAADQAAAAtAAAANQAAADUAAAA1AAAANAAAADQAAAA0AAAALQAAAC0AAAA1AAAANAAAADUAAAA1AAAANQAAADQAAAAtAAAANAAAADQAAAAtAAAALQAAADQAAAAtAAAANQAAADQAAAAtAAAALQAAAC0AAAAtAAAA
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="17" name="Back2" width="48" height="17">
|
||||
<data encoding="base64">
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAaAAAAGgAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAiAAAAIgAAAB0AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAiAAAAIgAAACIAAAAdAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAiAAAAIgAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkAAAAkAAAAIgAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApAAAAJAAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQAAACoAAAAqAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="18" name="Main" width="48" height="17">
|
||||
<data encoding="base64">
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAACAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA0AAAAOAAAACwAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAABIAAAASAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHwAAAB8AAAAfAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAABAAAAAQAAAAMAAAAAwAAAAAAAAAAAAAAAQAAAAwAAAAEAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAOAAAABgAAAAYAAAANAAAACwAAAAAAAAAAAAAAEQAAABIAAAASAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="5" name="Objects">
|
||||
<object id="1" name="player" x="83.25" y="228.5">
|
||||
<point/>
|
||||
</object>
|
||||
<object id="3" name="bat" type="90" x="160.667" y="69.3333">
|
||||
<properties>
|
||||
<property name="vel" type="int" value="-90"/>
|
||||
</properties>
|
||||
<point/>
|
||||
</object>
|
||||
<object id="5" name="bat" type="-80" x="396" y="91.3333">
|
||||
<properties>
|
||||
<property name="vel" type="int" value="50"/>
|
||||
</properties>
|
||||
<point/>
|
||||
</object>
|
||||
<object id="6" name="bat" type="-50" x="587.333" y="46.6667">
|
||||
<properties>
|
||||
<property name="vel" type="int" value="90"/>
|
||||
</properties>
|
||||
<point/>
|
||||
</object>
|
||||
</objectgroup>
|
||||
<layer id="19" name="Front" width="48" height="17">
|
||||
<data encoding="base64">
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
</data>
|
||||
</layer>
|
||||
</map>
|
||||
|
After Width: | Height: | Size: 18 KiB |
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright (c) 2020. Pascal Syma <pascal@syma.dev>
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
import Hitbox from "./Hitbox";
|
||||
|
||||
export default class AttackA extends Hitbox {
|
||||
|
||||
constructor(player) {
|
||||
super(player, 5);
|
||||
|
||||
this.body.setSize(42, 32, true);
|
||||
this.body.setOffset(1, -10);
|
||||
}
|
||||
|
||||
start() {
|
||||
this.setData('active', true);
|
||||
this.player.play('attack_a', true)
|
||||
.once('animationcomplete', () => {
|
||||
this.setData('active', false)
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) 2020. Pascal Syma <pascal@syma.dev>
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
import Entity from "../Entity";
|
||||
|
||||
export default class Hitbox extends Entity {
|
||||
constructor(player, dmg) {
|
||||
super(player.scene, player.body.x, player.body.y, null);
|
||||
this.setData('dmg', dmg);
|
||||
this.player = player;
|
||||
this.setSize(0, 0);
|
||||
this.setOrigin(0, 0);
|
||||
this.alpha = 0;
|
||||
this.body.setAllowGravity(false);
|
||||
|
||||
this.setData('active', false);
|
||||
this.body.setSize(0, 0);
|
||||
}
|
||||
|
||||
update(...args) {
|
||||
this.setPosition(this.player.body.x, this.player.body.y);
|
||||
}
|
||||
|
||||
start() {
|
||||
|
||||
}
|
||||
|
||||
overlap(obj) {
|
||||
this.setData('active', false);
|
||||
obj.setData('hp', obj.getData('hp') - this.getData('dmg'));
|
||||
obj.hit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (c) 2020. Pascal Syma <pascal@syma.dev>
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
import FlyingEnemy from "./FlyingEnemy";
|
||||
|
||||
export default class Bat extends FlyingEnemy {
|
||||
|
||||
constructor(scene, spawnPoint) {
|
||||
super(scene, spawnPoint, 'batFly');
|
||||
this.setData('hp', 5);
|
||||
|
||||
this.dieAnimation = 'batDie';
|
||||
|
||||
this.body.setCollideWorldBounds(true);
|
||||
this.body.setBounceX(1);
|
||||
this.play('batIdle');
|
||||
}
|
||||
|
||||
fly(velocity) {
|
||||
this.body.velocity.x = velocity;
|
||||
}
|
||||
|
||||
update(...args) {
|
||||
this.setFlipX(this.body.velocity.x > 0);
|
||||
}
|
||||
|
||||
die() {
|
||||
this.body.velocity.x = 0;
|
||||
super.die();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* Copyright (c) 2020. Pascal Syma <pascal@syma.dev>
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
import Entity from "../Entity";
|
||||
|
||||
export default class Enemy extends Entity {
|
||||
|
||||
constructor(scene, spawnPoint, texture) {
|
||||
super(scene, spawnPoint.x, spawnPoint.y, texture);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) 2020. Pascal Syma <pascal@syma.dev>
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
import Enemy from "./Enemy";
|
||||
|
||||
export default class FlyingEnemy extends Enemy {
|
||||
|
||||
constructor(scene, spawnPoint, texture) {
|
||||
super(scene, spawnPoint, texture);
|
||||
this.body.setAllowGravity(false);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2020. Pascal Syma <pascal@syma.dev>
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
export default class Entity extends Phaser.GameObjects.Sprite {
|
||||
|
||||
constructor(scene, x, y, key) {
|
||||
super(scene, x, y, key);
|
||||
this.setData('hp', 1);
|
||||
this.setData('dmg', 0);
|
||||
this.scene = scene;
|
||||
this.scene.add.existing(this);
|
||||
this.scene.physics.world.enableBody(this, 0);
|
||||
this.hitAnimation = null;
|
||||
this.dieAnimation = null;
|
||||
}
|
||||
|
||||
hit() {
|
||||
// play hit animation
|
||||
const shouldDie = this.getData('hp') <= 0;
|
||||
if (this.hitAnimation !== null) {
|
||||
this.play(this.hitAnimation)
|
||||
.once('animationcomplete', () => {
|
||||
if (shouldDie) this.die()
|
||||
});
|
||||
} else {
|
||||
if (shouldDie)
|
||||
this.die();
|
||||
}
|
||||
}
|
||||
|
||||
die() {
|
||||
if (this.dieAnimation !== null) {
|
||||
this.play(this.dieAnimation)
|
||||
.once('animationcomplete', () => this.destroy());
|
||||
} else
|
||||
this.destroy();
|
||||
}
|
||||
|
||||
update(...args) {
|
||||
super.update(...args);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (c) 2020. Pascal Syma <pascal@syma.dev>
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
import Entity from "./Entity";
|
||||
import AttackA from "./Attacks/AttackA";
|
||||
|
||||
export default class Player extends Entity {
|
||||
|
||||
constructor(scene, spawnPoint, texture) {
|
||||
super(scene, spawnPoint.x, spawnPoint.y, texture);
|
||||
this.setData("speed", 100);
|
||||
this.setData('hp', 20);
|
||||
this.setOrigin(0.5, 1).setScale(32 / 48);
|
||||
|
||||
this.body.setSize(48, 48, false);
|
||||
this.body.setOffset(4, 16);
|
||||
|
||||
this.body.setCollideWorldBounds(true);
|
||||
this.play('idle');
|
||||
|
||||
this.attackA = new AttackA(this);
|
||||
this.attackHitbox = this.scene.add.group([
|
||||
this.attackA
|
||||
]);
|
||||
}
|
||||
|
||||
update(...args) {
|
||||
if (this.scene.dieActive()) {
|
||||
this.pause = true;
|
||||
this.play('die', true)
|
||||
.on('animationcomplete', () => {
|
||||
this.setFrame(51);
|
||||
this.scene.scene.pause();
|
||||
})
|
||||
}
|
||||
|
||||
if (this.pause)
|
||||
return;
|
||||
|
||||
this.body.velocity.x = 0;
|
||||
|
||||
// Jumping, Dashing
|
||||
if (this.scene.upActive() && this.body.blocked.down) {
|
||||
this.body.velocity.y = -this.getData('speed') * 1.5;
|
||||
} else if (this.scene.downActive() && !this.body.blocked.down) {
|
||||
this.body.velocity.y = this.getData('speed');
|
||||
}
|
||||
|
||||
// Walking L R
|
||||
if (this.scene.leftActive()) {
|
||||
this.body.velocity.x = -this.getData('speed');
|
||||
if (!this.flipX)
|
||||
this.x -= 16;
|
||||
this.setFlipX(true);
|
||||
this.body.setOffset(32 - 4, 16);
|
||||
} else if (this.scene.rightActive()) {
|
||||
this.body.velocity.x = this.getData('speed');
|
||||
if (this.flipX)
|
||||
this.x += 16;
|
||||
this.setFlipX(false);
|
||||
this.body.setOffset(4, 16);
|
||||
}
|
||||
|
||||
this.setData('speed', 100);
|
||||
|
||||
// animation
|
||||
if (this.anims.getCurrentKey().startsWith('attack_')) {
|
||||
this.setData('speed', 50);
|
||||
} else if (this.scene.keySpace.isDown) {
|
||||
// const nextAttack = [this.attackA].sort(() => 0.5 - Math.random())[0];
|
||||
// nextAttack.start();
|
||||
this.attackA.start();
|
||||
} else if (this.body.blocked.down) {
|
||||
if (this.body.velocity.x !== 0) {
|
||||
this.play('run', true);
|
||||
} else {
|
||||
this.play('idle', true);
|
||||
}
|
||||
} else if (this.anims.getCurrentKey() !== 'jump_start' && this.anims.getCurrentKey() !== 'jump') {
|
||||
// this.play('jump', true)
|
||||
this.play('jump_start', true).on('animationcomplete', () => this.play('jump', true));
|
||||
}
|
||||
|
||||
this.attackHitbox.getChildren().forEach(c => {
|
||||
c.update()
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -5,23 +5,27 @@
|
||||
|
||||
import Phaser from "phaser";
|
||||
import Menu from "./scenes/Menu";
|
||||
import Preload from "./scenes/Preload";
|
||||
import Game from "./scenes/Game";
|
||||
|
||||
const ratio = 16 / 9; // any ratio you want, 16/9 landscape or 9/16 portrait
|
||||
const DEFAULT_HEIGHT = 1080; // any height you want
|
||||
const DEFAULT_HEIGHT = 1080 / 4; // any height you want
|
||||
const DEFAULT_WIDTH = ratio * DEFAULT_HEIGHT;
|
||||
|
||||
const config = {
|
||||
type: Phaser.AUTO,
|
||||
scale: {
|
||||
mode: Phaser.Scale.FIT,
|
||||
autoCenter: Phaser.Scale.CENTER_BOTH,
|
||||
width: DEFAULT_WIDTH,
|
||||
height: DEFAULT_HEIGHT
|
||||
},
|
||||
parent: "phaser-example",
|
||||
scene: [Menu],
|
||||
// pixelArt: true,
|
||||
// roundPixels: true
|
||||
type: Phaser.AUTO,
|
||||
scale: {
|
||||
mode: Phaser.Scale.FIT,
|
||||
autoCenter: Phaser.Scale.CENTER_BOTH,
|
||||
width: DEFAULT_WIDTH,
|
||||
height: DEFAULT_HEIGHT
|
||||
},
|
||||
parent: "phaser-example",
|
||||
scene: [Preload, Menu, Game],
|
||||
pixelArt: true,
|
||||
antialias: false,
|
||||
// pixelArt: true,
|
||||
// roundPixels: true
|
||||
};
|
||||
|
||||
const game = new Phaser.Game(config);
|
||||
|
||||
@@ -0,0 +1,229 @@
|
||||
/*
|
||||
* Copyright (c) 2020. Pascal Syma <pascal@syma.dev>
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
import Player from "../entities/Player";
|
||||
import Bat from "../entities/Enemys/Bat";
|
||||
|
||||
export default class Game extends Phaser.Scene {
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
key: "Game",
|
||||
pixelArt: true,
|
||||
physics: {
|
||||
default: 'arcade',
|
||||
arcade: {
|
||||
gravity: {y: 300},
|
||||
// debug: true
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static setTileCollision(mapLayer, idxOrArray, dirs) {
|
||||
|
||||
let mFunc; // tile index matching function
|
||||
if (idxOrArray.length) {
|
||||
// if idxOrArray is an array, use a function with a loop
|
||||
mFunc = function (inp) {
|
||||
for (let i = 0; i < idxOrArray.length; i++) {
|
||||
if (idxOrArray[i] === inp - 1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
} else {
|
||||
// if idxOrArray is a single number, use a simple function
|
||||
mFunc = function (inp) {
|
||||
return inp - 1 === idxOrArray;
|
||||
};
|
||||
}
|
||||
|
||||
// get the 2-dimensional tiles array for this layer
|
||||
// const d = mapLayer.map.layers[mapLayer.index].data;
|
||||
const d = mapLayer.layer.data;
|
||||
|
||||
for (let i = 0; i < d.length; i++) {
|
||||
for (let j = 0; j < d[i].length; j++) {
|
||||
const t = d[i][j];
|
||||
if (mFunc(t.index)) {
|
||||
|
||||
t.collideUp = dirs.top;
|
||||
t.collideDown = dirs.bottom;
|
||||
t.collideLeft = dirs.left;
|
||||
t.collideRight = dirs.right;
|
||||
|
||||
t.faceTop = dirs.top;
|
||||
t.faceBottom = dirs.bottom;
|
||||
t.faceLeft = dirs.left;
|
||||
t.faceRight = dirs.right;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
create() {
|
||||
|
||||
this.anims.create({
|
||||
key: 'idle',
|
||||
frames: this.anims.generateFrameNumbers('char', {start: 126, end: 131}),
|
||||
frameRate: 10,
|
||||
repeat: -1
|
||||
});
|
||||
|
||||
this.anims.create({
|
||||
key: 'run',
|
||||
frames: this.anims.generateFrameNumbers('char', {start: 154, end: 161}),
|
||||
frameRate: 10,
|
||||
repeat: -1
|
||||
});
|
||||
|
||||
this.anims.create({
|
||||
key: 'jump_start',
|
||||
frames: this.anims.generateFrameNumbers('char', {start: 140, end: 143}),
|
||||
frameRate: 10
|
||||
});
|
||||
|
||||
this.anims.create({
|
||||
key: 'jump',
|
||||
frames: this.anims.generateFrameNumbers('char', {start: 144, end: 145}),
|
||||
frameRate: 10,
|
||||
repeat: -1
|
||||
});
|
||||
|
||||
this.anims.create({
|
||||
key: 'attack_a',
|
||||
frames: this.anims.generateFrameNumbers('char', {start: 0, end: 13}),
|
||||
frameRate: 15
|
||||
});
|
||||
|
||||
this.anims.create({
|
||||
key: 'attack_b',
|
||||
frames: this.anims.generateFrameNumbers('char', {start: 14, end: 26}),
|
||||
frameRate: 15
|
||||
});
|
||||
|
||||
this.anims.create({
|
||||
key: 'attack_c',
|
||||
frames: this.anims.generateFrameNumbers('char', {start: 28, end: 41}),
|
||||
frameRate: 15
|
||||
});
|
||||
|
||||
this.anims.create({
|
||||
key: 'die',
|
||||
frames: this.anims.generateFrameNumbers('char', {start: 42, end: 51}),
|
||||
frameRate: 10
|
||||
});
|
||||
|
||||
this.anims.create({
|
||||
key: 'batIdle',
|
||||
frames: this.anims.generateFrameNumbers('batFly', {start: 0, end: 5}),
|
||||
frameRate: 10,
|
||||
repeat: -1
|
||||
});
|
||||
|
||||
this.anims.create({
|
||||
key: 'batDie',
|
||||
frames: this.anims.generateFrameNumbers('batDie', {start: 0, end: 4}),
|
||||
frameRate: 15
|
||||
});
|
||||
|
||||
|
||||
const map = this.make.tilemap({key: "map"});
|
||||
const tileset = map.addTilesetImage("tileset", "tiles", 16, 16, 1, 2);
|
||||
|
||||
this.backLayer = map.createStaticLayer("Back", tileset, 0, 0);
|
||||
this.backLayer2 = map.createStaticLayer("Back2", tileset, 0, 0);
|
||||
|
||||
this.worldLayer = map.createDynamicLayer("Main", tileset, 0, 0);
|
||||
|
||||
|
||||
const spawnPoint = map.findObject("Objects", obj => obj.name === "player");
|
||||
|
||||
this.enemys = this.add.group();
|
||||
this.player = new Player(this, spawnPoint, 'char');
|
||||
|
||||
const batSpawns = map.objects[0].objects.filter(obj => obj.name === "bat");
|
||||
|
||||
|
||||
batSpawns.forEach(s => {
|
||||
let bat = new Bat(this, s);
|
||||
bat.fly(s.type === "" ? 90 : parseInt(s.type));
|
||||
this.enemys.add(bat)
|
||||
});
|
||||
|
||||
|
||||
this.worldLayer.setCollisionByProperty({collides: true});
|
||||
Game.setTileCollision(this.worldLayer, [29, 30, 31, 39], {
|
||||
top: true,
|
||||
bottom: false,
|
||||
right: false,
|
||||
left: false
|
||||
})
|
||||
|
||||
this.physics.world.bounds.width = this.backLayer.width;
|
||||
this.physics.world.bounds.height = this.backLayer.height;
|
||||
|
||||
this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
|
||||
|
||||
|
||||
this.cameras.main.setBackgroundColor('#ccccff');
|
||||
|
||||
|
||||
this.cameras.main.startFollow(this.player);
|
||||
|
||||
this.physics.add.collider(this.player, this.worldLayer);
|
||||
this.physics.add.overlap(this.player.attackHitbox, this.enemys, (h, b) => {
|
||||
if (h.getData('active') && h.overlap !== undefined) {
|
||||
h.overlap(b);
|
||||
}
|
||||
})
|
||||
|
||||
this.keyW = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.W);
|
||||
this.keyS = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.S);
|
||||
this.keyA = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.A);
|
||||
this.keyD = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.D);
|
||||
this.keySpace = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE);
|
||||
this.keyUp = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.UP);
|
||||
this.keyLeft = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.LEFT);
|
||||
this.keyRight = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.RIGHT);
|
||||
this.keyDown = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.DOWN);
|
||||
this.keyDie = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.C);
|
||||
}
|
||||
|
||||
update(time, delta) {
|
||||
this.enemys.getChildren().forEach(c => {
|
||||
c.update()
|
||||
});
|
||||
this.player.update(time, delta);
|
||||
|
||||
}
|
||||
|
||||
dieActive() {
|
||||
return this.keyDie.isDown;
|
||||
}
|
||||
|
||||
rightActive() {
|
||||
return this.keyRight.isDown || this.keyD.isDown/* || (this.game.input.activePointer.isDown &&
|
||||
this.game.input.activePointer.x > 2*this.game.config.width/3)*/;
|
||||
}
|
||||
|
||||
leftActive() {
|
||||
return this.keyLeft.isDown || this.keyA.isDown/* || (this.game.input.activePointer.isDown &&
|
||||
this.game.input.activePointer.x < this.game.config.width/3)*/;
|
||||
}
|
||||
|
||||
downActive() {
|
||||
return this.keyDown.isDown || this.keyS.isDown/* || (this.game.input.activePointer.isDown &&
|
||||
this.game.input.activePointer.y > 2*this.game.config.height/3)*/;
|
||||
}
|
||||
|
||||
upActive() {
|
||||
return this.keyUp.isDown || this.keyW.isDown/* || (this.game.input.activePointer.isDown &&
|
||||
this.game.input.activePointer.y < this.game.config.height/3)*/;
|
||||
}
|
||||
}
|
||||
@@ -3,29 +3,53 @@
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
import logoImg from "../assets/logo.png";
|
||||
import Player from "../entities/Player";
|
||||
|
||||
export default class Menu extends Phaser.Scene {
|
||||
|
||||
constructor() {
|
||||
super("Menu");
|
||||
}
|
||||
|
||||
preload() {
|
||||
this.load.image("logo", logoImg);
|
||||
}
|
||||
|
||||
create() {
|
||||
const logo = this.add.image(this.cameras.main.centerX, this.cameras.main.centerY * 1.5, "logo").setOrigin(0.5, 0.5);
|
||||
|
||||
this.tweens.add({
|
||||
targets: logo,
|
||||
y: this.cameras.main.centerY,
|
||||
duration: 2000,
|
||||
ease: "Power2",
|
||||
yoyo: true,
|
||||
loop: -1
|
||||
super({
|
||||
key: "Menu",
|
||||
pixelArt: true,
|
||||
physics: {
|
||||
default: 'arcade',
|
||||
arcade: {
|
||||
gravity: {y: 0},
|
||||
// debug: true
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
create() {
|
||||
const w = this.cameras.main.centerX;
|
||||
const h = this.cameras.main.centerY;
|
||||
[{x: w / 2, y: h / 2, key: 'A'},
|
||||
{x: w / 2 + w, y: h / 2, key: 'B'},
|
||||
{x: w / 2, y: h / 2 + h, key: 'C'},
|
||||
{x: w / 2 + w, y: h / 2 + h, key: 'D'}]
|
||||
.forEach((e) => this.addOption(e));
|
||||
|
||||
}
|
||||
|
||||
addOption(options) {
|
||||
this.anims.create({
|
||||
key: 'idle' + options.key,
|
||||
frames: this.anims.generateFrameNumbers('char' + options.key, {start: 126, end: 131}),
|
||||
frameRate: 10,
|
||||
repeat: -1
|
||||
});
|
||||
|
||||
new Player(this, options, 'char' + options.key).play('idle' + options.key, true)
|
||||
.setInteractive()
|
||||
.on('pointerdown', () => {
|
||||
|
||||
this.textures.addSpriteSheet('char', this.textures.get('char' + options.key).getSourceImage(), {
|
||||
frameWidth: 79,
|
||||
frameHeight: 63
|
||||
});
|
||||
|
||||
this.scene.start('Game');
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2020. Pascal Syma <pascal@syma.dev>
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
import logoImg from "../../public/favicon.png";
|
||||
import map from "../assets/map.json";
|
||||
import charA from "../assets/char_a/spritesheet.png";
|
||||
import charB from "../assets/char_b/spritesheet.png";
|
||||
import charC from "../assets/char_c/spritesheet.png";
|
||||
import charD from "../assets/char_d/spritesheet.png";
|
||||
import tiles from "../assets/tileset.png";
|
||||
import batFly from "../assets/BatFly.png";
|
||||
import batDie from "../assets/BatDie.png";
|
||||
|
||||
export default class Preload extends Phaser.Scene {
|
||||
|
||||
constructor() {
|
||||
super('Loading');
|
||||
}
|
||||
|
||||
preload() {
|
||||
this.loadingScreen();
|
||||
this.load.image("logo", logoImg);
|
||||
this.load.spritesheet('charA', charA, {frameWidth: 79, frameHeight: 63/*, margin: 1, spacing: 2*/});
|
||||
this.load.spritesheet('charB', charB, {frameWidth: 79, frameHeight: 63/*, margin: 1, spacing: 2*/});
|
||||
this.load.spritesheet('charC', charC, {frameWidth: 79, frameHeight: 63/*, margin: 1, spacing: 2*/});
|
||||
this.load.spritesheet('charD', charD, {frameWidth: 79, frameHeight: 63/*, margin: 1, spacing: 2*/});
|
||||
this.load.spritesheet('tiles', tiles, {frameWidth: 16, frameHeight: 16, margin: 1, spacing: 2});
|
||||
this.load.spritesheet('batFly', batFly, {frameWidth: 48, frameHeight: 32/*, margin: 1, spacing: 2*/});
|
||||
this.load.spritesheet('batDie', batDie, {frameWidth: 48, frameHeight: 32/*, margin: 1, spacing: 2*/});
|
||||
this.load.tilemapTiledJSON("map", map);
|
||||
}
|
||||
|
||||
create() {
|
||||
this.add.image(this.cameras.main.centerX, this.cameras.main.centerY, 'logo').setOrigin(0.5, 0.5).setDisplaySize(this.cameras.main.centerX, this.cameras.main.centerX);
|
||||
setTimeout(() => {
|
||||
this.scene.start('Menu');
|
||||
}, 2 * 1000)
|
||||
}
|
||||
|
||||
loadingScreen() {
|
||||
const progressBar = this.add.graphics();
|
||||
const progressBox = this.add.graphics();
|
||||
const width = this.cameras.main.width;
|
||||
const height = this.cameras.main.height;
|
||||
|
||||
progressBox.fillStyle(0x222222, 0.8);
|
||||
progressBox.fillRect(width / 4, height / 2 - 25, width / 2, 50);
|
||||
|
||||
const loadingText = this.make.text({
|
||||
x: width / 2,
|
||||
y: height / 2 - 25 - 20,
|
||||
text: 'Loading...',
|
||||
style: {
|
||||
font: '20px monospace',
|
||||
fill: '#ffffff'
|
||||
}
|
||||
});
|
||||
loadingText.setOrigin(0.5, 1);
|
||||
|
||||
const percentText = this.make.text({
|
||||
x: width / 2,
|
||||
y: height / 2,
|
||||
text: '0%',
|
||||
style: {
|
||||
font: '18px monospace',
|
||||
fill: '#ffffff'
|
||||
}
|
||||
});
|
||||
percentText.setOrigin(0.5, 0.5);
|
||||
|
||||
this.load.on('progress', (value) => {
|
||||
percentText.setText(parseInt(value * 100) + '%');
|
||||
progressBar.clear();
|
||||
progressBar.fillStyle(0xffffff, 1);
|
||||
progressBar.fillRect(width / 4 + 10, height / 2 - 25 + 10, (width / 2 - 20) * value, 50 - 20);
|
||||
});
|
||||
|
||||
this.load.on('complete', () => {
|
||||
progressBar.destroy();
|
||||
progressBox.destroy();
|
||||
loadingText.destroy();
|
||||
percentText.destroy();
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||