Java游戏开发:如何让Canvas.drawBitmap绘制的位图2秒后消失
实现关卡编号位图2秒后自动消失的方案
嘿,作为Java游戏开发新手能写出这样的绘制逻辑已经很赞啦!你说的“关卡编号只显示2秒后消失”的需求完全可以实现,我给你两种实用的解决方案,你可以根据自己的游戏架构来选~
方法一:时间戳判断法(适合游戏主循环绘制场景)
这个方法的核心思路是记录关卡开始的时间,每次绘制时判断当前时间和关卡开始时间的差值是否小于2秒,只有满足条件才绘制位图。
步骤:
- 在你的游戏类(比如管理关卡的类或者自定义View类)里添加一个变量,用来存储关卡开始的时间戳:
private long levelStartTimestamp;
- 当玩家进入新关卡时(比如关卡切换逻辑触发时),更新这个时间戳:
// 比如进入关卡1时 theLevel = 1; levelStartTimestamp = System.currentTimeMillis(); // 记录当前系统时间(毫秒)
- 修改你原来的绘制代码,加入时间判断:
// 获取当前系统时间 long currentTime = System.currentTimeMillis(); // 判断是否处于关卡开始后的2秒内(2000毫秒) if (currentTime - levelStartTimestamp < 2000) { // 用switch替代多个if,代码更简洁 switch(theLevel) { case 1: canvas.drawBitmap(AppConstants.getBitmapBank().level1, 1, 1146, null); break; case 2: canvas.drawBitmap(AppConstants.getBitmapBank().level2, 1, 1146, null); break; case 3: canvas.drawBitmap(AppConstants.getBitmapBank().level3, 1, 1146, null); break; // 后续新增关卡直接在这里加case即可 } }
这样每次游戏绘制帧的时候,都会检查时间差,超过2秒就不再绘制关卡编号,自然就消失啦~
方法二:Handler延迟控制法(适合Android UI线程场景)
如果你的游戏是基于Android自定义View开发的,用Handler来控制显示/隐藏标志位会更贴合Android的UI逻辑:
步骤:
- 在自定义View类里添加标志位和Handler:
private boolean showLevelNumber = false; private Handler handler = new Handler(Looper.getMainLooper()); // 假设你的自定义View实例是gameView,也可以用this代替
- 写一个启动新关卡的方法,用来开启显示并设置延迟隐藏:
private void startNewLevel(int level) { theLevel = level; showLevelNumber = true; // 开启显示 // 延迟2秒后关闭显示,并触发重绘 handler.postDelayed(() -> { showLevelNumber = false; gameView.invalidate(); // 通知View重绘,让消失生效 }, 2000); }
- 修改onDraw方法里的绘制逻辑:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 先绘制游戏其他元素... // 只有标志位为true时才绘制关卡编号 if (showLevelNumber) { switch(theLevel) { case 1: canvas.drawBitmap(AppConstants.getBitmapBank().level1, 1, 1146, null); break; case 2: canvas.drawBitmap(AppConstants.getBitmapBank().level2, 1, 1146, null); break; case 3: canvas.drawBitmap(AppConstants.getBitmapBank().level3, 1, 1146, null); break; } } }
注意事项:
- 不管用哪种方法,一定要记得在每次切换关卡时更新时间戳或重置标志位,不然新关卡的编号可能不会正常显示。
- 如果你的游戏有自己的帧循环(比如用SurfaceView),第一种时间戳方法会更稳定,因为它和游戏帧同步;Handler方法更适合UI线程驱动的自定义View场景。
加油呀,新手遇到这种小问题很正常,慢慢摸索就能越来越顺手啦!
内容的提问来源于stack exchange,提问作者Eoin
相关产品推荐
相关产品推荐

