PDA

View Full Version : [JAVA] Problema bufferstrategy ed eventi tastiera


Narat
08-06-2011, 01:43
Salve a tutti sto creando un gioco in java con l'utilizzo del bufferimage ma ho un problema cioè: quando creo un pannello oppure utilizzo il frame per creare il menu del gioco come clicco su new game gli eventi della tastiera non funzionano più.

Sapete dirmi il perchè?
grazie in anticipo, vi allego il codice ^_^

package GUI;

import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import Thread.ZombieAction;
import Thread.BulletMovements;
import Thread.CreateZombie;
import Thread.CreateEnergyBall;
import Thread.ZombieMovements;
import World.ObjectClass;
import World.UploadImages;
import Players.BulletPlayer;
import Players.Direction;
import Players.Zombie;
import Players.EnergyBall;
import Players.Player;
import World.World;
import XML.LoadMap;
import MouseKeyboardEvents.*;

public class Game extends JFrame implements Runnable,KeyListener{
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int UP = 0;
private static final int DOWN = 1;
private static final int LEFT = 2;
private static final int RIGHT = 3;
private static final int SHOT = 4;
private boolean [] premuti = new boolean[5];
private static MotionDispatcher motion=null;
private BufferStrategy strategy;
private static World world;
private static Player player;
private static Window window;
/**
* Constructor
*/
public Game()
{
initWindow();
initComponnents();
}

/**
* initiate the window
*/
private void initWindow()
{
// setSize(window.getDimensionPixelX(), window.getDimensionPixelY());
setTitle("Gioco");
setSize(800,672);
setUndecorated(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
setIgnoreRepaint(true);
// setFocusable(true);
}

/**
* initiate the componnents
*/
private void initComponnents()
{
setFocusTraversalKeysEnabled(false);
addKeyListener(this);
}
private void initBufferStrategy(){
createBufferStrategy(2);
strategy = getBufferStrategy();
requestFocus();
}

/**
* Draw the frame
* @param panel
* @param graphics graphic
*/
public void newGame(MainPanel panel){
initBufferStrategy();
createMap();
// initComponnents();
Game.this.requestFocus();
run();
}
private void draw(Graphics2D g)
{
Player p = null;
int windowX=window.getPrinterPartX();
int windowY=window.getPrinterPartY();

int posX=window.indexWindowX(player,world);
int posY=window.indexWindowY(player,world);

for(int i=0; i < world.getLIVELLO()-1; i++)
{
for(int j=0; j < windowX; j++)
{
for(int k=0; k < windowY; k++)
{
if(i == 0){
if(world.getWorld()[i][posX][posY] instanceof ObjectClass)
{
ObjectClass ob = (ObjectClass) world.getWorld()[i][posX][posY];
g.drawImage(UploadImages.getSummerTiles()[ob.getID()],ob.getPositionWidth()-window.getPositionWidth(), ob.getPositionHeight()-window.getPositionHeight(), null);
}
}
else if(i==1)
{
if(world.getWorld()[i][posX][posY] instanceof Player)
{
p= (Player) world.getWorld()[i][posX][posY];
drawPlayer(g, p);
}
else if(world.getWorld()[i][posX][posY] instanceof ObjectClass)
{
ObjectClass ob=(ObjectClass) world.getWorld()[1][posX][posY];
if(ob.getID() != 0)
g.drawImage(UploadImages.getSummerTiles()[ob.getID()],ob.getPositionWidth()-window.getPositionWidth(), ob.getPositionHeight()-window.getPositionHeight(), null);
}else if(world.getWorld()[i][posX][posY] instanceof Zombie)
{
Zombie e= (Zombie) world.getWorld()[1][posX][posY];
drawZombie(g,e);
}else if(world.getWorld()[i][posX][posY] instanceof BulletPlayer)
{
BulletPlayer b=(BulletPlayer) world.getWorld()[1][posX][posY];
drawBullet(g,b);
}
else if(world.getWorld()[i][posX][posY] instanceof EnergyBall){
EnergyBall eb = (EnergyBall) world.getWorld()[i][posX][posY];
g.drawImage(UploadImages.getEnergyBall(),eb.getPositionWidth()-window.getPositionWidth(), eb.getPositionHeight()-window.getPositionHeight(), null);
}
}
posY++;
}
posY=window.indexWindowY(player,world);

posX++;
}
posX=window.indexWindowX(player,world);
}
lifeBar(g, p);
g.dispose();

strategy.show();
// PrintWorld();
}
private void lifeBar(Graphics2D g, Player p){
if(p.getHP() >= 100){
g.drawImage(UploadImages.getLifeBar().get(10),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 100 && p.getHP() >= 90){
g.drawImage(UploadImages.getLifeBar().get(9),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 90 && p.getHP() >= 80){
g.drawImage(UploadImages.getLifeBar().get(8),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 80 && p.getHP() >= 70){
g.drawImage(UploadImages.getLifeBar().get(7),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 70 && p.getHP() >= 60){
g.drawImage(UploadImages.getLifeBar().get(6),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 60 && p.getHP() >= 50){
g.drawImage(UploadImages.getLifeBar().get(5),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 50 && p.getHP() >= 40){
g.drawImage(UploadImages.getLifeBar().get(4),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 40 && p.getHP() >= 30){
g.drawImage(UploadImages.getLifeBar().get(3),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 30 && p.getHP() >= 20){
g.drawImage(UploadImages.getLifeBar().get(2),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 20 && p.getHP() >= 1){
g.drawImage(UploadImages.getLifeBar().get(1),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() <= 0){
g.drawImage(UploadImages.getLifeBar().get(0),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}
}
private void drawBullet(Graphics2D g, BulletPlayer b){
if(b.getDirection() == Direction.UP){
g.drawImage(UploadImages.getAmmo().get(Direction.UP), b.getPositionWidth()-window.getPositionWidth(),b.getPositionHeight()-window.getPositionHeight(),null);
}else if(b.getDirection() == Direction.DOWN){
g.drawImage(UploadImages.getAmmo().get(Direction.DOWN), b.getPositionWidth()-window.getPositionWidth(),b.getPositionHeight()-window.getPositionHeight(),null);
}else if(b.getDirection() == Direction.LEFT){
g.drawImage(UploadImages.getAmmo().get(Direction.LEFT), b.getPositionWidth()-window.getPositionWidth(),b.getPositionHeight()-window.getPositionHeight(),null);
}else if(b.getDirection() == Direction.RIGHT){
g.drawImage(UploadImages.getAmmo().get(Direction.RIGHT), b.getPositionWidth()-window.getPositionWidth(),b.getPositionHeight()-window.getPositionHeight(),null);
}
}

private void drawZombie(Graphics2D g, Zombie e) {
// TODO Auto-generated method stub
// if(e.getDirection() == Direction.STOPUP)
// g.drawImage(UploadImages.getEnemySTOP().get(Direction.STOPUP), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
// else if(e.getDirection() == Direction.STOPDOWN)
// g.drawImage(UploadImages.getEnemySTOP().get(Direction.STOPDOWN), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
// else if(e.getDirection() == Direction.STOPLEFT)
// g.drawImage(UploadImages.getEnemySTOP().get(Direction.STOPLEFT), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
// else if(e.getDirection() == Direction.STOPRIGHT)
// g.drawImage(UploadImages.getEnemySTOP().get(Direction.STOPRIGHT), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);

if(!e.isAttacking() && !e.isDead()){
if(e.getDirection() == Direction.UP){
g.drawImage(UploadImages.getZombieUP().get(e.getSteps()), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
else if(e.getDirection() == Direction.DOWN){
g.drawImage(UploadImages.getZombieDown().get(e.getSteps()), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
else if(e.getDirection() == Direction.LEFT){
g.drawImage(UploadImages.getZombieLeft().get(e.getSteps()), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
else if(e.getDirection() == Direction.RIGHT){
g.drawImage(UploadImages.getZombieRight().get(e.getSteps()), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
}
else
{
g.drawImage(world.getZombieSprite().get(e.getId()).getCurrentImage(), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
}

private void drawPlayer(Graphics2D g, Player p)
{
if(p.getDirection() == Direction.STOPUP && p.getHP() > 0 && p.isShot())
g.drawImage(UploadImages.getMercenaryShot().get(Direction.UP),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPDOWN && p.getHP() > 0 && p.isShot())
g.drawImage(UploadImages.getMercenaryShot().get(Direction.DOWN),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPLEFT && p.getHP() > 0 && p.isShot())
g.drawImage(UploadImages.getMercenaryShot().get(Direction.LEFT),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPRIGHT && p.getHP() > 0 && p.isShot())
g.drawImage(UploadImages.getMercenaryShot().get(Direction.RIGHT),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPUP && p.getHP() > 0)
g.drawImage(UploadImages.getMercenarySTOP().get(Direction.STOPUP), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPDOWN && p.getHP() > 0)
g.drawImage(UploadImages.getMercenarySTOP().get(Direction.STOPDOWN), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPLEFT && p.getHP() > 0)
g.drawImage(UploadImages.getMercenarySTOP().get(Direction.STOPLEFT), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPRIGHT && p.getHP() > 0)
g.drawImage(UploadImages.getMercenarySTOP().get(Direction.STOPRIGHT), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.UP && p.getHP() > 0)
g.drawImage(UploadImages.getMercenaryN().get(p.getSteps()),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.DOWN && p.getHP() > 0)
g.drawImage(UploadImages.getMercenaryS().get(p.getSteps()), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.RIGHT && p.getHP() > 0)
g.drawImage(UploadImages.getMercenaryE().get(p.getSteps()), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.LEFT && p.getHP() > 0)
g.drawImage(UploadImages.getMercenaryW().get(p.getSteps()), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getHP() <= 0)
g.drawImage(SpriteDeadPlayer.getCurrentImagePlayer(), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
}

/**
* Run the program
*/
@Override
public void run()
{
Graphics2D graphics2D;

while( true )
{

// GET THE BACK BUFFER
graphics2D = (Graphics2D) strategy.getDrawGraphics();
// DO
draw(graphics2D);
// WAIT
// System.out.println(player.getHP());
// PrintWorld();

try{
Thread.sleep(20);
}catch (InterruptedException e){}
}

//System.exit(0);
}

public World getWorld() {
return world;
}

public Player getPlayer() {
return player;
}

public Window getWindow() {
return window;
}
public void PrintWorld(){
for (int i = 0; i < world.getDimensionX(); i++) {
for (int j = 0; j < world.getDimensionY(); j++) {
System.out.print(world.getWorld()[1][i][j]);
}
System.out.println();
}
System.out.println();
System.out.println();
}
private void createMap(){
LoadMap loadMap = new LoadMap();
world = new World(loadMap);
player = loadMap.getPlayer();
window = new Window(800, 672,player,world);
new CreateZombie(world, player).start();
new ZombieMovements(world).start();
new BulletMovements(player,world).start();
new CreateEnergyBall(world).start();
new ZombieAction(world).start();
}
public static void main(String [] args){
// Toolkit kit = Toolkit.getDefaultToolkit();
// Dimension dimension = kit.getScreenSize();
UploadImages.loadImageMap();
UploadImages.loadImageMercenary();

Game game = new Game();
// game.newGame();

MainPanel panel = new MainPanel(game);
game.getContentPane().add(panel);
game.add(panel);

// LoadMap loadMap = new LoadMap();
// world = new World(loadMap);
// player = loadMap.getPlayer();
// window = new Window(800, 672,player,world);
// window = new Window((int)dimension.getWidth(), (int)dimension.getHeight(),player,world);
// player = new Player("Filippo",30,30, Direction.STOPDOWN,world);
// new Enemy(31, 31, Direction.DOWN, world, player);
// new CreateZombie(world, player).start();
// new ZombieMovements(world).start();
// new BulletMovements(player,world).start();
// new CreateEnergyBall(world).start();
// new ZombieAction(world).start();
// new Game().run();
}

@Override
public void keyPressed(KeyEvent e){
int key=e.getKeyCode();

switch (key) {
case KeyEvent.VK_UP:premuti[UP]=true;
break;
case KeyEvent.VK_DOWN: premuti[DOWN]=true;
break;
case KeyEvent.VK_LEFT: premuti[LEFT]=true;
break;
case KeyEvent.VK_RIGHT: premuti[RIGHT]=true;
break;
case KeyEvent.VK_E: premuti[SHOT]=true;
default:
break;
}
if (motion == null || motion.getState() == Thread.State.TERMINATED) {
motion = new MotionDispatcher(this);
motion.start();
}

}

@Override
public void keyReleased(KeyEvent e) {
int key=e.getKeyCode();
switch (key) {
case KeyEvent.VK_UP:
premuti[UP]=false;
break;
case KeyEvent.VK_DOWN:
premuti[DOWN]=false;
break;
case KeyEvent.VK_LEFT:
premuti[LEFT]=false;
break;
case KeyEvent.VK_RIGHT:
premuti[RIGHT]=false;
break;
case KeyEvent.VK_E:
premuti[SHOT]=false;
default:
break;
}

if(!premuti[UP] && !premuti[DOWN] && !premuti[LEFT] && !premuti[RIGHT]) {

}
}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}
public boolean[] getPremuti() {
return premuti;
}

public void setPremuti(boolean[] premuti) {
this.premuti = premuti;
}
}

banryu79
08-06-2011, 09:19
Salve a tutti sto creando un gioco in java con l'utilizzo del bufferimage ma ho un problema cioè: quando creo un pannello oppure utilizzo il frame per creare il menu del gioco come clicco su new game gli eventi della tastiera non funzionano più.

Sapete dirmi il perchè?

Ciao, l'uso di BufferStrategy non c'entra con il tuo problema.
Il componente-sorgente di un KeyEvent è il componente propietario del focus (focus owner).

Nel codice vedo che cerchi di assicurare che Game (in quanto componet sul quale è registrato il key listener) sia il focus owner (ti consiglio di sostituire le chiamate requestFocus() con requestFocusInWindows()).

Però quando rendi visible a video un'altro component (sia esso un menu piuttosto che altro) esso diventa il focus owner, di conseguenza poi succede che eventuali key event vengano generati con quel component come sorgente su cui non c'è nessun listener registrato per ascoltarli (il focus viene spostato ovviamente anche quando l'utente fa click con il mouse su un'altro component).

Dovresti quindi far richiedere a Game il focus (requestFocusInWindow()) ogni volta che lo perde (ad esempio al termine dell'interazione con l'eventuale componente terzo la cui apertura ha causato la perdita del focus).

Se non ti serve ascoltare altri eventi da tastiera su altri componenti a parte che Game forse potresti ovviare in questo modo:

- registri su Game un focus listener (addFocusListener) interessato ad ascoltare gli eventi "focus lost";

- quando il focus listener riceve un evento "focus lost" chiede a quell'evento quale è il component che ha ricevuto il focus (getOppositeComponent);

- se l'opposite component che ha ricevuto il focus NON prevede un'interazione con l'utente immediata e temporanea ed è neccessario far riottenere subito a Game il focus allora <A> altrimenti <B>;

<A>
- il focus listener fa in modo che Game invochi requestFocusInWindow() in modo da riottenere il focus input e quindi ricominciare a intercettare gli eventi da tastiera.

<B>
- il focus listener registra sull'opposite component un component listener (addComponentListener) interessato ad ascoltare gli eventi di "component hidden";
- quando il component listener riceve l'evento "component hidden" fa in modo che Game invochi requestFocusInWindow() in modo da riottenere il focus input e quindi ricominciare a intercettare gli eventi da tastiera, inoltre deregistra se stesso dall'opposite component.

Narat
08-06-2011, 11:41
ciao banryu79 grazie per la risposta.
Ho provato come mi hai detto e purtroppo non funziona non so se sono io che sto sbagliando ma non va.
Ti allego il codice con le modifiche che ho fatto grazie ancora :D
package GUI;

import java.awt.Graphics2D;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import Thread.ZombieAction;
import Thread.BulletMovements;
import Thread.CreateZombie;
import Thread.CreateEnergyBall;
import Thread.ZombieMovements;
import World.ObjectClass;
import World.UploadImages;
import Players.BulletPlayer;
import Players.Direction;
import Players.Zombie;
import Players.EnergyBall;
import Players.Player;
import World.World;
import XML.LoadMap;
import MouseKeyboardEvents.*;

public class Game extends JFrame implements Runnable,KeyListener, FocusListener, ComponentListener{
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int UP = 0;
private static final int DOWN = 1;
private static final int LEFT = 2;
private static final int RIGHT = 3;
private static final int SHOT = 4;
private boolean [] premuti = new boolean[5];
private static MotionDispatcher motion=null;
private BufferStrategy strategy;
private static World world;
private static Player player;
private static Window window;
/**
* Constructor
*/
public Game()
{
initWindow();
initComponnents();
}

/**
* initiate the window
*/
private void initWindow()
{
// setSize(window.getDimensionPixelX(), window.getDimensionPixelY());
pack();
setTitle("Gioco");
setSize(800,672);
// setUndecorated(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
setIgnoreRepaint(true);
// setFocusable(true);
}

/**
* initiate the componnents
*/
private void initComponnents()
{
addComponentListener(this);
addFocusListener(this);
// setFocusTraversalKeysEnabled(false);
addKeyListener(this);
}
private void initBufferStrategy(){
createBufferStrategy(2);
strategy = getBufferStrategy();
requestFocus();
}

/**
* Draw the frame
* @param panel
* @param graphics graphic
*/
public void newGame(MainPanel panel){



initBufferStrategy();
createMap();
// initComponnents();
// game.requestFocus();
run();
}
private void draw(Graphics2D g)
{
requestFocusInWindow();
Player p = null;
int windowX=window.getPrinterPartX();
int windowY=window.getPrinterPartY();

int posX=window.indexWindowX(player,world);
int posY=window.indexWindowY(player,world);

for(int i=0; i < world.getLIVELLO()-1; i++)
{
for(int j=0; j < windowX; j++)
{
for(int k=0; k < windowY; k++)
{
if(i == 0){
if(world.getWorld()[i][posX][posY] instanceof ObjectClass)
{
ObjectClass ob = (ObjectClass) world.getWorld()[i][posX][posY];
g.drawImage(UploadImages.getSummerTiles()[ob.getID()],ob.getPositionWidth()-window.getPositionWidth(), ob.getPositionHeight()-window.getPositionHeight(), null);
}
}
else if(i==1)
{
if(world.getWorld()[i][posX][posY] instanceof Player)
{
p= (Player) world.getWorld()[i][posX][posY];
drawPlayer(g, p);
}
else if(world.getWorld()[i][posX][posY] instanceof ObjectClass)
{
ObjectClass ob=(ObjectClass) world.getWorld()[1][posX][posY];
if(ob.getID() != 0)
g.drawImage(UploadImages.getSummerTiles()[ob.getID()],ob.getPositionWidth()-window.getPositionWidth(), ob.getPositionHeight()-window.getPositionHeight(), null);
}else if(world.getWorld()[i][posX][posY] instanceof Zombie)
{
Zombie e= (Zombie) world.getWorld()[1][posX][posY];
drawZombie(g,e);
}else if(world.getWorld()[i][posX][posY] instanceof BulletPlayer)
{
BulletPlayer b=(BulletPlayer) world.getWorld()[1][posX][posY];
drawBullet(g,b);
}
else if(world.getWorld()[i][posX][posY] instanceof EnergyBall){
EnergyBall eb = (EnergyBall) world.getWorld()[i][posX][posY];
g.drawImage(UploadImages.getEnergyBall(),eb.getPositionWidth()-window.getPositionWidth(), eb.getPositionHeight()-window.getPositionHeight(), null);
}
}
posY++;
}
posY=window.indexWindowY(player,world);

posX++;
}
posX=window.indexWindowX(player,world);
}
lifeBar(g, p);
g.dispose();

strategy.show();
// PrintWorld();
}
private void lifeBar(Graphics2D g, Player p){
if(p.getHP() >= 100){
g.drawImage(UploadImages.getLifeBar().get(10),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 100 && p.getHP() >= 90){
g.drawImage(UploadImages.getLifeBar().get(9),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 90 && p.getHP() >= 80){
g.drawImage(UploadImages.getLifeBar().get(8),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 80 && p.getHP() >= 70){
g.drawImage(UploadImages.getLifeBar().get(7),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 70 && p.getHP() >= 60){
g.drawImage(UploadImages.getLifeBar().get(6),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 60 && p.getHP() >= 50){
g.drawImage(UploadImages.getLifeBar().get(5),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 50 && p.getHP() >= 40){
g.drawImage(UploadImages.getLifeBar().get(4),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 40 && p.getHP() >= 30){
g.drawImage(UploadImages.getLifeBar().get(3),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 30 && p.getHP() >= 20){
g.drawImage(UploadImages.getLifeBar().get(2),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() < 20 && p.getHP() >= 1){
g.drawImage(UploadImages.getLifeBar().get(1),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}else if(p.getHP() <= 0){
g.drawImage(UploadImages.getLifeBar().get(0),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight()-20, null);
}
}
private void drawBullet(Graphics2D g, BulletPlayer b){
if(b.getDirection() == Direction.UP){
g.drawImage(UploadImages.getAmmo().get(Direction.UP), b.getPositionWidth()-window.getPositionWidth(),b.getPositionHeight()-window.getPositionHeight(),null);
}else if(b.getDirection() == Direction.DOWN){
g.drawImage(UploadImages.getAmmo().get(Direction.DOWN), b.getPositionWidth()-window.getPositionWidth(),b.getPositionHeight()-window.getPositionHeight(),null);
}else if(b.getDirection() == Direction.LEFT){
g.drawImage(UploadImages.getAmmo().get(Direction.LEFT), b.getPositionWidth()-window.getPositionWidth(),b.getPositionHeight()-window.getPositionHeight(),null);
}else if(b.getDirection() == Direction.RIGHT){
g.drawImage(UploadImages.getAmmo().get(Direction.RIGHT), b.getPositionWidth()-window.getPositionWidth(),b.getPositionHeight()-window.getPositionHeight(),null);
}
}

private void drawZombie(Graphics2D g, Zombie e) {
// TODO Auto-generated method stub
// if(e.getDirection() == Direction.STOPUP)
// g.drawImage(UploadImages.getEnemySTOP().get(Direction.STOPUP), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
// else if(e.getDirection() == Direction.STOPDOWN)
// g.drawImage(UploadImages.getEnemySTOP().get(Direction.STOPDOWN), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
// else if(e.getDirection() == Direction.STOPLEFT)
// g.drawImage(UploadImages.getEnemySTOP().get(Direction.STOPLEFT), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
// else if(e.getDirection() == Direction.STOPRIGHT)
// g.drawImage(UploadImages.getEnemySTOP().get(Direction.STOPRIGHT), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);

if(!e.isAttacking() && !e.isDead()){
if(e.getDirection() == Direction.UP){
g.drawImage(UploadImages.getZombieUP().get(e.getSteps()), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
else if(e.getDirection() == Direction.DOWN){
g.drawImage(UploadImages.getZombieDown().get(e.getSteps()), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
else if(e.getDirection() == Direction.LEFT){
g.drawImage(UploadImages.getZombieLeft().get(e.getSteps()), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
else if(e.getDirection() == Direction.RIGHT){
g.drawImage(UploadImages.getZombieRight().get(e.getSteps()), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
}
else
{
g.drawImage(world.getZombieSprite().get(e.getId()).getCurrentImage(), e.getPositionWidth()-window.getPositionWidth(),e.getPositionHeight()-window.getPositionHeight(),null);
}
}

private void drawPlayer(Graphics2D g, Player p)
{
if(p.getDirection() == Direction.STOPUP && p.getHP() > 0 && p.isShot())
g.drawImage(UploadImages.getMercenaryShot().get(Direction.UP),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPDOWN && p.getHP() > 0 && p.isShot())
g.drawImage(UploadImages.getMercenaryShot().get(Direction.DOWN),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPLEFT && p.getHP() > 0 && p.isShot())
g.drawImage(UploadImages.getMercenaryShot().get(Direction.LEFT),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPRIGHT && p.getHP() > 0 && p.isShot())
g.drawImage(UploadImages.getMercenaryShot().get(Direction.RIGHT),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPUP && p.getHP() > 0)
g.drawImage(UploadImages.getMercenarySTOP().get(Direction.STOPUP), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPDOWN && p.getHP() > 0)
g.drawImage(UploadImages.getMercenarySTOP().get(Direction.STOPDOWN), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPLEFT && p.getHP() > 0)
g.drawImage(UploadImages.getMercenarySTOP().get(Direction.STOPLEFT), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.STOPRIGHT && p.getHP() > 0)
g.drawImage(UploadImages.getMercenarySTOP().get(Direction.STOPRIGHT), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.UP && p.getHP() > 0)
g.drawImage(UploadImages.getMercenaryN().get(p.getSteps()),p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.DOWN && p.getHP() > 0)
g.drawImage(UploadImages.getMercenaryS().get(p.getSteps()), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.RIGHT && p.getHP() > 0)
g.drawImage(UploadImages.getMercenaryE().get(p.getSteps()), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getDirection() == Direction.LEFT && p.getHP() > 0)
g.drawImage(UploadImages.getMercenaryW().get(p.getSteps()), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
else if(p.getHP() <= 0)
g.drawImage(SpriteDeadPlayer.getCurrentImagePlayer(), p.getPositionWidth()-window.getPositionWidth(),p.getPositionHeight()-window.getPositionHeight(),null);
}

/**
* Run the program
*/
@Override
public void run()
{
Graphics2D graphics2D;

while( true )
{
// GET THE BACK BUFFER
graphics2D = (Graphics2D) strategy.getDrawGraphics();
// DO
draw(graphics2D);
// WAIT
// System.out.println(player.getHP());
// PrintWorld();

try{
Thread.sleep(20);
}catch (InterruptedException e){}
}

//System.exit(0);
}

public World getWorld() {
return world;
}

public Player getPlayer() {
return player;
}

public Window getWindow() {
return window;
}
public void PrintWorld(){
for (int i = 0; i < world.getDimensionX(); i++) {
for (int j = 0; j < world.getDimensionY(); j++) {
System.out.print(world.getWorld()[1][i][j]);
}
System.out.println();
}
System.out.println();
System.out.println();
}
private void createMap(){
LoadMap loadMap = new LoadMap();
world = new World(loadMap);
player = loadMap.getPlayer();
window = new Window(800, 672,player,world);
new CreateZombie(world, player).start();
new ZombieMovements(world).start();
new BulletMovements(player,world).start();
new CreateEnergyBall(world).start();
new ZombieAction(world).start();
}
public static void main(String [] args){
// Toolkit kit = Toolkit.getDefaultToolkit();
// Dimension dimension = kit.getScreenSize();
UploadImages.loadImageMap();
UploadImages.loadImageMercenary();

Game game = new Game();
// game.newGame();
MainPanel panel = new MainPanel(game);
game.getContentPane().add(panel);
game.add(panel);

// LoadMap loadMap = new LoadMap();
// world = new World(loadMap);
// player = loadMap.getPlayer();
// window = new Window(800, 672,player,world);
// window = new Window((int)dimension.getWidth(), (int)dimension.getHeight(),player,world);
// player = new Player("Filippo",30,30, Direction.STOPDOWN,world);
// new Enemy(31, 31, Direction.DOWN, world, player);
// new CreateZombie(world, player).start();
// new ZombieMovements(world).start();
// new BulletMovements(player,world).start();
// new CreateEnergyBall(world).start();
// new ZombieAction(world).start();
// new Game().run();
}

@Override
public void keyPressed(KeyEvent e){
int key=e.getKeyCode();

switch (key) {
case KeyEvent.VK_UP:premuti[UP]=true;
break;
case KeyEvent.VK_DOWN: premuti[DOWN]=true;
break;
case KeyEvent.VK_LEFT: premuti[LEFT]=true;
break;
case KeyEvent.VK_RIGHT: premuti[RIGHT]=true;
break;
case KeyEvent.VK_E: premuti[SHOT]=true;
default:
break;
}
if (motion == null || motion.getState() == Thread.State.TERMINATED) {
motion = new MotionDispatcher(this);
motion.start();
}

}

@Override
public void keyReleased(KeyEvent e) {
int key=e.getKeyCode();
switch (key) {
case KeyEvent.VK_UP:
premuti[UP]=false;
break;
case KeyEvent.VK_DOWN:
premuti[DOWN]=false;
break;
case KeyEvent.VK_LEFT:
premuti[LEFT]=false;
break;
case KeyEvent.VK_RIGHT:
premuti[RIGHT]=false;
break;
case KeyEvent.VK_E:
premuti[SHOT]=false;
default:
break;
}

if(!premuti[UP] && !premuti[DOWN] && !premuti[LEFT] && !premuti[RIGHT]) {

}
}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}
public boolean[] getPremuti() {
return premuti;
}

public void setPremuti(boolean[] premuti) {
this.premuti = premuti;
}

@Override
public void focusGained(FocusEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void focusLost(FocusEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ENTRAFocusLost");
requestFocusInWindow();
}

@Override
public void componentHidden(ComponentEvent arg0) {
// TODO Auto-generated method stub
System.out.println("componentHidden");
requestFocusInWindow();
}

@Override
public void componentMoved(ComponentEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void componentResized(ComponentEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void componentShown(ComponentEvent arg0) {
// TODO Auto-generated method stub

}
}

Narat
09-06-2011, 09:03
nessun altro sa come aiutarmi per risolvere questo problema?

banryu79
09-06-2011, 14:32
Ciao, beh, non hai implementato quello che ti suggerivo (ma che a questo punto mi riservo di provare appena ho tempo, per verificarne il funzionamento).

Comunque ho una soluzione alternativa più "radicale": agganciare un KeyEventDispatcher al KeyboardFocusManager globale.
Alla pressione dei tasti a cui sei interessato, il KeyEventDispatcher eseguirà le azioni che ti servono, a prescindere da quale component sia il "focus owner" in quel momento.

Qui trovi un esempio (http://www.hwupgrade.it/forum/showpost.php?p=23112750&postcount=3) di implementazione di un KeyEventDispatcher collegato al KeyboardFocusManager, tanto per farsi l'occhio.

Stabiliamo che:
con il termine "dispatcher" intendiamo KeyEventDispatcher;
con il termine "kf manager" intendiamo KeyboardFocusManager

Diciamo che:
1 - Game non è più un KeyListener ma definisce e istanzia un dispatcher per processare la pressione dei tasti con la stessa logica del listener di prima;
2 - Appena Game (in quanto finestra) diventa visibile, registra il dispatcher presso il kf manager;
3 - Appena Game (in quanto finestra) viene chiusa, de-registra il dispatcher dal kf manager.

il punto 1) lo localizziamo nel costruttore di Game.
il punto 2) e 3) li possimao localizzare rispettivamente nei metodi windowOpened e windowClosing di un WindowListener che ascolterà "eventi finestra" (WindowEvent) emessi da Game.

Game può essere il WindowListener di se stesso, oppure nel costruttore di Game istanziamo al volo in forma anonima un WindowsAdapter che ascolta Game.

Calato nel tuo contesto dovrebbe essere qualcosa del tipo:

public class Game extends JFrame implements Runnable {

// membri di Game...

public Game() {
// implementazione del dispatcher custom
final KeyEventDispatcher DISPATCHER = new KeyEventDispatcher() {
private final boolean ON = true;
private final boolean OFF = false;

@Override public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED)
return keyPressed(e);
if (e.getID() == KeyEvent.KEY_RELEASED)
return keyReleased(e);
}

private boolean keyPressed(KeyEvent e) {
boolean consumed = true;

switch (e.getKeyCode()) {
case KeyEvent.VK_UP: premuti[UP] = ON;
break;
case KeyEvent.VK_DOWN: premuti[DOWN] = ON;
break;
case KeyEvent.VK_LEFT: premuti[LEFT] = ON;
break;
case KeyEvent.VK_RIGHT: premuti[RIGHT] = ON;
break;
case KeyEvent.VK_E: premuti[SHOT] = ON;
default:
consumed = false;
}

if (motion == null || motion.getState() == Thread.State.TERMINATED) {
motion = new MotionDispatcher(this);
motion.start();
}

return consumed;
}

private boolean keyReleased(KeyEvent e) {
boolean consumed = true;

switch (e.getKeyCode()) {
case KeyEvent.VK_UP: premuti[UP] = OFF;
break;
case KeyEvent.VK_DOWN: premuti[DOWN] = OFF;
break;
case KeyEvent.VK_LEFT: premuti[LEFT] = OFF;
break;
case KeyEvent.VK_RIGHT: premuti[RIGHT] = OFF;
break;
case KeyEvent.VK_E: premuti[SHOT] = OFF;
default:
consumed = false;
}

if(!premuti[UP] && !premuti[DOWN] && !premuti[LEFT] && !premuti[RIGHT]) {
// fai quel che devi...
}

return consumed;
}
};

// implementazione del window listener per collegamento
// del dispatcher con il kf manager
WindowAdapter kfmanagerHack = new WindowAdapter() {
@Override public void windowOpened(WindowEvent e) {
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(DISPATCHER);
}

@Override public void windowClosing(WindowEvent e) {
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.removeKeyEventDispatcher(DISPATCHER);
}
};
this.addWindowListener(kfmanagerHack);

initWindow();
initComponnents();
}

}

Nota_1: Game ora non dovrà più implementare KeyListener, FocusListener e ComponentListener.
Nota_2: Puoi rimuovere tutte le chiamate a requestFocusInWindow presenti in Game, non sono più strettamente neccessarie.

P.S.: codice non testato e non completo. E' giusto per darti un'idea.

Ciao :)

Narat
09-06-2011, 14:45
Grazie ancora per l'aiuto, purtroppo sono con l'acqua alla gola devo finire questo progetto e fare l'esame.

Ti faro' sapere se riesco a far funzionare questi benedetti tasti :P

Grazie ancora

banryu79
09-06-2011, 14:52
C'è un errore nell'implementazione del metodo dispatchKeyEvent, deve essere così:

@Override public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED)
return keyPressed(e);
if (e.getID() == KeyEvent.KEY_RELEASED)
return keyReleased(e);
return false;
}

Narat
09-06-2011, 15:13
ho un problema con il MotionDispatcher praticamente io al motion dispatcher passo la classe game ora mi dice di passare un keyeventDispatcher

ti passo la classe MotionDispatcher


package MouseKeyboardEvents;

import GUI.Game;
import GUI.Window;
import Players.Direction;
import Players.Player;
import World.World;

public class MotionDispatcher extends Thread {
private static final int UP = 0;
private static final int DOWN = 1;
private static final int LEFT = 2;
private static final int RIGHT = 3;
private static final int SHOT = 4;
private static final int DIM=5;
private int sleep;
private Window window;
private World world;
//private Game game;
private Player player;
private boolean [] premuti = new boolean[DIM];

public MotionDispatcher(Game game){
//this.game=game;
this.premuti=game.getPremuti();
this.player=game.getPlayer();
this.window=game.getWindow();
this.world=game.getWorld();
sleep=70;
}

public void run() {
while(true){
// Nord Ovest
if(premuti[UP] && premuti[LEFT] && !premuti[DOWN] && !premuti[RIGHT]){

}
// Nord Est
else if(premuti[UP] && premuti[RIGHT] && !premuti[DOWN] && !premuti[LEFT]){

}
// UPd Ovest
else if(premuti[DOWN] && premuti[LEFT] && !premuti[RIGHT] && !premuti[UP]){

}
// UPd Est
else if(premuti[DOWN] && premuti[RIGHT] && !premuti[UP] && !premuti[LEFT]){

}
// UP
else if(premuti[UP] && !premuti[DOWN] && !premuti[LEFT] && !premuti[RIGHT]) {
sleep=70;
player.setDirection(Direction.UP);
player.playerUp(window, world);
window.windowUp();
}
// DOWN
else if(premuti[DOWN] && !premuti[UP] && !premuti[LEFT] && !premuti[RIGHT]){
sleep=70;
player.setDirection(Direction.DOWN);
player.playerDown(window, world);
window.windowDown();
}
// LEFT
else if(premuti[LEFT] && !premuti[UP] && !premuti[DOWN] && !premuti[RIGHT]){
sleep=70;
player.setDirection(Direction.LEFT);
player.playerLeft(window, world);
window.windowLeft();
}
// RIGHT
else if(premuti[RIGHT] && !premuti[UP] && !premuti[DOWN] && !premuti[LEFT]){
sleep=70;
player.setDirection(Direction.RIGHT);
player.playerRight(window, world);
window.windowRight();
}
else if(premuti[SHOT] && !premuti[RIGHT] && !premuti[UP] && !premuti[DOWN] && !premuti[LEFT]){
sleep=300;
player.setShot(true);
player.deathOccurs();
player.shot(window, world);
player.setShot(false);
}
else if(!premuti[RIGHT] && !premuti[UP] && !premuti[DOWN] && !premuti[LEFT]){
sleep=70;
if(player.getDirection() == Direction.UP)
player.setDirection(Direction.STOPUP);
else if(player.getDirection() == Direction.DOWN)
player.setDirection(Direction.STOPDOWN);
else if(player.getDirection() == Direction.LEFT)
player.setDirection(Direction.STOPLEFT);
else if(player.getDirection() == Direction.RIGHT)
player.setDirection(Direction.STOPRIGHT);
player.setSteps(0);
}
player.deathOccurs();
try {
sleep(sleep);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}


anche se faccio prima a mandarti tutto il progetto se andiamo a vedere :P

banryu79
09-06-2011, 15:21
ho un problema con il MotionDispatcher praticamente io al motion dispatcher passo la classe game ora mi dice di passare un keyeventDispatcher

ti passo la classe MotionDispatcher


... snip.


anche se faccio prima a mandarti tutto il progetto se andiamo a vedere :P
Ciao, allora:
1) non ho capito cosa significa: "ho un problema con il MotionDispatcher praticamente io al motion dispatcher passo la classe game ora mi dice di passare un keyeventDispatcher"

ma, in ogni caso:
2) le modifiche che ti ho suggerito di apportare a Game non hanno alcuna conseguenza circa il fatto che la tua classe MotionDispatcher richiede un'istanza della classe Game come parametro nel costruttore.

@EDIT: a scanso di equivoci, non ti ho postato soluzioni complete e funzionanti ma i miei vogliono solo essere suggerimenti di implementazione. Adattarli al tuo contesto (che non conosco) e renderli funzionanti nel dettaglio spetta a te ;)

banryu79
09-06-2011, 15:32
Aspetta, ho capito dove hai il problema e perchè.
Dammi qualche minuto che ti scrivo il post.

Narat
09-06-2011, 15:35
Scusami se mi spiego come un cane

ti inserisco l'immagine cosi capisci meglio
http://imageshack.us/photo/my-images/860/schermata20110609a16290.png/
http://imageshack.us/photo/my-images/860/schermata20110609a16290.png/

banryu79
09-06-2011, 15:39
Ristrutturiamo la "soluzione" così.
- Game implementa WindowListener che registra su se stesso in costruzione;
- Game ha un KeyEventDispatcher che istanzia e registra presso il KeyboradFocusManager quando capita windowOpened
- Game deregistra il dispatcher quando capita windowClosing

ecco:

public class Game extends JFrame implements Runnable, WindowListener {
// membri di Game...
private KeyEventDispatcher dispatcher;

/**
* Constructor
*/
public Game()
{
this.addWindowListener(this);

initWindow();
initComponnents();
}

public void windowOpened(WindowEvent e) {

dispatcher = new KeyEventDispatcher() {
private final boolean ON = true;
private final boolean OFF = false;

@Override public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED)
return keyPressed(e);
if (e.getID() == KeyEvent.KEY_RELEASED)
return keyReleased(e);
return false;
}

private boolean keyPressed(KeyEvent e) {
boolean consumed = true;

switch (e.getKeyCode()) {
case KeyEvent.VK_UP: premuti[UP] = ON;
break;
case KeyEvent.VK_DOWN: premuti[DOWN] = ON;
break;
case KeyEvent.VK_LEFT: premuti[LEFT] = ON;
break;
case KeyEvent.VK_RIGHT: premuti[RIGHT] = ON;
break;
case KeyEvent.VK_E: premuti[SHOT] = ON;
default:
consumed = false;
}

if (motion == null || motion.getState() == Thread.State.TERMINATED) {
motion = new MotionDispatcher(Game.this);
motion.start();
}

return consumed;
}

private boolean keyReleased(KeyEvent e) {
boolean consumed = true;

switch (e.getKeyCode()) {
case KeyEvent.VK_UP: premuti[UP] = OFF;
break;
case KeyEvent.VK_DOWN: premuti[DOWN] = OFF;
break;
case KeyEvent.VK_LEFT: premuti[LEFT] = OFF;
break;
case KeyEvent.VK_RIGHT: premuti[RIGHT] = OFF;
break;
case KeyEvent.VK_E: premuti[SHOT] = OFF;
default:
consumed = false;
}

if(!premuti[UP] && !premuti[DOWN] && !premuti[LEFT] && !premuti[RIGHT]) {
// fai quel che devi...
}

return consumed;
}
};

KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(dispatcher);
}

public void windowClosing(WindowEvent e) {
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.removeKeyEventDispatcher(dispatcher);
}

public void windowClosed(WindowEvent e) {}

public void windowIconified(WindowEvent e) {}

public void windowDeiconified(WindowEvent e) {}

public void windowActivated(WindowEvent e) {}

public void windowDeactivated(WindowEvent e) {}

// ecc...
}

Narat
09-06-2011, 15:55
Incredibile non va io non so che pesci prendere cmq ti do il link del gioco

http://www.megaupload.com/?d=AKRXD02E

Narat
09-06-2011, 16:22
Ti ringrazio dell'aiuto ma non va e non riesco a capire il perché, senza il menu va bene, se aggiungo il menu no mhaa

Narat
09-06-2011, 16:36
Cmq ho notato che il focus lo porde non appena carico la mappa da un file xml

Narat
11-06-2011, 01:58
Ti ringrazio per l'aiuto ma dopo tanto sbattimento un ragazzo mi ha detto come risolvere il problema è bastato avviare il thread new Thread(this).start() ed il gioco e' partito tranquillamente funzionando anche i tasti :D scusami se ti ho stressato grazie ancora