今日、私は pygame で小さなプラットフォーマーを作ることに挑戦しました。正確な方法がわからなかったので、非常に気の利いた便利なチュートリアルから多くのコードを使用しました。
これまでのところ、マップは、画面の 32x32 部分を処理し、マップ テキスト部分の文字に基づいてブロック タイプを割り当てることによって作成されます。これまでのところ、プラットフォーム ブロック、境界ブロック、終了ブロックがあり、最終的にゲームを新しいレベルにロードさせたいと考えています。
私の質問は次のとおりです。「レベルを超えて」、ゲームに新しいマップをロードさせたい場合、どうすればそれを行うことができますか? グループからスプライトを削除しようとしましたが、うまくいきませんでした。私はしばらくの間努力してきましたが、少し落胆しています。
コードは次のとおりです。
import pygame
import math
from pygame import *
DISPLAY = (800, 640)
DEPTH = 32
FLAGS = 0
def main():
pygame.init()
screen = display.set_mode(DISPLAY, FLAGS, DEPTH)
display.set_caption("Square2")
timer = time.Clock()
up = down = left = right = False
bg = Surface((32,32))
bg.convert()
bg.fill(Color("#000000"))
entities = pygame.sprite.Group()
player = Player(32,32)
platforms = []
x = y = 0
level = [
"PPPPPPPPPPPPPPPPPPPPPPPPP",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P pp P",
"P P",
"P P",
"P pppppp P",
"P P",
"P pppppp P",
"P P",
"PPPPPPPPPPPPPPPPPPPPPPPPP",
]
#builds the level
for row in level:
for col in row:
if col =="p":
p = Platform(x, y)
platforms.append(p)
entities.add(p)
if col == "E":
e = ExitBlock(x, y)
platforms.append(e)
entities.add(e)
if col == "P":
P = Border(x, y)
platforms.append(P)
entities.add(P)
x += 32
y += 32
x = 0
entities.add(player)
while 1:
timer.tick(60)
for e in pygame.event.get():
if e.type == QUIT:
pygame.quit()
sys.exit()
#raise SystemExit, "ESCAPE"
if e.type == KEYDOWN and e.key == K_ESCAPE:
pygame.quit()
sys.exit()
#raise SystemExit, "ESCAPE"
if e.type == KEYDOWN and e.key == K_UP:
up = True
if e.type == KEYDOWN and e.key == K_DOWN:
down = True
if e.type == KEYDOWN and e.key == K_RIGHT:
right = True
if e.type == KEYDOWN and e.key == K_LEFT:
left = True
if e.type == KEYUP and e.key == K_UP:
up = False
if e.type == KEYUP and e.key == K_DOWN:
down = False
if e.type == KEYUP and e.key == K_RIGHT:
right = False
if e.type == KEYUP and e.key == K_LEFT:
left = False
#draw bg
for y in range(20):
for x in range(25):
screen.blit(bg, (x * 32, y * 32))
#update player, draw everything else
player.update(up, down, left, right, platforms)
entities.draw(screen)
pygame.display.flip()
class Entity(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
class Player(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.xvel = 0
self.yvel = 0
self.onGround = False
self.image = Surface((32, 32))
self.image.convert()
self.image.fill(Color("#FF0000"))
self.rect = Rect(x, y, 32, 32)
self.reset(150, 400)
def reset(self,x,y):
self.x = x
self.y = y
self.rect.center = (self.x, self.y)
def update(self, up, down, left, right, platforms):
if up:
#only jump if on the ground
if self.onGround:
self.yvel = -8
if down:
pass
if left:
self.xvel = -5
if right:
self.xvel = 5
if not self.onGround:
#only accelerate wit gravity if in the air
self.yvel +=0.3
#max falling sapeed
if self.yvel > 30:
self.yvel = 30
if not (left or right):
self.xvel = 0
# increment in x direction
self.rect.left+= self.xvel
# x-axis collisions
self.collide(self.xvel, 0 , platforms)
# increment in y direction
self.rect.top +=self.yvel
# assuming we're in the air
self.onGround = False;
# y-axis collisions
self.collide(0, self.yvel, platforms)
def collide(self, xvel, yvel, platforms):
for p in platforms:
if sprite.collide_rect(self, p):
if isinstance(p, ExitBlock):
event.post(event.Event(QUIT))
if xvel > 0:
self.rect.right = p.rect.left
if xvel < 0:
self.rect.left = p.rect.right
if yvel > 0:
self.rect.bottom = p.rect.top
self.onGround = True
self.yvel = 0
if yvel < 0:
self.rect.top = p.rect.bottom
self.yvel = 0
# Player.rect.top = Player.rect.top
class Platform(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.image = Surface((32, 32))
self.image.convert()
self.image.fill(Color("#DDDDDD"))
self.rect = Rect(x, y, 32, 32)
def update(self):
pass
class Border(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.image = Surface((32, 32))
self.image.convert()
self.image.fill((0,0,0))
self.rect = Rect(x, y, 32, 32)
def update(self):
pass
class ExitBlock(Platform):
def __init__(self, x, y):
Platform.__init__(self, x, y)
self.image.fill(Color("#0033FF"))
main()
助けてくれてありがとう!