Я не уверен, что то, что я пытаюсь сделать, вообще возможно, поэтому я был бы признателен за любую помощь.
В основном я пытаюсь создать онлайн-игру в шашки, где пользователи могут соревноваться друг с другом или с компьютером. логика игры находится внутри EJB, и до сих пор она работает нормально. до сих пор я выполнил игру компьютер-игрок, и она отлично работает - игрок выбирает источник и пункт назначения хода (в то время как логика решает, действительны ли они), а затем компьютер заставляет его двигаться, после чего доска обновляется ,
однако в настоящее время я хочу решить 2 проблемы:
1) Я хочу, чтобы движение компьютера происходило примерно через секунду после того, как игрок закончил. это работает - однако плата не обновляется (я объясню позже, почему)
2) после того, как компьютер заставляет его двигаться, я хочу, чтобы квадратики, на которых он воздействовал, мигали несколько раз.
на моей доске каждый квадрат - это командная кнопка, которая выглядит следующим образом:
<h:commandButton id="B1" image="#{CodeBean.imgSrc}" actionListener="#{CodeBean.clickImg()}" action="#{CodeBean.update}" onmouseover="this.src='#{CodeBean.overImgSrc}'" onmouseout="this.src='/CheckersClientSide#{CodeBean.imgSrc}'">
<f:ajax render="@form" />
</h:commandButton>
в моем бине получатель 'imgSrc' выглядит так:
public String getImgSrc()
{
FacesContext fc = FacesContext.getCurrentInstance();
UIComponent c = UIComponent.getCurrentComponent(fc);
String cID = c.getId();
String output = "/resources/EMPTY_BOX.jpg";
String currOption = gameBoard.get(cID);
if (currOption != null)
{
output = "/resources/" + currOption + ".jpg";
}
return output;
}
в функции clickImg внутри компонента, я проверяю, был ли уже выбран какой-либо квадрат, иначе я знаю, что квадрат был выбран в качестве источника движения; в противном случае я вызываю функцию перемещения EJB, которая возвращает обновленную карту доски, после чего я вызываю функцию 'getImgSrc', которая обновляет доску, а затем я вызываю функцию перемещения компьютера EJB, которая также возвращает обновленную карту доски, а затем я снова вызываю getImgSrc, который обновляет саму плату.
однако, если я попытаюсь вызвать функцию перемещения компьютера с помощью таймера, например:
Timer timer = new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run()
{
getMachineMove();
}
} , 1000);
функция 'getMachineMove' вызывается через секунду, и эта функция вызывает 'getImgSrc', но плата не обновляется. он не обновляется, потому что FacesContext.getCurrentInstance () возвращает ноль.
Надеюсь, я был достаточно ясен - и в таком случае я был бы признателен за любую помощь (а также за идеи, как заставить определенные кнопки команд мигать от компонента).
ура,
Эрез