Godot 游戲引擎 Your first game 學(xué)習(xí)筆記

1.控制玩家移動(dòng)

func _process(delta): 中進(jìn)行處理 :

    var velocity = Vector2()
    if Input.is_action_pressed("ui_up"):
        velocity.y -= 1
    if Input.is_action_pressed("ui_down"):
        velocity.y += 1
    if Input.is_action_pressed("ui_left"):
        velocity.x -= 1
    if Input.is_action_pressed("ui_right"):
        velocity.x += 1
    if velocity.length() > 0:
        velocity = velocity.normalized() * speed   #velocity.normalized() 將向量變成一個(gè)單位比例
        $AnimatedSprite.play() #播放動(dòng)畫(huà)
    else:
        $AnimatedSprite.stop()
    
    position += velocity *delta  # 變化位置
    # 限制在 屏幕區(qū)域內(nèi)部
    # screensize = get_viewport_rect().size 獲取 屏幕區(qū)域大小
    position.x = clamp(position.x , 0 ,screensize.x)  
    position.y = clamp(position.y , 0 ,screensize.y)
    
    # 設(shè)置動(dòng)畫(huà)方向诱建,默認(rèn) 右.上骗卜, 如果檢測(cè)到速度變化史侣,則 反轉(zhuǎn)動(dòng)畫(huà)方向
    # 動(dòng)畫(huà)只需要設(shè)置一個(gè)方向即可枢贿。
    if velocity.x != 0:
        $AnimatedSprite.animation = "right"
        $AnimatedSprite.flip_v = false 
        $AnimatedSprite.flip_h = (velocity.x < 0 )
    
    if velocity.y != 0:
        $AnimatedSprite.animation = "up"
        $AnimatedSprite.flip_v = (velocity.y > 0 )
        $AnimatedSprite.flip_h = false

動(dòng)畫(huà)部分改進(jìn): 如果同時(shí)按下 上嘁圈,右方向省骂,則導(dǎo)致 不現(xiàn)實(shí)幀動(dòng)畫(huà),具體改進(jìn)如下:

# 設(shè)置動(dòng)畫(huà)方向最住,默認(rèn) 右.上钞澳, 如果檢測(cè)到速度變化,則 反轉(zhuǎn)動(dòng)畫(huà)方向
    # 動(dòng)畫(huà)只需要設(shè)置一個(gè)方向即可涨缚。
    if velocity.x != 0 and (abs(velocity.x) > abs(velocity.y)):
        $AnimatedSprite.animation = "right"
        $AnimatedSprite.flip_v = false 
        $AnimatedSprite.flip_h = (velocity.x < 0 )
    
    if velocity.y != 0 and (abs(velocity.x) < abs(velocity.y)):
        $AnimatedSprite.animation = "up"
        $AnimatedSprite.flip_v = (velocity.y > 0 )

Player 為Area2D 類(lèi)型轧粟,移動(dòng)的敵人是 Rigidbody2D類(lèi)型,可以連接 body_entered 信號(hào),進(jìn)行檢測(cè)逃延,是否與敵人發(fā)生碰撞

func _on_Player_body_entered(body):
    hide()
    emit_signal("hit")
    $CollisionShape2D.disabled =  true 
    print('debug--> ',body)

2.敵人相關(guān):

VisibilityNotifier2D組建览妖,可以檢測(cè)是否移動(dòng)出了屏幕,進(jìn)行相關(guān)判斷揽祥,如果移動(dòng)出屏幕讽膏,則調(diào)度自己進(jìn)行刪除。

func _on_Visibility_screen_exited():
    queue_free()

GDSCript 控制分組相關(guān):

  1. 將節(jié)點(diǎn)加入分組: xxx.add_to_group("enemies")
  2. 獲取分組拄丰,并且調(diào)用對(duì)應(yīng)的函數(shù): get_tree().call_group("enemies", "player_was_discovered")
  3. var enemies = get_tree().get_nodes_in_group("enemies") 獲取分組的所有節(jié)點(diǎn)

動(dòng)態(tài)加載場(chǎng)景府树,實(shí)例化,并且綁定信號(hào):

        var player =  load('res://Player.tscn')   # 加載場(chǎng)景
    player_inst = player.instance()    # 實(shí)例化
    add_child(player_inst)                 # 添加到節(jié)點(diǎn) 
    player_inst.connect('hit',self,'game_over') # 綁定信號(hào)

鼠標(biāo)輸入相關(guān)判斷:

extends Sprite

signal shoot(bullet, direction, location)

var Bullet = preload("res://Bullet.tscn")

func _input(event):
    if event is InputEventMouseButton:
        if event.button_index == BUTTON_LEFT and event.pressed:
            emit_signal("shoot", Bullet, rotation, position)

func _process(delta):
    look_at(get_global_mouse_position())

觸摸相關(guān) 屏幕相關(guān):

需要在項(xiàng)目設(shè)置中開(kāi)啟 模擬觸屏事件
第一步是打開(kāi)”P(pán)roject Settings”并找到 “Display” -> “Window” -> Handheld 部分料按。啟用 Emulate Touchscreen 選項(xiàng)奄侠。這使得您可以將鼠標(biāo)點(diǎn)擊事件視為觸摸事件

func _input(event):
    if event is  InputEventScreenTouch and event.is_pressed():
        _isTouchControl = true 
        target = event.position

func _process(delta):
#   # Called every frame. Delta is time since last frame.
#   # Update game logic here.

    if position.distance_to(target) > 10 :
        velocity = (target-position).normalized() * speed 
    else:
        #  鍵盤(pán)控制 
        velocity = Vector2()
        _isTouchControl = false

手動(dòng)定義動(dòng)畫(huà) tween 的用法

Tween interpolate_property方法。它需要七個(gè)參數(shù):

  1. 對(duì)擁有該屬性的節(jié)點(diǎn)進(jìn)行動(dòng)畫(huà)的引用
  2. 屬性的標(biāo)識(shí)符作為字符串
  3. 起始值
  4. 端值
  5. 動(dòng)畫(huà)以秒為單位的持續(xù)時(shí)間
  6. 過(guò)渡的類(lèi)型
  7. 過(guò)度類(lèi)型的參數(shù)载矿。

以下示例:相當(dāng)于在0.3秒內(nèi)垄潮,將animated_health 設(shè)置為 新值 health
然后在_process中 更新進(jìn)玩家的生命值度條

func _process(delta):
    bar.value = animated_health
    number_label.text = str(round(animated_health))
    pass

# 更新 生命值
func update_health(health:int):
    tween.interpolate_property(self,"animated_health",animated_health,health,0.3,Tween.TRANS_LINEAR,Tween.EASE_IN)
    if !tween.is_active():
        tween.set_active(true)
    pass    

示例效果 如下:(由于插值有可能是浮點(diǎn)數(shù),所以闷盔,需要使用函數(shù)將其轉(zhuǎn)換為整數(shù))

bar.value = animated_health
number_label.text = str(round(animated_health))
lifebar_tutorial_number_animation_messed_up.gif

切換場(chǎng)景

change_scene ( String path )
change_scene_to ( PackedScene packed_scene )
返回值Error

Kinematic character (2D) 控制運(yùn)動(dòng)

var speed = 200

var gravity = 200

var velocity =Vector2()

func _ready():
    pass # Replace with function body.

func get_input():
    
    if Input.is_action_pressed("ui_right"):
        velocity.x = speed  
        pass
    elif Input.is_action_pressed("ui_left"):
        velocity.x = -speed
    else:
        velocity.x = 0

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta):
    get_input()
    velocity.y += gravity*delta
    #move_and_collide(velocity)
    move_and_slide(velocity,Vector2(0,-1))

蓄能

蓄能時(shí)間 需要根據(jù)實(shí)際 進(jìn)行適當(dāng)調(diào)整 弯洗, 另外設(shè)置最大值 , 蓄能可以從
-max_impulse 到 + max_impulse:float 逢勾,方便進(jìn)行方向控制

extends RigidBody2D

###  備注: 蓄能條核心代碼 
###  
###  瞬間沖力大小牡整,可以有方向,上方或者下方

var to_maximpulse_time =  2
var impulse:float =0  
var max_impulse:float = 500


var acceleration  # 計(jì)算得出

# Called when the node enters the scene tree for the first time.
func _ready():
    acceleration = max_impulse / to_maximpulse_time
    $ProgressBar.min_value = -max_impulse
    $ProgressBar.max_value = max_impulse
    pass # Replace with function body.

func _process(delta):
    
    if Input.is_action_pressed("ui_select"):
        #self.linear_velocity.y = -speed  # y is down, we need player up 
        #
        # 需要判斷 目前最大速度溺拱,否則速度太大 會(huì)導(dǎo)致穿過(guò)模型出去逃贝,
        # 一個(gè)物理周期 的位移穿過(guò)了模型,導(dǎo)致檢測(cè)不到 碰撞了迫摔。
        if self.linear_velocity.length() < 1000.0:
            self.apply_central_impulse( Vector2(0,-impulse).rotated(self.rotation ) )
    # update speed 
    _update_speed(delta)
    $ProgressBar.value = impulse
    pass

func _physics_process(delta):
    pass

func _update_speed(delta):
    if abs(impulse)  > abs(max_impulse):
        acceleration = -acceleration 
    impulse +=delta*acceleration
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沐扳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子句占,更是在濱河造成了極大的恐慌迫皱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辖众,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡和敬,警方通過(guò)查閱死者的電腦和手機(jī)凹炸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)昼弟,“玉大人啤它,你說(shuō)我怎么就攤上這事。” “怎么了变骡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵离赫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我塌碌,道長(zhǎng)渊胸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任台妆,我火速辦了婚禮翎猛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘接剩。我一直安慰自己切厘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布懊缺。 她就那樣靜靜地躺著疫稿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹃两。 梳的紋絲不亂的頭發(fā)上遗座,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音怔毛,去河邊找鬼员萍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拣度,可吹牛的內(nèi)容都是我干的碎绎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼抗果,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼筋帖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起冤馏,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤日麸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后逮光,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體代箭,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年涕刚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗡综。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杜漠,死狀恐怖极景,靈堂內(nèi)的尸體忽然破棺而出察净,到底是詐尸還是另有隱情,我是刑警寧澤盼樟,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布氢卡,位于F島的核電站,受9級(jí)特大地震影響晨缴,放射性物質(zhì)發(fā)生泄漏译秦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一喜庞、第九天 我趴在偏房一處隱蔽的房頂上張望诀浪。 院中可真熱鬧,春花似錦延都、人聲如沸雷猪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)求摇。三九已至,卻和暖如春殊者,著一層夾襖步出監(jiān)牢的瞬間与境,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工猖吴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摔刁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓海蔽,卻偏偏與公主長(zhǎng)得像共屈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子党窜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于這些技巧這些技巧不可能適用于每個(gè)項(xiàng)目拗引。這些是基于我的一些項(xiàng)目經(jīng)驗(yàn),項(xiàng)目團(tuán)隊(duì)的規(guī)模從3人到20人不等幌衣;框架結(jié)構(gòu)的...
    游戲開(kāi)發(fā)小Y閱讀 1,018評(píng)論 0 1
  • 一矾削、Unity簡(jiǎn)介 1. Unity界面 Shift + Space : 放大界面 Scene界面按鈕渲染模式2D...
    MYves閱讀 8,177評(píng)論 0 22
  • 關(guān)于這些技巧這些技巧不可能適用于每個(gè)項(xiàng)目。這些是基于我的一些項(xiàng)目經(jīng)驗(yàn)豁护,項(xiàng)目團(tuán)隊(duì)的規(guī)模從3人到20人不等哼凯;框架結(jié)構(gòu)的...
    Babybus_Unity閱讀 2,730評(píng)論 2 27
  • 【Android 動(dòng)畫(huà)】 動(dòng)畫(huà)分類(lèi)補(bǔ)間動(dòng)畫(huà)(Tween動(dòng)畫(huà))幀動(dòng)畫(huà)(Frame 動(dòng)畫(huà))屬性動(dòng)畫(huà)(Property ...
    Rtia閱讀 6,103評(píng)論 1 38
  • 感賞清晨去菜市場(chǎng)買(mǎi)菜,因?yàn)榻裉熠s集所以去得早楚里。在路上就想著如果能吃到去年鄉(xiāng)下那家自產(chǎn)的水果就好了挡逼,香甜的葡萄,...
    郁茗閱讀 106評(píng)論 0 0