1. 设计目的与意义
1.1设计目的
在飞速发展的互联网时代,快捷生活的学生可以在碎片化的时间里使用像素鸟进行娱乐放松。
1.2设计意义
随着网络游戏的飞速发展,类似于“王者荣耀”这类大型手游占据了手机游戏市场,而我们也逐渐忘记儿时小游戏,像素鸟的诞生就是为了让我们能在高速运转的新时代里找回一份儿时的回忆。
2. 功能结构及流程
2.1包含功能
玩家注册信息存入数据库
选择背景音乐(内置音乐播放器)
进行游戏
玩家分数排行榜
2.2运行流程
3. 系统实现效果展示
3.1用户登录与注册页面
3.1玩家排行榜页面
3.1选择播放背景音乐界面
3.1游戏界面
- 关键代码
4.1获取内部路径下的.MP3音乐以及实现
listmusic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(KS2Activity.this,musicListViewActivity2.class);
startActivity(intent);
}
});
upmusic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dang=shang;
shang=shang-1;
if(shang<0)
shang=list.size()-1;
xia=dang+1;
System.out.println(shang+""+xia+""+dang);
mMediaPlayer.reset();
//获取当前播放音乐名
try {
mMediaPlayer.setDataSource( list.get(dang).getName());
mMediaPlayer.prepare();
mMediaPlayer.start();
pausemusic.setText("暂停");
} catch (IOException e) {
e.printStackTrace();
}
}
});
downmusic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
shang=dang;
dang=xia;
xia=dang+1;
if(xia>=list.size())
xia=0;
mMediaPlayer.reset();
pausemusic.setText("暂停");
//获取当前播放音乐名
try {
mMediaPlayer.setDataSource( list.get(dang).getName());
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
});
onmusic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mMediaPlayer==null)
mMediaPlayer = new MediaPlayer();
dang=0;
xia=1;
shang=list.size()-1;
mMediaPlayer.reset();
pausemusic.setText("暂停");
//获取当前播放音乐名
try {
mMediaPlayer.setDataSource( list.get(0).getName());
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
});
pausemusic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flag) {
pausemusic.setText("继续播放");
mMediaPlayer.pause();
flag = false;
} else {
if (mMediaPlayer != null && mMediaPlayer.isPlaying())
currentPosition = mMediaPlayer.getCurrentPosition();
try {
// System.out.println(dang + "dangggggggggggg");
// System.out.println(list.get(dang).getName());
mMediaPlayer.reset();
mMediaPlayer.setDataSource(list.get(dang).getName());
mMediaPlayer.prepare();
mMediaPlayer.seekTo(currentPosition);
mMediaPlayer.start();
pausemusic.setText("暂停");
flag=true;
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
public void checkPermission(){
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
for (String permission : permissions) {
// GRANTED---授权 DINIED---拒绝
if (ContextCompat.checkSelfPermission(getApplicationContext(), permission) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permissions, 10001);
}
}
}
}
public List<music> mlist(){
List<music> musicList = null;
//获取外置存储卡目录
File sdRootDir = Environment.getExternalStorageDirectory();
//System.out.println("--------------->" + sdRootDir.getAbsolutePath());
//创建后缀字符串
String suffix = ".mp3";
//创建音乐文件列表
List<String> musicFileList = new ArrayList<>();
//调用方法,生成指定目录下某种文件类型列表
makeTypeFileList(sdRootDir, suffix, musicFileList);
//判断音乐文件列表是否有元素
if(musicFileList.size() > 0) {
//实例化音乐列表
musicList = new ArrayList<>();
//遍历音乐文件
for(String musicFile : musicFileList) {
//创建音乐实体
music music = new music();
//设置实体属性
music.setName(musicFile);
//将银月实体添加到音乐列表
musicList.add(music);
}
}
//System.out.println("mmmmmmmmmmmm:"+musicFileList);
//返回音乐列表
return musicList;
}
public void makeTypeFileList(File dir, String suffix, List<String> typeFileList) {
//获取指定目录下File数组(File可指向目录也可指向文件)
File[] files = dir.listFiles();
//遍历File数组
for(File file : files) {
//判断file是否为文件
if(file.isFile()) {
//file是文件
//按照后缀过滤文件
if(file.getName().endsWith(suffix)) {
//将满足条件的文件添加到列表
typeFileList.add(file.getAbsolutePath());
// System.out.println("-------" + file.getName());
}
}
else {
//file是目录
//目录非空,递归
if(file.list() != null) {
System.out.println("fail!");
makeTypeFileList(file, suffix, typeFileList);
}
}
}
}
}
4.2玩家排行榜的实现
public class paimingActivity extends AppCompatActivity {
private ListView lv;
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_paiming);
ContentValues values;
SQLiteDatabase db;
dbHelper = new MyDatabaseHelper(this, "User.db", null, 1);
db = dbHelper.getWritableDatabase();
values = new ContentValues();
//按玩家姓名降序查找分数
Cursor cursor = db.rawQuery("select * from User order by fs DESC", null);
List<Map<String, Object>> listitem = new ArrayList<Map<String, Object>>();
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("username"));//根据key值读取信息
String fs = cursor.getString(cursor.getColumnIndex("fs"));
Map<String, Object> showitem = new HashMap<String, Object>();
showitem.put("username", name);
showitem.put("fs", fs);
//将信息加入list
listitem.add(showitem);
} while (cursor.moveToNext());
SimpleAdapter myAdapter = new SimpleAdapter(getApplicationContext(),
listitem,
R.layout.pm_iterm,
new String[]{"username", "fs"},
new int[]{R.id.username, R.id.fs});
final ListView lv = findViewById(R.id.lv);
lv.setAdapter(myAdapter);
}
}
}
4.3游戏画面的绘制以及运行
public class MyView extends View implements Runnable {
Context context;
//地板类
Ground ground;
//管子类
Column column1;
Column column2;
//鸟类
Bird bird;
//画笔
Paint paint=new Paint();
int startButtonX;
int startButtonY;
int stopButtonX;
int stopButtonY;
Thread thread=new Thread(this);
private Context uucontext;
//判断游戏是否开始
boolean isstart=false;
//判断是否死亡
boolean isFail=false;
private MyDatabaseHelper dbHelper;
ContentValues values;
SQLiteDatabase db;
//分数
int fs=0;
public MyView(Context context) {
super(context);
uucontext=context;
this.context=context;
dbHelper=new MyDatabaseHelper(context,"User.db",null,1);
db = dbHelper.getWritableDatabase();
values = new ContentValues();
init();
startButtonX=MyApplication.width / 2 - DateImage.start.getWidth() / 2;
startButtonY=MyApplication.height / 2 - DateImage.start.getHeight() / 2;
stopButtonX=MyApplication.width / 2 - DateImage.start.getWidth() / 2;
stopButtonY=MyApplication.height / 2 - DateImage.start.getHeight() / 2;
thread.start();
}
//初始化方法
public void init(){
ground=new Ground();
column1=new Column(MyApplication.width+200);
column2=new Column(MyApplication.width+200+MyApplication.width/2+50);
bird=new Bird(140,MyApplication.height/2-30);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
setBackgroundResource(R.mipmap.background);
//绘制开始按钮
if (isstart==false) {
canvas.drawBitmap(DateImage.start, startButtonX,startButtonY , paint);
}
//绘制水管,和鸟
if (isstart){
column1.paint(canvas,paint);
column2.paint(canvas,paint);
bird.paint(canvas,paint);
}
//绘制地面
ground.paint(canvas,paint);
//结束画面
if (isFail){
paint.setColor(Color.RED);
paint.setTextSize(60);
canvas.drawText("失败!最终得分:"+fs,stopButtonX-70,stopButtonY-100,paint);
canvas.drawBitmap(DateImage.restart,stopButtonX,stopButtonY,paint);
canvas.drawBitmap(DateImage.restart2,stopButtonX,stopButtonY+300,paint);
}
paint.setColor(Color.RED);
paint.setTextSize(40);
canvas.drawText("分数 :"+fs,200,200,paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x=event.getX();
float y=event.getY();
//开始按钮的点击事件
if (isstart==false&&x>startButtonX&&x<startButtonX+DateImage.start.getWidth()&&y>startButtonY&&y<startButtonY+DateImage.start.getHeight()){
isstart=true;
}
//结束按钮的点击事件
if (isFail&&x>startButtonX&&x<startButtonX+DateImage.start.getWidth()&&y>startButtonY&&y<startButtonY+DateImage.start.getHeight()){
init();
isstart=false;
isFail=false;
// values.put("username",login.ppname);
values.put("fs",fs);
// Log.d("fsss",String.valueOf(fs));
db.update("User",values,"username=?",new String[]{login.ppname});
fs=0;
}
if (isFail&&x>startButtonX&&x<startButtonX+DateImage.restart2.getWidth()&&y>startButtonY&&y<startButtonY+300+DateImage.restart2.getHeight()){
init();
isstart=false;
isFail=false;
// System.out.println("asdasdsadsa");
values.put("fs",fs);
Log.d("fsss",String.valueOf(fs));
db.update("User",values,"username=?",new String[]{login.ppname});
Intent intent=new Intent(uucontext, paimingActivity.class);
uucontext.startActivity(intent);
fs=0;
}
//小鸟向上飞
bird.flappy();
return true;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//移动方法
if (isstart&&isFail==false) {
ground.move();
column1.move();
column2.move();
bird.move();
//碰撞检测
if (bird.hit(column1,column2,ground)){
isFail=true;
}
if (bird.pass(column1,column2)){
fs++;
}
postInvalidate();
}