开维游戏引擎实例:AI自动生成游戏代码:愤怒的小鸟angrybirds

0 阅读8分钟

开维游戏引擎(Kaiwei Engine)是基于js设计的跨平台游戏引擎。内核c++编写,v8引擎封装游戏函数,Assembly实现htm跨平台高效运行。

下面以“愤怒的小鸟angrybirds”为例,用Gemini大模型自动生成游戏代码,手把手教你一步一步生成游戏,即便是不懂代码,也可以利用工具做出想要的游戏,不用修改代码直接运行,会用各种工具即可。本实例一共耗时3个小时左右。

最终运行效果,包括:windows版(exe)、网页版(html)、微信小游戏: 在这里插入图片描述

在这里插入图片描述

生成游戏主要步骤:

  1. 打开Geimin和安装开维游戏引擎。
  2. 问询Gemini生成代码;打开游戏引擎自带的第二个实例。
  3. Gemini生成的代码覆盖打开的实例运行即可。
  4. 继续让Gemini优化,前期根据Gemini提示优化,后期根据自己需求优化。
  5. 导出游戏exe版本、html网页版本、微信小游戏工程。

开维游戏引擎原理和AI使用方法:

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

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

开维引擎的底层是C++编写的高性能内核,通过V8引擎封装JavaScript接口,再通过WASM实现网页端高效运行。这意味着,虽然你用的是JavaScript,但实际执行效率远高于普通HTML5游戏引擎(如Phaser),接近原生应用。这一架构决定了它特别适合AI生成代码——因为AI模型只需理解JavaScript API层,无需关心底层C++实现,即可生成可直接运行的高效代码。因此以API为标准,避免参考其他引擎(如Unity或Cocos)的思维模式,否则容易混淆概念。

AI模型应用:示例代码中包含几乎所有基本控件函数,可以给AI 模型,例如:DeepSeek,Gemini,豆包等。 AI游戏生成:以示例为基础自动生成AI游戏代码,例如贪吃蛇、飞机大战、俄罗斯方块等。 AI提示文本:“下面是开维游戏引擎的代码演示,根据这个代码,写一个愤怒的小鸟angrybirds游戏。 代码如下:(002示例代码)”。

下面演示利用AI模型Gemini一步一步生成“愤怒的小鸡”游戏的详细步骤,也能很直观的看到AI游戏代码如何一步一步进化,直到生成准商业游戏的过程。

我们选取了第2次、第6次、第8次的运行结果做对比: 第2次Gemini生成游戏代码运行效果:基本元素,抛物虚线预览等

在这里插入图片描述

第6次Gemini生成游戏代码运行效果:木头倒地效果、旋转、音效、左右键调节力度、提示框变小等

第8次Gemini生成游戏代码运行效果。增加了鼠标交互、得分、提示显示木头位置等。并且加上了鼠标拖拽功能。为了导出微信,增加了部分适配

在这里插入图片描述

几次迭代代码代码对比: 在这里插入图片描述

下面选取几个关键步骤演示:

1. 步骤一:

打开Gemini;安装开维游戏引擎,并打开自带的第二个实例。

安装运行后,点击右上角“打开工程”,选择安装目录中第二个游戏实例“C:\Program Files\KaiweiEngine\example\002_Login”中的“002_Login.gmp”

点击右上角的“运行”按钮,运行结果如下。我们现在以这个实例代码为参考,这个实例包含所有基本API函数的用法,可以让Gemini学习这个代码,自动生成“愤怒的小鸟”游戏代码。全选复制一下当前界面中的main.js代码。

在这里插入图片描述

打开Gemini,输入“下面是开维游戏引擎的代码演示,根据这个代码,写一个愤怒的小鸟Angrybirds游戏。 代码如下:”,然后把刚才拷贝的代码粘贴到Gemini中。 可以看到Geimin给出了初版代码,并且自动给出了修改意见。

点击“拷贝”按钮,复制一下这个代码,然后输入“继续”,让Gemini继续生成优化后的代码。把代码覆盖粘贴到开维游戏引擎中,会看到生成代码的效果,可以正常运行。

在这里插入图片描述

  1. 步骤二:

迭代步骤一的过程,几次问询后,得到最终代码。

Gemini最终生成代码如下:

// 愤怒的小鸟实例
// 微信小游戏导出,选择横屏导出
// gemini生成的代码,后期添加了手势的操控。
// AI提示文本:"下面是开维游戏引擎的代码演示,根据这个代码,写一个愤怒的小鸟游戏。 代码如下:(拷贝002实例代码)"
// 如果需要适配屏幕大小,需要继续优化,可以参考002实例继续优化
  
// --- 初始化游戏引擎 ---
game.init(); 
game.setFPS(60);
 
// 获取资源
var resBg = game.getResource().getTexture("img/bg.png");
var resBird = game.getResource().getTexture("img/bird.png");
var resWood = game.getResource().getTexture("img/wood.png");
 
// --- 音频处理 ---
var audio = new Audio();
audio.playMusic("sound/25. Main Theme.mp3");
audio.setMusicVolume(0.2); 
audio.setSoundVolume(0.8);
 
var scene = new Scene();
scene.setBg(resBg);
game.pushScene(scene);
 
// --- 游戏变量 ---
var gravity = 0.5;
var isFlying = false;
var inCooldown = false; 
var score = 0; // 总得分
 
var birdStartX = 150, birdStartY = 350;
var vx = 0, vy = 0;
var angle = -45;  
var power = 18;   
 
// --- 鼠标交互变量 ---
var isDragging = false;
var mouseStartX = 0;
var mouseStartY = 0;
 
// 动画变量
var woodAngle = 0;       
var targetWoodAngle = 0; 
var fallSpeed = 8;       
 
// 修改:倒计时变量改为 120 帧(对应 60FPS 下的 2秒)
var cooldownFrames = 0;
var totalCooldownFrames = 120; 
var resultMessage = "";
var resultColor = {r: 0, g: 0, b: 0};
 
// --- 1. 预判虚线池 ---
var dotCount = 15;
var dots = [];
for (var i = 0; i < dotCount; i++) {
    var dot = new Node();
    dot.setSize(4, 4);
    dot.setColor(0.5, 0.5, 0.5, 0.6); 
    dot.setHide(true);
    scene.addNode(dot);
    dots.push(dot);
}
 
// --- 2. 烟雾尾迹池 ---
var trailCount = 20;
var trails = [];
var trailIndex = 0;
for (var i = 0; i < trailCount; i++) {
    var trail = new Node();
    trail.setSize(8, 8);
    trail.setColor(1, 1, 1, 0.4); 
    trail.setHide(true);
    scene.addNode(trail);
    trails.push(trail);
}
 
// --- 3. 目标木块 ---
var wood = new Sprite();
wood.setTexture(resWood);
wood.setSize(50, 100);
wood.setPosition(650, 350); 
scene.addNode(wood);
 
// --- 4. 小鸟精灵 ---
var bird = new Sprite();
bird.setTexture(resBird);
bird.setSize(45, 45);
bird.setPosition(birdStartX, birdStartY);
scene.addNode(bird);
 
// --- 5. UI 标签 ---
var labDebug = new Label();
labDebug.setPosition(20, 20);
labDebug.setSize(240, 120);
labDebug.setColor(1, 0, 0, 0.4); 
labDebug.setTextColor(1, 1, 1, 1);
labDebug.setFont("font/st.ttf", 16); 
scene.addNode(labDebug); 
 
// 得分标签:红色、背景透明
var labScore = new Label();
labScore.setPosition(350, 20);
labScore.setSize(150, 50);
labScore.setColor(0, 0, 0, 0); 
labScore.setTextColor(1, 0, 0, 1); 
labScore.setFont("font/st.ttf", 24);
labScore.setText("得分: 0");
scene.addNode(labScore);
 
// 击中特效文字:红色
var labPlus = new Label();
labPlus.setSize(100, 50);
labPlus.setColor(0, 0, 0, 0);
labPlus.setTextColor(1, 0, 0, 1); 
labPlus.setFont("font/st.ttf", 30);
labPlus.setText("+1");
labPlus.setHide(true);
scene.addNode(labPlus);
 
// 结果标签:红色、背景透明
var labResult = new Label();
labResult.setPosition(300, 180); 
labResult.setSize(220, 80);     
labResult.setColor(0, 0, 0, 0); 
labResult.setTextColor(1, 0, 0, 1); 
labResult.setFont("font/st.ttf", 18); 
labResult.setHide(true); 
scene.addNode(labResult);
 
// --- 功能函数 ---
 
function triggerResult(msg, color, isHit) {
    if (inCooldown) return;
    isFlying = false;
    inCooldown = true;
    cooldownFrames = totalCooldownFrames; 
    resultMessage = msg;
    resultColor = {r: 1, g: 0, b: 0}; 
    
    if (isHit) {
        score += 1;
        labScore.setText("得分: " + score);
        labPlus.setPosition(650, 300);
        labPlus.setHide(false);
    }
}
 
function resetGame() {
    isFlying = false;
    isDragging = false; 
    inCooldown = false;
    cooldownFrames = 0;
    vx = 0; vy = 0;
    bird.setPosition(birdStartX, birdStartY);
    woodAngle = 0;
    targetWoodAngle = 0;
    wood.setRotate(0);
    wood.setPosition(650, 350);
    wood.setHide(false);
    labResult.setHide(true);
    labPlus.setHide(true);
    for (var i = 0; i < trailCount; i++) trails[i].setHide(true);
}
 
function updateTrajectoryPreview() {
    var rad = angle * Math.PI / 180;
    var tVx = Math.cos(rad) * power;
    var tVy = Math.sin(rad) * power;
    for (var j = 0; j < dotCount; j++) {
        var t = j * 2.5; 
        dots[j].setPosition(birdStartX + tVx * t, birdStartY + tVy * t + 0.5 * gravity * t * t);
        dots[j].setHide(false);
    }
}
 
// --- 6. 游戏主循环 ---
scene.upDate((time) => {
    labDebug.setText("状态: " + (isFlying ? "飞行" : (isDragging ? "瞄准中" : "待机")) + 
                     "\n角度: " + angle.toFixed(1) + "° (上下键)" +
                     "\n力度: " + power.toFixed(1) +  " (左右键)" + 
                     "\n拖拽小鸟进行弹射, R重置");

    if (!labPlus.isHide()) {
        var pPos = labPlus.getPosition();
        labPlus.setPosition(pPos.x, pPos.y - 2); 
    }
 
    if (woodAngle < targetWoodAngle) {
        woodAngle += fallSpeed;
        if (woodAngle > targetWoodAngle) woodAngle = targetWoodAngle;
        wood.setRotate(woodAngle);
        var offset = (woodAngle / 90) * 50; 
        wood.setPosition(650 + (woodAngle / 90) * 20, 350 + offset);
    }
 
    if (inCooldown) {
        if (cooldownFrames > 0) {
            cooldownFrames--;
            var seconds = Math.ceil(cooldownFrames / 60); 
            labResult.setText(resultMessage + "\n" + seconds + " 秒后重置...");
            labResult.setTextColor(1, 0, 0, 1);
            labResult.setHide(false);
            for (var d = 0; d < dotCount; d++) dots[d].setHide(true);
        } else {
            resetGame();
        }
        return; 
    }
 
    if (isFlying) {
        for (var d = 0; d < dotCount; d++) dots[d].setHide(true);
        var pos = bird.getPosition();
        vy += gravity;
        bird.setPosition(pos.x + vx, pos.y + vy);

        var currentTrail = trails[trailIndex];
        currentTrail.setPosition(pos.x + 15, pos.y + 15);
        currentTrail.setColor(1, 1, 1, 0.4);
        currentTrail.setHide(false);
        trailIndex = (trailIndex + 1) % trailCount;

        for (var i = 0; i < trailCount; i++) {
            if (!trails[i].isHide()) {
                var c = trails[i].getColor();
                var newAlpha = c.w - 0.02; 
                if (newAlpha <= 0) trails[i].setHide(true);
                else trails[i].setColor(c.x, c.y, c.z, newAlpha);
            }
        }

        var bPos = bird.getPosition();
        var wPos = wood.getPosition();
        var wSize = wood.getSize();
        if (bPos.x < wPos.x + wSize.x && bPos.x + 45 > wPos.x &&
            bPos.y < wPos.y + wSize.y && bPos.y + 45 > wPos.y) {
            
            audio.playSound("sound/83. Sfx - Bird Destroyed.mp3");
            targetWoodAngle = 90; 
            triggerResult("击中目标!", {r: 1, g: 0, b: 0}, true); 
        }

        if (bPos.y > 600 || bPos.x > 800 || bPos.x < 0) {
            triggerResult("没打中!", {r: 1, g: 0, b: 0}, false);
        }
    } else {
        updateTrajectoryPreview();
    }
});
 
// 函数功能:鼠标点击长按
scene.onPress((x,y)=>{
    isDragging = true;
    mouseStartX = x;
    mouseStartY = y;
});
 
// 函数功能:鼠标拖拽
scene.onMove((x,y)=>{
    if (isDragging) {
            var dx = mouseStartX - x; 
            var dy = mouseStartY - y;
            var distance = Math.sqrt(dx * dx + dy * dy);
            power = Math.min(40, distance / 5); 
            angle = Math.atan2(dy, dx) * 180 / Math.PI;
            bird.setPosition(birdStartX - dx * 0.2, birdStartY - dy * 0.2);
        }
});
 
// 函数功能:鼠标抬起
scene.onRelease((x,y)=>{
     if (isDragging) {
            if (power > 5) {
                audio.playSound("sound/81. Sfx - Bird 05 Flying.mp3"); 
                var rad = angle * Math.PI / 180;
                vx = Math.cos(rad) * power;
                vy = Math.sin(rad) * power;
                isFlying = true;
            } else {
                bird.setPosition(birdStartX, birdStartY);
            }
            isDragging = false;
        }
});
 
// --- 7. 键盘交互 ---
game.setKeyCallBack((key, action) => {
    if (action == 1) {
        if (inCooldown && key != 82) return; 
        if (key == 38 && !isFlying) angle = Math.max(-90, angle - 5); 
        if (key == 40 && !isFlying) angle = Math.min(0, angle + 5);  
        if (key == 37 && !isFlying) power = Math.max(5, power - 1); 
        if (key == 39 && !isFlying) power = Math.min(40, power + 1); 

        if (key == 32 && !isFlying) { 
            audio.playSound("sound/81. Sfx - Bird 05 Flying.mp3"); 
            var rad = angle * Math.PI / 180;
            vx = Math.cos(rad) * power;
            vy = Math.sin(rad) * power;
            isFlying = true;
        }
        if (key == 82) {
            score = 0; 
            labScore.setText("得分: 0");
            resetGame();
        }
    }
});
  
game.run();

生成应用:将工程导出exe,html,微信小游戏。

点击IDE中“工具”->“一键生成全部应用”选项,选择微信横屏。

在这里插入图片描述

网页版游戏运行:

在这里插入图片描述

微信小游戏运行:

在这里插入图片描述

源码下载:

github.com/ctrljshaha/…

开维游戏引擎下载:

www.ikaiwei.com/download/ga… www.ikaiwei.com/download/ga…

网页版:愤怒的小鸟 angrybirds:

www.ikaiwei.com/gamejs/exam…

开发文档:

www.ikaiwei.com/gamejs/api/…

游戏演示:普通代码和AI 代码

www.ikaiwei.com/gamejs/api/…

www.ikaiwei.com/gamejs/api/…