坦克大战第一节——画出自己的坦克(新手篇)
程序员文章站
2022-03-18 15:47:45
刚刚开始学习Java,对Java不是很熟悉,但是自己的兴趣挺喜欢Java。现在自己在自学Java做一个小游戏,坦克大战。 自己现在完成了画出自己的坦克和坦克的移动方向。希望各位大神指导一下我这个刚刚学Java的新手小白。 我会每完成一个阶段,就更新一下博客,跟进一下自己的学习进度。 在做这个坦克大战 ......
刚刚开始学习java,对java不是很熟悉,但是自己的兴趣挺喜欢java。现在自己在自学java做一个小游戏,坦克大战。
自己现在完成了画出自己的坦克和坦克的移动方向。希望各位大神指导一下我这个刚刚学java的新手小白。
我会每完成一个阶段,就更新一下博客,跟进一下自己的学习进度。
在做这个坦克大战的时候,不知道从哪里开始做起,再来自己就觉得先画出自己的坦克吧。
下面是创建坦克类(方便以后能创建更加多的坦克),再创建自己的坦克继承坦克类。
package tankgames; import java.awt.*; //创建坦克类 public class tank { int x,y,w,h; int speed; int direct; color c1,c2,c3; public tank(){ x=230; y=300; w=5; h=60; speed=10; direct=0; } public tank(int x, int y, int w, int h, int speed, int direct) { super(); this.x = x; this.y = y; this.w = w; this.h = h; this.speed = speed; this.direct = direct; } } //创建我的坦克子类 class mytank extends tank{ //创建颜色对象,并设置颜色 public mytank(){ this.c1 = new color(128,128,128); this.c2 = new color(0,255,0); this.c3 = new color(0,0,255); } public mytank(int x, int y, int w, int h, int speed, int direct) { super(x, y, w, h, speed, direct); this.c1 = new color(128,128,128); this.c2 = new color(0,255,0); this.c3 = new color(0,0,255); } }
创建完自己的坦克,要写个主函数来画出自己的坦克,以下是画出自己的坦克:
package tankgames; import java.awt.*; import java.awt.event.keyevent; import java.awt.event.keylistener; import javax.swing.*; public class tankgame extends jframe{ private static final long serialversionuid = 1l; mypanel mp; public static void main(string[] args) { new tankgame().setvisible(true); } public tankgame(){ this.settitle("坦克大战"); this.setdefaultcloseoperation(jframe.exit_on_close); this.setresizable(false); this.setbounds(100, 100, 600, 500); //创建我的面板对象,并添加到我的窗体里面 mp = new mypanel(); this.getcontentpane().add(mp); //注册键盘事件监听 this.addkeylistener(mp); } } //创建我的面板子类 class mypanel extends jpanel implements keylistener{ mytank mytank; private static final long serialversionuid = 1l; public mypanel(){ this.setlayout(null); mytank = new mytank(); } //面板容器的设置和组件在面板容器里显示 public void paint(graphics g){ super.paint(g); g.setcolor(new color(255,255,221)); g.fill3drect(0, 0, 500, 400, false); drawtank(mytank,g); } //画坦克 public void drawtank(tank t,graphics g){ int x = t.x, y = t.y, w = t.w, h = t.h; //画出向上的坦克 if(t.direct == 0){ graphics2d g2d = (graphics2d)g; g.setcolor(t.c1); g.fill3drect(x, y, w, h, false); g.fill3drect(x+7*w, y, w, h, false); g.setcolor(t.c2); g.fill3drect(x+w, y+2*w, 6*w, 8*w, false); g.filloval(x+2*w, y+4*w, 4*w, 4*w); g2d.setcolor(t.c3); g2d.setstroke(new basicstroke(5.0f)); g2d.drawline(x+4*w, y, x+4*w, y+6*w); } //画出向下的坦克 else if(t.direct == 2){ graphics2d g2d = (graphics2d)g; g.setcolor(t.c1); g.fill3drect(x, y, w, h, false); g.fill3drect(x+7*w, y, w, h, false); g.setcolor(t.c2); g.fill3drect(x+w, y+2*w, 6*w, 8*w, false); g.filloval(x+2*w, y+4*w, 4*w, 4*w); g2d.setcolor(t.c3); g2d.setstroke(new basicstroke(5.0f)); g2d.drawline(x+4*w, y+6*w, x+4*w, y+12*w); } //画出向左的坦克 else if(t.direct == 3){ graphics2d g2d = (graphics2d)g; g.setcolor(t.c1); g.fill3drect(x, y, h, w, false); g.fill3drect(x, y+7*w, h, w, false); g.setcolor(t.c2); g.fill3drect(x+2*w, y+w, 8*w, 6*w, false); g.filloval(x+4*w, y+2*w, 4*w, 4*w); g2d.setcolor(t.c3); g2d.setstroke(new basicstroke(5.0f)); g2d.drawline(x, y+4*w, x+6*w, y+4*w); } //画出向右的坦克 else if(t.direct ==1){ graphics2d g2d = (graphics2d)g; g.setcolor(t.c1); g.fill3drect(x, y, h, w, false); g.fill3drect(x, y+7*w, h, w, false); g.setcolor(t.c2); g.fill3drect(x+2*w, y+w, 8*w, 6*w, false); g.filloval(x+4*w, y+2*w, 4*w, 4*w); g2d.setcolor(t.c3); g2d.setstroke(new basicstroke(5.0f)); g2d.drawline(x+6*w, y+4*w, x+12*w, y+4*w); } } @override public void keytyped(keyevent e) { } //我的坦克移动 @override public void keypressed(keyevent e) { //向左移动 if(e.getkeycode() == keyevent.vk_left || e.getkeycode() == keyevent.vk_a){ mytank.x -= mytank.speed; mytank.direct = 3; } //向右移动 else if(e.getkeycode() == keyevent.vk_right || e.getkeycode() == keyevent.vk_d){ mytank.x += mytank.speed; mytank.direct = 1; } //向上移动 else if(e.getkeycode() == keyevent.vk_up || e.getkeycode() == keyevent.vk_w){ mytank.y -= mytank.speed; mytank.direct =0; } //向下移动 else if(e.getkeycode() == keyevent.vk_down || e.getkeycode() == keyevent.vk_s){ mytank.y += mytank.speed; mytank.direct = 2; } //关闭游戏 else if(e.getkeycode() == keyevent.vk_escape){ system.exit(0); } //刷新图形 this.repaint(); } @override public void keyreleased(keyevent e) { } }
我画自己的坦克只是计算好位置,画出图形。
再来自己到最后,有一个疑惑,自己不懂。
坦克每次改变方向移动时,能不能有更加方便的方法来封装上面画图形时自己手动改变位置?若画其他坦克,是不是还要自己手动改变坦克的位置?这里自己觉得处理不是很好,现在还在想怎么能更加完美,更加方便。
上一篇: php Laravel5.5 表单验证常用的验证规则,以及示例
下一篇: Swoole 创建服务