0453-Bomb-角色速度控制

环境

  • Time 2024-03-17
  • Zig 0.12.0-dev.3152+90c1a2c41
  • WSL-Ubuntu 22.04.3 LTS
  • raylib 5.0

前言

说明

参考资料:

  1. 《游戏开发:世嘉新人培训教材》
  2. 图片素材:https://www.ituring.com.cn/book/1742

目标

实现了基于时间的移动速度控制,可以调整速度的值来实现角色的移动速度。

map

speedUnit

增加了一个速度单元,将一个像素分成了 1000。

const speedUnit = 1000;

player1

玩家 1 的初始坐标也需要同步放大。

roles[0] = .{
    .x = 1 * tileMap.unit * speedUnit,
    .y = 1 * tileMap.unit * speedUnit,
    .type = .player1,
};

enemy

初始的敌人的位置也需要同步放大。

self.roles[1 + i] = .{
    .x = (floors[i] >> 16 & 0xFFFF) * tileMap.unit * speedUnit,
    .y = (floors[i] & 0xFFFF) * tileMap.unit * speedUnit,
};

draw

绘图的时候,将对应的坐标缩小 speedUnit。

for (self.roles) |value| {
    const x = value.x / speedUnit;
    tileMap.drawXY(x, value.y / speedUnit, @intFromEnum(value.type));
}

play

roleSpeed

定义了玩家和敌人的移动速度

const roleSpeed = 100;

时间和速度

从引擎获取了帧时间然后乘以速度。

pub fn update(self: *Gameplay) ?@import("popup.zig").PopupType {
    if (engine.isPressed(engine.Key.x)) return .over;
    if (engine.isPressed(engine.Key.c)) return .clear;

    const speed = engine.frameTime() * roleSpeed;
    var p1 = self.map.player1();
    if (engine.isDown(engine.Key.a)) p1.x -|= speed;
    if (engine.isDown(engine.Key.d)) p1.x +|= speed;
    if (engine.isDown(engine.Key.w)) p1.y -|= speed;
    if (engine.isDown(engine.Key.s)) p1.y +|= speed;

    return null;
}

效果

bomb

总结

实现了基于时间的移动速度控制,可以调整速度的值来实现角色的移动速度。

附录

posted @ 2026-08-16 08:48  jiangbo4444  阅读(6)  评论(0)    收藏  举报