如何在pygame中的模块之间来回移动?

2024-10-03 23:17:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在pygame中为两个游戏制作一个主屏幕,在我提供的代码中,我将第一个游戏的名称更改为module1,主屏幕更改为Mainscreen

模块1已经完成,现在我只是想让主菜单脚本在我点击屏幕上已有的播放按钮时导入主游戏,然后当我完成游戏时(健康达到0),如果我想返回主菜单,我应该只点击“游戏结束”上的任意位置当运行状况达到0或按escape时应显示的屏幕

以下是我尝试过的:

这是整个游戏脚本,游戏循环在脚本的末尾,很抱歉它有多混乱:

# Pygame skeleton

import pygame
import math
import random
import sys
import os

pygame.init()
pygame.mixer.init()
vec = pygame.math.Vector2

# Constants

WIDTH = 1306
HEIGHT = 526 
FPS_INGAME = 60
FPS_HOMESCREEN = 30
FULL_SCREEN = (0,0)

bullet_img = pygame.image.load('Bullet.png')

jump = False

bullet_timer = 0
score = 0

moving_left = False
moving_right = False
shoot = False
acceleration = 0.7
friction = -0.1
gravity = 9.8
platform_color = (150,59,230)

# Classes and Sprites


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()

        self.shoot_cooldown = 0
        self.anime = []
        self.frame_index = 0
        self.update_time = pygame.time.get_ticks()
        self.action = 0
        animation_types = ["Shoot","Go"]
        for animation in animation_types:
            temp_list = []

            num_of_frames = len(os.listdir(f'MySprite/{animation}'))
            for i in range(1,num_of_frames):
                img = pygame.image.load(f'MySprite/{animation}/{i}.png')
                temp_list.append(img)
            self.anime.append(temp_list)


        self.direction = 1
        self.flip = False 
        

        self.image = self.anime[self.action][self.frame_index]
        self.rect = self.image.get_rect()
        

        # vectors and sprite constants
        
        self.health = 100
        self.pos = vec(WIDTH/2, HEIGHT/2)
        self.vel_vec = vec(0,0)
        self.acc_vec = vec(0,0)


    def jump(self):
        self.rect.y += 1
        hits = pygame.sprite.spritecollide(player_group.sprite, platform_group,False)
        self.rect.y -= -1
        if hits:
            self.vel_vec.y = -15

    def screen_edge(self):
        if self.pos.x > WIDTH:
            self.pos.x = 0
        if self.pos.x < 0:
            self.pos.x = WIDTH

    def get_damage(self,damage_mag):
        self.health -= damage_mag

    def update(self):

        animation_cooldown = 75
        self.image = self.anime[self.action][self.frame_index]
        if pygame.time.get_ticks() - self.update_time >= animation_cooldown:
            self.update_time = pygame.time.get_ticks()
            self.frame_index += 1
        if self.frame_index >= len(self.anime[self.action]):
            self.frame_index = 0

        if self.shoot_cooldown > 0:
            self.shoot_cooldown -= 1

    def update_action(self,new_action):
        if new_action != self.action:
            self.action = new_action
            self.frame_index = 0
            self.update_time = pygame.time.get_ticks()

    def move(self,moving_left,moving_right):
        self.acc_vec = vec(0,acceleration)
        if moving_left:
            self.acc_vec.x = -(acceleration)
            self.direction = 1
            self.flip = False

        if moving_right:
            self.acc_vec.x = acceleration
            self.direction = -1
            self.flip = True

        self.acc_vec.x += self.vel_vec.x * friction
        self.vel_vec += self.acc_vec
        self.pos += self.vel_vec + 0.5 * self.acc_vec
        self.rect.midbottom = self.pos
        hits = pygame.sprite.spritecollide(player_group.sprite, platform_group,False)
        if hits:
            self.pos.y = hits[0].rect.top
            self.vel_vec.y = 0

    def draw(self):
        screen.blit(pygame.transform.flip(self.image,self.flip,False),self.rect)
 

class Platform(pygame.sprite.Sprite):
    def __init__(self,x,y,w,h):
            super().__init__()
            self.image = pygame.Surface((w,h))
            self.image.fill(platform_color)
            self.rect = self.image.get_rect()
            self.rect.x = x
            self.rect.y = y


class Hostiles(pygame.sprite.Sprite):
    def __init__(self,x_pos,y_pos,speed):
        super(Hostiles,self).__init__()

        self.images = []
        self.images.append(pygame.image.load('MySprite/images/go_1.png'))
        self.images.append(pygame.image.load('MySprite/images/go_2.png'))
        self.images.append(pygame.image.load('MySprite/images/go_3.png'))
        self.images.append(pygame.image.load('MySprite/images/go_4.png'))
        self.images.append(pygame.image.load('MySprite/images/go_5.png'))
        self.images.append(pygame.image.load('MySprite/images/go_6.png'))
        self.images.append(pygame.image.load('MySprite/images/go_7.png'))
        self.images.append(pygame.image.load('MySprite/images/go_8.png'))
        self.images.append(pygame.image.load('MySprite/images/go_9.png'))
        self.images.append(pygame.image.load('MySprite/images/go_10.png'))
        self.index = 0
        self.image = self.images[self.index]

        self.rect = self.image.get_rect(center = (x_pos,y_pos))
        self.speed = speed

    def update(self):
        self.index += 1
        if self.index >= len(self.images):
            self.index = 0
        self.image = self.images[self.index]
        self.rect.centerx += self.speed
        if self.rect.centerx >= 1350 or self.rect.centerx <= -50:
            self.kill()

class Hostiles2(pygame.sprite.Sprite):
    def __init__(self,x_pos,y_pos,speed):
        super(Hostiles2,self).__init__()

        self.images2 = []
        self.images2.append(pygame.image.load('MySprite/images2/go_1.png'))
        self.images2.append(pygame.image.load('MySprite/images2/go_2.png'))
        self.images2.append(pygame.image.load('MySprite/images2/go_3.png'))
        self.images2.append(pygame.image.load('MySprite/images2/go_4.png'))
        self.images2.append(pygame.image.load('MySprite/images2/go_5.png'))
        self.images2.append(pygame.image.load('MySprite/images2/go_6.png'))
        self.images2.append(pygame.image.load('MySprite/images2/go_7.png'))
        self.images2.append(pygame.image.load('MySprite/images2/go_8.png'))
        self.images2.append(pygame.image.load('MySprite/images2/go_9.png'))
        self.images2.append(pygame.image.load('MySprite/images2/go_10.png'))
        self.index = 0
        self.image = self.images2[self.index]

        self.rect = self.image.get_rect(center = (x_pos,y_pos))
        self.speed = speed

    def update(self):
        self.index += 1
        if self.index >= len(self.images2):
            self.index = 0
        self.image = self.images2[self.index]
        self.rect.centerx += self.speed
        if self.rect.centerx >= 1350 or self.rect.centerx <= -50:
            self.kill()

class Bullets(pygame.sprite.Sprite):
    def __init__(self,x,y,direction):
        super().__init__()
        self.speed = 10
        self.image = bullet_img
        self.rect = self.image.get_rect(center = (x,y))
        self.direction = direction

    def update(self):
        self.rect.x -= (self.direction * self.speed)

        if self.rect.left >= WIDTH or self.rect.right <= 0:  
            self.kill()

        screen.blit(self.image,self.rect)

# Functions

def make_text(font_type,font_size,text,color,position):
    font = pygame.font.Font(font_type, font_size)
    title = font.render(text,True,(color))
    title_rect = title.get_rect(center = (position))
    screen.blit(title,title_rect)

def main_game():
    
    pygame.draw.rect(screen,(255,0,0),(22,20,200,10))
    pygame.draw.rect(screen,platform_color,(22,20,2 * player_group.sprite.health,10))
    screen.blit(heart,(0,2))

    bullet_group.draw(screen)  
    player.draw() 
    hostiles_group.draw(screen)
    platform_group.draw(screen)

    bullet_group.update()
    player_group.update()
    hostiles_group.update()
    player_group.update()

    player.screen_edge()
    
    if shoot:
        if player.shoot_cooldown == 0:

            bullet = Bullets(player.rect.centerx - (0.6 * player.direction * player.rect.size[0]),player.rect.centery,player.direction)
            bullet_group.add(bullet)
            player.shoot_cooldown = 40

    if moving_left or moving_right:
        player.update_action(1)

    else:
        player.update_action(0)
    player.move(moving_left,moving_right)


    if pygame.sprite.spritecollide(player_group.sprite,hostiles_group,True):
        player_group.sprite.get_damage(10)



    pygame.sprite.groupcollide(hostiles_group, bullet_group,True,True)
    return 2

def game_over():
    screen.fill((0,0,0))
    text = gamefont.render("GAME OVER",True,(255,255,255))
    text_rect = text.get_rect(center = (653,243))
    screen.blit(text,text_rect)

    scoresurface = gamefont.render(f"Score: {score}",True,(255,255,255))
    score_rect = scoresurface.get_rect(center = (653,283))
    screen.blit(scoresurface,score_rect)

# Creating window

screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("game name")
clock = pygame.time.Clock()

# Groups and objects

gamefont = pygame.font.Font('Chernobyl.ttf',40)

player = Player()


platform = Platform(0,HEIGHT-96,WIDTH,100)

platform_group = pygame.sprite.GroupSingle()
platform_group.add(platform)

player_group = pygame.sprite.GroupSingle()
player_group.add(player)

hostiles_group = pygame.sprite.Group()
hostile_event = pygame.USEREVENT
pygame.time.set_timer(hostile_event,300)


bullet_group = pygame.sprite.Group()

pygame.mouse.set_visible(True)

sky = pygame.image.load('SkyNight.png')
wallpaper = pygame.image.load('GamePlatform.png')
heart = pygame.image.load('Heart.png')

# Game loop

running = True
while running:
    # Events (Inputs)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        
        if event.type == hostile_event:
            random_xpos = [-40,-20]
            random_xpos2 = [1340,1360]
            random_hs = [-2,2]
            hostile_left = Hostiles2(random.choice(random_xpos),400,random.choice(random_hs))
            hostile_right = Hostiles(random.choice(random_xpos2),400,random.choice(random_hs))
            hostiles_group.add(hostile_left,hostile_right)
        
        if event.type == pygame.MOUSEBUTTONDOWN and player_group.sprite.health <= 0:
            player_group.sprite.health = 100
            hostiles_group.empty()
            score  = 0
            import MainMenu

        
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                moving_left = True
            if event.key == pygame.K_RIGHT:
                moving_right = True
            if event.key == pygame.K_q:
                shoot = True
            if event.key == pygame.K_ESCAPE:
                running = False
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                moving_left = False
            if event.key == pygame.K_RIGHT:
                moving_right = False
            if event.key == pygame.K_q:
                shoot = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player_group.sprite.jump()



    if player_group.sprite.health > 0:
        score += main_game()
        print (score)
    else:
        game_over()

    pygame.display.update()
    screen.blit(sky,FULL_SCREEN)
    screen.blit(wallpaper,FULL_SCREEN)
    programIcon = pygame.image.load('icon.png')
    pygame.display.set_icon(programIcon)
    clock.tick(FPS_INGAME)

这是所有的主屏幕/主菜单.py文件:

import pygame,sys
pygame.init()

screen = pygame.display.set_mode((1306,526))
clock = pygame.time.Clock()
pygame.mouse.set_visible(True)
screen_home = pygame.image.load('HomeScreen.png')

def make_text(font_type,font_size,text,color,position):
    font = pygame.font.Font(font_type, font_size)
    title = font.render(text,True,(color))
    title_rect = title.get_rect(center = (position))
    screen.blit(title,title_rect)



while True:
    
    font1 = pygame.font.Font('Starjedi.ttf',60)
    game1 = font1.render("Play",True,(255,255,255))
    game1_rect = game1.get_rect(center = (640,300))
   
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        
        if event.type == pygame.MOUSEBUTTONDOWN:
            if game1_rect.collidepoint(event.pos):
                import MainGame.py

    screen.blit(screen_home,(0,0))
    screen.blit(game1,game1_rect)
    make_text('Chernobyl.ttf',70,"Title Here",(255,255,255),(315,80))
    pygame.display.update()
    clock.tick(45)

当我运行主菜单时,我得到了我制作的主屏幕,然后我点击显示屏上的,它导入游戏脚本,游戏开始,当我的健康达到0,我点击屏幕退出游戏循环时,它会将我带回到主菜单,这正是我想要的,当我再次按play返回游戏时,它不起作用,它会给我一个错误:

ModuleNotFoundError: No module named 'MainGame.py'; 'MainGame' is not a package

我知道代码乱七八糟,我还是新手,如果我的问题不够清楚,我很抱歉,任何帮助都将不胜感激


Tags: rectimageselfeventifpnggroupload
1条回答
网友
1楼 · 发布于 2024-10-03 23:17:41

好的,现在我看到了您的代码,我可以看到您在使用import时遇到了一个大问题:

您可以这样使用它:

import MainGame.py

假设您创建的文件是MainGame.py,您应该这样导入它:

import MainGame

同样的道理也适用于

import MainMenu.py

这可能是问题所在,但如果您仍然有问题,那么请不要:

in the game, this is part of the main game loop:

请在两个文件中复制所有代码,并在代码旁边写下每个文件的名称

相关问题 更多 >