Pygame敌人没有停留在地图上的预定位置


import pygame, sys
clock = pygame.time.Clock()
from pygame.locals import *
pygame.mixer.pre_init(44100,-16,2,512)
pygame.init()
pygame.display.set_caption('THE GAME')#Window name
walkRight = [pygame.image.load('player_animations/R1.png'), pygame.image.load('player_animations/R2.png'), pygame.image.load('player_animations/R3.png'), pygame.image.load('player_animations/R4.png'), pygame.image.load('player_animations/R5.png'), pygame.image.load('player_animations/R6.png'), pygame.image.load('player_animations/R7.png'), pygame.image.load('player_animations/R8.png'), pygame.image.load('player_animations/R9.png')]
walkLeft = [pygame.image.load('player_animations/L1.png'), pygame.image.load('player_animations/L2.png'), pygame.image.load('player_animations/L3.png'), pygame.image.load('player_animations/L4.png'), pygame.image.load('player_animations/L5.png'), pygame.image.load('player_animations/L6.png'), pygame.image.load('player_animations/L7.png'), pygame.image.load('player_animations/L8.png'), pygame.image.load('player_animations/L9.png')]
Window_SIZE = (900,600)
screen = pygame.display.set_mode(Window_SIZE,0,32)
display = pygame.Surface((900,600))
player_image = pygame.image.load('player_animations/player_image.png')
player_image.set_colorkey((255,255,255))
grass_image = pygame.image.load('Map/Grassblock.png')
grass_image.set_colorkey((255,255,255))
dirt_image = pygame.image.load('Map/Dirtblock.png')
cobble_image = pygame.image.load('Map/Stoneblock.png')
TILE_SIZE = grass_image.get_width()
true_scroll = [0,0]
#ENEMIES
class Enemy(pygame.sprite.Sprite):
def __init__(self,x,y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('Map/blob.png')
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.move_direction = 1
self.move_counter = 0
def update(self):
self.rect.x += self.move_direction
self.move_counter += 1
if self.move_counter > 50:
self.move_direction *= -1
self.move_counter = 0

def redrawGameWindow():
global walkCount
screen.blit(display,(0,0))
blob_group.draw(screen)
blob_group.update()

if walkCount + 1 >=  27:
walkCount = 0
if moving_left:
screen.blit(walkLeft[walkCount // 3],(player_rect.x-scroll[0],player_rect.y-scroll[1] ))
walkCount += 1

elif moving_right:
screen.blit(walkRight[walkCount // 3],(player_rect.x-scroll[0],player_rect.y-scroll[1] ))
walkCount += 1  

else:
screen.blit(player_image,(player_rect.x-scroll[0],player_rect.y-scroll[1]))     


pygame.display.update() 


def load_map(path):
f = open(path + '.txt','r')
data = f.read()
f.close()
data = data.split('n')
game_map = []
for row in data:
game_map.append(list(row))
return game_map         
game_map = load_map('Map/map')
background_objects = [[0.2,[500,200,250,3000]],[0.5,[750,30,200,4000]],[0.3,[1000,100,235,2000]],[0.5,[130,90,100,4000]],[0.6,[300,100,220,5000]]]
def collision_test(rect,tiles):
hit_list = []
for tile in tiles:
if rect.colliderect(tile):
hit_list.append(tile)
return hit_list

def move(rect,movement,tiles):
collision_types = {'top':False,'bottom':False,'right':False,'left':False}
rect.x += movement[0]
hit_list = collision_test(rect,tiles)
for tile in hit_list:
if movement[0] > 0:
rect.right = tile.left
collision_types['right'] = True
elif movement[0] < 0:
rect.left = tile.right
collision_types['left'] = True
rect.y += movement[1]           
hit_list = collision_test(rect,tiles)
for tile in hit_list:
if movement[1] > 0:
rect.bottom = tile.top
collision_types['bottom'] = True
elif movement[1] < 0:
rect.top = tile.bottom
collision_types['top'] = True   
return rect, collision_types

moving_right = False
moving_left = False
moving_down = False
player_y_momentum = 0
air_timer = 0
player_rect = pygame.Rect(50,50,player_image.get_width(),player_image.get_height())
player_left = False
player_right = False
player_down = False 
jump_sound = pygame.mixer.Sound('jump.wav')
grass_sound = [pygame.mixer.Sound('grass_0.wav'),pygame.mixer.Sound('grass_1.wav')]
pygame.mixer.music.load('music.wav')
pygame.mixer.music.play(-1)

walkCount = 0
vel = 5
true_scroll[0] += (player_rect.x - true_scroll[0]-450)/20
true_scroll[1] += (player_rect.y - true_scroll[1]-364)/20

scroll = true_scroll.copy()
scroll[0] = int(scroll[0])
scroll[1] = int(scroll[1])
blob_group = pygame.sprite.Group()
tile_rects = []
for y, row in enumerate(game_map):
for x, tile in enumerate(row):
if tile != '0': 
tile_rects.append(pygame.Rect(x * TILE_SIZE, y * TILE_SIZE,TILE_SIZE,TILE_SIZE))
if tile == '4':
blob = Enemy(x*TILE_SIZE,y*TILE_SIZE+2)
blob_group.add(blob)
#Game loop
while True:
display.fill((146,244,255))
true_scroll[0] += (player_rect.x - true_scroll[0]-450)/20
true_scroll[1] += (player_rect.y - true_scroll[1]-364)/20

scroll = true_scroll.copy()
scroll[0] = int(scroll[0])
scroll[1] = int(scroll[1])
pygame.draw.rect(display,(7,80,75),pygame.Rect(0,400,900,600))
for background_object in background_objects:
obj_rect = pygame.Rect(background_object[1][0]-scroll[0]*background_object[0],background_object[1][1]-scroll[1]*background_object[0],background_object[1][2],background_object[1][3])
if background_objects[0] == 0.5:
pygame.draw.rect(display,(255,0,0),obj_rect)
else:
pygame.draw.rect(display,(9,91,85),obj_rect)    
for y, row in enumerate(game_map):
for x, tile in enumerate(row):
if tile == '1':
display.blit(dirt_image,(x*TILE_SIZE-scroll[0],y*TILE_SIZE-scroll[1]))
if tile == '2':
display.blit(grass_image,(x*TILE_SIZE-scroll[0],y*TILE_SIZE-scroll[1]))
if tile == '3':
display.blit(cobble_image,(x*TILE_SIZE-scroll[0],y*TILE_SIZE-scroll[1]))            

player_movement = [0,0]
if moving_right:
player_movement[0] += vel
if moving_left:
player_movement[0] -= vel
#________________________________________
if moving_down:
player_movement[1] += 7
#________________________________________       
player_movement[1] += player_y_momentum 
player_y_momentum += 0.2
if player_y_momentum > 3:   
player_y_momentum = 3

player_rect,collisions = move(player_rect,player_movement,tile_rects)           
if collisions['bottom']:
player_y_momentum = 0
air_timer = 0
else:
air_timer += 1

if collisions['top']:
player_y_momentum = 0
air_timer = 0
else:
air_timer += 0.1

for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_RIGHT:
moving_right = True
player_right = True
player_left = False
player_down = False
elif event.key == K_LEFT:
moving_left = True
player_left = True
player_right = False
player_down = False
#_________________________
elif event.key == K_DOWN:
moving_down = True
player_down = True
player_left = False
player_right = False


else:
player_right = False
player_left = False
player_down = False
walkCount = 0   
if event.key == K_UP:
if air_timer < 6:
player_y_momentum = -7.5
player_right = False
player_left = False
player_down = False
walkCount = 0
jump_sound.play()
jump_sound.set_volume(0.1)

if event.type == KEYUP:
if event.key == K_RIGHT:
moving_right = False

if event.key == K_LEFT:
moving_left = False 
if event.key == K_DOWN:
moving_down = False





redrawGameWindow()  

surf = pygame.transform.scale(display,Window_SIZE)
clock.tick(54)

我让我的敌人来回移动,但他们正在向我的球员移动。他们并没有停留在地图上。当我的相机和玩家一起移动时,敌人也朝着同一个方向移动,我希望他们呆在一个地方。

玩家的位置由scroll校正。你还需要修正敌人的位置。从redrawGameWindow功能中删除blob_group.draw(screen),但将敌人画成一个循环:

def redrawGameWindow():
global walkCount

if walkCount + 1 >=  27:
walkCount = 0
current_play_image = player_image
if moving_left:
current_play_image = walkLeft[walkCount // 3]
walkCount += 1    
elif moving_right:
current_play_image = walkRight[walkCount // 3]
walkCount += 1  
blob_group.update()

screen.blit(display,(0,0))
for enemy in blob_group:
screen.blit(enemy.image, (enemy.rect.x-scroll[0], enemy.rect.y-scroll[1]))    
screen.blit(current_play_image, (player_rect.x-scroll[0], player_rect.y-scroll[1]))
pygame.display.update() 

最新更新