بلاطات الحواف
جزء من قسم العوالم في رحلة Pygame على Coddy. الدرس 8 من 35.
تبدو المنصة مكتملة عندما تكون نهايتاها مستديرتين. تحتوي الحزمة على grass_left.png وgrass_right.png لنهايتي سطح عشبي.
الآن تنظر كل قطعة إلى ثلاثة جيران: الأعلى واليسار واليمين. يقع بعضهم خارج الخريطة عند الحواف. تجيب دالة مساعدة عن أي موضع، سواء أكان داخل الخريطة أم لا:
def solid(row, col):
if row < 0 or row >= len(LEVEL) or col < 0 or col >= len(LEVEL[0]):
return False
return LEVEL[row][col] == "#"يُعَدّ ما هو خارج الخريطة فارغًا. وباستخدام الدالة المساعدة، يأتي الاختيار على هيئة القاعدة:
if solid(row - 1, col):
image = dirt_img
elif not solid(row, col - 1) and solid(row, col + 1):
image = grass_left_img
elif solid(row, col - 1) and not solid(row, col + 1):
image = grass_right_img
else:
image = grass_img
tiles.append((image, pygame.Rect(x, y, TILE, TILE)))تحتفظ القطعة التي لها أرض على الجانبين، أو ليس لها أرض على أي من الجانبين، بالعشب العادي. عند الحافة اليسرى للخريطة، في العمود 0، تكون القطعة الموجودة إلى اليسار خارج الخريطة، لذا تُعَدّ فارغة، ويبدأ سطح الأرض هناك باستخدام grass_left_img.
التحدي
متوسطيحمّل البرنامج الابتدائي grass_left.png إلى grass_left_img، وgrass_right.png إلى grass_right_img.
- اكتب دالة
solid(row, col)تُرجعFalseخارج الخريطة، وLEVEL[row][col] == "#"داخلها. - لكل
#: استخدمdirt_imgعندما يكون المربع أعلاه صلبًا؛ وإلا فاستخدمgrass_left_imgعندما يكون المربع المجاور الأيمن وحده صلبًا؛ وإلا فاستخدمgrass_right_imgعندما يكون المربع المجاور الأيسر وحده صلبًا؛ وإلا فاستخدمgrass_img.
جرّب بنفسك
import pygame
TILE = 36
LEVEL = [
"###.............",
"###.............",
"..........C.....",
".........####...",
"..C.............",
".####......C....",
"..........###...",
"#....C.........#",
"###..##...###.##",
"######..########",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Tiles")
clock = pygame.time.Clock()
grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
grass_left_img = pygame.image.load("assets/images/grass_left.png").convert_alpha()
grass_right_img = pygame.image.load("assets/images/grass_right.png").convert_alpha()
dirt_img = pygame.image.load("assets/images/dirt.png").convert_alpha()
coin_img = pygame.image.load("assets/images/coin.png").convert_alpha()
tiles = []
for row, line in enumerate(LEVEL):
for col, char in enumerate(line):
x, y = col * TILE, row * TILE
if char == "#":
if row == 0 or LEVEL[row - 1][col] != "#":
image = grass_img
else:
image = dirt_img
tiles.append((image, pygame.Rect(x, y, TILE, TILE)))
elif char == "C":
tiles.append((coin_img, pygame.Rect(x, y, TILE, TILE)))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((140, 200, 240))
for image, rect in tiles:
screen.blit(image, rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس العوالم
تدرّب بنفسك: Playground لـ Pygame