创造工坊充值/打赏R币接口
亲爱的创作者,众所周知,想要获得R币使用的时候却总是只想着看广告,而广告每一天只有十次。呃,如果你是创作者的话,你可以应用上HTML代码中的充值接口,应用于打赏等等使用。
注意:最多只能充值或打赏 15000 R币,并且打赏之后会直接到账给开发者。使用的时候请在 Received user name/id 填上自己的名字或者ID,否则将无法打赏给你。
接口说明
| 项目 | 说明 |
|---|
| 请求方式 | POST |
| 接口地址 | /api/rc |
| 内容类型 | application/json |
请求参数
| 参数 | 类型 | 说明 |
|---|
amt | 整数 | 打赏金额,范围 1~15000 |
tu | 字符串 | 接收者用户名或用户ID |
返回字段
| 字段 | 说明 |
|---|
s | 是否成功 |
m | 状态码 |
nb | 打赏后剩余R币 |
tn | 接收者用户名 |
以下是代码
将下面的代码复制到你的游戏HTML中,修改 RECEIVER_NAME 为你的用户名或ID:
<!-- 打赏按钮样式 -->
<style>
.tip-btn{position:fixed;bottom:20px;right:20px;z-index:9999;
padding:10px 18px;background:linear-gradient(135deg,#ffd700,#ffb300);
color:#1a237e;border:none;border-radius:24px;font-size:14px;
font-weight:700;cursor:pointer;box-shadow:0 4px 12px rgba(255,179,0,.4)}
.tip-box{position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:10000;
display:none;align-items:center;justify-content:center}
.tip-box.show{display:flex}
.tip-card{background:#fff;border-radius:16px;padding:24px;width:80%;max-width:320px;text-align:center}
.tip-card h3{margin-bottom:16px;font-size:18px}
.tip-card input{width:100%;padding:12px;margin-bottom:12px;border:1px solid #ddd;border-radius:8px;font-size:16px;box-sizing:border-box}
.tip-card button{width:100%;padding:12px;border:none;border-radius:8px;font-size:15px;font-weight:600;cursor:pointer;margin-top:6px}
.tip-ok{background:linear-gradient(135deg,#4a7dff,#3b5fe0);color:#fff}
.tip-cancel{background:#f0f0f0;color:#666}
</style>
<button class="tip-btn" onclick="showTip()">打赏 R 币</button>
<div class="tip-box" id="tipBox">
<div class="tip-card">
<h3>打赏作者</h3>
<input type="number" id="tipAmt" placeholder="打赏R币数量(1-15000)" min="1" max="15000">
<button class="tip-ok" onclick="doTip()">确认打赏</button>
<button class="tip-cancel" onclick="closeTip()">取消</button>
</div>
</div>
<script>
const RECEIVER_NAME = "你的用户名";
function showTip(){document.getElementById("tipBox").classList.add("show");}
function closeTip(){document.getElementById("tipBox").classList.remove("show");}
async function doTip(){
const amt = parseInt(document.getElementById("tipAmt").value);
if(!amt||amt<1||amt>15000){alert("请输入1-15000之间的数量");return;}
try{
const r=await fetch("/api/rc",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({amt:amt,tu:RECEIVER_NAME})});
const d=await r.json();
if(d.s){alert("打赏成功!感谢支持");closeTip();}
else{const msg={NB:"R币余额不足",TU:"接收者不存在",SF:"不能打赏给自己",AR:"金额超出范围",NL:"请先登录"};alert(msg[d.m]||"打赏失败");}
}catch(e){alert("网络错误,请重试");}
}
</script>
提示:玩家必须登录并拥有足够R币才能打赏。打赏成功后R币立即转入你的账户。
错误码说明
| 错误码 | 含义 |
|---|
NL | 未登录 |
AR | 金额超出范围 |
NB | 余额不足 |
TU | 接收者不存在 |
SF | 不能打赏给自己 |
开始你的编程
欢迎创作者,你第一次熟悉这个游戏的编程,很多代码都不懂,没关系,谁都是从这一步过来的。接下来我们会教你一些HTML代码,看完这一页你就能写出自己的第一个网页了。
HTML到底是什么?
HTML就像是盖房子的图纸。你写一行代码,浏览器就照着图纸搭出一个元素。比如你写一个按钮的代码,屏幕上就真的出现一个按钮。它不是什么高深的东西,就是一堆标签拼起来的。
最基本的结构
每一个HTML文件都长这样,你可以直接复制用:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>我的第一个游戏</title>
</head>
<body>
<!-- 这里写你想显示的内容 -->
<h1>你好世界</h1>
</body>
</html>
你看,就这么简单。<head>里放一些设置,<body>里放玩家能看到的东西。
常用标签一览
做游戏常用的就这几个,记住它们够用了:
<h1> 到 <h6>:标题,h1最大,h6最小
<p>:一段文字
<button>:按钮,玩家可以点
<div>:一个盒子,用来装其他东西,最常用
<img>:放图片
<input>:输入框,让玩家打字
<canvas>:画布,做2D游戏全靠它
给元素加样式
光有标签不够,还得好看。样式写在 <style> 标签里,放在 <head> 中:
<style>
body{
background: #87CEEB; /* 天蓝色背景 */
margin: 0; /* 去掉默认边距 */
}
.my-btn{
padding: 12px 24px;
background: #ff6b6b;
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
cursor: pointer; /* 鼠标移上去变小手 */
}
</style>
注意,样式里用 .类名 来选择元素,然后在HTML里用 class="my-btn" 关联起来。这是最基本的用法。
让按钮能点击
按钮点了没反应可不行。这时候需要一点点JavaScript,写在 <script> 里:
<button onclick="sayHi()">点我</button>
<script>
function sayHi(){
alert("你点了我!");
}
</script>
就这么简单。onclick 是说点击的时候执行哪个函数,函数里写你想做的事。
小建议:刚开始不用记所有标签,用到哪个查哪个。先把上面的代码复制到创作页跑起来,看到效果了再慢慢改,比死记硬背快得多。
变量与创建
你已经学会了基础的编程,能写出静态的页面了。但游戏是会动的,得分会变、血量会掉、时间会走,这些都靠变量来存。接下来教你如何使用变量和创建。
变量是什么?
你可以把变量想象成一个贴了标签的盒子。盒子里可以放数字、文字、真假。你随时可以打开看看里面是什么,也可以换掉里面的东西。做游戏离不开它。
怎么创建变量
用 let 或者 const 来创建:
// let 创建的变量可以改
let score = 0; // 分数,一开始是0
let playerName = "小明"; // 玩家名字
let isGameOver = false; // 游戏结束了吗?
// const 创建的变量不能改,用来存固定值
const MAX_TIME = 120; // 游戏最多120秒
// 改值直接赋值就行
score = score + 1; // 分数加1
score++; // 这也是加1,更简洁
变量能存哪些东西
| 类型 | 例子 | 用途 |
| 数字 | let hp = 100; | 分数、血量、时间、坐标 |
| 字符串 | let name = "勇者"; | 名字、提示文字 |
| 布尔 | let alive = true; | 判断状态,只有真或假 |
| 数组 | let items = [1,2,3]; | 存一堆东西,比如子弹列表 |
| 对象 | let p = {x:10,y:20}; | 存一个东西的多个属性 |
用变量做个计数器
光说不练假把式,下面是一个完整的点击计数例子,看懂了变量你就入门了:
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"></head>
<body>
<h1>点击次数:<span id="count">0</span></h1>
<button onclick="addOne()">点我+1</button>
<button onclick="reset()">清零</button>
<script>
let count = 0; // 创建变量,存点击次数
function addOne(){
count++; // 变量加1
document.getElementById("count").innerText = count; // 更新屏幕显示
}
function reset(){
count = 0; // 变量归零
document.getElementById("count").innerText = count;
}
</script>
</body>
</html>
注意看,document.getElementById("count") 是找到页面上那个id为count的元素,然后 .innerText = count 把变量的值显示上去。这是JS操作页面最常用的写法。
条件判断:让游戏有脑子
光有变量不够,还得根据变量的值做不同的事。用 if:
if(score >= 100){
alert("恭喜通关!");
}else if(score >= 50){
alert("继续加油!");
}else{
alert("才刚开始呢");
}
循环:批量做事
比如你要在屏幕上放10只小鸡,总不能写10遍代码吧?用循环:
for(let i=0; i<10; i++){
console.log("这是第" + i + "只小鸡");
}
记住:变量是盒子,if是判断,for是重复。这三样东西掌握了,大部分小游戏逻辑都能写出来。剩下的就是熟练度问题,多写几个自然就会了。
成为创作者
很多人问,成为创作者有什么好处?我为啥要花时间做游戏?这一页把话说清楚。
成为创作者有什么好处?
- 你可以使用充值接口来让玩家们打赏,给你获得收益。玩家喜欢你的游戏,点一下打赏按钮,R币就直接进你账户了。R币虽然是平台货币,但积少成多,而且这是对你作品的认可。
- 你可以创建HTML内容,可以包含JS。也就是说你能做的不只是简单的网页,而是完整的交互游戏、小工具、动画,甚至是复杂的应用。上限很高,就看你本事。
- 让更多人查看你的作品。上传之后游戏会出现在首页,所有玩家都能看到、能玩、能评论。做得好还会上排行榜,曝光量更大。
知道这些好处之后,如何成为创作者?
其实根本没有什么申请流程。一开始进入的玩家就是创作者,只需要点击底部中间的加号按钮,就能进入创作页面开始上传你的第一个作品。
没错,零门槛。不需要审核身份,不需要交押金,注册登录之后直接就能创作。平台相信每一个人都有做出好东西的潜力。
第一次上传的步骤
- 点底部中间的蓝色圆形创作按钮,进入创作页
- 上传一个游戏图标(正方形图片就行)
- 填写游戏介绍,告诉玩家这游戏怎么玩
- 把你的HTML代码粘贴进去,或者直接上传HTML文件
- 点上传按钮,等1.5秒审核
- 审核通过就自动出现在首页了
审核是怎么回事?
上传之后系统会自动检查你的代码和介绍里有没有违规内容。没有的话秒过,直接展示。如果有问题,游戏不会在首页出现,但你在个人主页里能看到它标着"违规"标签,点一下能看到具体原因,改完重新上传就行。
怎么让更多人玩你的游戏?
- 图标做好看点:首页那么多游戏,玩家第一眼看到的就是图标,好看的图标点击率高很多
- 介绍写清楚:一句话说清玩法,别写一堆废话
- 加入打赏按钮:参考第一页的接口代码,让喜欢你的玩家能支持你
- 多更新:在个人主页长按作品可以更新,每次更新相当于重新曝光
- 冲排行榜:点赞过100、游玩过1000就能上排行榜,那是流量最大的地方
创作者的收益从哪来?
目前主要是玩家打赏。你在游戏里嵌入打赏按钮(第一页有完整代码),玩家消耗自己的R币打赏,R币直接到你账户。你可以用这些R币打赏别的创作者,或者在平台内消费。
后续平台还会开放更多变现方式,比如广告分成、付费游戏等,创作者越早入驻越有优势。
提醒:不要用刷赞、刷游玩量的手段,系统会检测。老老实实做游戏,好作品自然有人玩。
扩展HTML与JS
基础的东西你都会了,这一页讲点进阶的。掌握了这些,你做出来的东西就不像是练习作品,而是真正能拿得出手的游戏。
Canvas画布:做2D游戏的核心
之前我们用div拼元素,做简单界面还行,但做游戏就不够用了。Canvas是一块画布,你可以在上面画任何东西,而且速度很快。
<canvas id="game" width="400" height="600"></canvas>
<script>
const canvas = document.getElementById("game");
const ctx = canvas.getContext("2d");
// 画一个红色矩形
ctx.fillStyle = "red";
ctx.fillRect(50, 50, 100, 80); // x, y, 宽, 高
// 画一个圆
ctx.beginPath();
ctx.arc(200, 300, 30, 0, Math.PI*2); // x, y, 半径, 起始角, 结束角
ctx.fillStyle = "blue";
ctx.fill();
// 写文字
ctx.fillStyle = "black";
ctx.font = "20px Arial";
ctx.fillText("得分: 0", 10, 30);
</script>
游戏循环:让画面动起来
游戏本质上就是一张一张快速切换的画面。用 requestAnimationFrame 做游戏循环,浏览器会自动帮你调到60帧:
let x = 0;
function update(){
x += 2; // 每帧x加2,方块就向右移动了
if(x > 400) x = 0;
}
function draw(){
ctx.clearRect(0,0,400,600); // 清屏
ctx.fillStyle = "red";
ctx.fillRect(x, 200, 50, 50);
}
function loop(){
update(); // 更新数据
draw(); // 画出来
requestAnimationFrame(loop); // 下一帧继续
}
loop(); // 启动
记住这个结构:update改数据,draw画画面,loop循环调用。几乎所有2D游戏都是这个套路。
键盘和触摸控制
玩家怎么操作游戏?监听事件就行:
let keys = {};
// 键盘按下
document.addEventListener("keydown", function(e){
keys[e.key] = true;
});
document.addEventListener("keyup", function(e){
keys[e.key] = false;
});
// 在update里判断
function update(){
if(keys["ArrowLeft"]) x -= 5;
if(keys["ArrowRight"]) x += 5;
}
// 手机触摸
canvas.addEventListener("touchstart", function(e){
e.preventDefault();
const touch = e.touches[0];
const rect = canvas.getBoundingClientRect();
const tx = touch.clientX - rect.left;
const ty = touch.clientY - rect.top;
// tx, ty 就是玩家点的位置
});
碰撞检测
游戏里最常见的逻辑就是"碰到了没"。矩形碰撞最简单:
function isCollide(a, b){
return a.x < b.x + b.w &&
a.x + a.w > b.x &&
a.y < b.y + b.h &&
a.y + a.h > b.y;
}
// 用法
if(isCollide(player, enemy)){
alert("撞到了!");
}
用对象管理游戏元素
游戏里有很多子弹、敌人,一个个写变量会疯掉。用数组存对象:
let bullets = [];
// 发射子弹
function shoot(){
bullets.push({x: player.x, y: player.y, speed: 8});
}
// 更新所有子弹
function updateBullets(){
for(let i = bullets.length-1; i >= 0; i--){
bullets[i].y -= bullets[i].speed;
if(bullets[i].y < 0){
bullets.splice(i, 1); // 飞出屏幕就删掉
}
}
}
注意循环要从后往前删,不然删元素的时候索引会乱。这是新手最容易踩的坑。
本地存储:记住玩家的数据
想让玩家关掉网页再打开,分数还在?用 localStorage:
// 存
localStorage.setItem("highScore", score);
// 取
let highScore = localStorage.getItem("highScore") || 0;
// 删
localStorage.removeItem("highScore");
几个实用技巧
- 图片预加载:游戏开始前把所有图片加载完,避免玩的时候卡顿
- 用deltaTime:不同手机帧率不一样,用时间差计算移动距离,保证速度一致
- 音效用Audio:
new Audio("xxx.mp3").play() 就能播放
- 防止页面滚动:游戏里加
touchmove 事件阻止默认行为
- 适配屏幕:用
window.innerWidth 获取屏幕宽,动态调整canvas大小
最后说一句:编程这东西,看十遍不如写一遍。把上面的例子一个个复制到创作页跑起来,改改参数看看效果,比看任何教程都管用。遇到bug很正常,打印日志一步步查,每个大神都是从bug堆里爬出来的。