/** * 描画処理 * * @param 描画オブジェクト */ public void paintComponent(Graphics g) { super.paintComponent(g); // 背景を黒で塗りつぶす g.setColor(Color.BLACK); g.fillRect(0, 0, getWidth(), getHeight()); // X方向のオフセットを計算 int offsetX = MainPanel.WIDTH / 2 - (int) player.getX(); // マップの端ではスクロールしないようにする offsetX = Math.min(offsetX, 0); offsetX = Math.max(offsetX, MainPanel.WIDTH - map.getWidth()); // Y方向のオフセットを計算 int offsetY = MainPanel.HEIGHT / 2 - (int) player.getY(); // マップの端ではスクロールしないようにする offsetY = Math.min(offsetY, 0); offsetY = Math.max(offsetY, MainPanel.HEIGHT - map.getHeight()); // マップを描画 map.draw(g, offsetX, offsetY); // プレイヤーを描画 player.draw(g, offsetX, offsetY); // スプライトを描画 // マップにいるスプライトを取得 LinkedList sprites = map.getSprites(); Iterator iterator = sprites.iterator(); while (iterator.hasNext()) { Sprite sprite = (Sprite) iterator.next(); sprite.draw(g, offsetX, offsetY); } }
/** ゲームループ */ public void run() { while (true) { if (goLeftKey.isPressed()) { // 左キーが押されていれば左向きに加速 player.accelerateLeft(); } else if (goRightKey.isPressed()) { // 右キーが押されていれば右向きに加速 player.accelerateRight(); } else { // 何も押されてないときは停止 player.stop(); } if (jumpKey.isPressed()) { // ジャンプする player.jump(); } // プレイヤーの状態を更新 player.update(); // マップにいるスプライトを取得 LinkedList sprites = map.getSprites(); Iterator iterator = sprites.iterator(); while (iterator.hasNext()) { Sprite sprite = (Sprite) iterator.next(); // スプライトの状態を更新する sprite.update(); // プレイヤーと接触してたら if (player.isCollision(sprite)) { if (sprite instanceof Coin) { // コイン Coin coin = (Coin) sprite; // コインは消える sprites.remove(coin); // ちゃり〜ん coin.play(); // spritesから削除したので // breakしないとiteratorがおかしくなる break; } else if (sprite instanceof Kuribo) { // 栗ボー Kuribo kuribo = (Kuribo) sprite; // 上から踏まれてたら if ((int) player.getY() < (int) kuribo.getY()) { // 栗ボーは消える sprites.remove(kuribo); // サウンド kuribo.play(); // 踏むとプレイヤーは再ジャンプ player.setForceJump(true); player.jump(); break; } else { // ゲームオーバー gameOver(); } } else if (sprite instanceof Accelerator) { // 加速アイテム // アイテムは消える sprites.remove(sprite); Accelerator accelerator = (Accelerator) sprite; // サウンド accelerator.play(); // アイテムをその場で使う accelerator.use(player); break; } } } // 再描画 repaint(); // 休止 try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } }