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>
This commit is contained in:
2020-05-20 11:13:21 +02:00
parent 4a22dbe657
commit a726db1306
22 changed files with 2166 additions and 30 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 943 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

+1047
View File
File diff suppressed because it is too large Load Diff
+489
View File
@@ -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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

+24
View File
@@ -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)
});
}
}
+35
View File
@@ -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();
}
}
+33
View File
@@ -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();
}
}
+13
View File
@@ -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);
}
}
+15
View File
@@ -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);
}
}
+44
View File
@@ -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);
}
}
+90
View File
@@ -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()
});
}
}
+6 -2
View File
@@ -5,9 +5,11 @@
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 = {
@@ -19,7 +21,9 @@ const config = {
height: DEFAULT_HEIGHT
},
parent: "phaser-example",
scene: [Menu],
scene: [Preload, Menu, Game],
pixelArt: true,
antialias: false,
// pixelArt: true,
// roundPixels: true
};
+229
View File
@@ -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)*/;
}
}
+40 -16
View File
@@ -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");
super({
key: "Menu",
pixelArt: true,
physics: {
default: 'arcade',
arcade: {
gravity: {y: 0},
// debug: true
}
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
});
}
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');
})
}
}
+89
View File
@@ -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();
});
}
}