You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java游戏开发:如何让Canvas.drawBitmap绘制的位图2秒后消失

实现关卡编号位图2秒后自动消失的方案

嘿,作为Java游戏开发新手能写出这样的绘制逻辑已经很赞啦!你说的“关卡编号只显示2秒后消失”的需求完全可以实现,我给你两种实用的解决方案,你可以根据自己的游戏架构来选~

方法一:时间戳判断法(适合游戏主循环绘制场景)

这个方法的核心思路是记录关卡开始的时间,每次绘制时判断当前时间和关卡开始时间的差值是否小于2秒,只有满足条件才绘制位图。

步骤:

  1. 在你的游戏类(比如管理关卡的类或者自定义View类)里添加一个变量,用来存储关卡开始的时间戳:
private long levelStartTimestamp;
  1. 当玩家进入新关卡时(比如关卡切换逻辑触发时),更新这个时间戳:
// 比如进入关卡1时
theLevel = 1;
levelStartTimestamp = System.currentTimeMillis(); // 记录当前系统时间(毫秒)
  1. 修改你原来的绘制代码,加入时间判断:
// 获取当前系统时间
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逻辑:

步骤:

  1. 在自定义View类里添加标志位和Handler:
private boolean showLevelNumber = false;
private Handler handler = new Handler(Looper.getMainLooper());
// 假设你的自定义View实例是gameView,也可以用this代替
  1. 写一个启动新关卡的方法,用来开启显示并设置延迟隐藏:
private void startNewLevel(int level) {
    theLevel = level;
    showLevelNumber = true; // 开启显示
    // 延迟2秒后关闭显示,并触发重绘
    handler.postDelayed(() -> {
        showLevelNumber = false;
        gameView.invalidate(); // 通知View重绘,让消失生效
    }, 2000);
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:26:58