微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查是否在pygame中单击了按钮

如何解决如何检查是否在pygame中单击了按钮

我正在制作一个宇宙飞船游戏,你可以向敌方飞船发射子弹并收集硬币。当您单击开始按钮时,游戏应该开始了。但是,当我尝试单击开始按钮时,游戏没有开始!我的 if 语句是否有问题以识别是否单击了开始按钮?

这是我当前的代码

import pygame
from pygame.locals import *
from random import randint,choice
from tools import *

pygame.init()
pygame.font.init()

SCREEN_X = 800
SCREEN_Y = 500
CENTER_POS = (400,225)

screen = pygame.display.set_mode((SCREEN_X,SCREEN_Y))


class Spaceship(pygame.sprite.Sprite):
    """A spaceship object. Used for the player."""

    def __init__(self,s,x,y):
        pygame.sprite.Sprite.__init__(self)

        self.screen = s
        self.x,self.y = x,y
        self.image = pygame.image.load("spaceship.png")
        self.image = pygame.transform.scale(self.image,(175,175))
        self.rect = self.image.get_rect()
        self.rect.center = (self.x,self.y)

    def update(self):
        """Updates the spaceship rect"""
        self.rect.center = (self.x,self.y)


class Bullet(pygame.sprite.Sprite):
    """A bullet object. Appears when the player clicks."""

    def __init__(self,y
        self.image = pygame.image.load("bullet.png")
        self.image = pygame.transform.scale(self.image,(100,100))
        self.rect = self.image.get_rect()
        self.rect.center = (self.x,self.y)

    def update(self):
        """Let's the bullet move upward."""

        self.y -= 5
        self.rect.center = (self.x,self.y)
        if self.y < 0:
            self.kill()


class Enemy(pygame.sprite.Sprite):
    """An enemy object. The player's job is to destroy enemies."""

    def __init__(self,y,t):
        pygame.sprite.Sprite.__init__(self)

        self.type = t
        self.screen,self.x,self.y = s,y
        self.image = pygame.image.load(get_enemy_image()[self.type])

        # There is an if statement because the
        # N1 galaxy fighter and M7 Comet Glider need different sizes

        if self.type == "N1 galaxy fighter":
            self.image = pygame.transform.scale(self.image,(235,215))
        elif self.type == "M7 Comet Glider":
            self.image = pygame.transform.scale(self.image,(155,215))
        self.rect = self.image.get_rect()
        self.rect = self.image.get_rect()
        self.rect.center = (self.x,self.y)
        self.score_given = get_enemy_given_score()[self.type]

    def update(self):
        if self.y < 0:
            self.kill()
        self.y += 3
        self.rect.center = (self.x,self.y)


class GameOverBackground(pygame.sprite.Sprite):
    """The game over background object."""

    def __init__(self,size=(100,100)):
        pygame.sprite.Sprite.__init__(self)

        self.screen,y
        self.size = size
        self.image = pygame.image.load("Game_Over.jpg")
        self.image = pygame.transform.scale(self.image,self.size)
        self.rect = self.image.get_rect()

    def blitme(self):
        """Blits the game over image on the screen"""
        self.screen.blit(self.image,self.rect)


class Coin(pygame.sprite.Sprite):
    """A coin object."""

    def __init__(self,pos=(0,0),100)):
        pygame.sprite.Sprite.__init__(self)

        self.x,self.y = pos[0],pos[1]
        self.size = size
        self.image = pygame.image.load("coin.png")
        self.image = pygame.transform.scale(self.image,self.size)
        self.rect = self.image.get_rect()
        self.rect.center = (self.x,self.y)

    def update(self):
        """Updates the coin rect"""
        self.rect.center = (self.x,self.y)


class StartButton(pygame.sprite.Sprite):
    def __init__(self,size=None):
        pygame.sprite.Sprite.__init__(self)

        self.screen = s
        self.x = x
        self.y = y
        self.image = pygame.image.load("start_button.png")

        if size is not None:
            self.image = pygame.transform.scale(self.image,size)

        self.rect = self.image.get_rect()
        self.rect.center = (self.x,self.y)

    def blitme(self):
        self.screen.blit(self.image,self.rect)


bg = GameOverBackground(screen,size=(800,500))

spaceship = Spaceship(screen,400,400)

start_button = StartButton(screen,CENTER_POS[0],CENTER_POS[1],size=(300,195))
game_started = False

bullets = pygame.sprite.Group()
enemies = pygame.sprite.Group()
coins = pygame.sprite.Group()

clock = pygame.time.Clock()

enemy_interval = 2000
enemy_event = pygame.USEREVENT + 1
pygame.time.set_timer(enemy_event,enemy_interval)

coin_interval = 3500
coin_event = pygame.USEREVENT + 1
pygame.time.set_timer(coin_event,coin_interval)

score = 0
lives = 3

with open("high_score.txt","r") as file:
    highscore = file.read()

font = pygame.font.SysFont("Arial",30)
score_text_surface = font.render("score: {:,}".format(score),True,(0,0))
lives_text_surface = font.render("HP: %s" % lives,0))
high_score_text_surface = font.render("High score: %s" % highscore,0))

spaceship_collided = False

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if game_started and event.type == MOUSEBUTTONDOWN:
            bullet = Bullet(screen,spaceship.x,spaceship.y - 20)
            bullets.add(bullet)

        if game_started and event.type == enemy_event and not lives <= 0:
            enemy = Enemy(screen,randint(-100,725),choice(["N1 galaxy fighter","M7 Comet Glider"]))
            enemies.add(enemy)

        if game_started and event.type == coin_event and not lives <= 0:
            if len(coins) < 100:
                coins.add(Coin((randint(-125,750),randint(-200,400))))

    screen.fill((255,255,255))  # DO NOT DRAW ANYTHING IN FRONT OF THIS LINE,I'M WARNING YOU

    if not game_started:
        start_button.blitme()
        mouse_pos = pygame.mouse.get_pos()

        if CENTER_POS[0] < mouse_pos[0] < CENTER_POS[0]+250 and CENTER_POS[1] > mouse_pos[1] > CENTER_POS[1] + 460:
            game_started = True
    else:
        bullets.update()

        key = pygame.key.get_pressed()
        amount = 5

        if key[pygame.K_a]:
            spaceship.x -= amount
        elif key[pygame.K_d]:
            spaceship.x += amount
        elif key[pygame.K_w]:
            spaceship.y -= amount
        elif key[pygame.K_s]:
            spaceship.y += amount

        spaceship.update()

        if not lives <= 0:
            screen.blit(spaceship.image,spaceship.rect)

        if not lives <= 0:
            bullets.draw(screen)
            enemies.draw(screen)

            coins.update()
            coins.draw(screen)

            for i in enemies:
                i.update()
                if pygame.sprite.spritecollide(i,bullets,True):
                    score += i.score_given
                    i.kill()

        if spaceship_collided and lives <= 0:
            bg.blitme()
            if score > int(highscore):
                with open("high_score.txt","w") as file:
                    file.write(str(score))

        if score >= 99999:
            score = 99999

        if not lives <= 0:
            score_text_surface = font.render("score: {:,0))
            screen.blit(score_text_surface,(590,0))

            lives_text_surface = font.render("HP: %s" % lives,0))
            screen.blit(lives_text_surface,(260,0))

            high_score_text_surface = font.render("High score: %s" % highscore,0))
            screen.blit(high_score_text_surface,(360,0))

        if pygame.sprite.spritecollide(spaceship,enemies,dokill=True):
            lives -= 1
            spaceship_collided = True

        if pygame.sprite.spritecollide(spaceship,coins,dokill=True):
            score += 10

    pygame.display.update()
    clock.tick(60)

解决方法

使用 pygame.Rect 对象和方法 collidepoint

<html>

  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Test Move Object</title>
    <script>
      function leftArrowPressed() {
        var element = document.getElementById("image1");
        element.style.left = parseInt(element.style.left) - 5 + 'px';
      }

      function rightArrowPressed() {
        var element = document.getElementById("image1");
        element.style.left = parseInt(element.style.left) + 5 + 'px';

      }

      function upArrowPressed() {
        var element = document.getElementById("image1");
        element.style.top = parseInt(element.style.top) - 5 + 'px';
      }

      function downArrowPressed() {
        var element = document.getElementById("image1");
        element.style.top = parseInt(element.style.top) + 5 + 'px';
      }

      function moveSelection(evt) {
        switch (evt.keyCode) {
          case 37:
            leftArrowPressed();
            break;
          case 39:
            rightArrowPressed();
            break;
          case 38:
            upArrowPressed();
            break;
          case 40:
            downArrowPressed();
            break;
        }
      };

      function docReady() {
        window.addEventListener('keydown',moveSelection);
      }
    </script>
  </head>

  <body onload="docReady()" onkeydown="" onkeyup="" bgcolor='yellow'>
    <img id="image1" src="https://netphp.geonevestudios.repl.co/images/favicon/web-icon.ico" style="position:absolute;left:0; top:0;" height="15" width="15">
  </body>

</html>

Pygame mouse clicking detection

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。