นี่คือการแนะนำ Pygame สำหรับผู้ที่รู้จัก Python อยู่แล้ว บทความนี้จะสอนขั้นตอนในการสร้างเกมง่ายๆ ที่ให้ผู้เล่นหลบลูกบอลกระดอน
ขั้นตอน
ส่วนที่ 1 จาก 8: การติดตั้ง Pygame
ขั้นตอนที่ 1. ดาวน์โหลด Pygame
ค้นหาสำหรับแพลตฟอร์มของคุณจาก
ขั้นตอนที่ 2. เรียกใช้ตัวติดตั้ง
ขั้นตอนที่ 3 ตรวจสอบว่าการติดตั้งใช้งานได้
เปิดเทอร์มินัล Python พิมพ์ "นำเข้า pygame" หากคุณไม่เห็นข้อผิดพลาดใดๆ แสดงว่าติดตั้ง Pygame สำเร็จแล้ว
นำเข้า pygame
ส่วนที่ 2 จาก 8: การตั้งค่าหน้าต่างพื้นฐาน
ขั้นตอนที่ 1. เปิดไฟล์ใหม่
ขั้นตอนที่ 2. นำเข้า Pygame
Pygame เป็นห้องสมุดที่ให้การเข้าถึงฟังก์ชั่นกราฟิก หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของฟังก์ชันเหล่านี้ คุณสามารถค้นหาได้จากเว็บไซต์ Pygame
นำเข้า pygame จาก pygame.locals นำเข้า *
ขั้นตอนที่ 3 ตั้งค่าความละเอียดของหน้าต่าง
คุณจะต้องสร้างตัวแปรสากลสำหรับความละเอียดหน้าจอ เพื่อให้สามารถอ้างอิงได้ในหลายส่วนของเกม นอกจากนี้ยังง่ายต่อการค้นหาที่ด้านบนของไฟล์เพื่อให้สามารถเปลี่ยนแปลงได้ในภายหลัง สำหรับโครงการขั้นสูง การใส่ข้อมูลนี้ในไฟล์แยกกันจะดีกว่า
ความละเอียด = (400, 300)
ขั้นตอนที่ 4. กำหนดสีบางสี
สีใน pygame คือ (RBGA ซึ่งอยู่ในช่วงค่าระหว่าง 0 ถึง 255 ค่าอัลฟ่า (A) เป็นทางเลือก แต่สีอื่น ๆ (บังคับสีแดง สีน้ำเงิน และสีเขียว)
ขาว = (255, 255, 255) สีดำ = (0, 0, 0) สีแดง = (255, 0, 0)
ขั้นตอนที่ 5. เริ่มต้นหน้าจอ
ใช้ตัวแปรความละเอียดที่กำหนดไว้ก่อนหน้านี้
หน้าจอ = pygame.display.set_mode (ความละเอียด)
ขั้นตอนที่ 6 สร้างเกมวนรอบ
ทำซ้ำการกระทำบางอย่างในทุกเฟรมของเกมของเรา สร้างลูปที่จะวนซ้ำเสมอเพื่อวนรอบการกระทำเหล่านี้ทั้งหมด
ในขณะที่จริง:
ขั้นตอนที่ 7. ระบายสีหน้าจอ
screen.fill (สีขาว)
ขั้นตอนที่ 8 แสดงหน้าจอ
หากคุณเรียกใช้โปรแกรม หน้าจอจะเปลี่ยนเป็นสีขาว จากนั้นโปรแกรมจะหยุดทำงาน เนื่องจากระบบปฏิบัติการกำลังส่งกิจกรรมไปที่เกมและเกมไม่ได้ทำอะไรกับพวกเขา เมื่อเกมได้รับเหตุการณ์ที่ไม่สามารถจัดการได้มากเกินไป เกมจะล่ม
ในขณะที่ True: … pygame.display.flip()
ขั้นตอนที่ 9 จัดการเหตุการณ์
รับรายการเหตุการณ์ทั้งหมดที่เกิดขึ้นในแต่ละเฟรม คุณจะสนใจแค่เหตุการณ์เดียว เหตุการณ์เลิก สิ่งนี้เกิดขึ้นเมื่อผู้ใช้ปิดหน้าต่างเกม นอกจากนี้ยังจะป้องกันไม่ให้โปรแกรมของเราหยุดทำงานเนื่องจากมีเหตุการณ์มากเกินไป
ในขณะที่ True: … สำหรับเหตุการณ์ใน pygame.event.get(): if event.type == QUIT: pygame.quit()
ขั้นตอนที่ 10. ลองเลย
นี่คือสิ่งที่รหัสควรมีลักษณะดังนี้:
นำเข้า pygame จาก pygame.locals นำเข้า * ความละเอียด = (400, 300) สีขาว = (255, 255, 255) สีดำ = (0, 0, 0) สีแดง = (255, 0, 0) หน้าจอ = pygame.display.set_mode (ความละเอียด) ในขณะที่ True: screen.fill(สีขาว) pygame.display.flip() สำหรับเหตุการณ์ใน pygame.event.get(): if event.type == QUIT: pygame.quit()
ตอนที่ 3 จาก 8: การสร้างวัตถุในเกม
ขั้นตอนที่ 1 สร้างคลาสและตัวสร้างใหม่
ตั้งค่าคุณสมบัติทั้งหมดของวัตถุ คุณยังระบุค่าเริ่มต้นสำหรับคุณสมบัติทั้งหมดอีกด้วย
class Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = ตัว yPos.dx = xVel self.dy = yVel self.radius = rad self.type = "บอล"
ขั้นตอนที่ 2 กำหนดวิธีการวาดวัตถุ
ใช้คุณสมบัติที่กำหนดไว้ในคอนสตรัคเตอร์เพื่อวาดลูกบอลเป็นวงกลมรวมทั้งส่งพื้นผิวเข้าไปในฟังก์ชันเพื่อวาดวัตถุ พื้นผิวจะเป็นวัตถุหน้าจอที่สร้างขึ้นโดยใช้ความละเอียดก่อนหน้านี้
def วาด(ตัวเอง, พื้นผิว): pygame.draw.circle(พื้นผิว, สีดำ, (self.x, self.y), self.radius)
ขั้นตอนที่ 3 สร้างตัวอย่างคลาสและบอกเกมลูปให้จั่วลูกบอลในทุกลูป
ball = Ball() ในขณะที่ True: … ball.draw(screen)
ขั้นตอนที่ 4 ทำให้วัตถุเคลื่อนที่
สร้างฟังก์ชันที่จะอัปเดตตำแหน่งของวัตถุ เรียกใช้ฟังก์ชันนี้ในทุกรอบเกม
คลาส Ball: … def update(self): self.x += self.dx self.y += self.dy
ขั้นตอนที่ 5. จำกัดอัตราเฟรม
ลูกบอลจะเคลื่อนที่เร็วมากเพราะเกมวนซ้ำหลายร้อยครั้งต่อวินาที ใช้นาฬิกาของ Pygame เพื่อจำกัดอัตราเฟรมไว้ที่ 60 fps
clock = pygame.time. Clock() ในขณะที่ True: … clock.tick(60)
ขั้นตอนที่ 6. เก็บลูกบอลไว้บนหน้าจอ
เพิ่มการตรวจสอบในฟังก์ชันอัปเดตเพื่อย้อนกลับทิศทางของลูกบอลหากกระทบกับขอบหน้าจอด้านใดด้านหนึ่ง
class Ball: … def update(self): … if (self.x <= 0 or self.x >= resolution[0]): self.dx *= -1 if (self.y <= 0 หรือ self.y) >= ความละเอียด[1]): self.dy *= -1
ขั้นตอนที่ 7 ลองเลย
นี่คือสิ่งที่รหัสควรมีลักษณะดังนี้:
นำเข้า pygame จาก pygame.locals นำเข้า * ความละเอียด = (400, 300) สีขาว = (255, 255, 255) สีดำ = (0, 0, 0) สีแดง = (255, 0, 0) หน้าจอ = pygame.display.set_mode (ความละเอียด) class Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def เสมอ (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีดำ, (self.x, self.y), self.radius) def update(self): self.x += self.dx self.y += self.dy if (self.x <= 0 หรือ self.x >= resolution[0]): self.dx *= -1 if (self.y <= 0 or self.y >= resolution[1]): self.dy *= -1 ball = Ball() clock = pygame.time. Clock() ในขณะที่ True: หน้าจอ กรอก (สีขาว) ball.draw(หน้าจอ) ball.update() pygame.display.flip() clock.tick(60) สำหรับเหตุการณ์ใน pygame.event.get(): if event.type == QUIT: pygame.quit ()
ตอนที่ 4 จาก 8: การจัดระเบียบเกม
ขั้นตอนที่ 1 ใช้คลาสเพื่อจัดระเบียบทุกอย่าง
เกมจะซับซ้อนขึ้น ใช้เทคนิคเชิงวัตถุเพื่อจัดระเบียบโค้ดของคุณ
ขั้นตอนที่ 2 ทำให้เกมวนซ้ำเป็นคลาส
เนื่องจากตอนนี้เกมของเรามีข้อมูลรวมถึงออบเจกต์และฟังก์ชันของเกม คุณจึงควรเปลี่ยนลูปเกมของคุณให้เป็นคลาส
เกมคลาส ():
ขั้นตอนที่ 3 เพิ่มตัวสร้าง
ที่นี่คุณจะยกตัวอย่างวัตถุในเกม สร้างหน้าจอและนาฬิกาของเรา และเริ่มต้น Pygame จำเป็นต้องเริ่มต้น Pygame เพื่อใช้คุณสมบัติบางอย่าง เช่น ข้อความหรือเสียง
เกมคลาส (): def _init_ (ตัวเอง): pygame.init () self.screen = pygame.display.set_mode (ความละเอียด) self.clock = pygame.time. Clock ()
ขั้นตอนที่ 4 จัดการเหตุการณ์ในฟังก์ชัน
class game(): … def handleEvents(self): สำหรับเหตุการณ์ใน pygame.event.get(): if event.type == QUIT: pygame.quit()
ขั้นตอนที่ 5. ทำให้เกมวนเป็นฟังก์ชัน
เรียกใช้ฟังก์ชันการจัดการเหตุการณ์ทุกวง
คลาสเกม(): … def run(self): while True: self.handleEvents() self.screen.fill(white) self.clock.tick(60) pygame.display.flip()
ขั้นตอนที่ 6 จัดการวัตถุเกมหลายรายการ
ตอนนี้รหัสนี้ต้องเรียกการวาดและอัปเดตวัตถุของเราในแต่ละเฟรม นี้จะได้รับยุ่งถ้าคุณมีจำนวนมากของวัตถุ มาเพิ่มวัตถุของเราในอาร์เรย์แล้วอัปเดตและวาดวัตถุทั้งหมดในอาร์เรย์ทุกวง ตอนนี้คุณสามารถเพิ่มวัตถุอื่นได้อย่างง่ายดายและกำหนดตำแหน่งเริ่มต้นที่แตกต่างกัน
class game(): def _init_(self): … self.gameObjects = self.gameObjects.append(Ball()) self.gameObjects.append(Ball(100)) … def run(self): while True: self.handleEvents() สำหรับ gameObj ใน self.gameObjects: gameObj.update() self.screen.fill (สีขาว) สำหรับ gameObj ใน self.gameObjects: gameObj.draw(self.screen) self.clock.tick (60) pygame.display.flip()
ขั้นตอนที่ 7 ลองเลย
นี่คือสิ่งที่รหัสควรมีลักษณะดังนี้:
นำเข้า pygame จาก pygame.locals นำเข้า * ความละเอียด = (400, 300) สีขาว = (255, 255, 255) สีดำ = (0, 0, 0) สีแดง = (255, 0, 0) หน้าจอ = pygame.display.set_mode (ความละเอียด) class Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def เสมอ (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีดำ, (self.x, self.y), self.radius) def update(self): self.x += self.dx self.y += self.dy if (self.x <= 0 หรือ self.x >= resolution[0]): self.dx *= -1 if (self.y <= 0 หรือ self.y >= resolution[1]): self.dy *= -1 class game(): def _init_(self): pygame.init() self.screen = pygame.display.set_mode (ความละเอียด) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (Ball ()) self.gameObjects.append (Ball (100)) def handleEvents (self): สำหรับเหตุการณ์ใน pygame.event.get(): if event.type == QUIT: pygame.quit() def run(self): while True: self.handleEvent s() สำหรับ gameObj ใน self.gameObjects: gameObj.update() self.screen.fill (สีขาว) สำหรับ gameObj ใน self.gameObjects: gameObj.draw(self.screen) self.clock.tick (60) pygame.display พลิก () เกม (). วิ่ง ()
ตอนที่ 5 จาก 8: การเพิ่มวัตถุผู้เล่น
ขั้นตอนที่ 1 สร้างคลาสผู้เล่นและตัวสร้าง
คุณกำลังจะสร้างวงกลมอีกวงหนึ่งที่ควบคุมโดยเมาส์ กำหนดค่าเริ่มต้นในตัวสร้าง รัศมีเป็นค่าที่สำคัญเพียงอย่างเดียว
คลาส Player: def _init_(ตัวเอง, rad = 20): self.x = 0 self.y = 0 self.radius = rad
ขั้นตอนที่ 2 กำหนดวิธีการวาดวัตถุของผู้เล่น
มันจะเหมือนกับที่คุณวาดวัตถุในเกมอื่นๆ
คลาส ผู้เล่น: … def draw(ตัวเอง, พื้นผิว): pygame.draw.circle(พื้นผิว, สีแดง, (self.x, self.y), self.radius)
ขั้นตอนที่ 3 เพิ่มการควบคุมเมาส์สำหรับวัตถุของผู้เล่น
ในทุกเฟรม ให้ตรวจสอบตำแหน่งของเมาส์และตั้งค่าตำแหน่งของวัตถุของผู้เล่นไปที่จุดนั้น
คลาส Player: … def update(self): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1]
ขั้นตอนที่ 4 เพิ่มวัตถุผู้เล่นให้กับ gameObjects
สร้างอินสแตนซ์ของผู้เล่นใหม่และเพิ่มลงในรายการ
คลาสเกม(): def _init_(self): … self.gameObjects.append(Player())
ขั้นตอนที่ 5. ลองเลย
นี่คือสิ่งที่รหัสควรมีลักษณะดังนี้:
นำเข้า pygame จาก pygame.locals นำเข้า * ความละเอียด = (400, 300) สีขาว = (255, 255, 255) สีดำ = (0, 0, 0) สีแดง = (255, 0, 0) หน้าจอ = pygame.display.set_mode (ความละเอียด) class Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def เสมอ (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีดำ, (self.x, self.y), self.radius) def update(self): self.x += self.dx self.y += self.dy if (self.x <= 0 หรือ self.x >= resolution[0]): self.dx *= -1 if (self.y <= 0 or self.y >= resolution[1]): self.dy *= -1 class ผู้เล่น: def _init_(self, rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "ผู้เล่น" def วาด (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีแดง, (self.x, self.y), self.radius) def update (ตัวเอง): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1] class game(): def _init_(self): pygame.init() self.screen = pygame.display.set_ โหมด(ความละเอียด) self.clock = pygame.time. Clock() self.gameObjects = self.gameObjects.append(Player()) self.gameObjects.append(Ball()) self.gameObjects.append(Ball(100))) def handleEvents(ตัวเอง): สำหรับเหตุการณ์ใน pygame.event.get(): if event.type == QUIT: pygame.quit() def run(self): while True: self.handleEvents() สำหรับ gameObj ในตัวเอง.gameObjects: gameObj.update() self.screen.fill(สีขาว) สำหรับ gameObj ใน self.gameObjects: gameObj.draw(self.screen) self.clock.tick(60) pygame.display.flip() game() วิ่ง()
ตอนที่ 6 จาก 8: การสร้างวัตถุโต้ตอบกับผู้เล่น
ขั้นตอนที่ 1 เปลี่ยนฟังก์ชั่นการอัพเดท
เพื่อให้วัตถุโต้ตอบกันได้ พวกเขาจะต้องเข้าถึงกันและกัน มาเพิ่มพารามิเตอร์อื่นเพื่ออัปเดตเพื่อส่งผ่านในรายการ gameObjects คุณจะต้องเพิ่มลงในวัตถุของผู้เล่นและวัตถุลูกบอล หากคุณมีอ็อบเจ็กต์เกมจำนวนมาก การสืบทอดอาจช่วยให้คุณเก็บลายเซ็นเมธอดทั้งหมดของคุณไว้เหมือนเดิม
class Ball: … def update(self, gameObjects): … class ผู้เล่น: … def update(self, gameObjects):
ขั้นตอนที่ 2 ตรวจสอบการชนกันระหว่างผู้เล่นกับลูกบอล
ผ่านวัตถุในเกมทั้งหมดและตรวจสอบว่าประเภทของวัตถุนั้นเป็นลูกบอลหรือไม่ จากนั้นใช้รัศมีของวัตถุทั้งสองและสูตรระยะทางเพื่อตรวจสอบว่าวัตถุทั้งสองชนกันหรือไม่ วงกลมนั้นง่ายต่อการตรวจสอบการชนกัน นี่คือเหตุผลที่ใหญ่ที่สุดที่คุณไม่ได้ใช้รูปแบบอื่นสำหรับเกมนี้
class Player: … def update(self, gameObjects): … สำหรับ gameObj ใน gameObjects: if gameObj.type == "ball": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)**2:
ขั้นตอนที่ 3 จบเกมหากผู้เล่น "ถูกโจมตี"
ให้ออกจากเกมสำหรับตอนนี้
if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)**2: pygame.quit()
ขั้นตอนที่ 4. ลองเลย
นี่คือสิ่งที่รหัสควรมีลักษณะดังนี้:
นำเข้า pygame จาก pygame.locals นำเข้า * ความละเอียด = (400, 300) สีขาว = (255, 255, 255) สีดำ = (0, 0, 0) สีแดง = (255, 0, 0) หน้าจอ = pygame.display.set_mode (ความละเอียด) class Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def เสมอ (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีดำ, (self.x, self.y), self.radius) def update(ตัวเอง, gameObjects): self.x += self.dx self.y += self.dy if (self.x <= 0 หรือ self.x >= resolution[0]): self.dx *= -1 if (self.y <= 0 or self.y >= resolution[1]): self.dy *= -1 class ผู้เล่น: def _init_(self, rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "ผู้เล่น" def วาด (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีแดง, (self.x, self.y), self.radius) def update(self, gameObjects): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1] สำหรับ gameObj ใน gameObjects: ถ้า gameObj.type == "ball": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)**2: pygame.quit() เกมคลาส (): def _init_ (ตัวเอง): pygame.init () self.screen = pygame.display.set_mode (ความละเอียด) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (ผู้เล่น ()) self.gameObjects.append(Ball()) self.gameObjects.append(Ball(100)) def handleEvents(self): สำหรับเหตุการณ์ใน pygame.event.get(): if event.type == QUIT: pygame.quit () def run(self): while True: self.handleEvents() สำหรับ gameObj ใน self.gameObjects: gameObj.update(self.gameObjects) self.screen.fill(สีขาว) สำหรับ gameObj ใน self.gameObjects: gameObj.draw(self.screen) self.clock.tick(60) pygame.display.flip() เกม().run()
ตอนที่ 7 จาก 8: การเพิ่มตัวควบคุมเกมเพื่อสร้างวัตถุ
ขั้นตอนที่ 1 สร้างคลาสตัวควบคุมเกม
ผู้ควบคุมเกมมีหน้าที่ "รัน" เกม มันแตกต่างจากคลาสเกมของเราซึ่งมีหน้าที่ในการวาดและอัปเดตวัตถุทั้งหมดของเรา ผู้ควบคุมจะเพิ่มลูกบอลอีกลูกหนึ่งไปที่หน้าจอเป็นระยะเพื่อทำให้เกมยากขึ้น เพิ่มตัวสร้างและเริ่มต้นค่าพื้นฐานบางอย่าง ช่วงเวลาจะเป็นช่วงเวลาก่อนที่จะเพิ่มลูกบอลอีกลูก
คลาส GameController: def _init_ (ตัวเอง, ช่วง = 5): self.inter = ช่วง self.next = pygame.time.get_ticks () + (2 * 1000) self.type = "ตัวควบคุมเกม"
ขั้นตอนที่ 2. เพิ่มฟังก์ชั่นการอัพเดท
วิธีนี้จะตรวจสอบระยะเวลาที่ผ่านไปนับตั้งแต่เวลาที่ลูกบอลถูกเพิ่มเข้าไปหรือตั้งแต่เริ่มเกม หากเวลามากกว่าช่วงเวลา คุณจะรีเซ็ตเวลาและเพิ่มลูกบอล
คลาส GameController: … def update(self, gameObjects): if self.next < pygame.time.get_ticks(): self.next = pygame.time.get_ticks() + (self.inter * 1000) gameObjects.append(Ball()))
ขั้นตอนที่ 3 ให้ลูกบอลความเร็วสุ่ม
คุณจะต้องใช้ตัวเลขสุ่มเพื่อทำให้เกมแตกต่างไปทุกครั้ง อย่างไรก็ตาม ความเร็วของลูกบอลตอนนี้เป็นเลขทศนิยมแทนที่จะเป็นจำนวนเต็ม
คลาส GameController: … def update(self, gameObjects): if self.next < pygame.time.get_ticks(): self.next = pygame.time.get_ticks() + (self.inter * 1000) gameObjects.append(Ball() xVel=random()*2, yVel=random()*2))
ขั้นตอนที่ 4 แก้ไขฟังก์ชันการวาด
ฟังก์ชันการวาดจะไม่ยอมรับการลอยตัว มาแปลงตำแหน่งของลูกบอลเป็นจำนวนเต็มก่อนที่ลูกบอลจะถูกดึงออกมา
class Ball: … def draw(ตัวเอง, พื้นผิว): pygame.draw.circle(พื้นผิว, สีดำ, (int(self.x), int(self.y)), self.radius)
ขั้นตอนที่ 5. กำหนดวิธีการวาดสำหรับตัวควบคุมเกม
เนื่องจากเป็นวัตถุเกม ลูปหลักจะพยายามวาดมัน คุณจะต้องกำหนดฟังก์ชันการวาดที่ไม่ทำอะไรเลยเพื่อให้เกมไม่พัง
คลาส GameController: … def draw(self, screen): pass
ขั้นตอนที่ 6. เพิ่มตัวควบคุมเกมไปที่ gameObjects และนำลูกบอล 2 ลูกออก
ตอนนี้เกมควรวางไข่ทุก ๆ ห้าวินาที
คลาสเกม(): def _init_(self): … self.gameObjects = self.gameObjects.append(GameController()) self.gameObjects.append(Player())
ขั้นตอนที่ 7 ลองเลย
นี่คือสิ่งที่รหัสควรมีลักษณะดังนี้:
นำเข้า pygame จากสุ่มนำเข้าแบบสุ่มจาก pygame.locals นำเข้า * ความละเอียด = (400, 300) สีขาว = (255, 255, 255) สีดำ = (0, 0, 0) สีแดง = (255, 0, 0) หน้าจอ = pygame display.set_mode(ความละเอียด) คลาส Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def วาด (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีดำ, (int (ตัวเอง. x), int(self.y)), self.radius) def update (ตัวเอง, gameObjects): self.x += self.dx self.y += self.dy ถ้า (self.x <= 0 หรือ self x >= resolution[0]): self.dx *= -1 if (self.y <= 0 or self.y >= resolution[1]): self.dy *= -1 class ผู้เล่น: def _init_(self, rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "ผู้เล่น" def เสมอ (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีแดง, (self.x), self.y), self.radius) def update (self, gameObjects): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1] สำหรับ gameObj ในเกม วัตถุ: if gameObj.type == "ball": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)* *2: pygame.quit() คลาส GameController: def _init_(self, interval = 5): self.inter = ช่วง self.next = pygame.time.get_ticks() + (2 * 1000) self.type = "ตัวควบคุมเกม " def update(self, gameObjects): if self.next < pygame.time.get_ticks(): self.next = pygame.time.get_ticks() + (self.inter * 1000) gameObjects.append(Ball(xVel=random) ()*2, yVel=random()*2)) def draw(self, screen): pass class game(): def _init_(self): pygame.init() self.screen = pygame.display.set_mode(ความละเอียด) self.clock = pygame.time. Clock() self.gameObjects = self.gameObjects.append(GameController()) self.gameObjects.append(Player()) def handleEvents(self): สำหรับเหตุการณ์ใน pygame.event.get(): if event.type == QUIT: pygame.quit() def run(self): while True: self.handleEvents() สำหรับ gameObj ใน self.gameObjects: gameObj.update(self.gameObjects) self.screen.fill(สีขาว) สำหรับ gameObj ใน self.gameO วัตถุ: gameObj.draw(self.screen) self.clock.tick(60) pygame.display.flip() game().run()
ตอนที่ 8 จาก 8: การเพิ่มคะแนนและจบเกม
ขั้นตอนที่ 1 เพิ่มคะแนนให้กับคลาสคอนโทรลเลอร์เกม
สร้างวัตถุแบบอักษรและตัวแปรคะแนน คุณจะวาดแบบอักษรในทุกเฟรมเพื่อแสดงคะแนนและเพิ่มคะแนนทุกเฟรมในการอัพเดท
คลาส GameController: def _init_(self, interval = 5): … self.score = 0 self.scoreText = pygame.font. Font(None, 12) def update(self, gameObjects): … self.score += 1 def draw (ตัวเอง, หน้าจอ): screen.blit(self.scoreText.render(str(self.score), True, black), (5, 5))
ขั้นตอนที่ 2 ปรับเปลี่ยนวิธีการสิ้นสุดเกม
มากำจัดการเลิกกันเมื่อผู้เล่นตรวจพบการชนกัน แต่คุณจะต้องตั้งค่าตัวแปรในโปรแกรมเล่นที่เกมสามารถตรวจสอบได้ เมื่อตั้งค่า gameOver ให้หยุดอัปเดตอ็อบเจ็กต์ สิ่งนี้จะหยุดทุกอย่างเพื่อให้ผู้เล่นสามารถเห็นสิ่งที่เกิดขึ้นและตรวจสอบคะแนนของพวกเขา โปรดทราบว่าวัตถุยังคงถูกวาดอยู่ เพียงแต่ไม่ได้อัปเดต
class Player: def _init_(self, rad = 20): … self.gameOver = False def update(self, gameObjects): … สำหรับ gameObj ใน gameObjects: ถ้า gameObj.type == "ball": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)**2: self.gameOver = เกมคลาสจริง (): def _init_(ตัวเอง): … self.gameOver = False def run(self): while True: self.handleEvents() ถ้าไม่ใช่ self.gameOver: สำหรับ gameObj ใน self.gameObjects: gameObj.update(self.gameObjects) ถ้า gameObj.type == "player": self.gameOver = gameObj.gameOver
ขั้นตอนที่ 3 ลองเลย
นี่คือสิ่งที่โค้ดที่เสร็จแล้วควรมีลักษณะดังนี้:
นำเข้า pygame จากสุ่มนำเข้าแบบสุ่มจาก pygame.locals นำเข้า * ความละเอียด = (400, 300) สีขาว = (255, 255, 255) สีดำ = (0, 0, 0) สีแดง = (255, 0, 0) หน้าจอ = pygame display.set_mode(ความละเอียด) คลาส Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def เสมอ (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีดำ, (int (ตัวเอง. x), int(self.y)), self.radius) def update (ตัวเอง, gameObjects): self.x += self.dx self.y += self.dy ถ้า (self.x <= 0 หรือ self x >= resolution[0]): self.dx *= -1 if (self.y <= 0 or self.y >= resolution[1]): self.dy *= -1 class ผู้เล่น: def _init_(self, rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "ผู้เล่น" self.gameOver = การจั่วป้องกันเท็จ (ตัวเอง, พื้นผิว): pygame.draw.circle (พื้นผิว, สีแดง, (self.x, self.y), self.radius) อัปเดต def (ตัวเอง, gameObjects): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1] สำหรับ gameObj ใน gameObjects: if gameObj.type == "ball": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)**2: self.gameOver = คลาสจริง GameController: def _init_(ตัวเอง, ช่วง = 5): self.inter = ช่วง self.next = pygame.time.get_ticks() + (2 * 1000) ตนเอง type = "ตัวควบคุมเกม" self.score = 0 self.scoreText = pygame.font. Font (ไม่มี, 12) def update (ตัวเอง, gameObjects): ถ้า self.next < pygame.time.get_ticks (): self.next = pygame.time.get_ticks() + (self.inter * 1000) gameObjects.append(Ball(xVel=random()*2, yVel=random()*2)) self.score += 1 def draw (ตัวเอง, หน้าจอ): screen.blit(self.scoreText.render(str(self.score), True, black), (5, 5)) class game(): def _init_(self): pygame.init() self.screen = pygame.display.set_mode (ความละเอียด) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (GameController ()) self.gameObjects.append (ผู้เล่น ()) self.gameOver = เท็จ def handleEvents(self): สำหรับเหตุการณ์ใน pygame.event.get(): if ev ent.type == QUIT: pygame.quit() def run(self): while True: self.handleEvents() ถ้าไม่ใช่ self.gameOver: สำหรับ gameObj ใน self.gameObjects: gameObj.update(self.gameObjects) หาก gameObj พิมพ์ == "ผู้เล่น": self.gameOver = gameObj.gameOver self.screen.fill (สีขาว) สำหรับ gameObj ใน self.gameObjects: gameObj.draw(self.screen) self.clock.tick (60) pygame.display.flip () เกม().run()