データベースとは?|初心者でもわかるプログラミング学習入門
GEEK JOB編集部
オブジェクト指向の華ともいえるのが、この多態性(ポリモーフィズム)です。
多態性(ポリモーフィズム) |
スーパークラスで設定したメソッドと同名のメソッドをサブクラスで用いることで、同一のメソッド名を用いながら、クラスによって異なる処理をさせられること。 |
前章までで、BulletとEnemyの衝突判定については問題なく処理できました。
シューティングを作る上ではこれでも特に問題ありませんが、ここでは勉強のために、前述の多態性を用いてコードを書きなおしてみます。
まず、Fieladの中で別々に宣言していたbullet、enemiesという変数ですが、GameObjectクラスを用いて、objectsという一つの変数にまとめてしまいましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
Field.java public class Field extends JPanel implements KeyListener, ActionListener { private Player player; private List objects; public Field() { setSize(600, 400); setBackground(Color.white); setFocusable(true); addKeyListener(this); Timer timer = new Timer(20, this); timer.start(); player = new Player(); objects = new ArrayList<>(); for(int i=0; i<20; i++) { objects.add(new Enemy(i*30, 20)); } } @Override public void paintComponent(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); g.setColor(Color.red); player.draw(g); for(GameObject object: objects) { object.draw(g); } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { player.move(e.getKeyCode()); if(e.getKeyChar() == 'z') { objects.add(player.shoot()); } } @Override public void keyReleased(KeyEvent e) { } @Override public void actionPerformed(ActionEvent e) { player.update(); for(GameObject object: objects) { if(!object.isAlive()){ continue; } for(GameObject counter: objects) { if(object.collideWith(counter)) { object.delete(); counter.delete(); } } object.update(); } repaint(); } } |
BulletとEnemyをobjectsにまとめたのに合わせて、actionPerformed()メソッドを大幅に書き換えました。
順番に意味を追っていけば、決して理解できない内容ではないので、しっかりついてきてください。
まず、最初のforeach文では、objectsに格納された各objectに対して処理を行うことを示しています。
1 2 3 4 5 |
for(GameObject object: objects) { … } |
続いて来る以下の文で、もしそのオブジェクトが死んでいたら、そのオブジェクト分のループを1回パスする指示を出しています。
1 |
if(!object.isAlive()){ continue; } |
もしパスされなかったら、そのオブジェクトは生きていることを意味しているので、衝突判定を行っています。
ここでは、BulletもEnemyも複数出すことにしたので、衝突対象となるオブジェクトをcounterとして、もう一度foreach文を回しています。
1 2 3 4 5 6 7 |
for(GameObject counter: objects) { if(object == counter) { continue; } if(object.collideWith(counter)) { object.delete(); counter.delete(); } } |
以上です。
これらの書き換えがうまくいっていれば、章の冒頭に乗せたようなシューティングができていると思います。
……いかがだったでしょうか。ついてこられましたか?
ひとまずオブジェクト指向についての説明は以上ですが、本記事はもう少し続きます。