
å®éãç§ã¯è«çç©å
·ã倧奜ãã§ãã ããããã3åã«äžŠãã§ãããããé¡äŒŒãããã®ãèŠã€ããããããã³ãç¬ã«é€ãããããªã©ãããŸãèå³ããããŸããã ããããæ¬åœã«è€éãªä»æããæ°é±éèœã¡çããŠåŒãåºãããå¯èœæ§ããããŸãã ããã¯ããŸã£ããæ°ããSonyæºåž¯é»è©±ãæã«å
¥ã£ã2004幎ã«ç§ã«èµ·ãã£ãããšãšãŸã£ããåãã§ãã ãã®T68Iãåªããé»è©±ããããã«ã©ãŒåçã衚瀺ããBTãä»ããŠé£çµ¡å
ãéä¿¡ããæ©èœãããããŸãããæ°ã¥ããªãã£ãã®ã§ãã ããããQ-ãããã ãããŠãäœæéç§ã¯å°ããªãã£ã¹ãã¬ã€ã®åŸãã«åº§ã£ãŠãå¿
æ»ã«ããŒã«ãååŸã«è¿œããããŸããããããèŠããŠããŸããã ããããç§ã¯éåžžã«ããèŠããŠããŸããææ°ã®ãã©ãããã©ãŒã ã®ããããã«ãã®ã²ãŒã ã®ç§»æ€çãæžããšããèãã¯ãæåã®Hello World以æ¥ãç§ãè¡ãããŸããã§ããã 確ãã«ãå€ãè¯ãæä»£ã®å°ãªããšãäœããã®çš®é¡ã®ã²ãŒã ãšã³ãžã³ããªãããããããšããç§ã®è©Šã¿ã¯ãã¹ãŠã¯ã©ãã·ã¥ããŸãã...äžè¬ã«ã圌ãã¯äœãã«ã€ããŠã¯ã©ãã·ã¥ããŸããã ããããç§ã¯é·ãéããã£ãããšJavaã§ããããŠAndroidã®ïŒããæè¿ã®ïŒãšãããæžããã®ã§ãããã¡ãã®ç§»æ€ãšããã¢ã€ãã¢ãã€ãã«å®çŸããæ©äŒãèŠã€ããŸããã ãããäœã§ãããã©ã®ããã«çãŸããã®ããèŠããã§ããïŒ ãã®åŸ-ç«ã®äžã
ã²ãŒã ã®æå³ã¯äœã§ããïŒ
Qã¯éåžžã«è€éãªããžãã¯ã²ãŒã ã§ããããã®æå³ã¯ãç«¶æå Žã®ãã¹ãŠã®è²ã®ããŒã«ãåãè²ã®ç©Žã«è»¢ããããšã§ãã ãŸãã§ããªã€ãŒãã®ããã§ãã ãŸããããªã€ãŒãã®å Žåãšåæ§ã«ãããŒã«ã¯çŽç·ã§ã®ã¿ç§»åããæåã®é害ç©ïŒåºå®ã¬ã³ã¬ãŸãã¯å¥ã®ããŒã«ã®ããããïŒãŸã§ããç§»åããŸããã åæã«ããã¹ãŠã®ã¬ãã«ã¯æãåçŽãªè§£æ±ºçãæé€ãããããªæ¹æ³ã§æ§ç¯ãããŠããŸã-ãããçŸããã§ãã
ãŸã ããããªãïŒ ããŠãããã«æåã®ã¬ãã«ã®åçããããŸãã ã¡ãªã¿ã«ãããªãã®ã¬ãžã£ãŒã§ããã®ãŸãã«ã¬ãã«ãæž¡ãæ¹æ³ãèãåºããŠãã ããã

ããã¯è¯ãã§ããïŒ ãããããããæžãæ¹æ³ãçè§£ããŸãããã
äœãæžããŠããã®ïŒ
ç§ãæåã«æãã€ããã®ã¯ãäœããã®ç©çãšã³ãžã³ã䜿çšããããšã§ããã ããšãã°ãUnityã ãããããã®ãããªããã¡ãã®ééãšããããªãŒã®
æ¶è²»éã
調ã¹ããšãã ããã£ãŒã«ãå
šäœã§ããŒã«ãçŸãã転ããããã ãã«ãšã³ãžã³å
šäœã䜿çšãããšããã¢ã€ãã¢ã¯ããã«ãªããªããŸããã ãããããã®ã²ãŒã å°çšã®å°ããªãšã³ãžã³ãæžããšããã¢ã€ãã¢ãæµ®ãã³ãŸãããç¹ã«åäŸã®é ã«ã¯åŸãããªãã£ãã®ã¯ãã®éšåã ã£ãããã§ãã ããã§ãããŒã«ãšäœæ¶è²»é»åã§èªè»¢è»ãåçºæããŸãã ãšããã§ãAndroidããJavaã§çºæããŸãã è¡ãã
ã²ãŒã èŠçŽ ãéžæãã
ããã¯ãäœãã®ã³ãŒããèšè¿°ãããšãã«æåã«è¡ãããšã§ãã ç§ãã¡ãæã£ãŠãããã®ãèŠãŠã¿ãŸããã...ã®ã§ãããäžåºŠåçãèŠãŠãã ãã...
ããïŒ ãã£ãŒã«ãã«ã¯...èŠçŽ ããããŸãïŒ è«ççã§ããïŒ
public abstract class Item implements Serializable { private Color color; public Item(Color color) { setColor(color); } public Color getColor() { return color; } private void setColor(Color color) { this.color = color; } @Override public String toString() { return "Item{" + "color=" + color + '}'; } }
äœã座æšã¯ã©ãã§ããïŒ ããŒã«ã¯ã©ã®ããã«ããŠãããã©ãã«ããã®ããç¥ãã®ã§ãã 圌ã®ããžãã¹ã§ã¯ãããŸããã
ããŠãããå°ã詳ããèŠãŠãããã«ã©ããªèŠçŽ ãããã®ãââèŠãŠã¿ãŸããã
ãããã¯ãã 圌ã«ãšã£ãŠãã¹ãŠãã·ã³ãã«ã§ããåœŒã¯æ£æ¹åœ¢ã§ãç°è²ã§ãã©ãã«ãç§»åããŸããã äžããåããããªã-ããŸãçºå±ããŠããªãåœã®çµæžã 確ãã«ããããã¯ãèŠçŽ ã§ããããšãå¿ããŠã¯ãªããŸããã
public class Block extends Item { public Block() { super(Color.GRAY); } }
ããŒã« ã ããŒã«ã¯ããå°ãè€éã§ããäžžããå€è²ã§ãåžžã«ã©ããã§è»¢ãããŸãã ãŸããèŠçŽ ã
public class Ball extends Item { public Ball(Color color) { super(color); } }
穎 ã ãŸãããŸãã¯ãã±ãã-ããªããäžçªå¥œããªããã«ã ããŒã«ãšãããã¯ã®éã«äœãããããŸããããã¯åè§ããŠåãããªãããã«èŠããŸããããã«ãã«ã©ãŒã§ããããŸãã
public class Hole extends Item { public Hole(Color color) { super(color); } }
ãã®ããããã§ã«åºæ¬çãªèŠçŽ ãææ¡ããŠããŸãã ããŠã圌ããã©ãã«ããã®ããèããŠãã ãã
ã©ã€ãã£ã³ã°ã¬ãã«
ã¬ãã«èªäœã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãããçŸæç¹ã§ã¯ããã£ãŒã«ãå
ã®èŠçŽ ã®äœçœ®ãæ
åœããã¯ã©ã¹ãå¿
èŠã§ãããªããªããããªããšç§ã¯ãããèªäœãè²ãšååããç¥ããªããšæ±ºããããã§ãã
public class Level implements Serializable { private Item[][] field; private int ballsCount; public Level(Item[][] field) { this.field = field; } }
ããŠãåãã¯è¯ãã§ãã äœããã®çš®é¡ã®èŠçŽ ã®2次å
é
åãæ ŒçŽããã¬ãã«ããããŸãã ãã¹ãŠã®ããŒã«ããããã¯ã穎ã«èŠçŽ ãããã®ã§ãå¯èœã§ãã æ¯åãã£ãŒã«ãã«æ®ã£ãŠããããŒã«ã®æ°ãã«ãŠã³ãããªãããã«ã2çªç®ã®å€æ°ãå¿
èŠã§ãã ãã ããæ£çŽãªãšããããã®ããžãã¹ãæ°ããå¿
èŠããããŸã
private int countBallsOnLevel(Item[][] field) { int ballsCount = 0; for (Item[] aField : field) { for (int j = 0; j < field[0].length; j++) { if (aField[j] != null && aField[j].getClass().equals(Ball.class)) { ballsCount++; } } } return ballsCount; }
äºæ¬¡ã®è€éããããã ãã®ãããæ¬¡ã®ç§»ååŸã«ãã®å€ãåéèšããããããŸããã ããŠãã³ã³ã¹ãã©ã¯ã¿ã«1è¡è¿œå ããŸã
this.ballsCount = countBallsOnLevel(field);
ããã§ãã¬ãã«ã®æºåãã§ããŸããã ä»ãèšç»ã¯æãè峿·±ãã§ã
ãšã³ãžã³ãæžã
ãã¹ãŠã®ã²ãŒã ã¡ã«ããã¯ã«ç¹å¥ãªã¯ã©ã¹ãçšæããŠãã ããã ããŠãããšãã°ããã£ãŒã«ãã«ã¯ãå¯å€ã¬ãã«ã®æ§æãšããã£ãŒã«ãã«æ®ã£ãŠããããŒã«ã®æ°ãæ ŒçŽãããŸã
private Level level; private int ballsCount; public Field(Level level) { this.level = level; this.ballsCount = level.getBallsCount(); }
çŽ æŽãããã ãšã³ãžã³ããå°ã泚æãããããå°ããªåæåãæžããŸã
public enum Direction { LEFT, RIGHT, UP, DOWN, NOWHERE }
ãããããŒã«ãåããŠããæ¹åã ããäžåºŠè©±ãé²ããŠããã£ãŒã«ãäžã®ç®çã®èŠçŽ ã®åº§æšãä¿åããéåžžã«å°ããªå€å
žãæžããŸãããã ãªãã§ïŒ ãããŠã以äžãæžãããã«
public class Coordinates { private int horizontal; private int vertical; public Coordinates(int horizontal, int vertical) { this.horizontal = horizontal; this.vertical = vertical; } }
ãã£ãšããšã³ãžã³ã«æ»ã£ãŠéåŽãç¶ããããšãã§ããŸãã
ããªããæåã«ãããããšã¯ãããŒã«ãåããããã«ç§ãã¡ã®ãã£ãŒã«ããæããããšã§ãã
private Coordinates moveRight(int xCoord, int yCoord) { try { while (level.getField()[yCoord][xCoord + 1] == null) { level.getField()[yCoord][xCoord + 1] = level.getField()[yCoord][xCoord]; level.getField()[yCoord][xCoord++] = null; } } catch (ArrayIndexOutOfBoundsException ex) { } return new Coordinates(xCoord, yCoord); }
ããšãã°ããã®æ¹æ³ã¯ãããçšåºŠã®é害ç©ãã§ãããŸã§ããŒã«ã転ãããŸãã ããŠããŸãã¯ãã£ãŒã«ããçµäºãããŸã§ã ã¡ãªã¿ã«ãããã¯ããããäŸå€ã®æå¶ãäœããã®åœ¢ã§æ£åœåãããå¯äžã®ã±ãŒã¹ã§ãã
ããã»ã©è€éãªããšã¯ãããŸãã-ããŒã«ãå·Šãäžãäžã«åããä»ã®æ¹æ³ãæžãããŠããŸãã ãããã®ã¡ãœãããã©ããäžã®ã¬ãã«ã§åŒã³åºãæ¹æ³ãåŠã¶å¿
èŠããããŸãã
private Coordinates moveItem(Coordinates coordinates, Direction direction) { int horizontal = coordinates.getHorizontal(); int vertical = coordinates.getVertical(); if (direction.equals(Direction.NOWHERE) || level.getField()[vertical][horizontal] == null) { return null; } Class clazz = level.getField()[vertical][horizontal].getClass(); if (!clazz.equals(Ball.class)) { return null; } switch (direction) { case RIGHT: return moveRight(horizontal, vertical); case LEFT: return moveLeft(horizontal, vertical); case UP: return moveUp(horizontal, vertical); case DOWN: return moveDown(horizontal, vertical); } return null; }
ããŠãããã§ç§ãã¡ã®åº§æšã¯äŸ¿å©ã§ãã æžãéãæžããããã«èšã£ãã
ã ãããå€ããå°ãªããä¹ãããšãåŠãã ã ä»ãç§ãã¡ã¯ããŒã«ããããšãåŠã³ãŸãã ãã¹ãŠãåãã§ãã¡ãœããã®ã¿ãæäœã®çµæãè¿ããŸã-ããŒã«ãé£ã¹ããã©ãã
private boolean acceptRight(Coordinates coordinates) { try { int horizontal = coordinates.getHorizontal(); int vertical = coordinates.getVertical(); Item upItem = level.getField()[vertical][horizontal + 1]; Item item = level.getField()[vertical][horizontal]; if (upItem == null || !upItem.getClass().equals(Hole.class) || !(upItem.getColor().equals(item.getColor()))) { return false; } level.getField()[vertical][horizontal] = null; } catch (ArrayIndexOutOfBoundsException ex) { } return true; }
ãããŠããŸã£ããåãã©ãããŒã¬ãã«ã¢ãã
private boolean acceptHole(Coordinates coordinates, Direction direction) { boolean isAccepted = false; switch (direction) { case UP: isAccepted = acceptUp(coordinates); break; case DOWN: isAccepted = acceptDown(coordinates); break; case RIGHT: isAccepted = acceptRight(coordinates); break; case LEFT: isAccepted = acceptLeft(coordinates); break; } if (!isAccepted) { return false; } catchBall(); return checkWin(); }
ããŒã«ãé£ã¹ãããåŸã§ããæ®ãã®æ°ãæ°ããå¿
èŠããããŸãã ããããOïŒNïŒã¯ãããŸããã
private void catchBall() { ballsCount--; }
ãªãã§ïŒ ãªããªãã1åã®ç§»åã§1ã€ã®ããŒã«ããç§»åã§ããªãããã§ããããã¯ããã¯ã転ããããšãã§ããªãããšãæå³ããŸãã ã¬ãã«ãå®äºããããšã確èªããããšã¯ããé£ãããããŸãã
private boolean checkWin() { return ballsCount == 0; }
ããŠãä»ç§ãã¡ã¯ãã£ãŒã«ãã®åšãã«ããŒã«ã転ãããŠè»¢ããããšãã§ããŸãã æ©ãæ¹æ³ãåŠã¶ããšã¯æ®ã£ãŠãã
public boolean makeTurn(Coordinates coordinates, Direction direction) { Coordinates newCoordinates = moveItem(coordinates, direction); return newCoordinates != null && acceptHole(newCoordinates, direction); }
æ°ããããšã¯ãããŸãããæ¹åã倿ããå Žåã¯æ¹åãšåº§æšãåããããŒã«ãèŠã€ãã£ãå Žåã¯ãããŒã«ãæ°ããå Žæã«ç§»åããç©Žã«æŒã蟌ã¿ãŸããã èŠã€ãã£ãå Žåãtrueãè¿ããŸãã
ããŠãããããšã³ãžã³å
šäœã§ãã ãã®ãããããã§å£çµããã¿ã€ã䟡å€ã¯ãããŸãããïŒ
次ã«ãç»é¢ã«ãã¹ãŠã衚瀺ããããã«é»è©±ãæããå¿
èŠããããŸãã
ãã¥ãŒãæžã
Androidã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹ã®äž»èŠãªèŠçŽ ã¯Viewã§ãã ãã¥ãŒãã€ãŸãã ããã¯ãã¿ã³ã§ãããå
¥åãã£ãŒã«ãã§ããã...ç§ãã¡ã®ç«¶æå Žã§ãã 確ãã«ã誰ããç§ãã¡ã®ããã«ãã§ã«ãããæžããŠããããšãé¡ãã®ã¯å¥åŠã§ãã ã ããããªãã¯èªåã§ãããããªããã°ãªããŸããã ãããè¡ãã«ã¯ãã¯ã©ã¹å
šäœãäœæããAndroidã®ãã«ãã€ã³ãã¥ãŒããç¶æ¿ããŠããã®ã©ã€ããµã€ã¯ã«ããã®ããžãã¹ãç»é¢ã«é
眮ããæ©èœãªã©ã«ã¢ã¯ã»ã¹ããŸãã
public class FieldView extends View { private final double ROUND_RECT_SIZE = 0.15; private final int PADDING_DIVIDER = 4; int paddingSize = 0; private int elementSize; private Field field; private Size fieldSize; private Size maxViewSize; public FieldView(Context context, AttributeSet attrs) { super(context, attrs); } }
ããã§å®æ°ãå¿
èŠãªçç±ã¯åŸã§èª¬æããŸãããããã§ã¯ããã¥ãŒã®å€§ããã«ã€ããŠèããŠã¿ãŸãããã ç»é¢äžã§å¯èœãªéãå€ãã®ã¹ããŒã¹ãå æããå¿
èŠãããããšã¯æããã§ãããããããã¯ããŒã«ããªãã§ãã ããã ãŸããèŠçŽ ã®ãµã€ãºã¯ãã¥ãŒèªäœã®ãµã€ãºã«æ¯äŸããå¿
èŠãããããšã¯æããã§ãã åæã«ãäœããäžå®ã«èšå®ããããšã¯ã§ããŸãããæ°åå°ã®ç°ãªãæºåž¯é»è©±ã®äžã§ç¬èªã®èŠè§£ãæžãããšã¯ã§ããŸããã ãã ããç»é¢ã«é
眮ãããšãã«ããã¥ãŒã§äœããè¡ãããšãã§ããŸãã XMLããŒã¯ã¢ããã«math_parentãã£ã¡ã³ã·ã§ã³ãããããããã®ãµã€ãºã®ã©ã³ã¿ã€ã ãæ±ºå®ã§ããŸãã
public Size countFieldSize() { if (maxViewSize == null) { maxViewSize = new Size(this.getWidth(), this.getHeight()); } int horizontalElementsNum = field.getField()[0].length; int verticalElementsNum = field.getField().length; int maxHorizontalElSize = maxViewSize.getWidth() / horizontalElementsNum; int maxVerticalElSize = maxViewSize.getHeight() / verticalElementsNum; this.elementSize = (maxHorizontalElSize < maxVerticalElSize) ? maxHorizontalElSize : maxVerticalElSize; int newWidth = this.elementSize * horizontalElementsNum; int newHeight = this.elementSize * verticalElementsNum; return new Size(newWidth, newHeight); }
ãµã€ãºã¯åº§æšãšã»ãŒåãã§ãOxãšOyã«å¿ãããµã€ãºãä¿åããããã«ã®ã¿å¿
èŠã§ãã ã¢ã«ãŽãªãºã ã¯ç°¡åã§ãïŒèª°ãããããã®ãµã€ãºã決å®ããŠãããã©ããã調ã¹ããã¯ã»ã«åäœã§é«ããšå¹
ãååŸãã1ã€ã®èŠçŽ ãæ°Žå¹³ããã³åçŽã«å ããéãèšç®ããå°ããèŠçŽ ãéžæããèŠçŽ ãµã€ãºã«ãã®æ°ãæããŠãã¥ãŒèªäœã®ãµã€ãºãåèšç®ããŸããè¡ãšåã§ã
ãããŠããŸãããã®ããšãåŒã³åºãããšãå¿ããªãã§ãã ããïŒ
@Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); Size countedFieldSize = countFieldSize(); if (fieldSize == null || !fieldSize.equals(countedFieldSize)) { this.fieldSize = countedFieldSize; setFieldSize(this.fieldSize); paddingSize = (int) (Math.sqrt(elementSize) / PADDING_DIVIDER); } }
setFieldSizeã¯äœãããŸããïŒ ã¯ãããé¡ãããŸãïŒ
public void setFieldSize(Size size) { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(size.getWidth(), size.getHeight()); params.gravity = Gravity.CENTER_HORIZONTAL; this.setLayoutParams(params); }
圌ãã¯çºããåããããã«å¯žæ³ãä»ããŸããã äœã欲ããã£ãïŒ
ãããã£ãŠããµã€ãºã決å®ããŸããã ããã§ãäœããã®åœ¢ã§ç«¶æå Žãæãå¿
èŠããããŸãã è€éã§ã¯ãªããonDrawã§è¡ãããŸãã 確ãã«ãäœããæãåã«ãã²ãŒã èŠçŽ èªäœãã©ããã«èŠã€ããå¿
èŠããããŸãã
æã
ç§ãæåã«æãã€ããã®ã¯ãããããã®ããŒã¯ã¢ãããã¡ã€ã«ãããã¢ãã«ã§ååŸãããããã座æšã§ãã£ã³ãã¹ã«é
眮ããããšã§ããã æ®å¿µãªããããã®çŽ æŽãããã¢ã€ãã¢ã¯ãèŠçŽ ã®çžå¯Ÿçãªãµã€ãºãèšå®ããããšãäžå¯èœã§ããããšãæã¡ç ŽããŸããã ã€ãŸãããããã¯ã®è§ãäžžãããŠãdpã«èšå®ã§ããŸãã ãããŠããããã¯å®éã«äžžããããŸãã å¯äžã®åé¡ã¯ããã£ãŒã«ãäžã®åãèŠçŽ ã®æ°ã«å¿ããŠãèŠçŽ ã®ãµã€ãºãç°ãªãããšã§ãã ãŸãããã£ãŒã«ãã6 * 6ïŒã²ãŒã ã®æå°ãµã€ãºïŒã®å Žåããããã¯ã¯ãããã«äžžã¿ã垯ã³ãæ£æ¹åœ¢ã«ãªããŸãã ãããŠãç§ãã¡ãæã£ãŠãããã£ãŒã«ãããã§ã«13 * 13ïŒæå€§ãµã€ãºïŒã§ããå Žå-ããã¯ãããã«æ£æ¹åœ¢ã®ããŒã«ã«ãªããŸãã glyãã
ãã ããdrawRectã®ãããªäœããã®äœã¬ãã«ã®æç»ã«ç
©ããããããããæ¢æã®èŠçŽ ã§ãã£ã³ãã¹ã«æç»ãããšããã¢ã€ãã¢ã奜ãã§ãã èŠçŽ ããããããã£ãŠã¿ãŸããããïŒ
Drawableãçæããããã®å¥ã®ã¡ãœããããããŸãïŒäœããã®çç±ã§å¥ã®ãã¡ã¯ããªãŒã«ç§»åãããã£ãã®ã§ããïŒselectDrawableã¯ãèŠçŽ ã®ã€ã³ã¹ã¿ã³ã¹ãååŸããããã誰ã§ããããèŠã€ããŠããããæç»å¯èœã«ããŸãã ããšãã°ããããã¯ã¯æ¬¡ã®ããã«æç»ãããŸãã
Class clazz = item.getClass(); Color color = item.getColor(); if (clazz.equals(Block.class)) { GradientDrawable bgShape = new GradientDrawable(); bgShape.setColor(ContextCompat.getColor(getContext(), R.color.gray)); bgShape.setCornerRadius((float) (elementSize * ROUND_RECT_SIZE)); return bgShape; }
ããŠã宿°ã圹ã«ç«ã¡ãŸããã ããã§ãäžžã¿ä»ãååŸã¯èŠçŽ èªäœã®ãµã€ãºã«äŸåããŸãã ãŸãã«ç§ãã¡ãæãã ãã®ã
次ã«ãããŒã«çšã®ããã¢ãã«ãã©ã®ããã«æ§ç¯ãããŠããããèŠãŠã¿ãŸãããã
if (clazz.equals(Ball.class)) { GradientDrawable bgShape = new GradientDrawable(); bgShape.setColor(ContextCompat.getColor(getContext(), R.color.gray)); bgShape.setCornerRadius(elementSize); switch (color) { case GREEN: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.green)); return bgShape; case RED: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.red)); return bgShape; case BLUE: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.blue)); return bgShape; case YELLOW: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.yellow)); return bgShape; case PURPLE: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.purple)); return bgShape; case CYAN: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.cyan)); return bgShape; } }
ã¯ããããã»ã©è€éã§ã¯ãããŸããã æåã«åœŒãã¯ããŒã«ãæãããããã圌ãã¯å¿
èŠãªãã³ãã§ãããæ³šãã ã ãªãã¹ã€ããããããããŒã«ããåºããã®ã ãã§è²ãèšå®ã§ããªãã®ã§ããïŒ
ãããã¯ç°ãªãè²ã ããã§ãã èŠçŽ ã«æ ŒçŽãããè²ã¯Javaããã®éåžžã®åæåã§ãããè²ãšããŠdrawableãåãå
¥ããã®ã¯ãéåžžã®æååå€ãæã€éåžžã®AndroidãªãœãŒã¹ã§ãã ããšãã°ãããã¯å°ãèµ€ããã®ã§ãïŒ
<color name="red">#D81B60</color>
ãããã®ãä»ã®ãã®ãšæ¥çããã®ã¯æªãèãã§ããããæ¥ãèµ€ã§ã¯éãè¶³ããããã©ã³ãå
šè¬ãããã£ãŠããªãœãŒã¹ãã¡ã€ã«ãä¿®æ£ããã®ã§ã¯ãªããå
šäœãæžãçŽããªããã°ãªããªããšæãæµ®ãã¶ã§ãããã
ããŠãåå¿è
åã-穎ããããã¢ãã«ãæ§ç¯ããŸãã
if (clazz.equals(Hole.class)) { GradientDrawable bgShape = new GradientDrawable(); bgShape.setCornerRadius((float) (elementSize * ROUND_RECT_SIZE)); switch (color) { case GREEN: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.green)); return bgShape; case RED: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.red)); return bgShape; case BLUE: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.blue)); return bgShape; case YELLOW: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.yellow)); return bgShape; case PURPLE: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.purple)); return bgShape; case CYAN: bgShape.setColor(ContextCompat.getColor(getContext(), R.color.cyan)); return bgShape; } }
ç¹°ãè¿ããŸãããæ°ãããã®ã¯äœããããŸããã穎ãæããŠãå¡è£
ãããµããªã«ã³ãã«æž¡ããŸããã
ããã§ãããªãã¯äœããå¿ããŸãããïŒ ããŒã...穎ãããŒã«ããããã¯...ãããŠç©ºã®å ŽæïŒ ããšãã°ãé
åã§nullãæ€åºããããšã©ããªããŸããïŒ
if (item == null) { GradientDrawable bgShape = new GradientDrawable(); bgShape.setColor(ContextCompat.getColor(getContext(), android.R.color.transparent)); bgShape.setCornerRadius((float) (elementSize * ROUND_RECT_SIZE)); return bgShape; }
ã¯ããããã¯ãŸã£ããåãçŸããäžžãæ£æ¹åœ¢ã§ãããããæ°ãããã®ã¯äœããããŸããã ãã¿ãŸããããã èŠããŸããã
å®äºãèŠçŽ ãæ§ç¯ã§ããŸãã ããã§äœãæ¢ããŸãããïŒ ãã...ã¯ãïŒ ããããæãæ¹æ³ã«ã€ããŠ
@Override protected void onDraw(Canvas canvas) { if (field == null) { return; } for (int i = 0; i < field.getField().length; i++) { for (int j = 0; j < field.getField()[0].length; j++) { Drawable d = selectDrawable(field.getField()[i][j]); d.setBounds(j * elementSize + paddingSize, i * elementSize + paddingSize, (j + 1) * elementSize - paddingSize, (i + 1) * elementSize - paddingSize); d.draw(canvas); } } }
ããããã«ã ãã£ãŒã«ããæ©ãåããåèŠçŽ ã«ã€ããŠããã®ã°ã©ãã£ãã¯è¡šçŸãèŠã€ãããã®ãµã€ãºãšã€ã³ãã³ããçžäºã«èšå®ãããã£ã³ãã¹ã«æç»ããŸãã ã¡ãªã¿ã«ãããã§ã¯ãã£ã³ãã¹äžã«æç»ãããããŒã¢ãã«ã§ããããã£ã³ãã¹èªäœã«ãããŠã¢ãã«ãæç»ããªãã®ã¯è峿·±ãããšã§ãã ãããè¡ãã«ã¯ãæ¯åããã¢ãã«ãããããããã«å€æããå¿
èŠããããããã¯é·ãæéã§ãã
äœãèµ·ãã£ãã®ãèŠãŠã¿ãŸããããïŒ ãããè¡ãã«ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§èŠçŽ ãçŽæ¥èšå®ããããã¹ãã¬ãã«ãäœæããŸãïŒåé€ããŠåé€ããŸãã®ã§ãå¿é
ããªãã§ãã ããïŒ
ããã§ãæžããªãæ¹ããã public class Level { private Item[][] field; public Item[][] getField() { return field; } public Level() { field = new Item[6][6]; field[0][0] = new Block(); field[0][1] = new Block(); field[0][2] = new Hole(Color.RED); field[0][3] = new Block(); field[0][4] = new Block(); field[0][5] = new Block(); field[1][0] = new Block(); field[1][1] = new Ball(Color.RED); field[1][2] = new Ball(Color.GREEN); field[1][3] = new Ball(Color.YELLOW); field[1][4] = new Ball(Color.CYAN); field[1][5] = new Block(); field[2][0] = new Block(); field[2][1] = new Hole(Color.GREEN); field[2][2] = new Hole(Color.YELLOW); field[2][3] = new Hole(Color.PURPLE); field[2][4] = new Hole(Color.CYAN); field[2][5] = new Hole(Color.BLUE); field[3][0] = new Block(); field[3][1] = new Ball(Color.PURPLE); field[3][5] = new Block(); field[4][0] = new Block(); field[4][1] = new Block(); field[4][3] = new Ball(Color.BLUE); field[4][5] = new Block(); field[5][1] = new Block(); field[5][2] = new Block(); field[5][3] = new Block(); field[5][4] = new Block(); } }
ãããŠä»ãç§ãã¡ã¯èªåã®èŠè§£ãããçš®ã®æŽ»åã«çµã³ä»ããŠããã®ããžãã¹ãå§ããŸã

æåŸã«ãããã¯äœãã瀺ããŠããŸãïŒ
ãããŠä»ããã®ãããªçŸããåçã«è§ŠçºãããŠãç§ãã¡ã¯å¯Ÿè©±æ§ã®ç§ãã¡ã®èŠè§£ãæããŸã
ããŒã«ãæã¡ãŸã
èŠçŽ ãç§»åããæ¹æ³ãç¥ã£ãŠãããšã³ãžã³ãæ¢ã«ããã®ã§ããã¥ãŒãšäœããã®åœ¢ã§çžäºäœçšããé©åãªã¡ãœãããåŒã³åºãæ¹æ³ãèŠã€ããããšããã§ããŸããã
ããŸããŸãªæ¹æ³ã§ç«¶æå Žãšå¯Ÿè©±ããŸãã ãŠãŒã¶ãŒããŸã£ããæ°ã«å
¥ããªãå Žåã¯ãå
ã®ã²ãŒã ãšåãããã«ã³ã³ãããŒã«ãäœæããããšãã§ããŸããä»®æ³ãžã§ã€ã¹ãã£ãã¯ãåãä»ããŠãéè²ã«ãªããŸã§ã¯ãªãã¯ããŸãã ãŸããã¿ããã¹ã¯ãªãŒã³ã®ãã€ãã£ããžã§ã¹ãã£ã¯ãŸã æ£ããæ¹åã«ã¹ã¯ã€ãããã³ããŒã«ãã¹ã¯ã€ãããŠããããšãæãåºãããšãã§ããŸãã ããã£ããäœãããã€ããã ã£ãã®ïŒ ããã§ã¯è¡ãã
äžè¬ã«ãAndroidã«ã¯çµã¿èŸŒã¿ã®GestureManagerããããŸãããäœ¿çšæ¹æ³ãããããªãã£ããããã¹ãããã€ã¹ã§åäœããŸããããäœããã®çç±ã§ãæ²ç·ãã³ãã«ãèªèã§ããããã«èµ·åããŸããã§ãããåºãŠããã ããã§ã¯ãèªåã§æžããŠã¿ãŸããã
ãããã£ãŠãããŒã«ã¯æ£ç¢ºã«4ã€ã®æ¹åïŒäžäžå·Šå³ïŒã«ç§»åã§ããŸãã 確ãã«ãããã«å ããŠã圌ãã¯ã©ãã«ããŸã£ããåããªããããããŸããããããã¯ãŸã£ããé¢çœããããŸããã ãããã£ãŠãããŒã«ã®åãã®æ¹åã倿ããã«ã¯ã4ã€ã®ç°¡åãªãžã§ã¹ãã£ãŒã ããèªèããå¿
èŠããããŸãã
æ¬åœã«æ°ã«ããããšãªããå¥ã®ã¡ãœãããæžãå§ããŸãã
public Direction getSwipeDirection(float downHorizontal, float upHorizontal, float downVertical, float upVertical) { float xDistance = Math.abs(upHorizontal - downHorizontal); float yDistance = Math.abs(upVertical - downVertical); double swipeLength = getSwipeLength(xDistance, yDistance); if (swipeLength < elementSize / 2) { return Direction.NOWHERE; } if (xDistance >= yDistance) { if (upHorizontal > downHorizontal) { return Direction.RIGHT; } return Direction.LEFT; } if (yDistance > xDistance) { if (upVertical > downVertical) { return Direction.DOWN; } return Direction.UP; } return Direction.DOWN; }
æ¹åã¯äžã§èª¬æããEnumã§ãããä»ã®ãã¹ãŠã¯éåžžã«åçŽã§ãã4ã€ã®åº§æšãååŸãïŒååŸå
ã¯ãŸã éèŠã§ã¯ãããŸããïŒãåçŽæ¹åãšæ°Žå¹³æ¹åã®è·é¢ãèšç®ããŸããã ãã®åŸã圌ãã¯é«æ ¡ã®å¹ŸäœåŠã³ãŒã¹ãæãåºããã¹ã¯ã€ãèªäœã®é·ããèŠã€ããŸããã ãããéåžžã«å°ããå ŽåããŠãŒã¶ãŒã¯ãããšã¯äœã®é¢ä¿ããªããšèããäœãããŸããã svaypãè¯ãã£ãå Žåãã©ããè¯ãã£ãã®ãã倿ãããŠãŒã¶ãŒã«æ¹åãè¿ããŸãã ãã£ããã ç§ã奜ãã§ãã
ããŠãæ²ãã¿ã§ã¹ã¯ã€ãã®æ¹åãååã«æ±ºå®ããããšãåŠãã ãšããŸãããã ç³ãèš³ãããŸããããã©ã®ããŒã«ãã¹ãŽã¡ã€ããã«ããŸããïŒ æ£ããããŸãããã
ãããã£ãŠãæ¥ç¹ã®åº§æšããããŸãïŒåé¢ç¹ã®åº§æšããããŸããããããã©ãããŸããïŒïŒãããŠããããã®åº§æšãããèŠçŽ ãèŠã€ããå¿
èŠããããŸã...ããŒãã
public Coordinates getElementCoordinates(float horizontal, float vertical) { float xElCoordinate = horizontal / elementSize; float yElCoordinate = vertical / elementSize; return new Coordinates((int) xElCoordinate, (int) yElCoordinate); }
ç°åžžãªããšã¯äœããããŸããã ãã¹ãŠã®èŠçŽ ãåããµã€ãºã§ããããµã€ãºãããã£ãŠããïŒèªåã§æ±ºå®ããïŒå Žåãããã³ãã£ãŒã«ãã®ãµã€ãºããã§ã«èšç®ããŠããå Žåã¯ãååŸããã³åå²ããã ãã§ãã ãããŠããã®åº§æšã«ãã£ãŠèŠçŽ ãæäœããããšã¯ãšã³ãžã³ã®ã¿ã¹ã¯ã§ã
ããã§ãç§ãã¡ã¯ééããªããã©ãã«ããã®ããæšæž¬ã§ããŸãã ãã¹ãŠããšã³ãžã³ã«è»¢éããããã鳎ããã ãã§ãã ããããããã¯ãã¥ãŒã®ã¿ã¹ã¯ã§ã¯ãããŸããã 圌女ã®ä»äºã¯èŠããããšã§ãããããã€ãã®è¡åãåŠçããããã«ã¯ãæççã«ãŸãã¯æŽ»åçã«å¿
èŠã§ãã ãã©ã°ã¡ã³ãã¯ãŸã°ãã§ãããããã€ãã®ã¢ã¯ãã£ããã£ããããŸãã onTouchLictenerãã¥ãŒã«ãã³ã°ã¢ããããŸãã
private OnTouchListener onFieldTouchListener = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downHorizontal = event.getX(); downVertical = event.getY(); break; case MotionEvent.ACTION_UP: upHorizontal = event.getX(); upVertical = event.getY(); boolean isWin = fieldView.getField().makeTurn( fieldView.getElementCoordinates(downHorizontal, downVertical), fieldView.getSwipeDirection(downHorizontal, upHorizontal, downVertical, upVertical) ); }
ããããã«ã ã¿ãããããšã座æšãä¿åããããã£ã¹ãã¬ã€ãé¢ããšãããã«æ°åã®åº§æšãååŸãããŸããæ¬¡ã«ããã¹ãŠãããŒãã«åéãããã¥ãŒã«æž¡ããŸãã ãã¥ãŒã¯ããã«ãã¹ãŠãæäŸããããŒã«å€ã®çµæãååŸããŸãããããã¯å€ããå°ãªããã§ã¯ãããŸããããã¬ãã«ã®å®äºã®å
åã¯ç§ãã¡ã«æ»ããŸãã ãããåŠçããããã ãã«æ®ããåæç»ããå¿
èŠãããããšããã¥ãŒã«äŒããããšãå¿ããªãã§ãã ããã
ãªã¹ããŒã«è¿œå ããŸãã
fieldView.invalidate(); if (isWin) { animateView(fieldView); try { levelManager.finishLevel(); openLevel(levelManager.getCurrentLevelNumber()); } catch (GameException ex) { onMenuClick(); } } } return true;
ç§ãã¡ã¯ãã§ãã¯ããŠãäœããããŸããã æ£ç¢ºã«äœãããããå°ãåŸã§çè§£ããŸãããä»ã®ãšããã¯ãããã£ãŠã¿ãŸãããã ã¬ãã«ããäœåãªãã®ããã¹ãŠåé€ãã2ã€ã®ããŒã«ã ããæ®ããŠããã®ãã¡ã®1ã€ããã±ããã«å
¥ããŸã

ãžãžã ãããåäœããŸãã æ¬¡ã«é²ã
ã¬ãã«ãæ¢ããŠããŸã
ããããã«ã å®çšçãªãšã³ãžã³ãäœæãããããçŸããæç»ããããšãåŠã³ãŸãããä»ã§ã¯ãæ£ç¢ºã«æç»ããããšãåŠãã ããšã決å®ããã ãã§ãã ã¬ãã«ã§ãããã
ç§ãã¡ã®ç®æšã¯ã²ãŒã ãç§»æ€ããããšã§ãããæ°ãããã®ãæžãããšã§ã¯ãªããããæåã¯èªåã§ã¬ãã«ãæç»ããã€ããã¯ãããŸããã§ããã ã ãããå
ã®Qãã©ããã«æã£ãŠè¡ããããæ¯ã£ãŠããããã3ã4人ã®ãœããŒã®åŒè·å£«ãå€ãïŒãŸããããã¯ãŸã 圌女ã®ããã¡ãã§ãïŒãåºæ¥äžãã-å®äºã§ãã
ããã¯ãå
ã®ããã¡ãã®æ€çŽ¢ãããã§çµãã£ãŠããªãã ãã§ãã T68èªäœã¯é·ããæ¶ããŠãããäœããã®çç±ã§ãããã¯ãŒã¯äžã«åçããããŸããã§ããã2016幎ã«å¥ã®å
ã®ããã€ã¹ãèŠã€ããŸãã...äžè¬ã«èŠã€ããã®ã¯åé¡ã§ããæ²åããããããªãªãžãã«ãæ¢ããŠãããšãã«ãWindows 98ã§ãã®ããã¡ãã®ç§»æ€çã«å¶ç¶åºããããŸããããããŠããã®ããã¡ãã®ã¬ãã«ããªãªãžãã«ããåãé€ãããŠããã ãã§ãªããåã·ã³ãã«ããããã¯ãããŒã«ããŸãã¯ç©Žã®ããããã衚ãéåžžã®txtãã¡ã€ã«ã«ãããããšã«æ°ä»ãããšããç§ã¯ã©ãã»ã©é©ããŸããããèè
ãšè©±ãããŠã䜿çšããããã®åæã確ä¿ããåŸãç§ã¯åœŒããæç¢ºãªè¯å¿ãæã£ãŠèªåèªèº«ã«é£ããŠè¡ãã圌ããšäœããã¹ãããçè§£ããããšããŸããããã®ããã«ãããªãã¯ç¢ºãã«txtãã¡ã€ã«ãåããããã¡ãã«å
¥ããããšãã§ããŸããããããç§ã®ãšã³ãžã³ãããããšé£æºãããã«ã¯ããŸã 詊ããŠã¿ãå¿
èŠããããŸããããã§ãªããã°ãªããŸããããã£ãŠã¿ãŸãã©ã€ãã£ã³ã°ã¬ãã«ãããŒãžã£ãŒ
ããã¯å®éã«ã¯çŸããèãããŸã-txtãã¡ã€ã«ããéåžžã¬ãã«ã®ãªããžã§ã¯ããäœæãã圌ããèšã人ã«äžããå¥ã®ã¯ã©ã¹ããããŠåæã«ãçŸåšã®ã¬ãã«ã§ã®ã¬ãã«ããããã®ãã¡ã®ã©ãã ããããã«ããã®ãããã®ä»ã®ç掻ã®å¿«é©ããæ±ããŸãããããŒãžã£ãŒã¯äœããã®ç¶æ
ïŒããšãã°ãçŸåšã®ã¬ãã«ã®çªå·ïŒãä¿æããŠãããããããæç¹ã§ããã®ç¶æ
èªäœãååšããªãæ°ãããã®ãæãã«äœæãããšãäžå¿«ã«ãªããŸãïŒå€ããããŒãžã£ãŒã¯ç¹ã«äžå¿«ã«ãªããŸãããã·ã¹ãã ãå®å
šã«æ®åœ±ããŸãïŒã害ã®ãªãããã«ãã·ã³ã°ã«ãã³ãæ¹åããŸããã public class LevelManager { private static final String LEVELS_FOLDER = "levels"; private static final String LEVEL_FILE_EXTENSION = ".lev"; private static final int EMPTY_CELL = 0; private static final int BLOCK_CELL = 1; private static final int GREEN_BALL_CELL = 2; private static final int RED_BALL_CELL = 3; private static final int BLUE_BALL_CELL = 4; private static final int YELLOW_BALL_CELL = 5; private static final int PURPLE_BALL_CELL = 6; private static final int CYAN_BALL_CELL = 7; private static final int GREEN_HOLE_CELL = 22; private static final int RED_HOLE_CELL = 33; private static final int BLUE_HOLE_CELL = 44; private static final int YELLOW_HOLE_CELL = 55; private static final int PURPLE_HOLE_CELL = 66; private static final int CYAN_HOLE_CELL = 77; private static Context context; private static SharedSettingsManager sharedSettingsManager; private static LevelManager instance; private LevelManager() { } public static LevelManager build(Context currentContext) { context = currentContext; sharedSettingsManager = SharedSettingsManager.build(currentContext); if (instance == null) { instance = new LevelManager(); } return instance; }
ãã®å®æ°ã®æã¯äœã§ããïŒãããã¯ãå¡äŸã®èŠçŽ ã§ããå®éãé åºã«æ£çŽã«åãããã¬ãã«ã¯æ¬¡ã®ããã«
ãªããŸããåæ¡ã¯äœããæå³ããŸãããããŠãæ¯åã²ãŒã ã®å©ãã«ãªããªãããã«ããããã«ãç®ã«èŠããæç¢ºãªå®æ°ãå°å
¥ãããããã§ã®ã¿åäœããŸããäœããã®çç±ã§ããã«ããsharedSettingsManagerã«ã€ããŠãå¥ã®æéãã話ãããŸãããä»ã¯ãããŒãžã£ãŒã«ã¬ãã«ãéããããããé©åãªãªããžã§ã¯ããäœæããããã«æããŸããããããŒã¿ã¹ããªãŒã ããããŸããŸãªæ°åãæåãååŸããããã«ãã¹ãã£ããŒããããŸãã®ã§ããã¡ã€ã«ã«èšå®ããŸã private Scanner openLevel(int levelNumber) throws IOException { AssetManager assetManager = context.getAssets(); InputStream inputStream = assetManager.open( LEVELS_FOLDER + "/" + String.valueOf(levelNumber) + LEVEL_FILE_EXTENSION); BufferedReader bufferedReader = new BufferedReader (new InputStreamReader(inputStream)); return new Scanner(bufferedReader); }
ã¯ããã»ãšãã©å¿ããŠããŸããã
ç§ãã¡ãæã£ãŠãããã¹ãŠã®ã¬ãã«ã¯ã¢ã³ããã€ãè³ç£ã«ä¿åãããŠããŸãããã³ã³ããã¹ããæã£ãŠããå Žåã«ã®ã¿åé¡ããªããããšãã§ããŸãããããŠã圌ãã¯åœŒãã®çªå·ã«ãã£ãŠåŒã³åºãããŸãããããã£ãŠãå¿
èŠãªã¬ãã«ã®çªå·ã転éããã ãã§ãç®çã®ãã¡ã€ã«ã§åäœããæ¢è£œã®ã¹ãã£ããŒãååŸã§ããŸããæ¬¡ã«ãå¡äŸèŠçŽ ãã¢ã€ãã ã«å€æããŸãã private Item convertLegendToItem(int itemLegend) { switch (itemLegend) { case EMPTY_CELL: return null; case BLOCK_CELL: return new Block(); case GREEN_BALL_CELL: return new Ball(Color.GREEN); case RED_BALL_CELL: return new Ball(Color.RED); case BLUE_BALL_CELL: return new Ball(Color.BLUE); case YELLOW_BALL_CELL: return new Ball(Color.YELLOW); case PURPLE_BALL_CELL: return new Ball(Color.PURPLE); case CYAN_BALL_CELL: return new Ball(Color.CYAN); case GREEN_HOLE_CELL: return new Hole(Color.GREEN); case RED_HOLE_CELL: return new Hole(Color.RED); case BLUE_HOLE_CELL: return new Hole(Color.BLUE); case YELLOW_HOLE_CELL: return new Hole(Color.YELLOW); case PURPLE_HOLE_CELL: return new Hole(Color.PURPLE); case CYAN_HOLE_CELL: return new Hole(Color.CYAN); } return null; }
1ã€ã®å€§ããªã¹ã€ãããšè€éãªãã®ã¯ãããŸãããæåŸã«ãã¬ãã«å
šäœãåŠçããæ¹æ³ãåŠç¿ããŸãã public Level getLevel(int levelNumber) throws IOException { Scanner scanner = openLevel(levelNumber); int levelWidth = scanner.nextInt(); int levelHeight = scanner.nextInt(); Item levelMatrix[][] = new Item[levelHeight][levelWidth]; for (int i = 0; i < levelHeight; i++) { for (int j = 0; j < levelWidth; j++) { levelMatrix[i][j] = convertLegendToItem(scanner.nextInt()); } } Level level = new Level(levelMatrix); sharedSettingsManager.setCurrentLevel(levelNumber); return level; }
ç§ãã¡ã¯æ°ãåããŸãã-ã¬ãã«ãè¿ããŸãããå¥è·¡ ããããã¬ãã«ãéãããšã«å ããŠãããŒã«ãæ®ã£ãŠããªãç¬éã«ãå®äºãããå¿
èŠããããŸããããŒã«ãããã«æ®ã£ãŠãããã©ããã倿ããã®ã¯ãšã³ãžã³ã®ã¿ã¹ã¯ã§ããããã®ããã«çªç¶çµäºããã¬ãã«ãåŠçããŸã public void finishLevel() { sharedSettingsManager.setCurrentLevel( sharedSettingsManager.getCurrentLevel() + 1 ); if (sharedSettingsManager.getCurrentLevel() > sharedSettingsManager.getMaxLevel()) { throw new GameException(GameExceptionCodes.INCORRECT_LEVEL); } }
ããã圌ãã¯ãã®ã¬ãã«ãåæ Œããããšãã¡ã¢ããçŸåšã®ã¬ãã«ã®çªå·ã倿Žãããã¹ãŠã®ã¬ãã«ãçµäºããå ŽåãäŸå€ãåãåºããŸãããçãïŒæ¬¡ã«ãããšãã°ç¬¬2ã¬ãã«ã®
Xeã§ããã¡ããå®è¡ããŠã¿ãŠãã ããïŒãããŠçå®ã¯ããããæ©èœãããšããããšã§ããæ¬¡ã«ããŠãŒã¶ãŒã®å®çžŸãä¿åããæ¹æ³ãåŠç¿ããŸãå¥ã®ãããŒãžã£ãŒ
ãŠãŒã¶ãŒãæ¯åãã¹ãŠã®ã¬ãã«ã匷å¶ããããšããŠãŒã¶ãŒã¯æã£ãŠäžæºã«ãªããŸãããã®ãããéå§ãšçµäºã®éã«ããŒã¿ã倱ãããªãããã«ãçŸåšã®ã¬ãã«ãšæåŸã«äœ¿çšå¯èœãªã¬ãã«ã®å€ãäœããã®æ¹æ³ã§ä¿åããå¿
èŠããããŸãããã®ãããªåçŽãªãã®ãä¿åããããã«ãAndroidã«ã¯SharedSettingsããããŸããéåžžãèšå®ãä¿åããããã«äœ¿çšãããŸãããç§ãã¡ã«ãšã£ãŠãæ©èœããŸããå¥ã®ãããŒãžã£ãŒãååŸãã public static final String LAST_LEVEL = "current_level"; public static final String MAX_LEVEL = "max_level"; public static final String WAS_RAN_BEFORE = "was_ran_before"; private static final String APP_PREFS = "qook_prefs"; public static Context context; public static SharedSettingsManager instance; SharedPreferences sharedPreferences; private SharedSettingsManager() { sharedPreferences = context.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE); }
ãŸããã·ã³ã°ã«ãã³ããããç§ãã¡ãã©ãã«çªå
¥ãããã¯æ±ºããŠããããŸããããäœããã®çç±ã§ã¹ã¬ããã»ãŒãèªäœãå
±æèšå®ãå
±æããŠãããã©ããã調ã¹ãããã«ãç¹å¥ãªæ¬²æ±ã¯ãããŸãããããã§ãçŸåšããã³æå€§ã®ã¬ãã«ãæäŸããæ¹æ³ãåŠã³ãŸããå
public int getMaxLevel() { return sharedPreferences.getInt(MAX_LEVEL, 1); }
ãããŠ2 public int getCurrentLevel() { return sharedPreferences.getInt(LAST_LEVEL, 1); }
ä»ãããããæžãæ»ããŠã¿ãŠãã ããã2ã€ã®å¥ã
ã®ã¡ãœããã®äžã®ã©ãããåŒã³åºãããšã¯ç¹ã«æãŸãªãããããããå®è¡ããŸãããã private void setMaxLevel(int maxLevel) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt(MAX_LEVEL, maxLevel); editor.apply(); }
public void setCurrentLevel(int currentLevel) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt(LAST_LEVEL, currentLevel); editor.apply(); if (getMaxLevel() < currentLevel) { setMaxLevel(currentLevel); } }
ããŠã次ã®ã¬ãã«ã®çµããã«ãçŸåšã®ã¬ãã«ã倿Žããã ãã§ååã§ããæåŸãã©ããã¯ããããŒãžã£ãŒãç§ãã¡ãªãã§å€æããŸããããã§ãªããã°ããªã圌ã¯ããã«åº§ã£ãŠããã®ã§ããïŒããŒã¯ã¢ããã远å
ããã¡ãã¯ãã§ã«éãã§ãããããã¯è¯ãã§ãããã以å€ã¯äœããããŸãã-æªãã§ããããããããªãã¯æ¬åœã«ãã¿ã³ããæåã«ãæŒããŠãã¡ãã¥ãŒã«è¡ããã©ã®ã¬ãã«ãèŠããã®ãããã®ããããã®ãã
ãªãã€ã¹ãç«¶æå Žã®äžã«è¿œå ããŸãããã¿ã³ã«ç°¡åãªã³ãŒãã远å ããããšã¯ã§ããªãããããã®ä»çµã¿ã説æããããããŸãããããã«ããããŒãžã£ãŒãžã®åŒã³åºããŸãã¯å¥ã®ã¢ã¯ãã£ããã£ãžã®åãæ¿ã以å€ã«ã¯äœããããŸããããããããŒã¯ã¢ããèªäœãã©ã®ããã«è峿·±ããã瀺ãããšã¯çã«ããªã£ãŠããŸãã <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/game_activity" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/background" android:gravity="center_vertical" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context=".ui.activities.LevelActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/level_counter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="16dp" android:paddingTop="5dp" android:text="01 / 60" android:textSize="34sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:paddingBottom="10dp"> <ImageButton android:id="@+id/back_level_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:src="@drawable/menu_icon" /> <ImageButton android:id="@+id/reset_level_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:src="@drawable/restore_level" /> <ImageButton android:id="@+id/undo_step_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:src="@drawable/undo_step" /> </LinearLayout> </LinearLayout> <org.grakovne.qook.ui.views.FieldView android:id="@+id/field" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:background="@drawable/field_ground" android:foregroundGravity="center" /> </LinearLayout>
ãŸããç§ãã¡ã¯ããã¡ãèªäœãçè§£ããŸãããããšã¯ãããã«2ã3ã®ç»é¢ã远å ããä»»æã®ã¬ãã«ãéžæããã©ã³ãã¹ã±ãŒãããŒã¯ã¢ããã远å ããŠããããèã«çœ®ãã ãã§ããããããªããšïŒã¬ãã«ã®ã¡ãã¥ãŒãæžã
ãã®ããžãã¹ã«ã¯å¥ã®ç»é¢ãé¢äžããŸããããã¯éå±ä»¥äžã«èŠããŸããåã¬ãã«ã¯å°ããªæ£æ¹åœ¢ã§ãéããŠããããŸã éããŠããªãããŸããŸãªè²ã®ã¬ãã«ã§ãéããŠããã¬ãã«ãã¯ãªãã¯ããããšã¯ã§ããŸãããããŒã¯ã¢ãããäœæããŸããïŒ <TextView android:id="@+id/title_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:paddingBottom="16dp" android:text="@string/app_name" android:textAllCaps="true" android:textSize="48sp" android:textStyle="bold" /> <GridView android:id="@+id/level_grid" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="9" android:numColumns="5"> </GridView>
èŠåºããšå°ããªã°ãªãããã¥ãŒã¯æ°ãããã®ã§ã¯ãããŸãããæ¬¡ã«ããã®ãã¥ãŒãäœã䟿å©ãªãã®ã§åããæ¹æ³ãèŠã€ããŸãããã®ããã«ã¯ãæ°ãããã¥ãŒãäœæããããŒã¿ãåããclickListenerãã¢ã¿ããããŠèŠªã«è©°ã蟌ãã¢ããã¿ãŒãäœæããå¿
èŠããããŸãããã®ãããªãã®ïŒ
public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater vi; vi = LayoutInflater.from(getContext()); @SuppressLint("ViewHolder") View view = vi.inflate(R.layout.level_item, null); Integer currentLevelNumber = getItem(position); if (currentLevelNumber != null) { Button levelButton = (Button) view.findViewById(R.id.level_item_button); if (levelButton != null) { levelButton.setText(String.valueOf(currentLevelNumber)); if (position < maxOpenedLevel) { levelButton.setBackgroundResource(R.drawable.opened_level_item); levelButton.setClickable(true); levelButton.setOnClickListener(clickListener); levelButton.setId(currentLevelNumber); } else { levelButton.setBackgroundResource(R.drawable.closed_level_item); levelButton.setClickable(false); } } } return view; }
ãã
ãã¹ãŠã®ã¬ãã«ãã¿ã³ãæ£æ¹åœ¢ã«ããã ãã§ãããããè¡ãã«ã¯ãç¬èªã®ãã¿ã³ç¶æ¿è
ãäœæããããã€ãã®éæ³ã远å ããŸãã public class LevelButton extends Button { @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, widthMeasureSpec); } }
ãžãžã
ãªããšããå¹
ããã®ãããªé«ããèª°ãæ°ã¥ããŸããã§ãããã¢ã¯ãã£ããã£ãäœæãããšãã«ãã¹ãŠãåŒã³åºãã ãã§ã @Override public void onResume() { super.onResume(); manager = LevelManager.build(getBaseContext()); View.OnClickListener levelClick = new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getBaseContext(), LevelActivity.class); intent.putExtra(DESIRED_LEVEL, v.getId()); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); startActivity(intent); } }; LevelGridAdapter adapter = new LevelGridAdapter(this, R.layout.level_item, getListOfLevelNumbers(), manager.getMaximalLevelNumber(), levelClick); adapter.setNotifyOnChange(false); levelGrid.setAdapter(adapter); levelGrid.setVerticalScrollBarEnabled(false); }
ãã¿ã³ãã¯ãªãã¯ããŸãã-ã¬ãã«ãéããŸããã çŸäºº
éã¶
ã¡ã€ã³ã¡ãã¥ãŒããã«ãããããŠãã¡ãããäœè
ã«ã€ããŠããã²ãŒã ã«è¿œå ããããããã§åŸããã®ããã¬ã€ããŠã¿ãŸããããç§ã®æ¯ããè·³ãè¿ãã®ã¯ç§ã®æåã®3ã€ã®ã¬ãã«ã§ã-coliçã«ãªããŸãããããããããã¯æ©èœããŸããäž¡æ¹ã®ã¬ãã«ãä¿åãããããã«3ã€ã®ã¢ã»ã³ããªãæ»ãããã«ããã£ã¹ãã¬ã€ãå転ããŠãã¢ããªã±ãŒã·ã§ã³ãããããããããå
šäœããããã«èŠããŸããããŠããã®ããšã¯æ©èœããã®ã§ããã®è¯ããGoogle Playã«æçš¿ãã奜ããªäººãèŠã€ããŠç»é²ãã25ãã«ã®Googleãæ¯æãããã°ããåŸ
ã£ãŠããããžã§ã¯ããäœæããããŒã¿ãã£ãŒã«ãã«å
¥åããŸã... ããããªãããããã€
ããããã«ã
ããã¡ããæžããŸããããããééããŠãå¥ã®åäŸæä»£ã®å€¢ãå®çŸããããšãããŒã¯ããã ãã§ãããããŠä»ãããªãã®èš±å¯ãåŸãŠãç¹ã«éãç¥äººããã®äžåšã®ããã«ç§ãå®å
šã«åŒãè£ããŸã§ããæåŸã®åãããã£ã³ã»ã«ããã¿ã³ã®æžã蟌ã¿ãçµäºããŸããæ¬å
·ãããªã¹ãæŽæ¿¯æ©GrakovNeã«ç§»æ€ããŸã