From 83131b7acc5d1d27a34c9c429b8d311308e01d9e Mon Sep 17 00:00:00 2001 From: Aaron Mueller Date: Fri, 12 Sep 2014 21:38:34 +0200 Subject: [PATCH] Finish up. --- fuTris.js | 92 +++++++++++++++---------- index.html | 10 +++ main.css | 36 ++++++++++ screenshot_big.png | Bin 0 -> 2996 bytes screenshot_small.png | Bin 0 -> 1042 bytes submission/assets/drop.wav | Bin 0 -> 1290 bytes submission/assets/move.wav | Bin 0 -> 1564 bytes submission/assets/point.wav | Bin 0 -> 7922 bytes submission/assets/rotate.wav | Bin 0 -> 987 bytes submission/fuTris.js | 1 + submission/index.html | 24 +++++++ submission/js13kgames-aaronfischer.zip | Bin 0 -> 6192 bytes submission/main.css | 36 ++++++++++ 13 files changed, 161 insertions(+), 38 deletions(-) create mode 100644 main.css create mode 100644 screenshot_big.png create mode 100644 screenshot_small.png create mode 100644 submission/assets/drop.wav create mode 100644 submission/assets/move.wav create mode 100644 submission/assets/point.wav create mode 100644 submission/assets/rotate.wav create mode 100644 submission/fuTris.js create mode 100644 submission/index.html create mode 100644 submission/js13kgames-aaronfischer.zip create mode 100644 submission/main.css diff --git a/fuTris.js b/fuTris.js index 71a47f9..f1a8f69 100644 --- a/fuTris.js +++ b/fuTris.js @@ -7,6 +7,8 @@ var field = []; var background = []; var game_running = true; +var subframe = 0; +var moved_steps = 0; var speed = 100; var points = 0; var level = 0; @@ -143,6 +145,12 @@ function draw() { // Level draw_text(level, 30, 420, 230); draw_text('Level', 13, 420, 250); + + // Game over? + if (!game_running) { + draw_text("Game over", 60, 40, 250); + draw_text("Press R for a new game", 20, 140, 270); + } } function noice(offset, level) { @@ -267,9 +275,10 @@ addEventListener('keydown', function(event) { if (game_running) loop(); } - // TODO: Back to the main menu - if (event.keyCode == 27 || event.keyCode == 121) - console.log('Implement me.'); + // Restart the game + if (event.keyCode == 82 && !game_running) { + init(); + } }); function init() { @@ -277,7 +286,48 @@ function init() { points = 0; level = 0; stones = 0; + game_running = true; + subframe = 0; + moved_steps = 0; + + for (var x=0; x<10; x++) + for (var y=0; y<16; y++) + field[x][y] = 0; + // Start the game + next_shape(); + loop(); +} + +function loop() { + // Move the next step + subframe++; + if (subframe-speed > 0.0) { + subframe = 0; + speed = 100-(level*15); + + // Check if we get blocked by the already dropped shapes + +function() { + if (will_collide(angle, pos)) { + freeze(); + clear_full_lines(); + next_shape(); + + // Game over? + if (moved_steps === 0 || will_collide(0, {left: 4, top: 0})) + game_running = false; + moved_steps = 0; + return true; + } + return false; + }() || (pos.top++ && moved_steps++); + draw(); + } + + if (game_running) setTimeout(loop, 5); +} + +function setup() { // Load the assets assets.rotate.load(); assets.drop.load(); @@ -302,41 +352,7 @@ function init() { field[x][y] = 0; } } - - // Start the game - next_shape(); -} - -var subframe = 0; -var moved_steps = 0; - -function loop() { - // Move the next step - subframe++; - if (subframe-speed > 0.0) { - subframe = 0; - speed = 100-(level*15); - - // Check if we get blocked by the already dropped shapes - +function() { - if (will_collide(angle, pos)) { - freeze(); - clear_full_lines(); - next_shape(); - - // Restart the game? - if (moved_steps === 0 || will_collide(0, {left: 4, top: 0})) - init(); - moved_steps = 0; - return true; - } - return false; - }() || (pos.top++ && moved_steps++); - draw(); - } - - if (game_running) setTimeout(loop, 5); } +setup(); init(); -loop(); diff --git a/index.html b/index.html index 16e92e4..cb7ad2e 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,17 @@ +

fuTris

+

A js13kGames 2014 entry (source) + by Aaron Fischer.

+ + +

Use the arrow keys to move (, , rotate + () and drop () stones. Press P for + pause the game. If you messed up, restart with R. Vim-users + will also find a way to play :)

+ diff --git a/main.css b/main.css new file mode 100644 index 0000000..fdb0786 --- /dev/null +++ b/main.css @@ -0,0 +1,36 @@ +html { + background-color: #333; + color: #bbb; + font-family: Verdana, "DejaVu Sans"; +} + +body { + margin: auto; + width: 514px; +} + +canvas { + border: 2px solid #444; +} + +h1 { + color: white; + text-align: center; + font-size: 70px; + margin: 0; +} + +a { + color: #4f6c19; +} +a:hover { + color: #8fc32e; +} + +span { + background-color: #444; + border-radius: 3px; + padding: 2px 5px; + font-weight: bold; + color: white; +} \ No newline at end of file diff --git a/screenshot_big.png b/screenshot_big.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb945b40820dc5b0b78584f312aef3c864db22c GIT binary patch literal 2996 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 literal 0 HcmV?d00001 diff --git a/screenshot_small.png b/screenshot_small.png new file mode 100644 index 0000000000000000000000000000000000000000..de45dc7c6a479f5a1add24a593dbdc79b28df64b GIT binary patch literal 1042 zcmV+t1nv8YP)005u}0ssI21g-FT00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vq3=RE1&vk z=hm@kv1V_!Q%1u`d27|$1HTZu-{Xe1{bUVEl-Tv20uq7G{27|$16x~Hf z&8wm-!Pp>;@$vBx;h~|S5M5JtP_G&sHLt3_zduBGVPPTW7d+k&W8(+w8jLbyP8K>(@XD*EeY$ziYt+0dbF!cYBUOEsU`TLvFeeMWNbp+M zQ8)c|J4DT^GA9daFp9iqAi-I~UX;H#Ku6SppO0fj;-v_-TRYAsrCHAby*;jOKu6b9Y-Og@Xu zkjj}tYt@f1Vey}TPT1N^rx%tG+F9G)Pz`f+1tF9Qp7jqz-xOL#ieyTkiwIpm+anKS zKZLP+Rna6N!}C1HaluJt>YeV;^~NcZb=qY$%<Q34aHZizS(CGZ zK<9*r2xKD?BscE5^k?HSFXBc6pKZx^VA>MLzWE; zfLEXo^`I{F61cIdhF%ITW0V*=V|RkV+MBdLsT@;@tH#xmn2GAi4yI^KcQ`|HHtQ!x R^EjSY>sLScix#fj$M46oyLioPF`42(IC#HlHRDz!qLgaw#36jkZ zGfg9-4@kQ*X0h#_f(+j4?Cm8j@c0s zgLKQO*XkY)a_(iP59Meyf*c?+v_C}7mD;W5l}8I{L)XYnA19>-q_7kUNx&Yo3k9J7 zv;%EJThJ!3IudJRwmxf~meuIKce>pUd1J5Sg*=ld@<<-YJ-K7I zgr~wQ;)U_}+(9n5k{1=f@ Bud)CD literal 0 HcmV?d00001 diff --git a/submission/assets/point.wav b/submission/assets/point.wav new file mode 100644 index 0000000000000000000000000000000000000000..67064b3bbd705c781550bb5519b5c36caa9ea898 GIT binary patch literal 7922 zcmc)DyOJA47=~dvBjgGwZiOo2DpCRn>;-&SulK0cailru*Jws(X|?id<&}*M#)K3p zF$oEG!c{OMsWtu1{$=cl&xO0y&pYPpukPLZ=d(iL+b_QP^66>y^G^$f!ky&L-QNo9 z|Lzn%DLi>tefU?>{Qc)2zyF%stNY4MbJ6OS;6kw%vb5}>5i>S zSt}P-u)7{>QPRM z z9(72qQ!l6`>J{}QrzP^mhM#X&PxLg~(7bO>FO&2ZQ-vzjnCel7)H-!aEmNOUPi>vg z=jAP*Z8lAwtU24~?J=+@xq8%?DpaAyRF68KI@AfZLY>=MEEX@hO7diFLUk-kt^=w^ zjj2KvYE1R01FA!vP%AU;oFmSv)G@h1?NfbfL=~z~BdSmBQya4jd*c#TwJo^=OQoDv z$s=-u+Nb)|h$>W}MpS>J)9retvc0Bx-<%`c%H{7ebfZ7>hQo{r|>Hup2wM%uWeQJX`qSkWSAos~GH6CI?9qRyx0;~(Q zLk*}g)uZ;Q4eF3u&uNp~Tl2uobFkRFZ_WVdbf`iVYKIz7W2#5(QJd5O)v>gntm!xn zYu)rMn{QEajWS7ZEow*=s!&5}iyBdVYM1I#`$n6a^*DF?ygj;9pBhnH)Q~Dvp@!5J zHKO{|*jCr|x}3`qyB;+r2h3OrQ9INi#v%{%fpHA2iU5QZJ~rk8z$zDlJwQt#S`5*mlF8-u}sv002+0%pf-W;J1l(lo8|Fnyu^ z$01cJMU{Hh&+^ro`Tm(Xdw+WR^94nnzp=h!!s6>!6h)ojd;6U-{}bvZ<#ma!d(_yw_e^D z<6*zsZq}RXd^Q~q^n9q#KXsE-iH5;{RMJ-(y@>xYrr_dCSMI(He3kFy}LmHjv zyrgH_^=i4eLF0Hd9Q1qLPFrg=>S!*jr6SsMStUaRi3AivEJ`Gy5H!RCk=Nsf%jxJY z7mGPOQ;1;F`#sa8wVDm0gAYO&q0HwXRWcbF-c*v9B~gsW1tAtA{s_~A7P9S6bxfJotPoR!9dshB&gfzblPoAYqgq9l2@iKiT_4;3TA(X=szKnEeIN+WrBqWjR&w9q4o%td;qH+ Z!N!kZ^C#d4e}IcT1CI1J$N~QczW{p(+bjS8 literal 0 HcmV?d00001 diff --git a/submission/fuTris.js b/submission/fuTris.js new file mode 100644 index 0000000..78f7a69 --- /dev/null +++ b/submission/fuTris.js @@ -0,0 +1 @@ +function shape(a,b){var c=shapes[a];switch(c.length){case 1:return c[0];case 2:return c[b%2];case 4:return c[b]}}function rect(a,b,c,d,e,f){context.fillStyle="#"+f,context.fillRect(a*e,b*e,c*e,d*e)}function draw_shape(a,b,c,d,e){for(var f=0;f1?2:0;rect(20*a+1,20*b+1,18,18,c,colors[e+1]),rect(20*a+2,20*b+2,16,16,c,colors[e]),-1!=[0,3,5].indexOf(d)&&(rect(20*a+5,20*b+5,10,10,c,colors[{0:2,3:0,5:4}[d]]),rect(20*a+8,20*b+8,4,4,c,colors[{0:0,3:2,5:0}[d]])),1==d&&rect(20*a+5,20*b+5,10,10,c,colors[4]),4==d&&rect(20*a+8,20*b+8,4,4,c,colors[4]),2==d&&(rect(20*a+5,20*b+5,8,8,c,colors[0]),rect(20*a+7,20*b+7,8,8,c,colors[4]),rect(20*a+7,20*b+7,6,6,c,colors[2])),6==d&&(rect(20*a+5,20*b+6,3,3,c,colors[0]),rect(20*a+5,20*b+12,3,3,c,colors[0]),rect(20*a+11,20*b+4,3,3,c,colors[0]),rect(20*a+13,20*b+12,3,3,c,colors[0]))}function draw(){rect(0,0,canvas.width,canvas.height,1,"000");for(var a=0;10>a;a++)for(var b=0;16>b;b++)rect(20*a,20*b,20,20,2,background[a][b]),0!==field[a][b]&&draw_brick(a,b,2,field[a][b]-1);draw_shape(pos.left,pos.top,2,current_shape_type,angle),draw_shape(21,1,1,next_shape_type,0),draw_text(points,30,420,130),draw_text("Points",13,420,150),draw_text(level,30,420,230),draw_text("Level",13,420,250),game_running||(draw_text("Game over",60,40,250),draw_text("Press R for a new game",20,140,270))}function noice(a,b){return a+~~(Math.random()*b)}function freeze(){for(var a=0;ab;b++){var c=!0;for(x=0;10>x;x++)0===field[x][b]&&(c=!1);if(c){a++;for(var d=b;d>0;d--)for(var e=0;10>e;e++)field[e][d]=field[e][d-1];for(var e=0;10>e;e++)field[e][0]=0}}1==a&&(points+=10),2==a&&(points+=25),3==a&&(points+=50),4==a&&(points+=100),a>0&&play_sound("point")}function play_sound(a){for(var b=0;b20&&(level++,stones=0),pos.left=4,pos.top=0,current_shape_type=next_shape_type,next_shape_type=Math.ceil(Math.random()*shapes.length-1),current_shape=shapes[current_shape_type]}function will_collide(a,b){for(var c=0;c=16||0!==shape(current_shape_type,a)[d][c]&&0!==field[b.left+c][b.top+d+1])return!0}function init(){speed=100,points=0,level=0,stones=0,game_running=!0,subframe=0,moved_steps=0;for(var a=0;10>a;a++)for(var b=0;16>b;b++)field[a][b]=0;next_shape(),loop()}function loop(){subframe++,subframe-speed>0&&(subframe=0,speed=100-15*level,+function(){return will_collide(angle,pos)?(freeze(),clear_full_lines(),next_shape(),(0===moved_steps||will_collide(0,{left:4,top:0}))&&(game_running=!1),moved_steps=0,!0):!1}()||pos.top++&&moved_steps++,draw()),game_running&&setTimeout(loop,5)}function setup(){assets.rotate.load(),assets.drop.load(),assets.move.load(),assets.point.load();for(var a=0;10>a;a++)audio_chanels[a]={channel:new Audio,finished:-1};for(var b=0;10>b;b++){field[b]=[],background[b]=[];for(var c=0;16>c;c++){var d=noice(15,15);background[b][c]=""+d+d+d,field[b][c]=0}}}var canvas=document.getElementById("fuTris"),context=canvas.getContext("2d");canvas.width=510,canvas.height=640;var field=[],background=[],game_running=!0,subframe=0,moved_steps=0,speed=100,points=0,level=0,stones=0,pos={left:4,top:0},angle=0,shapes=[[[[0,1],[0,1],[1,1]],[[1,0,0],[1,1,1]],[[1,1],[1,0],[1,0]],[[1,1,1],[0,0,1]]],[[[2,2],[2,2]]],[[[3,3,3],[0,3,0]],[[0,3],[3,3],[0,3]],[[0,3,0],[3,3,3]],[[3,0],[3,3],[3,0]]],[[[4,4],[0,4],[0,4]],[[0,0,4],[4,4,4]],[[4,0],[4,0],[4,4]],[[4,4,4],[4,0,0]]],[[[0,5,5],[5,5,0]],[[5,0],[5,5],[0,5]]],[[[6,6,0],[0,6,6]],[[0,6],[6,6],[6,0]]],[[[7,7,7,7]],[[7],[7],[7],[7]]]],colors=["c1e184","4f6c19","699021","8fc32e","1a2308"],assets={rotate:document.getElementById("rotate-sound"),drop:document.getElementById("drop-sound"),move:document.getElementById("move-sound"),point:document.getElementById("point-sound")},audio_chanels=[],current_shape_type=0,next_shape_type=Math.ceil(Math.random()*shapes.length-1),current_shape=shapes[current_shape_type];addEventListener("keydown",function(a){if(game_running){if((37==a.keyCode||72==a.keyCode)&&pos.left>0&&!will_collide(angle,{left:pos.left-1,top:pos.top})&&(pos.left--,play_sound("move"),draw()),(39==a.keyCode||76==a.keyCode)&&pos.left<10-shape(current_shape_type,angle)[0].length&&!will_collide(angle,{left:pos.left+1,top:pos.top})&&(pos.left++,play_sound("move"),draw()),38==a.keyCode||75==a.keyCode){var b=0===angle?3:angle-1;pos.left+shape(current_shape_type,b)[0].length<=10&&!will_collide(b,pos)&&(angle=b),play_sound("rotate"),draw()}if(40==a.keyCode||74==a.keyCode){for(;!will_collide(angle,{left:pos.left,top:pos.top+1});)pos.top++;pos.top++,points+=2,freeze(),clear_full_lines(),next_shape(),play_sound("drop"),draw()}}(13==a.keyCode||80==a.keyCode)&&(game_running=!game_running,game_running&&loop()),82!=a.keyCode||game_running||init()}),setup(),init(); \ No newline at end of file diff --git a/submission/index.html b/submission/index.html new file mode 100644 index 0000000..be68ab2 --- /dev/null +++ b/submission/index.html @@ -0,0 +1,24 @@ + + + + + fuTris -- a js13kGames entry + + + + +

fuTris

+

A js13kGames 2014 entry (source) + by Aaron Fischer.

+ +

Use the arrow keys to move (, , rotate + () and drop () stones. Press P for + pause the game. If you messed up, restart with R. Vim-users + will also find a way to play :)

+ + + + + + + diff --git a/submission/js13kgames-aaronfischer.zip b/submission/js13kgames-aaronfischer.zip new file mode 100644 index 0000000000000000000000000000000000000000..5943c768358c9f46907ecb9584c55c81c6455c02 GIT binary patch literal 6192 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 P0536NE*jI)2LS#L0|=$t literal 0 HcmV?d00001 diff --git a/submission/main.css b/submission/main.css new file mode 100644 index 0000000..fdb0786 --- /dev/null +++ b/submission/main.css @@ -0,0 +1,36 @@ +html { + background-color: #333; + color: #bbb; + font-family: Verdana, "DejaVu Sans"; +} + +body { + margin: auto; + width: 514px; +} + +canvas { + border: 2px solid #444; +} + +h1 { + color: white; + text-align: center; + font-size: 70px; + margin: 0; +} + +a { + color: #4f6c19; +} +a:hover { + color: #8fc32e; +} + +span { + background-color: #444; + border-radius: 3px; + padding: 2px 5px; + font-weight: bold; + color: white; +} \ No newline at end of file