Trabalhar com GameCanvas

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) {
//g.setColor(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

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

desculpem-me…

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

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

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

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

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.

this.setFullScreenMode(true);

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:

[quote]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 [/quote]

Waocnek