开维游戏引擎(Kaiwei Engine)是基于js设计的跨平台游戏引擎。内核c++编写,v8引擎封装游戏函数,Assembly实现htm跨平台高效运行。下面以抖音中的“跑车特效”为例,用AI自动生成游戏代码,生成的代码不用修改可直接运行。

开维游戏引擎js代码跨平台通用,一次编写,多端运行。支持导出exe和网页html,网页使用wasm运行,一般的小游戏运行效率网页版和exe没有太大差别,比原生javacript游戏引擎运行速度快几倍。

开维游戏引擎适合AI写小游戏、特效或功能模块。利用AI模型自动生成特效代码,代码短小精炼,函数简单易懂,200行左右即可完成独立功能。导出的html网页可以内嵌到各种网站、安卓苹果手机app中。

AI模型应用:示例代码中包含几乎所有基本控件函数,可以给AI 模型,例如:DeepSeek,Gemini,豆包等。

AI游戏生成:以示例为基础自动生成AI游戏代码,例如贪吃蛇、飞机大战、烟花特效等。

AI提示文本:“下面是开维游戏引擎的代码演示,根据这个代码,写一个类似抖音送跑车的实例。 代码如下:(示例代码)”。

AI平台:Gemini,DeepSeek
以下是两个AI平台根据示例生成的代码运行效果,可以看到明显区别。
Gemini生成代码时,会自动询问用户:

  1. 需要我为您详细写出跑车“怠速抖动”和“尾气粒子”的代码模块吗?
  2. 想试试给跑车加上变色特效(比如通过 setColor 让车身闪烁七彩光芒)吗?
  3. 需要我帮你再加一个**“礼物连击”**功能吗?(比如快速点击按钮时,屏幕上显示 x 1 , x 2 , x 3... x1, x2, x3... x1,x2,x3... 的数字特效)
  4. 还有什么细节想微调的吗?比如给跑车加个“氮气喷射”的蓝色火焰?
  5. 现在你的跑车已经具备了入场、变色、震动、连击、氮气、加速离场的所有功能。直接运行,感受这种满级特效的爽快感吧!还需要在跑车离场时加一点**“震动屏幕”**的晃动特效来增强冲击力吗?
    最终生成的代码特效非常好。DeepSeek生成代码后,没有询问如何优化,需要用户自己询问。

Gemini生成代码运行效果:

抖音超跑特效,gemini自动生成

DeepSeek生成代码运行效果:

抖音超跑特效,deepseek代码自动生成

Gemini生成的跑车代码,可以直接运行:

/**
 * 开维游戏引擎 - 氮气加速超跑特效
 * 新增:
 * 1. 氮气粒子(Nitro):离场时喷射蓝色高亮火焰。
 * 2. 动态姿态:进场抬头、离场俯冲。
 * 3. 线性加速:离场时速度逐渐爆发。
 */

game.init(); 
game.setFPS(60); 

var scene = new Scene();
var screenW = 800;
var screenH = 600;

var resBg = game.getResource().getTexture("img/bg.png");
scene.setBg(resBg);

var audio = new Audio();
audio.setSoundVolume(1.0); 

var resCar = game.getResource().getTexture("img/car.png");      
var resGiftBg = game.getResource().getTexture("img/gift_bg.png"); 

var animState = 0; 
var timer = 0;
var exhaustParticles = []; // 普通尾气
var nitroParticles = [];   // 氮气火苗
var frameCount = 0;
var comboCount = 0;      
var comboTimer = 0;      
var comboScale = 1.0;    

// UI 控件
var giftBanner = new Label();
giftBanner.setTexture(resGiftBg);
giftBanner.setSize(250, 60);
giftBanner.setPosition(50, 100); 
giftBanner.setFont("font/st.ttf", 20);
giftBanner.setText("  神豪 送出 氮气超跑");
giftBanner.setColor(255, 0, 0, 0.2);    
giftBanner.setTextColor(255, 0, 0, 1);   
scene.addNode(giftBanner);

var car = new Sprite();
car.setTexture(resCar);
car.setSize(400, 180);
car.setPosition(-500, 350); 
scene.addNode(car);

var labCombo = new Label();
labCombo.setPosition(300, 100); 
labCombo.setSize(120, 60);           
labCombo.setFont("font/st.ttf", 45); 
labCombo.setColor(0, 0, 0, 0);       
labCombo.setTextColor(255, 0, 0, 1);   
labCombo.setHide(true);              
scene.addNode(labCombo);

// 辅助函数:普通尾气(灰白色)
function createExhaust(x, y) {
    var p = new Node();
    p.setSize(6, 6);
    p.setPosition(x + 50, y + 175);
    p.pAlpha = 0.5; 
    p.setColor(0.8, 0.8, 0.8, p.pAlpha); 
    scene.addNode(p);
    exhaustParticles.push(p);
}

// 辅助函数:氮气火焰(蓝色高亮)
function createNitro(x, y) {
    var p = new Node();
    // 氮气火焰比烟雾更长、更窄
    p.setSize(15, 4);
    p.setPosition(x + 40, y + 175); 
    p.pAlpha = 1.0; 
    // 亮蓝色 (0, 0.6, 1)
    p.setColor(0, 0.6, 1, p.pAlpha); 
    scene.addNode(p);
    nitroParticles.push(p);
}

// 全屏点击
var clickLayer = new Sprite();
clickLayer.setPosition(0, 0);
clickLayer.setSize(screenW, screenH); 
clickLayer.setColor(0, 0, 0, 0.01); 
clickLayer.click(() => {
    if (animState === 0) {
        animState = 1;
        audio.playSound("sound/1.wav"); 
    }
    comboCount++;
    comboTimer = 0;       
    comboScale = 1.8;     
    labCombo.setHide(false);
    labCombo.setText(" x" + comboCount + " "); 
    if (animState === 2) timer = 0; 
});
scene.addNode(clickLayer);

// 核心循环
scene.upDate((time) => {
    frameCount++;

    // A1. 普通尾气更新
    for (var i = exhaustParticles.length - 1; i >= 0; i--) {
        var p = exhaustParticles[i];
        var pPos = p.getPosition();
        p.setPosition(pPos.x - 4, pPos.y + (Math.random() * 4 - 2));
        p.pAlpha -= 0.04;
        if (p.pAlpha <= 0) { p.setHide(true); exhaustParticles.splice(i, 1); }
    }

    // A2. 氮气粒子更新(更快消失,产生喷射感)
    for (var j = nitroParticles.length - 1; j >= 0; j--) {
        var n = nitroParticles[j];
        var nPos = n.getPosition();
        // 氮气粒子向后飞得极快
        n.setPosition(nPos.x - 15, nPos.y);
        n.pAlpha -= 0.15; // 消失极快
        if (n.pAlpha <= 0) { n.setHide(true); nitroParticles.splice(j, 1); }
    }

    // B. 七彩变色
    if (animState > 0) {
        var r = Math.sin(frameCount * 0.1) * 0.5 + 0.5;
        var g = Math.sin(frameCount * 0.1 + 2) * 0.5 + 0.5;
        var b = Math.sin(frameCount * 0.1 + 4) * 0.5 + 0.5;
        car.setColor(r, g, b, 1.0);
        giftBanner.setTextColor(r, g, b, 1.0);
    }

    // C. 连击数字
    if (!labCombo.isHide()) {
        comboTimer++;
        if (comboScale > 1.0) {
            comboScale -= 0.12;
            labCombo.setSize(120 * comboScale, 60 * comboScale);
        }
        if (comboTimer > 80) { labCombo.setHide(true); comboCount = 0; }
    }

    // D. 状态机
    if (animState === 1) {
        var bPos = giftBanner.getPosition();
        var cPos = car.getPosition();
        if (bPos.x < 20) giftBanner.setPosition(bPos.x + 15, bPos.y);
        if (cPos.x < 180) {
            car.setRotate(-3); 
            car.setPosition(cPos.x + 25, cPos.y - 1); 
            if (frameCount % 3 === 0) createExhaust(cPos.x, cPos.y);
        } else {
            car.setRotate(0); animState = 2; timer = 0;
        }

    } else if (animState === 2) {
        timer++;
        var cPos = car.getPosition();
        var shakeY = 349 + (Math.random() * 4);
        car.setPosition(cPos.x, shakeY);
        if (frameCount % 5 === 0) createExhaust(cPos.x, cPos.y);
        if (timer > 140 && labCombo.isHide()) { animState = 3; }

    } else if (animState === 3) {
        // --- 离场:氮气全开 ---
        var bPos = giftBanner.getPosition();
        var cPos = car.getPosition();
        giftBanner.setPosition(bPos.x, bPos.y - 10);
        
        // 速度曲线爆发
        var exitSpeed = 30 + (timer * 3); 
        car.setRotate(5);
        car.setPosition(cPos.x + exitSpeed, cPos.y + 10); 
        
        // 【关键】喷射蓝色氮气火焰
        createNitro(cPos.x, cPos.y);
        if (frameCount % 2 === 0) createExhaust(cPos.x, cPos.y);

        if (cPos.x > 950) {
            animState = 0; 
            car.setPosition(-500, 350); 
            car.setRotate(0);
            giftBanner.setPosition(-300, 100);
            car.setColor(1, 1, 1, 1);
        }
    }
});

game.pushScene(scene);
game.run();

DeepSeek生成的跑车代码,可以直接运行:

// 抖音送跑车实例 - 点击屏幕送跑车

// 初始化游戏引擎
game.init(); // 默认窗口大小800*600
game.setFPS(30); // 设置帧率

// 游戏主窗口设置图标和标题
var window = game.getWindow();
var texture = game.getResource().getTexture("img/logo.png");
window.setIcon(texture);
window.setTitle("抖音送跑车 - 点击屏幕送跑车");

// 创建场景
var scene = new Scene();
game.pushScene(scene);

// 背景音乐和音效
var audio = new Audio();
audio.playMusic("sound/bg.ogg"); // 播放背景音乐
audio.setMusicVolume(0.5);

// ==================== 调试标签 ====================
var labDebug = new Label();
labDebug.setPosition(20, 20);
labDebug.setSize(150, 150);
labDebug.setColor(0,0,0,0.1);
labDebug.setTextColor(0,1,0,0.5);
labDebug.setFont("font/st.ttf",15);
scene.addNode(labDebug);

// ==================== 送礼计数器 ====================
var countLabel = new Label();
countLabel.setPosition(20, 550);
countLabel.setSize(200, 30);
countLabel.setFont("font/st.ttf", 20);
countLabel.setTextColor(1, 0, 0, 1);
countLabel.setText("送礼次数: 0");
scene.addNode(countLabel);

var carCount = 0;        // 累计送礼次数
var cars = [];           // 存储当前活跃的跑车 { sprite, label, speed, x, y }

// ==================== 全屏点击层 ====================
var clickLayer = new Sprite();
clickLayer.setSize(800, 600);
clickLayer.setPosition(0, 0);
clickLayer.setColor(0, 0, 0, 0); // 完全透明
scene.addNode(clickLayer);

// 点击层点击事件
clickLayer.click(() => {
    // 播放送礼音效
    audio.playSound("sound/1.wav");

    // 创建跑车精灵
    var car = new Sprite();
    // 尝试加载跑车专用图片,若不存在则用橙色矩形代替
    var carTex = game.getResource().getTexture("img/car.png");
    if (carTex) {
        car.setTexture(carTex);
    } else {
        car.setColor(1, 0.5, 0, 1); // 橙色
    }
    car.setSize(150, 90); // 跑车尺寸
    var startY = 250 + Math.random() * 200; // 随机起始高度 250~450
    car.setPosition(-100, startY); // 从左侧屏幕外开始
    scene.addNode(car);

    // 创建随跑车移动的文字标签(显示送礼信息)
    var carLabel = new Label();
    carLabel.setPosition(100, startY - 30);
    carLabel.setSize(180, 25);
    carLabel.setFont("font/st.ttf", 18);
    carLabel.setTextColor(1, 0, 0, 1); 
    carLabel.setText("粉丝 送出资深跑车");
    scene.addNode(carLabel);

    // 存储跑车数据
    cars.push({
        sprite: car,
        label: carLabel,
        speed: 6 + Math.random() * 4, // 随机速度 6~10
        x: -100,
        y: startY
    });

    // 更新送礼次数
    carCount++;
    countLabel.setText("送礼次数: " + carCount);
});

// ==================== 每帧更新 ====================
scene.upDate((time) => {
    // 1. 更新调试信息
    var nodes = scene.getChilds();
    if (nodes.length > 0) {
        var debugNode = nodes[0]; // labDebug 是第一个添加的节点
        const timeStr = new Date().toTimeString().split(' ')[0];
        var str = "调试信息\n" + "时间:" + timeStr;
        debugNode.setText(str);
    }

    // 2. 移动所有跑车
    for (var i = cars.length - 1; i >= 0; i--) {
        var car = cars[i];
        car.x += car.speed;
        car.sprite.setPosition(car.x, car.y);
        car.label.setPosition(car.x, car.y - 30);

        // 跑车移出屏幕右侧时隐藏并从数组中移除
        if (car.x > 900) { // 屏幕宽800,右侧外
            car.sprite.setHide(true);  // 隐藏跑车
            car.label.setHide(true);   // 隐藏文字
            cars.splice(i, 1);         // 从活跃数组中删除
        }
    }
});

// ==================== 可选:保留键盘回调(但不影响)====================
class GlobalVariable {
    static KEY_W = 87; static KEY_S = 83; static KEY_A = 65; static KEY_D = 68;
    static KEY_BOTTOM = 40; static KEY_UP = 38; static KEY_LEFT = 37; static KEY_RIGHT = 39;
}
game.setKeyCallBack((key, action) => {
    // 空实现,仅保留框架
});

// 运行游戏
game.run();

AI提问内容:

下面是开维游戏引擎的代码演示,根据这个代码,写一个类似抖音送跑车的实例。 代码如下:// 基础控件实例
  
// 初始化游戏引擎
game.init(); // 默认窗口大小为800*600
game.setFPS(30); // 设置帧率
 
// 游戏主窗口设置图标和标题
// ----------------------------------------------------------------------------------------------
var window = game.getWindow(); // 获取资源对象
var texture = game.getResource().getTexture("img/logo.png"); // 获取纹理数据对象
window.setIcon(texture); // 设置主游戏窗口图标
window.setTitle("开维游戏引擎"); // 设置主游戏窗口标题
 
// Scence场景设置
// ----------------------------------------------------------------------------------------------
var resBg = game.getResource().getTexture("img/bg.png");  // 获取背景图资源
var scene = new Scene(); // 新建场景
scene.setBg(resBg); // 设置场景背景图
scene.upDate((time)=>{ // 界面刷新回调函数,根据fps帧率的值回调,fps设置60就是一秒60次回调
     // log("fps callback"); // 编写游戏地图、子弹移动等
     var nodes = scene.getChilds(); // 读取所有场景节点,返回数组
     var labDebug = nodes[0];  // 读取数据第一个对象
     const timeStr = new Date().toTimeString().split(' ')[0]; // 返回当前时间
     var str = "调试信息\n"+"时间:"+timeStr;
     labDebug.setText(str); // 设置对象时间,每帧刷新一下时间
});
game.pushScene(scene);
 
// Audio音乐类,设置背景音乐
var audio = new Audio();
audio.playMusic("sound/bg.ogg"); // 播放背景音乐,循环播放
//audio.stopMusic(); // 停止当前背景音乐
//audio.playMusicOne("sound/bg.ogg"); // 播放音乐,仅播放一次
//audio.playMusic("sound/1.wav");
//audio.playMusic("sound/Normal2.mp3");
audio.playSound("sound/1.wav"); // 循环音效,例如按钮点击声、脚步声、爆炸声、技能音效
 
// Label标签设置,调试窗口信息
// ----------------------------------------------------------------------------------------------
var labDebug = new Label(); // 新建标签类
labDebug.setPosition(20, 20); // 标签位置横坐标,纵坐标。
labDebug.setSize(150, 150); // 标签宽,高
labDebug.setColor(0,0,0,0.1);  // 标签背景颜色为黑色并透明
labDebug.setTextColor(0,1,0,0.5);  // 标签字体颜色
labDebug.setFont("font/st.ttf",15); // 标签汉字字库,字体大小,必须指定
scene.addNode(labDebug);  // 把标签增加到场景中
 
// Label标签设置,显示游戏名称
// ----------------------------------------------------------------------------------------------
var resName = game.getResource().getTexture("img/name.png");  // 获取背景图资源
var labLog = new Label(); // 新建标签类
labLog.setPosition(270, 5); // 标签位置横坐标,纵坐标。
labLog.setSize(400, 150); // 标签宽,高
labLog.setTexture(resName); 
labLog.setFont("font/st.ttf",15); // 标签汉字字库,字体大小,必须指定
//labLog.setText("标签上的测试文字\n换行123");
//lab.setColor(0,0,0,1);  // 标签背景颜色为黑色并透明
//labLog.setRotate(180); // 标签旋转180度
labLog.upDate((time)=>{ // 设置帧率回调,如果不需要可以注释
 //log("Lab callback");
});
scene.addNode(labLog);  // 把标签增加到场景中
 
// Node节点控件,这个是很多控件的基类。左上角显示一个绿色小方块,中间有个蓝色小方块
// ----------------------------------------------------------------------------------------------
log("\nNode节点控件 -------------------------------------------------------------------------");
var node = new Node(); // 新建节点
node.setPosition(1, 1);  // 节点位置横坐标,纵坐标
var pos = node.getPosition(); // 获取节点坐标
log("节点横坐标x:" + pos.x + "节点纵坐标y:" + pos.y);
node.setSize(20,20);    // 设置节点宽,高
var size = node.getSize(); // 获取节点大小
log("节点宽度:" + size.x + "节点宽度:" + size.y);
node.setName("Hello world"); // 设置节点文字
var name = node.getName(); // 获取节点文字
log("节点文字:"+name);
node.setColor(1,2,3,0.5);  // 设置节点颜色
var color = node.getColor(); // 获取节点颜色
log("获取节点颜色值为:r:" + color.x + "  g:" + color.y + "  b:" + color.z+ "  a:" + color.w);
node.setRotate(90); // 设置节点选择角度0~360
var routate = node.getRotate(); // 获取节点选择角度
log("旋转角度为:"+routate);
node.setHide(false); // 设置节点是否隐藏
var hide = node.isHide(); // 获取节点是否隐藏
log("node节点是否隐藏:" + hide);
scene.addNode(node); // 把节点增加到场景中
node.upDate((time)=>{ // 设置帧率回调,如果不需要可以注释
 //log("Node callback");
});
// 增加节点:在绿色小方块上,添加子节点,红色小方块,然后改为蓝色小方块
var node1 = new Node(); // 新建子节点
node1.setPosition(2, 2);  // 节点位置横坐标,纵坐标
node1.setSize(10,10);    // 设置节点宽,高
node1.setColor(255,0,0,1);  // 设置节点颜色,红色
node.addNode(node1); // 把子节点添加到父节点中
var nodeArray = node.getNodes(); // 获取node节点数组对象数据,从0开始 
var nodeTemp = nodeArray[0]; // 获取第一个node对象
nodeTemp.setColor(0,0,255,1);  // 设置子节点颜色,蓝色
  
// Edit编辑框设置,输入用户名称
// ----------------------------------------------------------------------------------------------
var resEditBg = game.getResource().getTexture("img/edit.png"); // 获取纹理数据对象
var editName = new Edit(); // 新建编辑框
editName.setTexture(resEditBg); // 设置底图
editName.setPosition(290, 340); // 编辑框的位置,横坐标和纵坐标
editName.setPadding(10); // 编辑框中开始输入的地方
editName.setSize(180, 60); // 编辑框的大小,宽度和高度
editName.setFont("font/st.ttf", 20); // 编辑框的汉字字库,字体大小,必不可少
//editName.setColor(255, 255, 255, 0.1);  // 编辑框背景颜色为白色并透明
//editName.setPubText("编辑框内容"); // 编辑框字体颜色为黑色不透明
scene.addNode(editName);  // 加入到场景中
 
// Sprite精灵设置,登录按钮,点击登录后替换背景音乐
// ----------------------------------------------------------------------------------------------
var resBtnBg = game.getResource().getTexture("img/button.png"); // 获取纹理数据对象
var sprLogin = new Sprite(); // 新建精灵
sprLogin.setTexture(resBtnBg); // 设置精灵背景
sprLogin.setSize(200,60); // 设置精灵大小
sprLogin.setPosition(275, 420); // 标签位置横坐标,纵坐标。
sprLogin.click(()=>{ // 点击回调函数,更换图片
    var edittext = editName.getText(); // 点击时,读取edit框内容
    log("Edit框内容:"+edittext);
    audio.stopMusic(); // 停止当前背景音乐
    audio.playMusic("sound/Normal2.mp3"); // 循环播放音乐
    audio.playSound("sound/1.wav"); // 播放音效
    aWebSocket.emitMsg("SIO_MESSAGE_UP","SIO_MESSAGE_UP");   // 发送长链接数据
});
sprLogin.longClick(()=>{ // 长按回调函数,更换图片
   log("长按");
});
scene.addNode(sprLogin); // 加入到场景中
//var nodes = scene.getChilds();
 
// ProgressBar进度条设置
// ----------------------------------------------------------------------------------------------
var resLoad = game.getResource().getTexture("img/load.png"); // 获取纹理数据对象
var progLoad = new ProgressBar(); // 新建进度条
progLoad.setBgTexture(resLoad); // 设置进度条图片
progLoad.setTexture(resLoad); // 设置进度条图片
progLoad.setPosition(200, 550); // 进度条显示位置
progLoad.setSize(380, 20); // 进度条区域大小,宽和高
progLoad.setBgColor(1.0,0.5,0.2,1); // 进度条背景颜色,透明
progLoad.setMax(100); // 进度条最大值
progLoad.setValue(0); // 设置初始进度为0
var i = 0;
progLoad.upDate((time)=>{ // 设置帧率回调
    if (i++>100) i = 0;
    progLoad.setValue(i); // 设置当前进度
    var max = progLoad.getMax(); // 获取最大进度值
    var val = progLoad.getValue(); // 获取当前进度值
    //log("进度条最大值:"+max+"进度条当前值:"+val);
});
scene.addNode(progLoad);  // 加入到场景中
 
 // Slide滑动控件,音量调节
// ----------------------------------------------------------------------------------------------
var resSlide = game.getResource().getTexture("img/slide.png"); // 获取纹理数据对象
var slideLoad = new Slide(); // 新建滑块条
slideLoad.setBarTexture(resSlide); // 设置滑块指针显示的图片
slideLoad.setPosition(300, 500); // 滑块显示位置,横坐标,纵坐标
slideLoad.setSize(150, 15); // 滑块区域大小,宽和高
//slideLoad.setBarColor(0,1,0,1); // 滑块颜色绿色,不透明
slideLoad.setColor(128,128,128,0.2); // 滑块背景颜色,透明
slideLoad.setMax(100); // 滑块最大值
slideLoad.setValue(audio.getMusicVolume()*100); // 设置初始值
var i = 0;
slideLoad.upDate((time)=>{ // 设置帧率回调
    var max = slideLoad.getMax(); // 获取最大进度值
    var val = slideLoad.getValue(); // 获取当前进度值

    audio.setMusicVolume(val*1.0/max); // 设置背景音乐音量大小
    audio.setSoundVolume(0.5); // 设置音效音量大小
    var MusicVal = audio.getMusicVolume(); // 获取背景音乐音量大小
    var SoundVal = audio.getSoundVolume();// 获取音效音量大小

    //log("滑块最大值:"+max+"进度条当前值:"+val +"背景音乐音量大小:"+MusicVal +"音效音量大小:"+SoundVal );
});
scene.addNode(slideLoad);  // 加入到场景中
  
// ScrollView滚动视图
// ----------------------------------------------------------------------------------------------
log("\nScrollView滚动视图 --------------------------------------------------------------------");
// 设置滚动视图大小,位置,背景等。半透明背景图中有白色的底图
var resScrollViewBg = game.getResource().getTexture("img/ScrollViewBg.png"); // 获取纹理数据对象
var scrollview = new ScrollView(); // 新建滚动视图
scrollview.setTexture(resScrollViewBg); //设置滚动视图背景图
scrollview.setColor(0.2, 0.5, 0.8, 0.5); // 设置滚动视图颜色
scrollview.setPosition(10,400);// 滚动视图的位置,横坐标和纵坐标
scrollview.setSize(100,100);// 滚动视图的大小,宽度和高度
scrollview.setContentSize(400,400); // 设置滚动视图中内容大小
 
// 是否隐藏滚动试图中,水平和垂直滑块
//scrollview.setShowHBar(false); // flase隐藏;ture显示;默认显示水平滚动条
//scrollview.setShowVBar(false); // flase隐藏;ture显示;默认显示垂直滚动条
 
// 获取滚动视图位置
scrollview.setScrollOffsetX(10); //  水平滚动滑块的初始位置,横坐标从10开始
scrollview.setScrollOffsetY(20); //  垂直滚动滑块的初始位置,纵坐标从20开始
var sx = scrollview.getOffsetX(); // 获取水平滚动滑块的位置
var sy = scrollview.getOffsetY(); // 获取垂直滚动滑块的位置
log("scrollview滚动窗口水平滑块初始位置:"+sx);
log("scrollview滚动窗口垂直滑块初始位置:"+sy);
 
// 设置滚动试图中,水平和垂直滑道的宽窄,如果不调用此函数,默认为20
scrollview.setHBarHeight(10); // 设置水平滚动条滑道的高度
scrollview.setVBarWidth(10);  // 设置垂直滚动条滑道的宽度
 
// 滚动视图中加入一张图片
var resSpr1 = game.getResource().getTexture("img/resSpr1.png"); // 获取纹理数据对象
var spr1 = new Sprite(); // 新建精灵
spr1.setTexture(resSpr1); // 设置精灵为白色背景图
spr1.setSize(160,160); // 设置精灵大小
spr1.setPosition(10, 50); // 标签位置横坐标,纵坐标。
scrollview.addNode(spr1); // 向滚动动窗口中增加精灵,效果为:黑色的滚动窗口中有一个白色的图
 
// 设置滚动视图垂直滚动条
var vscrollBar =scrollview.getVScrollBar(); // 获取滚动窗口中的垂直滚动条
var resVScrollBarBg = game.getResource().getTexture("img/resVScrollBarBg.png"); // 获取纹理数据对象,灰色背景图
vscrollBar.setColor(0,255,0,1); // 设置垂直滚动条背景颜色为绿色
vscrollBar.setTexture(resVScrollBarBg); // 设置滚动条里面滑块背景图为灰色
vscrollBar.setBarColor(0,0,255,1);  // 设置滚动条中滑块颜色为蓝色
vscrollBar.setBarTexture(resVScrollBarBg);// 设置滚动条中滑块背景图
 
// 设置滚动视图水平滚动条
var hscrollBar =scrollview.getHScrollBar(); // 获取滚动窗口中的水平滚动条
var resHScrollBarBg = game.getResource().getTexture("img/resVScrollBarBg.png"); // 获取纹理数据对象,灰色背景图
hscrollBar.setColor(0,255,255,1); // 设置水平滚动条背景颜色为青色
hscrollBar.setTexture(resHScrollBarBg); // 设置水平滚动条里面滑块背景图为灰色
hscrollBar.setBarColor(255,0,255,1);  // 设置水平滚动条中滑块颜色为红色
hscrollBar.setBarTexture(resHScrollBarBg);// 设置水平滚动条中滑块背景图
 
scene.addNode(scrollview); // // 加入到场景中 
 
// Http网络类
// ----------------------------------------------------------------------------------------------
log("\nHttp网络类 -----------------------------------------------------------------------------");
 var http = new Http();
 http.get("https://ctrljs.ikaiwei.com/api/test/request_logs.do?sf=sf",(str)=>{
 log(str);
 });
 http.post("https://ctrljs.ikaiwei.com/api/test/request_logs.do?","sff=sf111&se=1",(str)=>{
 });
  
 
// websocket类
// ----------------------------------------------------------------------------------------------
log("\nwebsocket长链接类 --------------------------------------------------------------------");
var aWebSocket = new SocketIO(); // 创建长连接类
var appid= "h11do3gq";
aWebSocket.initIO(appid);  // 初始化长链接中的appid,区分项目用,也可以为空
  
// 设置长连接
aWebSocket.connectIO("https://imtest.linchixuan.com/"+appid,"appId="+appid+"&uid=68661f92a88ebd78856482bc&deviceId=132441241244"); // 建立长链接
 aWebSocket.on("SIO_INFO",function(str){ // 监听长链接数据,设置回调函数
   log(JSON.stringify(str));
});
aWebSocket.on("connect",function(){
    aWebSocket.emitMsg("SIO_MESSAGE_UP","SIO_MESSAGE_UP");   // 发送长链接数据
    //aWebSocket.disConnect(); // 关闭长链接
});
  
 // 获取场景里面对象数据,从0开始 
var nodeArray = scene.getChilds();
var labTest = nodeArray[0]; // 获取第一个场景对象
//labTest.setText("世界,你好!"); // lab对象重写设置内容
 
 
// ----------------------------------------------------------------------------------
// 键盘回调方法,键值参考帮助文档中的键值表
// ----------------------------------------------------------------------------------
 
// 全局类,全局变量和参数
class GlobalVariable
{
  // 键盘键值
  static KEY_W = 87;
  static KEY_S = 83;
  static KEY_A = 65;
  static KEY_D = 68;
  static KEY_BOTTOM = 40;
  static KEY_UP = 38;
  static KEY_LEFT = 37;
  static KEY_RIGHT = 39;
}
 
// 函数功能:键盘回调函数,定义wasd或上下左右健
// 函数参数:key-键值;action-动作;
game.setKeyCallBack((key,action)=>{
  let type = "";
  if (key == GlobalVariable.KEY_W || key == GlobalVariable.KEY_UP)
      type = "up";
  else if (key == GlobalVariable.KEY_S || key == GlobalVariable.KEY_BOTTOM)
      type =  "down";
  else if (key == GlobalVariable.KEY_A || key == GlobalVariable.KEY_LEFT)
      type =  "left";
  else if (key == GlobalVariable.KEY_D || key == GlobalVariable.KEY_RIGHT)
      type =  "right";
   
  // 控制台中显示调试信息
  log("key "+key+" action "+action+" type "+type);
  logic(type) // 调用操控函数
});
 
// 函数功能:游戏中的键盘操作
// 函数参数:direction,方向 up down left right
function logic(direction)
{
  // 处理玩家输入的方向,移动所有格子并合并相同数字
  if(direction == "up") 
      log("上");
  else if (direction == "down") 
      log("下");
  else if (direction == "left") 
      log("左");
  else if (direction == "right") 
      log("右");
}

// 运行游戏
game.run();

导出的网页版游戏运行页面:

抖音超跑特效,导出网页版调试过程

开维游戏引擎下载:
https://www.ikaiwei.com/download/gamejs/kaiwei_gameide_setup.exe

AI自动生成代码:抖音跑车特效:
https://www.ikaiwei.com/gamejs/example/105_ai_douyincar_html/index.html

源码下载:
https://github.com/ctrljshaha/KaiweiEngine
https://gamejs.ikaiwei.com/#/Market

开发文档:
https://www.ikaiwei.com/gamejs/api/index.html

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐