码迷,mamicode.com
首页 > 其他好文 > 详细

初级黄金体验 其一

时间:2019-10-05 20:05:18      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:缓冲   mon   dir   port   phi   github   ref   rap   apr   

关于作者

作者背景:公元2001年,意大利那不勒斯少年,为了达成梦想,在国庆的三天发现自己替身能力Java。从而加入了黑手党组织,并成为......

作者目的:入门Java 为了Fighting Gold

关于游戏

游戏说明:参考了不少的代码,但是自带点点点点思想创新,一个简陋无比但是有点点创意的Java小游戏,代码随便用,可以继续开源开发。其实想做坦克大战为了面向对象的作用发现太复杂又没(菜)创(机)意。 : )

游戏代码Git地址:https://github.com/O-VIGIA/JavaPrograme_Level1.git

游戏名:生存的代价

游戏目的:生存时间更长

游戏背景:在这个乱飞的年代,谁能活得更久呢

游戏玩法:
各色小球漫天乱飞,碰壁反弹,而你
灰色小球-------->你
蓝色小球:被撞到或者吃掉可以加速
橙色小球:被撞到或吃掉被毒死
粉色小球:被撞到或者吃掉变成随即大小

上下左右键自由移动直到死亡结束

小球碰壁会反弹

彩蛋:你碰壁的时候会方向反转

游戏总结:后面还想加各种彩色小球功能,大地图,地图障碍物,迷宫地图什么什么的,发现自己还是太菜了,以后有时间慢慢丰富吧。总的来说,eclipse好,感觉像在百度代码,但是也领悟到了Java类中逻辑思维和抽象思维的美妙与强大。例如起初并没有什么规划,在就只想什么添什么,后来我发现这些小球的有些地方很相似,随机设置位置和速度,构造函数等等,于是就设置了所有小球的父类,果然很好用!还了解了内部类,静态语句块等等一些东西。

关于截图:

初始
技术图片
遇到粉球变身
技术图片
遇到橙球结束
技术图片

关于打包及太菜了不能jar成功转可完全执行的exe

转了一下午QWQ还是成不了 人没了
技术图片

Little黄金体验

技术图片

所谓的觉悟,就是能在黑暗的荒野中,开辟出一条应当前进的道路。技术图片

关于代码

垃圾主类代码如下:

package com.lxy.game;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;



/**
 * 游戏主类
 * @author LXY
 *
 */
public class MyGameFrame extends Frame {
    //speed && r
    int speed = 3;
    double r;
    //time
    Date startTime = new Date();
    Date endTime;
    int period;
    //加载图片
//  Image tankImg = GameUtil.getImage("images/tank.jpg");
    Image bgImg = GameUtil.getImage("images/bg.jpg");
    //创建类
    Tank tank = new Tank(/*tankImg, */400, 450);
    GameObject bg = new GameObject(bgImg, 0, 20);
    Shell[] shells = new Shell[25];
    Resource[] resources = new Resource[10];
    Big[] bigs = new Big[20];
    //画笔
    @Override
    public void paint(Graphics g) { //自动调用画笔g
        //保存 g.color
        Color c = g.getColor();
        //背景
        bg.drawSelf(g);
        //设置坦克
        tank.setSpeed(speed);
        if(tank.live)
            tank.drawSelf(g);
        else {
            //启动计时功能给出提示
            g.setColor(Color.YELLOW);
            Font f = new Font("楷体",Font.BOLD,50);
            g.setFont(f);
            g.drawString("你持续了"+period+"秒!", (int)tank.x, (int)tank.y);
        }
        //画炮弹
        for(int i=0;i<shells.length;++i) {
            boolean peng = false;
            shells[i].draw(g);
            //碰撞检测
            peng = shells[i].getRect().intersects(tank.getRect());
            if(peng) {
                //计时器
                endTime = new Date();
                period = (int)((endTime.getTime()-startTime.getTime())/1000);
                tank.live = false;
            }
        }
        //画加速资源
        for(int j=0;j<resources.length;++j) {
            boolean peng1 = false;
            //有生命就画
            if(resources[j].live)
                resources[j].draw(g);
            //碰撞检测
            peng1 = resources[j].getRect().intersects(tank.getRect());
            if(peng1) {
                speed = speed + 1;
                tank.setSpeed(speed);
                resources[j].live = false;
            }
        }
        //画变大资源
        for(int k=0;k<bigs.length;++k) {
            boolean peng2 = false;
            //有生命就画
            if(bigs[k].live)
                bigs[k].draw(g);
            //碰撞检测
            peng2 = bigs[k].getRect().intersects(tank.getRect());
            if(peng2) {
                r = Math.random()*50+10;
                tank.setSize((int)r);
                bigs[k].live=false;
            }
        }
        //恢复g.color
        g.setColor(c);
        
    }
    
    //内部类帮助我们反复画窗口
    class PaintThread extends Thread{
        
        @Override
        public void run() {
            while(true) {
                //重画
//              System.out.println("重画了一次!");
                repaint(); 
                //延时
                try {      
                    Thread.sleep(35);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //监听键盘的内部类
    class KeyMonitor extends KeyAdapter{
        //重载按下键发生的事件
        @Override
        public void keyPressed(KeyEvent e) {
            tank.addDirection(e);
        }
        //重载松开键发生的事件
        @Override
        public void keyReleased(KeyEvent e) {
            tank.minusDirection(e);
        }
        
    }
    
    //初始化窗口
    public void launchFrame() {
        //游戏初始化
        this.setTitle("#游戏:生存的代价   #作者:Lxy");
        this.setVisible(true);
        this.setSize(Constant.SCREEN_WIDTH,Constant.SCREEN_HEIGHT);
        this.setLocation(100,10);   
        //自动关闭
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        //启动重画窗口的线程
        new PaintThread().start(); 
        //启动对键盘的监听
        addKeyListener(new KeyMonitor()); 
        //初始化炮弹
        for(int i=0;i<shells.length;++i) {
            shells[i] = new Shell();
            double tmp_x = Math.random()*Constant.SCREEN_WIDTH;
            double tmp_y = Math.random()*Constant.SCREEN_HEIGHT;
            double tmp_speed = Math.random()*10+3;
            shells[i].setPosition(tmp_x, tmp_y);
            shells[i].setSpeed((int)tmp_speed);
        }
        //初始化速度资源
        for(int j=0;j<resources.length;++j) {
            resources[j] = new Resource();
            double tmp_x = Math.random()*Constant.SCREEN_WIDTH;
            double tmp_y = Math.random()*Constant.SCREEN_HEIGHT;
            double tmp_speed = Math.random()*10+5;
            resources[j].setPosition(tmp_x, tmp_y);
            resources[j].setSpeed((int)tmp_speed);
        }
        //初始化大小资源
        for(int k=0;k<bigs.length;++k) {
            bigs[k] = new Big();
            double tmp_x = Math.random()*Constant.SCREEN_WIDTH;
            double tmp_y = Math.random()*Constant.SCREEN_HEIGHT;
            double tmp_speed = Math.random()*10+5;
            bigs[k].setPosition(tmp_x, tmp_y);
            bigs[k].setSpeed((int)tmp_speed);
        }
    }
    
    
    
    public static void main(String[] args) {
        MyGameFrame f = new MyGameFrame();  
        f.launchFrame();
        
    }
    //双缓冲解决闪烁
    private Image offScreenImage = null;
    
    public void update(Graphics g) {
        if(offScreenImage == null) {
            offScreenImage = this.createImage(Constant.SCREEN_WIDTH,Constant.SCREEN_HEIGHT);    
        }
        Graphics gOff = offScreenImage.getGraphics();
        paint(gOff);
        g.drawImage(offScreenImage, 0, 0, null);
    }
    
}

图片侵删

初级黄金体验 其一

标签:缓冲   mon   dir   port   phi   github   ref   rap   apr   

原文地址:https://www.cnblogs.com/Martrix-revolution/p/11625421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!