截屏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()