Bendi新闻
>
这款中国程序员开源的游戏引擎,让你用不到100行代码就写出“愤怒的小鸟”
这款中国程序员开源的游戏引擎,让你用不到100行代码就写出“愤怒的小鸟”
4月前
大家好,我是一个游戏引擎技术探索者,同时也是一名做过不少前端开发工作的程序员。如果你想知道如何从编写网页到开发游戏,那你来对地方了!
不必担心,说到游戏引擎并不是啥高不可攀的技术,反而和我们熟悉的前端开发工具可以有惊人相似之处。
一、游戏客户端开发也可以是一种前端开发
二、从 TypeScript 到 TSX:前端技术在游戏中的应用
三、挑战 100 行代码以内,教你写一个 “愤怒的小鸟” like 的游戏
(https://dora-ssr.net/zh-Hans/docs/tutorial/quick-start)
不小心装成了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 中显示一个图片很简单,只要使用 <sprite>
标签,最后通过 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<Body.Type>();
const score = useRef<Label.Type>();
4. 创建发射线
line
变量创建,并添加触摸(同时也是鼠标点击)的事件处理:let start = Vec2.zero;
let delta = Vec2.zero;
const line = Line();
toNode(
<physics-world
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();
}}
>
{/* ...在物理世界下创建其它游戏元素 ... */}
</physics-world>
);
在 onTapBegan
事件中,记录触摸开始的位置并清除发射线。在 onTapMoved
事件中,计算触摸移动的距离并更新发射线。在 onTapEnded
事件中,根据触摸移动的距离设置小鸟的发射速度并清除发射线。
5. 创建其它游戏元素
接下来,我们以 <physics-world>
作为游戏场景的父级标签,在它下面继续创建游戏场景中的各个元素:
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}>0</label>
<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. 完成游戏逻辑
拖拽屏幕发射了“愤怒的小鸟”
高超的技巧,使我一击获得了所有得分
四、简单揭秘一下
1. 是鹿还是马
(https://github.com/TypeScriptToLua/Typ eScriptToLua )
2. 和 React 有关系吗
512620381
延伸阅读:用Rust开发跨平台游戏是怎样的体验?
作者介绍
李瑾:金融行业大数据工程师,Dora SSR 和 Yuescript 开源软件作者。
项目介绍
Dora SSR(多萝珍奇引擎)是一个用于多种设备上快速开发2D游戏的游戏引擎。
它内置易用的开发工具链,支持在手机、开源掌机等设备上直接进行游戏开发。
项目仓库
https://gitee.com/pig/Dora-SSR
https://github.com/IppClub/Dora-SSR
END
热门文章
- 想体验Xcode 16的“AI编程”?16GB内存起步——“苹果不等式”破防了
微信扫码关注该文公众号作者
来源:OSC开源社区
相关新闻
看不惯收费应用坑小白,程序员“冲冠一怒”——开发开源免费软件“踢馆”、写得比付费的更好用数十万字秒读,2分钟出PPT!李开复推荐的「万知」AI助手,小程序免费用不想让孩子变身“小汗娃”,你就缺这一件!自动排汗又干爽,比纯棉的还好穿周小平:重磅!过不了多久中国航天员就会亲手摸到美国载人登月遗留物。所以别再用“画面破绽”来否定美国载人登月,这泼天的流量真接不住这款“出世”的游戏,用一年时间带千万玩家“入世”开源日报 | 构建一个类似英伟达CUDA的开源生态;“AI程序员”大杀四方,人类程序员开始反击;Podman 5.0发布会写代码的总理!全球第一 “开源” 名门望族会写代码的总理!全球第一“开源”名门望族多邻国中国负责人杨令开:被「小绿鸟」硬控的五年|此话当真 EP24让举重运动员“举起生活的轻”,这是2024开年最治愈的广告不到百元!比某果、某为还好用!这款智能手表界的“劳斯莱斯”也太强了~这4个小习惯,让你变成“不缺钱不缺爱”的人奥特曼进军搜索,谷歌慌了!让谷歌股价暴跌的“大杀器”三个月前就被程序员摸透了!生源减少,多地现民办幼儿园停办,有的“上个月还在招生”!这地有幼师吐槽:既要招生还要当保育员,月工资不到3000元Rust 编写的 Zed 编辑器开源:约 27 万行代码、主打“高性能”Rust编写的Zed编辑器开源:约27万行代码、主打“高性能”大作炸场的五月档,这款“小众游戏”靠像素单机突围?拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~夏天就是要买漂亮的小裙子!这几款,能让你经验整个夏天!LEO干货:没有北上广深的资源和机会,来自“小地方”的你该如何在这件事上提高胜算?Telegram海南演讲“在中国拉人”:TG的小游戏MAU已有4000万!独立开发8年的软件,开源并让大家“白嫖”,我赚得更多了上网就能 “生产能源” 的浏览器,这你受得了吗?不到百元的「十二生肖」朱砂手链,让你龙年“朱”事顺利!