- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在使用 pygame 制作游戏,并发现该游戏中新窗口的必要性。 screenshot of the game
当男孩与其中一家公司(Web Canape、Smolenskiye Brillianty...)发生碰撞时,必须打开新窗口以在那里进行测验。主游戏还需要继续工作,因为男孩的任务是遍历所有公司。
有人可以帮我解决这个问题吗?
也许,可以使用 PyQt5 或 Tkinter 等新模块,以免终止整个游戏。
https://github.com/TotumRevolutum/shadows-game
import sys
from map import *
import pygame.display
pygame.init()
WIDTH = 11 * 100
HEIGHT = 7 * 100
clock = pygame.time.Clock()
def text_show(number):
intro_text_1 = ["Привет! Меня зовут Емеля.", "Я приглашаю тебя на День",
"Теней на предприятия", "Смоленской области.", " ", " ДАЛЕЕ"]
intro_text_2 = ['"День Теней" - это день,', "в течение которого школьники",
"могут лично следить за работой ", "специалистов с целью проверки",
"правильности выбора профессии.", " ДАЛЕЕ"]
intro_text_3 = ['Мы с тобой будем определяться', "с профессией по принципу ",
'индукции от "частного" к "общему",', 'от "предприятия" к "профессии."',
"", " ДАЛЕЕ"]
intro_text_4 = ['В конце Дня Теней', "ты сможешь выбрать предприятие,",
'на котором хотел бы работать!', '',
"", " ДАЛЕЕ"]
if number == 1:
text = intro_text_1
elif number == 2:
text = intro_text_2
elif number == 3:
text = intro_text_3
else:
text = intro_text_4
back = Background('bg/boy_start.png', [0, 0])
screen.blit(back.image, back.rect)
font = pygame.font.SysFont("Typewriter", 33)
tmp = 0
for line in text:
if line == " ДАЛЕЕ":
lines = font.render(line, 1, pygame.Color('red'))
else:
lines = font.render(line, 1, pygame.Color('black'))
display_rect = lines.get_rect()
tmp += 10
display_rect.y = 140 + tmp
display_rect.x = 640
tmp += display_rect.height
screen.blit(lines, display_rect)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
return
pygame.display.flip()
clock.tick(30)
text_show(1)
text_show(2)
text_show(3)
text_show(4)
running = True
generate_level(load_level())
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
move_boy(keys, player_group)
all_sprites.draw(screen)
tiles_group.draw(screen)
player_group.draw(screen)
pygame.display.flip()
clock.tick(60)
# other parts are located in the git
# https://github.com/TotumRevolutum/shadows-game
最佳答案
您不需要也不想要新窗口。只需创建另一个 Surface
/Sprite
来呈现文本并处理事件。
这是我一起编写的一个简单示例。请注意评论,因为它们解释了正在发生的事情:
import pygame
import pygame.freetype
# So our game has 2 states.
# Either we're in the world and run around;
# or we're displaying a menu and the player has to make a choice.
WORLD = 0
MENU = 1
# from https://www.pygame.org/docs/ref/freetype.html#pygame.freetype.Font.render_to
def word_wrap(surf, text, font, color=(0, 0, 0)):
font.origin = True
words = text.split(' ')
width, height = surf.get_size()
line_spacing = font.get_sized_height() + 2
x, y = 0, line_spacing
space = font.get_rect(' ')
for word in words:
bounds = font.get_rect(word)
if x + bounds.width + bounds.x >= width:
x, y = 0, y + line_spacing
if x + bounds.width + bounds.x >= width:
raise ValueError("word too wide for the surface")
if y + bounds.height - bounds.y >= height:
raise ValueError("text to long for the surface")
font.render_to(surf, (x, y), None, color)
x += bounds.width + space.width
return x, y
# This sprite handles the menu.
# It renders a box and a text and listens for key presses.
# If a key we're interessed in is pressed, we call the callback function.
class TextMenu(pygame.sprite.Sprite):
def __init__(self, font, text, listen_to, callback):
super().__init__()
self.image = pygame.Surface((400, 400))
self.image.fill(pygame.Color('white'))
self.image.fill(pygame.Color('black'), self.image.get_rect().inflate((-50, -50)))
self.rect = self.image.get_rect(topleft=(50, 50))
word_wrap(self.image.subsurface(self.image.get_rect().inflate((-100, -100))), text, font, pygame.Color('white'))
self.callback = callback
self.listen_to = listen_to
def update(self, events, dt):
for e in events:
if e.type == pygame.KEYDOWN and e.key in self.listen_to:
self.callback(self, e.key)
# This sprite represents a building the player can "walk in" to trigger
# a menu pop up. In this case, we want the user to either press 1 or 2.
# Then we change the color, because why not, something should happen.
class House(pygame.sprite.Sprite):
def __init__(self, pos, player, show_text):
super().__init__()
self.image = pygame.Surface((64, 64))
self.image.fill(pygame.Color('darkred'))
self.rect = self.image.get_rect(center=pos)
self.show_text = show_text
self.player = player
# Since the menu is triggered when the player touches the building,
# we don't want an endless loop, so we need a flag that prevents
# the menu until the player "leaves the building"
self.triggered = False
def change_color(self, key):
if key == pygame.K_1:
self.image.fill(pygame.Color('yellow'))
if key == pygame.K_2:
self.image.fill(pygame.Color('darkblue'))
def update(self, events, dt):
if pygame.sprite.collide_rect(self, self.player):
if not self.triggered:
self.show_text('Welcome, little blue rect. Please press (1) or (2).', (pygame.K_1, pygame.K_2), self.change_color)
self.triggered = True
else:
self.triggered = False
# This is the player.
# Does basically nothing but run around
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((32, 32))
self.image.fill(pygame.Color('dodgerblue'))
self.rect = self.image.get_rect()
self.pos = pygame.Vector2((100, 200))
def update(self, events, dt):
pressed = pygame.key.get_pressed()
move = pygame.Vector2((0, 0))
if pressed[pygame.K_w]: move += (0, -1)
if pressed[pygame.K_a]: move += (-2, 0)
if pressed[pygame.K_s]: move += (0, 2)
if pressed[pygame.K_d]: move += (2, 0)
if move.length() > 0: move.normalize_ip()
self.pos += move*(dt/5)
self.rect.center = self.pos
def main():
pygame.init()
screen = pygame.display.set_mode((500, 500))
font = pygame.freetype.SysFont(None, 32)
clock = pygame.time.Clock()
dt = 0
player = Player()
# keep track of the state we're in.
# we start in the WORLD state, a.k.a. running around.
# the state just tells us which sprites are "active",
# a.k.a. if they are updated by calling thier update function
state = WORLD
# sprite group for all MENU-sprites
menu_sprites = pygame.sprite.Group()
# sprite group for all WORLD-sprites
sprites = pygame.sprite.Group(player)
# this function allows other sprites to trigger a menu
def show_text(text, listen_to, callback):
# this function is called by the menu.
# we change the state back to world and kill the TextMenu sprite
def wrapped_callback(sprite, *args):
nonlocal state
state = WORLD
callback(*args)
sprite.kill()
# so when this function is called , let's switch to the MENU state
nonlocal state
state = MENU
# add the TextMenu sprite to the menu_sprites group so it "lives"
menu_sprites.add(TextMenu(font, text, listen_to, wrapped_callback))
# create some buildings. They are all the same...
for pos in ((300, 300), (200, 400), (100, 100)):
sprites.add(House(pos, player, show_text))
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
# see which sprites are "active". The WORLD sprites or the MENU sprites
if state == WORLD:
sprites.update(events, dt)
else:
menu_sprites.update(events, dt)
screen.fill((30, 30, 30))
sprites.draw(screen)
menu_sprites.draw(screen)
pygame.display.update()
dt = clock.tick(60)
if __name__ == '__main__':
main()
请注意所有游戏逻辑是如何清晰分离的,而且这种方法可以轻松添加其他状态,例如暂停功能或菜单。
当然还有很多其他方法可以做到这一点,但您会明白的。有关如何在游戏中实现不同状态的另一个想法,也许可以看看这个 question .
关于python - 如何在pygame中创建新窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55149797/
我正在尝试使用特定路线打开一个新窗口,但似乎路线页面未正确加载。将从FrmApprovalMain.js打开新的 Electron 窗口,并应使用FrmPOdet.js打开新窗口。但是,当它打开时,会
我对 Tkinter 比较陌生,我需要帮助。 当从父窗口单击按钮时,我创建了一个新窗口。新窗口是 def new_Window。但我似乎无法获取窗口中的信息,如下编码: from tkinter im
我正在尝试使用 Javascript 从空白 iframe 中创建一个重定向,该 iframe 将定向到新窗口或选项卡中的 URL。 更具体地说,我试图让一个 Facebook 标签指向我公司的网页,
在问这个问题之前,我确实搜索了很多。抱歉,如果这是一个简单的问题。 在我的 wxWidgets 应用程序中,我想从菜单选项中新建一个 wxHtmlWindow。 (我已经正确显示了我的主应用程序窗口)
我认为我不是很了解这个,因为我对 jquery 还很陌生。我有一个隐藏了 3 个食谱的页面。单击食谱 A 的链接时,它会以模式打开。我希望能够只打印食谱的内容。所以我打开一个新窗口(非模态)并尝试将食
我想在带有可滚动文本框的现有主 Windwoe 旁边创建一个新窗口。 我在主窗口中按下“打开新窗口”按钮,然后它应该会打开一个带有可滚动文本框的新窗口。 在 form2 中 在 WPF 中,您可以在主
我正在使用 Simple Icons 制作自定义 Pinterest Pin It 按钮,我正在使用 Pinterest Widget Builder 给我的链接。在默认的 Pin It 按钮上,它会
我的表单上出现一个确认对话框,单击“确定”后会将用户重定向到另一个页面。 但是,是否可以在新窗口中打开该页面(例如 target="_blank") 我正在使用的代码是: var answer=con
相关但处于休眠状态:Javascript to open URL within a new Tab和其他一些...... 我有一个客户坚持认为特定链接需要在新选项卡中打开,而不是在窗口中打开。它由表单
我遇到了 Android 问题 WebView , 我想用 target='_blank' 打开一个 URL在同一WebView ,就像所有其他的一样URLs正在开放。 另请注意,我重写了 WebVi
可以从 Controller 重定向到某个 url 并同时在新窗口中打开该 url 吗? 最佳答案 不是真的来自 Controller Action 。 重定向是带有 301/302 状态代码和 Ra
在 Electron vue 中,我想为每个新窗口创建新的 vue 实例。这工作正常,直到我想将路由器子组件加载到新窗口。例如我有条目 add: path.join(__dirname, '../sr
案例1: var printWindow = window.open("", "print_window"); if(printWindow) { printWindow.addEventLi
我需要使用 Javascript Window.Open 函数打开一个新的 (_blank) 窗口。 URL 编码的回车符/换行符 (%0A) 似乎不起作用。有谁知道解决这个问题?例如,我有以下 UR
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 Imp
当 flash 有键盘焦点时,CTRL+T(新标签)和 CTRL+N(新标签)窗口)被闪光拦截。 有没有办法将这些事件传递给浏览器以便它们工作(打开新选项卡,打开新浏览器)或者是否有用于这些操作的 j
我有一个 ASP.Net MVC 页面,上面有一个非常简单的表单:一个文本框和一个提交按钮。该表单使用标准的 mvc BeginForm() 语法: 当直接打开页面时,一切正常。 但是,我们有另一个
如果您对此问题感兴趣,请阅读下面的更新 #2 ;) 假设我将此代码放入我的扩展程序的 JS 中。 var reader = { onInputStreamReady : function(in
我是一名优秀的程序员,十分优秀!