找回密码
 中文实名注册
搜索
查看: 18|回复: 0

自定义地图--有bug--拖屏--马里奥

[复制链接]

29

主题

97

回帖

1132

积分

金牌会员

积分
1132
发表于 6 天前 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import pygame, sys, math, random
pygame.init()

W,H=900,520
screen=pygame.display.set_mode((W,H))
clock=pygame.time.Clock()

# --------------------------
# 自动生成素材(全部是画出来的)
# --------------------------

def make_brick():
    s=pygame.Surface((50,50),pygame.SRCALPHA)
    s.fill((160,110,60))
    pygame.draw.rect(s,(200,150,90),(0,0,50,50),5)
    return s

def make_coin():
    s=pygame.Surface((30,30),pygame.SRCALPHA)
    pygame.draw.circle(s,(255,230,0),(15,15),13)
    return s

def make_goomba():
    s=pygame.Surface((40,40),pygame.SRCALPHA)
    pygame.draw.ellipse(s,(150,75,0),(0,10,40,30))
    pygame.draw.circle(s,(0,0,0),(12,22),5)
    pygame.draw.circle(s,(0,0,0),(28,22),5)
    return s

def make_koopa():
    s=pygame.Surface((40,40),pygame.SRCALPHA)
    pygame.draw.rect(s,(0,200,0),(5,15,30,20))
    pygame.draw.circle(s,(0,150,0),(20,15),15)
    return s

def make_shell():
    s=pygame.Surface((40,30),pygame.SRCALPHA)
    pygame.draw.ellipse(s,(0,150,0),(0,0,40,30))
    return s

def make_player():
    s=pygame.Surface((40,40),pygame.SRCALPHA)
    pygame.draw.rect(s,(255,50,50),(10,5,20,30))
    pygame.draw.rect(s,(255,200,0),(15,0,10,10))
    return s

def bg(col):
    s=pygame.Surface((900,520))
    s.fill(col)
    return s


brick_img=make_brick()
coin_img=make_coin()
goomba_img=make_goomba()
koopa_img=make_koopa()
shell_img=make_shell()
player_img=make_player()

bg1=bg((150,200,255))
bg2=bg((120,170,240))
bg3=bg((90,140,220))


# --------------------------
# 地图(写在代码里)
# --------------------------

T=50
tilemap=[
"...............................................................",
"...............................................................",
".....................C....................C.....................",
"......................................#######..................",
".....................###........................................",
"......C.........................................................",
"..............###.....................M.........................",
"####.........................K.................................G",
"################################################################"
]

tiles=[]
coins=[]
goombas=[]
koopas=[]
goal=None

for y,row in enumerate(tilemap):
    for x,ch in enumerate(row):
        wx,wy=x*T,y*T
        if ch=="#": tiles.append(pygame.Rect(wx,wy,T,T))
        elif ch=="C": coins.append(pygame.Rect(wx+10,wy+10,30,30))
        elif ch=="M": goombas.append([pygame.Rect(wx,wy,40,40),1])
        elif ch=="K": koopas.append([pygame.Rect(wx,wy,40,40),"walk",1])
        elif ch=="G": goal=pygame.Rect(wx,wy,50,80)

# --------------------------
# 玩家
# --------------------------

player=pygame.Rect(100,200,40,40)
vx=0
vy=0
gravity=0.6
life=3
inv=0
camx=0

particles=[]

def add_particles(x,y):
    for i in range(10):
        particles.append([x,y,random.randint(3,6),random.uniform(-2,2)])


# --------------------------
# 主循环
# --------------------------

running=True
while running:
    for e in pygame.event.get():
        if e.type==pygame.QUIT:
            sys.exit()

    keys=pygame.key.get_pressed()
    if inv>0: inv-=1

    vx=0
    if keys[pygame.K_LEFT]: vx=-5
    if keys[pygame.K_RIGHT]: vx=5

    on_ground=False

    # 水平
    player.x+=vx
    for t in tiles:
        if player.colliderect(t):
            if vx>0: player.right=t.left
            else: player.left=t.right

    # 垂直
    vy+=gravity
    player.y+=vy
    for t in tiles:
        if player.colliderect(t):
            if vy>0:
                player.bottom=t.top
                vy=0
                on_ground=True
            else:
                player.top=t.bottom
                vy=0

    if keys[pygame.K_SPACE] and on_ground:
        vy=-12

    # Goomba
    for g in goombas[:]:
        r,spd=g
        r.x+=spd
        if any(r.colliderect(t) for t in tiles):
            r.x-=spd
            g[1]*=-1
        if player.colliderect(r):
            if vy>0:
                goombas.remove(g)
                vy=-8
                add_particles(r.centerx,r.centery)
            else:
                if inv==0:
                    life-=1
                    inv=50

    # Koopa
    for k in koopas[:]:
        r,state,spd=k
        if state=="walk":
            r.x+=spd
            if any(r.colliderect(t) for t in tiles):
                r.x-=spd
                k[2]*=-1
            if player.colliderect(r):
                if vy>0:
                    k[1]="shell"
                    vy=-8
                else:
                    if inv==0:
                        life-=1
                        inv=50
        else:
            r.x+=spd*6
            if any(r.colliderect(t) for t in tiles):
                r.x-=spd*6
                k[2]*=-1
            if player.colliderect(r):
                vy=-8

    # 金币
    for c in coins[:]:
        if player.colliderect(c):
            coins.remove(c)

    # 顶砖
    hit=[]
    for t in tiles:
        if player.colliderect(t) and vy<0:
            hit.append(t)
    for t in hit:
        tiles.remove(t)
        add_particles(t.centerx,t.centery)

    # 摄像机
    camx=player.centerx-W//2
    if camx<0: camx=0

    # 背景
    screen.blit(bg1,(-camx*0.2,0))
    screen.blit(bg2,(-camx*0.5,0))
    screen.blit(bg3,(-camx*0.8,0))

    # 地图
    for t in tiles:
        screen.blit(brick_img,(t.x-camx,t.y))
    for c in coins:
        screen.blit(coin_img,(c.x-camx,c.y))
    for r,spd in goombas:
        screen.blit(goomba_img,(r.x-camx,r.y))
    for r,state,spd in koopas:
        screen.blit(shell_img if state=="shell" else koopa_img,(r.x-camx,r.y))

    pygame.draw.rect(screen,(180,0,255),(goal.x-camx,goal.y,50,80))

    screen.blit(player_img,(player.x-camx,player.y))

    # 粒子
    for p in particles[:]:
        p[1]+=1
        p[0]+=p[3]
        p[2]-=0.2
        if p[2]<=0: particles.remove(p)
        else: pygame.draw.circle(screen,(255,255,255),(int(p[0]-camx),int(p[1])),3)

    # HP
    for i in range(life):
        pygame.draw.rect(screen,(255,0,0),(10+i*25,10,20,20))

    pygame.display.flip()
    clock.tick(60)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

快速回复 返回顶部 返回列表