Android游戏-切水果(代码都有)
再一定的时间内完成切水果,切得水果越多得分越高*****************************************************************************************************************************************
·
(资源下载链接在文末)
运行画面
结束画面
代码实现
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
gamestart.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/start_background" >
<ImageView
android:id="@+id/imageView_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:src="@drawable/apple" />
<ImageView
android:id="@+id/imageView_cancle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView_start"
android:layout_alignParentRight="true"
android:src="@drawable/boom" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/imageView_start"
android:text="开始"
/>
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView2"
android:layout_alignBottom="@+id/textView2"
android:layout_alignParentRight="true"
android:text="退出" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/stop_background" >
<Button
android:id="@+id/button_return"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:text="重新开始游戏" />
<Button
android:id="@+id/button_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="结束游戏" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="83dp"
android:text="哟!不错哦!你的得分是:"
android:textColor="#ffffff"
android:textSize="30dp" />
<TextView
android:id="@+id/textView_score"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/textView1"
android:text="0"
android:textColor="#FF0000"
android:textSize="50dp" />
</RelativeLayout>
StartGameActivity.java
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
public class StartGameActivity extends Activity {
private final static int CONFIRM_DIALOG = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gamestart);
initConfirmDialogButton();
initCancleDialogButton();
}
private void initConfirmDialogButton()
{
ImageView btn = (ImageView) findViewById(R.id.imageView_start);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
jump();
}
});
}
private void jump(){
Intent intent=new Intent(this,FruitFrameActivity.class);
startActivity(intent);
}
private void initCancleDialogButton()
{
ImageView btn = (ImageView) findViewById(R.id.imageView_cancle);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(CONFIRM_DIALOG);
}
});
}
@Override
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub
if(id == CONFIRM_DIALOG)
{
return showConfirm();
}
return super.onCreateDialog(id);
}
private Dialog showConfirm()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("你确定要退出本游戏?");
builder.setIcon(R.drawable.watermelon);
builder.setMessage("点击OK将退出游戏,点击cancle将返回开始界面");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
finish();
}
});
builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
removeDialog(CONFIRM_DIALOG);
}
});
return builder.create();
}
}
FruitFrameActivity.java
import android.app.Activity;
import android.os.Bundle;
public class FruitFrameActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyGameView view= new MyGameView(this);
setContentView(view);
}
}
MyGameView.java
import java.util.ArrayList;
import java.util.Random;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.Paint.Style;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
public class MyGameView extends MySurfaceView {
private Context mContext;
private ArrayList<PointF> mTrack;
private final static int POINT_LIMIT = 5;
private Paint mPaint;
private int scroe=0;
//此变量用于修改刀光的颜色
private int mBladeColor = 0xFFFFFFFF;
//用于容纳精灵
private ArrayList<Spirite> mSpirits;
private ArrayList<Spirite> mBooms;
//计算下次生成精灵的时间
private long mNextTime = 0L;
private long mNextTimeBoom = 0L;
//显示右上角时间
private long mTimeCount;
public int count = 15;
//声明播放器
private MediaPlayer mPlayer;
private SoundPool mSoundPool;
private int mExplodeSoundId;
//背景
private Drawable mBackground;
public MyGameView(Context context) {
super(context);
// TODO Auto-generated constructor stub
mContext = context;
mPaint = new Paint();
mBackground = mContext.getResources().getDrawable(R.drawable.game_background);
mTrack = new ArrayList<PointF>();
//实例化容纳精灵的列表,请自行做好管理精灵的工作
mSpirits = new ArrayList<Spirite>();
mBooms = new ArrayList<Spirite>();
//初始化播放器
mPlayer=MediaPlayer.create(context, R.raw.music_menu);
mPlayer.setLooping(true);
mSoundPool=new SoundPool(5,AudioManager.STREAM_MUSIC,100);
mExplodeSoundId=mSoundPool.load(context,R.raw.bomb_explode,1);
}
//专用于绘制屏幕
@Override
protected void myDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.myDraw(canvas);
//用户画背景
drawBackground(canvas);
//到了计算好的时间就生成精灵
if(mNextTime<System.currentTimeMillis()){
generateSpirit();
mSoundPool.play(mExplodeSoundId, 1, 1, 1, 0, 1);
nextGenTime();
}
if(mNextTimeBoom<System.currentTimeMillis()){
drawBoom();
nextGenTimeBoom();
}
drawTime(canvas);
checkSpirites();
drawSpirites(canvas);
//画刀光
drawBlade(canvas);
isHit();
isHitBomb();
drawScore(canvas);
}
//下一次生成精灵的时间
private void nextGenTime(){
mNextTime = System.currentTimeMillis();
Random r = new Random();
int interval = 1000+r.nextInt(100);
mNextTime += interval;
}
private void nextGenTimeBoom(){
mNextTimeBoom = System.currentTimeMillis()+1000;
Random r = new Random();
int interval = 3000+r.nextInt(2000);
mNextTimeBoom += interval;
}
//生成精灵,并添加到精灵管理列表
private void generateSpirit(){
//请修改此方法,使精灵从更多方向抛出
Spirite spirite = new Spirite(mContext);
spirite.loadBitmap(R.drawable.ic_launcher);
Random rand=new Random();
int randNum=1+rand.nextInt(5);
int cakeId;
switch(randNum){
case 1:
cakeId=R.drawable.orange;
spirite.loadBitmap(cakeId);
spirite.setmType(cakeId);
//t_num=randNum;
break;
case 2:
cakeId=R.drawable.papaya;
spirite.loadBitmap(cakeId);
spirite.setmType(cakeId);
//t_num=randNum;
break;
case 3:
cakeId=R.drawable.peach;
spirite.loadBitmap(cakeId);
spirite.setmType(cakeId);
//t_num=randNum;
break;
case 4:
cakeId=R.drawable.watermellon;
spirite.loadBitmap(cakeId);
spirite.setmType(cakeId);
//t_num=randNum;
break;
case 5:
cakeId=R.drawable.strawberry;
spirite.loadBitmap(cakeId);
spirite.setmType(cakeId);
//t_num=randNum;
break;
}
Random r = new Random();
spirite.mCoord.x = 50 + r.nextInt(300);
spirite.mCoord.y = 480;
spirite.mV.x = 5+r.nextInt(5);
spirite.mV.y = -(30 + (r.nextInt(20)+10));
/*mSpirits.get(0).setmType(mType);*/
mSpirits.add(spirite);
}
//画炸弹
private void drawBoom(){
Spirite spirite= new Spirite(mContext);
spirite.loadBitmap(R.drawable.boom);
Random r = new Random();
spirite.mCoord.x = 50 + r.nextInt(300);
spirite.mCoord.y = 480;
spirite.mV.x = 5+r.nextInt(5);
spirite.mV.y = -(30 + (r.nextInt(20)+10));
/*mSpirits.get(0).setmType(mType);*/
mBooms.add(spirite);
}
//开始和停止背景音乐
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
super.surfaceCreated(holder);
mPlayer.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
super.surfaceDestroyed(holder);
mPlayer.stop();
mSoundPool.release();
}
//画精灵到画布上
private void drawSpirites(Canvas canvas){
for(int i=0;i<mSpirits.size();i++){
mSpirits.get(i).draw(canvas);
}
for(int i=0;i<mBooms.size();i++){
mBooms.get(i).draw(canvas);
}
}
//检查精灵是否还在屏幕内,不在屏幕内则移除
private void checkSpirites(){
for(int i=0; i<mSpirits.size(); i++ ){
if(isSpiriteValidate(i)){
mSpirits.remove(i);
i -=1;
}
}
}
//具体检查精灵是否在屏幕内的方法
private boolean isSpiriteValidate(int i){
PointF coord = mSpirits.get(i).mCoord;
if(coord.x<-mSpirits.get(i).mDimention.x || coord.x>800 || coord.y>480){
return true;
}
return false;
}
private void drawScore(Canvas canvas){
Paint paint=new Paint();
paint.setColor(Color.WHITE);
paint.setTextSize(30);
canvas.drawText("Score:"+scroe, 50, 50, paint);
}
private void isHit(){
synchronized (mTrack) {
for(int i=0;i<mTrack.size();i++){
for(int z=0;z<mSpirits.size();z++){
if(mTrack.get(i).x>mSpirits.get(z).mCoord.x&&mTrack.get(i).x<mSpirits.get(z).mCoord.x+mSpirits.get(z).mDimention.x){
if(mTrack.get(i).y>mSpirits.get(z).mCoord.y&&mTrack.get(i).y<mSpirits.get(z).mCoord.y+mSpirits.get(z).mDimention.y){
switch(mSpirits.get(z).getmType()){
case R.drawable.orange:
initCutCake(R.drawable.orangep1, R.drawable.orangep2, z);
scroe+=10;
break;
case R.drawable.papaya:
initCutCake(R.drawable.papayap1, R.drawable.papayap2, z);
scroe+=10;
break;
case R.drawable.peach:
initCutCake(R.drawable.peachp1, R.drawable.peachp2, z);
scroe+=1;
break;
case R.drawable.strawberry:
initCutCake(R.drawable.strawberryp1, R.drawable.strawberryp2, z);
scroe+=1;
break;
case R.drawable.watermellon:
initCutCake(R.drawable.watermellonp1, R.drawable.watermellonp2, z);
scroe+=1;
break;
}
}
}
}
}
}
}
private void isHitBomb(){
synchronized (mTrack) {
for(int i=0;i<mTrack.size();i++){
for(int z=0;z<mBooms.size();z++){
if(mTrack.get(i).x>mBooms.get(z).mCoord.x && mTrack.get(i).x<mBooms.get(z).mCoord.x+mBooms.get(z).mDimention.x){
if(mTrack.get(i).y>mBooms.get(z).mCoord.y && mTrack.get(i).y<mBooms.get(z).mCoord.y+mBooms.get(z).mDimention.y){
if(scroe >= 10){
scroe -= 10;
}else{
scroe = 0;
}
mBooms.remove(z);
mSpirits.removeAll(mSpirits);
}
}
}
}
}
}
private void initCutCake(int id1, int id2, int z) {
Spirite spirite_left = new Spirite(mContext);
Spirite spirite_right = new Spirite(mContext);
spirite_left.loadBitmap(id1);
spirite_left.mCoord.x=mSpirits.get(z).mCoord.x+60;
spirite_left.mCoord.y=mSpirits.get(z).mCoord.y;
mSpirits.add(spirite_left);
spirite_right.loadBitmap(id2);
spirite_right.mCoord.x=mSpirits.get(z).mCoord.x-60;
spirite_right.mCoord.y=mSpirits.get(z).mCoord.y;
mSpirits.add(spirite_right);
mSpirits.remove(z);
}
//请记得修改此画背景的方法,使背景更漂亮
private void drawBackground(Canvas canvas){
canvas.drawColor(0xFF000000);
int width = 800;
int height = 480;
mBackground.setBounds(0, 0, width, height);
mBackground.draw(canvas);
}
//画刀光到画布上,有能力的小组可自行改进刀光
private void drawBlade(Canvas canvas){
mPaint.setColor(0xFFFFFFFF);
synchronized(mTrack){
Path path = new Path();
Float startX, startY;
Float controlX,controlY;
Float endX, endY;
int strokeWidth = 1;
mPaint.setStyle(Style.STROKE);
if(mTrack.size()>1){
endX = mTrack.get(0).x;
endY = mTrack.get(0).y;
for(int i=0;i<mTrack.size()-1;i++){
startX = endX;
startY = endY;
controlX = mTrack.get(i).x;
controlY = mTrack.get(i).y;
endX = (controlX + mTrack.get(i+1).x)/2;
endY = (controlY + mTrack.get(i+1).y)/2;
path.moveTo(startX, startY);
path.quadTo(controlX, controlY, endX, endY);
mPaint.setColor(mBladeColor);
mPaint.setStrokeWidth(strokeWidth++);
canvas.drawPath(path, mPaint);
path.reset();
}
startX = endX;
startY = endY;
endX = mTrack.get(mTrack.size()-1).x;
endY = mTrack.get(mTrack.size()-1).y;
path.moveTo(startX, startY);
path.lineTo(endX, endY);
mPaint.setStrokeWidth(strokeWidth++);
mPaint.setColor(mBladeColor);
canvas.drawPath(path, mPaint);
mTrack.remove(0);
}
}
}
//右上角时间和页面判断跳转
private void drawTime(Canvas canvas){
if(System.currentTimeMillis()-mTimeCount>1000){
mTimeCount = System.currentTimeMillis();
count--;
if(count == 2){
Intent intent = new Intent(mContext, GameStopActivity.class);
intent.putExtra("Score", ""+ scroe);
mContext.startActivity(intent);
}
}
Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setTextSize(30);
canvas.drawText("Time:"+count, 650, 50, paint);
}
//屏幕点击事件的响应方法
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction()==MotionEvent.ACTION_DOWN){
handleActionDown(event);
}else if(event.getAction()==MotionEvent.ACTION_MOVE){
handleActionMove(event);
}else if(event.getAction()==MotionEvent.ACTION_UP){
handleActionUp();
}
return true;
}
//手指按下的响应方法
private void handleActionDown(MotionEvent event){
PointF point = new PointF(event.getX(),event.getY());
synchronized(mTrack){
mTrack.add(point);
}
}
//手指拖动的响应方法
private void handleActionMove(MotionEvent event){
PointF point = new PointF(event.getX(),event.getY());
synchronized(mTrack){
if(mTrack.size()>=POINT_LIMIT){
mTrack.remove(0);
}
mTrack.add(point);
}
}
//手指抬起的响应方法
private void handleActionUp(){
synchronized(mTrack){
mTrack.clear();
}
}
}
MySurfaceView.java
import android.content.Context;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder mHolder;
private DrawThread mDrawThread;
public MySurfaceView(Context context) {
super(context);
// TODO Auto-generated constructor stub
mHolder = getHolder();
mHolder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
mDrawThread = new DrawThread();
Thread thread = new Thread(mDrawThread);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mDrawThread.stop();
}
protected void myDraw(Canvas canvas){
}
private class DrawThread implements Runnable{
private boolean mRun = true;
@Override
public void run() {
// TODO Auto-generated method stub
while(mRun){
Canvas canvas = mHolder.lockCanvas();
myDraw(canvas);
mHolder.unlockCanvasAndPost(canvas);
}
}
public void stop(){
mRun = false;
}
}
}
Spirite.java
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
public class Spirite {
private Context mContext;
private Bitmap mBitmap;
//Y方向加速度
private final static float ACCLERATIONY = 3.5F;
//X方向加速度
private final static float ACCLERATIONX = 0F;
//精灵的坐标
public PointF mCoord;
//精灵的速度
public PointF mV;
//精灵的长宽
public PointF mDimention;
//画笔,可做特殊效果
private Paint mPaint;
//精灵的类型
private int mType;
public int getmType() {
return mType;
}
public void setmType(int mType) {
this.mType = mType;
}
public Spirite(Context context){
mContext = context;
mCoord = new PointF();
mV = new PointF();
mDimention = new PointF();
}
//导入该精灵的图片
public void loadBitmap(int id){
mBitmap = BitmapFactory.decodeResource(mContext.getResources(), id);
mDimention.x = mBitmap.getWidth();
mDimention.y = mBitmap.getHeight();
}
//把精灵画到画布上
public void draw(Canvas canvas){
canvas.drawBitmap(mBitmap, mCoord.x, mCoord.y, mPaint);
move();
}
//计算精灵的移动
public void move(){
mCoord.x += mV.x;
mCoord.y += mV.y;
mV.x += ACCLERATIONX;
mV.y += ACCLERATIONY;
}
}
GameStopActivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class GameStopActivity extends Activity {
private String score = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
score = extras.getString("Score");
setContentView(R.layout.gamestop);
initStopButton();
initreturnButton();
initText();
}
private void initStopButton() {
Button button = (Button)findViewById(R.id.button_stop);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
System.exit(0);
}
});
}
private void initreturnButton() {
Button button = (Button)findViewById(R.id.button_return);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
jump();
}
});
}
private void jump(){
Intent intent = new Intent(this,FruitFrameActivity.class);
startActivity(intent);
}
private void initText(){
TextView text = (TextView)findViewById(R.id.textView_score);
text.setText(score);
}
}
点我下载资源
更多推荐
所有评论(0)