- Дней с нами
- 5
- Розыгрыши
- 0
- Сообщения
- 1
- Репутация
- 0
- Реакции
- 0
новис в яве, чуть больше чем нубло, пишу игрушку на фыксах, решил проработать управление на тестовом стенде в новом классе, просто заморочился и вывел это все в отдельный класс и сделать как можно оптимальней не внося код в scene event, увы в фыксах нет кей лисенера для подобных задач
в общем работа кода в представлении: нажимаешь пипку к примеру W, все что связано с image передается в класс контролер, там создается поток который отвечает за обработку нажатия W, даже скорее обработку массива TreeSet на наличие этой кнопки, и возвращает координаты которые присваиваются в image setY,
работа кода как оно работает сейчас: поток сразу после создания имеет статус терминейтед, метод контролер возвращает 0 при любом вызове ибо поток вырубается не делая никаких вычислений и метод его просто пропускает, картинка переходит к координатам 0 0. что здесь можно сделать, даже если поток в статусе ранед, он все равно ничего не делает, и опять возвращается 0
то что реалезованно в сцене в мейне
Java:
package com.myproject;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import java.util.Set;
import java.util.TreeSet;
public class Controller {
public static double speed = 10;
static double[] setcoord = new double[2];
static double retcoord;
boolean dead = true;
{
setcoord[0] = 0;
setcoord[1] = 0;
}
public double Controller(KeyEvent keyEvent, double x, double y, String s, char wh) {
System.out.println(keyEvent);
keybuffer.setPressedKeys(keyEvent.getCode());
Thread ru = new Thread(new Runnable() {
@Override
public void run() {
synchronized (setcoord) {
class upper {
void setter() {
if (keybuffer.pressedKeys.contains(keyEvent.getCode())) {
System.out.println(wh);
switch (s) {
case "x":
setcoord[0] = x;
System.out.println(setcoord[0]);
System.out.println(setcoord);
switch (wh) {
case '-':
setcoord[0] -= speed;
retcoord = setcoord[0];
break;
case '+':
retcoord = setcoord[0] += speed;
break;
}
break;
case "y":
setcoord[1] = y;
switch (wh) {
case '-':
setcoord[1] -= speed;
retcoord = setcoord[1];
break;
case '+':
retcoord = setcoord[1] += speed;
break;
}
break;
}
}
upper up = new upper();
up.setter();
}
}
}
}});
ru.start();
System.out.println(ru.getState());
return retcoord;
}
}
class keybuffer{
static Set<KeyCode> pressedKeys = new TreeSet<>();
public static void setPressedKeys(KeyCode keyCode) {
pressedKeys.add(keyCode);
}
public static void remPressedKeys(KeyCode keyCode) {
pressedKeys.remove(keyCode);
}
}
в общем работа кода в представлении: нажимаешь пипку к примеру W, все что связано с image передается в класс контролер, там создается поток который отвечает за обработку нажатия W, даже скорее обработку массива TreeSet на наличие этой кнопки, и возвращает координаты которые присваиваются в image setY,
работа кода как оно работает сейчас: поток сразу после создания имеет статус терминейтед, метод контролер возвращает 0 при любом вызове ибо поток вырубается не делая никаких вычислений и метод его просто пропускает, картинка переходит к координатам 0 0. что здесь можно сделать, даже если поток в статусе ранед, он все равно ничего не делает, и опять возвращается 0
то что реалезованно в сцене в мейне
Java:
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
if(keyEvent.getCode().equals(KeyCode.S)) {
image.setY(Down.Controller(keyEvent, image.getX(), image.getY(), "y", '+'));
}
if(keyEvent.getCode().equals(KeyCode.W)) {
image.setY(Up.Controller(keyEvent, image.getX(), image.getY(), "y", '-'));
}
if(keyEvent.getCode().equals(KeyCode.D)) {
image.setX(Right.Controller(keyEvent, image.getX(), image.getY(), "x", '+'));
}
if(keyEvent.getCode().equals(KeyCode.A)) {
image.setX(Left.Controller(keyEvent, image.getX(), image.getY(), "x", '-'));
}
}
});
scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
keybuffer.remPressedKeys(keyEvent.getCode());
}
});