前言
以前用Java写了写了一个飞翔的小鸟,但是由于本人水平有限,代码写得可能有点啰嗦,仅供各位大佬参考。
运行效果
细节实现
-
界面
界面主要采用JLabel类显示图片,图片分层由JLayeredPane类管理。JLayeredPane分层:
最底层为Default层,最高层为Drag层,层级高的组件覆盖层级低的组件。 -
游戏逻辑
每一游戏时刻(tick,30ms)的任务执行主要由ScheduledExecutorService类实现。
管子:一对管子由上下两根组成,上下管子、两对管子之间的间隔随机生成,这里采用Random类的nextInt(int bound)方法实现,此方法随机生成[0,n)区间内的任意整数。管子对象由List存储,并将管子数量做出限制,当数量已达最大则不再生成,管子左移出界面后做删除操作。
小鸟的移动: 每tick将管子左移xspeed个像素模拟小鸟向右飞,通过控制小鸟的Y轴坐标实现向上飞和下落,Y轴增大则小鸟下落,反之上升。将向下定为速度yspeed正方向,每tick将小鸟Y轴值增加yspeed个像素,并将yspeed增大g个单位,模拟重力。
小鸟的跳跃:给背景注册监听器,当鼠标点击时将yspeed置为负来模拟跳跃。
小鸟的死亡:每tick遍历管子List,找到小鸟通过过中的管子,若找到则判定是否碰撞。
if(!(this.y>passing.Pipe_down.getIconHeight()+passing.y
&&this.y+this.currentImage.getIconHeight()<
passing.Pipe_down.getIconHeight()+passing.y+passing.ySpace))
小鸟的计分:将计分作为成员变量,每个管子左移出画面后计分加1,当小鸟死亡后再将位于小鸟左侧的管子数加到计分内。每局计分用TreeSet存储,根据顺序决定奖牌种类。
大概思路就是这样,下面是完整代码和资源
完整代码
链接:百度云盘链接
提取码:gse8