弹球游戏的简单实现
发布日期:2021-06-30 21:07:31
浏览次数:3
分类:技术文章
本文共 5203 字,大约阅读时间需要 17 分钟。
public class MainActivity extends Activity { //随机数。每次进入游戏初始不一样 Random rand = new Random(); private double xyRate = rand.nextDouble() - 0.5; //一个-0.5~0.5的比率,控制小球的方向 //屏幕宽,高 private int tablewidth; private int tableheight; //球拍的水平位置,垂直位置,宽度,高度 private int racketx = rand.nextInt(200);//***每次进入游戏得到随机球拍初始位置 private int rackety ; private int RACKET_WIDTH = 200; private int RACKET_HEIGHT = 30; //球的大小,x和Y坐标 private int BALL_SIZE = 16; private int ballx = rand.nextInt(200) + 20;//***每次进入游戏得到随机小球初始位置 private int bally = rand.nextInt(10) + 20;//*** //球的纵向速度,横向速度 private int yspeed = 40; private int xspped = (int) (yspeed*xyRate*2); //***每次进入游戏得到一个随机的横向速度 //游戏是否结束的标志 private boolean isLose = false; //球拍的旧xy坐标 int oldx; int oldy; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final GameView gameView = new GameView(this); setContentView(gameView); //requestWindowFeature(Window.FEATURE_NO_TITLE);//因为已经没有标题了,加上该代码会出错 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG_FULLSCREEN); WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); tablewidth = metrics.widthPixels; tableheight = metrics.heightPixels; Log.i("mydate" , tablewidth +" " + tableheight); rackety = tableheight - 80; final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what == 1){ gameView.invalidate(); } } }; gameView.setOnKeyListener(new View.OnKeyListener() { //按键 @Override public boolean onKey(View v, int keyCode, KeyEvent event) { switch (event.getKeyCode()){ case KeyEvent.KEYCODE_A: if (racketx > 0) racketx -= 10; break; case KeyEvent.KEYCODE_D: if (racketx < tablewidth - RACKET_WIDTH) racketx += 10; break; } gameView.invalidate();//控制球拍左右移动 return true; } }); gameView.setOnTouchListener(new View.OnTouchListener() { //触摸 @Override public boolean onTouch(View v, MotionEvent event) { int nowx = (int) event.getX(); //int nowy = (int) event.getY(); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: oldx = nowx; //oldy = nowy; break; case MotionEvent.ACTION_MOVE: if (nowx > oldx){ //向右移动 racketx += 10; } else if (nowx < oldx) {//向左移动 racketx -= 10; } oldx = nowx; break; case MotionEvent.ACTION_UP: oldx = nowx; break; } gameView.invalidate(); return true; } }); final Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { //小球碰到游戏界面左右边框时 if (ballx <= 0 || ballx >= tablewidth - BALL_SIZE){ xspped = -xspped; //横向速度反向 } //如果小球的高度超出了球拍的位置,且横向不在球拍的范围内,则GAME OVER if (bally >= rackety - BALL_SIZE && (ballx < racketx || ballx > racketx+RACKET_WIDTH)){ timer.cancel(); isLose = true; //游戏结束标志 } //如果小球在拍的范围内或碰到顶部,小球反弹 else if (bally <= 0 || (bally >= rackety-BALL_SIZE && ballx > racketx && ballx < racketx + RACKET_WIDTH)){ yspeed = -yspeed; //纵向速度反向 } //小球坐标不停的改变 bally += yspeed; ballx += xspped; handler.sendEmptyMessage(1); } } , 0 , 100); //每0.1秒执行刷新 } class GameView extends View{ Paint paint = new Paint(); public GameView(Context context) { super(context); setFocusable(true); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); if (isLose){ paint.setColor(Color.RED); paint.setTextSize(40); canvas.drawText("GAME OVER" , tablewidth/2-100 , 200 , paint); } else { paint.setColor(Color.BLACK); canvas.drawCircle(ballx , bally , BALL_SIZE , paint); //绘制小球 canvas.drawRect(racketx , rackety , racketx + RACKET_WIDTH , rackety + RACKET_HEIGHT , paint);//绘制球拍 } } }}
转载地址:https://liuyan.blog.csdn.net/article/details/80035062 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月30日 20时46分25秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
51Nod - 1183 编辑距离 (dp)
2019-04-30
ACM 2014 鞍山区域赛 E - Hatsune Miku (dp)
2019-04-30
反向传播&梯度下降 的直观理解程序(numpy)
2019-04-30
ACM 2017 南宁区域赛 Rake it in(对抗搜索)
2019-04-30
CodeForces - 931B World Cup (思维 模拟)
2019-04-30
CodeForces - 996D Suit and Tie (暴力)
2019-04-30
ACM 2017 香港区域赛 E - Base Station Sites(二分)
2019-04-30
ACM 2018 青岛区域赛 J-Books (模拟)
2019-04-30
ACM 2016 沈阳区域赛 E - Counting Cliques (dfs)
2019-04-30
ACM 2017 北京区域赛 J-Pangu and Stones(区间dp)
2019-04-30
HDU - 5643 King's Game (约瑟夫环变式)
2019-04-30
UVA - 1452 Jump (约瑟夫环变式)
2019-04-30
POJ - 3517 And Then There Was One (约瑟夫环变式)
2019-04-30
HDU - 2068 RPG的错排 (错排+组合数)
2019-04-30
CodeForces 591C Median Smoothing(思维 模拟)
2019-04-30
升级yosemite后java出错的解决
2019-04-30
mac || Linux 命令行下实现批量重命名
2019-04-30
java常用类 String面试题
2019-04-30
Windows10下的powershell美化教程
2019-04-30