📄 nextframe.java
字号:
/*
* 创建日期 2005-6-24
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
package game;
import java.util.Random;
import java.util.TimerTask;
/**
* @author Administrator
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public class NextFrame extends TimerTask {
private GameCtrl gameCtrl;
private Random rand = new Random();
// 每局时长
public long tickcount = 0;
// 食物最大停留时间
private long foodtime = 25;
// 食物图像的宽度高度
private int foodwidth = 0;
private int foodheight = 0;
/**
*
*/
public NextFrame(GameCtrl gameCtrl) {
super();
this.gameCtrl = gameCtrl;
foodwidth = gameCtrl.foodImage.getWidth();
foodheight = gameCtrl.foodImage.getHeight();
}
/* (非 Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
// 食物位置调整
foodtime--;
if (foodtime == 0){
foodtime = 25;
getNextPos();
}
// 移动蛇身
switch(gameCtrl.direction){
case 0:
// 蛇身位置处理
for (int i = 19; i > 0 ; i--){
gameCtrl.snakeX[i] = gameCtrl.snakeX[i - 1];
gameCtrl.snakeY[i] = gameCtrl.snakeY[i - 1];
}
// 蛇头处理
if (gameCtrl.snakeY[0] > 3){
gameCtrl.snakeY[0] -= 4;
}else{
if (gameCtrl.snakeX[0] > gameCtrl.width / 2){
// 如果已到屏幕上界则左移
gameCtrl.direction = 2;
gameCtrl.snakeX[0] -= 4;
}else{
// 如果已到屏幕上界则右移
gameCtrl.direction = 3;
gameCtrl.snakeX[0] += 4;
}
}
break;
case 1:
// 蛇身处理
for (int i = 19; i > 0 ; i--){
gameCtrl.snakeX[i] = gameCtrl.snakeX[i - 1];
gameCtrl.snakeY[i] = gameCtrl.snakeY[i - 1];
}
// 蛇头处理
if (gameCtrl.snakeY[0] < gameCtrl.height - 5){
gameCtrl.snakeY[0] += 4;
}else{
if (gameCtrl.snakeX[0] > gameCtrl.width / 2){
// 如果已到屏幕上界则左移
gameCtrl.direction = 2;
gameCtrl.snakeX[0] -= 4;
}else{
// 如果已到屏幕上界则右移
gameCtrl.direction = 3;
gameCtrl.snakeX[0] += 4;
}
}
break;
case 2:
// 蛇身处理
for (int i = 19; i > 0 ; i--){
gameCtrl.snakeX[i] = gameCtrl.snakeX[i - 1];
gameCtrl.snakeY[i] = gameCtrl.snakeY[i - 1];
}
// 蛇头处理
if (gameCtrl.snakeX[0] > 3){
gameCtrl.snakeX[0] -= 4;
}else{
if (gameCtrl.snakeY[0] > gameCtrl.height / 2){
// 如果已到屏幕上界则左移
gameCtrl.direction = 0;
gameCtrl.snakeY[0] -= 4;
}else{
// 如果已到屏幕上界则右移
gameCtrl.direction = 1;
gameCtrl.snakeY[0] += 4;
}
}
break;
case 3:
// 蛇身处理
for (int i = 19; i > 0 ; i--){
gameCtrl.snakeX[i] = gameCtrl.snakeX[i - 1];
gameCtrl.snakeY[i] = gameCtrl.snakeY[i - 1];
}
// 蛇头处理
if (gameCtrl.snakeX[0] < gameCtrl.width - 5){
gameCtrl.snakeX[0] += 4;
}else{
if (gameCtrl.snakeY[0] > gameCtrl.height / 2){
// 如果已到屏幕上界则左移
gameCtrl.direction = 0;
gameCtrl.snakeY[0] -= 4;
}else{
// 如果已到屏幕上界则右移
gameCtrl.direction = 1;
gameCtrl.snakeY[0] += 4;
}
}
break;
}
// 碰撞检测
if (gameCtrl.snakeX[0] > gameCtrl.foodX - foodwidth / 2 &&
gameCtrl.snakeX[0] < gameCtrl.foodX + foodwidth / 2 &&
gameCtrl.snakeY[0] > gameCtrl.foodY - foodheight / 2 &&
gameCtrl.snakeY[0] < gameCtrl.foodY + foodheight / 2){
// 计分
gameCtrl.score += 10;
// 生成新的食物位置
getNextPos();
}
// 计时
tickcount++;
if (tickcount == 300)
gameCtrl.isGameOver = true;
// 重绘画面
gameCtrl.repaint();
}
public void getNextPos(){
// 在屏幕内随机设置位置
int x = (int)(rand.nextLong());
gameCtrl.foodX = (int)(x % gameCtrl.width);
int y = (int)(rand.nextLong());
gameCtrl.foodY = (int)(y % gameCtrl.height);
// 使图像限定在屏幕内
if (gameCtrl.foodX < foodwidth / 2)
gameCtrl.foodX = foodwidth / 2;
if (gameCtrl.foodX > gameCtrl.width - foodwidth / 2)
gameCtrl.foodX = gameCtrl.width - foodwidth / 2;
if (gameCtrl.foodY < foodheight / 2)
gameCtrl.foodY = foodheight / 2;
if (gameCtrl.foodY > gameCtrl.height - foodheight / 2)
gameCtrl.foodY = gameCtrl.height - foodheight / 2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -