From 7888ac23b462d7c18ce13417476305afbbc39e55 Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Fri, 27 Jan 2017 11:19:53 +0100 Subject: [PATCH] Fix score counting and use a custom Scorer class --- android/assets/font/geosans-light.fnt | 90 ++++++++++++++++++ android/assets/font/geosans-light.png | Bin 0 -> 6388 bytes android/assets/ui/cup.png | Bin 0 -> 4141 bytes .../github/lonamiwebs/klooni/game/Cell.java | 2 + .../lonamiwebs/klooni/game/GameLayout.java | 28 +++++- .../lonamiwebs/klooni/game/PieceHolder.java | 6 +- .../github/lonamiwebs/klooni/game/Scorer.java | 73 ++++++++++++++ .../lonamiwebs/klooni/screens/GameScreen.java | 23 ++--- 8 files changed, 201 insertions(+), 21 deletions(-) create mode 100644 android/assets/font/geosans-light.fnt create mode 100644 android/assets/font/geosans-light.png create mode 100644 android/assets/ui/cup.png create mode 100644 core/src/io/github/lonamiwebs/klooni/game/Scorer.java diff --git a/android/assets/font/geosans-light.fnt b/android/assets/font/geosans-light.fnt new file mode 100644 index 0000000..6c10dd3 --- /dev/null +++ b/android/assets/font/geosans-light.fnt @@ -0,0 +1,90 @@ +info face="GeosansLight" size=64 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=77 base=58 scaleW=512 scaleH=512 pages=1 packed=0 +page id=0 file="geosans-light.png" +chars count=12 +char id=10 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=57 xadvance=16 page=0 chnl=0 +char id=48 x=0 y=0 width=36 height=51 xoffset=0 yoffset=9 xadvance=35 page=0 chnl=0 +char id=49 x=297 y=0 width=13 height=48 xoffset=10 yoffset=11 xadvance=35 page=0 chnl=0 +char id=50 x=94 y=0 width=31 height=49 xoffset=2 yoffset=10 xadvance=35 page=0 chnl=0 +char id=51 x=36 y=0 width=29 height=50 xoffset=3 yoffset=10 xadvance=35 page=0 chnl=0 +char id=52 x=125 y=0 width=34 height=49 xoffset=1 yoffset=10 xadvance=35 page=0 chnl=0 +char id=53 x=159 y=0 width=34 height=49 xoffset=0 yoffset=11 xadvance=35 page=0 chnl=0 +char id=54 x=193 y=0 width=34 height=49 xoffset=1 yoffset=11 xadvance=35 page=0 chnl=0 +char id=55 x=227 y=0 width=36 height=49 xoffset=0 yoffset=11 xadvance=35 page=0 chnl=0 +char id=56 x=65 y=0 width=29 height=50 xoffset=3 yoffset=10 xadvance=35 page=0 chnl=0 +char id=57 x=263 y=0 width=34 height=49 xoffset=1 yoffset=11 xadvance=35 page=0 chnl=0 +kernings count=73 +kerning first=49 second=48 amount=-7 +kerning first=48 second=49 amount=-11 +kerning first=56 second=52 amount=-2 +kerning first=57 second=53 amount=-3 +kerning first=55 second=57 amount=-4 +kerning first=57 second=50 amount=-2 +kerning first=48 second=52 amount=-4 +kerning first=51 second=49 amount=-12 +kerning first=57 second=56 amount=-3 +kerning first=56 second=50 amount=-4 +kerning first=54 second=49 amount=-13 +kerning first=55 second=51 amount=-6 +kerning first=48 second=55 amount=-3 +kerning first=54 second=50 amount=-6 +kerning first=52 second=51 amount=-4 +kerning first=52 second=50 amount=-3 +kerning first=51 second=50 amount=-4 +kerning first=50 second=50 amount=-2 +kerning first=57 second=49 amount=-11 +kerning first=54 second=52 amount=-4 +kerning first=55 second=50 amount=-6 +kerning first=49 second=56 amount=-10 +kerning first=57 second=52 amount=-6 +kerning first=50 second=54 amount=-3 +kerning first=51 second=53 amount=-4 +kerning first=49 second=49 amount=-17 +kerning first=57 second=51 amount=-2 +kerning first=55 second=56 amount=-4 +kerning first=50 second=55 amount=-3 +kerning first=55 second=48 amount=-3 +kerning first=56 second=53 amount=-4 +kerning first=53 second=55 amount=-2 +kerning first=52 second=57 amount=-4 +kerning first=51 second=52 amount=-3 +kerning first=50 second=53 amount=-4 +kerning first=49 second=55 amount=-9 +kerning first=53 second=50 amount=-7 +kerning first=55 second=52 amount=-20 +kerning first=55 second=49 amount=-9 +kerning first=53 second=52 amount=-2 +kerning first=54 second=51 amount=-2 +kerning first=49 second=54 amount=-8 +kerning first=50 second=56 amount=-2 +kerning first=53 second=53 amount=-3 +kerning first=51 second=51 amount=-4 +kerning first=48 second=51 amount=-2 +kerning first=51 second=57 amount=-3 +kerning first=49 second=52 amount=-11 +kerning first=52 second=55 amount=-4 +kerning first=50 second=49 amount=-12 +kerning first=49 second=57 amount=-8 +kerning first=54 second=57 amount=-4 +kerning first=56 second=55 amount=-3 +kerning first=51 second=55 amount=-4 +kerning first=56 second=56 amount=-4 +kerning first=56 second=51 amount=-3 +kerning first=49 second=50 amount=-11 +kerning first=55 second=53 amount=-8 +kerning first=49 second=51 amount=-12 +kerning first=53 second=49 amount=-10 +kerning first=48 second=50 amount=-2 +kerning first=52 second=49 amount=-10 +kerning first=53 second=57 amount=-3 +kerning first=50 second=52 amount=-13 +kerning first=53 second=51 amount=-3 +kerning first=56 second=49 amount=-12 +kerning first=49 second=53 amount=-9 +kerning first=55 second=54 amount=-9 +kerning first=57 second=55 amount=-3 +kerning first=54 second=55 amount=-3 +kerning first=56 second=57 amount=-4 +kerning first=51 second=56 amount=-1 +kerning first=50 second=51 amount=-4 diff --git a/android/assets/font/geosans-light.png b/android/assets/font/geosans-light.png new file mode 100644 index 0000000000000000000000000000000000000000..03cec39dc608ec695535c37b77666e139f072b6e GIT binary patch literal 6388 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

if-{(PTFSBO|3{jXg|>c40RIDD#?3rA!)Zi!Dz^ zbd$d->}`!f0gd|;SW6QZ?o7LNQtRf(yW3F=j}NmK^PA0~VE@r*v>qX(Vz}PaUQ<*g z?)WQyum#*-7fjp@!>hO+Vc5`2wXSl!`;OGI(AwlWHmIuep z39$*-oaa?Lz)N+9TR7wO1ENZimh_!4af~ss*VOLVDQ?(3K9kOL>|DzP2qn~0gx_h3 z=t_N|DJ)WLy!+@W2JE(K!<-T_e`Pkp1IH;p$A}tF!m!qvV|<5H@+Q}vL&#R1P2_W} zm}QH;dl0Godk>haIfZo?4au6ZQS(;5>BD=~n}6A+_j@ggq^eM94M~wlM4gz4K)i?b zwTz|GO_MnVTJ2PsO;>rKjvjXR3MW^K0)e7r?lpL5xL76L&5(P9cQwyz;8%tUJB)oz%KbY`Xb8SR;Y^PAKI#CB)Cy-tt%LJp@+&4gk)RC@R27mrc`epUgCx$1&V5t#Ez z&zLGO8|fWdmSwrk;wH5AHTTau)twV7=cT&0ZFA9O$bC3Qis@0-0jl&L{dGy*)$bc#4b!~`0h>3= z4WmY0K20fD1qfFPo*%9Ke*X9brkZ9}rN%%dda;ykcf-c-MEUxhFZ8Hp`Q@{=2Td|gZ&`7S30RdQXKgokiCF8d%qkznJ*~ZB?D5lz5Yh?qdAO|N& zwoHRe;Tw6~vYt1sOyM4dr9Xatz?qoRq50Y?;bToSenDMX$Shhu?=@|26Dgx@o?mT= z@qsJk!AZ_X?kYE*B|U@hOpU&r`hm(rE6zPB=WWh~+Yd+cs*S_6+`-e85*(x-d1m2; zE_oapqko^S-b=p}Wt(9fx!O?>!RBl5xQU_sm+Y=lMYm5h(_8QUF1~G^a6&-Guc`>s zDSJSsd&kHCkgG@C6yt;53qKn@(J;If+C^dI@}$o46T+#Ea(4-V`K=+9nrv27-%-?zpt$zesdR9JB zvMke{OjW--|EN|bY&b&6-M47|GnLXUsg=!H6CVNW4u5^MyTxzSE$?XR=qbqd$A*7{ zlW9XWb`mb{c|Cfi9nr*VZ#y$aLl5r04;qQ(L`R-PMehcFQPsOn($tv@Z^vxiL^8?s zie zt%p0M)9^***T#eHYYp6!p&fpgM6@XXFvf)}S9A8dSA^aSK6af;c~wo99I$@pwDr9j zUAGrL+lD@kvGJbsIW}jX-$3=~D)dFjBmCS;Rt=t4t_LxKj@t$!H$TEQLKC5f+T~LB z1C|uNBpzzbfVe$uDCEPOC}Kp9TZ{~y?&xR_f~Kz%l61!Gq}h;6p&VmIPLFi7w?N!` z$z1q2dwuREc|I$z&lM$;V-2WQB*(O?SlX%#t7*KgigE$>v*8#$kzB zPOAQaNSF*|+T9v975XvF;m;_ z8_gLJ@gFu0#UZtw<>ow*yU}jU1Kq*>iogzOO3!hNIb{hc$N~My?aB^W3vjsOUHJP0 zR)L56{{z11a54hCN16&9lVII}yMo_U$8y>~Ca-N6%#8X8OB;Zup_d<}My)7@YACU! z!E|+C#-+D(LgRhd0#SyMeIZ8;zp{Oh>(V znD#T@T1DziwYVV{!Z`TTZC4!gMgcAFZ`|UmM6HWw(9kP6PedeF2pdnw$O1?bEuZNB zoXykdiwz^>nce!n7PX*4w9qpFmQKQMj4N~`!FJV{LM9HQ^Pj+CldjW_JQ1XYBj~8Yr|u@h50{}_%RC#t5@Micm(7T(_{@u z00uBupCj~gZ~h2uqw1bLD!s#YT42KiKL!Ra$L3_6;75J&lF@BhwTu%H&-nj}`S-CH z^p+(>v}9L>T@4KE!j$u};nqUU3vg?)8tmF4(0Kh04_;_AeTT>Y9y^}voK|J@kis@Y Si2dTV2UHX_kR|dK0sjY)tKdff literal 0 HcmV?d00001 diff --git a/core/src/io/github/lonamiwebs/klooni/game/Cell.java b/core/src/io/github/lonamiwebs/klooni/game/Cell.java index 1a571ee..3d09f74 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/Cell.java +++ b/core/src/io/github/lonamiwebs/klooni/game/Cell.java @@ -39,6 +39,8 @@ class Cell { } // TODO Use vanish with a pretty animation instead .setEmpty() + // It would be AWESOME if the delay from vanishing (bounce -> big -> small -> gone) + // was delayed by how far this cell is from the cleared piece, I mean cool!! public void vanish() { empty = true; } diff --git a/core/src/io/github/lonamiwebs/klooni/game/GameLayout.java b/core/src/io/github/lonamiwebs/klooni/game/GameLayout.java index 071ae36..e3b5d16 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/GameLayout.java +++ b/core/src/io/github/lonamiwebs/klooni/game/GameLayout.java @@ -2,6 +2,7 @@ package io.github.lonamiwebs.klooni.game; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.math.Rectangle; // Helper class to calculate the size of each element // @@ -10,7 +11,7 @@ import com.badlogic.gdx.Gdx; public class GameLayout { // Widths - private float screenWidth, marginWidth; + private float screenWidth, marginWidth, availableWidth; // Heights private float screenHeight, logoHeight, scoreHeight, boardHeight, pieceHolderHeight; @@ -25,6 +26,7 @@ public class GameLayout { // Widths marginWidth = screenWidth * 0.05f; + availableWidth = screenWidth - marginWidth * 2f; // Heights logoHeight = screenHeight * 0.10f; @@ -34,19 +36,37 @@ public class GameLayout { } // Note that we're now using Y-up coordinates + void update(Scorer scorer) { + float cupSize = Math.min(scoreHeight, scorer.cupTexture.getHeight()); + final Rectangle area = new Rectangle( + marginWidth, pieceHolderHeight + boardHeight, + availableWidth, scoreHeight); + + scorer.cupArea.set( + area.x + area.width * 0.5f - cupSize * 0.5f, area.y, + cupSize, cupSize); + + scorer.currentScoreLabel.setBounds( + area.x, area.y, + area.width * 0.5f - cupSize * 0.5f, area.height); + + scorer.maxScoreLabel.setBounds( + area.x + area.width * 0.5f + cupSize * 0.5f, area.y, + area.width * 0.5f - cupSize * 0.5f, area.height); + } + void update(Board board) { // We can't leave our area, so pick the minimum between available // height and width to determine an appropriated cell size - float availableWidth = screenWidth - marginWidth * 2f; float boardSize = Math.min(availableWidth, boardHeight); board.cellSize = boardSize / board.cellCount; // Now that we know the board size, we can center the board on the screen - board.pos.set(screenWidth * 0.5f - boardSize * 0.5f, pieceHolderHeight); + board.pos.set( + screenWidth * 0.5f - boardSize * 0.5f, pieceHolderHeight); } void update(PieceHolder holder) { - float availableWidth = screenWidth - marginWidth * 2f; holder.area.set( marginWidth, 0f, availableWidth, pieceHolderHeight); diff --git a/core/src/io/github/lonamiwebs/klooni/game/PieceHolder.java b/core/src/io/github/lonamiwebs/klooni/game/PieceHolder.java index f613fba..d394cb4 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/PieceHolder.java +++ b/core/src/io/github/lonamiwebs/klooni/game/PieceHolder.java @@ -87,17 +87,17 @@ public class PieceHolder { } public boolean dropPiece(Board board) { + boolean put = false; if (heldPiece > -1) { if (board.putScreenPiece(pieces[heldPiece])) { pieces[heldPiece] = null; + put = true; } heldPiece = -1; if (handFinished()) takeMore(); - - return true; } - return false; + return put; } public void update(float cellSizeOnBoard) { diff --git a/core/src/io/github/lonamiwebs/klooni/game/Scorer.java b/core/src/io/github/lonamiwebs/klooni/game/Scorer.java new file mode 100644 index 0000000..649ded4 --- /dev/null +++ b/core/src/io/github/lonamiwebs/klooni/game/Scorer.java @@ -0,0 +1,73 @@ +package io.github.lonamiwebs.klooni.game; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.math.Interpolation; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.utils.Align; + +public class Scorer { + + private int currentScore; + private float shownScore; // To interpolate between shown score -> real score + private final int boardSize; + + final Label currentScoreLabel; + final Label maxScoreLabel; + + final Texture cupTexture; + final Rectangle cupArea; + + public Scorer(GameLayout layout, int boardSize) { + currentScore = 0; + this.boardSize = boardSize; + + cupTexture = new Texture(Gdx.files.internal("ui/cup.png")); + cupArea = new Rectangle(); + + Label.LabelStyle scoreStyle = new Label.LabelStyle(); + scoreStyle.font = new BitmapFont(Gdx.files.internal("font/geosans-light.fnt")); + + currentScoreLabel = new Label("0", scoreStyle); + currentScoreLabel.setAlignment(Align.right); + maxScoreLabel = new Label("0", scoreStyle); + + layout.update(this); + } + + public void addPieceScore(int areaPut) { + currentScore += areaPut; + } + + public void addBoardScore(int stripsCleared) { + currentScore += calculateClearScore(stripsCleared); + } + + int calculateClearScore(int stripsCleared) { + // The original game seems to work as follows: + // If < 1 were cleared, score = 0 + // If = 1 was cleared, score = cells cleared + // If > 1 were cleared, score = cells cleared + score(cleared - 1) + if (stripsCleared < 1) return 0; + if (stripsCleared == 1) return boardSize; + else return boardSize * stripsCleared + calculateClearScore(stripsCleared - 1); + } + + public void draw(SpriteBatch batch) { + int roundShown = MathUtils.round(shownScore); + if (roundShown != currentScore) { + shownScore = Interpolation.linear.apply(shownScore, currentScore, 0.1f); + currentScoreLabel.setText(Integer.toString(MathUtils.round(shownScore))); + } + + batch.setColor(Color.WHITE); + batch.draw(cupTexture, cupArea.x, cupArea.y, cupArea.width, cupArea.height); + currentScoreLabel.draw(batch, 1f); + maxScoreLabel.draw(batch, 1f); + } +} diff --git a/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java b/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java index faf54dc..2ab327c 100644 --- a/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java +++ b/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java @@ -13,10 +13,13 @@ import io.github.lonamiwebs.klooni.game.Board; import io.github.lonamiwebs.klooni.game.GameLayout; import io.github.lonamiwebs.klooni.game.Piece; import io.github.lonamiwebs.klooni.game.PieceHolder; +import io.github.lonamiwebs.klooni.game.Scorer; public class GameScreen implements Screen, InputProcessor { private Klooni game; + + private Scorer scorer; private Board board; private PieceHolder holder; @@ -35,6 +38,7 @@ public class GameScreen implements Screen, InputProcessor { layout = new GameLayout(); + scorer = new Scorer(layout, 10); board = new Board(layout, 10); holder = new PieceHolder(layout, 3); @@ -44,16 +48,6 @@ public class GameScreen implements Screen, InputProcessor { } } - int calculateClearScore(int cleared) { - // The original game seems to work as follows: - // If < 1 were cleared, score = 0 - // If = 1 was cleared, score = cells cleared - // If > 1 were cleared, score = cells cleared + score(cleared - 1) - if (cleared < 1) return 0; - if (cleared == 1) return board.cellCount; - else return board.cellCount * cleared + calculateClearScore(cleared - 1); - } - boolean isGameOver() { for (Piece piece : holder.getAvailablePieces()) { if (board.canPutPiece(piece)) { @@ -76,8 +70,9 @@ public class GameScreen implements Screen, InputProcessor { Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); - board.draw(batch); + scorer.draw(batch); + board.draw(batch); holder.update(board.cellSize); holder.draw(batch, board.cellPatch); @@ -137,13 +132,13 @@ public class GameScreen implements Screen, InputProcessor { public boolean touchUp(int screenX, int screenY, int pointer, int button) { int area = holder.calculateHeldPieceArea(); if (holder.dropPiece(board)) { - int cleared = board.clearComplete(); - score += area + calculateClearScore(cleared); + scorer.addPieceScore(area); + scorer.addBoardScore(board.clearComplete()); + // After the piece was put, check if it's game over if (isGameOver()) { clearColor.set(0.4f, 0.1f, 0.1f, 1f); } - return true; } else { return false;