No.1|Godot|俄罗斯方块复刻|棋盘和初始方块的设置

news2025/1/15 23:34:50
  1. 删掉基础图标
  2. 新建assets、scenes、scripts文件夹
    ![[Pasted image 20250111005741.png]]

俄罗斯方块的每种方块都是由四个小方块组成的,很适合放在网格地图中
比如网格地图是宽10列,高20行
要实现网格的对齐和下落

Node2D节点
  1. 新建一个Node2D
    ![[Pasted image 20250111005728.png]]

  2. 添加2个TileMapLayer
    ![[Pasted image 20250111005843.png]]

  3. 一个命名为Board,另一个命名为Active
    ![[Pasted image 20250111010034.png]]

  4. 给Board新建一个图块库
    ![[Pasted image 20250111010029.png]]

  5. 图块大小为32乘32
    ![[Pasted image 20250111010209.png]]

  6. 下方打开TileSet
    ![[Pasted image 20250111010239.png]]

  7. 添加图块
    ![[Pasted image 20250111010529.png]]

  8. 选择TileMap和第八个灰色的图块
    ![[Pasted image 20250111010747.png]]

  9. 选择矩形
    ![[Pasted image 20250111010827.png]]

  10. 画一个12乘22的网格
    ![[Pasted image 20250111011052.png]]

  11. 再用鼠标右键点击,划掉中间的部分
    ![[Pasted image 20250111011215.png]]

Node2D脚本

添加脚本,将其添加到scripts文件夹里

extends Node2D # 此脚本扩展自Node2D,作为游戏的主节点

# 定义 I 型俄罗斯方块的所有旋转状态,每种状态由方块相对原点的坐标组成
var i_tetromino: Array = [
	[Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1), Vector2i(3, 1)], # 0 degrees
	[Vector2i(2, 0), Vector2i(2, 1), Vector2i(2, 2), Vector2i(2, 3)], # 90 degrees
	[Vector2i(0, 2), Vector2i(1, 2), Vector2i(2, 2), Vector2i(3, 2)], # 180 degrees
	[Vector2i(1, 0), Vector2i(1, 1), Vector2i(1, 2), Vector2i(1, 3)]  # 270 degrees
]

# 定义 T 型俄罗斯方块的所有旋转状态
var t_tetromino: Array = [
	[Vector2i(1, 0), Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1)], # 0 degrees
	[Vector2i(1, 0), Vector2i(1, 1), Vector2i(2, 1), Vector2i(1, 2)], # 90 degrees
	[Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1), Vector2i(1, 2)], # 180 degrees
	[Vector2i(1, 0), Vector2i(0, 1), Vector2i(1, 1), Vector2i(1, 2)]  # 270 degrees
]

# 定义 O 型俄罗斯方块的所有旋转状态(所有旋转状态相同)
var o_tetromino: Array = [
	[Vector2i(0, 0), Vector2i(1, 0), Vector2i(0, 1), Vector2i(1, 1)], # All rotations are the same
	[Vector2i(0, 0), Vector2i(1, 0), Vector2i(0, 1), Vector2i(1, 1)], # All rotations are the same
	[Vector2i(0, 0), Vector2i(1, 0), Vector2i(0, 1), Vector2i(1, 1)], # All rotations are the same
	[Vector2i(0, 0), Vector2i(1, 0), Vector2i(0, 1), Vector2i(1, 1)]  # All rotations are the same
]

# 定义 Z 型俄罗斯方块的所有旋转状态
var z_tetromino: Array = [
	[Vector2i(0, 0), Vector2i(1, 0), Vector2i(1, 1), Vector2i(2, 1)], # 0 degrees
	[Vector2i(2, 0), Vector2i(1, 1), Vector2i(2, 1), Vector2i(1, 2)], # 90 degrees
	[Vector2i(0, 1), Vector2i(1, 1), Vector2i(1, 2), Vector2i(2, 2)], # 180 degrees
	[Vector2i(1, 0), Vector2i(0, 1), Vector2i(1, 1), Vector2i(0, 2)]  # 270 degrees
]

# 定义 S 型俄罗斯方块的所有旋转状态
var s_tetromino: Array = [
	[Vector2i(1, 0), Vector2i(2, 0), Vector2i(0, 1), Vector2i(1, 1)], # 0 degrees
	[Vector2i(1, 0), Vector2i(1, 1), Vector2i(2, 1), Vector2i(2, 2)], # 90 degrees
	[Vector2i(1, 1), Vector2i(2, 1), Vector2i(0, 2), Vector2i(1, 2)], # 180 degrees
	[Vector2i(0, 0), Vector2i(0, 1), Vector2i(1, 1), Vector2i(1, 2)]  # 270 degrees
]

# 定义 L 型俄罗斯方块的所有旋转状态
var l_tetromino: Array = [
	[Vector2i(2, 0), Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1)], # 0 degrees
	[Vector2i(1, 0), Vector2i(1, 1), Vector2i(1, 2), Vector2i(2, 2)], # 90 degrees
	[Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1), Vector2i(0, 2)], # 180 degrees
	[Vector2i(0, 0), Vector2i(1, 0), Vector2i(1, 1), Vector2i(1, 2)]  # 270 degrees
]

# 定义 J 型俄罗斯方块的所有旋转状态
var j_tetromino: Array = [
	[Vector2i(0, 0), Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1)], # 0 degrees
	[Vector2i(1, 0), Vector2i(2, 0), Vector2i(1, 1), Vector2i(1, 2)], # 90 degrees
	[Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1), Vector2i(2, 2)], # 180 degrees
	[Vector2i(1, 0), Vector2i(1, 1), Vector2i(0, 2), Vector2i(1, 2)]  # 270 degrees
]

# 将所有俄罗斯方块的数组存入 tetrominoes 数组
var tetrominoes: Array = [i_tetromino, t_tetromino, o_tetromino, z_tetromino, s_tetromino, l_tetromino, j_tetromino]

# 创建所有方块的副本用于重置
var all_tetrominoes: Array = tetrominoes.duplicate()

# 设置游戏区域的列数和行数
const COLS: int = 10
const ROWS: int = 20

# 定义初始方块生成的起始位置
const START_POSITION: Vector2i = Vector2i(5, 1)
# 当前方块的位置
var current_position: Vector2i

# 当前和下一个方块的形状及旋转角度
var cunrrent_tetromino_type: Array
var next_tetromino_type: Array
# 当前旋转状态
var rotation_index: int = 0
# 当前方块的形态
var active_tetromino: Array = []

# Tile ID 和图块信息
var tile_id: int = 0
var piece_atlas: Vector2i
var next_piece_atlas: Vector2i

# 连接节点
@onready var board_layer: TileMapLayer = $Board
@onready var active_layer: TileMapLayer = $Active

# 准备函数,在游戏开始时调用
func _ready() -> void:
	start_new_game()

# 开始新的游戏
func start_new_game() -> void:
	# 随机选择一个方块类型
	cunrrent_tetromino_type = choose_tetromino()
	# 计算方块在 Tileset 中的图块索引
	piece_atlas = Vector2i(all_tetrominoes.find(cunrrent_tetromino_type), 0)
	# 初始化方块的位置和显示
	initialize_tetromino()

# 随机选择一个方块类型
func choose_tetromino() -> Array:
	var selected_tetromino: Array
	# 如果当前类型池不为空
	if not tetrominoes.is_empty():
		# 打乱类型池顺序
		tetrominoes.shuffle()
		# 取出第一个类型
		selected_tetromino = tetrominoes.pop_front()
	else:
		# 重置类型池
		tetrominoes = all_tetrominoes.duplicate()
		tetrominoes.shuffle()
		selected_tetromino = tetrominoes.pop_front()
	return selected_tetromino

# 初始化当前方块
func initialize_tetromino() -> void:
	# 将当前方块的位置设置为起始位置(通常在游戏顶部中央)
	current_position = START_POSITION
	# 获取当前方块在当前旋转状态下的形态
	active_tetromino = cunrrent_tetromino_type[rotation_index]
	# 渲染当前方块到网格层(显示方块)
	render_tetromino(active_tetromino, current_position, piece_atlas)

# 渲染俄罗斯方块到指定位置
func render_tetromino(tetromino: Array, position: Vector2i, atlas: Vector2i) -> void:
	# 遍历当前方块的所有方块单元(每个单元以 Vector2i 表示)
	for block in tetromino:
		# 使用方块的全局位置(初始位置加单元偏移量)设置网格层的对应单元
		# - position + block: 当前单元格在网格中的全局位置
		# - tile_id: 当前方块的唯一标识符,用于区分不同类型的方块
		# - atlas: 方块对应的图块信息,用于绘制特定样式
		board_layer.set_cell(position + block, tile_id, atlas)

这段代码定义了一个俄罗斯方块游戏的基础框架,用于管理游戏中的方块数据、游戏区域以及方块的生成和显示逻辑。

核心思想
  • 方块表示与旋转: 每种俄罗斯方块由其所有可能的旋转状态定义(0°、90°、180°、270°),这些状态通过Vector2i表示的相对坐标来描述。
  • 动态方块池管理: 使用一个池子管理可用的方块类型,每次随机从池中取出一个方块,当池为空时重新填充并随机打乱顺序。
  • 游戏区域: 游戏区域被定义为一个网格,玩家的目标是控制方块在网格内移动、旋转,并最终填满一行消除得分。
  • 图块渲染: 使用TileMapLayer将方块的形状和位置显示到游戏画面中。
    ![[Pasted image 20250111103600.png]]

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

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

相关文章

蓝桥云客第 5 场 算法季度赛

题目: 2.开赛主题曲【算法赛】 - 蓝桥云课 问题描述 蓝桥杯组委会创作了一首气势磅礴的开赛主题曲,其歌词可用一个仅包含小写字母的字符串 S 表示。S 中的每个字符对应一个音高,音高由字母表顺序决定:a1,b2,...,z26。字母越靠后…

刀客doc:快手的商业化架构为什么又调了?

一、 1月10日,快手商业化及电商事业部进行新一轮的架构调整。作为2025年快手的第一次大调整,变动最大的是负责广告业务的商业化事业部。快手商业化将原来的8个业务中心,现在统合成了5个,行业归拢看上去更加明晰了。 根据自媒体《…

6.2 MySQL时间和日期函数

以前我们就用过now()函数来获得系统时间,用datediff()函数来计算日期相差的天数。我们在计算工龄的时候,让两个日期相减。那么其中的这个now函数返回的就是当前的系统日期和时间。 1. 获取系统时间函数 now()函数,返回的这个日期和时间的格…

mock服务-通过json定义接口自动实现mock服务

go-mock介绍 不管在前端还是后端开发过程中,当我们需要联调其他服务的接口,而这个服务还没法提供调用时,那我们就要用到mock服务,自己按接口文档定义一个临时接口返回指定数据,以供本地开发联调测试。 怎么快速启动一…

sparkSQL练习

1.前期准备 (1)建议先把这两篇文章都看一下吧,然后把这个项目也搞下来 (2)看看这个任务 (3)score.txt student_id,course_code,score 108,3-105,99 105,3-105,88 107,3-105,77 105,3-245,87 1…

CSS | 实现三列布局(两边边定宽 中间自适应,自适应成比)

目录 示例1 (中间自适应 示例2(中间自适应 示例3(中间自适应 示例4 (自适应成比 示例5(左中定宽,右边自适应 示例6(中间自适应 示例7(中间自适应 示例8(中间定宽…

力扣 子集

回溯基础,一题多解,不同的回朔过程。 题目 求子集中,数组的每种元素有选与不选两种状态。因此在使用dfs与回溯时把每一个元素分别进行选与不选的情况考虑即可。可以先用dfs跳过当前元素即不选然后一直深层挖下去,直到挖到最深了即…

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址(Internet Protocol Address)是指互联网协议地址。 它是分配给连接到互联网的设备(如计算机、服务器、智能手机…

RocketMQ 知识速览

文章目录 一、消息队列对比二、RocketMQ 基础1. 消息模型2. 技术架构3. 消息类型4. 消费者类型5. 消费者分组和生产者分组 三、RocketMQ 高级1. 如何解决顺序消费和重复消费2. 如何实现分布式事务3. 如何解决消息堆积问题4. 如何保证高性能读写5. 刷盘机制 (topic 模…

C++(类和对象)

C中的类 C中兼容对C语言中struct的所有用法.同时C对struct进行了语法的升级.将struct升级成了类. // c中对于struct的改进: struct Stack {int* a;int top;int capacity; } int main() { Stack s;// 这里可以直接使用Stack进行使用,而不再需要struct关键字了return 0; }注意:…

centos 8 中安装Docker

注:本次样式安装使用的是centos8 操作系统。 1、镜像下载 具体的镜像下载地址各位可以去官网下载,选择适合你们的下载即可! 1、CentOS官方下载地址:https://vault.centos.org/ 2、阿里云开源镜像站下载:centos安装包…

Sui Move:基本概览一

Module (模块) Move 代码被组织成模块, 可以把一个模块看成是区块链上的一个智能合约 可以通过调用这些模块中的函数来与模块进行交互,可以通过事务或其他 Move 代码来实现, 事务将被发送到并由Sui区块链进行处理,一旦执行完成,结果的更改将…

1/13+2

运算符重载 myString.h #ifndef MYSTRING_H #define MYSTRING_H #include <cstring> #include <iostream> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度int capacity; …

GD32F470Z外部晶振不起振

亲测&#xff0c;主要的原因是因为系统配置里面选择的晶振&#xff0c;选择内部还是外部的无源晶振。 1.无源晶振 打开startup_gd32f450_470.s这个起始文件。 ​​​​​​​ ​​​​​​​ 找到SystemInit。 跳进去这个函数。 在这个函数里面最底下找到sys…

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

【2025 Rust学习 --- 17 文本和格式化 】

字符串与文本 Rust 的主要文本类型 String、str 和 char 内容概括&#xff1a; Unicode 背景知识&#xff1f;单个 Unicode 码点的 char&#xff1f;String 类型和 str 类型都是表示拥有和借用的 Unicode 字符序列。Rust 的字符串格式化工具&#xff0c;比如 println! 宏和 …

C#中颜色的秘密

颜色的秘密: 颜色Color是一个调色板, 所有颜色都是由透明度Alpha,红Red,绿Green,蓝Blue按不同比例调色混合而成,如果不考虑透明度Alpha,颜色共有256*256*25616777216种 ColorARGB A,R,G,B都为byte型[8位],因此可以用整体的32个整数[Int32]来表示一种颜色 Color 所属命名空…

Pycharm 使用教程

一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的&#xff1a;创建适用于该项目的环境&#xff0c;与系统环境隔离&#xff0c;防止污染系统环境&#xff08;包括需要的库&#xff09;虚拟环境配置存放在项目根目录下的 ven…

phpenc加密程序源码

免费扩展加密程序&#xff0c;类似于sg11加密&#xff0c;支持单个PHP&#xff08;免费&#xff09;文件以及批量PHP文件&#xff08;ZIP压缩包格式&#xff09;源码加密的保护平台&#xff0c;加密后的源码文件保持原有代码结构&#xff0c;可以跨平台运行&#xff0c;可以运行…

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程&#xff0c;这一过程在现代数字媒体中扮演着至关重要的角色。众所周知&#xff0c;视频转码不仅仅是简单的格式转换&#xff0c;它涉及多个关键参数的改变&#xff0c;例如视频编码格式、比特率、分辨率以及帧率…