用户:天上的流星_tianqiVirus查看:0 回复:1 评论:0 创建时间:2019-12-22T11:55:52
python作品秀
Rogce
最近我开发了一个游戏,类似于马里奥
不过比起马里奥,更像猫里奥
一个角色要到达终点,我在路上设置了许多陷阱
以下为游戏截图
以下为游戏代码
#made by TianqiVirus
#Rogce
import pygame
import random
from PIL import Image
from json import load
width = 720
height = 540
fps = 32
title = 'a Mario who wants to eat himself'
icon = 'assets/image/blocks/icon.ico'
pygame.init()
screen = pygame.display.set_mode([width,height])#screen 4:3
pygame.display.set_caption(title)
pygame.display.set_icon(pygame.image.load(icon))
font = pygame.font.SysFont("Lucida Console",24)
bigFont = pygame.font.SysFont("SimHei",60)
timer = pygame.time.Clock()
level = 1
gemCount = 0
differenceBetweenTwoPos = 0
keepGoing = True
gameStatus = 'running'
doingTime = 0
isTeleporting = False
playersImage = ["assets/image/player/playerBase.png","assets/image/player/playerDieFace.png","assets/image/player/playerHappyFace.png","assets/image/player/blood.png"]
blocksImage = {"block":[pygame.image.load("assets/image/blocks/block.png")],
"mystery":[pygame.image.load("assets/image/blocks/mystery.png")],
"glass":[pygame.image.load("assets/image/blocks/glass.png")],
"used":[pygame.image.load("assets/image/blocks/used.png")],
"air":[pygame.image.load("assets/image/blocks/air.png")],
"brick":[pygame.image.load("assets/image/blocks/brick.png")],
"pillar":[pygame.image.load("assets/image/blocks/pillar.png")],
"pillarTop":[pygame.image.load("assets/image/blocks/pillarTop.png")],
"castle":[pygame.image.load("assets/image/blocks/castle.png")]}
teleportImage = {"blue":pygame.image.load("assets/image/blocks/teleport1.png"),
"green":pygame.image.load("assets/image/blocks/teleport2.png"),
"orange":pygame.image.load("assets/image/blocks/teleport3.png"),
"red":pygame.image.load("assets/image/blocks/teleport4.png")}
bgms = ["assets/sound/bgm1.wav"]
soundEffects = {"restart":"assets/sound/restart.wav",
"win":"assets/sound/win.wav"}
lavas = pygame.image.load("assets/image/blocks/lavas.png")
gemImagePath = "assets/image/stuff/gem.png"
spikeImage = pygame.transform.喵oothscale(pygame.image.load("assets/image/stuff/spike.png"),(36,36))
background = pygame.transform.喵oothscale(pygame.image.load("assets/image/background/noteBook.jpg"),(width,height))
with open("assets/levels/1.json") as f:
data = load(f)
class player:
def __init__(self,x,y,images):
self.x = x
self.y = y
self.xChange = 0
self.yChange = 0
self.differenceBetweenTwoPosChange = 0
self.imagePaths = images
self.status = 'alive'
self.additive = 'nothing'
self.facing = 'right'
self.image = self.getImage()
self.rect = pygame.Rect(self.x,self.y,36,36)
self.gameRunningTime = 0
self.tempHitTime = 0
self.jumpable = False
def getImage(self):
if self.status == 'alive':
if self.facing == 'left':
imgT = Image.open(self.imagePaths[0])
imgT.paste(Image.open(self.imagePaths[2]),(3,8))
imgT.save('assets/image/player/tempLevel1.png')
elif self.facing == 'right':
imgT = Image.open(self.imagePaths[0])
imgT.paste(Image.open(self.imagePaths[2]),(9,8))
imgT.save('assets/image/player/tempLevel1.png')
elif self.status == "dead":
imgT = Image.open(self.imagePaths[0])
imgT.paste(Image.open(self.imagePaths[1]),(9,6))
imgT.save('assets/image/player/tempLevel1.png')
if self.additive == "nothing":
imgT = Image.open('assets/image/player/tempLevel1.png')
imgT.save('assets/image/player/tempLevel2.png')
return pygame.transform.scale(pygame.image.load("assets/image/player/tempLevel2.png"),(36,36))
def stop(self):
self.xChange = 0
self.differenceBetweenTwoPosChange = 0
def moving(self,key):
global differenceBetweenTwoPos
if key[0]:
self.facing = 'left'
if self.x>0:
self.xChange=-3
if key[2] and self.jumpable:
self.yChange = -10
if key[1]:
self.facing = 'right'
self.xChange=3
if self.x - differenceBetweenTwoPos>=width//2:
self.differenceBetweenTwoPosChange=3
def playerUpdate(self,scereen,pressKey):
if pressKey[0] or pressKey[1] or pressKey[2]:
self.moving(pressKey)
global differenceBetweenTwoPos,isTeleporting
if self.yChange>10:
self.yChange = 10
elif self.yChange<-10:
self.yChange = -10
self.image = self.getImage()
self.jumpable = False
if not isTeleporting:
self.yChange+=0.4
self.x+=self.xChange
self.y+=self.yChange
differenceBetweenTwoPos+=self.differenceBetweenTwoPosChange
if self.y>=612:
global gameStatus
gameStatus = "gameover"
pygame.mixer.music.stop()
self.rect = pygame.Rect(self.x,self.y,36,36)
if not isTeleporting:
if self.x- differenceBetweenTwoPos>width//2:
differenceBetweenTwoPos+=3
screen.blit(self.image,(self.x- differenceBetweenTwoPos,self.y))
class blocksClass:
def __init__(self,x,y,images):
self.x = x
self.y = y
self.showX = x
self.showY = y
self.images = images
self.crusherLastx = 0
self.size = 36
self.nowImage = pygame.transform.scale(self.images[0],(self.size,self.size))
self.rect = pygame.Rect(x,y,self.size,self.size)
self.gameRunningTime = 0
def update(self,crusher,screen,onBlockDoing,underBlockDoing,updatingAdd):
global differenceBetweenTwoPos,isTeleporting
self.showX = self.x - differenceBetweenTwoPos
self.showY = self.y
self.gameRunningTime +=1
if self.rect.colliderect(crusher.rect) and not isTeleporting:
if (crusher.x>self.x-30) and (crusher.x<self.x+self.size-6):
if crusher.y<self.y-24:
crusher.yChange = -0.4
crusher.y = self.y-35
crusher.jumpable = True
crusher.tempHitTime+=1
self.onBlockDoing()
elif crusher.y>self.y+self.size-24:
crusher.y = self.y+36
crusher.yChange=0.4
self.underBlockDoing()
else:
crusher.xChange = 0
if crusher.x<self.x-24:
crusher.x = self.x-36
elif crusher.x>self.x+self.size-12:
crusher.x = self.x+self.size
elif not(crusher.y>self.y+self.size or crusher.y<self.y):
crusher.xChange = 0
if crusher.x<self.x-24:
crusher.x = self.x-36
elif crusher.x>self.x+self.size-12:
crusher.x = self.x+self.size
self.updatingAdd()
self.crusherLastx = crusher.x
screen.blit(self.nowImage,(self.showX,self.showY))
class normalBlock(blocksClass):
def __init__(self,x,y,images,worldType):
super().__init__(x,y,images)
self.nowImage = pygame.transform.scale(self.images[worldType],(self.size,self.size))
self.rect = pygame.Rect(x,y,self.size,self.size)
def onBlockDoing(self):
pass
def underBlockDoing(self):
pass
def updatingAdd(self):
self.rect = pygame.Rect(self.x,self.y,self.size,self.size)
def blockUpdate(self,crusher,screen):
self.update(crusher,screen,self.onBlockDoing,self.underBlockDoing,self.updatingAdd)
class glassBlock(blocksClass):
def __init__(self,x,y,images,worldType):
super().__init__(x,y,images)
self.nowImage = pygame.transform.scale(self.images[worldType],(self.size,self.size))
self.rect = pygame.Rect(x,y,self.size,self.size)
self.fallVal = 20
self.startFall = False
self.isNotUsing = False
self.yChange = 0
def onBlockDoing(self):
self.startFall = True
def underBlockDoing(self):
pass
def updatingAdd(self):
self.rect = pygame.Rect(self.x,self.y,self.size,self.size)
if self.startFall:
self.fallVal-=1
if self.fallVal<=0:
self.yChange+=1
self.rect = pygame.Rect(-100,-100,1,1)
self.y+=self.yChange
if self.y>600 and self.startFall:
self.isNotUsing = True
if self.isNotUsing:
self.x = -100
self.y = -100
def blockUpdate(self,crusher,screen):
self.update(crusher,screen,self.onBlockDoing,self.underBlockDoing,self.updatingAdd)
class mysteryBlock(blocksClass):
def __init__(self,x,y,images,worldType):
super().__init__(x,y,images)
self.nowImage = pygame.transform.scale(self.images[worldType],(self.size,self.size))
self.rect = pygame.Rect(x,y,self.size,self.size)
self.opened = False
def onBlockDoing(self):
pass
def underBlockDoing(self):
global blocksImage
self.opened = True
self.nowImage = pygame.transform.scale(blocksImage["used"][0],(36,36))
def updatingAdd(self):
self.rect = pygame.Rect(self.x,self.y,self.size,self.size)
def blockUpdate(self,crusher,screen):
self.update(crusher,screen,self.onBlockDoing,self.underBlockDoing,self.updatingAdd)
class hidingBlock(blocksClass):
def __init__(self,x,y,images,worldType):
super().__init__(x,y,images)
self.nowImage = pygame.transform.scale(self.images[worldType],(self.size,self.size))
self.exaRect = pygame.Rect(x,y,self.size,self.size)
self.rect = pygame.Rect(10000,10000,self.size,self.size)#等到碰出时才具备普通方块的特性
self.crusher = None
self.crusherLasty = 0
def onBlockDoing(self):
pass
def underBlockDoing(self):
pass
def updatingAdd(self):
global blocksImage
if self.exaRect.colliderect(self.crusher.rect):
if self.crusherLasty > self.y+self.size and (self.crusher.x>=self.x-self.size//3*2) and (self.crusher.x<self.x+self.size-self.size//3):
self.nowImage = pygame.transform.scale(blocksImage["used"][0],(36,36))
self.rect = self.exaRect
def blockUpdate(self,crusher,screen):
self.crusher = crusher
self.update(crusher,screen,self.onBlockDoing,self.underBlockDoing,self.updatingAdd)
self.crusherLasty = crusher.y
class airBlock(blocksClass):
def __init__(self,x,y,images,worldType):
super().__init__(x,y,images)
self.nowImage = pygame.transform.scale(self.images[worldType],(self.size,self.size))
def blockUpdate(self,crusher,screen):
global differenceBetweenTwoPos
screen.blit(self.nowImage,(self.x - differenceBetweenTwoPos,self.y))
class sandBlock(blocksClass):
def __init__(self,x,y,images,worldType):
super().__init__(x,y,images)
self.nowImage = pygame.transform.scale(self.images[worldType],(self.size,self.size))
self.rect = pygame.Rect(x,y,self.size,self.size)
self.brakeVal = 5
self.startBrake = False
def onBlockDoing(self):
self.startBrake = True
def underBlockDoing(self):
self.startBrake = True
def updatingAdd(self):
self.rect = pygame.Rect(self.x,self.y,self.size,self.size)
if self.startBrake:
self.brakeVal-=1
if self.brakeVal<=0:
self.x = -100
self.y = -100
def blockUpdate(self,crusher,screen):
self.update(crusher,screen,self.onBlockDoing,self.underBlockDoing,self.updatingAdd)
class gemClass:
def __init__(self,x,y):
global differenceBetweenTwoPos,gemImagePath
self.x = x
self.y = y
self.showX = self.x - differenceBetweenTwoPos
self.size = 24
self.image = pygame.transform.scale(pygame.image.load(gemImagePath),(24,24))
self.rect = pygame.Rect(self.x,self.y,self.size,self.size)
def gemUpdate(self,screen,crusher):
global differenceBetweenTwoPos,isTeleporting
self.showX = self.x - differenceBetweenTwoPos
self.rect = pygame.Rect(self.x,self.y,self.size,self.size)
if self.rect.colliderect(crusher.rect) and not isTeleporting:
global gemCount
gemCount+=1
self.x = 10000
self.y = 10000
screen.blit(self.image,(self.showX,self.y))
class spikeClass:
def __init__(self,x,y):
global differenceBetweenTwoPos,spikeImage
self.x = x
self.y = y
self.showX = self.x - differenceBetweenTwoPos
self.w = 24
self.h = 20
self.Timage = spikeImage
self.Nimage = blocksImage["air"][0]
self.rect = pygame.Rect(self.x+6,self.y+16,self.w,self.h)
def spikeUpdate(self,screen,crusher):
global differenceBetweenTwoPos,isTeleporting
self.showX = self.x - differenceBetweenTwoPos
self.rect = pygame.Rect(self.x+6,self.y+16,self.w,self.h)
if self.rect.colliderect(crusher.rect) and not isTeleporting:
self.Nimage = self.Timage
global gameStatus
gameStatus = 'gameover'
crusher.status = 'dead'
screen.blit(self.Nimage,(self.showX,self.y))
class teleportClass:
def __init__(self,x,y,tox,toy,image):
self.x = x
self.y = y
self.tox = tox
self.toy = toy
self.size = 24
self.isTeleporting = False
self.Nimage = pygame.transform.scale(image,(36,36))
self.rect = pygame.Rect(self.x+6,self.y+6,self.size,self.size)
def teleportUpdate(self,screen,crusher):
global differenceBetweenTwoPos,isTeleporting
self.rect = pygame.Rect(self.x+6,self.y+6,self.size,self.size)
if self.rect.colliderect(crusher.rect) and not isTeleporting:
isTeleporting = True
self.isTeleporting = True
if self.isTeleporting:
if crusher.x//3<self.tox//3:
crusher.x+=3
elif crusher.x//3>self.tox//3:
crusher.x-=3
if crusher.y//3<self.toy//3-1:
crusher.y+=3
elif crusher.y//3>self.toy//3-1:
crusher.y-=3
if differenceBetweenTwoPos//2 < (self.tox-width//2)//2:
differenceBetweenTwoPos+=2
elif differenceBetweenTwoPos//2 > (self.tox-width//2)//2:
differenceBetweenTwoPos-=2
if crusher.x//3 == self.tox//3 and crusher.y//3 == self.toy//3-1:
isTeleporting = False
self.isTeleporting = False
screen.blit(self.Nimage,(self.x - differenceBetweenTwoPos,self.y))
Mario = player(data[level-1][0][0],data[level-1][0][1],playersImage)
blocks = []
gems = []
spikes = []
winPoint = []
teleportDoors = []
def getLevel():
global Mario,blocks,differenceBetweenTwoPos,gems,spikes,winPoint,marioPressKeyInfo,level,teleportDoors,isTeleporting
blocks = []
gems = []
spikes = []
winPoint = []
teleportDoors = []
differenceBetweenTwoPos = 0
isTeleporting = False
Mario = player(data[level-1][0][0],data[level-1][0][1],playersImage)
winPoint = data[level-1][-1]
marioPressKeyInfo = [False,False,False]
Mario.status = 'alive'
for i in data[level-1][1]:
if i[2] == "block":
blocks.append(normalBlock(i[0],i[1],blocksImage[i[3]],0))
elif i[2] == "mystery":
blocks.append(mysteryBlock(i[0],i[1],blocksImage[i[3]],0))
elif i[2] == "glass":
blocks.append(glassBlock(i[0],i[1],blocksImage[i[3]],0))
elif i[2] == "hiding":
blocks.append(hidingBlock(i[0],i[1],blocksImage[i[3]],0))
elif i[2] == "air":
blocks.append(airBlock(i[0],i[1],blocksImage[i[3]],0))
elif i[2] == "sand":
blocks.append(sandBlock(i[0],i[1],blocksImage[i[3]],0))
for j in data[level-1][2]:
gems.append(gemClass(j[0],j[1]))
for k in data[level-1][3]:
spikes.append(spikeClass(k[0],k[1]))
for l in data[level-1][4]:
teleportDoors.append(teleportClass(l[0],l[1],l[2],l[3],teleportImage[l[4]]))
getLevel()
marioPressKeyInfo = [False,False,False]
gameOverTimerTemp = 120
winTimerTemp = 120
while keepGoing:
pygame.mixer.music.set_volume(0.2)
doingTime+=1
if gameStatus == 'running':
if pygame.mixer.music.get_busy()==False:
pygame.mixer.music.load(bgms[0])
pygame.mixer.music.play()
for event in pygame.event.get():
if event.type == pygame.QUIT:
keepGoing = False
if event.type == pygame.KEYDOWN:
if event.key == 276:
marioPressKeyInfo[0] = True
if event.key == 275:
marioPressKeyInfo[1] = True
if event.key == 273:
marioPressKeyInfo[2] = True
if event.type == pygame.KEYUP:
if event.key == 276:
marioPressKeyInfo[0] = False
if event.key == 275:
marioPressKeyInfo[1] = False
if event.key == 273:
marioPressKeyInfo[2] = False
Mario.stop()
if event.key == pygame.K_q:
gameStatus = 'gameover'
Mario.status = "dead"
if isTeleporting:
marioPressKeyInfo = [False,False,False]
if Mario.x>winPoint[0]:
gameStatus = 'win'
screen.blit(background,(0,0))
for i in blocks:
if i.x>=-108+differenceBetweenTwoPos and i.x<width+108+differenceBetweenTwoPos:
i.blockUpdate(Mario,screen)
for j in gems:
if j.x>=-108+differenceBetweenTwoPos and j.x<width+108+differenceBetweenTwoPos:
j.gemUpdate(screen,Mario)
for k in spikes:
if k.x>=-108+differenceBetweenTwoPos and k.x<width+108+differenceBetweenTwoPos:
k.spikeUpdate(screen,Mario)
for l in teleportDoors:
if l.x>=-108+differenceBetweenTwoPos and l.x<width+108+differenceBetweenTwoPos:
l.teleportUpdate(screen,Mario)
screen.blit(pygame.transform.scale(blocksImage["castle"][0],(108,108)),(winPoint[0]-36-differenceBetweenTwoPos,winPoint[1]-72))
Mario.playerUpdate(screen,marioPressKeyInfo)
elif gameStatus == 'gameover' :
if gameOverTimerTemp == 120:
pygame.mixer.music.stop()
elif gameOverTimerTemp == 96:
pygame.mixer.music.stop()
pygame.mixer.music.load(soundEffects["restart"])
pygame.mixer.music.play()
for event in pygame.event.get():
if event.type == pygame.QUIT:
keepGoing = False
gameOverTimerTemp-=1
if gameOverTimerTemp <= 0:
getLevel()
gameOverTimerTemp = 120
gameStatus ='running'
if gameOverTimerTemp<=96:
screen.fill((0,0,0))
mainWord = font.render("The new turn is going to begin",True,(255,255,255))
screen.blit(mainWord,(width//2-mainWord.get_rect().width//2,200))
elif gameStatus == 'win' :
if winTimerTemp == 120:
pygame.mixer.music.stop()
elif winTimerTemp == 96:
pygame.mixer.music.stop()
pygame.mixer.music.load(soundEffects["win"])
pygame.mixer.music.play()
for event in pygame.event.get():
if event.type == pygame.QUIT:
keepGoing = False
winTimerTemp-=1
if winTimerTemp<=0:
level+=1
getLevel()
winTimerTemp = 120
gameStatus ='running'
if winTimerTemp<=96:
screen.fill((0,0,0))
mainWord = font.render("The new turn is going to begin",True,(255,255,255))
screen.blit(mainWord,(width//2-mainWord.get_rect().width//2,200))
pygame.display.update()
timer.tick(fps)
pygame.quit()
共500多行
这里,我用了继承的方式生成方块
用传统的json文件保存关卡文件
以下为关卡文件
[
[
[0,396],
[[0,504,"block","block"],[36,504,"block","block"],[72,504,"block","block"],[108,504,"block","block"],[144,504,"block","block"],[180,504,"block","block"],
[216,504,"block","block"],[252,504,"block","block"],[288,504,"block","block"],[72,396,"block","block"],[144,396,"block","block"],[216,396,"block","block"],
[504,504,"block","block"],[540,468,"block","block"],[540,432,"block","block"],[540,396,"block","block"],[540,360,"block","block"],
[8喵,360,"block","block"],[972,504,"block","block"],[972,324,"block","block"],[1116,504,"block","block"],[1116,324,"block","block"],[1152,468,"block","block"],
[612,504,"block","block"],[喵8,504,"block","block"],[684,324,"block","block"],[756,504,"block","block"],[1188,504,"block","block"],[1440,468,"block","block"],
[1332,324,"block","block"],[1368,324,"block","block"],[1512,504,"block","block"],[1548,504,"block","block"],[1584,504,"block","block"],[1620,504,"block","block"],
[1656,504,"block","block"],[1656,360,"block","used"],[1656,324,"block","used"],[1656,288,"block","used"],[1692,504,"block","block"],[1728,504,"block","block"],
[17喵,504,"block","block"],[17喵,468,"block","brick"],[1800,504,"block","block"],[1836,504,"block","block"],[1872,504,"block","block"],[1908,504,"block","block"],
[1944,504,"block","block"],[1980,504,"block","block"],
[108,396,"mystery","mystery"],[180,396,"mystery","mystery"],[144,288,"mystery","mystery"],[1656,432,"mystery","mystery"],
[324,288,"glass","glass"],[360,288,"glass","glass"],[396,288,"glass","glass"],[432,288,"glass","glass"],[468,288,"glass","glass"],[612,360,"glass","glass"],
[720,324,"glass","glass"],[828,504,"glass","glass"],[8喵,504,"glass","glass"],[936,468,"glass","glass"],[1188,432,"glass","glass"],[1296,504,"glass","glass"],
[1332,504,"glass","glass"],[1368,504,"glass","glass"],[1404,504,"glass","glass"],[396,504,"glass","glass"],[1584,468,"glass","glass"],
[108,432,"hiding","air"],[324,396,"hiding","air"],[900,324,"hiding","air"],[1224,432,"hiding","air"],[1188,324,"hiding","air"],[1332,432,"hiding","air"],
[1368,432,"hiding","air"],[1404,432,"hiding","air"],[1620,360,"hiding","air"],
[17喵,432,"air","pillar"],[17喵,396,"air","pillar"],[17喵,360,"air","pillar"],[17喵,324,"air","pillar"],[17喵,288,"air","pillarTop"]],
[[402,480],[654,480],[762,480],[942,444],[1194,480],[1410,480],[1518,444],[1662,480]],
[[612,468],[1512,468],[1548,468],[1584,468],[1692,468]],
[[-100,-100,-100,-100,"blue"]],
[[288,432,"Hatten","left"],[1656,396,"normal","left"]],
[1908,468]
],
[
[0,396],
[[0,504,"block","block"],[36,504,"block","block"],[72,504,"block","block"],[108,504,"block","block"],[144,504,"block","block"],[180,504,"block","block"],
[216,504,"block","block"],[432,504,"block","block"],[468,504,"block","block"],[504,504,"block","block"],[684,468,"block","block"],[720,396,"block","block"],
[756,324,"block","block"],[792,396,"block","block"],[8喵,468,"block","block"],[8喵,288,"block","block"],[1008,288,"block","block"],[1368,504,"block","block"],
[1404,504,"block","block"],[1512,504,"block","block"],[1548,504,"block","block"],[1584,504,"block","mystery"],[1620,504,"block","block"],[1656,504,"block","mystery"],
[1692,504,"block","block"],[1728,504,"block","mystery"],[17喵,504,"block","block"],[1980,504,"block","block"],[2016,504,"block","block"],[2052,504,"block","block"],
[2088,504,"block","block"],[2124,504,"block","block"],[2124,468,"block","brick"],[2160,504,"block","block"],[2196,504,"block","block"],[2232,504,"block","block"],
[2268,504,"block","block"],[2304,504,"block","block"],[2340,504,"block","block"],
[180,432,"glass","glass"],[216,432,"glass","glass"],[540,396,"glass","glass"],[612,432,"glass","glass"],[612,288,"glass","glass"],[720,288,"glass","glass"],
[720,468,"glass","glass"],[756,468,"glass","glass"],[792,468,"glass","glass"],[828,432,"glass","glass"],[900,468,"glass","glass"],[936,396,"glass","glass"],
[972,468,"glass","glass"],[1008,468,"glass","block"],[1620,360,"glass","glass"],[1728,324,"glass","glass"],
[576,288,"hiding","air"],[756,396,"hiding","air"],[900,288,"hiding","air"],[972,396,"hiding","air"],[1512,396,"hiding","air"],
[288,504,"sand","brick"],[324,504,"sand","brick"],[360,504,"sand","brick"],
[2124,432,"air","pillar"],[2124,396,"air","pillar"],[2124,360,"air","pillar"],[2124,324,"air","pillar"],[2124,288,"air","pillarTop"]],
[[294,480],[78,480],[690,228],[762,444],[798,372]],
[[-100,-100]],
[[216,468,469,468,"blue"],[432,468,179,468,"blue"],[720,360,900,252,"blue"],[8喵,252,756,355,"blue"],[756,288,900,396,"green"],[8喵,432,792,288,"green"],[900,144,1404,468,"orange"],
[1368,468,900,180,"orange"],[1584,468,1200,200,"red"],[1200,144,-100,500,"red"],[1656,468,1872,360,"red"],[1872,324,1872,600,"red"],[1728,468,2016,468,"red"],[1980,468,17喵,468,"red"]],
[[-100,600,"normal","left"]],
[2268,468]
],
[
[0,396],
[[36,468,"block","greenLand",72],[108,468,"block","greenLand",72],[360,468,"block","greenLand",72],[432,468,"block","block"],[468,468,"block","half"],[504,468,"block","half"],
[540,468,"block","half"],[576,468,"block","block"],[216,324,"block","block"],
[0,468,"glass","glass"],
[180,468,"sand","block"],[216,468,"sand","half"],[252,468,"sand","half"],[288,468,"sand","half"],[324,468,"sand","block"],
[108,360,"hiding","air"],[144,252,"hiding","air"]],
[[258,444],[186,228]],
[[216,324]],
[[-100,-100,-100,-100,"blue"]],
[[-100,600,"normal","left"]],
[1908,468]
],
[
[0,396],
[[0,468,"block","greenLand",72],
[72,504,"block","block"],[108,504,"block","block"],[144,504,"block","block"],[180,504,"block","block"],
[216,504,"block","block"],[252,504,"block","block"],[288,504,"block","block"],[324,504,"block","block"],[360,504,"block","block"],[396,504,"block","block"],
[432,504,"block","block"],[468,504,"block","block"],[504,504,"block","block"],[504,540,"block","block"],[504,576,"block","block"],
[108,396,"mystery","mystery"]],
[[402,480],[654,480],[762,480],[942,444],[1194,480],[1410,480]],
[[612,468]],
[[-100,-100,-100,-100,"blue"]],
[[-100,600,"normal","left"]],
[1908,468]
]
]
本帖内所有代码,思想仅供参考,请勿用于盈利用途
id:小鹿工作室_天上的流星
如果喜欢点个赞再走呗