Mi aplicación se está ejecutando y trabajando plenamente en el emulador, pero que se estrella en un dispositivo físico

Kenneth Quilantang:

Pueden ustedes ayudarme con mi problema? Mi programa se ejecuta sin problemas en Android Studio emulador (Pixel 2 API 28), pero después de lo instalo en mi teléfono (Samsung Galaxy S8 + API 28), que sólo sigue chocando cada vez que toque el botón de juego :(. Yo también probado en algunos teléfonos y todavía tengo el mismo problema

En realidad, ¿no es cierto mi programa pero lo encontré en youtube pero el que hace el código en youtube me dio la luz verde para usarlo en mi proyecto a largo plazo.

Link del video sobre cómo hacer que el programa en el youtube:

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

Este es el enlace del código fuente se puede ejecutar:

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

Todo lo que quiero es ejecutar este código en un dispositivo físico, especialmente en mi teléfono Samsung Galaxy S8 +. Me parece que no puede resolver el problema que estoy un poco desesperada. Soy muy nuevo para programación en Java Lo siento mucho.

Código para la clase com.heyletscode.ihavetofly.Flight a lo solicitado por @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;
}

}

----------- ------------ EDITADO


CÓDIGO DE 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);

}
}

Esta es la Logcat en la pestaña de error después de instalar y pulsar el botón de reproducción del programa en mi Samsung Galaxy 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) 
Md. Asaduzzaman:

El problema real es en GameView.java:64 , donde la altura de la pantalla fija y ancho utilizan en lugar de dinámica. Este código funciona sin problemas en el dispositivo con la pantalla inferior o igual 1920x1080 px.

Causará un problema cuando el tamaño de pantalla se pone más que como el screenRatioX y screenRatioY viene <1, el cual a su vez a O en Flight.java:32 por fundido, lo que causó la excepción, ya

anchura y la altura debe ser> 0

Para tamaño de la pantalla Uso dinámico, puede utilizar lo siguiente:

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

Uso size.x y size.y en lugar de 1920f y 1080f respectivamente. Gracias

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=312405&siteId=1
Recomendado
Clasificación