用pygame做一个小游戏,可以玩一整天(基础框架)

一.创建一个可以关闭的空白窗体                       

        创建一个窗体(使用pygame.display.set_mode()函数)

        设置窗体标题(使用pygame.display.set_caption()函数)

   -    创建一个主循环,监听关闭事件(使用pygame.event.get()函数和pygame.QUIT事件)

       代码实例:

import pygame

# 初始化pygame
pygame.init()

# 创建窗体
window_width = 800
window_height = 600
window = pygame.display.set_mode((window_width, window_height))

# 设置窗体标题
pygame.display.set_caption("Blank Window")

# 创建主循环
running = True
while running:
    # 监听事件
    for event in pygame.event.get():
        # 检测关闭事件
        if event.type == pygame.QUIT:
            running = False

    # 在窗体上绘制其他内容
    window.fill((255, 255, 255))  # 填充白色背景

    # 更新窗体显示
    pygame.display.flip()

# 退出pygame
pygame.quit()

                这段代码创建了一个800x600大小的窗体,并设置了标题为"Blank Window"。在主循环中,通过监听事件来检测是否有关闭事件发生。当检测到关闭事件时,running变量设置为False,退出主循环,从而关闭窗体。在窗体上绘制其他内容可以根据需要进行扩展。最后,调用pygame.quit()退出pygame。

2. 使用精灵显示背景,实现背景的循环展示:

   - 创建一个背景精灵类(继承自pygame.sprite.Sprite类)

   - 加载背景图像(使用pygame.image.load()函数)

   - 在主循环中更新背景位置,并循环展示(使用pygame.Surface.blit()函数)

代码示例

import pygame

# 初始化pygame
pygame.init()

# 创建窗体
window_width = 800
window_height = 600
window = pygame.display.set_mode((window_width, window_height))

# 设置窗体标题
pygame.display.set_caption("Background Sprite")

# 背景精灵类
class Background(pygame.sprite.Sprite):
    def __init__(self, image_path):
        super().__init__()
        self.image = pygame.image.load(image_path)
        self.rect = self.image.get_rect()
        self.rect.topleft = (0, 0)

    def update(self):
        self.rect.x -= 1  
# 更新背景位置

        # 如果背景完全移出窗体,将其放到窗体右侧
        if self.rect.right <= 0:
            self.rect.x = window_width

# 加载背景图像
background_image = "background.jpg"
background = Background(background_image)

# 创建精灵组
all_sprites = pygame.sprite.Group()
all_sprites.add(background)

# 创建主循环
running = True
while running:

    # 监听事件
    for event in pygame.event.get():
        # 检测关闭事件
        if event.type == pygame.QUIT:
            running = False

    # 更新精灵
    all_sprites.update()

    # 在窗体上绘制精灵
    all_sprites.draw(window)

    # 更新窗体显示
    pygame.display.flip()

# 退出pygame
pygame.quit()

在这个示例代码中,我们创建了一个Background类,继承自pygame.sprite.Sprite类。在Background类的__init__方法中,我们加载了背景图像,并设置了初始位置为窗体的左上角。update方法用于更新背景的位置,每次更新将背景向左移动1个像素。当背景完全移出窗体时,将其放到窗体的右侧,实现了背景的循环展示。

在主循环中,我们创建了一个精灵组all_sprites,并将背景精灵添加到其中。在每次循环中,我们先更新精灵组中的所有精灵,然后在窗体上绘制所有精灵。最后,调用pygame.display.flip()更新窗体显示。

请确保将示例代码中的background.jpg替换为你自己的背景图像路径

3. 使用精灵显示玩家,实现玩家的移动:

   - 创建一个玩家精灵类(继承自pygame.sprite.Sprite类)

   - 加载玩家图像(使用pygame.image.load()函数)

   - 在主循环中监听键盘事件,更新玩家位置(使用pygame.key.get_pressed()函数)

代码实例

import pygame

# 初始化pygame
pygame.init()

# 创建窗体
window_width = 800
window_height = 600
window = pygame.display.set_mode((window_width, window_height))

# 设置窗体标题
pygame.display.set_caption("Player Sprite")

# 玩家精灵类
class Player(pygame.sprite.Sprite):
    def __init__(self, image_path, x, y):
        super().__init__()
        self.image = pygame.image.load(image_path)
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)

    def update(self, keys):
        if keys[pygame.K_LEFT]:
            self.rect.x -= 5
        if keys[pygame.K_RIGHT]:
            self.rect.x += 5
        if keys[pygame.K_UP]:
            self.rect.y -= 5
        if keys[pygame.K_DOWN]:
            self.rect.y += 5

# 加载玩家图像
player_image = "player.png"
player = Player(player_image, window_width // 2, window_height // 2)

# 创建精灵组
all_sprites = pygame.sprite.Group()
all_sprites.add(player)

# 创建主循环
running = True
while running:

    # 监听事件
    for event in pygame.event.get():
        # 检测关闭事件
        if event.type == pygame.QUIT:
            running = False

    # 获取键盘状态
    keys = pygame.key.get_pressed()

    # 更新精灵
    all_sprites.update(keys)

    # 在窗体上绘制精灵
    window.fill((255, 255, 255))  # 填充白色背景
    all_sprites.draw(window)

    # 更新窗体显示
    pygame.display.flip()

# 退出pygame
pygame.quit()

在这个示例代码中,我们创建了一个Player类,继承自pygame.sprite.Sprite类。在Player类的__init__方法中,我们加载了玩家图像,并设置了初始位置为窗体的中心。update方法根据键盘状态更新玩家的位置,当按下左、右、上、下箭头键时,玩家分别向左、右、上、下移动5个像素。

在主循环中,我们创建了一个精灵组all_sprites,并将玩家精灵添加到其中。在每次循环中,我们先获取键盘状态,然后更新精灵组中的所有精灵,接着在窗体上绘制所有精灵。最后,调用pygame.display.flip()更新窗体显示。

请确保将示例代码中的player.png替换为你自己的玩家图像路径。

4. 使用精灵显示道具,实现玩家与道具的碰撞检测:

   - 创建一个道具精灵类(继承自pygame.sprite.Sprite类)

   - 加载道具图像(使用pygame.image.load()函数)

   - 在主循环中更新道具位置,并检测与玩家的碰撞(使用pygame.sprite.spritecollide()函数)

import pygame
from pygame.locals import *
import sys

# 创建道具精灵类
class Prop(pygame.sprite.Sprite):
    def __init__(self, image, position):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect()
        self.rect.topleft = position

# 初始化pygame
pygame.init()

# 设置窗口大小和标题
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("碰撞检测示例")

# 加载玩家和道具图像
player_image = pygame.image.load("player.png")
prop_image = pygame.image.load("prop.png")

# 创建玩家精灵
player = pygame.sprite.Sprite()
player.image = player_image
player.rect = player.image.get_rect()
player.rect.topleft = (screen_width // 2, screen_height // 2)

# 创建道具精灵组
props = pygame.sprite.Group()

# 创建道具精灵并添加到精灵组
prop = Prop(prop_image, (100, 100))
props.add(prop)

# 游戏主循环
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    # 更新玩家位置
    player.rect.center = pygame.mouse.get_pos()

    # 检测玩家与道具的碰撞
    if pygame.sprite.spritecollide(player, props, True):
        print("玩家与道具碰撞!")

    # 绘制背景和精灵
    screen.fill((255, 255, 255))
    screen.blit(player.image, player.rect)
    props.draw(screen)

    # 更新屏幕
    pygame.display.update()

请注意,上述代码中的player.pngprop.png是玩家和道具的图像文件,你需要将其替换为你自己的图像文件路径。此外,你还可以根据需要自定义游戏窗口的大小、背景颜色等。

5. 使用UI(用户界面):

   - 导入pygame.font模块

   - 创建字体对象(使用pygame.font.Font()函数)

   - 在主循环中监听鼠标事件,检测鼠标点击位置(使用pygame.mouse.get_pos()函数)

import pygame
from pygame.locals import *
import sys

# 初始化pygame
pygame.init()

# 设置窗口大小和标题
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("UI示例")

# 创建字体对象
font = pygame.font.Font(None, 36)

# 游戏主循环
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == MOUSEBUTTONDOWN:
            # 检测鼠标点击位置
            mouse_pos = pygame.mouse.get_pos()
            if mouse_pos[0] < screen_width // 2 and mouse_pos[1] < screen_height // 2:
                print("左上方被点击!")
            elif mouse_pos[0] >= screen_width // 2 and mouse_pos[1] < screen_height // 2:
                print("右上方被点击!")
            elif mouse_pos[0] < screen_width // 2 and mouse_pos[1] >= screen_height // 2:
                print("左下方被点击!")
            elif mouse_pos[0] >= screen_width // 2 and mouse_pos[1] >= screen_height // 2:
                print("右下方被点击!")

    # 绘制背景和UI
    screen.fill((255, 255, 255))
    pygame.draw.line(screen, (0, 0, 0), (screen_width // 2, 0), (screen_width // 2, screen_height), 2)
    pygame.draw.line(screen, (0, 0, 0), (0, screen_height // 2), (screen_width, screen_height // 2), 2)
    text = font.render("左上方", True, (0, 0, 0))
    screen.blit(text, (screen_width // 4 - text.get_width() // 2, screen_height // 4 - text.get_height() // 2))
    text = font.render("右上方", True, (0, 0, 0))
    screen.blit(text, (screen_width * 3 // 4 - text.get_width() // 2, screen_height // 4 - text.get_height() // 2))
    text = font.render("左下方", True, (0, 0, 0))
    screen.blit(text, (screen_width // 4 - text.get_width() // 2, screen_height * 3 // 4 - text.get_height() // 2))
    text = font.render("右下方", True, (0, 0, 0))
    screen.blit(text, (screen_width * 3 // 4 - text.get_width() // 2, screen_height * 3 // 4 - text.get_height() // 2))

    # 更新屏幕
    pygame.display.update()
```

在上述代码中,我们使用`pygame.font.Font()`函数创建了一个字体对象,可以根据需要自定义字体和字号。然后,在主循环中监听鼠标事件,并使用`pygame.mouse.get_pos()`函数获取鼠标点击位置。根据点击位置的坐标,我们可以判断鼠标点击发生在哪个区域,并进行相应的操作。在示例代码中,我们将屏幕分为四个区域,并在每个区域绘制了相应的文本。当鼠标点击不同区域时,会在控制台输出相应的信息。你可以根据需要修改区域的数量和位置,并进行相应的操作。

5:pygame音效控制

使用精灵是在游戏中处理多个对象的有效方式之一,包括音效对象。下面是在pygame中使用精灵处理音效的基本步骤

1. 导入所需的模块:

import pygame

from pygame.locals import *

``` 2. 创建音效对象: ```

pygame.mixer.init()

sound = pygame.mixer.Sound("sound.wav")

``` 3. 创建一个继承自`pygame.sprite.Sprite`的子类来表示音效精灵: ```

 class SoundSprite(pygame.sprite.Sprite):

def __init__(self, sound):

super().__init__()

self.sound = sound

``` 4. 在主循环中监听音效: ``

 all_sprites = pygame.sprite.Group()

# 创建精灵组

sound_sprite = SoundSprite(sound)

# 创建音效精灵实例

all_sprites.add(sound_sprite)

# 将音效精灵添加到精灵组

while True:

# 监听事件

for event in pygame.event.get():

if event.type == QUIT:

pygame.quit()

sys.exit()

# 更新精灵组

all_sprites.update() # 绘制精灵组

screen.fill((0, 0, 0)) # 填充窗口背景色

all_sprites.draw(screen)

pygame.display.flip() # 刷新屏幕

``` 你可以根据自己的需求对精灵进行进一步的定制和操作。

6.pygame动画制作

Pygame提供了一些功能来创建动画效果。以下是使用pygame创建基本动画的一般步骤:

1. 导入所需的模块:

import pygame

from pygame.locals import *

``` 2. 初始化pygame和创建窗口: ```

 pygame.init()

screen = pygame.display.set_mode((width, height))

``` 3. 加载图像资源: ```

image = pygame.image.load("image.png")

``` 4. 定义动画帧: ```

 frame_rects = [rect1, rect2, rect3, ...]

``` 这里,`rect1`,`rect2`,`rect3`等是图像资源中每个动画帧的矩形区域。你可以通过切割图像或者使用精灵表(sprite sheet)来获取这些矩形区域。

5. 在主循环中更新和绘制帧:

 frame_index = 0

while True:

for event in pygame.event.get():

if event.type == QUIT:

pygame.quit()

sys.exit()

# 更新当前帧索引

frame_index += 1

if frame_index >= len(frame_rects):

frame_index = 0

# 清空屏幕

screen.fill((0, 0, 0))

# 绘制当前帧

current_frame_rect = frame_rects[frame_index]

screen.blit(image, (x, y), current_frame_rect)

pygame.display.flip() # 刷新屏幕

``` 在这个基本的示例中,我们通过不断更新和绘制矩形区域来实现动画效果。你可以根据自己的需求修改和扩展这个示例。 请注意,这只是一个简单的静态图像动画的示例。如果你想要更复杂的动画效果,例如平滑过渡、帧间插值等,可能需要使用更高级的技术和算法。 。

7.碰撞检测

在Pygame中,有几种进行碰撞检测的方法,让你可以检测对象之间是否碰撞或者重叠。下面是其中一种常用的方法:

1. 使用`pygame.Rect`类:

`pygame.Rect`类是一个用于处理矩形区域的内置类。它提供了一些方便的方法来执行简单的碰撞检测。

 rect1 = pygame.Rect(x1, y1, width1, height1)

rect2 = pygame.Rect(x2, y2, width2, height2)

if rect1.colliderect(rect2):

# 发生碰撞

else:

# 未发生碰撞

``` 这个方法适用于检测两个矩形区域是否相交(碰撞)。如果发生碰撞,`colliderect()`函数将返回True,否则返回False。

你可以根据自己的需求对碰撞检测进行扩展,例如使用循环遍历多个对象,或者组合使用多个碰撞检测方法。

另外,如果你想要更高级的碰撞检测,例如像素级别的检测,Pygame也提供了其他更复杂的方法,如`pygame.sprite.collide_rect()`和`pygame.sprite.collide_mask()`等方法。这些方法对于处理更精确的碰撞检测场景非常有用。

8.总结

ygame是一个用于开发2D游戏和多媒体应用程序的Python库。它提供了一系列功能,可以处理图形、音频、输入设备等。下面是一些Pygame的常见用法:

  1. 初始化Pygame:

  2. import pygame

  3. pygame.init()

  4. 创建窗口:

  5. screen = pygame.display.set_mode((width, height))

  6. 加载和显示图像:

  7. image = pygame.image.load("image.png")

  8. screen.blit(image, (x, y))

        处理用户输入:

        for event in pygame.event.get():

        if event.type == pygame.KEYDOWN:

if event.key == pygame.K_LEFT:

# 处理向左键按下事件

elif event.key == pygame.K_RIGHT:

# 处理向右键按下事件

elif event.type == pygame.MOUSEBUTTONDOWN:

# 处理鼠标点击事件

绘制形状和文本:

pygame.draw.rect(screen, color, (x, y, width, height))

pygame.draw.circle(screen, color, (x, y), radius

) font = pygame.font.Font(None, size)

text = font.render("Hello, World!", True, color)

screen.blit(text, (x, y))

播放音频:

pygame.mixer.music.load("music.mp3")

pygame.mixer.music.play()

游戏循环:

running = True while running:

for event in pygame.event.get():

if event.type == pygame.QUIT:

running = False

游戏逻辑和绘制

pygame.display.flip()

这些只是Pygame的一些基本用法,你可以根据具体需求进一步探索和学习。Pygame官方网站(https://www.pygame.org/)上有更详细的文档和示例代码供参考。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个pygame制作的简单小游戏示例: ```python import pygame import random # 初始化pygame pygame.init() # 设置游戏窗口的大小 screen_width = 400 screen_height = 400 screen = pygame.display.set_mode((screen_width, screen_height)) # 设置游戏标题 pygame.display.set_caption("小游戏") # 设置游戏背景颜色 background_color = (255, 255, 255) # 设置游戏结束的标志 game_over = False # 设置游戏时钟 clock = pygame.time.Clock() # 定义家的位置和大小 player_size = 50 player_x = screen_width / 2 - player_size / 2 player_y = screen_height - player_size - 10 # 定义敌人的位置和大小 enemy_size = 50 enemy_x = random.randint(0, screen_width - enemy_size) enemy_y = 0 enemy_speed = 10 # 定义得分 score = 0 font = pygame.font.SysFont(None, 25) # 游戏循环 while not game_over: # 处理游戏事件 for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True # 获取键盘按键状态 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and player_x > 0: player_x -= 5 elif keys[pygame.K_RIGHT] and player_x < screen_width - player_size: player_x += 5 # 移动敌人 enemy_y += enemy_speed if enemy_y > screen_height: enemy_x = random.randint(0, screen_width - enemy_size) enemy_y = 0 score += 10 enemy_speed += 1 # 判断是否碰撞 if (enemy_x >= player_x and enemy_x < player_x + player_size) or (player_x >= enemy_x and player_x < enemy_x + enemy_size): if (enemy_y >= player_y and enemy_y < player_y + player_size) or (player_y >= enemy_y and player_y < enemy_y + enemy_size): game_over = True # 绘制游戏界面 screen.fill(background_color) pygame.draw.rect(screen, (255, 0, 0), (enemy_x, enemy_y, enemy_size, enemy_size)) pygame.draw.rect(screen, (0, 0, 255), (player_x, player_y, player_size, player_size)) # 绘制得分 text = font.render("得分: " + str(score), True, (0, 0, 0)) screen.blit(text, (10, 10)) # 更新游戏显示 pygame.display.update() # 控制游戏帧率 clock.tick(30) # 退出游戏 pygame.quit() ``` 这个小游戏的规则很简单,家需要控制一个方块躲避从屏幕上方下落的另一个方块,同时获得尽可能高的得分。家可以使用左右箭头键来移动自己的方块。如果家的方块与下落的方块相撞,游戏结束。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值