☰ ←

创造工坊使用接口

← 左滑打开目录

创造工坊充值/打赏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:

HTML + JavaScript
<!-- 打赏按钮样式 -->
<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文件都长这样,你可以直接复制用:

HTML
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>我的第一个游戏</title>
</head>
<body>
  <!-- 这里写你想显示的内容 -->
  <h1>你好世界</h1>
</body>
</html>

你看,就这么简单。<head>里放一些设置,<body>里放玩家能看到的东西。

常用标签一览

做游戏常用的就这几个,记住它们够用了:

给元素加样式

光有标签不够,还得好看。样式写在 <style> 标签里,放在 <head> 中:

CSS
<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> 里:

HTML + JS
<button onclick="sayHi()">点我</button>

<script>
function sayHi(){
  alert("你点了我!");
}
</script>

就这么简单。onclick 是说点击的时候执行哪个函数,函数里写你想做的事。

小建议:刚开始不用记所有标签,用到哪个查哪个。先把上面的代码复制到创作页跑起来,看到效果了再慢慢改,比死记硬背快得多。

变量与创建

你已经学会了基础的编程,能写出静态的页面了。但游戏是会动的,得分会变、血量会掉、时间会走,这些都靠变量来存。接下来教你如何使用变量和创建。

变量是什么?

你可以把变量想象成一个贴了标签的盒子。盒子里可以放数字、文字、真假。你随时可以打开看看里面是什么,也可以换掉里面的东西。做游戏离不开它。

怎么创建变量

用 let 或者 const 来创建:

JavaScript
// 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:

JavaScript
if(score >= 100){
  alert("恭喜通关!");
}else if(score >= 50){
  alert("继续加油!");
}else{
  alert("才刚开始呢");
}

循环:批量做事

比如你要在屏幕上放10只小鸡,总不能写10遍代码吧?用循环:

JavaScript
for(let i=0; i<10; i++){
  console.log("这是第" + i + "只小鸡");
}
记住:变量是盒子,if是判断,for是重复。这三样东西掌握了,大部分小游戏逻辑都能写出来。剩下的就是熟练度问题,多写几个自然就会了。

成为创作者

很多人问,成为创作者有什么好处?我为啥要花时间做游戏?这一页把话说清楚。

成为创作者有什么好处?

  1. 你可以使用充值接口来让玩家们打赏,给你获得收益。玩家喜欢你的游戏,点一下打赏按钮,R币就直接进你账户了。R币虽然是平台货币,但积少成多,而且这是对你作品的认可。
  2. 你可以创建HTML内容,可以包含JS。也就是说你能做的不只是简单的网页,而是完整的交互游戏、小工具、动画,甚至是复杂的应用。上限很高,就看你本事。
  3. 让更多人查看你的作品。上传之后游戏会出现在首页,所有玩家都能看到、能玩、能评论。做得好还会上排行榜,曝光量更大。

知道这些好处之后,如何成为创作者?

其实根本没有什么申请流程。一开始进入的玩家就是创作者,只需要点击底部中间的加号按钮,就能进入创作页面开始上传你的第一个作品。

没错,零门槛。不需要审核身份,不需要交押金,注册登录之后直接就能创作。平台相信每一个人都有做出好东西的潜力。

第一次上传的步骤

  1. 点底部中间的蓝色圆形创作按钮,进入创作页
  2. 上传一个游戏图标(正方形图片就行)
  3. 填写游戏介绍,告诉玩家这游戏怎么玩
  4. 把你的HTML代码粘贴进去,或者直接上传HTML文件
  5. 点上传按钮,等1.5秒审核
  6. 审核通过就自动出现在首页了

审核是怎么回事?

上传之后系统会自动检查你的代码和介绍里有没有违规内容。没有的话秒过,直接展示。如果有问题,游戏不会在首页出现,但你在个人主页里能看到它标着"违规"标签,点一下能看到具体原因,改完重新上传就行。

怎么让更多人玩你的游戏?

创作者的收益从哪来?

目前主要是玩家打赏。你在游戏里嵌入打赏按钮(第一页有完整代码),玩家消耗自己的R币打赏,R币直接到你账户。你可以用这些R币打赏别的创作者,或者在平台内消费。

后续平台还会开放更多变现方式,比如广告分成、付费游戏等,创作者越早入驻越有优势。

提醒:不要用刷赞、刷游玩量的手段,系统会检测。老老实实做游戏,好作品自然有人玩。

扩展HTML与JS

基础的东西你都会了,这一页讲点进阶的。掌握了这些,你做出来的东西就不像是练习作品,而是真正能拿得出手的游戏。

Canvas画布:做2D游戏的核心

之前我们用div拼元素,做简单界面还行,但做游戏就不够用了。Canvas是一块画布,你可以在上面画任何东西,而且速度很快。

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");

几个实用技巧

最后说一句:编程这东西,看十遍不如写一遍。把上面的例子一个个复制到创作页跑起来,改改参数看看效果,比看任何教程都管用。遇到bug很正常,打印日志一步步查,每个大神都是从bug堆里爬出来的。
第 1 / 5 页