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
,讓敵機精靈組呼叫update
和draw
方法
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(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...