Trabalhar com GameCanvas

8 respostas
G

Pessoal, pesquisei na Net de descobrir que para trabalhar com game, é mais fácil usar o pacote GameCanvas, inclusive fiz uns exemplos q vi na net e funcionou no computador da facu, porém estou no meu trabalho e o mesmo exemplo dá um erro de io.exception, tenho instalado o wtk 2.2, midp 2.0 e cldc 1.1, já vi q o pacote está lá, mas qndo tendo carregar uma imagem aparece o erro, vide codigo…

import javax.microedition.lcdui.;
import javax.microedition.lcdui.game.
;

public class ExampleGameCanvas extends GameCanvas implements Runnable {
private boolean isPlay; // Game Loop runs when isPlay is true
private long delay; // To give thread consistency
private int currentX, currentY; // To hold current position of the 'X’
private int width; // To hold screen width
private int height; // To hold screen height

// Sprites to be used

private Sprite sprite;

private Sprite nonTransparentSprite;
// Constructor and initialization

public ExampleGameCanvas(){

super(true);

width = getWidth();

height = getHeight();

currentX = width / 2;

currentY = height / 2;

delay = 20;

// Load Images to Sprites
try{

Image image = Image.createImage("/transparent.png");      
   sprite = new Sprite (image,32,32);
}catch(Exception e){

System.err.println(e);

}
try{

Image imageTemp = Image.createImage("/nontransparent.png");

nonTransparentSprite = new Sprite (imageTemp,32,32);
}catch(Exception e){
	System.err.println(e);
}

}

// Automatically start thread for game loop

public void start() {

isPlay = true;

Thread t = new Thread(this);

t.start();

}

public void stop() { isPlay = false; }

// Main Game Loop

public void run() {

Graphics g = getGraphics();

while (isPlay == true) {
input();
  drawScreen(g);
  try { Thread.sleep(delay); }
  catch (InterruptedException ie) {}
}

}

// Method to Handle User Inputs

private void input() {

int keyStates = getKeyStates();
sprite.setFrame(0);

// Left
if ((keyStates & LEFT_PRESSED) != 0) {
  currentX = Math.max(0, currentX - 1);
  sprite.setFrame(1);
}  

// Right
if ((keyStates & RIGHT_PRESSED) !=0 )
  if ( currentX + 5 < width) {
    currentX = Math.min(width, currentX + 1);
    sprite.setFrame(3);
  }  

// Up
if ((keyStates & UP_PRESSED) != 0) {
  currentY = Math.max(0, currentY - 1);
  sprite.setFrame(2);
}

// Down
if ((keyStates & DOWN_PRESSED) !=0)
  if ( currentY + 10 < height) {
    currentY = Math.min(height, currentY + 1);
    sprite.setFrame(4);
  }

}

// Method to Display Graphics

private void drawScreen(Graphics g) {

<a href="//g.setColor">//g.setColor</a>(0xffffff);

g.setColor(0xFF0000);

g.fillRect(0, 0, getWidth(), getHeight());

g.setColor(0x0000ff);
// display sprites     
sprite.setPosition(currentX,currentY);
sprite.paint(g);
nonTransparentSprite.paint(g);

flushGraphics();

}

}

obrigado a todos q puderem ajudar…

vlw
Gabriel

8 Respostas

G

ops… :oops: já descobri… eu havia colocado a imagem no lugar errado, agora já está ok, coloquei na pasta correta…

desculpem-me…

S

ehehehe…eu já ia responder…mas vc respondeu antes…

Bom de qualquer maneira…se a sua imagem estiver no mesmo diretório dos seus arquivos, não precisa colocar a barra antes do nome

…("/transparent.png");

…(“transparent.png”);

Abraços

G

Alguém ai sabe qual é o tamanho (normalmente) de uma imagem de fundo para tela do celular, tipo, os padrões…

P

no meu net beans eu fiz uma aplicação mas ela nao criou a pasta res para imagens,eu criando ela e jogando umas imagens, basta passar o caminho

minhaimagen.gif por exemplo???

falow

W

Depende do celular. Se você visa um dispositivo (ou classe de dispositivos) especefico, basta descobrir o tamanho de Canvas dele. Nem sempre é possível que você tenha toda a tela disponível para a sua aplicação, pelo contrário geralmente. Um Nokia com 128 x 128 de tela pode te fornecer apenas 120 x 120 para trabalhar. Isto se você utilizar a GameCanvas em Full Screen Mode…

Se você está trabalhando com uma grande e variada população de dispositivos, então você possui um sério problema. Há apenas três opções:

a) A mais simples seria fazer um plano de fundo de um tamanho específico, como 120 x 120. Assim que alguém com uma tela de 128 x 160, como a do meu futuro celular, baixar sua aplicação, ela logo terá uma péssima impressão.

b) Fazer planos de fundo com tamanhos diferentes e distribuir várias versões de sua aplicação. Isto dá mais trabalho para você e para o consumidor.

c) Fazer um código dinâmico, que cria um plano de fundo em tempo de execução dependendo do tamanho da tela do celular que está executando o aplicativo. Isto dá MUITO trabalho para você e nenhum para o consumidor, dando uma boa impressão pra ele.

Eu costumo seguir a letra C, mas vez ou outra utiliza a A em casos específicos, como uma Splash Screen, com algumas das técnicas que uso na C para impedir qualquer má impressão por parte do consumidor. Algumas dicas se for seguir esta opção:

1 - Trabalhe com 96 x 96 (ou 96 em alguma das dimensões e na outra o tamanho do próprio celular, depende do caso). Deixe o resto como decoração que pode ser estendida.

2 - Avalie sempre que possível se é possível utilizar toda a tela dinamicamente. Um jogo de tabuleiro não possui grandes problemas em ser portável por múltiplos tamanhos de tela.

3 - Faça uma pesquisa nos celulares das operadoras em que pretende trabalhar, para ver o tamanho de suas telas. Faça uma média.

4 - Treine bastante sua matemática, pois você irá precisar…

Waocnek

T

Como coloco full screen??? num sei como utilizar a tela do celular ao máximo, fica sempre aparecendo o status da bateria, do sinal e o nome da classe.

M

this.setFullScreenMode(true);

W

Apesar de existirem algumas bibliotecas opcionais de fabricantes que tenham a opção de deixar seu Canvas em Full Screen, a versão Core desta funcionalidade existe apenas no MIDP 2.0, com o método setFullScreenMode(). Deve-se mencionar que na maioria dos dispositivos, o Full Screen é na verdade um Almost Full Screen, pois apesar deles fornecerem um espaço maior, a tela não fica com a totalidade da screen do aparelho. Eu já li duas coisas interressantes acerca deste método válidas de nota:

a) Alguns raros dispositivos não permitem tela em Full Screen, ou seja, o método setFullScreenMode() não faz absolutamente nada.

b) Em alguns casos, ocorre um comportamento anormal quando você o invoca em um construtor. Aparentemente o método getHeight() retorna um valor como se o Canvas não estivesse em Full Screen. Por isso eu costumo invocar ele quando tanto meu MIDlet quanto meu GameCanvas já estão inicializados e dentro do método startApp().

Aqui está a API do método:

setFullScreenMode

public void setFullScreenMode(boolean mode)

Controls whether the Canvas is in full-screen mode or in normal mode.

Parameters:

mode - true if the Canvas is to be in full screen mode, false otherwise

Since:

MIDP 2.0

Waocnek

Criado 11 de julho de 2006
Ultima resposta 13 de jul. de 2006
Respostas 8
Participantes 6