這款中國程序員開源的遊戲引擎,讓你用不到100行代碼就寫出“憤怒的小鳥”
大家好,我是一個遊戲引擎技術探索者,同時也是一名做過不少前端開發工作的程序員。如果你想知道如何從編寫網頁到開發遊戲,那你來對地方了!
不必擔心,說到遊戲引擎並不是啥高不可攀的技術,反而和我們熟悉的前端開發工具可以有驚人相似之處。
一、遊戲客戶端開發也可以是一種前端開發
二、從 TypeScript 到 TSX:前端技術在遊戲中的應用
三、挑戰 100 行代碼以內,教你寫一個 “憤怒的小鳥” like 的遊戲
(https://dora-ssr.net/zh-Hans/docs/tutorial/quick-start)
![](https://img1.headline01.com/images/dc/54/dc549bd803f1e5160b05449f0ecb21e16262692b.jpg?wx_fmt=jpeg&from=appmsg)
不小心裝成了APK包在手機上?那就在同局域網下訪問,直接在手機上進行開發調試吧
1. 編寫最簡單遊戲場景
// @preview-file on
import { React, toNode, useRef } from 'DoraX';
import { Body, BodyMoveType, Ease, Label, Line, Scale, TypeName, Vec2, tolua } from 'Dora';
在 Dora SSR 中顯示一個圖片很簡單,只要使用
標籤,最後通過 toNode()
函數將標籤實例化爲一個遊戲對象就可以了。
toNode(<sprite file='Image/logo.png' scaleX={0.2} scaleY={0.2}/>);
2. 編寫遊戲箱子組件
Box
組件定義,它接受num
、x
、y
和 children
等屬性:interface BoxProps {
num: number;
x?: number;
y?: number;
children?: any | any[];
}
const Box = (props: BoxProps) => {
const numText = props.num.toString();
return (
<body type={BodyMoveType.Dynamic} scaleX={0} scaleY={0} x={props.x} y={props.y} tag={numText}>
<rect-fixture width={100} height={100}/>
<draw-node>
<rect-shape width={100} height={100} fillColor={0x8800ffff} borderWidth={1} borderColor={0xff00ffff}/>
draw-node>
<label fontName='sarasa-mono-sc-regular' fontSize={40}>{numText}label>
{props.children}
body>
);
};
body
組件的tag
屬性:用於存儲箱子的分數。rect-fixture
:定義了箱子的碰撞形狀。draw-node
:用於繪製箱子的外觀。label
:用於顯示盒子的分數。
3. 創建 TSX 實例化後的對象引用
const bird = useRef ();
const score = useRef();
4. 創建發射線
line
變量創建,並添加觸摸(同時也是鼠標點擊)的事件處理:let start = Vec2.zero;
let delta = Vec2.zero;
const line = Line();
toNode(
onTapBegan={(touch) => {
start = touch.location;
line.clear();
}}
onTapMoved={(touch) => {
delta = delta.add(touch.delta);
line.set([start, start.add(delta)]);
}}
onTapEnded={() => {
if (!bird.current) return;
bird.current.velocity = delta.mul(Vec2(10, 10));
start = Vec2.zero;
delta = Vec2.zero;
line.clear();
}}
>
{/* ...在物理世界下創建其它遊戲元素 ... */}
);
在 onTapBegan
事件中,記錄觸摸開始的位置並清除發射線。在 onTapMoved
事件中,計算觸摸移動的距離並更新發射線。在 onTapEnded
事件中,根據觸摸移動的距離設置小鳥的發射速度並清除發射線。
5. 創建其它遊戲元素
接下來,我們以
作爲遊戲場景的父級標籤,在它下面繼續創建遊戲場景中的各個元素:
5.1 地面
body
組件創建一個地面,並將其設置爲靜態剛體:<body type={BodyMoveType.Static}>
<rect-fixture centerY={-200} width={2000} height={10}/>
<draw-node>
<rect-shape centerY={-200} width={2000} height={10} fillColor={0xfffbc400}/>
draw-node>
body>
type={BodyMoveType.Static}
:表明這是一個靜態剛體,不會受到物理模擬的影響。rect-fixture
:定義地面碰撞形狀爲一個矩形。draw-node
:用於繪製地面的外觀。rect-shape
:繪製一個矩形,顏色爲黃色。
5.2 箱子
Box
組件創建 5 個箱子,並設置不同的初始位置和分數,在創建時播放出場動畫:{
[10, 20, 30, 40, 50].map((num, i) => (
<Box num={num} x={200} y={-150 + i * 100}>
<sequence>
<delay time={i * 0.2}/>
<scale time={0.3} start={0} stop={1}/>
sequence>
Box>
))
}
map
函數:用於遍歷分數數組從 10 到 50,併爲每個分數創建一個需要小鳥撞擊的箱子。Box
組件:用於創建箱子,並傳入以下屬性:num={num}
:箱子的分數,對應數組中的數字。x={200}
:箱子的初始 x 軸位置,爲 200。y={-150 + i * 100}
:箱子的初始 y 軸位置,根據創建序號遞增。sequence
組件:用於創建要在父節點上播放的動畫序列,包含以下動畫:delay time={i * 0.2}
:延遲播放動畫,延遲時間根據創建序號遞增。scale time={0.3} start={0} stop={1}
:縮放動畫,從不顯示到完全顯示,耗時 0.3 秒。
5.3 小鳥
最後,我們使用 body
組件創建小鳥,並設置碰撞形狀、外觀和分數標籤:
<body ref={bird} type={BodyMoveType.Dynamic} x={-200} y={-150} onContactStart={(other) => {
if (other.tag !== '' && score.current) {
// 累加積分
const sc = parseFloat(score.current.text) + parseFloat(other.tag);
score.current.text = sc.toString();
// 清除被撞箱子上的分數
const label = tolua.cast(other.children?.last, TypeName.Label);
if (label) label.text = '';
other.tag = '';
// 播放箱子被撞的動畫
other.perform(Scale(0.2, 0.7, 1.0));
}
}}>
<disk-fixture radius={50}/>
<draw-node>
<dot-shape radius={50} color={0xffff0088}/>
draw-node>
<label ref={score} fontName='sarasa-mono-sc-regular' fontSize={40}>0label>
<scale time={0.4} start={0.3} stop={1.0} easing={Ease.OutBack}/>
body>
ref={bird}
:使用ref
創建引用變量,方便後續操控小鳥。type={BodyMoveType.Dynamic}
:表明這是一個動態剛體,會受到物理模擬的影響。onContactStart={(other) => {}}
:小鳥的物理體接觸到其它物體時觸發的回調處理函數。disk-fixture
:定義小鳥形狀爲一個圓盤。draw-node
:用於繪製小鳥的外觀。label
:用於顯示小鳥的累積分數。scale
:用於播放小鳥的出場動畫。
6. 完成遊戲邏輯
![](https://img1.headline01.com/images/8a/0e/8a0ec35e0a9f19b9a4ce3ade4538a8998c437f37.jpg?wx_fmt=png&from=appmsg)
拖拽屏幕發射了“憤怒的小鳥”
高超的技巧,使我一擊獲得了所有得分
四、簡單揭祕一下
1. 是鹿還是馬
(https://github.com/TypeScriptToLua/Typ eScriptToLua )
2. 和 React 有關係嗎
512620381
延伸閱讀:用Rust開發跨平臺遊戲是怎樣的體驗?
作者介紹
李瑾:金融行業大數據工程師,Dora SSR 和 Yuescript 開源軟件作者。
項目介紹
Dora SSR(多蘿珍奇引擎)是一個用於多種設備上快速開發2D遊戲的遊戲引擎。
它內置易用的開發工具鏈,支持在手機、開源掌機等設備上直接進行遊戲開發。
![](https://img1.headline01.com/images/31/ec/31ec28f743344e84c4ee78db39c59b1288221c80.jpg?wx_fmt=other&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
項目倉庫
https://gitee.com/pig/Dora-SSR
https://github.com/IppClub/Dora-SSR
END
熱門文章
- 想體驗Xcode 16的“AI編程”?16GB內存起步——“蘋果不等式”破防了
- 拜登政府全面禁售知名殺軟“卡巴斯基”
- “鴨子數據庫”正式發佈1.0穩定版:C++引擎代碼超30萬行
- Linus眼中“很爛”的C++擊敗了C語言
- 開發者直接複製ChatGPT生成的代碼,導致公司損失10000美元