[NS语言] 01-语言设计

第一阶段:设计与规划

定位&目标

  • 用途: 游戏脚本, 高性能, 易嵌入
  • 目标用户: 游戏开发者, 或其他快速一次性脚本
  • 核心特性: 动态类型, OOP, 协程
  • 差异化: 语言独特价值(暂时没想好)
  • 宿主环境: 独立解释器或内嵌(zig / c / c++)

核心语法

  • 基础结构:
    • 变量声明: var x
    • 赋值: x = 10
    • 基本数据类型
      • 数字
      • 字符串
      • 布尔
      • 枚举
      • null
      • 元组
    • 注释 // 注释
  • 表达式:
    • 算术运算符 + - * / %
    • 移位运算符 >> <<
    • 比较运算符 > >= < <= != ==
    • 逻辑运算符 and or not
    • 位运算符 & | ~ ^
  • 控制流:
    • if/elif/else
    • while/for/continue/break
  • 函数:
    • 声明函数(传参/返回值): fn add(a, b) int
    • 调用函数x = add()
  • 数据结构:
    • 数组: [1, 2, "hello"]
    • 哈希表(map/set): {1: "s", "d": 1}
  • 示例代码(前期实现):
// ------------------------------基础结构------------------------------
// 变量声明(动态类型)
var health = 100          // 数字(自动识别为int/double)
var name = "Player1"      // 字符串
var isAlive = true        // 布尔
var item = null           // 空值
enum Dir { UP, DOWN }     // 枚举
var pos = (x: 1, y: 2)    // 元组(轻量级数据结构)
var user = ("John", 18)   // 匿名元组
//  这是单行注释           // 单行注释

var damage = attack * (1 + criticalBonus) - defense

// 位运算(适合游戏状态标志)
var flags = COLLISION_FLAG | RENDER_FLAG
var hasFlag = (flags & REQUIRED_FLAG) != 0

// 空值安全操作
var itemName = inventory?.getSelected()?.name ?? "Empty"

// 三元表达式
var status = health > 0 ? "Alive" : "Dead"


// ------------------------------控制流------------------------------
// 循环控制
for (var i in 0..enemies.count) {
    enemies[i].update()
}

// 容器迭代
for (enemy in enemies) {
    enemy.render()
}

// 普通while
while (condition) {
    // do something
    // continue / break
}

// 带标签的break(适合嵌套循环)
outer: while (condition) {
    while (innerCond) {
        if (shouldExit) break outer
    }
}


// ------------------------------函数设计------------------------------
// 基本函数
fn calculateDamage(attacker, defender) -> int {
    return attacker.attack - defender.defense
}

// 带默认参数和命名参数
fn spawnEnemy(type = "Orc", position = (0,0,0), health = 100) -> void {
    // ...
}

spawnEnemy(position: (10,5,3), type: "Dragon") // 函数调用

// 函数作为一等公民
var combatHandlers = [
    melee: (a, b) -> void { /* 近战逻辑 */ },
    ranged: (a, b) -> void { /* 远程逻辑 */ }
]


// ------------------------------数据结构------------------------------
// 数组
var enemies = [Enemy(), Enemy(), Enemy()]
enemies.push(BossEnemy())  // 动态扩容

// 哈希表(字典)
var weaponStats = {
    "sword": { damage: 15, speed: 1.2 },
    "bow": { damage: 10, speed: 0.8 }
}

// 集合
var activePlayers = Set()

待定语法

  • 面向对象
// ------------------------------面向对象------------------------------
class GameObject {
    // 字段
    var position = (x: 0.0, y: 0.0)
    var isActive = true
    
    // 构造函数
    init(position) {
        this.position = position
    }
    
    // 方法
    fn update(deltaTime) -> void {
        // 虚方法,可重写
    }
    
    // 析构函数(资源清理)
    deinit {
        releaseResources()
    }
}

// 继承(单继承+接口)
class Player : GameObject, Damageable {
    var health = 100
    
    // 重写方法
    override fn update(deltaTime) -> void {
        processInput()
        super.update(deltaTime)
    }
    
    // 接口实现
    fn takeDamage(amount) -> void {
        health -= amount
    }
}

// 接口协议
interface Damageable {
    fn takeDamage(amount) -> void
}
  • 协程设计

// ------------------------------协程设计------------------------------
// 协程定义(游戏序列常用)
coroutine fn enemySpawnSequence() -> void {
    yield waitSeconds(2.0)  // 等待2秒
    
    for (i in 0..5) {
        spawnEnemy(type: "Orc")
        yield waitFrames(30)  // 等待30帧
    }
    
    spawnBoss()
}

// 在游戏循环中驱动协程
fn gameLoop() -> void {
    while running {
        // 更新所有协程
        CoroutineScheduler.updateAll()
        // ...
    }
}

// 异步操作(加载资源)
async fn loadLevelAssets() -> Tuple {
    var textures = await ResourceLoader.loadTextures()
    var models = await ResourceLoader.loadModels()
    return (textures, models)
}
posted @ 2025-08-14 17:42  会飞的键盘侠  阅读(20)  评论(0)    收藏  举报