【0基础学java】教学日志:项目实战-坦克大战-2
本章概述:本章主要讲了如何让坦克动起来,添加键盘监听事件,每隔50ms刷新窗口自动调用画笔,添加键盘处理,根据箭头的状态来判断坦克的移动方向
目录
目录
一、将坦克坐标定为变量,在paint()方法中修改值,paint被调用后,就可以动起来
三、在主线程每隔50ms刷新窗口,调用repaint()方法,repaint()会自动调用paint(g)
四、添加键盘处理,根据上下左右箭头的按键状态,判断坦克的移动方向
本章概述:
一、将坦克坐标定为变量,在paint()方法中修改值,paint被调用后,就可以动起来
public class TankFrame extends Frame {
int x = 200,y=200;
public TankFrame(){
setTitle("tank war");
setSize(800,600);
@ -28,6 +30,8 @@ public class TankFrame extends Frame {
@Override
public void paint(Graphics g) {
// System.out.println("paint");
g.fillRect(200,200,50,50);
g.fillRect(x,y,50,50);
x += 50;
y += 50;
}
}
二、添加键盘监听事件
1、TankFrame
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
@ -18,6 +20,7 @@ public class TankFrame extends Frame {
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
addWindowListener(new WindowAdapter() {
@Override
@ -31,7 +34,21 @@ public class TankFrame extends Frame {
public void paint(Graphics g) {
// System.out.println("paint");
g.fillRect(x,y,50,50);
x += 50;
y += 50;
// x += 50;
// y += 50;
}
class MyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
// System.out.println("pressed");
x += 50;
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("released");
}
}
}
运行效果
三、在主线程每隔50ms刷新窗口,调用repaint()方法,repaint()会自动调用paint(g)
1、TankFrame
int x = 200,y=200;
public TankFrame(){
setTitle("tank war");
setSize(800,600);
setResizable(false);
setVisible(true);
this.addKeyListener(new MyListener());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
// System.out.println("paint");
g.fillRect(x,y,50,50);
// x += 50;
x += 50;
// y += 50;
}
@ -42,14 +42,14 @@
@Override
public void keyPressed(KeyEvent e) {
// System.out.println("pressed");
x += 50;
repaint();
// x += 50;
// repaint();
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("released");
}
}
}
2、Main
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author YuPanpan
* @version 1.0
*/
public class Main {
public static void main(String[] args) {
public static void main(String[] args) throws InterruptedException {
TankFrame tf = new TankFrame();
while(true){
Thread.sleep(50);
tf.repaint();
}
}
}
运行效果
四、添加键盘处理,根据上下左右箭头的按键状态,判断坦克的移动方向
1、TankFrame
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author YuPanpan
* @version 1.0
*/
public class TankFrame extends Frame {
int x = 200,y=200;
public TankFrame(){
setTitle("tank war");
setSize(800,600);
@ -34,21 +35,41 @@ public class TankFrame extends Frame {
public void paint(Graphics g) {
// System.out.println("paint");
g.fillRect(x,y,50,50);
x += 50;
// x += 10;
// y += 50;
}
class MyListener extends KeyAdapter{
boolean bL = false;
boolean bU = false;
boolean bR = false;
boolean bD = false;
@Override
public void keyPressed(KeyEvent e) {
// System.out.println("pressed");
// x += 50;
// repaint();
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
bL = true;
break;
case KeyEvent.VK_UP:
bU = true;
break;
case KeyEvent.VK_RIGHT:
bR = true;
break;
case KeyEvent.VK_DOWN:
bD = true;
break;
default:
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("released");
// System.out.println("released");
}
}
}