TankWar小型游戏开发全过程(尚学堂视频免费提供)
2007-05-10 18:11
393 查看
TankWar0.1
版本功能:创建一个窗口
import java.awt.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
setVisible(true);//
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
}
TankWar0.2
版本功能点
1 添加关闭窗口的事件处理
2 不予许窗口的大小改动
我们要创建一个监听类,有三种方式一个是写一个同级别的类
2 写一个类部类
3 写一个匿名类 我们采用第三种方法
思考点:匿名类:
使用场合:
类短小,不涉及将来的类扩展,不涉及重要的业务逻辑
import java.awt.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
setVisible(true);//
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
}
掌握:通过Eclipse重写父类的方法
子类名->soure->override
TankWar0.3
版本功能点
1 画出坦克的实心圆
2 掌握paint方法
import java.awt.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(50,50,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
}
TankWar0.4
版本功能点
1 让坦克运动起来
实现步骤:
1.将位置改变为变量
2 启动线程不断重画
3 每次重画改变Tank位置
用线程画的好处
1 线程重画更均匀
2 按键重画不能解决子弹飞行的问题
import java.awt.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
int x=50,y=50;
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
y+=5;
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
TankWar0.41
版本功能点
1 使用双缓冲消除闪烁现象
原因:
1 刷新频率太快,paint方法还没有完成
2 逐条显示
解决办法
将所有东西画在虚拟图片上,一次性显示出来
实现步骤:
import java.awt.*;
import java.awt.event.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
int x=50,y=50;
Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
y+=5;
}
public void update(Graphics g){
if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
offScreenImage = this.createImage(800,600);
}
Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,800,600);
gOffScreen.setColor(c);
paint(gOffScreen);//绘制背面图片
g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
TankWar0.5
版本功能点
代码重构:
将以后可能需要的多处改变的量为常量
定义常量的好处
import java.awt.*;
import java.awt.event.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public static final int GAME_WIDTH=800;
public static final int GAME_HEIGHT=600;
int x=50,y=50;
Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
y+=5;
}
public void update(Graphics g){
if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);//绘制背面图片
g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(GAME_WIDTH,GAME_HEIGHT);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
TankWar0.6
版本功能点:为坦克加上键盘监听
有两个方法,一个就是extends KeyAdapter 另外一个 implements KeyLister接口
import java.awt.*;
import java.awt.event.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public static final int GAME_WIDTH=800;
public static final int GAME_HEIGHT=600;
int x=50,y=50;
Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
}
public void update(Graphics g){
if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);//绘制背面图片
g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(GAME_WIDTH,GAME_HEIGHT);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
this.addKeyListener(new KeyMonitor);
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public class KeyMonitor extends KeyAdapter{//键盘监听类
public void KeyPressed(KeyEvent e){//键盘事件
int key=e.getKeyCode();//获取键盘的虚拟键
switch(key){//对虚拟键分析是否
case KeyEvent.VK_LEFT:
x-=5;
break;
case KeyEvent.VK_UP:
y-=5;
break;
case KeyEvent.VK_RIGHT:
x+=5;
break;
case KeyEvent.VK_DOWN:
y+=5;
break;
}
}
}
}
TankWar0.7
版本功能点:面向对象的真正应用,Tank类的书写
public class Tank{
int x,y;
public Tank(int x,int y){
this.x=x;
this.y=y;
}
//让坦克自己画自己
public void draw((Graphics g){
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
}
//让坦克自己动起来
public void keyPressed(KeyEvent e){
int key=e.getKeyCode();//获取键盘的虚拟键
switch(key){//对虚拟键分析是否
case KeyEvent.VK_LEFT:
x-=5;
break;
case KeyEvent.VK_UP:
y-=5;
break;
case KeyEvent.VK_RIGHT:
x+=5;
break;
case KeyEvent.VK_DOWN:
y+=5;
break;
}
}
}
import java.awt.*;
import java.awt.event.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public static final int GAME_WIDTH=800;
public static final int GAME_HEIGHT=600;
Tank mytank = new Tank(50,30);
Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去
public void paint(Graphics g){//绘图类
//让坦克自己画自己
mytank.draw(g);
}
public void update(Graphics g){
if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);//绘制背面图片
g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(GAME_WIDTH,GAME_HEIGHT);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
this.addKeyListener(new KeyMonitor);
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public class KeyMonitor extends KeyAdapter{//键盘监听类
public void KeyPressed(KeyEvent e){//键盘事件
//让坦克自己动起来
mytank.keyPressed(e);
}
}
}
版本功能:创建一个窗口
import java.awt.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
setVisible(true);//
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
}
TankWar0.2
版本功能点
1 添加关闭窗口的事件处理
2 不予许窗口的大小改动
我们要创建一个监听类,有三种方式一个是写一个同级别的类
2 写一个类部类
3 写一个匿名类 我们采用第三种方法
思考点:匿名类:
使用场合:
类短小,不涉及将来的类扩展,不涉及重要的业务逻辑
import java.awt.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
setVisible(true);//
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
}
掌握:通过Eclipse重写父类的方法
子类名->soure->override
TankWar0.3
版本功能点
1 画出坦克的实心圆
2 掌握paint方法
import java.awt.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(50,50,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
}
TankWar0.4
版本功能点
1 让坦克运动起来
实现步骤:
1.将位置改变为变量
2 启动线程不断重画
3 每次重画改变Tank位置
用线程画的好处
1 线程重画更均匀
2 按键重画不能解决子弹飞行的问题
import java.awt.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
int x=50,y=50;
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
y+=5;
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
TankWar0.41
版本功能点
1 使用双缓冲消除闪烁现象
原因:
1 刷新频率太快,paint方法还没有完成
2 逐条显示
解决办法
将所有东西画在虚拟图片上,一次性显示出来
实现步骤:
import java.awt.*;
import java.awt.event.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
int x=50,y=50;
Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
y+=5;
}
public void update(Graphics g){
if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
offScreenImage = this.createImage(800,600);
}
Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,800,600);
gOffScreen.setColor(c);
paint(gOffScreen);//绘制背面图片
g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(800,600);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
TankWar0.5
版本功能点
代码重构:
将以后可能需要的多处改变的量为常量
定义常量的好处
import java.awt.*;
import java.awt.event.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public static final int GAME_WIDTH=800;
public static final int GAME_HEIGHT=600;
int x=50,y=50;
Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
y+=5;
}
public void update(Graphics g){
if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);//绘制背面图片
g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(GAME_WIDTH,GAME_HEIGHT);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
TankWar0.6
版本功能点:为坦克加上键盘监听
有两个方法,一个就是extends KeyAdapter 另外一个 implements KeyLister接口
import java.awt.*;
import java.awt.event.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public static final int GAME_WIDTH=800;
public static final int GAME_HEIGHT=600;
int x=50,y=50;
Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去
public void paint(Graphics g){//绘图类
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
}
public void update(Graphics g){
if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);//绘制背面图片
g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(GAME_WIDTH,GAME_HEIGHT);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
this.addKeyListener(new KeyMonitor);
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public class KeyMonitor extends KeyAdapter{//键盘监听类
public void KeyPressed(KeyEvent e){//键盘事件
int key=e.getKeyCode();//获取键盘的虚拟键
switch(key){//对虚拟键分析是否
case KeyEvent.VK_LEFT:
x-=5;
break;
case KeyEvent.VK_UP:
y-=5;
break;
case KeyEvent.VK_RIGHT:
x+=5;
break;
case KeyEvent.VK_DOWN:
y+=5;
break;
}
}
}
}
TankWar0.7
版本功能点:面向对象的真正应用,Tank类的书写
public class Tank{
int x,y;
public Tank(int x,int y){
this.x=x;
this.y=y;
}
//让坦克自己画自己
public void draw((Graphics g){
Color c=g.getColor();//获取当前前景色
g.setColor(Color.RED);//设置颜色为红色
g.filloval(x,y,30,30);//画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.getColor(c);//还原前景色
}
//让坦克自己动起来
public void keyPressed(KeyEvent e){
int key=e.getKeyCode();//获取键盘的虚拟键
switch(key){//对虚拟键分析是否
case KeyEvent.VK_LEFT:
x-=5;
break;
case KeyEvent.VK_UP:
y-=5;
break;
case KeyEvent.VK_RIGHT:
x+=5;
break;
case KeyEvent.VK_DOWN:
y+=5;
break;
}
}
}
import java.awt.*;
import java.awt.event.*;
public class TankClient extends Frame {
//实现创建一个窗口 ,位置据左上角,400,300 高度 800,600
public static final int GAME_WIDTH=800;
public static final int GAME_HEIGHT=600;
Tank mytank = new Tank(50,30);
Image offScreenImage = null;//定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去
public void paint(Graphics g){//绘图类
//让坦克自己画自己
mytank.draw(g);
}
public void update(Graphics g){
if(offScreenImage == null){//如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();//创建一个画笔gOffScreen
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);//绘制背面图片
g.drawImage(offScreenImage,0,0,null);//将创建的图片一次性话到前面来就要使用update参数内g这只画笔
}
public void lauchFrame(){
this.setLocation(400,300);//设置位置
this.setSize(GAME_WIDTH,GAME_HEIGHT);//设置高度
this.setTitle("TankWar");//设置标题
this.addWindowListener(new windowAdapter() {//添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);//
this.addKeyListener(new KeyMonitor);
new Thread(new PaintThread()).start();//继承runable启动线程调用start方法
}
public static void main(String[] args) {
TankClient tc=new TankClient();
tc.lauchFrame();
}
public class PaintThread implements Runable{//内部类启动线程机制
public void run(){
while(true)
repaint();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public class KeyMonitor extends KeyAdapter{//键盘监听类
public void KeyPressed(KeyEvent e){//键盘事件
//让坦克自己动起来
mytank.keyPressed(e);
}
}
}
相关文章推荐
- 著名游戏开发引擎Unity开始免费提供发布到安卓和iOS功能
- Android Java开发实例项目+游戏视频教程免费下载咯。。
- 和微软合作的garagegames公司推出基于XNA的游戏引擎TorqueX,支持快速开发(近期引擎免费提供使用)
- [XNA研究强烈推荐]XNA开发雷电类游戏,源代码提供下载学习(提供代码和视频演示)
- [置顶]▁▂▃ 【2011-9-22日前Himi所有博文锦集-CHM文档】+【Android游戏开发系列源码】+【免费提供打包下载】▃▂▁
- 嵌入式开发 迅为iTOP-4418/6818开发板 免费提供全部视频教程和资料
- [置顶]▁▂▃ 【2011-9-22日前Himi所有博文锦集-CHM文档】+【Android游戏开发系列源码】+【免费提供打包下载】▃▂▁
- Android Java开发实例项目+游戏视频教程免费下载咯。。
- [导入]视频游戏开发系列课程(1):游戏开发过程预览
- Java开发微信机器人视频教程【免费观看】
- 小型游戏《笑傲江湖之精忠报国》全过程_04
- 著名游戏引擎Unity的移动基本版从今天起免费提供
- C++ DirectX 游戏开发初级视频教程 05 资源下载链接
- [Cocos2d游戏开发之四] 独自收集Cocos2d提供的字体!共57种
- LINUX的游戏开发免费工具
- 免费游戏开发引擎,各种游戏开发引擎
- 软件代码生成工具--软工厂V2.0版本免费使用地址+教学视频,快速完成开发任务。
- workFlow的组件开发-01 处理环节的处理过程和功能提供
- 如何有效管理游戏开发过程
- 游戏开发资源免费下载