如何解决是否有任何命令可以让游戏在屏幕上绘制完毕后立即知道?
我想要类似的东西:如果-finished绘制-:做些事情。完成绘制的代码是什么?
我想要它,因为这是发生的情况(我使用的是Tiled,但是人们说这不是Tiled的错误,但我还是要把它保存在这里,而不是抱歉,检测冲突代码也位于末尾,但是一旦游戏正确绘制了所有内容,它就可以正常工作,所以我想碰撞代码不是问题):
-
运行游戏
-
在特定时间内将屏幕设为黑色,我认为它正在加载(例如convert_alpha或其他内容,但尚未执行可用于检查collide_rect的操作)
-
屏幕具有它所支持的所有精灵。
现在,如果在加载前我按向左键(或更改播放器位置的任何按钮),则会发生这种情况:
-
运行游戏
-
2.1。按向左键(假设按住它直到屏幕显示精灵)
2.2。一定时间内黑屏
- 屏幕上有所有精灵,但玩家的精灵已更新到新位置,因此玩家会越过游戏不希望其通过的任何障碍。
所以问题是,游戏仍在更新玩家位置,而游戏仍在加载其他东西,使其认为没有碰撞的可能性。我猜是这样的:加载地图时,屏幕还没有任何精灵,因此屏幕没有任何Rect。我的碰撞检查代码取决于Rect,因此游戏认为没有碰撞,不会阻止玩家。
对此的解决方法是,我创建一个属性:Game类,因此每次游戏创建新地图并加载新地图时,它将更新该属性:moment_change_map = pg.time.get_ticks() 。在游戏加载不用于检查的内容时,游戏将检查:
SELECT Airline.AirlineName,Flight_Schedule.Departure_City,COUNT(Flight_Schedule.Departure_City) AS No_of_DepartureCity,Flight_Schedule.Arrival_City,COUNT(Flight_Schedule.Arrival_City) AS No_of_ArrivalCity
FROM Airline
LEFT JOIN Aircraft ON Airline.AirlineID = Aircraft.AirlineID
LEFT JOIN Flight_Schedule ON Aircraft.AircraftID = Flight_Schedule.AircraftID
GROUP BY Airline.AirlineName,Flight_Schedule.Arrival_City
ORDER BY COUNT(Flight_Schedule.Departure_City)DESC,COUNT(Flight_Schedule.Arrival_City) DESC
因此,只有在节省了一定时间后,游戏才完成加载用于该地图的所有内容(以及用于检查的东西发生碰撞),然后才可以更新位置,并且游戏可以像平常一样检查碰撞
但是我不知道'duration_save_to_update_position'应该是多少(它应该基于不同的地图而定),并且如果持续时间太长,屏幕会在绘制障碍物之前先绘制地图,这样看起来有点丑陋的游戏,也许还有更好的方法可以解决这个我不知道的问题。而且也许我对发生的事情的猜测是错误的。
代码如下:
`if pg.time.get_ticks() - moment_change_map > duration_save_to_update_position:
-update position-`
(我想使用Tiled时,每个人都会执行相同的步骤,因此我不需要在此处为TiledMap编写代码)
class Game:
...
load map
game_folder = path.dirname(__file__)
map_folder = path.join(game_folder,'maps')
self.map = TiledMap(path.join(map_folder,self.curr_map ))
self.map_img = self.map.make_map()
self.map_rect = self.map_img.get_rect()
load obstacle on map:
for tile_object in self.map.tmxdata.objects:
if tile_object.name == 'player':
self.player = Player(self,tile_object.x,tile_object.y)
if tile_object.name == 'wall':
Wall(self,tile_object.y,tile_object.width,tile_object.height)
Wall类和Player类都具有self.groups = game.all_sprites。
检测器碰撞:
def update(self):
self.all_sprites.update()
基本上,如果一个精灵的位置改变了,我会把它分解成每个小矢量,并在每个小矢量碰撞后检查它是否会碰撞,这可以防止玩家vel变得太大而pos时玩家“传送”通过障碍将在一帧中更新为pos + = vel * dt。但是它在加载地图时没有做任何工作,所以我想问题是在加载时,没有任何东西可以检查碰撞
绘制代码:
def check_collide(sprite,group):
if vec(sprite.pos2) - vec(sprite.pos1) != vec(0,0):
sprite.delta_pos = vec(sprite.pos2) - vec(sprite.pos1)
len = vec(sprite.delta_pos).length()
part = round(len)
if part == 0:
part = 1
b = False
b1 = False
for i in range(part + 1):
sprite.pos = vec(sprite.pos1) + vec(sprite.delta_pos.x / part * i,sprite.delta_pos.y / part * i)
sprite.hit_rect.centerx = vec(sprite.pos).x
sprite.rect.centerx = vec(sprite.pos).x
hit = pg.sprite.spritecollide(sprite,group,False,collide_hit_rect)
if hit:
if hit[0].rect.centerx > sprite.hit_rect.centerx:
sprite.hit_rect.centerx = hit[0].rect.left - sprite.hit_rect.width / 2
if hit[0].rect.centerx < sprite.hit_rect.centerx:
sprite.hit_rect.centerx = hit[0].rect.right + sprite.hit_rect.width / 2
sprite.pos.x = vec(sprite.hit_rect.center).x
sprite.rect.centerx = vec(sprite.pos).x
b1 = True
sprite.hit_rect.centery = vec(sprite.pos).y
sprite.rect.centery = vec(sprite.pos).y
hit = pg.sprite.spritecollide(sprite,collide_hit_rect)
if hit:
if hit[0].rect.centery > sprite.hit_rect.centery:
sprite.hit_rect.centery = hit[0].rect.top - sprite.hit_rect.height / 2
if hit[0].rect.centery < sprite.hit_rect.centery:
sprite.hit_rect.centery = hit[0].rect.bottom + sprite.hit_rect.height / 2
sprite.pos.y = vec(sprite.hit_rect.center).y
sprite.rect.centery = vec(sprite.pos).y
b = True
if b == True or b1 == True:
break
循环游戏:
self.screen.blit(self.map_img,self.camera.apply_rect(self.map_rect))
for sprite in self.all_sprites:
self.screen.blit(sprite.image,self.camera.apply(sprite))
pg.display.flip()
总结:您将如何解决这个问题?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。