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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

0回答

272閲覧

Androidのシューティングゲームでの弾発射について

snowhite

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/07/08 12:58

実現したいこと

JavaでAndroidで動かすシューティングゲームをつくっています。
弾を発射する事が出来たのですが、画面の左上あたりに自機を動かさないと弾が発射されません。
また、弾を発射しても自機からではなく、一番したから発射されてしまいます。
自機をタップする事で自機から弾を発射するためにはどのように直したらよいでしょうか?

該当のソースコード

java

1**mainloop.java** 2 3import java.util.ArrayList; 4 5 6 7import android.content.Context; 8import android.content.res.Resources; 9import android.graphics.Bitmap; 10import android.graphics.BitmapFactory; 11import android.graphics.Canvas; 12import android.graphics.Color; 13import android.graphics.Paint; 14import android.graphics.Rect; 15import android.graphics.drawable.Drawable; 16import android.util.AttributeSet; 17import android.view.MotionEvent; 18import android.view.SurfaceHolder; 19import android.view.SurfaceView; 20 21public class mainloop extends SurfaceView implements SurfaceHolder.Callback,Runnable{ 22 private SurfaceHolder holder;//お決まり 23 private Thread thread;//お決まり 24 25 //どのActivityを使用しているかのための変数 26 private shooting2activity s2a; 27 private mesod ms; 28 private float disp_w,disp_h; 29 private Drawable jikiimg,tamaimg; 30 private Bitmap jikibit,tamabit; 31 //弾用、連続で重ならないようにの変数 32 private boolean tamaflg; 33 private int tamatime; 34 //弾変化ボタン用 35 private Rect tamabtn; 36 37 38 /* 39 * 今回画面に表示させるオブジェクトは自機と弾です 40 * 全然違うオブジェクトですがObjectクラスをextends 41 * することで同じような変数として扱うことができます。 42 * 自機は一つのオブジェクトだけですが、弾はたくさん 43 * 表示します。しかし数は決まっていません。なので 44 * ArrayListを使用することにしました。 45 * 普通の配列変数では、いくつ配列を使用するかを決めないと 46 * いけませんが、ArrayListの場合は使用したいときに配列的な 47 * ものをいくつでも作成することができます。 48 */ 49 private ArrayList<object> object = new ArrayList(); 50 51 //コンストラクタが二つあるけど気にしないように 52 //こちらのコンストラクタは、自前でViewを実装するときに 53 //呼ばれるコンストラクタっぽい 54 public mainloop(Context context) { 55 super(context); 56 init(context); 57 } 58 //こちらはxml方式でViewを呼び出すときに呼ばれるぽい 59 public mainloop(Context context, AttributeSet attrs) { 60 super(context, attrs); 61 init(context); 62 } 63 64 public void init(Context context){ 65 holder = getHolder();//お決まり 66 holder.addCallback(this);//お決まり 67 holder.setFixedSize(getWidth(), getHeight());//お決まり 68 /* 69 * s2a = (Shooting2Activity)context; 70 * よくわからないけども、私的には使用している(今現在 71 * 画面に表示させている)アプリの何か色々なものをcontext 72 * として受け取り、それがいまどのActivityのやつかとか 73 * そんな感じの雰囲気と思います。(キニシテナイ) 74 */ 75 s2a = (shooting2activity)context; 76 ms = new mesod(); 77 disp_w = s2a.disp_w; 78 disp_h = s2a.disp_h; 79 80 Resources resources = context.getResources();//画像登録準備 81 //ビットマップ方式で画像取り込み 82 //ビットマップで取り込む理由として、使用したい大きさなどに変換できるので 83 Bitmap img= BitmapFactory.decodeResource(resources, R.drawable.jiki); 84 //ここで画像分割 85 //わざわざ画像の大きさをgetWidthgetHeightを使用するのは 86 //確実に大きさを図って分割するため 87 jikibit = Bitmap.createBitmap(img,0,0,img.getWidth(),img.getHeight()); 88 89 Resources resources1 = context.getResources(); 90 Bitmap img1= BitmapFactory.decodeResource(resources1,R.drawable.tama); 91 92 tamabit = Bitmap.createBitmap(img1,0,0,img1.getWidth()/2,img1.getHeight()); 93 94 /* 95 * Onjectクラスではインスタンス(実装)できないので 96 * ObjectクラスをextendsさせたJikiクラスを実装 97 * ArrayListを使用しているため、addでインスタンスしています 98 * メソッドなどを使用する場合はget(インデックス).でメソッドなど 99 * 色々呼び出したりします。 100 * 今回はArrayListの0番目の要素に自機が入っています 101 */ 102 object.add(new jiki(disp_w,disp_h)); 103 object.get(0).Oint(jikibit, 240, 800, 0, 0, jikibit.getWidth(),jikibit.getHeight(),0); 104 105 106 107 108 tamaflg = true; 109 tamatime = 5; 110 111 //弾ボタン用座標 112 tamabtn = new Rect(50,50,100,100); 113 114 } 115 116 //implements Runnableを実装するとこのメソッドが自動追加 117 //ここがメインループとなります 118 public void run() {//お決まり 119 Canvas c; 120 Paint p = new Paint(); 121 p.setAntiAlias(true); 122 123 while(thread != null){ 124 c = holder.lockCanvas();//お決まり 125 126 c.drawColor(Color.BLACK); 127 128 //弾変化ボタン 129 p.setColor(Color.BLUE); 130 c.drawRect(tamabtn, p); 131 p.setTextSize(30); 132 c.drawText("tama:"+object.get(0).tamajoutai, 50, 150, p); 133 134 /* 135 * 自機も弾も同じObjectの要素を持っているので 136 * インスタンス(実装)時に作成したいクラスを 137 * 指定しておけば、同じObjectクラスとして使用 138 * することができます。わざわざ各オブジェクトの 139 * メソッドを呼ぶのではなく、共通しているObjectの 140 * メソッドを呼ぶことで解決しています 141 */ 142 for(int i=0;i<object.size();i++){ 143 object.get(i).ODraw(c); 144 object.get(i).OMove(); 145 /* 146 * 弾が画面外に出たらオブジェクト要素を消去します 147 */ 148 if(object.get(i).Ogetdead()==true) object.remove(i); 149 } 150 /* 151 * 弾を1發打ったら連続で打てないようになり、タイマー 152 * が0になったら打てるようにしています。 153 */ 154 if(tamaflg == false){ 155 --tamatime; 156 if(tamatime < 0){ 157 tamatime = 5; 158 tamaflg = true; 159 } 160 } 161 162 163 holder.unlockCanvasAndPost(c);//お決まり 164 165 try { 166 Thread.sleep(50);//お決まり 167 } catch (Exception e){} 168 } 169 } 170 171 public boolean onTouchEvent(MotionEvent event){ 172 int action = event.getAction(); 173 int x = (int)event.getX(); 174 int y = (int)event.getY(); 175 switch(action){ 176 case MotionEvent.ACTION_DOWN: 177 /* 178 * 弾を打っていいよ状態であり自機画像範囲にタップしていれば 179 * Jitama(弾クラス)を作成する 180 */ 181 if(tamaflg == true && ms.RectTap( 182 x, y, object.get(0).OgetTapRect()) == true){ 183 /* 184 * 今回は弾を出すような操作をすると 185 * どんな弾を作成するかのメソッドを 186 * 呼び出します 187 */ 188 Tamajoutai(); 189 tamaflg = false; 190 } 191 /* 192 * 弾状態を変化させるボタン 193 * 本来ならアイテムなどで弾の飛び方などの 194 * 変化をさせるものでしょうけども、今回は 195 * テストということで青短形タップで変化します 196 */ 197 if(ms.RectTap(x, y, tamabtn)==true){ 198 ++object.get(0).tamajoutai; 199 object.get(0).tamajoutai = (object.get(0).tamajoutai+3)%3; 200 } 201 break; 202 case MotionEvent.ACTION_UP: 203 break; 204 case MotionEvent.ACTION_MOVE: 205 /* 206 * 一応自機の移動もできますが、移動と弾発射は同時にはまだ 207 * できません 208 */ 209 if(ms.RectTap(x, y, object.get(0).OgetTapRect()) == true) object.get(0).OMove(x, y); 210 211 break; 212 } 213 return true; 214 } 215 216 /* 217 * Objectクラスに弾の状態を表す変数を用意しています 218 * それを外部から操作して変化させることでここのif文 219 * の分岐に割り当てられます 220 */ 221 public void Tamajoutai(){ 222 //通常の1発だけ 223 if(object.get(0).tamajoutai == 0){ 224 object.add(new jitama(disp_w,disp_h)); 225 object.get(object.size()-1).Oint( 226 tamabit, object.get(0).cx-jikibit.getWidth(), object.get(0).cy-jikibit.getHeight(), 227 10, 30, tamabit.getWidth(), tamabit.getHeight(),0); 228 } 229 //2発並んで 230 if(object.get(0).tamajoutai == 1){ 231 232 object.add(new jitama(disp_w,disp_h)); 233 object.get(object.size()-1).Oint( 234 tamabit, object.get(0).cx-20, object.get(0).cy-jikibit.getHeight(), 235 0, 30, tamabit.getWidth(), tamabit.getHeight(),0); 236 object.add(new jitama(disp_w,disp_h)); 237 object.get(object.size()-1).Oint( 238 tamabit, object.get(0).cx+20, object.get(0).cy-jikibit.getHeight(), 239 0, 30, tamabit.getWidth(), tamabit.getHeight(),0); 240 } 241 /* 242 * 36度づつ自機の周りに10発一気に出ます 243 */ 244 if(object.get(0).tamajoutai == 2){ 245 for(int i=0;i<10;i++){ 246 object.add(new jitama(disp_w,disp_h)); 247 object.get(object.size()-1).Oint( 248 tamabit, object.get(0).cx, object.get(0).cy, 249 30, 30, tamabit.getWidth(), tamabit.getHeight(),i*(360/10)); 250 } 251 } 252 } 253 254 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}//お決まり 255 256 public void surfaceCreated(SurfaceHolder arg0) {thread = new Thread(this);thread.start();}//お決まり 257 258 public void surfaceDestroyed(SurfaceHolder arg0) {thread = null;}//お決まり 259 260}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問