栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

0基础学java】教学日志:项目实战-坦克大战-3

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

0基础学java】教学日志:项目实战-坦克大战-3

本章概述:本章主要讲了

1、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移。

2、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用。

3、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的。

4、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来。

5、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来

目录

本章概述:

一、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移

1、TankFrame 

2、Dir 

二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用

1、TankFrame

2、Tank

三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的

1、TankFrame 

2、Tank 

四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来

1、TankFrame 

2、Tank 

3、Bullet 

五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来

1、TankFrame 

2、Tank 

运行效果


本章概述:

一、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移

1、TankFrame 
package com.tencent.tank;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class TankFrame extends Frame {

    int x = 200,y=200;
    Dir dir = Dir.DOWN;
    static final int SPEED = 10;


    public TankFrame(){
@ -33,10 +35,25 @@ public class TankFrame extends Frame {

    @Override
    public void paint(Graphics g) {
//        System.out.println("paint");
        g.fillRect(x,y,50,50);
//        x += 10;
//        y += 50;

        switch(dir){
            case LEFT:
                x -= SPEED;
                break;
            case UP:
                y -= SPEED;
                break;
            case RIGHT:
                x += SPEED;
                break;
            case DOWN:
                y += SPEED;
                break;
                default:
                    break;
        }

    }

    class MyListener extends KeyAdapter{
@ -47,7 +64,6 @@ public class TankFrame extends Frame {
        boolean bD = false;
        @Override
        public void keyPressed(KeyEvent e) {
//            System.out.println("pressed");
            int key = e.getKeyCode();
            switch(key){
                case KeyEvent.VK_LEFT:
@ -65,11 +81,40 @@ public class TankFrame extends Frame {
                    default:
                        break;
            }

            setMainTankDir();
        }

        @Override
        public void keyReleased(KeyEvent e) {
//            System.out.println("released");
            int key = e.getKeyCode();
            switch(key){
                case KeyEvent.VK_LEFT:
                    bL = false;
                    break;
                case KeyEvent.VK_UP:
                    bU = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    bR = false;
                    break;
                case KeyEvent.VK_DOWN:
                    bD = false;
                    break;
                default:
                    break;
            }

            setMainTankDir();
        }

        private void setMainTankDir() {
            if(bL)  dir = Dir.LEFT;
            if(bU)  dir = Dir.UP;
            if(bR)  dir = Dir.RIGHT;
            if(bD)  dir = Dir.DOWN;
        }
    }


}

2、Dir 
public enum Dir {
    LEFT,UP,RIGHT,DOWN
}

二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用

1、TankFrame
package com.tencent.tank;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class TankFrame extends Frame {

    int x = 200,y=200;
    Dir dir = Dir.DOWN;
    static final int SPEED = 10;

    Tank myTank = new Tank(200,200,Dir.DOWN);

    public TankFrame(){
        setTitle("tank war");
@ -35,24 +32,8 @@ public class TankFrame extends Frame {

    @Override
    public void paint(Graphics g) {
        g.fillRect(x,y,50,50);

        switch(dir){
            case LEFT:
                x -= SPEED;
                break;
            case UP:
                y -= SPEED;
                break;
            case RIGHT:
                x += SPEED;
                break;
            case DOWN:
                y += SPEED;
                break;
                default:
                    break;
        }

        myTank.paint(g);

    }

@ -109,13 +90,13 @@
        }

        private void setMainTankDir() {
            if(bL)  dir = Dir.LEFT;
            if(bU)  dir = Dir.UP;
            if(bR)  dir = Dir.RIGHT;
            if(bD)  dir = Dir.DOWN;
            if(bL)  myTank.setDir(Dir.LEFT);
            if(bU)  myTank.setDir(Dir.UP);
            if(bR)  myTank.setDir(Dir.RIGHT);
            if(bD)  myTank.setDir(Dir.DOWN);
        }
    }


}

2、Tank
package com.tencent.tank;

import java.awt.*;

public class Tank {

    private int x,y;
    private Dir dir;
    private static final int SPEED = 10;

    public Tank(int x,int y,Dir dir){
        this.x = x;
        this.y = y;
        this.dir = dir;
    }

    public Dir getDir() {
        return dir;
    }

    public void setDir(Dir dir) {
        this.dir = dir;
    }

    public void paint(Graphics g){
        g.fillRect(x,y,50,50);

        move();
    }

    public void move(){
        switch(dir){
            case LEFT:
                x -= SPEED;
                break;
            case UP:
                y -= SPEED;
                break;
            case RIGHT:
                x += SPEED;
                break;
            case DOWN:
                y += SPEED;
                break;
            default:
                break;
        }
    }


}

三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的 1、TankFrame 
package com.tencent.tank;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class TankFrame extends Frame {

    Tank myTank = new Tank(200,200,Dir.DOWN);

    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) {

        myTank.paint(g);

    }

    class MyListener extends KeyAdapter{

        boolean bL = false;
        boolean bU = false;
        boolean bR = false;
        boolean bD = false;
        @Override
        public void keyPressed(KeyEvent e) {
            myTank.setMoving(true);

            int key = e.getKeyCode();
            switch(key){
                case KeyEvent.VK_LEFT:
@ -68,6 +70,7 @@ public class TankFrame extends Frame {

        @Override
        public void keyReleased(KeyEvent e) {

            int key = e.getKeyCode();
            switch(key){
                case KeyEvent.VK_LEFT:
@ -94,9 +97,11 @@
            if(bU)  myTank.setDir(Dir.UP);
            if(bR)  myTank.setDir(Dir.RIGHT);
            if(bD)  myTank.setDir(Dir.DOWN);

            if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
        }
    }


}

2、Tank 
package com.tencent.tank;

import java.awt.*;

public class Tank {

    private int x,y;
    private Dir dir;
    private static final int SPEED = 10;

    private boolean moving = false;

    public Tank(int x,int y,Dir dir){
        this.x = x;
        this.y = y;
        this.dir = dir;
    }

    public boolean isMoving() {
        return moving;
    }

    public void setMoving(boolean moving) {
        this.moving = moving;
    }

    public Dir getDir() {
        return dir;
    }
@ -29,24 +39,26 @@
    }

    public void move(){
        if(!moving) return;

        switch(dir){
            case LEFT:
                x -= SPEED;
                break;
            case UP:
                y -= SPEED;
                break;
            case RIGHT:
                x += SPEED;
                break;
            case DOWN:
                y += SPEED;
                break;
            default:
                break;
        }
    }


}

四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来 1、TankFrame 
package com.tencent.tank;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class TankFrame extends Frame {

    Tank myTank = new Tank(200,200,Dir.DOWN);
    Bullet b = new Bullet(300,300,Dir.DOWN);

    public TankFrame(){
        setTitle("tank war");
@ -20,7 +21,7 @@ public class TankFrame extends Frame {
        setResizable(false);
        setVisible(true);

        this.addKeyListener(new MyListener());
        this.addKeyListener(new MyKeyListener());

        addWindowListener(new WindowAdapter() {
            @Override
@ -34,10 +35,11 @@ public class TankFrame extends Frame {
    public void paint(Graphics g) {

        myTank.paint(g);
        b.paint(g);

    }

    class MyListener extends KeyAdapter{
    class MyKeyListener extends KeyAdapter{

        boolean bL = false;
        boolean bU = false;
@ -45,8 +47,6 @@ public class TankFrame extends Frame {
        boolean bD = false;
        @Override
        public void keyPressed(KeyEvent e) {
            myTank.setMoving(true);

            int key = e.getKeyCode();
            switch(key){
                case KeyEvent.VK_LEFT:
@ -93,14 +93,20 @@ public class TankFrame extends Frame {
        }

        private void setMainTankDir() {
            if(bL)  myTank.setDir(Dir.LEFT);
            if(bU)  myTank.setDir(Dir.UP);
            if(bR)  myTank.setDir(Dir.RIGHT);
            if(bD)  myTank.setDir(Dir.DOWN);

            if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
            else {
                myTank.setMoving(true);

                if (bL) myTank.setDir(Dir.LEFT);
                if (bU) myTank.setDir(Dir.UP);
                if (bR) myTank.setDir(Dir.RIGHT);
                if (bD) myTank.setDir(Dir.DOWN);
            }

        }
    }


}

2、Tank 
package com.tencent.tank;

import java.awt.*;

public class Tank {

    private int x,y;
    private Dir dir;
    private static final int SPEED = 10;
    private static final int SPEED = 5;

    private boolean moving = false;

    public Tank(int x,int y,Dir dir){
        this.x = x;
        this.y = y;
        this.dir = dir;
    }

    public boolean isMoving() {
        return moving;
    }

    public void setMoving(boolean moving) {
        this.moving = moving;
    }

    public Dir getDir() {
        return dir;
    }

    public void setDir(Dir dir) {
        this.dir = dir;
    }

    public void paint(Graphics g){
        g.fillRect(x,y,50,50);

        move();
    }

    public void move(){
        if(!moving) return;

        switch(dir){
            case LEFT:
                x -= SPEED;
                break;
            case UP:
                y -= SPEED;
                break;
            case RIGHT:
                x += SPEED;
                break;
            case DOWN:
                y += SPEED;
                break;
            default:
                break;
        }
    }


}

3、Bullet 
package com.tencent.tank;

import java.awt.*;

public class Bullet {

    private int x,y;
    private static final int SPEED = 1;
    private Dir dir;
    static final int WIDTH = 30,HEIGHT = 30;

    public Bullet(int x,int y,Dir dir){
        this.x = x;
        this.y = y;
        this.dir = dir;
    }

    public void paint(Graphics g){
        Color c = g.getColor();
        g.setColor(Color.RED);
        g.fillOval(x,y,WIDTH,HEIGHT);
        g.setColor(c);

        move();

    }

    public void move(){
        switch(dir){
            case LEFT:
                x -= SPEED;
                break;
            case UP:
                y -= SPEED;
                break;
            case RIGHT:
                x += SPEED;
                break;
            case DOWN:
                y += SPEED;
                break;
            default:
                break;
        }
    }

五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来 1、TankFrame 
package com.tencent.tank;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class TankFrame extends Frame {

    Tank myTank = new Tank(200,200,Dir.DOWN);
    Tank myTank = new Tank(200,200,Dir.DOWN,this);
    Bullet b = new Bullet(300,300,Dir.DOWN);
    static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;

    public TankFrame(){
        setTitle("tank war");
        setSize(GAME_WIDTH,GAME_HEIGHT);
        setResizable(false);
        setVisible(true);

        this.addKeyListener(new MyKeyListener());

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    Image offScreenImage = null;

    @Override
    public void update(Graphics g) {
        if (offScreenImage == null) {
            offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
        }
        Graphics gOffScreen = offScreenImage.getGraphics();
        Color c = gOffScreen.getColor();
        gOffScreen.setColor(Color.BLACK);
        gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
        gOffScreen.setColor(c);
        paint(gOffScreen);
        g.drawImage(offScreenImage, 0, 0, null);
    }

    @Override
    public void paint(Graphics g) {

        myTank.paint(g);
        b.paint(g);

    }

    class MyKeyListener extends KeyAdapter{

        boolean bL = false;
        boolean bU = false;
        boolean bR = false;
        boolean bD = false;
        @Override
        public void keyPressed(KeyEvent e) {
            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;

                case KeyEvent.VK_SPACE:
                    myTank.fire();
                    break;
                    default:
                        break;
            }

            setMainTankDir();
        }

        @Override
        public void keyReleased(KeyEvent e) {

            int key = e.getKeyCode();
            switch(key){
                case KeyEvent.VK_LEFT:
                    bL = false;
                    break;
                case KeyEvent.VK_UP:
                    bU = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    bR = false;
                    break;
                case KeyEvent.VK_DOWN:
                    bD = false;
                    break;
                default:
                    break;
            }

            setMainTankDir();
        }

        private void setMainTankDir() {
            if(!bL && !bU && !bR && !bD) myTank.setMoving(false);
            else {
                myTank.setMoving(true);

                if (bL) myTank.setDir(Dir.LEFT);
                if (bU) myTank.setDir(Dir.UP);
                if (bR) myTank.setDir(Dir.RIGHT);
                if (bD) myTank.setDir(Dir.DOWN);
            }

        }
    }


}
2、Tank 
 package com.tencent.tank;

import java.awt.*;

public class Tank {

    private int x,y;
    private Dir dir;
    private static final int SPEED = 5;

    private boolean moving = false;

    public Tank(int x,int y,Dir dir){
    TankFrame tf = null;

    public Tank(int x,int y,Dir dir,TankFrame tf){
        this.x = x;
        this.y = y;
        this.dir = dir;
        this.tf = tf;
    }

    public boolean isMoving() {
        return moving;
    }

    public void setMoving(boolean moving) {
        this.moving = moving;
    }

    public Dir getDir() {
        return dir;
    }

    public void setDir(Dir dir) {
        this.dir = dir;
    }

    public void paint(Graphics g){
        Color c = g.getColor();
        g.setColor(Color.BLUE);
        g.fillRect(x,y,50,50);
        g.setColor(c);

        move();
    }

    public void move(){
        if(!moving) return;

        switch(dir){
            case LEFT:
                x -= SPEED;
                break;
            case UP:
                y -= SPEED;
                break;
            case RIGHT:
                x += SPEED;
                break;
            case DOWN:
                y += SPEED;
                break;
            default:
                break;
        }
    }


    public void fire() {
        tf.b = new Bullet(this.x,this.y,this.dir);
    }
}

运行效果

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/933468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号