【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 1982|回复: 1

[Godot基础知识] Godot基础教程_【4】_简单的2D游戏【转自9秒首发】

[复制链接]
发表于 2014-3-10 22:47:08 | 显示全部楼层 |阅读模式
简单的简单的2D游戏(Pong!)
乒乓球
在这个简单的教程中,制作一个基本的乒乓球游戏。还有许多更复杂的示例包含在demo中,但是这里应该为2D游戏介绍一下基本功能。
资源
教程中的一些资源包含在这里:http://www.godotengine.org/wiki/lib/exe/fetch.php?media=pong_assets.zip
场景设置
在过去,游戏一般是640x400的分辨率。这可以在项目设置中配置(参考之前的教程)。默认的背景色设置为黑色:


创建一个Node2D型的根节点,做完后,添加一些Sprite类型的精灵节点,并设置对应的材质。最后,场景和场景树看起来应该是这样的:


保存场景,命名为“pong.scn”并设置它为项目的主场景。
输入操作设置
电子游戏的输入方法有很多...键盘,手柄,鼠标,触屏(多点触屏)。但是这只是个乒乓球,唯一需要解决的输入就平板的上下移动。
处理所有可能的输入方式是令人头疼的,并需要写大量的代码。事实上,更糟糕的是有很多游戏允许自定义控制器。因此,Godot创建了“输入动作”。一个动作被定义,输入方法的触发器就被添加。

再次打开项目属性对话框,但是这次打开“Input Map”标签,添加四个动作:“left_move_up”,“left_move_down”,“right_move_up”,“right_move_down”。把你希望的值赋给键。多数情况下,把A/Z赋给左边,并且把Up/Down赋给右边。如图:



[size=0.83em]3.jpg (367.58 KB, 下载次数: 150)
下载附件  保存到相册
[color=rgb(153, 153, 153) !important]2014-2-17 11:49 上传



脚本

为场景的根结点创建一个脚本,并打开它。脚本将会继承Node2D:[mw_shl_code=python,true]extends Node2D

func _ready():
        pass[/mw_shl_code]
我们需要在开始做两件事,第一件是开启处理器,第二件是存储一些有用的值。像屏幕和平板的尺寸这样的值:[mw_shl_code=python,true]extends Node2D

var screen_size
var pad_size

func _ready():
        screen_size = get_viewport_rect().size
        pad_size = get_node("left").get_texture().get_size()
        set_process(true)[/mw_shl_code]然后将添加在游戏中的一些变量:[mw_shl_code=python,true]#speed of the ball (in pixels/second) # 小球的速度(像素/每秒)
var 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[/mw_shl_code]最后,处理函数:[mw_shl_code=python,true]func _process(delta):[/mw_shl_code]获取一些用于计算的有用的值。第一个是小球的坐标(从节点获取),第二个是平板的矩形(Rect2)。Sprite默认注册点在材质中心,所以一个size/2的小调整应该被添加:[mw_shl_code=python,true]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 )[/mw_shl_code]得到坐标后,积算就很简单了:[mw_shl_code=python,true]ball_pos+=direction*ball_speed*delta[/mw_shl_code]  现在小球有了新的坐标,应该测试它的反弹,首先是底板和顶板。[mw_shl_code=python,true]if ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)):
                direction.y = -direction.y
[/mw_shl_code]如果触碰到一个平板,改变方向同时增加一点速度:[mw_shl_code=python,true] 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()[/mw_shl_code]如果小球飞出屏幕,游戏结束,重启游戏:[mw_shl_code=python,true]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)[/mw_shl_code]
      一旦小球准备好了,节点被新坐标更新[mw_shl_code=python,true] get_node("ball").set_pos(ball_pos)[/mw_shl_code]平板只按照玩家输入而更新,Input类在这里很有用:[mw_shl_code=python,true]#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)[/mw_shl_code]就是这样!一个简单的乒乓球游戏就用少量的代码写好了。运行结果如下:

发表于 2014-5-13 16:00:02 | 显示全部楼层
爱死你了,这么好的帖子要顶的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-4-29 07:24

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表