我方坦克可以发射移动的子弹
Test.java
~~~
package tkdz;
import javax.swing.*;
import java.awt.*;
public class Test extends JFrame{
MyPanel mp =null;
public static void main(String[] args){
Test t1 =new Test();
}
public Test(){
mp =new MyPanel();//面板
this.add(mp);
this.addKeyListener(mp);//添加键盘监听
this.setSize(400,300);
this.setLocation(300, 280);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
~~~
Tank.java
~~~
package tkdz;
public class Tank {
int x=0,y=0;
int fangxiang=0;//方向
int sudu=1;//速度
public int getFangxiang() {
return fangxiang;
}
public void setFangxiang(int fangxiang) {
this.fangxiang = fangxiang;
}
public int getSudu() {
return sudu;
}
public void setSudu(int sudu) {
this.sudu = sudu;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Tank(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
~~~
MyTank.java
~~~
package tkdz;
public class MyTank extends Tank{
Zidan zd=null;
public MyTank(int x, int y) {
super(x, y);
}
public void xiangshang()
{
y-=sudu;
}
public void xiangzuo()
{
x-=sudu;
}
public void xiangxia()
{
y+=sudu;
}
public void xiangyou()
{
x+=sudu;
}
//子弹定义在我的坦克里,因为子弹是随着我的坦克走的
public void fszd(){
switch(this.fangxiang){
case 0:
zd=new Zidan(x+10,y,0);//0控制的子弹方向
break;
case 1:
zd=new Zidan(x,y+10,1);
break;
case 2:
zd=new Zidan(x+10,y+30,2);
break;
case 3:
zd=new Zidan(x+30,y+10,3);
break;
}
Thread t=new Thread(zd);//启动线程,发射子弹
t.start();
}
}
~~~
DiTank.java
~~~
package tkdz;
public class DiTank extends Tank{
public DiTank(int x, int y) {
super(x, y);
}
}
~~~
Zidan.java
~~~
package tkdz;
//由于敌人的子弹是随意动的,直接把子弹做成线程,继承Runnable接口
public class Zidan implements Runnable{
int x;
int y;
int fangxiang;
int sudu=2;
public Zidan(int x, int y,int fangxiang) {
super();
this.x = x;
this.y = y;
this.fangxiang=fangxiang;
}
@Override
public void run() {//让子弹动起来
//凡是线程下面的死循环里都要有个睡眠
while(true){
try{
Thread.sleep(50);//睡眠
}catch(Exception e){}
switch(this.fangxiang){
case 0:
y-=sudu;
break;
case 1:
x-=sudu;
break;
case 2:
y+=sudu;
break;
case 3:
x+=sudu;
break;
}
}
}
}
~~~
MyPanel.java
~~~
package tkdz;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
public class MyPanel extends JPanel implements KeyListener,Runnable{
MyTank mt=null;
Vector<DiTank> dtk =new Vector<DiTank>();//敌坦克集合,多线程用Vector
int tksl =3;//敌人坦克的数量
public MyPanel(){
mt=new MyTank(140,232);//我的坦克,1辆
for(int i=0;i<tksl;i++){//敌坦克数量,3辆
DiTank dt=new DiTank((i)*181+5,0);
dtk.add(dt);
}
}
public void paint(Graphics g){
super.paint(g);
g.fillRect(0, 0, 400, 300);//黑色400*300画布
this.drawTank(mt.getX(), mt.getY(), g, mt.fangxiang, 0);//绘制我方坦克
for(int i = 0; i < dtk.size(); i++){//绘制敌方坦克
this.drawTank(dtk.get(i).getX(), dtk.get(i).getY(), g, 2, 1);
}
if(mt.zd!=null){//绘制子弹
g.setColor(Color.white);
g.fill3DRect(mt.zd.x, mt.zd.y, 3, 3, false);
}
}
public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing)
{
switch(leixing)
{
case 0://我的坦克
g.setColor(Color.yellow);
break;
case 1://敌人的坦克
g.setColor(Color.green);
break;
}
switch(fangxiang)
{
case 0://上
g.fill3DRect(x, y, 5, 30,false);
g.fill3DRect(x+15,y , 5, 30,false);
g.fill3DRect(x+5,y+5 , 10, 20,false);
g.fillOval(x+5, y+10, 10, 10);
g.drawLine(x+10, y+15, x+10, y-3);
break;
case 1://左
g.fill3DRect(x, y, 30, 5,false);
g.fill3DRect(x, y+15, 30, 5, false);
g.fill3DRect(x+5, y+5, 20, 10, false);
g.fillOval(x+10, y+5, 10, 10);
g.drawLine(x+15, y+10, x-3, y+10);
break;
case 2://下
g.fill3DRect(x, y, 5, 30,false);
g.fill3DRect(x+15,y , 5, 30,false);
g.fill3DRect(x+5,y+5 , 10, 20,false);
g.fillOval(x+5, y+10, 10, 10);
g.drawLine(x+10, y+15, x+10, y+33);
break;
case 3://右
g.fill3DRect(x, y, 30, 5,false);
g.fill3DRect(x, y+15, 30, 5, false);
g.fill3DRect(x+5, y+5, 20, 10, false);
g.fillOval(x+10, y+5, 10, 10);
g.drawLine(x+15, y+10, x+33, y+10);
break;
}
this.repaint();
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_W)
{
this.mt.setFangxiang(0);//方向为0
this.mt.xiangshang();//启动函数向上
}else if(e.getKeyCode()==KeyEvent.VK_A)
{
this.mt.setFangxiang(1);
this.mt.xiangzuo();
}else if(e.getKeyCode()==KeyEvent.VK_S)
{
this.mt.setFangxiang(2);
this.mt.xiangxia();
}else if(e.getKeyCode()==KeyEvent.VK_D)
{
this.mt.setFangxiang(3);
this.mt.xiangyou();
}
//子弹
if(e.getKeyCode()==KeyEvent.VK_J){
this.mt.fszd();//发射子弹
}
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (Exception e) {
this.repaint();
}
}
}
}
~~~
![](https://box.kancloud.cn/b6745e10476ea9c788aea65f744e9677_394x296.png)
- 书写心得
- 基础回顾
- 异常的处理
- equils方法
- 集合类
- ArrayList的遍历和添加
- ArrayList的删除插入
- 实例:食品库存管理
- HashMap
- 集合类的区别和选择
- 泛型和反射机制
- 图形化用户界面(GUI)
- JFrame容器
- 边界布局管理器
- 流式布局管理器
- 网格布局管理器
- Jpanel面板
- 文本框和标签
- 单选按钮和复选按钮
- 下拉列表框和滚动条
- 拆分窗口
- 聊天窗口
- 用户登录界面
- 记事本界面
- 线程
- 创建线程的方法
- 线程的优先级
- 线程的睡眠
- 线程的让步与阻塞
- 买票问题
- 生产消费问题
- IO流
- 字符流
- 字节流
- 缓冲流
- 数据流传输
- 转换流
- 空字符串区别
- Print流
- Object
- IO流补充
- 绘图技术和事件处理机制
- 绘图基础-绘制图形
- 绘图基础-绘制图像
- 绘图基础-绘制文字
- 事件处理-事件监听
- 事件处理-控件事件
- 事件处理-键盘事件
- 事件处理-鼠标事件
- 事件处理-窗口事件
- 记事本
- 坦克大战
- 阶段1
- 阶段2
- 阶段3
- 阶段4
- 阶段5
- 阶段6
- 阶段7
- 阶段8
- 阶段9
- 阶段10
- 阶段11
- 阶段12
- 阶段13
- 阶段14
- SQL Server 2005
- 简易学生管理系统
- 阶段(1)-显示
- 阶段(2)-查询
- 阶段(3)-添加
- 阶段(4)-删除
- 阶段(5)-修改
- 简易餐饮管理系统
- 阶段-01
- 阶段-02
- 阶段-03
- 阶段-04
- Index.java
- Login.java
- Main.java
- MyFont.java
- ImagePanel.java
- Conn.java
- Moxing.java
- 网络编程基础
- 互发信息(1)-传输
- 互发信息(2)-互发
- 互发信息(3)-GUI
- 互发信息(4)-对象流
- 网络聊天工具
- 阶段--01--界面
- Server
- Index
- Client
- Login
- Chat
- List