החזק כדי לירות
חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 31 מתוך 36.
לחיצה על רווח בכל ירייה מעייפת את האצבעות. רוב משחקי היריות יורים כל עוד הכפתור לחוץ, אבל לייזר בכל פריים יהיה קרן רציפה. זמן צינון מגביל את קצב הירי: אחרי ירייה, הירייה הבאה ממתינה 250 מילישניות.
זכרו מתי הייתה הירייה האחרונה, וירו רק כשרווח לחוץ ועבר מספיק זמן:
keys = pygame.key.get_pressed()
now = pygame.time.get_ticks()
if keys[pygame.K_SPACE] and now - last_shot >= 250:
lasers.add(Laser(player.rect.centerx, player.rect.top))
last_shot = nownow - last_shot הוא הזמן שעבר מאז הירייה האחרונה. הגדירו last_shot = 0 לפני הלולאה. כעת, החזקת מקש הרווח יורה ארבעה לייזרים בשנייה, ולחיצה מהירה עליו לא תגרום לירי מהיר יותר.
כך מחליפים את הירי באמצעות KEYDOWN: דרך אחת לירות, עם כלל אחד.
אתגר
בינוני- הסר את ירי
KEYDOWNמלולאת האירועים. - הגדר
last_shot = 0לפני הלולאה. - בחלק העדכון, כאשר מקש הרווח לחוץ ועברו לפחות 250 ms מאז
last_shot, ירה לייזר והגדר אתlast_shotלערך הנוכחי.
נסו בעצמכם
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = ship_image
self.rect = self.image.get_rect(midbottom=(320, 470))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= 6
if keys[pygame.K_RIGHT]:
self.rect.x += 6
self.rect.clamp_ip(screen.get_rect())
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = laser_image
self.rect = self.image.get_rect(midbottom=(x, y))
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()
player = Player()
lasers = pygame.sprite.Group()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
lasers.add(Laser(player.rect.centerx, player.rect.top))
player.update()
lasers.update()
screen.fill((12, 14, 30))
lasers.draw(screen)
screen.blit(player.image, player.rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
כל השיעורים ביחידה ספרייטים ותמונות
7סיור כוכבים
ספינת הסיורירי בלייזרים5התנגשויות מדויקות ברמת הפיקסל
מלבנים מרגישים לא הוגניםמסכותספרייטים מדויקים ברמת הפיקסלתיבות פגיעה מעגליות3מחלקות לאובייקטים במשחק
המחלקה הראשונה שלךמתודותself הוא האובייקטרשימה של אובייקטיםאובייקטים עם תמונותתת־מחלקהתרגלו בעצמכם: Pygame אונליין