| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3016 人关注过本帖
标题:请教:一只乌龟的运动
只看楼主 加入收藏
tblovecj
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2006-9-20
收藏
得分:0 
JPanel是面板,把东西入上面放,再把这个面板放在窗体上

2006-10-18 18:54
qihi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-10-11
收藏
得分:0 

这只乌龟画得真的很可爱。这两天边学边做把它改成能动的了。
用键盘的方向键控制。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;
}
}
}

2006-10-19 21:19
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
以下是引用yangte在2006-10-18 14:00:10的发言:
千里冰封,frame 是什么啊,
jpanel又是什么啊,,请解释一下,谢谢。。。。。。

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


可惜不是你,陪我到最后
2006-10-20 09:29
yangte
Rank: 1
等 级:新手上路
帖 子:163
专家分:0
注 册:2006-10-2
收藏
得分:0 
哈,谢谢纠正  

2006-10-20 10:33
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
收藏
得分:0 
以下是引用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是不是采用了这样的技术?查了一下双缓存技术,可是不是很理解,知道的能不能给讲解一下。

2006-10-20 12:21
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
收藏
得分:0 
还有,我要是想取得乌龟运动过程中的任意一个图片,该怎么取得这个对象啊?
2006-10-20 12:23
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 

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


♂ 死后定当长眠,生前何须久睡。♀
2006-10-20 14:00
qihi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-10-11
收藏
得分:0 
以下是引用ren829在2006-10-20 12:23:44的发言:
还有,我要是想取得乌龟运动过程中的任意一个图片,该怎么取得这个对象啊?

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

2006-10-21 07:14
qihi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-10-11
收藏
得分:0 
以下是引用ren829在2006-10-20 12:21:06的发言:

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

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

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


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

2006-10-21 07:19
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
收藏
得分:0 
以下是引用qihi在2006-10-21 7:19:00的发言:

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

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


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

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

2006-10-21 13:37
快速回复:请教:一只乌龟的运动
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032330 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved