Идет потеря кадров при отрисовке объектов с помощью Swing, хотел поинтересоваться как можно оптимизировать код или использовать более подходящие функции. Проблема возникает при частом обновлении вьюхи. В Field в paintComponent мы получаем все объекты в игре и рисуем их.
public class Field extends JPanel {
View view;
EventListener eventListener;
public Field(View view) {
this.view = view;
addKeyListener(new KeyHandler());
setFocusable(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(new Color(0x31A75A));
g.fillRect(0, 0, 500, 500);
GameObjects gameObjects = view.getGameObjects();
if (gameObjects != null)
for (GameObject gameObject : gameObjects.getAll()) {
gameObject.draw(g);
}
}
public void setEventListener(EventListener eventListener) {
this.eventListener = eventListener;
}
public class KeyHandler extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()){
case KeyEvent.VK_LEFT:
eventListener.move(Direction.LEFT);
return;
case KeyEvent.VK_RIGHT:
eventListener.move(Direction.RIGHT);
return;
case KeyEvent.VK_UP:
eventListener.move(Direction.UP);
return;
case KeyEvent.VK_DOWN:
eventListener.move(Direction.DOWN);
return;
case KeyEvent.VK_R:
eventListener.restart();
return;
case KeyEvent.VK_W:
eventListener.slowMove(Direction.UP);
return;
case KeyEvent.VK_S:
eventListener.slowMove(Direction.DOWN);
return;
case KeyEvent.VK_A:
eventListener.slowMove(Direction.LEFT);
return;
case KeyEvent.VK_D:
eventListener.slowMove(Direction.RIGHT);
return;
}
}
}
Также в коде помимо класса Поля присутствует поле View, Player, Wall, Box, методы Wall и Box очень сильно похожи. Они все являются объектами которые мы получаем из gameObjects.
public class Player extends CollisionObject implements Movable {
private Image image = new ImageIcon("myPlayer.png").getImage();
private View view;
public void setView(View view) {
this.view = view;
}
private void update() {
view.update();
}
public View getView() {
return view;
}
public Player(int x, int y) {
super(x, y);
}
@Override
public void draw(Graphics graphics) {
Graphics2D g2 = (Graphics2D) graphics;
g2.drawImage(image, x, y,width,height, null);
}
@Override
public void move(int x, int y) {
this.x = this.x + x;
this.y = this.y + y;
}
public void slowMove(int x, int y) {
for (int i = 0; i < Model.FIELD_CELL_SIZE; i=i+2) {
if (x != 0)
this.x += 2*x/Model.FIELD_CELL_SIZE;
if (y != 0)
this.y += 2*y/Model.FIELD_CELL_SIZE;
try {
Thread.sleep(16);
} catch (InterruptedException e) {
e.printStackTrace();
}
update();
}
}
}
Класс - View
public class View extends JFrame {
private Controller controller;
private Field field;
public View(Controller controller) {
this.controller = controller;
}
public void init() {
field = new Field(this);
add(field);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(500, 500);
setLocationRelativeTo(null);
setTitle("Сокобан");
setVisible(true);
}
public void setEventListener(EventListener eventListener){
field.setEventListener(eventListener);
}
public void update(){
field.paintComponent(getGraphics());
}
public GameObjects getGameObjects(){
return controller.getGameObjects();
}
public void completed(int level){
update();
JOptionPane.showMessageDialog(this,"Level completed","Info",JOptionPane.INFORMATION_MESSAGE);
controller.startNextLevel();
getGameObjects().getPlayer().setView(this);
}
}
Обычный интерфейс EventListenet -
public interface EventListener {
void move(Direction direction);
void slowMove(Direction direction);
void restart();
void startNextLevel();
void levelCompleted(int level);
}
Ну и куда же без Controller -
public class Controller implements EventListener {
View view;
Model model;
public Controller() {
view = new View(this);
model = new Model();
view.init();
model.restart();
getGameObjects().getPlayer().setView(view);
model.setEventListener(this);
view.setEventListener(this);
}
public static void main(String[] args) {
Controller controller = new Controller();
}
@Override
public void move(Direction direction) {
model.move(direction);
view.update();
}
@Override
public void slowMove(Direction direction) {
model.slowMove(direction);
view.update();
}
@Override
public void restart() {
model.restart();
view.update();
}
@Override
public void startNextLevel() {
model.startNextLevel();
view.update();
}
@Override
public void levelCompleted(int level) {
view.completed(level);
}
public GameObjects getGameObjects(){
return model.getGameObjects();
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Здравствуйте я дошёл до геттеров сеттеров и не могу закрыть доступ к полям классаДело в том, что знакомый сказал, что не верно класс персон...
В общем стоит довольно таки тривиальная задача, получения значения по ключу из HashMap или TreeMap (до сих пор не знаю для этой задачи лучше использовать...
На сервер приходит jsonobject , с неизвестными ключами например:{"perviy":"1","2":"vtoroy","223dsds0":"adfad"} как вытянуть все ключи и соответствующие значения?