java如何实现乌龟爬行_请教:一只乌龟的运动

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包的图象中用双缓冲是很有用的。

----------------解决方案--------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值