敵機登場和碰撞檢測

2021-10-05 20:15:29 字數 4296 閱讀 3986

02. 設計 `enemy` 類

2.4 移出螢幕銷毀敵機

二、碰撞檢測

02. 碰撞實現

遊戲啟動後,每隔 1 秒出現一架敵機每架敵機向螢幕下方飛行,飛行速度各不相同每架敵機出現的水平位置也不盡相同

當敵機從螢幕下方飛出,不會再飛回到螢幕中

set_timer(eventid, milliseconds)

->

none

第 2 個引數是事件觸發間隔的毫秒值

定時器事件的監聽

pygame定時器使用套路非常固定:

定義定時器常量——eventid初始化方法中,呼叫set_timer方法設定定時器事件遊戲迴圈中,監聽定時器事件

1) 定義事件

# 敵機的定時器事件常量

create_enemy_event = pygame.userevent

# 4. 設定定時器事件 - 每秒建立一架敵機

pygame.time.set_timer(create_enemy_event,

1000

)

2) 監聽定時器事件
def

__event_handler

(self)

:for event in pygame.event.get():

# 判斷是否退出遊戲

if event.

type

== pygame.quit:

planegame.__game_over(

)elif event.

type

== create_enemy_event:

print

("敵機出場..."

)

遊戲啟動後,每隔 1 秒出現一架敵機每架敵機向螢幕下方飛行,飛行速度各不相同每架敵機出現的水平位置也不盡相同

當敵機從螢幕下方飛出,不會再飛回到螢幕中

重寫update()方法

class

enemy

(gamesprite)

:"""敵機精靈"""

def__init__

(self)

:# 1. 呼叫父類方法,建立敵機精靈,並且指定敵機的影象

super()

.__init__(

"./images/enemy1.png"

)# 2. 設定敵機的隨機初始速度

# 3. 設定敵機的隨機初始位置

defupdate

(self)

:# 1. 呼叫父類方法,讓敵機在垂直方向運動

super()

.update(

)# 2. 判斷是否飛出螢幕,如果是,需要將敵機從精靈組刪除

if self.rect.y >= screen_rect.height:

print

("敵機飛出螢幕..."

)

演練步驟

__create_sprites,新增敵機精靈組

__event_handler,建立敵機,並且新增到精靈組__update_sprites,讓敵機精靈組呼叫updatedraw方法

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-x6ko10oe-1588827509150)(media/15025309517247/006_pygame.spriteii.png)]

演練**

# 敵機組

self.enemy_group = pygame.sprite.group(

)

self.enemy_group.update(

)self.enemy_group.draw(self.screen)

elif event.

type

== create_enemy_event:

self.enemy_group.add(enemy(

))

1) 匯入模組
1

. 官方標準模組匯入

2. 第三方模組匯入

3. 應用程式模組匯入

import random
2) 隨機位置

使用pygame.rect提供的bottom屬性,在指定敵機初始位置時,會比較方便

3) **實現

def

__init__

(self)

:# 1. 呼叫父類方法,建立敵機精靈,並且指定敵機的影象

super()

.__init__(

"./images/enemy1.png"

)# 2. 設定敵機的隨機初始速度 1 ~ 3

self.speed = random.randint(1,

3)# 3. 設定敵機的隨機初始位置

self.rect.bottom =

0

max_x = screen_rect.width - self.rect.width

self.rect.x = random.randint(

0, max_x)

檢測敵機被銷毀
def

__del__

(self)

:print

("敵機掛了 %s"

% self.rect)

**實現
def

update

(self)

:super()

.update(

)# 判斷敵機是否移出螢幕

if self.rect.y >= screen_rect.height:

# 將精靈從所有組中刪除

self.kill(

)

groupcollide(group1, group2, dokill1, dokill2, collided =

none)-

> sprite_dict

spritecollide(sprite, group, dokill, collided =

none)-

> sprite_list

返回精靈組中跟精靈發生碰撞的精靈列表

def

__check_collide

(self)

:# 1. 子彈摧毀敵機

pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group,

true

,true

)# 2. 敵機撞毀英雄

enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group,

true

)# 判斷列表時候有內容

iflen

(enemies)

>0:

# 讓英雄犧牲

self.hero.kill(

)# 結束遊戲

planegame.__game_over(

)

碰撞檢測 膠囊體碰撞檢測

膠囊體 給定一條線段l,所有道l的距離為r的點的集合。由定義可知,膠囊體由半徑r和線段l標識。檢測兩個膠囊體是否發生碰撞,即檢測兩條線段l1 l2的最短距離d是否大於l1 l2的半徑r1 r2之和,d r1 r2 則未碰撞,否則發生碰撞。設線段l1端點為a1 a2,線段l2端點為b1 b2,號表示兩...

碰撞檢測和觸發檢測

發生碰撞的條件 主動方必須有rigidbody,發生碰撞的兩個遊戲物件必須有collider,被動方對於rigidbody可有可無,碰撞檢測方法裡的引數表示主動方 發生觸發的條件 發生碰撞的物體兩者其中之一有rigidbody即可,發生碰撞的兩個遊戲物件必須有collider,其中一方勾選istri...

Unity觸發檢測和碰撞檢測

void oncollisionenter collision col void oncollisionstay collision col void oncollisionexit collision col 發生碰撞的條件 主動方必須有rigidbody,發生碰撞的兩個遊戲物件必須有collid...