package str.m;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.applet.*;
import javax.swing.*;
import java.util.*;
import java.util.List;
//-------------------马里奥游戏---主框架------------------------
public class Myframe extends JFrame implements ActionListener, KeyListener, Runnable
{
private Container c;
private JLabel flag;
private MenuBar bar;
private Menu game, about;
private MenuItem begin, end, explain;
/////////////////////////////////////
private Makings pic;
boolean b = false;
private Marioplay mario;
private Thread t;
//////////////////////////////////
//////////////////////////////////
public Myframe()
{
c = this.getContentPane();
c.setLayout(new BorderLayout());
flag = new JLabel();
c.setBackground(Color.BLACK);
c.add(flag);
bar = new MenuBar();
this.setMenuBar(bar);
game = new Menu("游戏");
about = new Menu("关于");
begin = new MenuItem("开始");
end = new MenuItem("退出");
explain = new MenuItem("说明");
bar.add(game);
bar.add(about);
game.add(begin);
game.addSeparator();
game.add(end);
about.add(explain);
begin.addActionListener(this);
end.addActionListener(this);
this.setTitle("超级马里奥");
this.setBounds(100, 50, 1000, 700);
this.setResizable(false);
this.addKeyListener(this);
pic = new Makings();//----初始化背景----
mario = new Marioplay(0,580);//----初始化马里奥主角----
t = new Thread(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
/////////////////////////////////////////////////////////////
public void update(Graphics gg)
{
paint(gg);
}
/////////////////////////////////////////////////////////////
public void paint(Graphics g)
{
super.paintComponents(g);//重写print方法,如果不传给父类,图片将被覆盖
BufferedImage image = new BufferedImage(1000,700,BufferedImage.TYPE_3BYTE_BGR);
Graphics g2=image.getGraphics();
if(b == true)
{
//-------------绘制背景-------
g2.drawImage(pic.getbackGround(), 0, 0, this);
//////////////绘制障碍物//////////////////////////////////
for(int i=0; i<18; i++)
{
g2.drawImage(pic.getBarrier().get(9),i*60,640,this);
}
g2.drawImage(this.mario.getMario(), mario.getX(), mario.getY(),this);
/////////////////////////////////////////////////
g2.dispose();
}
g.drawImage(image,0,0,this);
}
///////////////////////////////////////////////////////////
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Myframe m = new Myframe();
}
//////////////////////////////////
public void actionPerformed(ActionEvent e)
{
if(e.getSource().equals(begin))
{
System.out.println("ok");
b = true;
this.t.start();
}
}
///////////////////////////
@Override
//当点击键盘上的键时
public void keyPressed(KeyEvent e)
{
// TODO Auto-generated method stub
if(b == true)
{
if(39 == e.getKeyCode())
{
this.mario.goRight();
System.out.println("按下 右键");
}
if(37 == e.getKeyCode())
{
this.mario.goLeft();
System.out.println("按下 左键");
}
}
}
@Override
//当抬起键时
public void keyReleased(KeyEvent e)
{
// TODO Auto-generated method stub
if(b == true)
{
if(39 == e.getKeyCode())
{
this.mario.stopRight();
System.out.println("按下 右停");
}
if(37 == e.getKeyCode())
{
this.mario.stopLeft();
System.out.println("按下 左停");
}
}
}
@Override
//输入一些信息时
public void keyTyped(KeyEvent e)
{
// TODO Auto-generated method stub
}
@Override
public void run()
{
// TODO Auto-generated method stub
while(true)
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
this.repaint();
}
}
}
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.applet.*;
import javax.swing.*;
import java.util.*;
import java.util.List;
//-------------------马里奥游戏---主框架------------------------
public class Myframe extends JFrame implements ActionListener, KeyListener, Runnable
{
private Container c;
private JLabel flag;
private MenuBar bar;
private Menu game, about;
private MenuItem begin, end, explain;
/////////////////////////////////////
private Makings pic;
boolean b = false;
private Marioplay mario;
private Thread t;
//////////////////////////////////
//////////////////////////////////
public Myframe()
{
c = this.getContentPane();
c.setLayout(new BorderLayout());
flag = new JLabel();
c.setBackground(Color.BLACK);
c.add(flag);
bar = new MenuBar();
this.setMenuBar(bar);
game = new Menu("游戏");
about = new Menu("关于");
begin = new MenuItem("开始");
end = new MenuItem("退出");
explain = new MenuItem("说明");
bar.add(game);
bar.add(about);
game.add(begin);
game.addSeparator();
game.add(end);
about.add(explain);
begin.addActionListener(this);
end.addActionListener(this);
this.setTitle("超级马里奥");
this.setBounds(100, 50, 1000, 700);
this.setResizable(false);
this.addKeyListener(this);
pic = new Makings();//----初始化背景----
mario = new Marioplay(0,580);//----初始化马里奥主角----
t = new Thread(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
/////////////////////////////////////////////////////////////
public void update(Graphics gg)
{
paint(gg);
}
/////////////////////////////////////////////////////////////
public void paint(Graphics g)
{
super.paintComponents(g);//重写print方法,如果不传给父类,图片将被覆盖
BufferedImage image = new BufferedImage(1000,700,BufferedImage.TYPE_3BYTE_BGR);
Graphics g2=image.getGraphics();
if(b == true)
{
//-------------绘制背景-------
g2.drawImage(pic.getbackGround(), 0, 0, this);
//////////////绘制障碍物//////////////////////////////////
for(int i=0; i<18; i++)
{
g2.drawImage(pic.getBarrier().get(9),i*60,640,this);
}
g2.drawImage(this.mario.getMario(), mario.getX(), mario.getY(),this);
/////////////////////////////////////////////////
g2.dispose();
}
g.drawImage(image,0,0,this);
}
///////////////////////////////////////////////////////////
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Myframe m = new Myframe();
}
//////////////////////////////////
public void actionPerformed(ActionEvent e)
{
if(e.getSource().equals(begin))
{
System.out.println("ok");
b = true;
this.t.start();
}
}
///////////////////////////
@Override
//当点击键盘上的键时
public void keyPressed(KeyEvent e)
{
// TODO Auto-generated method stub
if(b == true)
{
if(39 == e.getKeyCode())
{
this.mario.goRight();
System.out.println("按下 右键");
}
if(37 == e.getKeyCode())
{
this.mario.goLeft();
System.out.println("按下 左键");
}
}
}
@Override
//当抬起键时
public void keyReleased(KeyEvent e)
{
// TODO Auto-generated method stub
if(b == true)
{
if(39 == e.getKeyCode())
{
this.mario.stopRight();
System.out.println("按下 右停");
}
if(37 == e.getKeyCode())
{
this.mario.stopLeft();
System.out.println("按下 左停");
}
}
}
@Override
//输入一些信息时
public void keyTyped(KeyEvent e)
{
// TODO Auto-generated method stub
}
@Override
public void run()
{
// TODO Auto-generated method stub
while(true)
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
this.repaint();
}
}
}
正确的做法是重载paintComponent()方法,你好像没有
需要刷新时调用repaint()
还有请用BufferedImage把你的背景对象缓存,放在paintComponent直接读取
会给刷新带来很大的问题!
AWTUtilities.setWindowOpaque(this, false); //关键点,设置窗体的透明,这种透明不会影响到内部组件,方便绘制背景。
然后再自己重写一下JPanel的 paintComponent(Graphics g)方法,用该方法绘制背景,最好不要用paint方法,因为该方法会覆盖内部组件,遮住内部组件很蛋疼的哟。将自己写的JPanel通过setContentPane方法加入到JFrame或JWindow的contentPane中,再在contentPane里添加自己的组件即可。楼主你就是因为用了paint方法,所以会出现闪烁的情况。
如果不想使用paintComponent(Graphics g),用逻辑的方式变通一下也是可以解决的。
http://blog.csdn.net/go12355/article/details/8264568
我改好了
不过怎么正确的做法是重载paintComponent()方法