Skip to content
On this page

凹语言山寨马斯克星舰小游戏


美国太空探索技术公司(SpaceX)新一代重型运载火箭“星舰”当日发射升空。这是“星舰”第五次试飞,将首次尝试用发射塔的机械臂在半空中捕获助推器以实现回收。

为了致敬SpaceX在星舰的最新实验成果,我们用凹语言移植(山寨)一个马斯克星舰小游戏。原始的游戏是TinyGo实现,代码在:https://github.com/venlinz/simple-game-wasm4。用凹语言移植后的效果:

在线地址:https://wa-lang.org/wa/w4-rocket/

星舰小游戏代码

代码在主仓库的waroot/examples/w4-rocket目录:

wa
// 版权 @2024 W4-rocket 作者。保留所有权利。

import "syscall/wasm4"

global rocket = [13]byte{
	0b00111100,
	0b01111110,
	0b11111111,
	0b11111111,
	0b11000011,
	0b11000011,
	0b11111111,
	0b11111111,
	0b01111110,
	0b11111111,
	0b11111111,
	0b00111100,
	0b00011000,
}

global rocket_unthrust = [13]byte{
	0b00111100,
	0b01111110,
	0b11111111,
	0b11111111,
	0b11000011,
	0b11000011,
	0b11111111,
	0b11111111,
	0b01111110,
	0b11111111,
	0b11111111,
	0b00000000,
	0b00000000,
}

global car_pos_x = 0
global car_pos_y = 0

func init {
	frameBuffer := wasm4.GetFramebuffer()
	for i := range frameBuffer {
		frameBuffer[i] = 1 | (1 << 2) | (1 << 4) | (1 << 6)
	}
}

#wa:export update
func Update {
	wasm4.SetPalette2(0xff0000)

	wasm4.SetDrawColorsU16(0x31)
	wasm4.Blit(rocket_unthrust[:], car_pos_x, car_pos_y, 8, 13, wasm4.BLIT_1BPP)

	gamepad := wasm4.GetGamePad1()

	if gamepad&wasm4.BUTTON_LEFT != 0 {
		if car_pos_x > 0 {
			car_pos_x--
		}
		wasm4.Blit(rocket_unthrust[:], car_pos_x, car_pos_y, 8, 13, wasm4.BLIT_1BPP)
	}

	wasm4.Text("<", 0, 150)
	if gamepad&wasm4.BUTTON_RIGHT != 0 {
		if car_pos_x < 150 {
			car_pos_x++
		}
		wasm4.Blit(rocket_unthrust[:], car_pos_x, car_pos_y, 8, 13, wasm4.BLIT_1BPP)
	}
	wasm4.Text(">", 152, 150)
	if gamepad&wasm4.BUTTON_UP != 0 {
		if car_pos_y > 0 {
			car_pos_y--
		}
		wasm4.Blit(rocket[:], car_pos_x, car_pos_y, 8, 13, wasm4.BLIT_1BPP)
	}

	if gamepad&wasm4.BUTTON_DOWN != 0 {
		if car_pos_y < 150 {
			car_pos_y++
		}
		wasm4.Blit(rocket_unthrust[:], car_pos_x, car_pos_y, 8, 13, wasm4.BLIT_1BPP)
	}
}

主要是通过方向键控制星舰的飞行,游戏虽然简单但也是凹语言星辰大海幻想的第一步。Let's dive!