pygame例子中的小游戏

跟着pygame学习的小游戏 ,照做的,此例子会少两个图,ball.png与bat.png。自己百度搜索下

import sys
import pygame
from pygame.locals import *
import os 
import math
import random

def loadPng(name):
    fullname = os.path.join('data',name)
    try:
        image = pygame.image.load(fullname)
        if image.get_alpha is None:
            image = image.convert()
        else:
            image = image.convert_alpha()
    except pygame.error as message:
        print("无法加载图片",fullname)
        raise SystemExit(message)
    return image,image.get_rect()

class Ball(pygame.sprite.Sprite):

    def __init__(self,xy,vector):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect = loadPng('ball.png')
        screen = pygame.display.get_surface()
        self.area = screen.get_rect()
        self.vector = vector
        self.hit = 0
    
    def update(self):
        newpos = self.calcnewpos(self.rect,self.vector)
        self.rect = newpos
        (angle,z) = self.vector

        if not self.area.contains(newpos):
            tl = not self.area.collidepoint(newpos.topleft)
            tr = not self.area.collidepoint(newpos.topright)
            bl = not self.area.collidepoint(newpos.bottomleft)
            br = not self.area.collidepoint(newpos.bottomright)
            if tr and tl or (br and bl):
                angle = - angle
            if tl and bl:
                angle = math.pi - angle
            if tr and br:
                angle = math.pi - angle
        else:
            player1.rect.inflate(-3,-3)
            player2.rect.inflate(-3,-3)

            if self.rect.colliderect(player1.rect) == 1 and not self.hit:
                angle = math.pi - angle
                self.hit = not self.hit
            elif self.rect.colliderect(player2.rect) == 1 and not self.hit:
                angle = math.pi - angle
                self.hit = not self.hit
            elif self.hit:
                self.hit = not self.hit
        self.vector = (angle,z)
    
    def calcnewpos(self,rect,vector):
        (angle,z) = vector
        (dx,dy) = (z*math.cos(angle),z*math.sin(angle))
        return rect.move(dx,dy)

class Bat(pygame.sprite.Sprite):

    def __init__(self,side):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect = loadPng('bat.png')
        screen = pygame.display.get_surface()
        self.area = screen.get_rect()
        self.side = side
        self.speed = 10
        self.state = "still"
        self.reinit()
    
    def reinit(self):
        self.state="still"
        self.movepos = [0,0]
        if self.side == 'left':
            self.rect.midleft = self.area.midleft
        elif self.side == "right":
            self.rect.midright = self.area.midright

    def update(self):
        newpos = self.rect.move(self.movepos)
        if self.area.contains(newpos):
            self.rect = newpos
        pygame.event.pump()

    def moveup(self):
        self.movepos[1] = self.movepos[1] - (self.speed)
        self.state = "moveup"

    def movedown(self):
        self.movepos[1] = self.movepos[1] + (self.speed)
        self.state = "movedown"


def main():
    pygame.init()
    screen = pygame.display.set_mode((640,480))
    pygame.display.set_caption('basic')

    #填充背景
    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((0,0,0))

    #选择一些基本文字
    # font = pygame.font.Font(None,36)
    # text = font.render("hello there",3,(10,10,10))
    # textpos = text.get_rect()
    # textpos.centerx = background.get_rect().centerx
    # background.blit(text,textpos)

    # #画所有图
    # screen.blit(background,(0,0))
    # pygame.display.flip()

    global player1
    global player2
    player1 = Bat('left')
    player2 = Bat('right')

    speed = 5
    rand = ((0.1*(random.randint(5,8))))
    ball = Ball((0,0),(0.45,speed))

    playersprites = pygame.sprite.RenderPlain((player1,player2))
    ballsprite = pygame.sprite.RenderPlain(ball)

    screen.blit(background,(0,0))
    pygame.display.flip()

    clock = pygame.time.Clock()

    #事件
    while True:
        
        clock.tick(60)

        for event in pygame.event.get():
            if event.type == QUIT:
                return
            elif event.type == KEYDOWN:
                if event.key == K_w:
                    player1.moveup()
                if event.key == K_s:
                    player1.movedown()
                if event.key == K_UP:
                    player2.moveup()
                if event.key == K_DOWN:
                    player2.movedown()

            elif event.type == KEYUP:
                if event.key == K_w or event.key == K_s:
                    player1.movepos= [0,0]
                    player1.state = "still"

                if event.key == K_UP or event.key == K_DOWN:
                    player2.movepos = [0,0]
                    player2.state = "still"

        # screen.blit(background,(0,0))
        screen.blit(background,ball.rect,ball.rect)
        screen.blit(background,player1.rect,player1.rect)
        screen.blit(background,player2.rect,player2.rect)
        ballsprite.update()
        playersprites.update()
        ballsprite.draw(screen)
        playersprites.draw(screen)
        pygame.display.flip()

if __name__ == '__main__':
    main()

参考地址 https://blog.youkuaiyun.com/Enderman_xiaohei/article/details/88951842

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶是江湖中人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值