第 6 课 · Découverte

什么是精灵?

精灵就是贴了图的矩形:四个数字,一张图,零灵魂。

~11 min7 个关卡
▶ 视频🧩 练习📄 备忘单

42 秒 · 含中文字幕 · 8.4 Mo

你会学会的 7 件事

第 6 课:什么是精灵?

Regarde la leçon (42 s) : démonte ton héros — rectangle, image, données — avant même de le faire bouger.

英雄 = 四个数字

Écris `sprite` : un Hash avec `"x" => 10`, `"y" => 20`, `"l" => 32`, `"h" => 32` (des NOMBRES) et `"image" => "carre"`. Le héros complet tient là.

换一身装扮

Écris `habille(sprite, image)` qui renvoie un NOUVEAU hash : mêmes coordonnées, nouvelle image. L original ne bouge pas — tu copies, tu ne détruits.

矩形的占地

Écris `touche?(sprite, px, py)` : true si le point est DANS le rectangle — `px >= x` ET `px < x + l` (idem pour y). Le bord droit ne compte pas : le bord appartient au voisin.

谁在前面?

Écris `devant?(a, b)` : a est devant (couvre b) s'il est STRICTEMENT plus bas à l'écran — origine en haut à gauche, donc plus grand y = plus devant. Égalité → false.

一行代码造出来

Écris `nouveau_sprite(x, y)` : renvoie le hash complet avec les défauts du jeu — `l` et `h` à 32, `image` à "carre" — et les coordonnées reçues prises telles quelles.

第 6 课:OK

Sans aide : `collision(a, b)` — true si les deux rectangles se chevauchent (strictement). Toucher bord à bord ne compte PAS : le bord appartient au voisin.

分享这一课

← 全部课程

📄 备忘单

打印出来贴显示器上,就当是你自己的主意

📄 备忘单 — 什么是精灵?

你的英雄没有灵魂:它有一个 hash。矩形、图片、数据。就这些。

精灵,拆开看

sprite = {
  "x" => 10,     # 从哪开始(左上角)
  "y" => 20,
  "l" => 32,     # 宽
  "h" => 32,     # 高
  "image" => "carre"   # 装扮,画在【上面】
}

四个数字 + 一张图。 把图拿掉 → 剩下方块。这就是你的角色。

占地:真正碰撞的东西

def touche?(sprite, px, py)
  px >= sprite["x"] && px < sprite["x"] + sprite["l"] &&
  py >= sprite["y"] && py < sprite["y"] + sprite["h"]
end
  • 原点在左上:x 向右,y 向下(屏幕就是这样)。
  • < 而不是 <=:右边那条边属于邻居。贴边 = 不算碰撞。
  • 你从没撞过墙——你撞的是坐标。

两个相遇的矩形

def collision(a, b)
  a["x"] < b["x"] + b["l"] && b["x"] < a["x"] + a["l"] &&
  a["y"] < b["y"] + b["h"] && b["y"] < a["y"] + a["h"]
end

各自都要在对方终点的左边,两个轴都要。参数顺序无所谓(测一下: collision(a, b) == collision(b, a)——游戏里真有这个检查 😉)。

后面 / 前面

def devant?(a, b)
  a["y"] > b["y"]    # 屏幕上更靠下 = 盖住上面那个
end

不用 >=:平局时谁也不「赢」。(和矩形边同一口气——规则不写一半。)

换装扮(不弄坏原件)

sprite.merge("image" => "fantome")   # 复制
sprite.merge!(…)                     # 不——这会改原件。经典坑。

一句话解锁全部

矩形、图片、数据。 现在——让它动起来。(→ 第 7 课:x、y、速度、循环。)

以后别再说

  • 「我的角色会动」 → 它要到第 7 课才会动;在这里它勉强存在
  • 「精灵有个大小」 → l 和 h 是你给它的。它没开口要过。

SlopCourse Microduck — 从 slop 到干净的代码。