너희들은 내 문제를 도와 줄 수 있습니까? 내 프로그램은 안드로이드 스튜디오 에뮬레이터 (픽셀이 API 28)에 아무런 문제없이 실행,하지만 난 내 휴대 전화 (삼성 갤럭시 S8 +의 API 28)에 설치 한 후, 그냥 내가 재생 버튼을 :( 탭마다 충돌 계속. I를 또한 일부 휴대 전화에 그것을 시도하고 난 여전히 같은 문제가
사실 내 프로그램을 밤은하지만 난 유튜브에서 찾았지만 유튜브의 코드를 만드는 사람이 나에게 내 장기 프로젝트에서 사용할 수있는 녹색 빛을 주었다.
유튜브에서 해당 프로그램을 만드는 방법에 대한 비디오 링크 :
https://www.youtube.com/watch?v=5W3rVBDYFjE
이것은 당신이 그것을 실행할 수있는 소스 코드의 링크입니다 :
내가 원하는 건 특히 내 휴대 전화 삼성 갤럭시 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)
실제 문제에 GameView.java:64 고정 화면 높이와 폭 대신 동적으로 사용. 이 코드는 아래 스크린 장치에서 원활하게 실행 또는 1920 × 1080 픽셀 동일.
화면 크기가 더으로보다가 될 때 문제가 발생할 수 screenRatioX 및 screenRatioY가 <에 오에 설정 한 오는 Flight.java:32 로 예외를 발생 캐스트에 의해을
폭과 높이> 0이어야
사용하는 동적 화면 크기에, 당신은이를 사용할 수 있습니다 :
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
사용 size.x 및 size.y 대신 각각 1920f와 1080f. 감사