首先做这个项目之前得清楚需要的材料和这个项目的结构,我自己感觉这个游戏项目的难点就在于钩子摆动的问题,它需要利用到三角函数来实现出来,我利用了pygame.transform.rotate()方法来实现钩字摇摆的问题,用sin和cos的方法来计算出钩字旋转的角度,对于目前的自己来说这就是最难的部分!这个项目我一共写了6个部分完成的,接下来就是代码部分!
项目管理代码
import mining
import pygame
from pygame.locals import *
import time
class A():
def __init__(self):
# pygame初始化 否则找不到字体文件
pygame.init()
def main(screen):
# 创建窗口
# screen = pygame.display.set_mode((1400, 900))
# 创建背景图片
background = pygame.image.load("./material/dabeijing.png")
# 创建玩家人物对象
miner = mining.Miner(screen)
# # 创建管理石头对象
manage_kuang = mining.Manage_kuang(screen)
# 创建钩子对象
crash = mining.Hook(screen)
music = mining.GameSound()
music.playBackgroundMusic()
while True:
# 将背景贴到界面中
screen.blit(background, (0, 0))
# 调用人物的显示功能
miner.display()
# 调用钩子的显示功能
crash.hook_display()
# 调用钩子旋转功能
crash.hook_rotate()
# 钩子检测按键
a = crash.control()
if a:
music.playHookSound()
# 钩子移动功能
crash.move()
# 钩子越界检测
crash.scope()
crash.scope2()
crash.scope3()
# 检测钩子碰撞
crash.pengzhuang(manage_kuang)
# 将钩子和物体一起向回拉
crash.move2()
# 随机石头
manage_kuang.random_fond()
for fond1 in manage_kuang.fonds:
fond1.display()
# fond1.move()
# 显示界面
pygame.display.update()
time.sleep(0.002)
def one():
# 创建窗口
screen = pygame.display.set_mode((1400, 900), 0, 32)
# 创建背景图片
background1 = pygame.image.load("9999.png")
# background = pygame.image.load("./material/dabeijing.png")
while True:
screen.blit(background1, (0, 0))
# a = input()
# if a == "a":
# break
for event in pygame.event.get():
print(event.type)
# print(pygame.K_SPACE)
# 判断是否是点击了退出按钮
if event.type == 12:
print("exit")
exit() # 让整个程序结束,return让 函数结束,break让循环结束
elif event.type == 3:
print(3333333333333333)
return screen
pygame.display.update()
# break
screen = one()
main(screen)
钩子碰撞
from math import sin, cos, pi
import pygame
from pygame.locals import *
import time
class Hook(pygame.sprite.Sprite):
"""钩子类"""
def __init__(self, screen):
pygame.sprite.Sprite.__init__(self)
self.rawimage = pygame.image.load("./material/gouzi3.png") # 原始图片
self.image = self.rawimage # 旋转后的图形,初始值就是原始图
self.rect = self.rawimage.get_rect() # 获取原始图形的矩形.
# self.aaa = pygame.image.load("./material/钩子.png") # 原始图片
self.x = 1400
self.y = 950
self.screen = screen
self.rect.topleft = [self.rect.x, self.rect.y]
# 定义一个变量用来进行使
self.a = True
self.b = False
self.c = False
self.d = False
self.num1 = False
self.num2 = True
self.hook_rotate_flag = True
self.speed = 5
# 转角
self.corner = 0
self.num = 2
self.speed = []
self.v = 10
self.aaa = False
# self.font = pygame.font.SysFont(" ", 40) # 格式, 大小
# 文本, 有没有抗锯齿, 颜色, 背景(可不写)
# self.text_surface = self.font.render("***** ", True, (200, 255, 255))
def hook_display(self):
"""显示功能"""
self.screen.blit(self.image, self.rect)
# self.screen.blit(self.aaa, (700, 0))
# self.screen.blit(self.text_surface, (self.rect.x, self.rect.y))
def hook_rotate(self):
"""旋转功能"""
self.right_rotate()
def detection(self):
"""检测按键功能"""
# 获取事件,比如按键等
for event in pygame.event.get():
# 判断是否是点击了退出按钮
if event.type == QUIT:
print("exit")
exit() # 让整个程序结束,return让函数结束,break让循环结束
def right_rotate(self):
"""旋转"""
if self.a:
if self.corner > -90:
self.corner -= self.num
self.image = pygame.transform.rotate(self.rawimage, self.corner)
self.rect = self.image.get_rect()
self.rect.x = self.x // 2 - self.rect.w // 2
self.rect.y = self.y - 730 - self.rect.h // 2
if self.corner == -90:
self.num = -2
self.corner = -88
if self.corner >= 90:
self.num = 2
self.corner = 88
self.rect.topleft = [self.rect.x, self.rect.y]
self.speed = [-int(self.v * sin(self.corner * pi / 180)), -int(self.v * cos(self.corner * pi / 180))]
def control(self):
"""检测键盘,调用对应的功能"""
# 获取事件,比如按键等
for event in pygame.event.get():