pygame基础教学(二)

1.添加enemy

在添加完Player后,就可以添加一些敌人,让我们的游戏丰富起来了,我们可以做一个躲避方块的游戏了

跟创建玩家一样的道理,先绘制出enemy

import pygame
import sys
import random

pygame.init()

width = 500
height = 500
size = width, height

screen = pygame.display.set_mode((size))
pygame.display.set_caption('Hello World')


class Player():
    def __init__(self):
        self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
        self.surface.fill('blue') #设置Player的颜色
        self.rect = self.surface.get_rect() #玩家位置

    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        #玩家移动
        self.speed = 5
        p = pygame.key.get_pressed()
        if p[pygame.K_UP]:
            self.rect.top -= self.speed
        
        if p[pygame.K_DOWN]:
            self.rect.top += self.speed

        if p[pygame.K_RIGHT]:
            self.rect.right += self.speed
        
        if p[pygame.K_LEFT]:
            self.rect.right -= self.speed

        #限制移动范围
        if self.rect.right >= width:
            self.rect.right -= self.speed

        if self.rect.left <= 0:
            self.rect.right += self.speed

        if self.rect.bottom >= height:
            self.rect.top -= self.speed

        if self.rect.top <= 0:
            self.rect.top += self.speed


class Enemy():
    def __init__(self):
        self.surface = pygame.surface.Surface((50, 50)) #创建敌人的外观
        self.surface.fill('red') #设置Enemy的颜色
        self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #敌人位置

    
    def draw(self):
        screen.blit(self.surface, self.rect)

    
    
        

clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemy = Enemy()
while True: #设置一个循环
    for event in pygame.event.get(): #事件检测
        if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
            pygame.quit() #退出窗口
            sys.exit() #退出整个程序

    player.move()
    screen.fill('white') #将窗口设为白色
    player.draw() #调用player类的draw函数
    Enemy.draw()
    pygame.display.flip() #刷新窗口
    clock.tick(60) #帧率


然后添加Enemy的移动逻辑

import pygame
import sys
import random

pygame.init()

width = 500
height = 500
size = width, height

screen = pygame.display.set_mode((size))
pygame.display.set_caption('Hello World')


class Player():
    def __init__(self):
        self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
        self.surface.fill('blue') #设置Player的颜色
        self.rect = self.surface.get_rect() #玩家位置

    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        #玩家移动
        self.speed = 5
        p = pygame.key.get_pressed()
        if p[pygame.K_UP]:
            self.rect.top -= self.speed
        
        if p[pygame.K_DOWN]:
            self.rect.top += self.speed

        if p[pygame.K_RIGHT]:
            self.rect.right += self.speed
        
        if p[pygame.K_LEFT]:
            self.rect.right -= self.speed

        #限制移动范围
        if self.rect.right >= width:
            self.rect.right -= self.speed

        if self.rect.left <= 0:
            self.rect.right += self.speed

        if self.rect.bottom >= height:
            self.rect.top -= self.speed

        if self.rect.top <= 0:
            self.rect.top += self.speed


class Enemy():
    def __init__(self):
        self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
        self.surface.fill('red') #设置Enemy的颜色
        self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置

    
    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        self.speed = 7
        self.rect.right -= self.speed

    
    
        

clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemy = Enemy()
while True: #设置一个循环
    for event in pygame.event.get(): #事件检测
        if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
            pygame.quit() #退出窗口
            sys.exit() #退出整个程序

    player.move()
    enemy.move()
    screen.fill('white') #将窗口设为白色
    player.draw() #调用player类的draw函数
    enemy.draw()
    pygame.display.flip() #刷新窗口
    clock.tick(60) #帧率


这是运行游戏,就可以看到红色的方块移动过来了

然后创建更多enemy,用自定义函数USEREVENT,和延时装置定时生成敌人,生成批量敌人

先把实例化改成这样,创建一个空列表

enemy = Enemy() -------> enemies = []

 调用函数

    for enemy in enemies:
        enemy.draw()

设置一个自定义事件,0.3秒执行一次

ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEM, 500) #过0.5秒执行一次,单位毫秒

增加ADD_ENEMY的事件执行

while True: #设置一个循环
    for event in pygame.event.get(): #事件检测
        if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
            pygame.quit() #退出窗口
            sys.exit() #退出整个程序

        if event.type == ADD_ENEMY:
            enemies.append(Enemy())

此时就会不断的生成小方块在我们的屏幕上

完整代码:

import pygame
import sys
import random

pygame.init()

width = 500
height = 500
size = width, height

ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEMY, 500) #过0.3秒执行一次,单位毫秒

screen = pygame.display.set_mode((size))
pygame.display.set_caption('躲避方块')


class Player():
    def __init__(self):
        self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
        self.surface.fill('blue') #设置Player的颜色
        self.rect = self.surface.get_rect() #玩家位置

    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        #玩家移动
        self.speed = 5
        p = pygame.key.get_pressed()
        if p[pygame.K_UP]:
            self.rect.top -= self.speed
        
        if p[pygame.K_DOWN]:
            self.rect.top += self.speed

        if p[pygame.K_RIGHT]:
            self.rect.right += self.speed
        
        if p[pygame.K_LEFT]:
            self.rect.right -= self.speed

        #限制移动范围
        if self.rect.right >= width:
            self.rect.right -= self.speed

        if self.rect.left <= 0:
            self.rect.right += self.speed

        if self.rect.bottom >= height:
            self.rect.top -= self.speed

        if self.rect.top <= 0:
            self.rect.top += self.speed


class Enemy():
    def __init__(self):
        self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
        self.surface.fill('red') #设置Enemy的颜色
        self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置

    
    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        self.speed = 5
        self.rect.right -= self.speed


clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemies = []
while True: #设置一个循环
    for event in pygame.event.get(): #事件检测
        if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
            pygame.quit() #退出窗口
            sys.exit() #退出整个程序

        if event.type == ADD_ENEMY:
            enemies.append(Enemy())

    player.move()
    for enemy in enemies:
        enemy.move()
    screen.fill('white') #将窗口设为白色
    player.draw() #调用player类的draw函数
    for enemy in enemies:
        enemy.draw()
    pygame.display.flip() #刷新窗口
    clock.tick(60) #帧率


碰撞检测

Enemy已经添加了,但是我们碰到小方块却啥事没有,所以我们得添加碰撞检测,来检测玩家是否与小方块发生碰撞

import pygame
import sys
import random

pygame.init()

width = 500
height = 500
size = width, height

ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEMY, 500) #过0.3秒执行一次,单位毫秒

screen = pygame.display.set_mode((size))
pygame.display.set_caption('躲避方块')


class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
        self.surface.fill('blue') #设置Player的颜色
        self.rect = self.surface.get_rect() #玩家位置

    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        #玩家移动
        self.speed = 5
        p = pygame.key.get_pressed()
        if p[pygame.K_UP]:
            self.rect.top -= self.speed
        
        if p[pygame.K_DOWN]:
            self.rect.top += self.speed

        if p[pygame.K_RIGHT]:
            self.rect.right += self.speed
        
        if p[pygame.K_LEFT]:
            self.rect.right -= self.speed

        #限制移动范围
        if self.rect.right >= width:
            self.rect.right -= self.speed

        if self.rect.left <= 0:
            self.rect.right += self.speed

        if self.rect.bottom >= height:
            self.rect.top -= self.speed

        if self.rect.top <= 0:
            self.rect.top += self.speed


class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
        self.surface.fill('red') #设置Enemy的颜色
        self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置

    
    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        self.speed = 5
        self.rect.right -= self.speed


clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemies = pygame.sprite.Group()
while True: #设置一个循环
    for event in pygame.event.get(): #事件检测
        if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
            pygame.quit() #退出窗口
            sys.exit() #退出整个程序

        if event.type == ADD_ENEMY:
            enemies.append(Enemy())

    player.move()
    for enemy in enemies:
        enemy.move()
    screen.fill('white') #将窗口设为白色
    player.draw() #调用player类的draw函数
    for enemy in enemies:
        enemy.draw()
    pygame.display.flip() #刷新窗口
    clock.tick(60) #帧率


将Enemy的实例化改成

enemies = [] ----> enemies = pygame.sprite.Group()

运行以上代码时enemies.apend(Enemy())会报错,因为将enemies改成sprite.Group()了,而sprite.Group()没有apend这个方法, 所以要将apend改成add

import pygame
import sys
import random

pygame.init()

width = 500
height = 500
size = width, height

ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEMY, 500) #过0.3秒执行一次,单位毫秒

screen = pygame.display.set_mode((size))
pygame.display.set_caption('躲避方块')


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super.__init__(self)
        self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
        self.surface.fill('blue') #设置Player的颜色
        self.rect = self.surface.get_rect() #玩家位置

    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        #玩家移动
        self.speed = 5
        p = pygame.key.get_pressed()
        if p[pygame.K_UP]:
            self.rect.top -= self.speed
        
        if p[pygame.K_DOWN]:
            self.rect.top += self.speed

        if p[pygame.K_RIGHT]:
            self.rect.right += self.speed
        
        if p[pygame.K_LEFT]:
            self.rect.right -= self.speed

        #限制移动范围
        if self.rect.right >= width:
            self.rect.right -= self.speed

        if self.rect.left <= 0:
            self.rect.right += self.speed

        if self.rect.bottom >= height:
            self.rect.top -= self.speed

        if self.rect.top <= 0:
            self.rect.top += self.speed


class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super.__init__(self)
        self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
        self.surface.fill('red') #设置Enemy的颜色
        self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置

    
    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        self.speed = 5
        self.rect.right -= self.speed


clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemies = pygame.sprite.Group()
while True: #设置一个循环
    for event in pygame.event.get(): #事件检测
        if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
            pygame.quit() #退出窗口
            sys.exit() #退出整个程序

        if event.type == ADD_ENEMY:
            enemies.append(Enemy())

    player.move()
    for enemy in enemies:
        enemy.move()
    screen.fill('white') #将窗口设为白色
    player.draw() #调用player类的draw函数
    for enemy in enemies:
        enemy.draw()
    pygame.display.flip() #刷新窗口
    clock.tick(60) #帧率


然后再用来检测sprite与组Group()之间的碰撞

    for enemy in enemies:
        if enemy.rect.colliderect(player.rect):
            pygame.quit() #检测到碰撞就退出游戏
            sys.exit()

计分板

先创建一个score变量, 然后渲染文字

score = 0
my_font = pygame.font.SysFont(None, 16)
# 参数分别为 显示内容、是否消除锯齿、字体颜色
text = my_font.render(f"分数:{scroe}", True, 'black')

然后再用blit渲染到屏幕上,最后根据个人喜好,微调数据,就可以得到一款小游戏了

import pygame
import sys
import random
import tkinter.messagebox as msgbox

pygame.init()

width = 500
height = 500
size = width, height
score = 0

ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEMY, 500) #过0.3秒执行一次,单位毫秒

screen = pygame.display.set_mode((size))
pygame.display.set_caption('躲避方块')


my_font = pygame.font.SysFont(None, 20)



class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
        self.surface.fill('blue') #设置Player的颜色
        self.rect = self.surface.get_rect() #玩家位置

    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        #玩家移动
        self.speed = 5
        p = pygame.key.get_pressed()
        if p[pygame.K_UP]:
            self.rect.top -= self.speed
        
        if p[pygame.K_DOWN]:
            self.rect.top += self.speed

        if p[pygame.K_RIGHT]:
            self.rect.right += self.speed
        
        if p[pygame.K_LEFT]:
            self.rect.right -= self.speed

        #限制移动范围
        if self.rect.right >= width:
            self.rect.right -= self.speed

        if self.rect.left <= 0:
            self.rect.right += self.speed

        if self.rect.bottom >= height:
            self.rect.top -= self.speed

        if self.rect.top <= 0:
            self.rect.top += self.speed


class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
        self.surface.fill('red') #设置Enemy的颜色
        self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置

    
    def draw(self):
        screen.blit(self.surface, self.rect)

    def move(self):
        self.speed = 5
        self.rect.right -= self.speed


clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemies = pygame.sprite.Group()
while True: #设置一个循环
    score += 1
    # 参数分别为 显示内容、是否消除锯齿、字体颜色
    text = my_font.render(f"score:{score}", True, 'black')
    for event in pygame.event.get(): #事件检测
        if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
            pygame.quit() #退出窗口
            sys.exit() #退出整个程序

        if event.type == ADD_ENEMY:
            enemies.add(Enemy())

    for enemy in enemies:
        if enemy.rect.colliderect(player.rect):
            msgbox.showinfo('你失败了', f'你失败了,分数{score}')
            pygame.quit()
            sys.exit()



    player.move()
    for enemy in enemies:
        enemy.move()
    screen.fill('white') #将窗口设为白色
    player.draw() #调用player类的draw函数
    for enemy in enemies:
        enemy.draw()

    screen.blit(text, (10, 10))
    pygame.display.flip() #刷新窗口
    clock.tick(60) #帧率


运行效果:

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值