1. 首页 > 数据分析

vs窗体设计移动小球-vs窗体趣味小程序

VB编写小游戏的全过程谁告诉我?

vs窗体设计移动小球-vs窗体趣味小程序

开始学vb时,并不知道vb可以做出动画,后来知道通过自编的子函数delay(c的库函数中的该函数)和cls可以做出许多动画,但有一个缺点就是太耗内存,就我个人认为构思应该比编程重要,因为一旦有了一个很好的构思剩下的问题都是技术问题,而我就是喜欢发现新的问题然后再想方设法解决它,通过发现问题和解决问题我可以学到许多很有用的知识和技巧。好了,现在有了一个好的构思就开始进入程序的编制。

第一步,要做成这个游戏的话必须能使小球有一个判断性的运动,然而如何处理小球的运动呢,很显然delay&cls的方法不再适用,因为整个程序运行时不停的清屏效果将很差,所以我想到了用shape控件来替代用circle命令画的小球,接着要使小球运动起来,这个问题很简单,因为 shape控件有left和top的属性,可以通过对这两个属性的控制可以很轻松的解决小球运动问题。

第二步,将对小球进行角度控制,角度可以通过shape的属性left和top来反映,通过timer控件使小球的left和top值不断加上一个值或减去一个值,小球的left和top同时改变之后就可以对小球的角度进行控制。到这里已经可以使小球运动起来,接下来的问题就是使小球能进行判断性运动。

第三步,可以这样对小球进行判断性控制,当小球的left大于窗体的scaleleft时小球的left改变成减去一个值,以此类推,小球的高度也可以进行类似的控制,现在已经很方便的对小球进行判断性运动,到这一步程序已经算是完成了一半。

第四步,既然小球可以自由的运动了,那就可以产生这样一个想法,当小球的top和left的砖块的top和left值接近到一定的范围的条件成立时使砖块的visible为false,然后小球的top和left加上接触前相应相反的值,就可以使砖块消失同时小球改变运动轨迹,这一步的实现需要解决很多技术性问题,可以在form的load事件里定义两个变量Dwd和Dhd以及两个Boolean量为Dw和Dh,通过Dwd和Dhd来控制小球向左和向上运动,当小球和窗体的边界或和砖块的的边界接触时使Dw和Dh的值进行相应的变化,通过对该两个值的控制可以使小球进行合乎反弹角度的运动,现在程序已经初步成型。

第五步,要做成这样的一个游戏,必须有一个良好的用户界面,为了使小球能接受用户的控制,我在窗体的下边界放置了一个命令按钮,该命令按钮可以通过方向键来控制,然后再加上一些判断语句使得小球command接触时产生相应的运动,这样一个用户界面就解决了。

第六步,现在只剩下程序的最后一步,就是生成砖块的排列,砖块可以用命令按钮来替代,然后用循环语句将设置好的command控件数组在程序运行时加载进来,好了,现在已经一切完成.

求java题源代码,最好有注释,

import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

import java.util.*;

import javax.swing.*;

/**

* 多线程,小球演示. 打开Windows任务管理器,可看到线程变化。 可搜索到,run()方法/.start()

*

* du: 程序技巧体会: 所谓产生一个小球,即是 new 其类对象,其属性携带画小球的 坐标、颜色、所在容器 等参数。

*

* 一个类,属性用来作为参数容器用, 方法....完成功能。

* */

// 运行类

public class BouncePress {

//

public static void main(String[] args) {

JFrame frame = new BouncePressFrame(); // 生成窗口。执行构造。-----业务逻辑。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // similar to

// window

// listener

frame.show();

}

}

class BouncePressFrame extends JFrame {

private BallPressCanvas canvas;

public BouncePressFrame() {

setSize(600, 500); // 窗口大小

setTitle("Bounce Ball");

Container contentPane = getContentPane(); // Swing的窗口不能直接放入东西,只能在其上的ContentPane上放。

canvas = new BallPressCanvas(); // 生成一个新面板。-----canvas

contentPane.add(canvas, BorderLayout.CENTER); // 窗口中心 加入该面板。

JPanel buttonPanel = new JPanel(); // 再生成一个新面板。----buttonPanel

// 调用本类方法addButton。

addButton(buttonPanel, "Start", // 生成一个按钮"Start"---加入面板buttonPanel

new ActionListener() { // |------>按钮绑上 action。

public void actionPerformed(ActionEvent evt) { // | 小球容器对象的

addBall(Thread.NORM_PRIORITY - 4, Color.black); // 事件处理时,执行---addBall()方法。--->产生小球(参数对象)--->加入List中--->开始画球。

}

}); // 按一次,addBall()一次--->产生一个新小球--->加入List中--->开始画此新小球。

// --->画球线程BallPressThread的run()--->小球(参数对象).move()--->每次画时,先移动,再判断,再画。

// --->BallPressCanvas类的canvas对象.paint()--->自动调BallPressCanvas类的paintComponent(Graphics

// g)方法。

// --->该方法,从List中循环取出所有小球,第i个球,--->调该小球BallPress类

// .draw()方法--->调Graphics2D方法画出小球。--使用color/

addButton(buttonPanel, "Express", new ActionListener() {

public void actionPerformed(ActionEvent evt) {

addBall(Thread.NORM_PRIORITY + 2, Color.red);

}

});

addButton(buttonPanel, "Close", new ActionListener() {

public void actionPerformed(ActionEvent evt) {

System.exit(0);

}

});

contentPane.add(buttonPanel, BorderLayout.SOUTH);

}

public void addButton(Container c, String title, ActionListener listener) {

JButton button = new JButton(title); // 生成一个按钮。

c.add(button); // 加入容器中。

button.addActionListener(listener); // 按钮绑上 action。

}

/** 主要业务方法。 */

public void addBall(int priority, Color color) {

// 生成 小球(参数对象)

BallPress b = new BallPress(canvas, color); // 生成BallPress对象,携带、初始化

// 画Ball形小球,所需参数:所在容器组件,所需color--black/red.

// 小球加入 List中。

canvas.add(b); // 面板canvas 的ArrayList中 加入BallPress对象。

BallPressThread thread = new BallPressThread(b); // 生成画小球的线程类BallPressThread对象。传入BallPress对象(携带了画球所需

// 容器、color参数)。

thread.setPriority(priority);

thread.start(); // call run(), ball start to move

// 画球线程开始。--->BallPressThread的run()--->小球(参数对象).move()--->先移动,再画。canvas.paint--->BallPressCanvas类的

}

}

// 画球的线程类。

class BallPressThread extends Thread {

private BallPress b;

public BallPressThread(BallPress aBall) {

b = aBall;

}

// 画球开始。

public void run() {

try {

for (int i = 1; i <= 1000; i++) { // 画1000次。

b.move(); // 每次画时,先移动,再判断,再画。

sleep(5); // 所以移动比Bounce.java的球慢。

}

} catch (InterruptedException e) {

}

}

}

// swing面板类.

// 作用1) 本类面板对象.paint()方法---->自动绘制面板,且自动调paintComponent(Graphics

// g)方法,--->重写该方法,绘制面板(及其上组件)。

// 作用2) 该类对象 属性ArrayList balls---兼作小球(参数对象)的容器。

class BallPressCanvas extends JPanel {

private ArrayList balls = new ArrayList();

public void add(BallPress b) {

balls.add(b); // 向ArrayList中添加球。当按下按钮,添加多个球时,都保存在这个List中。

}

// 重写了 javax.swing.JComponent的 paintComponent()方法。

// paint()方法自动调用该方法。

public void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

for (int i = 0; i < balls.size(); i++) { // 循环

BallPress b = (BallPress) balls.get(i); // 从List中取出第i个球,

b.draw(g2); // 画此球。

}

}

}

/**

* 画出球。

*

* 在 canvas上画出,color色的小球图形。

*

* 属性,可用于携带画小球所需参数。

*

*

*

* @author ducongan

*

*/

class BallPress {

private Component canvas;

private Color color;

private int x = 0;

private int y = 0;

private int dx = 2;

private int dy = 2;

// 构造 初始化 容器 颜色 参数。

public BallPress(Component c, Color aColor) {

canvas = c;

color = aColor;

}

// 制定位置,画出小球。

public void draw(Graphics2D g2) {

g2.setColor(color);

g2.fill(new Ellipse2D.Double(x, y, 15, 15)); // ellipse:椭圆形

}

// 移动小球。

// 每次画时,先移动,再判断,再画。

// 该方法每次执行,画小球的起点坐标 (x,y), 每次各自+2, 即斜向右下运动。

public void move() {

x += dx; // x=x+dx; 画小球的起点坐标 (x,y), 每次各自+2, 即斜向右下运动。

y += dy; // y=y+dy;

if (x < 0) { // 小球已到左边框。保证,从左边框开始画。

x = 0;

dx = -dx; // 小球横坐标变化值取反。开始反向运动。

}

if (x + 15 >= canvas.getWidth()) { // 小球右边已经到画板右边。

x = canvas.getWidth() - 15;

dx = -dx; // 开始反向运动。

}

if (y < 0) { // 保证,从顶框开始画。

y = 0;

dy = -dy;

}

if (y + 15 >= canvas.getHeight()) { // 小球已到画板顶。

y = canvas.getHeight() - 15;

dy = -dy;

}

canvas.paint(canvas.getGraphics()); // 画出面板对象canvas----(及其上所有组件)

// //.paint()方法,自动调用

}

}

/*import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

import java.util.*;

import javax.swing.*;

*//**

* 单线程,小球演示 搜索不到,run()方法/.start()

*//*

public class Bounce {

public static void main(String[] args) {

JFrame frame = new BounceFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // similar to

// window

// listener

frame.show();

}

}

不懂的再问啊。。。

java小球碰撞窗体边缘来回反弹的代码

import?java.awt.Color;

import?java.awt.Graphics;

import?java.awt.event.WindowAdapter;

import?java.awt.event.WindowEvent;

import?java.util.Random;

import?javax.swing.JFrame;

import?javax.swing.JPanel;

public?class?RunningBallDemo?extends?JFrame?{

public?static?void?main(String?args[])?{

new?RunningBallDemo();

}

public?RunningBallDemo()?{

Ball?ballPanel?=?new?Ball(5,?5);

getContentPane().add(ballPanel);

setBackground(Color.BLACK);

addWindowListener(new?WindowAdapter()?{

public?void?windowClosing(WindowEvent?e)?{

System.exit(0);

}

});

setSize(350,?350);

setVisible(true);

Thread?thread1?=?new?Thread(ballPanel);

thread1.start();

}

}

class?Ball?extends?JPanel?implements?Runnable?{

int?rgb?=?0;

Color?color;

int?x,?y;

int?dx?=?5,?dy?=?5;

Ball(int?x,?int?y)?{

this.x?=?x;

this.y?=?y;

}

@Override

protected?void?paintComponent(Graphics?g)?{

super.paintComponent(g);

setBackground(Color.BLACK);

g.setColor(color);

g.fillOval(x,?y,?50,?50);

}

public?void?run()?{

while?(true)?{

if?(x?<=?0)?{

dx?=?5;

updateBallColor();

}?else?if?((x?+?50)?>=?getWidth())?{

dx?=?-5;

updateBallColor();

}

if?(y?<=?0)?{

dy?=?5;

updateBallColor();

}?else?if?((y?+?50)?>=?getHeight())?{

dy?=?-5;

updateBallColor();

}

x?=?x?+?dx;

y?=?y?+?dy;

repaint();

try?{

Thread.sleep(25);

}?catch?(InterruptedException?e)?{

;

}

}

}

public?void?updateBallColor()?{

rgb?=?new?Random().nextInt();

color?=?new?Color(rgb);

}

}

VB中实现一个小球在form框中到处弹

一、随机简单图形动画

完成此工作主要的直接使用VB中的作图命令, 比如画 点函数PSet(X,Y),COLOR, 其中X Y为图形坐标系统的坐标, COLOR表示颜色值,可用QBColor(x)或RGB(r,g,b)等形式表 示, 同时可以控制画点的半径长度,即通过设置Drawwidth 属性, 当半径大于1时实际上此命令是画一个实心圆,当然 也可以利用Circle命令直接绘制圆形。VB中还提供了随机 数产生手段,即RND内部函数, 它可以产生0到1之间的随机 数, 利用此函数可以随机确定画点的位置、点的颜色、点 的半径等,这样即可以实现在固定区域内进行随机画圆操 作, 其中随机位置的确定必须根据作图区域进行确定, 具 体可用 ScaleWidth及Scaleheight属性进行确定。为了实 现连续动画效果,可利用时间控件或"DoEvents" 命令实现 后台处理, 具体请见文后的Command1_Click事件中的程序 代码。如果把程序改为随机画矩形或空心圆,或者灵活控 制画圆的半径, 则会产生另外的艺术效果, 比如在一片黑 色的屏幕上画出随机的小点, 就象夜空中的点点繁星。

二、随机文字动画

在VB中可利用"Print"命令进行字符串的显示工作,此 命令一般只在当前位置显示字符串, 但具体操作时可通过 CurrentX和CurrentY 控制字符串显示位置,通过FontSize 控制字体的尺寸, 通过ForeColor和BackColor控制字符的 前景色和背景色, 如果把上述的各项属性值均采用RND 进 行随机产生, 即会形成随机字符显示效果, 比如在一个图 形框中显示一些新年贺辞, 同时播放美妙的音乐, 那将是 一份极好的新年礼物。需要注意一点,由于字体互相覆盖, 长时间显示会使窗口显得乱一些,所以最好按一定时间用 "CLS"命令进行窗口清除。此处说明一下颜色的控制技巧, 如果使用QBColor(Rnd*15)方式定义随机颜色,只能在16种 颜色中随机产生, 而采用RGB(Rnd*256,Rnd*256,Rnd*256) 方式则可以产生256*256*256种不同的颜色,但具体的颜色 特性受当前WINDOWS 屏幕模式的限制。具体操作作方式请见 文后Command2_Click事件中的代码。

三、立体图形随机动画

上面只是直接利用绘图语句进行简单的动画, 如果通 过这些命令绘制成一定的立体图形, 并实行随机动画操作, 那将更具有特殊的艺术效果。比如下面两行简单的命令将 画出一个具有强烈立体感效果的三角锥体, 其中(M,N) 为 锥体的顶端坐标:

Picture1.Line(m,n+2.5*i)-(m+i/2,n+2*i),

RGB(180,180,180)

Picture1.Line(m,n+2.5*i)-(m-i/2,n+2*i),

RGB(80,80,80)

如果把屏幕的底色置为暗**, 在此窗口内的随机位置画 出大小不一的三角锥, 就象在**的沙漠上建起了无数的 金字塔, 具有一种特殊的情趣。具体操作方法请见文后程 序中的Command3_Click事件中的代码。

四、随机显示图像

在VB中不仅提供了完善的做图方法, 而且在绘图方法 中还可以灵活的处理图像文件, 其中提供了一个方便的图 像复制命令即: PaintPicture, 此命令的功能与API 函数 BitBlt类似, 但由于不用做API函数说明,所以更有它的方 便之处, 语法格式:

PaintPicture Pic,destX,destY,

destWidth,destHeight,

scrX,scrY,scrWidth,scrHeight

其中Pic:为对象, 如图形框Picture等;

destX,destY:目标图像位置;

destWidth,destHeight:目标图像尺寸;

scrX,scrY:原图像的裁剪坐标;

scrWidth,scrHeight:原图像的裁剪尺寸;

从以上可以看出,目标图像的位置可以随机改变,不仅如 此,通过改变destWidth与destHeight值,还可以改变复制 后的图像的尺寸, 实现放大或缩小图像显示, 甚至可以置 这两个属性为负值, 这样可使目标图像在水平方向翻转, 实现特殊效果的图像显示, 灵活运用RND 随机函数确定上 述各个参数, 可取得理想的随机图像显示效果。具体操作 方法请见文后程序Command4_Click事件中的代码。

文后是一个完成上述随机动画的完整演示程序,需要 在From1 窗体中安放两个图形框Picture(1-2)及四个命令 按钮Command1-5,然后把下面的代码填入相应的事件处,运 行此程序之后,按下按钮1则在图形框中进行随机画圆演示, 按下按钮2 则在图形框中进行随机文字显示, 按下按钮 3 则在图形框中随机显示三角锥体, 按下按钮4 则进行随机 图像显示, 按下按钮5 则退出程序。此程序在WINDOWS 95 系统下VB4.0环境下调试通过。

程序准备

Private Sub Form_Load()

Command1.Caption = "随机画圆"

Command2.Caption = "随机文字"

Command3.Caption = "立体图形"

Command4.Caption = "随机图像"

Command5.Caption = "退出"

Form1.ScaleMode = 1

Picture1.ScaleMode = 1

Picture2.Picture = LoadPicture

("d:\windows\256color.bmp")

End Sub

随机画圆动画

Private Sub Command1_Click()

Dim XPos, YPos

Picture1.Cls

Do

nn = Int(100 * Rnd)

If nn > 0 Then

Picture1.DrawWidth = nn

End If

XPos = Rnd * Picture1.ScaleWidth

YPos = Rnd * Picture1.ScaleHeight

Picture1.PSet (XPos, YPos), RGB

(Rnd * 256, Rnd * 256, Rnd * 256)

DoEvents

Loop

End Sub

随机文字动画

Private Sub Command2_Click()

Picture1.Cls

Do

nn = Int(45 * Rnd)

If nn > 0 Then

Picture1.FontSize = nn

End If

Picture1.CurrentX =

Rnd * Picture1.ScaleWidth - 1000

Picture1.CurrentY =

Rnd * Picture1.ScaleHeight

Picture1.ForeColor =

RGB(Rnd * 256, Rnd * 256, Rnd * 256)

Picture1.Print "随机 OK!"

n = n + 1

If n > 50 Then

n = 0

Picture1.BackColor = QBColor(Rnd * 15)

End If

DoEvents

Loop

End Sub

立体随机动画

Private Sub Command3_Click()

Dim m, n

Picture1.DrawWidth = 1

Picture1.BackColor = RGB(210, 150, 0)

Picture1.Cls

Do

m = Rnd * Picture1.ScaleWidth

n = Rnd * Picture1.ScaleHeight - 500

For i = 0 To Rnd * 800

Picture1.Line(m,n+2.5*i)-(m+i/2,n+2*i),

RGB(180,180,180)

Picture1.Line(m,n+2.5*i)-(m-i/2,n+2*i),

RGB(80,80,80)

Next i

DoEvents

Loop

End Sub

随机图像显示

Private Sub Command4_Click()

Do

xx = Rnd * Picture1.Width

yy = Rnd * Picture1.Height

Picture1.PaintPicture Picture2.

Picture, xx, yy,

Picture2.Width, Picture2.Height

DoEvents

Loop

End Sub

退出按钮

Private Sub Command5_Click()

End

End Sub

声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。