pygame練手摩托小游戲01

截屏2025-02-25 12.15.58.png
import pygame
from pygame.sprite import LayeredUpdates
import random
import math
import sys

pygame.init()
screen_width = 600
screen_height = 295
screen = pygame.display.set_mode((screen_width,screen_height))
gameLoop = True

FPS = pygame.time.Clock()
gameFont = pygame.font.Font("ciwei.ttf",20)
gameFont.set_bold(True)
score = 0
km = 0
speed = 8

class BgImage(pygame.sprite.Sprite):
    def __init__(self,setx):
        super().__init__()
        global screen
        self.screen_rect = screen.get_rect()
        self.image = pygame.image.load("bgimg.png").convert()
        self.rect = self.image.get_rect()
        self.rect.y = 0
        self.rect.left = setx

    def update(self):
        global speed
        self.rect.left -= speed
        if self.rect.left < - screen_width:
            self.rect.left = screen_width

class MotorPlayer(pygame.sprite.Sprite):
    def __init__(self,setx,sety):
        super().__init__()
        motoe_image = pygame.image.load("player.png").convert_alpha()
        self.image = pygame.transform.smoothscale(motoe_image,(374//4,281//4))
        self.rect = self.image.get_rect()
        self.rect.centerx = setx
        self.rect.centery = sety
        self.layer = 2
        self.speedx = 5
        self.speedy = 5
        self.moveLeft = False
        self.moveRight = False
        self.moveUp = False
        self.moveDown = False
        self.mask = pygame.mask.from_surface(self.image)

    def update(self):
        global  screen_width
        if self.moveUp and self.rect.centery > 210:
            self.rect.centery -= self.speedy
        if self.moveDown and self.rect.centery < 268:
            self.rect.centery += self.speedy
        if self.moveLeft and self.rect.centerx > 30:
            self.rect.centerx -= self.speedx
        if self.moveRight and self.rect.centerx < screen_width - 30:
            self.rect.centerx += self.speedx

class Box(pygame.sprite.Sprite):
    def __init__(self,setx,sety):
        super().__init__()
        box = pygame.image.load("box.png").convert_alpha()
        self.image = pygame.transform.smoothscale(box,(301//4,213//4))
        self.rect = self.image.get_rect()
        self.rect.centerx = setx
        self.rect.centery = sety
        self.layer = 2
        self.mask = pygame.mask.from_surface(self.image)


    def update(self):
        global speed,score
        self.rect.centerx -= speed
        if self.rect.right < 0:
            score += 10
            if player.rect.right < 0:
                score -= 10
            self.kill()


player = MotorPlayer(100,240)

bgGroup = pygame.sprite.Group()
bg1,bg2 = BgImage(0),BgImage(screen_width)
bgGroup.add(bg1)
bgGroup.add(bg2)

allGroup = LayeredUpdates()
allGroup.add(player)

boxGroup = pygame.sprite.Group()
rates = 0

'''
#test
box = Box(100, 250)
allGroup.add(box)
boxGroup.add(box)
'''

def boxRates():
    global  rates
    global  allGroup,boxGroup
    rates += 1
    if rates % random.randint(50,99) == 0:
        box = Box(random.randint(screen_width,2000),random.randint(225,278))
        allGroup.add(box)
        boxGroup.add(box)
def collideLayerChange():
    global boxGroup,allGroup ,player,speed,score
    collides = pygame.sprite.spritecollide(player,boxGroup,False,pygame.sprite.collide_mask)
    for box in collides:
        player_y = player.rect.bottom
        box_y = box.rect.bottom
        if player_y - box_y >= 5:
            '''
            # 安全的層級切換模式
            if sprite in group:
                group.remove(sprite)
                group.change_layer(sprite, target_layer)
                group.add(sprite)
            else:
                group.add(sprite, layer=target_layer)
            '''

            # 調整圖層順序,數字越大,圖層越靠前(上)
            allGroup.change_layer(player, 5)
            allGroup.change_layer(box, 3)
            print("摩托在前")
            player.speedy = 5
        elif player_y - box_y < -5:
            allGroup.change_layer(player, 3)
            allGroup.change_layer(box, 5)
            print("摩托在后")
            player.speedy = 5
        else:
            player.rect.right = box.rect.left
            score -= 10
            print("撞上")

while gameLoop:
    FPS.tick(144)
    bgGroup.draw(screen)
    bgGroup.update()
    boxRates()
    collideLayerChange()
    allGroup.draw(screen)
    allGroup.update()


    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                player.moveUp = True
            if event.key == pygame.K_DOWN:
                player.moveDown = True
            if event.key == pygame.K_LEFT:
                player.moveLeft = True
            if event.key == pygame.K_RIGHT:
                player.moveRight = True
            if event.key == pygame.K_SPACE:
                pass

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                player.moveUp = False
            if event.key == pygame.K_DOWN:
                player.moveDown = False
            if event.key == pygame.K_LEFT:
                player.moveLeft = False
            if event.key == pygame.K_RIGHT:
                player.moveRight = False

    scorelable = gameFont.render(f"分數:{score}",True,(255,255,255))
    screen.blit(scorelable,(0,0))
    if score < 0:
        goFont = pygame.font.Font("ciwei.ttf",100)
        goFont.set_bold(True)
        gameover = goFont.render(f"Game Over", True, (255, 255, 255))
        screen.blit(gameover, (60, 100))
        player.speedy,player.speedx = 0,0
    pygame.display.update()
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容