Страницы

Поиск по вопросам

вторник, 18 июня 2019 г.

Игра snake на JavaFx

Доброго времени суток, как можно поменять направление змейки так чтобы он не шел в обратную сторону сразу <-->.
import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.Button; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.StackPane; import javafx.scene.paint.Paint; import javafx.stage.Stage;
public class CanvasEx extends Application { final int size=500, dot_size=10, up=1, right=2, down=3, left=4; int delay=50, length=3, dir=2, food_x, food_y; Canvas canvas; GraphicsContext gc; int x[]=new int[size*size]; int y[]=new int[size*size]; Thread game; boolean lost=false; @Override public void start(Stage primaryStage) {
StackPane root = new StackPane(); canvas=new Canvas(size,size); gc=canvas.getGraphicsContext2D(); canvas.setFocusTraversable(true); root.getChildren().add(canvas); startGame(); canvas.setOnKeyPressed(new EventHandler(){ @Override public void handle(KeyEvent e) { KeyCode key=e.getCode(); if(key.equals(KeyCode.UP)) dir=up; if(key.equals(KeyCode.DOWN)) dir=down; if(key.equals(KeyCode.LEFT)) dir=left; if(key.equals(KeyCode.RIGHT)) dir=right; }
}); Scene scene = new Scene(root, size, size);
primaryStage.setTitle("Hello World!"); primaryStage.setScene(scene); primaryStage.show(); } private void draw(GraphicsContext gc){ gc.clearRect(0, 0, size, size); if(!lost){ gc.setFill(Paint.valueOf("green")); gc.fillOval(food_x, food_y, dot_size, dot_size); gc.setFill(Paint.valueOf("red")); gc.fillOval(x[0], y[0], dot_size, dot_size); gc.setFill(Paint.valueOf("orange")); for(int i=1; i }else{ gc.setFill(Paint.valueOf("black")); gc.fillText("Game Over", size/2-50, size/2-15); game.stop(); } } /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); }
private void startGame() { length=3; for(int i=0; i
}); game.start(); }
private void locateFood() { food_x=(int)(Math.random()*((size/dot_size)-1))*dot_size; food_y=(int)(Math.random()*((size/dot_size)-1))*dot_size; } private void checkFood() { if(x[0]==food_x && y[0]==food_y){ length++; locateFood(); } } private void checkCollision() { if(x[0]>=size) lost=true; if(y[0]>=size) lost=true; if(x[0]<0) lost=true; if(y[0]<0) lost=true; for(int i=3; i0;i--){ x[i]=x[i-1]; y[i]=y[i-1]; } if(dir==up)y[0]-=dot_size; if(dir==down)y[0]+=dot_size; if(dir==right)x[0]+=dot_size; if(dir==left)x[0]-=dot_size; } }


Ответ

Мне кажется тут решение в лоб:
if(key.equals(KeyCode.UP)) dir=up; if(key.equals(KeyCode.DOWN)) dir=down; if(key.equals(KeyCode.LEFT)) dir=left; if(key.equals(KeyCode.RIGHT)) dir=right;
В этом участке кода просто добавляем проверки на dir != down (в случае, если KeyCode.UP) и так далее.

Комментариев нет:

Отправить комментарий