godot制作简单2D游戏Pong
来源:互联网 发布:unity3d ugui虚拟摇杆 编辑:程序博客网 时间:2024/05/07 13:12
Pong
godot 的源码目录 demos中带来好多游戏demo,这里只介绍在2D游戏中基本的函数使用。
Assets
需要用到的资源 pong pads, the ball and the divisor。
Scene Setup
由于是最初版本,所以游戏的分辨率为640X400像素,可以在Scene-->Project Settings处进行设置。场景的背景设置为黑色,如下图:添加一个Node2D节点,Node2D是一个基础类型在2D引擎中。在这之后添加Sprite node,并且每一个Sprite node 都在Texture属性处load一个贴图。最终运行的结果如图:
场景中的节点树:
保存当前场景为pong.scn并将当前场景在Scene-->Project Settings处设置为main scene。
Input Actions Setup
对于视频游戏的输入方式有许多,键盘,鼠标,手柄,多点触屏等等,然而这个游戏是乒乓游戏,只需要输入上下来控制球拍就可以了,处理所有可能的输入方法是很令人沮丧的并且需要很多的代码,大多数游戏允许控制器的自定制使这种情况更加糟糕,对于这点,godot自建了"Input Actions",定义一个输入动作,然后输入动作被触发时输入方法就会添加到输入动作中。
再一次打开Scene-->Project Settings,这次点开"Input Map"选项卡。添加4个actions: "left_move_up","left_move_down","right_move_up","right_move_down",并为这4个动作指定按键。如图所示:
Script
为场景中的root节点添加一个脚本,编辑脚本,脚本会继承Node2D,
extends Node2Dfunc _ready(): pass
在构造函数中,要做2件事情,第一件事情启动processing,第二件事情是保存有用的变量,比如场景和球拍的尺寸:extends Node2Dvar screen_sizevar pad_sizefunc _ready(): screen_size = get_viewport_rect().size pad_size = get_node("left").get_texture().get_size() set_process(true)接下来,添加一些在游戏中会用到的变量:
#speed of the ball (in pixels/second0var ball_speed = 80#direction of the ball (normal vector)var direction = Vector2(-1,0)#constant for pad speed (also in pixels/second)const PAD_SPEED = 150最后,是process函数:
func _process(delta):获得一些对接下来的运算有用的值,第一个是球的位置(也就是球节点的x,y坐标),第二个是矩形球拍的位置,中间的分界线的位置,
var ball_pos = get_node("ball").get_pos() var left_rect = Rect2( get_node("left").get_pos() - pad_size/2, pad_size ) var right_rect = Rect2( get_node("right").get_pos() - pad_size/2, pad_size )球是运动的,所以球的位置进行如下计算:
ball_pos+=direction*ball_speed*delta接下来,假设球在一个新位置,应该对球和周围的物体之间进行碰撞检测,首先是场景底部和顶部:
if ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)): direction.y = -direction.y如果与其中一个球拍发生了碰撞,球应该向相反方向运动,并且运动的速度也要增加一点点:
if ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)): direction.x=-direction.x ball_speed*=1.1 direction.y=randf()*2.0-1 direction = direction.normalized()
如果球出了屏幕,则game over,重新开始游戏:
if (ball_pos.x<0 or ball_pos.x>screen_size.x): ball_pos=screen_size*0.5 #ball goes to screen center ball_speed=80 direction=Vector2(-1,0)关于球的设置基本完成,接下来要不断更新球的位置:
get_node("ball").set_pos(ball_pos)
接下来是球拍的设置,只需要根据玩家的输入来确定球拍的运动方向,接下来的是输入类:#move left pad var left_pos = get_node("left").get_pos() if (left_pos.y > 0 and Input.is_action_pressed("left_move_up")): left_pos.y+=-PAD_SPEED*delta if (left_pos.y < screen_size.y and Input.is_action_pressed("left_move_down")): left_pos.y+=PAD_SPEED*delta get_node("left").set_pos(left_pos) #move right pad var right_pos = get_node("right").get_pos() if (right_pos.y > 0 and Input.is_action_pressed("right_move_up")): right_pos.y+=-PAD_SPEED*delta if (right_pos.y < screen_size.y and Input.is_action_pressed("right_move_down")): right_pos.y+=PAD_SPEED*delta get_node("right").set_pos(right_pos)
好了,乒乓的游戏demo就完成了!
最终的整个游戏的代码:
extends Node2Dvar screen_sizevar pad_sizevar ball_speed=80var direction=Vector2(-1,0)const PAD_SPEED=150func _ready():screen_size=get_viewport_rect().sizepad_size=get_node("left").get_texture().get_size()set_process(true)func _process(delta):var ball_pos = get_node("ball").get_pos()var left_rect = Rect2( get_node("left").get_pos() - pad_size/2, pad_size )var right_rect = Rect2( get_node("right").get_pos() - pad_size/2, pad_size )ball_pos+=direction*ball_speed*deltaif ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)): direction.y = -direction.yif ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)): direction.x=-direction.x ball_speed*=1.1 direction.y=randf()*2.0-1 direction = direction.normalized()if (ball_pos.x<0 or ball_pos.x>screen_size.x): ball_pos=screen_size*0.5 #ball goes to screen center ball_speed=80 direction=Vector2(-1,0)get_node("ball").set_pos(ball_pos) #move left pad var left_pos = get_node("left").get_pos()if (left_pos.y > 0 and Input.is_action_pressed("left_move_up")): left_pos.y+=-PAD_SPEED*deltaif (left_pos.y < screen_size.y and Input.is_action_pressed("left_move_down")): left_pos.y+=PAD_SPEED*deltaget_node("left").set_pos(left_pos) #move right pad var right_pos = get_node("right").get_pos()if (right_pos.y > 0 and Input.is_action_pressed("right_move_up")): right_pos.y+=-PAD_SPEED*deltaif (right_pos.y < screen_size.y and Input.is_action_pressed("right_move_down")): right_pos.y+=PAD_SPEED*deltaget_node("right").set_pos(right_pos)
0 0
- godot制作简单2D游戏Pong
- Godot教程中文版-一个简单的2D游戏(Simple 2D Game,Pong!)
- 开源3D&2D游戏开发引擎之GoDot简单介绍(一)
- 支持多平台!2D和3D游戏引擎Godot宣布开源
- 支持多平台的2D和3D游戏引擎Godot开源
- 支持多平台!2D和3D游戏引擎Godot宣布开源
- 支持多平台!2D和3D游戏引擎Godot宣布开源---脚本流
- 2D游戏制作
- 2d游戏制作原理
- Unity 2D游戏制作
- Unity 2D Pong Game
- Python之游戏Pong的简单实现
- 开源游戏3D引擎之Godot的专用脚本语言
- godot游戏引擎的GUI
- 使用Tiled制作2D游戏关卡
- 使用Tiled制作2D游戏关卡
- unity3d制作2d游戏的原理
- 使用Tiled制作2D游戏关卡
- Algorithm Gossip :八皇后问题
- latex 小技巧
- mysql日志
- 额头长痘痘的调理方法?
- LeetCode-Spiral Matrix
- godot制作简单2D游戏Pong
- 使用MATLAB进行一次和二次规划问题求解
- idea快捷键
- 我想知道痘痘怎样快速消除?
- 去掉#include 《stdio.h》这个程序在许多系统中仍然能够运行,但是在某些系统中运行起来却慢很多是为什么
- MSDN文档翻译 Learn to Program for Windows in C++ 004 序章第二节
- 如何使用html创建表格
- 鼻子上起了个痘痘怎么办?
- 怎么样使用yum来安装mysql