Godot基础教程01:实例-控制大炮

本节将讲解如何做一个简单的实例:

  • 用方向键左右控制大炮左右移动
  • 用方向键上下控制大炮炮口方向
  • 用空格键发射炮弹

大概就是这个效果:

素材准备


我自己用ps抠图,把图片抠出来,放到resources文件夹中:

分别是大炮的架子,用方块代替一下,炮管和炮弹。

场景布置

说明
Node2D : 根节点,Node2D类型
----dapao : 大炮节点,Sprite类型,加载资源dapao.png
--------paoguan : 炮管,Sprite类型,加载资源pao.png
------------zidanguadian : 子弹挂点,Node2D类型
--------lunzi : 轮子,Sprite类型,加载资源lunzi.png

保存这个场景,名为main.tscn
先保存了,然后可以一边修改,一边运行看效果。
main.tscn中只把我们的大炮放置好,让炮管可以在一定角度内旋转。

开始进行设置:

添加本地图片资源,一一添加完毕后,会看到:

我们将炮进行整体移动:
选中dapao节点

(备注:我们的屏幕分辨率设置的width: 1024, height: 600)

现在的大炮看起来是这样的:

选中paoguan,在属性面板的Offset的x输入100

测试一下:

看到炮管能正常绕着炮台旋转,测试完毕后,将炮管的属性面板中的旋转角度(Rotation Degrees)设置为0

新建一个场景,增加子节点如下:
在Node2D节点下新建一个Sprite节点,并为其添加炮弹的图片资源,不要修改它的位置。

存为zidan.tscn

主场景添加脚本

这下重头戏来了,我们先在main.tscn场景中,为根节点添加一个脚本,名为main.gd,内容如下:

extends Node2D#定义变量时在前面加 export,表示可以在编辑器中直接修改
#大炮左右移动的速度 px/s
export var speed = 100#炮管旋转速度 角度/s
export var rotation_speed = 60#发射CD s
export var cd = 0.3#炮管最高仰角
export var max_rotation = 60#炮管最低仰角
export var min_rotation = 0#加载zidan场景,并存到zidan变量中
var zidan = preload("res://zidan.tscn")#为当前的cd计时
var cd_timer = 0#每秒轮子需要转多少度
var r#初始化
func _ready():#计算每秒轮子需要转多少度#r放到这里计算而不是_process中,是因为这里计算结果不会改变#如果放到_process中,就会每帧计算重复的内容,影响运行效率r = speed / (150 * PI) * 360#每帧运行
func _process(delta):# 定义变量move,当按下左键或右键时,分别为move赋不同的值var move = 0if Input.is_action_pressed("ui_right"):move += 1if Input.is_action_pressed("ui_left"):move -= 1#这里使用 move+=1 、 move-=1,而不是 move=1 、 move=-1#这是因为前者在同时按下左右键时,move的最终结果为0,而后者的move最终结果为-1# 如果move不为0,说明按下了左或右键if move != 0:#使用 $节点名称 来调用节点,$节点名称/节点名称 来调用多层子节点#position是位置属性,rotation_degrees是以角度为单位的旋转,rotation是以弧度为单位的旋转#delta是_process方法的参数,表示本帧距离上一帧间隔的时间,单位是秒#速度乘以delta,可以确保在不同的帧率下,物体的移动速度相同$dapao.position.x += speed * move * delta$dapao/lunzi.rotation_degrees += r * move * delta#当按下上键或下键时,改变炮管的方向if Input.is_action_pressed("ui_up"):$dapao/paoguan.rotation_degrees -= rotation_speed * delta#限制仰角最大值,这里为什么要用负数呢,因为负数是逆时针,和我们在游戏里要的效果相反if $dapao/paoguan.rotation_degrees < -max_rotation:$dapao/paoguan.rotation_degrees = -max_rotationif Input.is_action_pressed("ui_down"):$dapao/paoguan.rotation_degrees += rotation_speed * deltaif $dapao/paoguan.rotation_degrees > min_rotation:$dapao/paoguan.rotation_degrees = min_rotation#记录cd时间cd_timer -= delta#当按下空格键时,发射子弹if Input.is_action_pressed("ui_select") and cd_timer < 0:#实例化一个zidan场景对象var zidanObj = zidan.instance()#设置这个子弹的位置,global_position为全局位置zidanObj.position = $dapao/paoguan/zidanguadian.global_position#使子弹的角度与炮管的当前角度相同zidanObj.rotation_degrees = $dapao/paoguan.rotation_degrees#把子弹添加进场景add_child(zidanObj)#设置cd时间cd_timer = cd

选中子弹挂点(后面发射子弹时,就是从这个点发射),将其Offset中的x设置为190,让其在炮管的出口位置:

炮弹场景脚本

extends Node2D#炮弹速度
export var speed = 500func _process(delta):#炮弹向右飞#因为在本场景被添加进主场景时,会将本场景的根节点角度设置为炮管的角度#所以本场景的Sprite只需要改变x坐标,也能实现向不同角度发射的目的$Sprite.position.x += speed * delta#当发射出去1000px远时,删除自身以释放资源if $Sprite.position.x > 1000:self.get_parent().remove_child(self)

编译运行:

全部代码已经放到github,地址:
https://github.com/xiaozia/GodotLearn.git,本例子的全部工程代码在project/cannon01中

说明:我照着原文地址做了2遍,对一些参数的设置进行了重新截图,与原文描述略有不同。

原文地址:
Godot基础教程04:实例-控制大炮

Godot基础教程01:实例-控制大炮相关推荐

  1. GSAP JS基础教程--动画的控制及事件

    好多天没有写无博文啦,今天无聊就再写一下! 今天要讲的是TweenLite的一些事件以及,TweenLite动画的控制,TweenMax类似,请自行参考官方文档:http://api.greensoc ...

  2. C#基础教程-c#实例教程,适合初学者

    C#基础教程-c#实例教程,适合初学者. 第一章 C#语言基础 本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和W ...

  3. Ardino基础教程 19_舵机控制

    实验十九:舵机控制 舵机控制实验Servo库版本的代码参考如下链接:ArduinoCode19-舵机控制Servo库版本代码.ino 舵机是一种位置伺服的驱动器,主要是由外壳.电路板.无核心马达.齿轮 ...

  4. GStreamer基础教程01 - Hello World

    摘要 在面对一个新的软件库时,第一步通常实现一个"hello world"程序,来了解库的用法.对于GStreamer,我们可以实现一个极简的播放器,来了解GStreamer的使用 ...

  5. stylus基础教程,stylus实例教程,stylus语法总结

    stylus特点 富于表现力.具有健壮性.功能丰富.动态编码 不需要写CSS的冒号.分号.大括号 和LESS.SASS功能类似,会这些的入手很快 文章目录 stylus特点 安装 使用 stylus语 ...

  6. Ardino基础教程 5_按键控制

    实验五:按键控制 I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的 ...

  7. Simscape基础教程之实例(一)——使用Simscape三维物理仿真自由落体小球碰撞平面

    一. 简介 本实例使用MATLAB/Simulink里面的simscape,实现自由落体小球碰撞平面的三维物理仿真,可用于新手入门simscape的参考示例. 二. 准备工作 需要安装的工具箱 (1) ...

  8. 软件开发实训(720)科技---Axure8.0基础教程01

    基础51.   生成部分原型页面 发布原型时,如果不需要将所有页面生成或发布,可以在生成HTML的设置中打开[页面]的设置,取消[生成所有页面]的勾选,则可以设置生成指定的页面.注意,子级页面无法单独 ...

  9. (五)DSP28335基础教程——外部中断控制(按键触发)

    0 前言 本期实验目标:采用外部中断方式响应按键触发,实现LED电平反转. 外部中断是DSP十分常用的功能,通常用来响应一些控制操作,比如判断按键是否按下,传感器是否接收到信号等等.那么通过该例程,大 ...

最新文章

  1. 犹豫了许久,还是写个年总结记录一下吧
  2. 什么是 XML Web Service
  3. nginx ruoyi 配置静态资源服务
  4. 倒计时 1 天 | 2019 中国大数据技术大会(BDTC)报名通道即将关闭(附参会提醒)...
  5. 用习惯了windows系统要怎样去认识linux系统(三)
  6. python request.get_Python request.get_data方法代码示例
  7. Linux压力测试工具
  8. excel按拼音顺序排序_如何在Excel中按字母顺序排序工作表选项卡
  9. python unmatched_Python
  10. mysql备份命令_mysql命令行备份方法
  11. nginx 配置基于域名的虚拟主机
  12. 计算机基础内容相关的论文,有关于计算机基础论文范文
  13. css语义化命名_为什么我只在生产中使用语义命名
  14. 7、任务分配-任务分派其他人
  15. ios友联统计的一些功能
  16. GitChat · 前端 | Webpack 工程的 PWA 实战
  17. 图像分割与提取:交互式前景提取(附OpenCV代码实现)
  18. 使用excel打开文件,修正长度过长的数字后几位变为0的问题
  19. 获取具体日期N个月前(后)的自然月时间戳
  20. Tekton系列之实践篇-由Jenkins改成Tekton

热门文章

  1. Android(安卓)高仿微信朋友圈九宫格列表
  2. python处理nc数据转换为tif格式
  3. 【Axure RP9基础】CSDN登录框(二)之验证码倒计时
  4. 人工智能领域,符号计算、模式识别、专家系统和机器翻译的基本介绍
  5. AMBA-AHB Lite协议
  6. CPT104操作系统笔记(scheduling I)
  7. BingPi V3s:一步一个脚印
  8. SPI Flash 读/写/擦除函数(适用于1MB Flash)
  9. 微信小程序实现不定长文字步骤条+气泡框
  10. linux 中 vim/vi的常用命令