Nietypowy kłopoty ze sterowaniem

0

Witam Serdecznie!

Wcześniej pisałem już o tym, że piszę grę i potrzebuję sterowania. Udało mi się to zrobić! Jednak występuje bardzo dziwny błąd. Mianowicie: aby można było sterować kulką trzeb wpierw zminimalizować okno gry, potem do niego wrócić - wtedy sterowanie dopiero działa poprawnie.
Może ktoś wie skąd wynika ten problem?

Druga sprawa - używam zmiennej "power" do ruchu kulki i chciałbym ustawić jej wartości na 0.2f, jednak sterowanie przestaje wtedy działać. Działa poprawnie tylko wtedy, gdy "power" jest o wartości większej lub równe 1 (przyjmuje takie wartości, jak 1.5f). Skąd wziął się ten problem?

Aby nie zaśmiecać wielką ilością kodu dam tylko klasy, w którym podejrzewam błąd (klasa Player ma tylko wartości początkowe położenia kulki):

Klasa GameFrame, która odpowiada za okno gry

 
package game;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;

import javax.swing.Timer;
import javax.swing.JPanel;

/**
 * Tworzenie okna gry
 * @author szaroket
 */

public class GameFrame extends JPanel implements ActionListener{

	private GameBar game_bar;
	private TileMap map;
	private Timer timer;
	Configuration conf = new Configuration();
	Player player;
	Controller con;
	
	public float power = 1f;
	public int yspeed = 0;
	public int xspeed = 0;
	public float gravity = 0.1f;
	public float friction = 0.95f;

	/**
	 * Tworzy elementy planszy oraz przyciski.
	 * 
	 * @param parent Sprawia, że ten panel jest w stanie wywołać metody jego rodzica.
	 * @throws IOException
	 */
	
	public GameFrame(MainMenu parent) throws IOException{
		setLayout(new GridBagLayout());
		GridBagConstraints constraints = new GridBagConstraints();
		constraints.insets = new Insets(0,400,0,0); 
		
		map = new TileMap("Map.txt", 32);
		player = new Player();
		con = new Controller();
		

		game_bar=new GameBar(parent);
		constraints.gridx = 0;
		constraints.gridy = 0;
		constraints.weighty = 1;
		constraints.anchor = GridBagConstraints.PAGE_START;
		add(game_bar, constraints);
		
		this.setOpaque(false);
		this.setFocusable(true);
		this.addKeyListener(con);
		this.setDoubleBuffered(true);
		this.requestFocusInWindow();
		
		timer = new Timer(10, this);
		timer.start();
	}
	
	public void actionPerformed(ActionEvent e) {
		//Player.player_y ++;
		repaint();		
		ckeck_controls();
	}
	
	private void ckeck_controls() {
		if(con.down){
			yspeed += power;
		}
		if(con.up){
			yspeed -= power;
		}
		if(con.right){
			xspeed += power;
		}
		if(con.left){
			xspeed -= power;
		}
		
		//yspeed += gravity;
		
		Player.player_x += xspeed;
		Player.player_y += yspeed;
		
	}

	public Dimension getPreferredSize() {
        return new Dimension(getParent().getSize());
    }
	
	public void paintComponent(Graphics g) {
		map.draw(g);
		game_bar.repaint();
		getParent().repaint();
		
		Graphics2D g2d = (Graphics2D) g;
		
		g2d.setColor(Color.RED);
		g2d.fillOval((int) Player.player_x, (int) Player.player_y, 40, 40);
	}
}
	

Class Controller

 
package game;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Controller implements KeyListener{
	 //public int power = 1;
	 //public int yspeed = 0;
	 //public int xspeed = 0;
	 //public float gravity = 0.1f;
	 
	 boolean left = false;
	 boolean right = false;
	 boolean down = false;
	 boolean up = false;

	public void keyReleased(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_RIGHT){
			//Player.player_x += power;
			//xspeed += power;
			right = false;
		}
		if(e.getKeyCode() == KeyEvent.VK_LEFT){
			//Player.player_x -= power;
			//xspeed -= power;
			left = false;
		}
		if(e.getKeyCode() == KeyEvent.VK_UP){
			//Player.player_y -= power;
			//yspeed -= power;
			up = false;
		}
		if(e.getKeyCode() == KeyEvent.VK_DOWN){
			//Player.player_y += power;
			//yspeed += power;
			down = false;
		}
	}
	
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_RIGHT){
			//Player.player_x += power;
			//xspeed += power;
			right = true;
		}
		if(e.getKeyCode() == KeyEvent.VK_LEFT){
			//Player.player_x -= power;
			//xspeed -= power;
			left = true;
		}
		if(e.getKeyCode() == KeyEvent.VK_UP){
			//Player.player_y -= power;
			//yspeed -= power;
			up = true;
		}
		if(e.getKeyCode() == KeyEvent.VK_DOWN){
			//Player.player_y += power;
			//yspeed += power;
			down = true;
		}
		
		//yspeed += gravity;
		
		//Player.player_x += xspeed;
		//Player.player_y += yspeed;
	}

	public void keyTyped(KeyEvent e) {		
	}
	

}

0

Czemu swing z awt to zły wybór? Bardzo często widziałem to w innych projektach. Możesz to wyjaśnić?

Przejrzałem linki podane przez Ciebie, jednak nie znalazłem odpowiedzi, czemu sterowanie w moim projekcie działa tak dziwnie. Niemniej dziękuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1