Playerに弾を撃たせる

弾クラスの作成


以下のクラスを作成します
  1. package obj.ballet;
  2.  
  3. import java.awt.Color;
  4.  
  5. import densan.s.game.drawing.Drawer;
  6. import densan.s.game.manager.GameManager;
  7. import densan.s.game.object.GameObjectBase;
  8.  
  9. public class PlayerBallet extends GameObjectBase implements Ballet{
  10.  
  11. /**
  12. * 弾の大きさ
  13. */
  14. private static final int SIZE = 5;
  15. public PlayerBallet(double x, double y, double rad, double speed) {
  16. super(x, y, SIZE,SIZE);
  17. // TODO Auto-generated constructor stub
  18. setVector(speed, rad);
  19. }
  20.  
  21. @Override
  22. public void update() {
  23. // TODO Auto-generated method stub
  24. move();
  25. vanish();
  26. }
  27.  
  28. @Override
  29. public void draw(Drawer d){
  30. // TODO Auto-generated method stub
  31. d.setColor(Color.BLACK);
  32. d.fillCircle(getCenterX(), getCenterY(), 5);
  33. }
  34.  
  35. @Override
  36. /**
  37. * 画面外消失判定
  38. */
  39. private void vanish() {
  40. // TODO Auto-generated method stub
  41. //画面外に出たか
  42. if(!(0<getMaxY()&&getY()<GameManager.getInstance().getFrameHeight()&&0<getMaxX()&&getX()<GameManager.getInstance().getFrameWidth()))
  43. remove();
  44. }
  45. }
  46.  
  47.  

解説


ここでは弾の描画と大きさ、その動きを記述している。
vanishメソッドは画面の外に出たとき、GameObjectBaseのremoveメソッドを呼び出しremoveフラグをtrueにすることでObjectManagerでupdateが呼び出された際に自身をリストから削除します。
javaはインスタンスへの参照がすべてなくなった際自動的にjavaのガベージコレクションによってそのインスタンスが消去されるので明示的に消去するコードは必要ありません。



では、次にPlayerに弾を打つ動作を追加しましょう。

弾クラスの作成


  1. package obj;
  2. import java.awt.Color;
  3. import java.awt.event.KeyEvent;
  4.  
  5. import densan.s.game.drawing.Drawer;
  6. import densan.s.game.input.KeyInput;
  7. import densan.s.game.object.GameObjectBase;
  8. import obj.ballet.PlayerBallet;
  9.  
  10.  
  11. public class Player extends GameObjectBase {
  12. /**
  13.   * 自機の移動速度
  14.   */
  15. public static final int SPEED = 2;
  16. /**
  17. * 射撃感覚
  18. */
  19. private static final int SHOOT_WAIT_FRAME = 10;
  20.  
  21. private ObjectManager om;
  22.  
  23. public Player() {
  24. super(100, 100, 50, 50);
  25. om = ObjectManager.getInstace();
  26. }
  27.  
  28. @Override
  29. public void update() {
  30. movement();
  31. shoot();
  32. }
  33.  
  34. /**
  35. * 移動処理
  36. */
  37. private void movement() {
  38. if (KeyInput.isPressing(KeyEvent.VK_UP)) {
  39. addY(-SPEED);
  40. }
  41. if (KeyInput.isPressing(KeyEvent.VK_DOWN)) {
  42. addY(SPEED);
  43. }
  44. if (KeyInput.isPressing(KeyEvent.VK_RIGHT)) {
  45. addX(SPEED);
  46. }
  47. if (KeyInput.isPressing(KeyEvent.VK_LEFT)) {
  48. addX(-SPEED);
  49. }
  50. }
  51.  
  52.  
  53. /**
  54. * 時間
  55. */
  56. private int time = 0;
  57. /**
  58. * 弾の射撃
  59. */
  60. private void shoot() {
  61. if(KeyInput.isPressing(KeyEvent.VK_Z)&&time==0) {//前の射撃からSHOOT_WAIT_FRAME分経過したか
  62. om.registerObject(new PlayerBallet(getCenterX(), getCenterY(), 0, 8));//現在位置と角度、速度を指定
  63. time = SHOOT_WAIT_FRAME;
  64. }
  65. if(time>0)
  66. time--;
  67. }
  68.  
  69. @Override
  70. public void draw(Drawer d) {
  71. d.setColor(Color.BLUE);
  72. d.fillRect(getX(), getY(), getWidth(), getHeight());
  73.  
  74. }
  75.  
  76. }
  77.  

変更点はshootメソッドを追加しupdateメソッド内で実行しているのといくつかのフィールドを追加したところである。
これでZキーを押せば弾が発射される状態が完成するはず