------- android培训、java培训、期待与您交流! ----------
基础学的差不多了,就想找点东西练练手。正好逛游民星空的时候看到了这个
http://v.youku.com/v_show/id_XNjc1MzgzNTIw.html
http://v.youku.com/v_show/id_XNjc1MzgzNTIw.html
逆天!盒子版《像素鸟》
好像看上去很简单的样子 就试着自己写写看结果写出了这个
图像素材来自于 66rpg 素材 图标 的三国系列和愤怒的小鸟
分析:根据视频上 所参考鸟的X轴是固定不动的 只要考虑Y轴 受地心引力影响所以会不但向下
还要有向上飞的控件考虑用键盘事件来实现
那怎么让鸟看上去是向前移动的呢?
就考虑让背景移动起来 看上去像往前飞一样
柱子没找到像样的图片 就用Graphics类中的fillRect 填充个方块来替代
凡是不多说写了就明白了了 虽然做不到向老师中那2个面试题目那样透彻分析 不过万事开头难 慢慢来总会熟练的
首先是窗体
class show
// 窗体
{
JFrame f;
class window
extends WindowAdapter
// 关闭按钮
{
public
void windowClosing(WindowEvent e) {
System.exit(
0);
}
}
show()
// 初始化窗体
{
f
=
new JFrame(
"note");
f.setSize(
600,
200);
f.addWindowListener(
new window());
print1 d
=
new print1();
f.add(d);
d.setFocusable(
true);
f.setVisible(
true);
}
}
JFrame继承Frame 关键里面自带关闭所以可以省一些代码 不过是练习我还是自己写了 删了window按还是能关闭的
最重要的主体
在绘图里为什么定义两张背景?
最重要的主体
class print1
extends JPanel
implements ActionListener
// 窗体内容
{
/**
*
*/
private
static
final
long serialVersionUID
= 5654288421206033830L;
ArrayList
<walls
> a
=
new ArrayList
<walls
>();
run1 r
=
new run1();
// 建立鸟对象
int timer
=
10;
// 计时器时间
int timex
=
0;
// 跳跃计时器
int wallstime
=
0;
Timer time
=
new Timer(timer,
this);
// 创建计时器
public
int x
=
0, y
=
1015, y1;
// 背景坐标
boolean i
=
false;
// 跳变量
print1()
// 初始化内容
{
this.setSize(
600,
200);
this.setVisible(
true);
this.addKeyListener(
new KeyListener() {
// 键盘事件
@
Override
public
void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
time.start();
// 开启计时器
}
@
Override
public
void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
// if(e.getKeyChar()=='s'){}
if (e.getKeyCode()
==
32)
// 按下空格激活跳
{
i
=
true;
}
}
@
Override
public
void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
});
}
public
void paint(Graphics g)
// 绘图
{
Image image1
=
this.getToolkit().getImage(
"城市安全区_FAR3_M1_0.png");
// 背景
g.drawImage(image1, x,
0,
this);
// 动起来要连贯所以创建2张
g.drawImage(image1, y,
0,
this);
if (x
==
-1015) {
x
=
1015;
}
if (y
==
-1015) {
y
=
1015;
}
x();
// 让图动起来
g.setColor(Color.black);
for (
int x
=
0; x
< a.size(); x
++) {
if (a.get(x).returny()
>
100)//判断柱子的高度大于100在下面 小于100在上面
y1
=
200
- a.get(x).returny();
else
y1
=
0;
g.fillRect(a.get(x).returnx1(), y1,
50, a.get(x).returny());
}
Image image
=
this.getToolkit().getImage(
"12.png");
// 鸟图
g.drawImage(image, r.returnx(), r.returny(),
30,
30,
this);
wallsbuilddel();
deadorlive();
upordown();
// 判断上升还是下降
}
private
void deadorlive() {//判断生死 因为鸟打印是从其实坐标打印的不包括整个身体所以在判断里XY轴上个加了30
// TODO Auto-generated method stub
for (
int x
=
0; x
< a.size(); x
++) {
if (a.get(x).returny()
>
100) {
if (r.returnx()
+
30
== a.get(x).returnx1()
& r.returny()
+
30
>=
200
- a.get(x).returny()) {
time.stop();
over();
}
}
else
if (r.returnx()
+
30
== a.get(x).returnx1()
& r.returny()
+
30
<= a.get(x).returny()) {
time.stop();
over();
}
}
}
private
void over() {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(
null,
"you lose");//说出个对话框 宣布游戏结束
System.exit(
0);
}
private
void wallsbuilddel() {
// TODO Auto-generated method stub
for (
int i
=
0; i
< a.size(); i
++) {
if (a.get(i).returnx1()
<=
0)
a.remove(i);
}
if (wallstime
>
1500) {//每1.5秒产生一个墙
wallstime
=
0;
a.add(
new walls());
}
wallstime
+= timer;
}
private
void x() {
// TODO Auto-generated method stub
x
--;
y
--;
for (
int x
=
0; x
< a.size(); x
++) {
a.get(x).x1();
}
}
public
void upordown() {
if (i) {
r.up();
timex
+= timer;
if (timex
>=
200) {
i
=
false;
timex
=
0;
}
}
// 如果激活跳200毫秒里上升
else
{r.down();}
}
public
void actionPerformed(ActionEvent e) {
repaint();
}
}
以前学过VB里面有个很好用的计时器 然后百度了一下JAVA里也有个蛮好用的计时器
javax.swing.Timer类
键盘事件 按任意键开始。 按空格激活鸟的跳功能
为了让图片动起来连贯 当背景走到底的时候更改X轴让他爬到最右边去 理论上就是这样 不过要找张收尾无缝连接的图片才看不出
其实柱子的容器用链表数据结构的linkedlist比较好 逛论坛时发现的这个问题 写都写完了懒的改了 在这里提示一下 T T
public
class fb {
// 主类
/**
*
@param
args
*/
public
static
void main(
String[] args) {
// TODO Auto-generated method stub
show s
=
new show();
}
}
class run1
// 鸟
{
private
int x, y;
// 鸟坐标
//
run1()
// 初始化鸟坐标
{
x
=
200;
y
=
50;
}
public
void down()
// 鸟下落
{
y
= y
+
1;
}
public
void up()
// 鸟上升
{
y
= y
-
1;
}
int returnx()
// 获取鸟X坐标
{
return x;
}
int returny()
// 获取鸟Y坐标
{
return y;
}
}
class walls {
private
int y, x1
=
630;// 柱子初始化在最右边所以X默认为630
walls() {
y
=
new Random().nextInt(
170);//随机高度
}
void x1() {
x1
--;
}
int returnx1()
// 获取柱子x坐标
{
return x1;
}
int returny()
// 获取柱子Y坐标
{
return y;
}
}
为什么代码变量名那么无意义 英文比较着急 没把法 囧
不知不觉的就写成了类似于面向过程的 唉 下次写的时候要多注意了 附代码和素材 http://pan.baidu.com/s/1kTn0Zwb
更多精彩陆续更新........