質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

3030閲覧

Androidアプリ テトリス制作について

vike

総合スコア17

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/07/18 08:14

編集2016/07/18 12:12

###前提・実現したいこと
①xmlでボタンや背景を配置してもゲーム画面では表示されないので表示されるようにしたいです。
②ボタンでテトリスのブロックが移動、回転できるようにしたいです。
③ゲームオーバーの追加がしたいです。
ソースコード付きで解説を貰えるとうれしいです。
よろしくお願いします。

###該当のソースコード

Java

1public class sub extends AppCompatActivity { 2 private class FieldView extends SurfaceView { 3 4 Random mRand = new Random(System.currentTimeMillis()); 5 6 7 int[][][] blocks = { 8 //省略 9 }; 10 11 int[][] block = blocks[mRand.nextInt(blocks.length)]; 12 int posx=10, posy=1; 13 int mapWidth = 40; 14 int mapHeight = 40; 15 int count = 0; 16 int[][] map = new int[mapHeight][]; 17 int[][] next = new int[mapHeight][]; 18 19 public FieldView(Context context) { 20 super(context); 21 22 setBackgroundColor(0xFFFFFFFF); 23 setFocusable(true); 24 setFocusableInTouchMode(true); 25 requestFocus(); 26 } 27 28 29 30 public void initGame() { 31 for (int y = 0; y < mapHeight; y++) { 32 map[y] = new int[mapWidth]; 33 for (int x = 0; x < mapWidth; x++) { 34 map[y][x] = 0; 35 } 36 } 37 } 38 39 40 41 private void paintMatrix(Canvas canvas, int[][] matrix, int offsetx, int offsety, int color) { 42 ShapeDrawable rect = new ShapeDrawable(new RectShape()); 43 rect.getPaint().setColor(color); 44 int h = matrix.length; 45 int w = matrix[0].length; 46 47 for (int y = 0; y < h; y ++) { 48 for (int x = 0; x < w; x ++) { 49 if (matrix[y][x] != 0) { 50 int px = (x + offsetx) * 20; 51 int py = (y + offsety) * 20; 52 rect.setBounds(px, py, px + 20, py + 20); 53 rect.draw(canvas); 54 } 55 } 56 } 57 } 58 59 60 61 62 boolean check(int[][] block, int offsetx, int offsety) { 63 if (offsetx < 0 || offsety < 0 || 64 mapHeight < offsety + block.length || 65 mapWidth < offsetx + block[0].length) { 66 return false; 67 } 68 for (int y = 0; y < block.length; y ++) { 69 for (int x = 0; x < block[y].length; x ++) { 70 if (block[y][x] != 0 && map[y + offsety][x + offsetx] != 0) { 71 return false; 72 } 73 } 74 } 75 return true; 76 } 77 78 void mergeMatrix(int[][] block, int offsetx, int offsety) { 79 for (int y = 0; y < block.length; y ++) { 80 for (int x = 0; x < block[0].length; x ++) { 81 if (block[y][x] != 0) { 82 map[offsety + y][offsetx + x] = block[y][x]; 83 } 84 } 85 } 86 } 87 88 void clearRows() { 89 // 埋まった行は消す。nullで一旦マーキング 90 for (int y = 0; y < mapHeight; y ++) { 91 92 boolean full = true; 93 for (int x = 0; x < mapWidth; x ++) { 94 if (map[y][x] == 0) { 95 full = false; 96 break; 97 } 98 } 99 100 if (full) map[y] = null; 101 } 102 103 // 新しいmapにnull以外の行を詰めてコピーする 104 int[][] newMap = new int[mapHeight][]; 105 int y2 = mapHeight - 1; 106 for (int y = mapHeight - 1; y >= 0; y--) { 107 if (map[y] == null) { 108 continue; 109 } else { 110 newMap[y2--] = map[y]; 111 } 112 } 113 114 // 消えた行数分新しい行を追加する 115 for (int i = 0; i <= y2; i++) { 116 int[] newRow = new int[mapWidth]; 117 for (int j = 0; j < mapWidth; j ++) { 118 newRow[j] = 0; 119 } 120 newMap[i] = newRow; 121 } 122 map = newMap; 123 } 124 125 /** 126 * Draws the 2D layer. 127 */ 128 @Override 129 protected void onDraw(Canvas canvas) { 130 ShapeDrawable rect = new ShapeDrawable(new RectShape()); 131 rect.setBounds(0, 0, 210, 410); 132 rect.getPaint().setColor(0xff084c9e); 133 rect.draw(canvas); 134 canvas.translate(2, 2); 135 rect.setBounds(0, 0, 200, 400); 136 rect.getPaint().setColor(0xFFFFFFFF); 137 rect.draw(canvas); 138 139 //ブロックカラー 140 paintMatrix(canvas, block, posx, posy, 0xff084c9e); 141 paintMatrix(canvas, map, 0, 0, 0xff084c90); 142 143 } 144 145 int[][] rotate(final int[][] block) { 146 int[][] rotated = new int[block[0].length][]; 147 for (int x = 0; x < block[0].length; x ++) { 148 rotated[x] = new int[block.length]; 149 for (int y = 0; y < block.length; y ++) { 150 rotated[x][block.length - y - 1] = block[y][x]; 151 } 152 } 153 return rotated; 154 } 155 156 @Override 157 public boolean onKeyDown(int keyCode, KeyEvent event) { 158 switch (keyCode) { 159 case KeyEvent.KEYCODE_DPAD_CENTER: 160 int[][] newBlock = rotate(block); 161 if (check(newBlock, posx, posy)) { 162 block = newBlock; 163 } 164 break; 165 case KeyEvent.KEYCODE_DPAD_RIGHT: 166 if (check(block, posx + 1, posy)) { 167 posx = posx + 1; 168 } 169 break; 170 case KeyEvent.KEYCODE_DPAD_LEFT: 171 if (check(block, posx - 1, posy)) { 172 posx = posx - 1; 173 } 174 break; 175 case KeyEvent.KEYCODE_DPAD_UP: 176 case KeyEvent.KEYCODE_DPAD_DOWN: 177 int y = posy; 178 while (check(block, posx, y)) { y++; } 179 if (y > 0) posy = y - 1; 180 181 break; 182 } 183 mHandler.sendEmptyMessage(INVALIDATE); 184 return true; 185 } 186 187 public void startAnime() { 188 mHandler.sendEmptyMessage(INVALIDATE); 189 mHandler.sendEmptyMessage(DROPBLOCK); 190 } 191 192 public void stopAnime() { 193 mHandler.removeMessages(INVALIDATE); 194 mHandler.removeMessages(DROPBLOCK); 195 } 196 197 private static final int INVALIDATE = 1; 198 private static final int DROPBLOCK = 2; 199 200 /** 201 * Controls the animation using the message queue. Every time we receive an 202 * INVALIDATE message, we redraw and place another message in the queue. 203 */ 204 private final Handler mHandler = new Handler() { 205 @Override 206 public void handleMessage(Message msg) { 207 switch (msg.what) { 208 case INVALIDATE: 209 invalidate(); 210 break; 211 case DROPBLOCK: 212 if (check(block, posx, posy + 1)) { 213 posy++; 214 215 } else { 216 mergeMatrix(block, posx, posy); 217 clearRows(); 218 posx = 10; posy = 1; 219 block = blocks[mRand.nextInt(blocks.length)]; 220 } 221 222 223 224 invalidate(); 225 Message massage = new Message(); 226 massage.what = DROPBLOCK; 227 sendMessageDelayed(massage, 500); 228 break; 229 } 230 } 231 }; 232 } 233 234 FieldView mFieldView; 235 236 private void setFieldView() { 237 if (mFieldView == null) { 238 mFieldView = new FieldView(getApplication()); 239 setContentView(mFieldView); 240 241 242 } 243 } 244 245 246 247 @Override 248 protected void onResume() { 249 super.onResume(); 250 setFieldView(); 251 mFieldView.initGame(); 252 mFieldView.startAnime(); 253 Looper.myQueue().addIdleHandler(new Idler()); 254 } 255 256 257 258 259 260 // Allow the activity to go idle before its animation starts 261 class Idler implements MessageQueue.IdleHandler { 262 public Idler() { 263 super(); 264 } 265 266 public final boolean queueIdle() { 267 return false; 268 } 269 } 270 271}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yona

2016/07/18 09:44

コード用の記述に修正してください。
vike

2016/07/18 11:29

すいません、修正しました。
guest

回答1

0

ベストアンサー

①xmlはどこで設定していますか?xmlを作っただけでは画面には表示されません。

②過去にテトリスやゲームを作っていた人が同様の質問をしています、まずはそれらを調べるところから始めましょうね。

投稿2016/07/18 12:09

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vike

2016/07/18 12:15

①xmlはcontent_sub.xmlで設定しています。プレビューには表示されるのですがエミュレータでは表示がされません。 ②③については本当に自分の勉強不足でしてあまり理解ができかなかったので質問させていただきました。
yona

2016/07/18 12:28

①Androidの基本からしましょう。Activityにxmlを設定する方法をまずは調べましょうね。 ②③まだなにも実装されていない状態で質問しても無駄ですよ。過去の質問とその回答から学びましょう。
vike

2016/07/19 06:52

すいません理解出来なかったのでベストアンサーにして終了します。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問