当前位置: 首页 > ds >正文

制作一款打飞机游戏76:分数显示

在原型测试中,我们确定了一些必须带入实际游戏的关键元素:

GUI(图形用户界面)‌:包括得分显示等。
状态机‌:处理游戏开始、游戏结束等屏幕状态。
更好的射击效果‌:包括选项和拾取物。
拾取物指示器‌:当玩家拾取物品时,需要有相应的弹出提示。
具体实施步骤
1. 移除调试内容

首先,我们需要移除所有调试内容,让游戏界面更加干净。

lua
Copy Code
-- 移除调试内容
remove_debug_stuff()

2. 实现得分系统

得分是游戏中非常重要的一个元素。我们需要确保得分能够正确显示,并且能够处理大数字。

lua
Copy Code
-- 初始化得分变量
score = 0

-- 在绘制函数中添加得分显示
function draw()
    -- ... 其他绘制代码 ...
    print("Score: " .. score, 2, 2, 7) -- 在坐标(2,2)处,使用颜色7显示得分
end

-- 当消灭敌人时增加得分
function on_enemy_death()
    score = score + 100  -- 初始设定为增加100分,后续可能需要调整
end


由于PICO-8的变量范围有限,我们需要采用一种技巧来处理大数字:

lua
Copy Code
-- 将得分转换为32位整数显示
function to_string_32bit(num)
    return tostring(num) .. ",0x2"
end

-- 更新得分显示函数
function draw_score()
    print("Score: " .. to_string_32bit(score), 2, 2, 7)
end

3. 自定义字体

为了提升得分的视觉效果,我们引入了自定义字体。

lua
Copy Code
-- 加载自定义字体
load_custom_font("Voice.p8")

-- 使用自定义字体显示得分
function draw_score_with_custom_font()
    set_font("Voice")
    print("Score: " .. to_string_32bit(score), 120, 12, 7) -- 调整坐标以适应新字体
end

4. 优化得分显示

为了让得分更易读,我们添加了空格分隔和右对齐。

lua
Copy Code
-- 在得分数字中每三位插入一个空格
function add_spaces_to_score(score_str)
    if #score_str <= 3 then
        return score_str
    else
        return add_spaces_to_score(sub(score_str, 1, -4)) .. " " .. sub(score_str, -3)
    end
end

-- 计算得分字符串的宽度
function score_length(score_str)
    local len = #score_str * 6  -- 假设每个数字占6个像素宽度
    if #score_str > 3 then
        len = len - (#score_str - 3) * 2  -- 每增加一个空格组,宽度减少2
    end
    return len
end

-- 更新得分显示函数,添加空格和右对齐
function draw_score_final()
    local formatted_score = add_spaces_to_score(to_string_32bit(score))
    local score_x = 128 - score_length(formatted_score)  -- 右对齐计算
    set_font("Voice")
    print("Score: " .. formatted_score, score_x, 12, 7)
end

5. 实现状态机

最后,我们需要实现一个基本的状态机来处理游戏开始、游戏结束等状态。

lua
Copy Code
-- 初始化生命值
lives = 3

-- 游戏状态机
function update()
    if lives <= 0 then
        update_game_over()
    else
        update_game()
    end
end

function draw()
    if lives <= 0 then
        draw_game_over()
    else
        draw_game()
        draw_lives()  -- 显示生命值
    end
end

-- 游戏结束状态更新
function update_game_over()
    if btnp(0) then  -- 任意按钮按下时返回主菜单
        lives = 3
        state = "menu"
    end
end

-- 游戏结束状态绘制
function draw_game_over()
    cls(0)
    print("Game Over", 40, 40, 7)
end

-- 显示生命值
function draw_lives()
    print("Lives: " .. lives, 120, 126, 7)
end

结语

经过今天的努力,我们成功实现了得分系统、自定义字体和基本的状态机。

http://www.xdnf.cn/news/14954.html

相关文章:

  • 微软广告推出新的精细资产级别审核
  • 无代码自动化测试工具介绍
  • SpringBoot控制反转
  • CentOS 6操作系统安装
  • 05.SpringBoot拦截器的使用详解
  • 玄机——某学校系统中挖矿病毒应急排查
  • 人脸活体识别3:C/C++实现人脸眨眼 张嘴 点头 摇头识别(可实时检测)
  • lerobot 工程笔记(一)——使用smolvla控制so101
  • 【AI落地应用实战】AIGC赋能职场PPT汇报:从效率工具到辅助优化
  • Docker Compose 基础——AI教你学Docker
  • 链表的实现
  • Flink-1.19.0源码详解5-JobGraph生成-前篇
  • Node.js-http模块
  • Appium 简介
  • 大语言模型:是逐字生成还是一次多词?
  • GO Web 框架 Gin 完全解析与实践
  • 【NLP第二期中文分词技术:规则、统计与混合方法全解】
  • 笨方法学python-习题12
  • Disruptor架构哲学
  • 结构体实战:用Rust编写矩形面积计算器
  • MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?
  • 8.Docker镜像讲解
  • 阿里巴巴 Qwen 系列大模型发展时间线与主要特性
  • 数字图像处理学习笔记
  • C#.Net筑基-优雅LINQ的查询艺术
  • 算法-每日一题(DAY12)最长和谐子序列
  • TypeScript 安装使用教程
  • 电子面单系统开发全解析
  • 深度学习进阶:自然语言处理的推荐点评
  • 杭州来未来科技 Java 实习面经