让AI来告诉你什么叫幽灵堵车

news2024/11/26 19:31:25

使用环境参考

CocosCreator v3.7.2
ChatGPT

正文

什么是幽灵堵车

堵车,大家都不陌生!

堵车时我就思维发散,用 CocosCreator 模拟下堵车应该挺好玩,网上总说高速上最前面如果有个龟速的车,后面能堵车堵个两三公里。查了一下这叫“幽灵堵车”。问下 ChatGPT:

然后我就新建了个项目,从官方商城搞个车过来:

让 AI 帮你打代码

接下来就是让 AI 来敲代码的过程,要想让 AI 明白你的意思,你得尽可能详细的描述当前的环境以及你想要的东西!!

接下来是我们长长的长长的长长的对话:

参数的修改

代码终于成功跑起来了,然后速度过快,最大最小速度缩小了 50 倍左右,效果如下:

给出代码

import { _decorator, Component, Node, Prefab, instantiate, Vec3 } from "cc";
const { ccclass, property } = _decorator;

@ccclass("Main")
export class Main extends Component {
  @property(Prefab)
  carPrefab: Prefab = null!;

  private carList: { speed: number; carNode: Node }[] = [];
  private time: number = 0;
  private interval: number = 3;

  start() {
    this.addCar();
  }

  update(dt: number) {
    this.time += dt;
    if (this.time > this.interval) {
      this.addCar();
      this.time = 0;
    }

    this.moveCars(dt);
  }

  private addCar() {
    const carNode = instantiate(this.carPrefab);
    carNode.parent = this.node;
    const car = { speed: 1, carNode: carNode };
    this.carList.push(car);
  }

  private moveCars(dt: number) {
    for (let i = 0; i < this.carList.length; i++) {
      const car = this.carList[i];
      const carPosition = car.carNode.position;

      // 如果不是第一辆车,则判断与前一辆车的距离是否大于安全距离
      if (i > 0) {
        const frontCar = this.carList[i - 1];
        const frontCarPosition = frontCar.carNode.position;
        const distance = frontCarPosition.x - carPosition.x;
        if (distance < 4) {
          car.speed = Math.max(0, frontCar.speed - 1);
        } else {
          car.speed = Math.min(1, frontCar.speed + 1);
        }
      }

      const newCarPosition = carPosition.add(new Vec3(car.speed * dt, 0, 0));
      car.carNode.setPosition(newCarPosition);
    }
  }
}

让 AI 赋予小车加速度

一拍大腿,加速度给忘了,我说走的这么立正!!

接下来通过对话让 ai 给代码加上加速度,然后再写一个摄像机控制逻辑:

效果如图:

当车辆数量到达 40 左右时,就已经出现两段长时间的拥堵了,幽灵堵车-可视化 okk!!

当车辆 200+ 时,车辆会以 10 个左右为一组,组团摇摆,这还是大家反应力 MAX 理想情况!

最终代码:

// 挂载 root 空节点
import { _decorator, Component, Node, Prefab, instantiate, Vec3 } from "cc";
const { ccclass, property } = _decorator;

@ccclass("Main")
export class Main extends Component {
  @property(Prefab)
  carPrefab: Prefab = null!;

  private carList: { speed: number; carNode: Node }[] = [];
  private time: number = 0;
  private interval: number = 3;

  start() {
    this.addCar();
  }

  update(dt: number) {
    this.time += dt;
    if (this.time > this.interval) {
      this.addCar();
      this.time = 0;
    }

    this.moveCars(dt);
  }

  private addCar() {
    const carNode = instantiate(this.carPrefab);
    carNode.parent = this.node;
    const car = { speed: 5, carNode: carNode };
    this.carList.push(car);
  }

  private moveCars(dt: number) {
    const acceleration = 0.35; // 加速度
    const drag = 0.05; // 阻力系数

    for (let i = 0; i < this.carList.length; i++) {
      const car = this.carList[i];
      const carPosition = car.carNode.position;

      // 如果不是第一辆车,则判断与前一辆车的距离是否大于安全距离
      if (i > 0) {
        const frontCar = this.carList[i - 1];
        const frontCarPosition = frontCar.carNode.position;
        const distance = frontCarPosition.x - carPosition.x;
        if (distance < 5) {
          car.speed = Math.max(0, car.speed - acceleration - drag);
        } else {
          car.speed = Math.min(10, car.speed + acceleration - drag);
        }
      } else {
        // 第一辆车匀速低速行驶
        car.speed = Math.min(2, car.speed + acceleration - drag);
      }

      const newCarPosition = carPosition.add(new Vec3(car.speed * dt, 0, 0));
      car.carNode.setPosition(newCarPosition);
    }
  }
}

// 挂载 camera 摄像机节点
import {
  _decorator,
  Component,
  Vec3,
  systemEvent,
  SystemEvent,
  EventKeyboard,
  KeyCode,
} from "cc";

const { ccclass, property } = _decorator;

@ccclass("Camera")
export class Camera extends Component {
  @property({ type: Number })
  moveSpeed: number = 5;

  private _isMovingLeft: boolean = false;
  private _isMovingRight: boolean = false;

  start() {
    systemEvent.on(SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
    systemEvent.on(SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
  }

  update(deltaTime: number) {
    let deltaMove = new Vec3();
    if (this._isMovingLeft) {
      deltaMove.x -= this.moveSpeed * deltaTime;
    }
    if (this._isMovingRight) {
      deltaMove.x += this.moveSpeed * deltaTime;
    }
    this.node.translate(deltaMove);
  }

  private onKeyDown(event: EventKeyboard) {
    switch (event.keyCode) {
      case KeyCode.KEY_A:
        this._isMovingLeft = true;
        break;
      case KeyCode.KEY_D:
        this._isMovingRight = true;
        break;
    }
  }

  private onKeyUp(event: EventKeyboard) {
    switch (event.keyCode) {
      case KeyCode.KEY_A:
        this._isMovingLeft = false;
        break;
      case KeyCode.KEY_D:
        this._isMovingRight = false;
        break;
    }
  }
}

AI 总结

最后,让 AI 做个总结吧!

Emmmmm… 就喜欢它时而牛逼时而智障的样子!!

我是 kuokuo,个人网站:www.kuokuo666.com

2023!Day Day Up!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业论文选题推荐|软件工程|系列四

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)的人脸识别系统…

python定时任务2_celery flower计划任务

启动worker&#xff1a; celery -A tasks worker --loglevelerror --poolsolo worker启动成功 启动beat celery -A tasks beat --loglevelinfo beat启动成功 启动flower celery -A tasks flower --loglevelinfo flower启动成功&#xff0c;然后进入http://localhost:5555 可…

手把手教你怎么搭建自己的ChatGPT和Midjourney绘图(含源码)

AI程序采用NUXT3LARAVEL9开发&#xff08;目前版本V1.1.7&#xff09; 授权方式&#xff1a;三个顶级域名两次更换 1.AI智能对话-对接官方和官方反代&#xff08;markdown输出&#xff09;PS:采用百度与自用库检测文字 2.AI绘图-根据关键词绘图-增加dreamStudio绘画-增加mid…

每日一个小技巧:1分钟告诉你图片怎么转语音

随着科技的不断进步&#xff0c;人们对于信息的获取方式也越来越多样化。而在这些方式中&#xff0c;图片和文字无疑是比较常见的两种。图片以其生动直观的特点吸引了许多人的眼球&#xff0c;而文字则以其更为详尽的信息呈现方式成为了人们了解事物的首选。然而&#xff0c;对…

金融行业数据分类分级“五步走” | 盾见

文|查浩奇 《数据安全法》明确提出&#xff0c;国家要建立数据分类分级保护制度&#xff0c;根据数据在经济社会发展中的重要程度&#xff0c;以及一旦遭到篡改、破坏、泄露或者非法获取、非法利用&#xff0c;对国家安全、公共利益或者个人、组织合法权益造成的危害程度&…

java泛型通配符

通配符有三种&#xff1a; 第一种&#xff1a; 问号&#xff08;?&#xff09;&#xff0c;表示所有类型 第二种&#xff1a;extends 类名 &#xff0c;表示该类及继承了该类的类型 第三种&#xff1a;super 类名&#xff0c; 表示该类和该类的父类 第一种&#xff1a;&…

大屏设计都是收费的吗?今天教你用积木报表做大屏,完全免费吆!

一、登录积木报表 1. 打开网址 输入用户名、密码&#xff0c;即可登录&#xff0c;如下图1.11所示&#xff1a; 备注&#xff1a;如果没有账号&#xff0c;需要自己用手机号注册一个账号&#xff0c;即可使用&#xff1b;图1.11 2. 进入系统后&#xff0c;点击“我的大屏” …

SSM框架练习—主从表的业务模型

需要实现的整体功能&#xff1a; 系统的登录并进行用户名的校验团购信息的列表展示团购信息的添加团购信息的检索 1、数据库创建 CREATE DATABASE mydb;USE mydb;drop table if exists vaccunit;CREATE TABLE vaccunit (vid INT AUTO_INCREMENT PRIMARY KEY,unitname VARCHA…

合众伟奇加入飞桨技术伙伴计划,共建“AI+数智化服务”科技创新发展格局

近日&#xff0c;北京合众伟奇科技股份有限公司正式加入飞桨技术伙伴计划&#xff0c;双方将共同努力在电力能源、工业制造等行业的AI技术应用及生态建设上做出贡献&#xff0c;致力构建“AI数智化服务”发展新模式&#xff0c;助力客户业务信息化、数字化、智能化升级。 北京合…

Grafana系列-统一展示-6-Zabbix仪表板

系列文章 Grafana 系列文章 &#x1f4dd;Notes: 关于 Grafana系列-统一展示-6-Zabbix 数据源, 其实已经在之前的文章: 使用 Grafana 统一监控展示 - 对接 Zabbix 里详细介绍过了, 感兴趣的请移步阅读. 知识储备 一个图表上的多个 Items 我们可以在 metric 字段内使用正则表…

在为缺少进项发票忧心忡忡?教你如何合理降低增值税!

​业务是流程&#xff0c;财税是结果&#xff0c;税收问题千千万&#xff0c;《税算盘》来帮你找答案。 缺少进项通常是指增值税专用发票缺少抵扣&#xff0c;增值税专用发票有能够抵扣税金的功能。企业出现缺少进项发票的情况时&#xff0c;就会进一步影响企业的所得税税负。…

海睿思分享 | 制造业数字化转型之路

近年来&#xff0c;制造业企业数字化转型的话题一直处于行业高热位置。中央经济工作会议作出“大力发展数字经济”的部署&#xff0c;工信部提出要深化产业数字化转型&#xff0c;建设一批全球领先的智能工厂、智慧供应链&#xff0c;并向中小企业场景化、标准化复制推广。近期…

c#笔记-特性

特性 添加特性 特性是一种用于给代码添加额外信息的声明性标签。 在修饰的元素之前&#xff0c;用方括号声明特性。 [Obsolete("过时的类")] public class MyClass1 {}需要声明多个特性时&#xff0c;可以使用多个方括号&#xff0c;也可以在一个方括号里使用逗号…

STL好难(1):STL简介

目录 1. 什么是STL&#xff1a; 2. STL的版本&#xff1a; &#xff08;1&#xff09;原始版本 &#xff08;2&#xff09;P.J.版本 &#xff08;3&#xff09;RW版本 &#xff08;4&#xff09;SGL版本 3. STL的六大组件&#xff1a; 4. SLT的重要性 &#xff08;1&a…

医院医学影像系统PACS,使用手册和操作说明书。

首先&#xff0c;系统可实现检查预约、病人信息登记、计算机阅片、电子报告书写、胶片打印、数据备份等一系列满足影像科室日常工作的功能,并且由于影像数字化存储,用户可利用影像处理与测量技术辅助诊断、方便快捷地查找资料或利用网络将资料传输至临床科室&#xff0c;还可与…

femu使用记录

femu使用记录 环境搭建libnvme&#xff1a;libnvme.so.1: cannot open shared object file: No such file or directory调试方法 Briefly speaking, FEMU is a fast, accurate, scalable, and extensible NVMe SSD Emulator. Based upon QEMU/KVM, FEMU is exposed to Guest OS…

《花雕学AI》Poe 上的四种 AI 机器人,你该怎么选?ChatGPT、Sage、Claude 和 Dragonfly对比

虽然 ChatGPT 是一项革命性的技术&#xff0c;但它作为一个消费产品却有点失败。你可能会花很长时间等待 OpenAI 的聊天机器人加载&#xff0c;或者根本无法使用它&#xff0c;因为它太大了。就算你能用上它&#xff0c;它也很缓慢&#xff0c;而且它的界面也很丑陋。它甚至没有…

连接(基础版)

QUESTION ONE # Write your MySQL query statement below select unique_id,name from EmployeeUNI right join Employees on EmployeeUNI.id Employees.id 这题很显然有两张表需要进行连接&#xff0c;在我们确定完要取的字段后&#xff0c;就需要连接两张表&#xff0c;…

鸿蒙Hi3861学习十二-Huawei LiteOS-M(osXX与LOS_XX)

一、LOS_XX是什么 LOS_XX是LiteOS_M或LiteOS_A内核提供的接口。例如&#xff1a;LOS_TaskCreate、LOS_TaskCreate、LOS_SemCreate等。因为LiteOS_M和LiteOS_A是针对不同的内核&#xff0c;所以LOS_XX在实现上也是有所不同的。也就是说LOS_XX跟具体的内核类型是有关系的。 这里只…

伸展树详解

伸展树的概念 伸展树&#xff08;Splay Tree&#xff09;是仅依靠局部性原理和局部平衡分析&#xff0c;从而实现高效的自适应平衡树结构。是一种二叉查找树&#xff0c;其核心思想是将最近访问的节点旋转到根节点。每次进行访问、插入、删除等操作时&#xff0c;都会选择与之…