Olá, alguém teia algum exemplo de como eu faço para ter um LayerManager deslizante, eu li isso em uma JavaMagazine que apresenta o Pac Man pra celulares, eu tentei implementar mas não consegui
LayerManager com scrolling
11 Respostas
LayerManager deslizante? Não lembro de ter escrito isso…
Mas para fazer rolagem de tela, a idéia é você ter as layers de tamanho maior do que o da tela e usar o método setViewWindow para dizer qual área está sendo mostrada no momento.
Esse setViewWindow você vai chamando a cada iteração do loop mudando o x ou y para dar a impressão de a tela estar rolando.
Apenas tome cuidado para não sobrecarregar a memória do seu aparelho criando uma Layer grande demais.
Eu pessoalmente nunca testei isso, pois os jogos que precisavam de rolagem de fundo que implementei eram em MIDP 1. Mas se ainda não conseguir, coloque seu código aqui para tentarmos achar o problema.
É, bem isso, foi isso que eu tentei fazer, implementai um LayerManager maior que a tela e usei o setViewWindow, mas não certo, de tarde eu posto o código aí…
Bani… você é a Wanessa, quem escreveu aquele artigo?
Bom, resolvi testar para ver se funcionava mesmo.
Peguei o código do moinho lá do artigo, dupliquei a largura dele, e coloquei para ficar andando para a esquerda.
Funcionou bem…
x=++x%160;
layerManager.setViewWindow(x, 0,largura, altura);
P.S.: me chamarem de Vanessa Bueno já estou acostumada, afinal não vou querer competir com atriz da Globo, mas Wanessa deve ser da Wanessa Camargo, e aí já é demais para mim!
desculpe por ter ter te chamado de Wanessa
vc poderia me explicar os parâmetros do método setViewWindow
ou tb se vc pudesse me passar o código-fonte do teste que vc fez
:arrow: Parâmetros:
Você tem uma layer gigante e quer mostrar um pedaço dela.
Esse pedaço é um retângulo.
Então os dois primeiros parâmetros definem o ponto inicial desse retângulo (canto superior esquerdo), sendo primeiro o x e depois o y, e os dois últimos são a largura e altura.
:arrow: Código:
BGCanvas.javaimport java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class BGCanvas extends GameCanvas implements Runnable {
private boolean executando;
private MoinhoLayer fundo;
private final int largura = getWidth();
private final int altura = getHeight();
private LayerManager layerManager;
public BGCanvas() throws IOException {
super(true);
fundo = new MoinhoLayer(Image.createImage("/moinho.png"));
layerManager = new LayerManager();
layerManager.insert(fundo, 0);
}
public void start() {
executando = true;
Thread t = new Thread(this);
t.start(); // inicia a thread, executando o m?todo run
}
public void run() {
Graphics g = getGraphics();
final int tempo = 100;
int x=0;
while (executando) {
long inicio = System.currentTimeMillis();
fundo.girarPas();
x=++x%160;
layerManager.setViewWindow(x, 0,largura, altura);
renderiza(g);
long fim = System.currentTimeMillis();
int duracao = (int) (fim - inicio);
if (duracao < tempo) {
try {
Thread.sleep(tempo - duracao);
} catch (InterruptedException ie) { ie.printStackTrace(); }
}
}
layerManager = null;
fundo = null;
}
private void renderiza(Graphics g) {
g.setColor(0xb5b5f7);
g.fillRect(0, 0, largura, altura);
int x = (largura - 160) / 2;
int y = (altura - 160) / 2;
layerManager.paint(g, x, y);
flushGraphics();
}
public void stop() {
executando = false;
}
}
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.TiledLayer;
public class MoinhoLayer extends TiledLayer {
private final int[] quadros = { 5, 6, 7 };
private int posicao = 0;
private int indiceAnimacao;
public MoinhoLayer(Image imagem) {
super(10, 5, imagem, 32, 32);
final int[] mapa = {
0, 0, 0, 0, 0,0, 0, 0, 0, 0,
0, 5, 0, 5, 0,0, 5, 0, 5, 0,
0, 3, 5, 3, 0,0, 3, 5, 3, 0,
1, 2, 4, 2, 1,1, 2, 4, 2, 1,
1, 1, 2, 1, 1,1, 1, 2, 1, 1
};
for (int i = 0; i < mapa.length; i++) {
int coluna = i % 10;
int linha = (i - coluna) / 10;
setCell(coluna, linha, mapa[i]);
}
inicializarPas();
}
private void inicializarPas() {
indiceAnimacao = this.createAnimatedTile(5);
setCell(1, 1, indiceAnimacao);
setCell(2, 2, indiceAnimacao);
setCell(3, 1, indiceAnimacao);
}
public void girarPas() {
posicao = (posicao + 1) % 3;
setAnimatedTile(indiceAnimacao, quadros[posicao]);
}
}
public void startApp() {
if (canvas == null) {
try {
canvas = new BGCanvas();
canvas.start();
Command exitCommand = new Command("Exit", Command.EXIT, 0);
canvas.addCommand(exitCommand);
canvas.setCommandListener(this);
} catch (IOException ioe) {
System.out.println(ioe);
}
}
Display.getDisplay(this).setCurrent(canvas);
}
Não consegui… eu poderia te passar o meu código pra vc tentar evr o que é que eu faço de errado
Cola aí.
/*
* MapaCanvas.java
*
* Created on 7 de Julho de 2004, 16:58
*/
/**
*
* @author ping
*/
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Command;
import java.io.IOException;
public class MapaCanvas3 extends GameCanvas{
private Graphics g;
private Sprite spMapa;
private Sprite spSeta;
private LayerManager layer;
private Command cmSeleciona;
private int mapa = 1;
private int x;
private int y;
private int altura = getWidth();
private int largura = getHeight();
/** Creates a new instance of MapaCanvas */
public MapaCanvas3(Command cmSeleciona) {
super(true);
this.cmSeleciona = cmSeleciona;
try
{
spMapa = new Sprite(Image.createImage("/mapa2.png"));
spSeta = new Sprite(Image.createImage("/cursor3.png"));
spMapa.setPosition(0, 0);
spSeta.setPosition(82,82);
}
catch (IOException e)
{
System.out.println("Não conseguiu criar o Sprite: "+e);
}
layer = new LayerManager();
layer.append(spMapa);
layer.append(spSeta);
g = this.getGraphics();
x = 0;
y = 0;
renderiza(g);
}
public void renderiza(Graphics g)
{
spMapa.paint(g);
if (mapa!=1)
{
System.out.println("entrou");
layer.setViewWindow(x, y, getWidth(), getHeight());
}
else
{
layer.setViewWindow(x, y, getWidth(), getHeight());
}
spSeta.paint(g);
g.fillRect(0, 0, getWidth(), getHeight());
layer.paint(g, 0, 0);
flushGraphics();
}
public void zoomin()
{
if (mapa == 3)
{
try
{
x = 267-getWidth();
y = 288-getHeight();
mapa = 2;
spMapa.setImage(Image.createImage("/mapa3.png"), 267, 288);
renderiza(g);
}
catch (IOException e)
{
System.out.println("Não criou o novo sprite: "+e);
}
}
else if (mapa == 2)
{
try
{
x = 0;
y = 0;
mapa = 1;
spMapa.setImage(Image.createImage("/mapa2.png"), 171, 168);
renderiza(g);
}
catch (IOException e)
{
System.out.println("Não conseguiu criar o novo Sprite: "+e);
}
}
}
public void zoomout()
{
if (mapa == 1)
{
try
{
mapa = 2;
spMapa.setImage(Image.createImage("/mapa3.png"), 267, 288);
x = 267-getWidth();
y = 288-getHeight();
renderiza(g);
}
catch (IOException e)
{
System.out.println("Não criou o novo sprite: "+e);
}
}
else if (mapa == 2)
{
try
{
mapa = 3;
spMapa.setImage(Image.createImage("/mapa4.png"), 339, 363);
x = 339-getWidth();
y = 363-getHeight();
renderiza(g);
}
catch (IOException e)
{
System.out.println("Não conseguiu criar o novo Sprite: "+e);
}
}
}
}
Agoar deu certo… eu fiz isso, eu tenho três imagens do mapa do Brasil, uma maior que a outra, e a idéia é que o usuário possa dar um zoom na imagem eu consegui implementar isso… só que eu tentei colocar um Sprite encima desta imagem para fazer um cursor para ele selecionar o estado que ele quer, só que não tem jeito de aparecer o cursor,se puder me ajudar[/quote]