내 응용 프로그램을 실행하고 에뮬레이터에서 완벽하게 작동하지만, 물리적 장치에 충돌한다

케네스 Quilantang :

너희들은 내 문제를 도와 줄 수 있습니까? 내 프로그램은 안드로이드 스튜디오 에뮬레이터 (픽셀이 API 28)에 아무런 문제없이 실행,하지만 난 내 휴대 전화 (삼성 갤럭시 S8 +의 API 28)에 설치 한 후, 그냥 내가 재생 버튼을 :( 탭마다 충돌 계속. I를 또한 일부 휴대 전화에 그것을 시도하고 난 여전히 같은 문제가

사실 내 프로그램을 밤은하지만 난 유튜브에서 찾았지만 유튜브의 코드를 만드는 사람이 나에게 내 장기 프로젝트에서 사용할 수있는 녹색 빛을 주었다.

유튜브에서 해당 프로그램을 만드는 방법에 대한 비디오 링크 :

https://www.youtube.com/watch?v=5W3rVBDYFjE

이것은 당신이 그것을 실행할 수있는 소스 코드의 링크입니다 :

https://github.com/heyletscode/2D-Game-In-Android-Studio

내가 원하는 건 특히 내 휴대 전화 삼성 갤럭시 S8 +에 물리적 장치에이 코드를 실행하는 것입니다. 나는 종류 필사적으로 해요 문제를 해결할 수없는 것. 난 내가 정말 죄송 프로그래밍 자바에 아주 새로운 오전.

com.heyletscode.ihavetofly.Flight 클래스에 대한 코드 @Marc의 요청에 따라


int toShoot = 0;
boolean isGoingUp = false;
int x, y, width, height, wingCounter = 0, shootCounter = 1;
Bitmap flight1, flight2, shoot1, shoot2, shoot3, shoot4, shoot5, dead;
private GameView gameView;

Flight(GameView gameView, int screenY, Resources res) {

    this.gameView = gameView;

    flight1 = BitmapFactory.decodeResource(res, R.drawable.fly1);
    flight2 = BitmapFactory.decodeResource(res, R.drawable.fly2);

    width = flight1.getWidth();
    height = flight1.getHeight();

    width /= 4;
    height /= 4;

    width *= (int) screenRatioX;
    height *= (int) screenRatioY;

    flight1 = Bitmap.createScaledBitmap(flight1, width, height, false);
    flight2 = Bitmap.createScaledBitmap(flight2, width, height, false);

    shoot1 = BitmapFactory.decodeResource(res, R.drawable.shoot1);
    shoot2 = BitmapFactory.decodeResource(res, R.drawable.shoot2);
    shoot3 = BitmapFactory.decodeResource(res, R.drawable.shoot3);
    shoot4 = BitmapFactory.decodeResource(res, R.drawable.shoot4);
    shoot5 = BitmapFactory.decodeResource(res, R.drawable.shoot5);

    shoot1 = Bitmap.createScaledBitmap(shoot1, width, height, false);
    shoot2 = Bitmap.createScaledBitmap(shoot2, width, height, false);
    shoot3 = Bitmap.createScaledBitmap(shoot3, width, height, false);
    shoot4 = Bitmap.createScaledBitmap(shoot4, width, height, false);
    shoot5 = Bitmap.createScaledBitmap(shoot5, width, height, false);

    dead = BitmapFactory.decodeResource(res, R.drawable.dead);
    dead = Bitmap.createScaledBitmap(dead, width, height, false);

    y = screenY / 2;
    x = (int) (64 * screenRatioX);

}

Bitmap getFlight() {

    if (toShoot != 0) {

        if (shootCounter == 1) {
            shootCounter++;
            return shoot1;
        }

        if (shootCounter == 2) {
            shootCounter++;
            return shoot2;
        }

        if (shootCounter == 3) {
            shootCounter++;
            return shoot3;
        }

        if (shootCounter == 4) {
            shootCounter++;
            return shoot4;
        }

        shootCounter = 1;
        toShoot--;
        gameView.newBullet();

        return shoot5;
    }

    if (wingCounter == 0) {
        wingCounter++;
        return flight1;
    }
    wingCounter--;

    return flight2;
}

Rect getCollisionShape() {
    return new Rect(x, y, x + width, y + height);
}

Bitmap getDead() {
    return dead;
}

}

----------- EDITED ------------


코드 GameView.java

private Thread thread;
private boolean isPlaying, isGameOver = false;
private int screenX, screenY, score = 0;
public static float screenRatioX, screenRatioY;
private Paint paint;
private Bird[] birds;
private SharedPreferences prefs;
private Random random;
private SoundPool soundPool;
private List<Bullet> bullets;
private int sound;
private Flight flight;
private GameActivity activity;
private Background background1, background2;

public GameView(GameActivity activity, int screenX, int screenY) {
    super(activity);

    this.activity = activity;

    prefs = activity.getSharedPreferences("game", Context.MODE_PRIVATE);


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

        AudioAttributes audioAttributes = new AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .setUsage(AudioAttributes.USAGE_GAME)
                .build();

        soundPool = new SoundPool.Builder()
                .setAudioAttributes(audioAttributes)
                .build();

    } else
        soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

    sound = soundPool.load(activity, R.raw.shoot, 1);

    this.screenX = screenX;
    this.screenY = screenY;
    screenRatioX = 1920f / screenX;
    screenRatioY = 1080f / screenY;

    background1 = new Background(screenX, screenY, getResources());
    background2 = new Background(screenX, screenY, getResources());

    flight = new Flight(this, screenY, getResources());

    bullets = new ArrayList<>();

    background2.x = screenX;

    paint = new Paint();
    paint.setTextSize(128);
    paint.setColor(Color.WHITE);

    birds = new Bird[4];

    for (int i = 0;i < 4;i++) {

        Bird bird = new Bird(getResources());
        birds[i] = bird;

    }

    random = new Random();

}

@Override
public void run() {

    while (isPlaying) {

        update ();
        draw ();
        sleep ();

    }

}

private void update () {

    background1.x -= 10 * screenRatioX;
    background2.x -= 10 * screenRatioX;

    if (background1.x + background1.background.getWidth() < 0) {
        background1.x = screenX;
    }

    if (background2.x + background2.background.getWidth() < 0) {
        background2.x = screenX;
    }

    if (flight.isGoingUp)
        flight.y -= 30 * screenRatioY;
    else
        flight.y += 30 * screenRatioY;

    if (flight.y < 0)
        flight.y = 0;

    if (flight.y >= screenY - flight.height)
        flight.y = screenY - flight.height;

    List<Bullet> trash = new ArrayList<>();

    for (Bullet bullet : bullets) {

        if (bullet.x > screenX)
            trash.add(bullet);

        bullet.x += 50 * screenRatioX;

        for (Bird bird : birds) {

            if (Rect.intersects(bird.getCollisionShape(),
                    bullet.getCollisionShape())) {

                score++;
                bird.x = -500;
                bullet.x = screenX + 500;
                bird.wasShot = true;

            }

        }

    }

    for (Bullet bullet : trash)
        bullets.remove(bullet);

    for (Bird bird : birds) {

        bird.x -= bird.speed;

        if (bird.x + bird.width < 0) {

            if (!bird.wasShot) {
                isGameOver = true;
                return;
            }

            int bound = (int) (30 * screenRatioX);
            bird.speed = random.nextInt(bound);

            if (bird.speed < 10 * screenRatioX)
                bird.speed = (int) (10 * screenRatioX);

            bird.x = screenX;
            bird.y = random.nextInt(screenY - bird.height);

            bird.wasShot = false;
        }

        if (Rect.intersects(bird.getCollisionShape(), flight.getCollisionShape())) {

            isGameOver = true;
            return;
        }

    }

}

private void draw () {

    if (getHolder().getSurface().isValid()) {

        Canvas canvas = getHolder().lockCanvas();
        canvas.drawBitmap(background1.background, background1.x, background1.y, paint);
        canvas.drawBitmap(background2.background, background2.x, background2.y, paint);

        for (Bird bird : birds)
            canvas.drawBitmap(bird.getBird(), bird.x, bird.y, paint);

        canvas.drawText(score + "", screenX / 2f, 164, paint);

        if (isGameOver) {
            isPlaying = false;
            canvas.drawBitmap(flight.getDead(), flight.x, flight.y, paint);
            getHolder().unlockCanvasAndPost(canvas);
            saveIfHighScore();
            waitBeforeExiting ();
            return;
        }

        canvas.drawBitmap(flight.getFlight(), flight.x, flight.y, paint);

        for (Bullet bullet : bullets)
            canvas.drawBitmap(bullet.bullet, bullet.x, bullet.y, paint);

        getHolder().unlockCanvasAndPost(canvas);

    }

}

private void waitBeforeExiting() {

    try {
        Thread.sleep(3000);
        activity.startActivity(new Intent(activity, MainActivity.class));
        activity.finish();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

private void saveIfHighScore() {

    if (prefs.getInt("highscore", 0) < score) {
        SharedPreferences.Editor editor = prefs.edit();
        editor.putInt("highscore", score);
        editor.apply();
    }

}

private void sleep () {
    try {
        Thread.sleep(17);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public void resume () {

    isPlaying = true;
    thread = new Thread(this);
    thread.start();

}

public void pause () {

    try {
        isPlaying = false;
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (event.getX() < screenX / 2) {
                flight.isGoingUp = true;
            }
            break;
        case MotionEvent.ACTION_UP:
            flight.isGoingUp = false;
            if (event.getX() > screenX / 2)
                flight.toShoot++;
            break;
    }

    return true;
}

public void newBullet() {

    if (!prefs.getBoolean("isMute", false))
        soundPool.play(sound, 1, 1, 0, 0, 1);

    Bullet bullet = new Bullet(getResources());
    bullet.x = flight.x + flight.width;
    bullet.y = flight.y + (flight.height / 2);
    bullets.add(bullet);

}
}

이것은 내 삼성 갤럭시 S8 +에서 프로그램의 재생 버튼을 설치하고 도청 한 후 오류 탭에서 로그 캣입니다


2019-10-07 16:59:12.317 11879-11879/? E/Zygote: isWhitelistProcess - Process is Whitelisted
2019-10-07 16:59:12.322 11879-11879/? E/Zygote: accessInfo : 1
2019-10-07 16:59:21.447 11879-11879/com.heyletscode.ihavetofly E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.heyletscode.ihavetofly, PID: 11879
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.heyletscode.ihavetofly/com.heyletscode.ihavetofly.GameActivity}: java.lang.IllegalArgumentException: width and height must be > 0
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3114)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7050)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
     Caused by: java.lang.IllegalArgumentException: width and height must be > 0
        at android.graphics.Bitmap.createBitmap(Bitmap.java:1074)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:1041)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:991)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:912)
        at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:782)
        at com.heyletscode.ihavetofly.Flight.<init>(Flight.java:35)
        at com.heyletscode.ihavetofly.GameView.<init>(GameView.java:70)
        at com.heyletscode.ihavetofly.GameActivity.onCreate(GameActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:7327)
        at android.app.Activity.performCreate(Activity.java:7318)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3094)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7050) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 
. 메릴랜드 Asaduzzaman :

실제 문제에 GameView.java:64 고정 화면 높이와 폭 대신 동적으로 사용. 이 코드는 아래 스크린 장치에서 원활하게 실행 또는 1920 × 1080 픽셀 동일.

화면 크기가 더으로보다가 될 때 문제가 발생할 수 screenRatioXscreenRatioY가 <에 오에 설정 한 오는 Flight.java:32 로 예외를 발생 캐스트에 의해을

폭과 높이> 0이어야

사용하는 동적 화면 크기에, 당신은이를 사용할 수 있습니다 :

 Display display = getWindowManager().getDefaultDisplay();
 Point size = new Point();
 display.getSize(size);

사용 size.x 및 size.y 대신 각각 1920f와 1080f. 감사

추천

출처http://43.154.161.224:23101/article/api/json?id=312400&siteId=1