- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果任何对 pygames 有基本了解的人可以帮助我解决我目前面临的问题,那就太好了。对于你们这些绝对的神来说,应该不会太难。
我现在的代码遇到了问题。
我正在尝试制作一个简单的游戏,其中程序显示一个随机字母,用户必须在该字母到达页面底部之前输入该字母。
我有在随机列中显示随机字母的代码,但是,一旦字母到达底部,我只能让程序打印“结束”,然后退出程序。
我无法理解如何进一步开发代码。这是现在的代码:
import os #
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (1335,330) # sets the coordinates so that the window pops up in the lower right side of the screen (1600x900 screen)
import pygame # pygame is the platform im using
import random # random needs to be imported for the random letters and columns
pygame.init() # initializes pygame
win = pygame.display.set_mode((260, 527)) # size of the window ,screenwidth = 260, screenheight = 527
pygame.display.set_caption("Daveypoo is King") # title of the window
clock = pygame.time.Clock() # used for frame rate
bg = pygame.image.load('phone3cropped.jpg') # background picture upload
qp = pygame.image.load('q.png') # uploads pictures of the letters (use paint, 50x50 pixels, black, 1 pixel outline, font = 36)
wp = pygame.image.load('w.png') # ^
ep = pygame.image.load('e.png') # ^
ap = pygame.image.load('a.png') # ^
sp = pygame.image.load('s.png') # ^
dp = pygame.image.load('d.png') # ^
jp = pygame.image.load('j.png') # ^
kp = pygame.image.load('k.png') # ^
lp = pygame.image.load('l.png') # ^
letterlist = [qp,wp,ep,ap,sp,dp,jp,kp,lp] # creates a list of letter images
randletter = random.choice(letterlist) # randomizes the list of images^
class player(): # creates letter instance
def __init__(self, x,y,width,height,end): # initializes the list
self.x = x
self.y = y
self.width = width
self.height = height
self.path = [self.y, 415] # creates the path that the letters will travel
self.vel = 1 # this is where the velocity of the letters is set
self.hitbox = (self.x, self.y, 50, 50) # creates the hitbox for the letter pictures (no need to change for now -- 50x50 is good)
def move(self, win): # creates the movement for the letters
if self.vel > 0:
if self.y + self.vel < self.path[1] : # if the bottom of the letter is less than the end, then:
self.y += self.vel # keep going
else: # if not:
self.vel = 0 # stop moving
else: # if the bottom of the letter is at the end, then
print('end')
quit()
#redrawGameWindow()
# this is where the action to make a new letter has to go
class greenzone(object): # creates the zone (greenzone) where the player should get the letter in
def __init__(self,x,y,width,height): # initializes it
self.x = x
self.y = y
self.width = width
self.height = height
self.hitbox = (16, 342, 228, 66) # first two letters are top left (x,y) coordinate of the zone, next is width, next is height
# def hit(self):
# print('hit')
def redrawGameWindow():
win.blit(bg, (0,0)) # diplays the background image, coordinates of top left
win.blit(randletter, pygame.draw.rect(win, (255, 255, 255), (letters.x, letters.y, letters.width, letters.height))) # displays the letters going down the page (letters.x, letters.y, letters.width, letters.height)
# win.blit(randletter, pygame.draw.rect(win, (255, 255, 255), (letters.x, letters.y, letters.width, letters.height)))
letters.move(win) # calls upon the movement of the letters -- makes them move
# for letter in letters:
# letter.draw(win)
#pygame.draw.rect(win, (255,0,0), (16, 342, 228, 66), 2) # this shows the hitbox of the greenzone if needed
pygame.display.update() # idk what this does -- but it is needed
### mainloop
abc_list = [27,106,185] # this is the list of the starting positions of the letters (top left)
rand = random.choice(abc_list) # takes a random starting position of the letters
letters = player(rand,56,50,50,415) # instances the letters to start
#letters = [] # apparently creates a list of the the letters -- used to initialize and create new letters
target = greenzone(18,343,228,67) # sets the hitbox of the greenzone
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
exit()
# for letter in letters:
# if letter.x < 500 and letter.x > 0:
# letter.x += letter.vel
# else:
# letters.pop(letters.index(letter))
keys = pygame.key.get_pressed()
if keys[pygame.K_q] and randletter == qp:
if letters.y < target.hitbox[1] + target.hitbox[3]:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail')
if keys[pygame.K_w] and randletter == wp:
if letters.y < target.hitbox[1] + target.hitbox[3]:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail')
if keys[pygame.K_e] and randletter == ep:
if letters.y < target.hitbox[1] + target.hitbox[3]:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail')
if keys[pygame.K_a] and randletter == ap:
if letters.y < target.hitbox[1] + target.hitbox[3]:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail')
if keys[pygame.K_s] and randletter == sp:
if letters.y < target.hitbox[1] + target.hitbox[3]:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail')
if keys[pygame.K_d] and randletter == dp:
if letters.y < target.hitbox[1] + target.hitbox[3]:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail')
if keys[pygame.K_j] and randletter == jp:
if letters.y < target.hitbox[1] + target.hitbox[3]:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail')
if keys[pygame.K_k] and randletter == kp:
if letters.y < target.hitbox[1] + target.hitbox[3]:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail')
if keys[pygame.K_l] and randletter == lp:
if letters.y < target.hitbox[1] + target.hitbox[3]:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail')
redrawGameWindow()
pygame.quit()
我知道这是很多代码,我尝试添加尽可能多的注释,以帮助阅读本文的人理解我的心态。
对此的任何和所有帮助都会很棒。我知道我做错了很多——我几天前才开始这样做。感谢您的任何意见,非常感谢!!
最佳答案
根据您提供的其他信息:
My main/overall problem that I am facing is that once the letter doeshit the bottom, I want it to re-do the "iteration" of making a newrandom letter in a new column, and keep on repeating. Eventually, Iwant the program to only allow 5 "lives", and if they mess up morethan 5 times, they either get the option to restart or quit theprogram.
Along with that, my future aspirations for this code is to allow the user to select the speed and letter combinations that appear onthe screen. But I personally believe that I would be able to code thatonce I have the overall code repeat itself (like I just describedabove)
我必须将碰撞检测算法移出按键部分。我还清理了代码,将每个部分分成自己的函数。我对类还不太熟悉,所以我不知道用 target = greenzone(..) 做什么 - 这也可能是我大量使用 global 的原因
update()、init()、main() 都很简单。 dropLetter() 是您正在寻找的函数。在 updateInput() 中,randLetterIndex 用于更有效地检查按下的键是否是您需要的,我仍然对 Python 没有 switch() 语句感到震惊,所以这就是我想出的方法来解决这个问题。 checkCollision() - 我试图保留它,因为我不确定你将来对这个游戏的计划。我确实在 else 语句中添加了很多内容,包括将 quit() 语句移至此处
import os #
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (1335,330) # sets the coordinates so that the window pops up in the lower right side of the screen (1600x900 screen)
import pygame # pygame is the platform im using
import random # random needs to be imported for the random letters and columns
pygame.init() # initializes pygame
win = pygame.display.set_mode((260, 527)) # size of the window ,screenwidth = 260, screenheight = 527
pygame.display.set_caption("Daveypoo is King") # title of the window
clock = pygame.time.Clock() # used for frame rate
bg = pygame.image.load('phone3cropped.jpg') # background picture upload
qp = pygame.image.load('q.png') # uploads pictures of the letters (use paint, 50x50 pixels, black, 1 pixel outline, font = 36)
wp = pygame.image.load('w.png') # ^
ep = pygame.image.load('e.png') # ^
ap = pygame.image.load('a.png') # ^
sp = pygame.image.load('s.png') # ^
dp = pygame.image.load('d.png') # ^
jp = pygame.image.load('j.png') # ^
kp = pygame.image.load('k.png') # ^
lp = pygame.image.load('l.png') # ^
letterlist = [qp,wp,ep,ap,sp,dp,jp,kp,lp] # creates a list of letter images
pygameKeyList = [pygame.K_q, pygame.K_w, pygame.K_e, pygame.K_a, pygame.K_s, pygame.K_d, pygame.K_j, pygame.K_k, pygame.K_l]
random.seed() # seed the RNG
abc_list = [27,106,185] # this is the list of the starting positions of the letters (top left)
lives = 5 # 5 lives to start
userPressingKey = False # if user is currenlty pressing the key of the currently chosen letter
run = False
class player(): # creates letter instance
def __init__(self, x,y,width,height,end): # initializes the list
self.x = x
self.y = y
self.width = width
self.height = height
self.path = [self.y, 415] # creates the path that the letters will travel
self.vel = 1 # this is where the velocity of the letters is set
self.hitbox = (self.x, self.y, 50, 50) # creates the hitbox for the letter pictures (no need to change for now -- 50x50 is good)
def move(self, win): # creates the movement for the letters
if self.vel > 0:
if self.y + self.vel < self.path[1] : # if the bottom of the letter is less than the end, then:
self.y += self.vel # keep going
else: # if not:
self.vel = 0 # stop moving
# else: # if the bottom of the letter is at the end, then
# print('end')
# quit()
#redrawGameWindow()
# this is where the action to make a new letter has to go
class greenzone(object): # creates the zone (greenzone) where the player should get the letter in
def __init__(self,x,y,width,height): # initializes it
self.x = x
self.y = y
self.width = width
self.height = height
self.hitbox = (16, 342, 228, 66) # first two letters are top left (x,y) coordinate of the zone, next is width, next is height
# def hit(self):
# print('hit')
def redrawGameWindow():
win.blit(bg, (0,0)) # diplays the background image, coordinates of top left
win.blit(letterlist[randLetterIndex], pygame.draw.rect(win, (255, 255, 255), (letters.x, letters.y, letters.width, letters.height))) # displays the letters going down the page (letters.x, letters.y, letters.width, letters.height)
# win.blit(randletter, pygame.draw.rect(win, (255, 255, 255), (letters.x, letters.y, letters.width, letters.height)))
letters.move(win) # calls upon the movement of the letters -- makes them move
# for letter in letters:
# letter.draw(win)
#pygame.draw.rect(win, (255,0,0), (16, 342, 228, 66), 2) # this shows the hitbox of the greenzone if needed
pygame.display.update() # idk what this does -- but it is needed
def dropLetter():
#global randletter
global letters, rand, randLetterIndex
randLetterIndex = random.randrange(0,len(letterlist))
# randletter = letterlist[randLetterIndex] # randomizes the list of images^
rand = random.choice(abc_list) # takes a random starting position of the letters
letters = player(rand,56,50,50,415) # instances the letters to start
#letters = [] # apparently creates a list of the the letters -- used to initialize and create new letters
def checkCollision():
global run, lives
if letters.y < target.hitbox[1] + target.hitbox[3]:
if userPressingKey:
if letters.y + letters.height > target.hitbox[1]:
print('hit')
else:
print('fail')
else:
print('fail hard')
lives -= 1
print("lives:",lives)
if(lives <= 0):
print('end')
run = False
quit()
dropLetter()
def updateInput():
global userPressingKey
keys = pygame.key.get_pressed()
if(keys[pygameKeyList[randLetterIndex]]):
userPressingKey = True
else:
userPressingKey = False
# if keys[pygame.K_q] and randletter == qp:
# checkCollision()
# if keys[pygame.K_w] and randletter == wp:
# checkCollision()
# if keys[pygame.K_e] and randletter == ep:
# checkCollision()
# if keys[pygame.K_a] and randletter == ap:
# checkCollision()
# if keys[pygame.K_s] and randletter == sp:
# checkCollision()
# if keys[pygame.K_d] and randletter == dp:
# checkCollision()
# if keys[pygame.K_j] and randletter == jp:
# checkCollision()
# if keys[pygame.K_k] and randletter == kp:
# checkCollision()
# if keys[pygame.K_l] and randletter == lp:
# checkCollision()
# for letter in letters:
# if letter.x < 500 and letter.x > 0:
# letter.x += letter.vel
# else:
# letters.pop(letters.index(letter))
def update():
updateInput()
checkCollision()
def init():
dropLetter()
def main():
global run
init()
### mainloop
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
exit()
update()
redrawGameWindow()
clock.tick(144)
target = greenzone(18,343,228,67) # sets the hitbox of the greenzone
main()
pygame.quit()
关于python - 有没有办法让我的 blit 在第一次迭代后重复自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59224639/
使用 pygame,是否会更有效率: 每帧从 spritesheet 的一部分中 Blit 一个单独的 sprite 在启动时,将每个 Sprite 从 spritesheet 传输到它们自己的表面,
阅读 pygame 教程 here ,你会发现这个例子:(箭头是我的) for o in objects: screen.blit(background, o.pos, o.pos) # Re
我正在为 WinCE 6.0 设备开发一个应用程序,其中需要旋转屏幕,因此我们使用典型的 ChangeDisplaySettingsEx() API。我也在 View 上画一些东西。 从 memDC
我想将用户输入到屏幕上的文本传输到屏幕上。每次用户按回车键时,键入的文本都会被传输到屏幕上。对于文本输入,我使用这个 [text_input 模块] ( https://github.com/Near
我得到了一个不断变化/更新的缓冲区,我需要将这个缓冲区的像素 blit 到屏幕上。对于我的测试代码,我读取了一个位图并将其存储到缓冲区中。问题是,我想在使用 OpenGL 将特定颜色 blit 到屏幕
给定一张图片,如何将其“包裹”在屏幕上? 例如,如果您将图像的 rect 样式对象设置在屏幕边缘下方 - 不可见的一半会 blit 到屏幕顶部。 imageRect.top=800 #Below
我正在尝试为被 blit 的文本创建打字机效果。所谓打字机效应,我的意思是我试图避免整个文本同时出现在屏幕上。相反,我试图让每个字母单独出现,在字符串中的下一个字符出现之前稍有延迟。 要注意的是我没有
我正在寻求实现一个管理 blit 队列的模块。有一个表面,该表面的部分(由矩形包围)被复制到表面内的其他地方: add_blt(rect src, point dst); 可以有任意数量的操作按顺序发
我正在尝试让我的网络摄像头通过 pygame 显示视频。这是代码: # import the relevant libraries import time import pygame import p
我正在尝试在我的 python 应用程序中实时绘制多个子图。理想情况下,我还应该能够在每个子图中绘制多条线,但为了简单起见,我假设每个子图中绘制一条线。为了有效地做到这一点(我正在寻找快速绘图),我试
我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。 void init_rendered_FBO
我有 2 个 FBO + MRT,它们有相同的附件(每个附件有 4 个颜色)。使用 glBlitFrameBuffer 对深度缓冲区和 one color_attachment 按预期工作。但是,当我
我知道这个话题经常出现,但经过多次尝试、搜索和放弃,我又把它带回到你身边。 我有一个类,其中包含一个 matplotlib 图形。在此图中,我想要一个文本,当用户按下某个键时,文本会更新为某些内容,而
我正在尝试在 python 中为 pygame 制作一个脚本,以绘制一个文本居中的按钮,但是当我 blit 到屏幕上时,它 blits 到我给它的 x 和 y,而不是按比例居中的位置。我希望能够将它集
我正在尝试使用 SDL 制作一个非常小且简单的片段。这个就像一个魅力: SDL_Window * window = SDL_CreateWindow("SDLTest", 0, 0, SCREEN_W
我正在尝试让我的网络摄像头通过 pygame 显示视频。这是代码: # import the relevant libraries import time import pygame import p
我正在编写一个基本上使用 Sprite 的游戏,我在这段代码中使用了 Sprite 表,最终得到了 "invalid destination for blit" 错误。 class spriteshe
如果任何对 pygames 有基本了解的人可以帮助我解决我目前面临的问题,那就太好了。对于你们这些绝对的神来说,应该不会太难。 我现在的代码遇到了问题。 我正在尝试制作一个简单的游戏,其中程序显示一个
我目前正在尝试再次对已绘制图像的一部分进行 blit。为此,我读到一个可以在使用 blit 时使用可选的第三个区域参数。我不知道为什么,但这个参数对我来说很奇怪。 据我了解,区域参数是(pos_x、p
我想将一个数组复制到另一个大小不同的数组。我想要这样的功能: blit(destimg,src,dstlocation) 例如 blit(zeros((7,7)),ones((3,3)),(4,4))
我是一名优秀的程序员,十分优秀!