bhunht 发表于 2022-5-21 22:40:55

小甲鱼pygame81讲中退出全屏BUG,求解

import pygame
import sys
from pygame.locals import *

pygame.init()

listmode = pygame.display.list_modes()

size = width,height = 600,400

speed = [-2,1]

bg = (255,255,255)

fullscreen = False


screen = pygame.display.set_mode(size,RESIZABLE)

pygame.display.set_caption('word game')

turtle = pygame.image.load('btn_tili.png')

position = turtle.get_rect()

l_head = turtle
r_head = pygame.transform.flip(turtle,True,False)

while True:
   
    for event in pygame.event.get():
      
      if event.type == pygame.QUIT:
            sys.exit()
      if event.type == KEYDOWN:
            if event.key == K_LEFT:
                turtle = l_head
                speed = [-1,0]

            if event.key == K_RIGHT:
                turtle = r_head
                speed =
            if event.key == K_UP:
                speed =
            if event.key == K_DOWN:
                speed =
            
            #全屏(F11)
                if event.key == K_F11:
                fullscreen = not fullscreen
                if fullscreen:
                  screen = pygame.display.set_mode((listmode),FULLSCREEN|HWSURFACE)
                  width,height = listmode
                  
                else:
                  screen = pygame.display.set_mode(size)
                  

      if event.type == VIDEORESIZE:
            size == event.size
            width,height = size
            screen = pygame.display.set_mode(size,RESIZABLE)
            
    position = position.move(speed)

    if position.left < 0 or position.right > width:

      turtle = pygame.transform.flip(turtle,True,False)

      speed = -speed

    if position.top < 0 or position.bottom > height:

      speed = -speed

    screen.fill(bg)

    screen.blit(turtle,position)

    pygame.display.flip()

    pygame.time.delay(10)


标红的为全屏的代码

当乌龟跑超过了 width,height = 600,400;再退出全屏游戏就会报错,请问如何优化这个BUG?

白two 发表于 2022-5-22 10:51:39

有点忘了, 应该可以检测点击全屏和退出全屏的按钮, 提供一个思路, 我记得是可行的
if 全屏按钮:
    if 全屏状态:
      重置小乌龟位置
      重置游戏框大小

bhunht 发表于 2022-5-23 09:54:33

白two 发表于 2022-5-22 10:51
有点忘了, 应该可以检测点击全屏和退出全屏的按钮, 提供一个思路, 我记得是可行的

这个逻辑我知道,但是写了不行,不知道为什么

白two 发表于 2022-5-23 12:13:50

这是我以前写的, 你参考一下

import pygame
import sys
from pygame.constants import *


def change_pos(position, width, height):
    if position.right > width:
      position.right = width
                  
    if position.bottom > height:
      position.bottom = height

pygame.init()
# size = width, height = (600, 400)
size = width, height = (1536, 864)
speed =
bg = (255, 255, 255)
clock = pygame.time.Clock()
screen = pygame.display.set_mode(size, RESIZABLE)
pygame.display.set_caption("初次见面,请多多关照!")
# post the turtle
turtle = pygame.image.load(r"D:\user\Desktop\pyPractice\game\turtle\turtle.png").convert_alpha()
position = turtle.get_rect()

for i in range(position.width):
    for j in range(position.height):
      at = turtle.get_at((i, j))
      if at > 100 and at > 200 and at > 100:
            at = 0
      turtle.set_at((i, j),at)

turtle_right = pygame.transform.rotate(turtle, 90)
turtle_top = pygame.transform.rotate(turtle, 90*2)
turtle_left = pygame.transform.rotate(turtle, 90*3)
turtle_bottom = turtle
turtle = turtle_top
fullscreen = False
while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            sys.exit()
      
      if event.type == VIDEORESIZE:
            if (event.size < 200):
                event.size = (200, event.size)
                size = event.size
                width, height = size
                screen = pygame.display.set_mode(size, RESIZABLE)
                change_pos(position, width, height)
            
            if (event.size < 200):
                event.size = (event.size, 200)
                size = event.size
                width, height = size
                screen = pygame.display.set_mode(size, RESIZABLE)
                change_pos(position, width, height)
            else:   
                size = event.size
                width, height = size
                screen = pygame.display.set_mode(size, RESIZABLE)
                change_pos(position, width, height)

      if event.type == KEYDOWN:   
            if event.key == pygame.K_F11:
                fullscreen = not fullscreen
                if fullscreen:
                  # size = width, height = pygame.display.list_modes()
                  size = width, height = (1536, 864)
                  screen = pygame.display.set_mode(size, pygame.HWSURFACE)

                else:
                  size = width, height = (600, 400)
                  screen = pygame.display.set_mode(size)
                  change_pos(position, width, height)

    position = position.move(speed)
    if position.right > width:
      turtle = turtle_right
      position = turtle_rect = turtle.get_rect()
      position.right = width
      speed =

    if position.bottom > height:
      turtle = turtle_bottom
      position = turtle_rect = turtle.get_rect()
      position.right = width
      position.bottom = height
      speed = [-5, 0]
   
    if position.left < 0:
      turtle = turtle_left
      position = turtle_rect = turtle.get_rect()
      position.bottom = height
      speed =
   
    if position.top < 0:
      turtle = turtle_top
      position = turtle_rect = turtle.get_rect()
      speed =

    screen.fill(bg)
    screen.blit(turtle, position)
    pygame.display.flip()
    pygame.time.delay(10)
    clock.tick(200)


bhunht 发表于 2022-5-23 12:50:01

白two 发表于 2022-5-23 12:13
这是我以前写的, 你参考一下

import pygame
import sys
from pygame.locals import *
from pygame.constants import *

pygame.init()



size = width,height= 600,400

speed =

bg = (255,255,255) #RGB颜色

fullscreen = False


screen = pygame.display.set_mode(size,RESIZABLE)

pygame.display.set_caption('word game')

turtle = pygame.image.load('btn_tili.png').convert_alpha()

position = turtle.get_rect()

l_head = turtle
r_head = pygame.transform.flip(turtle,True,False)

def change_pos(position, width, height):
    if position.right > width:
      position.right = width
                  
    if position.bottom > height:
      position.bottom = height

while True:
   
   
    for event in pygame.event.get():
      
      if event.type == pygame.QUIT:
            sys.exit()
      if event.type == KEYDOWN:
            if event.key == K_LEFT:
                turtle = l_head
                speed = [-1,0]

            if event.key == K_RIGHT:
                turtle = r_head
                speed =
            if event.key == K_UP:
                speed =
            if event.key == K_DOWN:
                speed =
            
            #全屏(F11)
            if event.key == K_F11:
                fullscreen = not fullscreen
                if fullscreen:
                  listmode = pygame.display.list_modes()
                  width, height =listmode
                  screen = pygame.display.set_mode((listmode),pygame.FULLSCREEN)
                  
                else:
                  size = width, height = (600, 400)
                  screen = pygame.display.set_mode(size)
                  change_pos(position, width, height)
                  

      if event.type == VIDEORESIZE:
            size == event.size
            width,height = size
            screen = pygame.display.set_mode(size,RESIZABLE)
            
    position = position.move(speed)

    if position.left < 0 or position.right > width:

      turtle = pygame.transform.flip(turtle,True,False)

      speed = -speed

    if position.top < 0 or position.bottom > height:

      speed = -speed

    screen.fill(bg)

    screen.blit(turtle,position)

    pygame.display.flip()

    pygame.time.delay(10)

      

按照你这个调了缩小可以了,但是还有一个BUG F11,只可以按一次,退出后第二次按就不可以全屏,这个是什么原因?
页: [1]
查看完整版本: 小甲鱼pygame81讲中退出全屏BUG,求解