我正在尝试将岩石发送到随机位置,我尝试过:self.x + = random.randint(-5,5)但这不好,因为每次主循环迭代时都会重新计算随机数,这会创建一种闪烁的效果,除了令人恐惧之外,还可以阻挡岩石的直角。我该如何解决?我只是想从屏幕的高中心开始,岩石以任意角度下降,然后实现一些弹跳并创建我的视频游戏,但是我仍然坚持这一点。这是我第一次在该论坛上写文章,因此,如果我做错了事,请事先道歉。
这是我的代码:
import pygame
import random
import time
import math
pygame.init()
display_width = 600
display_height = 500
screen = pygame.display.set_mode( (display_width, display_height) )
fps = 60
font_ubuntumono = pygame.font.SysFont('ubuntumono', 50, True)
rock = pygame.image.load('cave-painting.png').convert_alpha()
rock_width = rock.get_width()
rock_height = rock.get_height()
player = pygame.image.load('wizard.png').convert_alpha()
def initialize():
global speed_rock, rocks, playerX, playerY
speed_rock = 2
playerX = display_width//2
playerY = 400
rocks = []
rocks.append( RockClass() )
class RockClass:
def __init__(self):
self.x = display_width//2
self.y = 0
def continueDraw(self, a, b):
self.x += **???**
self.y += speed_rock
screen.blit( rock, (self.x, self.y) )
def collision(self, player, playerX, playerY):
tolerability = 5
right_player = playerX + player.get_width() - tolerability
left_player = playerX + tolerability
up_player = playerY + tolerability
right_rock = self.x + rock_width
left_rock = self.x
down_rock = self.y + rock_height
#check collision
if down_rock > up_player and
( ( left_player < left_rock and left_rock < right_player) or
( right_player > right_rock and right_rock > left_player) ):
#delete the rock from the screen
self.x = 5000
initialize()
def update():
pygame.display.update()
pygame.time.Clock().tick(fps)
def drawThings():
#draw background
screen.fill ( (255, 255, 255) )
#draw rocks
for rock2 in rocks:
rock2.continueDraw(210, 210)
#draw the player
screen.blit( player, (playerX, playerY) )
running = True
#main loop
while running:
#event loop
for event in pygame.event.get():
#move player
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
playerX -= 30
if event.key == pygame.K_RIGHT:
playerX += 30
#quit
if event.type == pygame.QUIT:
running = False
#to generate infinite rocks
if rocks[-1].y > 10:
rocks.append( RockClass() )
#check the player-rock collision
for rock2 in rocks:
rock2.collision(player, playerX, playerY)
#bordo alto
if playerX <= 0:
playerX = 0
if playerX >= 600:
playerX = 600
#update screen
drawThings()
update()
我建议通过random.uniform(a, b)
以下构造函数为x轴生成随机速度Rock
:
class Rock:
def __init__(self):
self.x = display_width//2
self.y = 0
self.speed_x = random.uniform(-2, 2)
加入self.speed_x
到self.x
中continueDraw
:
class Rock:
# [...]
def continueDraw(self, a, b):
self.x += self.speed_x
self.y += speed_rock
screen.blit( rock_img, (self.x, self.y) )
我建议pygame.Rect
分别colliderect()
用于碰撞检测:
class Rock:
# [...]
def collision(self, player, playerX, playerY):
tolerability = 5
player_rect = pygame.Rect(playerX+tolerability, playerY,
player.get_width()-2*tolerability, player.get_height())
rock_rect = pygame.Rect(self.x, self.y, rock_width, rock_height)
#check collision
if player_rect.colliderect(rock_rect):
#delete the rock from the screen
self.x = 5000
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句