Jogo lento [RESOLVIDO]

2 respostas
renan_willamy

Estou estudando com um livro da casa do codigo e precisei de uma imagem como background e uma para o player e antes de colocar as imagens png rodava muito rapido mas quando coloquei essas duas imagens o jogo ficou muito lento, se for por causa do tamanho da imagem como saber qual o melhor tamanho para economizar memoria e ser compátivel com outros dispositivos de tamanhos diferentes.

aqui o codigo

package br.com.casadocodigoi.mpossible;

import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class Impossible extends SurfaceView implements Runnable {
	boolean running = false;
	Paint paint;
	SurfaceHolder holder;
	Thread renderThread = null;
	int enemyRadius, enemyX, enemyY;
	int playerY = 200, playerX = 200, playerRadius = 50, score;
	double distance;
	boolean gameover = false;

	public Impossible(Context context) {
		super(context);
		paint = new Paint();
		holder = getHolder();

	}

	@Override
	public void run() {
		while (running) {
			// verifica se a tela está pronta
			if (!holder.getSurface().isValid())
				continue;
			// Lock the Canvas
			Canvas canvas = holder.lockCanvas();
			// desenha o player
			// canvas.drawColor(Color.BLACK);
			canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),
					R.drawable.sky), 0, 0, null);
			drawPlayer(canvas);
			drawEnemy(canvas);

			// verifica colisão
			checkCollision();

			if (gameover) {
				drawButtons(canvas);
				drawScore(canvas);
				stopGame(canvas);
				break;

			}
			// Placar
			drawScore(canvas);

			// Desenhar botoes
			drawButtons(canvas);

			// Atualiza e desbloqueia o canvas
			holder.unlockCanvasAndPost(canvas);

		}

	}

	public void drawPlayer(Canvas canvas) {
		paint.setColor(Color.GREEN);
		//canvas.drawCircle(playerX, playerY, playerRadius, paint);
		canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),
				R.drawable.nave), playerX-50,playerY-50, null);

	}

	public void drawEnemy(Canvas canvas) {
		paint.setColor(Color.RED);
		enemyRadius++;
		canvas.drawCircle(enemyX, enemyY, enemyRadius, paint);
	}

	public void moveDown() {
		playerY += 10;
	}

	public void checkCollision() {
		// verifica hipotenusa
		distance = Math.pow(playerY - enemyY, 2)
				+ Math.pow(playerX - enemyX, 2);
		distance = Math.sqrt(distance);

		if (distance <= enemyRadius + playerRadius) {
			gameover = true;
		}

	}

	public void resume() {
		running = true;
		renderThread = new Thread(this);
		renderThread.start();
	}

	public void stopGame(Canvas canvas) {
		paint.setStyle(Style.FILL);
		paint.setColor(Color.YELLOW);
		paint.setTextSize(60);
		canvas.drawText("Perdeu PlayBoy!", 20, getHeight() / 2, paint);
		holder.unlockCanvasAndPost(canvas);

	}

	public void drawScore(Canvas canvas) {
		// placar
		paint.setColor(Color.WHITE);
		paint.setStyle(Style.FILL);
		paint.setTextSize(50);
		canvas.drawText(String.valueOf(score), getWidth() / 2, 75, paint);
	}

	public void addPoints(int points) {
		score += points;
	}

	public void drawButtons(Canvas canvas) {
		// Restart
		paint.setColor(Color.WHITE);
		paint.setStyle(Style.FILL);
		paint.setTextSize(30);
		canvas.drawText("Restart", 50, 200, paint);

		// Exit
		paint.setColor(Color.WHITE);
		paint.setStyle(Style.FILL);
		paint.setTextSize(30);
		canvas.drawText("Extit", 50, 350, paint);
	}

	public void init() {
		score = 0;
		playerX = 200;
		playerY = 200;
		playerRadius = 50;
		enemyX = 0;
		enemyY = 0;
		enemyRadius = 0;
		gameover = false;
		resume();
	}
}
package br.com.casadocodigoi.mpossible;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;

public class Game extends Activity implements OnTouchListener {
	Impossible view;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// Deixar full screem
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

		view = new Impossible(this);

		setContentView(view);
		view.setOnTouchListener(this);

	}

	@Override
	protected void onResume() {

		super.onResume();
		view.resume();
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		
		if (event.getX()<150 && event.getY() >170 && event.getY()<200){
			view.init();
		}
		else if (event.getX()<120 && event.getY() >330 && event.getY()<360){
			System.exit(0);
		}else{
		
		view.moveDown();
		view.addPoints(100);
		}
		return true;
	}

}

2 Respostas

Marky.Vasconcelos

Seu unico problema (até onde li) é:

canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),  
                    R.drawable.sky), 0, 0, null);

Nunca faça o Decode de imagens em métodos de drawn, a cada loop voce vai carregar em memoria seu drawable.sky; o que gasta processamento, tempo e memoria; carregue-a num método de init() da sua classe e reutilize-a nesse método.

renan_willamy

Blz! Obrigado!

Criado 25 de agosto de 2013
Ultima resposta 27 de ago. de 2013
Respostas 2
Participantes 2