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) {
}
}