当前位置: 代码迷 >> Java相关 >> 请教:一只乌龟的运动
  详细解决方案

请教:一只乌龟的运动

热度:342   发布时间:2006-10-18 18:54:27.0
JPanel是面板,把东西入上面放,再把这个面板放在窗体上
----------------解决方案--------------------------------------------------------

这只乌龟画得真的很可爱。这两天边学边做把它改成能动的了。
用键盘的方向键控制。ESC键退出。

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

class WuGui extends JFrame implements KeyListener
{
Container con=this.getContentPane();
MyPanel m=new MyPanel(true);
public WuGui()
{
this.setSize(Toolkit.getDefaultToolkit().getScreenSize());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setUndecorated(true);
this.setAlwaysOnTop(true);
con.setBackground(new Color(0,128,255));
m.setOpaque(false);
con.add(m);
this.addKeyListener(this);
this.setVisible(true);
}
public static void main(String args[])
{
new WuGui();
}

public void keyTyped(KeyEvent e) {
}

public void keyPressed(KeyEvent e) {
}

public void keyReleased(KeyEvent e) {
m.setKey(e.getKeyCode());
}
}

class MyPanel extends JPanel
{
int x=50;
int y=50;
int key=40;
private AffineTransform t= new AffineTransform();

public MyPanel(boolean buffer)
{
super(buffer);
setRotate(180);
}

public void setKey(int key)
{
this.key=key;
}

public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2=(Graphics2D)g;
g2.transform(t);
move();
drawWuGui(g2);
back();
try
{
Thread.currentThread().sleep(20);
}
catch(Exception e)
{
e.printStackTrace();
}

repaint();
}

public void drawWuGui(Graphics2D g2)
{
g2.setColor(Color.GREEN);
g2.fill(new Ellipse2D.Double(x+30,y+50,140,200));//body
g2.fill(new Ellipse2D.Double(x+70,y,60,100));//head
g2.fill(new Ellipse2D.Double(x+10,y+70,70,30));//leftUp
g2.fill(new Ellipse2D.Double(x+10,y+200,70,30));//leftDown
g2.fill(new Ellipse2D.Double(x+120,y+70,70,30)); //rightUp
g2.fill(new Ellipse2D.Double(x+120,y+200,70,30));//rightDown
g2.setColor(Color.BLACK);
g2.fill(new Ellipse2D.Double(x+70,y+20,10,10));//leftEye
g2.fill(new Ellipse2D.Double(x+120,y+20,10,10));//rightEye
}
public void setRotate(int jiao)
{
t.setToRotation(Math.toRadians(jiao),x+100,y+150);
}

public void move()
{
if(key==37)
{
setRotate(270);
x-=10;
}
if(key==38)
{
setRotate(360);
y-=10;
}
if(key==39)
{
setRotate(90);
x+=10;
}
if(key==40)
{
setRotate(180);
y+=10;
}
if(key==KeyEvent.VK_ESCAPE)
{
System.exit(0);
}
}

private void back()
{
if(x<=0 && key == 37)
{
key = 39;
}
if(x>=(this.getWidth()-240) && key == 39)
{
key = 37;
}
if(y<=0 && key == 38)
{
key = 40;
}
if(y>=(this.getHeight()-240) && key == 40)
{
key = 38;
}
}
}


----------------解决方案--------------------------------------------------------
以下是引用yangte在2006-10-18 14:00:10的发言:
千里冰封,frame 是什么啊,
jpanel又是什么啊,,请解释一下,谢谢。。。。。。

这些都是构造用户界面时候用的
你打错了,不是frame, Frame和JFrame,JPanel
在JAVA中大小写是不能错的


----------------解决方案--------------------------------------------------------
哈,谢谢纠正  
----------------解决方案--------------------------------------------------------
以下是引用qihi在2006-10-19 21:19:34的发言:

这只乌龟画得真的很可爱。这两天边学边做把它改成能动的了。
用键盘的方向键控制。ESC键退出。

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

class WuGui extends JFrame implements KeyListener
{
Container con=this.getContentPane();
MyPanel m=new MyPanel(true);
public WuGui()
{
this.setSize(Toolkit.getDefaultToolkit().getScreenSize());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setUndecorated(true);
this.setAlwaysOnTop(true);
con.setBackground(new Color(0,128,255));
m.setOpaque(false);
con.add(m);
this.addKeyListener(this);
this.setVisible(true);
}
public static void main(String args[])
{
new WuGui();
}

public void keyTyped(KeyEvent e) {
}

public void keyPressed(KeyEvent e) {
}

public void keyReleased(KeyEvent e) {
m.setKey(e.getKeyCode());
}
}

class MyPanel extends JPanel
{
int x=50;
int y=50;
int key=40;
private AffineTransform t= new AffineTransform();

public MyPanel(boolean buffer)
{
super(buffer);
setRotate(180);
}

public void setKey(int key)
{
this.key=key;
}

public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2=(Graphics2D)g;
g2.transform(t);
move();
drawWuGui(g2);
back();
try
{
Thread.currentThread().sleep(20);
}
catch(Exception e)
{
e.printStackTrace();
}

repaint();
}

public void drawWuGui(Graphics2D g2)
{
g2.setColor(Color.GREEN);
g2.fill(new Ellipse2D.Double(x+30,y+50,140,200));//body
g2.fill(new Ellipse2D.Double(x+70,y,60,100));//head
g2.fill(new Ellipse2D.Double(x+10,y+70,70,30));//leftUp
g2.fill(new Ellipse2D.Double(x+10,y+200,70,30));//leftDown
g2.fill(new Ellipse2D.Double(x+120,y+70,70,30)); //rightUp
g2.fill(new Ellipse2D.Double(x+120,y+200,70,30));//rightDown
g2.setColor(Color.BLACK);
g2.fill(new Ellipse2D.Double(x+70,y+20,10,10));//leftEye
g2.fill(new Ellipse2D.Double(x+120,y+20,10,10));//rightEye
}
public void setRotate(int jiao)
{
t.setToRotation(Math.toRadians(jiao),x+100,y+150);
}

public void move()
{
if(key==37)
{
setRotate(270);
x-=10;
}
if(key==38)
{
setRotate(360);
y-=10;
}
if(key==39)
{
setRotate(90);
x+=10;
}
if(key==40)
{
setRotate(180);
y+=10;
}
if(key==KeyEvent.VK_ESCAPE)
{
System.exit(0);
}
}

private void back()
{
if(x<=0 && key == 37)
{
key = 39;
}
if(x>=(this.getWidth()-240) && key == 39)
{
key = 37;
}
if(y<=0 && key == 38)
{
key = 40;
}
if(y>=(this.getHeight()-240) && key == 40)
{
key = 38;
}
}
}

这个乌龟变成自己跑的了, 不过很好的解决了闪屏的问题。我查了一下,解决这个有两个方法,一:就是有大背景的图片不要刷屏直接覆盖,但是这样的话,我乌龟的范围还是闪的。二:就是采用双缓存技术,Qihi是不是采用了这样的技术?查了一下双缓存技术,可是不是很理解,知道的能不能给讲解一下。


----------------解决方案--------------------------------------------------------
还有,我要是想取得乌龟运动过程中的任意一个图片,该怎么取得这个对象啊?
----------------解决方案--------------------------------------------------------

你真牛!乌龟都画的这么逗,呵呵,我太喜欢这个乌龟了,你能帮我画一个么?


----------------解决方案--------------------------------------------------------
以下是引用ren829在2006-10-20 12:23:44的发言:
还有,我要是想取得乌龟运动过程中的任意一个图片,该怎么取得这个对象啊?

不太明白你的意思。
如果是截图的话,除了ESC和方向键以外随便哪个键都可以让乌龟停下来。再按方向键它又不停的跑。


----------------解决方案--------------------------------------------------------
以下是引用ren829在2006-10-20 12:21:06的发言:

这个乌龟变成自己跑的了, 不过很好的解决了闪屏的问题。我查了一下,解决这个有两个方法,一:就是有大背景的图片不要刷屏直接覆盖,但是这样的话,我乌龟的范围还是闪的。二:就是采用双缓存技术,Qihi是不是采用了这样的技术?查了一下双缓存技术,可是不是很理解,知道的能不能给讲解一下。

JPanel
public JPanel(boolean isDoubleBuffered)创建具有 FlowLayout 和指定缓冲策略的新 JPanel。如果 isDoubleBuffered 为 true,则 JPanel 将使用双缓冲。

参数:
isDoubleBuffered - 一个 boolean 值,为 true 表示双缓冲,使用更多内存空间实现快速、无闪烁的更新


这个嘛。用是用了,不过没看出使用前后的区别。


----------------解决方案--------------------------------------------------------
以下是引用qihi在2006-10-21 7:19:00的发言:

JPanel
public JPanel(boolean isDoubleBuffered)创建具有 FlowLayout 和指定缓冲策略的新 JPanel。如果 isDoubleBuffered 为 true,则 JPanel 将使用双缓冲。

参数:
isDoubleBuffered - 一个 boolean 值,为 true 表示双缓冲,使用更多内存空间实现快速、无闪烁的更新


这个嘛。用是用了,不过没看出使用前后的区别。

那是不是Swing 包的图象处理已经是双缓冲的呢?在awt包的图象中用双缓冲是很有用的。
----------------解决方案--------------------------------------------------------

  相关解决方案