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

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

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

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

Android

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

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Android Studio

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

Q&A

解決済

1回答

1694閲覧

マルチスレッド処理をするSurfaceviewにおいてonTouchEventで画像を動かしたい。

nemo3002

総合スコア3

Java

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

Android

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

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Android Studio

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

0グッド

0クリップ

投稿2020/12/18 14:15

編集2020/12/18 15:45

Javaでゲームのandroidアプリを作っています。ゲームプレイヤーの画像を動かしたいのですが、うまくいきません。皆様の知恵をお借りしたいです。 

Surfaceviewのクラスから、プレイヤーのクラスの変数をいじることで画像を動かそうとしているのですが、エミュレータの起動がうまくいきません。

コード全文なので長いですが、おそらくGameViewクラスのonTouchEventメソッドとサブスレッドの処理のあたりで問題が起きています。

1.この現象の解決方法を教えていただきたいです。
2.またサブスレッドとメインスレッドの処理がコンピューター内でどのようになっているのかということがあまりピンときていないので、参考になるサイト、書籍等があったら教えていただきたいです。

この2つのうち特に1.について悩んでいるので1.だけでも回答をいただけるととても嬉しいです。よろしくお願いします。

テキストエディタにandroid studioを使っています。

Java

1package com.example.dodgerun; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.os.Bundle; 6import android.view.View; 7 8public class MainActivity extends AppCompatActivity { 9 private GameView gameView; 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 14 gameView = new GameView(this); 15 setContentView(gameView); 16 17 } 18}

Java

1package com.example.dodgerun; 2 3//import文省略 4public class GameView extends SurfaceView implements SurfaceHolder.Callback { 5 public GameView(Context context) { 6 super(context); 7 getHolder().addCallback(this); 8 } 9 10 private static long DRAW_INTERVAL = 10; 11 //threadクラスで使うからstatic 12 private Random ran = new Random(); 13 private Player player; 14 private List<Obstacle> obstacleList = new ArrayList<>(); 15 16 public static final int LEFT_FLICK= 0; 17 public static final int RIGHT_FLICK = 1; 18 public static final int UP_FLICK = 2; 19 public static final int DOWN_FLICK = 3; 20 21 private float adjustX = 150.0f; 22 private float adjustY = 150.0f; 23 private float touchX; 24 private float touchY; 25 private float nowTouchX; 26 private float nowTouchY; 27 28 private final Bitmap playerBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.devil_mini); 29 30 private DrawThread drawThread; 31 32 private class DrawThread extends Thread { 33 private AtomicBoolean isFinished = new AtomicBoolean(); 34 private void finish() { 35 isFinished.set(true); 36 } 37 38 @Override 39 public void run() { 40 SurfaceHolder holder = getHolder(); 41 while (!isFinished.get()) { 42 if (holder.isCreating()) { 43 continue; 44 } 45 Canvas canvas = holder.lockCanvas(); 46 if (canvas == null) { 47 continue; 48 } 49 drawGame(canvas); 50 holder.unlockCanvasAndPost(canvas); 51 synchronized (this) { 52 try { 53 wait(DRAW_INTERVAL); 54 } catch (InterruptedException e) { 55 } 56 } 57 } 58 } 59 } 60 61 private void startDrawThread() { 62 63 drawThread = new DrawThread(); 64 drawThread.start(); 65 } 66 67 public boolean stopDrawThread() { 68 if (drawThread == null) { 69 return false; 70 } 71 72 drawThread.finish(); 73 drawThread = null; 74 return true; 75 } 76 77 public void surfaceCreated(SurfaceHolder holder) { 78 startDrawThread(); 79 } 80 81 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 82 } 83 84 public void surfaceDestroyed(SurfaceHolder holder) { 85 stopDrawThread(); 86 } 87 88 protected void drawGame(Canvas canvas) { 89 canvas.drawColor(Color.WHITE); 90 91 int width = canvas.getWidth(); 92 int height = canvas.getHeight(); 93 if (player == null) { 94 95 player = new Player(playerBitmap, width); 96 } 97 player.draw(canvas, height); 98 //ここら辺でエラーが起きていると思います 99 Obstacle lo = launchObstacle(playerBitmap, width); 100 obstacleList.add(lo); 101 drawObstacleList(canvas, obstacleList, playerBitmap, width, height); 102 // 103 104 105 } 106 107 private Obstacle launchObstacle(Bitmap bitmap, int width) { 108 int randomX1 = ran.nextInt(bitmap.getWidth() * 2); 109 int randomX2 = ran.nextInt((width - bitmap.getWidth() * 2)); 110 return new Obstacle(randomX1, randomX2); 111 } 112 113 private void drawObstacleList(Canvas canvas, List<Obstacle> obstacleList, Bitmap bitmap, int width, int height) { 114 for (int i = 0; i < obstacleList.size(); i++) { 115 Obstacle ob = obstacleList.get(i); 116 if (i % 36 == 0) { 117 ob.draw1(canvas, bitmap, width, height); 118 } else if (i % 36 == 12 || i % 36 == 24) { 119 ob.draw2(canvas, bitmap, width, height); 120 } 121 ob.move(bitmap); 122 123 } 124 } 125 @Override 126 public boolean onTouchEvent(MotionEvent event) { 127 switch (event.getAction()) { 128 case MotionEvent.ACTION_DOWN: 129 touchX = event.getX(); 130 touchY = event.getY(); 131 break; 132 case MotionEvent.ACTION_UP: 133 nowTouchX = event.getX(); 134 nowTouchY = event.getY(); 135 check(); 136 break; 137 case MotionEvent.ACTION_MOVE: 138 break; 139 case MotionEvent.ACTION_CANCEL: 140 break; 141 } 142 return true; 143 } 144 private void check(){ 145 Log.d("FlickPoint", "startX:" + touchX + " endX:" + nowTouchX 146 + " startY:" + touchY + " endY:" + nowTouchY); 147 // 左フリック 148 if(touchX > nowTouchX) 149 { 150 if(touchX - nowTouchX > adjustX) 151 { 152 getFlick(LEFT_FLICK); 153 return; 154 } 155 } 156 // 右フリック 157 if(nowTouchX > touchX) 158 { 159 if(nowTouchX - touchX > adjustX) 160 { 161 getFlick(RIGHT_FLICK); 162 return; 163 } 164 } 165 // 上フリック 166 if(touchY > nowTouchY) 167 { 168 if(touchY - nowTouchY > adjustY) 169 { 170 getFlick(UP_FLICK); 171 return; 172 } 173 } 174 // 下フリック 175 if(nowTouchY > touchY) 176 { 177 if(nowTouchY - touchY > adjustY) 178 { 179 getFlick(DOWN_FLICK); 180 return; 181 } 182 } 183 } 184 public void getFlick (int direct) { 185 switch (direct){ 186 case LEFT_FLICK: 187 player.setLeft_change(player.getLeft_change() - 50); 188 break; 189 case RIGHT_FLICK: 190 player.setLeft_change(player.getLeft_change() + 50); 191 break; 192 } 193 } 194 195}

Java

1package com.example.dodgerun; 2 3 4public abstract class BaseObject { 5 protected float xPosition; 6 protected float yPosition; 7} 8

Java

1package com.example.dodgerun; 2//import文省略 3public class Player extends BaseObject{ 4 private Bitmap bitmap; 5 private Rect rect; 6 7 private Paint paint = new Paint (); 8 9 private float xPosition; 10 private float yPosition; 11 private int left_change; 12 13 public Player (Bitmap bitmap, int width) { 14 this.bitmap = bitmap; 15 this.left_change = (width - bitmap.getWidth()) / 2; 16 this.xPosition = rect.centerX(); 17 this.yPosition = rect.centerY(); 18 } 19 public void draw(Canvas canvas, int height) { 20 int top = height - bitmap.getHeight(); 21 int right = this.left_change + bitmap.getWidth(); 22 int bottom = top + bitmap.getHeight(); 23 rect = new Rect(this.left_change, top, right, bottom); 24 canvas.drawBitmap(bitmap, rect.left, rect.top, paint); 25 } 26 27 public int getLeft_change () { 28 return this.left_change; 29 } 30 public void setLeft_change (int left_change) { 31 this.left_change = left_change; 32 } 33 public Bitmap getBitmap () { 34 return this.bitmap; 35 } 36} 37

Java

1package com.example.dodgerun; 2 3import android.graphics.Bitmap; 4import android.graphics.Canvas; 5import android.graphics.Color; 6import android.graphics.Paint; 7 8import java.util.Random; 9 10public class Obstacle { 11 private float StrokeWidth = 20.0f; 12 Paint paint = new Paint (); 13 14 private float xPosition; 15 private float yPosition; 16 17 private final int left_widthX; 18 public Obstacle (int randomX1, int randomX2) { 19 yPosition = 0; 20 xPosition = randomX1; 21 left_widthX = randomX2; 22 } 23 public void draw1(Canvas canvas, Bitmap bitmap, int width, int height){ 24 Random ran = new Random(); 25 paint.setColor(Color.argb(255, 255, 0, 255)); 26 paint.setStrokeWidth(StrokeWidth); 27 paint.setStyle(Paint.Style.STROKE); 28   canvas.drawLine(xPosition, yPosition, (xPosition + (width - bitmap.getWidth() * 2)), yPosition, paint); 29 } 30 public void draw2(Canvas canvas, Bitmap bitmap, int width, int height){ 31 Random ran = new Random(); 32 paint.setColor(Color.argb(255, 255, 0, 255)); 33 paint.setStrokeWidth(StrokeWidth); 34 paint.setStyle(Paint.Style.STROKE); 35 canvas.drawLine(0, yPosition, left_widthX, yPosition, paint); 36 canvas.drawLine(left_widthX + bitmap.getWidth() * 2, yPosition, width, yPosition, paint); 37 } 38 public void move (Bitmap bitmap) { 39 yPosition += bitmap.getHeight() * 0.1; 40 } 41} 42

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

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

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

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

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

guest

回答1

0

自己解決

Playerクラスのxposition = text.CenterXのところが記述ミスでした

投稿2020/12/18 16:35

nemo3002

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問