用户:
有趣的力士甲虫D8IF查看:0 回复:7 评论:0 创建时间:2021-07-14T01:16:49
【作品展示】

【作品介绍】
本作品是一个跑酷地图!具体玩法已经在游戏里给出
难度非常的大
建议耐心尝试
另外有些细节没有加
不过不要在意~
灵感就来源于那些跑酷游戏!
思路也想了半天
希望你们可以好好游玩一下!
【作品源代码】
from arcade import *
from player import *
from Map import *
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
SCREEN_TITLE = '火柴人跑酷'
class MyGame(arcade.Window):
def __init__(self,width,height,title):
super().__init__(width,height,title)
# 提前设置
self.time = 0
self.time_2 = 0
self.spawnpoint_x, self.spawnpoint_y = 100,100
self.setup()
def setup(self):
Image.open('stickman.png').resize((50,75)).save('stickman.png')
# 图片设置
self.forest_image = Sprite('forest.png')
self.forest_image.center_x,self.forest_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
self.game_over_image = Sprite('game_over.png')
self.game_over_image.center_x,self.game_over_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
self.game_win_image = Sprite('game_win.png')
self.game_win_image.center_x,self.game_win_image.center_y = SCREEN_WIDTH/2,SCREEN_HEIGHT/2
# 游戏关卡设置(当前共一关)
self.level = 1
# 调用其他文件
self.player = Player()
self.player.player.center_x = self.spawnpoint_x
self.player.player.center_y = self.spawnpoint_y
self.maps = Map()
self.lists = self.maps.set_level(open(r'C:\Users\zhm\Desktop\孟令涛\火柴人跑酷\levels\level.txt'))
self.pictures = self.lists[0]
self.move_pictures = self.lists[1]
self.images = self.lists[2]
self.traps = self.lists[3]
self.checkpoints = self.lists[4]
self.houses = self.lists[5]
self.no_images = self.lists[6]
self.maps.set_level(open(r'C:\Users\zhm\Desktop\孟令涛\火柴人跑酷\levels\level.txt'))
self.game_over = False
self.game_win = False
# 声音
self.game_over_sound = load_sound('game_over_sound.wav')
self.game_sound = load_sound('day.wav')
self.game_sound_2 = load_sound('game.wav')
def on_draw(self):
start_render()
# 背景图片绘画
if self.level > 0:
self.forest_image.draw()
# 角色绘画
self.player.player.draw()
self.traps.draw()
self.checkpoints.draw()
self.houses.draw()
for image in self.images:
if image.center_x >= -50 and image.center_x <= SCREEN_WIDTH+50 \
and image.center_y >= -50 and image.center_y <= SCREEN_HEIGHT+50:
self.images.draw()
if self.game_over or self.game_win:
self.game_over_image.draw()
draw_text('按 SPACE 键 重新开始',SCREEN_WIDTH/2-130,SCREEN_HEIGHT-200,color.RED,font_size=20,font_name=('simhei','PingFang'))
# 绘制提示
draw_text('游戏规则:按上左右键来操控人物移动,上为跳跃,星星是存档点,玩家只有',
0,SCREEN_HEIGHT-25,color.RED,font_size=20,font_name=('simhei','PingFang'))
draw_text('一条命,碰到地刺或掉出地图都算喵,部分方块会移动,房子是终点,重生',
0,SCREEN_HEIGHT-50,color.RED,font_size=20,font_name=('simhei','PingFang'))
draw_text('时会卡一会,请耐心等待,并且,游戏可能会有些卡顿,卡在墙上为正常,跳',
0, SCREEN_HEIGHT-75, color.RED, font_size=20, font_name=('simhei', 'PingFang'))
draw_text('下来即可,第一个房间为练习(游戏难度较高,请耐心游玩,有一点随机性,',
0, SCREEN_HEIGHT-100, color.RED, font_size=20, font_name=('simhei', 'PingFang'))
draw_text('且有专门卡人的东西)。',
0,SCREEN_HEIGHT-125,color.RED,font_size=20,font_name=('simhei','PingFang'))
def on_update(self,delta_time):
if not self.game_over and not self.game_over:
# 播放音乐
if int(self.time) % 48 == 0:
play_sound(self.game_sound)
self.time = 1
self.time += delta_time
if int(self.time_2) % 73 == 0:
play_sound(self.game_sound_2)
self.time_2 = 1
self.time_2 += delta_time
# 检测角色喵亡
if self.player.rell_y < -100 or self.player.died:
self.game_over = True
play_sound(self.game_over_sound)
# 角色处理逻辑
self.player.player.update()
self.player.my_update(self.images,self.traps,self.checkpoints)
self.images.update()
self.traps.update()
self.checkpoints.update()
self.houses.draw()
# 胜利判断
win = check_for_collision_with_list(self.player.player,self.houses)
if win:
self.game_win = True
# 屏幕移动
if self.player.player.right >= SCREEN_WIDTH-101:
while self.player.player.left >= SCREEN_WIDTH-105:
for image in self.images:
image.center_x -= 5
for move_picture in self.move_pictures:
# 移动起始点改变
if move_picture.move == 'left' or move_picture.move == 'right':
move_picture.move_right -= 5
move_picture.move_left -= 5
for no_image in self.no_images:
no_image.center_x -= 5
self.player.player.center_x -= 5
if self.player.player.left <= 101:
while self.player.player.right <= 105:
for image in self.images:
image.center_x += 5
for move_picture in self.move_pictures:
# 移动起始点改变
if move_picture.move == 'left' or move_picture.move == 'right':
move_picture.move_right += 5
move_picture.move_left += 5
for no_image in self.no_images:
no_image.center_x += 5
self.player.player.center_x += 5
if self.player.player.top >= SCREEN_HEIGHT-101:
while self.player.player.bottom >= SCREEN_HEIGHT-105:
for image in self.images:
image.center_y -= 5
for move_picture in self.move_pictures:
# 移动起始点改变
if move_picture.move == 'top' or move_picture.move == 'bottom':
move_picture.move_top -= 5
move_picture.move_bottom -= 5
for no_image in self.no_images:
no_image.center_y -= 5
self.player.player.center_y -= 5
if self.player.player.bottom <= 101:
while self.player.player.top <= 105:
for image in self.images:
image.center_y += 5
for move_picture in self.move_pictures:
# 移动起始点改变
if move_picture.move == 'top' or move_picture.move == 'bottom':
move_picture.move_top += 5
move_picture.move_bottom += 5
for no_image in self.no_images:
no_image.center_y += 5
self.player.player.center_y += 5
# 移动地砖移动逻辑
for move_picture in self.move_pictures:
# 上下移动地砖
if move_picture.move == 'up':
if move_picture.top < move_picture.move_top:
move_picture.center_y += 5
else:
move_picture.move = 'bottom'
if move_picture.move == 'bottom':
if move_picture.bottom > move_picture.move_bottom:
move_picture.center_y -= 5
else:
move_picture.move = 'up'
# 左右移动地砖
if move_picture.move == 'left':
if move_picture.left > move_picture.move_left:
move_picture.center_x -= 5
else:
move_picture.move = 'right'
if move_picture.move == 'right':
if move_picture.right < move_picture.move_right:
move_picture.center_x += 5
else:
move_picture.move = 'left'
# 存档点的设置
hit_list_checkpoints = check_for_collision_with_list(self.player.player,self.checkpoints)
if hit_list_checkpoints:
for hit in hit_list_checkpoints:
self.spawnpoint_x = hit.rell_x
self.spawnpoint_y = hit.rell_y
hit.喵()
def on_key_press(self, symbol, modifiers):
if not self.game_over and not self.game_win:
self.player.move(symbol)
if symbol == key.K:
image = get_image(0,0,SCREEN_WIDTH,SCREEN_HEIGHT)
image.save('image.png')
else:
if symbol == key.SPACE:
# 清除所有角色
for image in self.images:
image.喵()
self.player.player.喵()
self.setup()
def on_key_release(self,symbol,modifiers):
if not self.game_over:
self.player.unmove(symbol)
if __name__ == '__main__':
game = MyGame(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_TITLE)
run()
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn
有趣的力士甲虫D8IF另一个PY文件player
from arcade import *
class Player(Sprite):
def __init__(self):
super().__init__()
self.player = Sprite('cool_cool.png')
# 关于坐标
self.rell_y = 100
# 关于移动
self.left_move = False
self.right_move = False
self.max_speed = 8
self.min_speed = 5
self.add_speed = 0.1
self.left_speed = 5
self.right_speed = 5
# 关于跳跃
self.jump_time = 0
self.drop = False
self.jump = 0
self.up = False
# 碰撞箱
self.check_left = Sprite('check_player_left.png')
self.check_right = Sprite('check_player_right.png')
self.check_top = Sprite('check_player_top.png')
self.check_bottom = Sprite('check_player_bottom.png')
# 关于角色
self.died = False
def move(self, symbol):
if symbol == key.LEFT:
self.left_move = True
self.left_speed = self.min_speed
if symbol == key.RIGHT:
self.right_move = True
self.right_speed = self.min_speed
if symbol == key.UP:
self.up = True
def unmove(self,symbol):
if symbol == key.LEFT:
self.left_move = False
if symbol == key.RIGHT:
self.right_move = False
if symbol == key.UP:
self.up = False
def my_update(self,images,traps,checkpoints):
# 与陷阱的碰撞
hit_list_traps = check_for_collision_with_list(self.player,traps)
if hit_list_traps:
for hit in hit_list_traps:
self.died = True
# 设置碰撞箱的位置
self.check_left.right = self.player.right+8.1
self.check_left.top = self.player.top+10
self.check_right.left = self.player.left-8.1
self.check_right.top = self.player.top+10
self.check_top.bottom = self.player.top
self.check_top.left = self.player.left
self.check_bottom.top = self.player.bottom-1
self.check_bottom.left = self.player.left
hit_list_left = check_for_collision_with_list(self.check_left,images)
hit_list_right = check_for_collision_with_list(self.check_right,images)
hit_list_top = check_for_collision_with_list(self.check_top,images)
hit_list_bottom = check_for_collision_with_list(self.check_bottom,images)
# 左右移动
if self.left_move and not hit_list_right:
self.player.center_x -= self.left_speed
if self.left_speed <= self.max_speed:
self.left_speed += self.add_speed
if self.right_move and not hit_list_left:
self.player.center_x += self.right_speed
if self.right_speed <= self.max_speed:
self.right_speed += self.add_speed
if hit_list_bottom and not hit_list_top:
for hit in hit_list_bottom:
self.temp_y = self.player.center_y
self.player.bottom = hit.top + 2
self.rell_y += self.player.center_y - self.temp_y
# 降落
if self.jump > 20 and self.up:
self.center_y += self.jump / 15
self.rell_y += self.jump / 15
self.jump -= 1
if self.drop and not hit_list_bottom:
self.player.center_y -= self.jump_time*3
self.rell_y -= self.jump_time*3
self.jump_time += 0.3
# 跳跃
else:
self.drop = False
self.jump_time = 8
if self.up and self.jump < 20 and not hit_list_top:
self.jump_time -= 0.1
self.player.center_y += self.jump_time*1.5
self.rell_y += self.jump_time*1.5
self.jump += 1
else:
self.jump_time = 0
self.jump = 0
self.drop = True
点赞1
评论
有趣的力士甲虫D8IF另一个PY文件Map
from arcade import *
class Map(Sprite):
def __init__(self):
super().__init__()
self.pictures = SpriteList()
self.images = SpriteList()
self.move_pictures = SpriteList()
self.traps = SpriteList()
self.checkpoints = SpriteList()
self.houses = SpriteList()
self.no_images = SpriteList()
def set_level(self,txt):
txt = txt.read()
txt = txt.喵().split('\n')
x = 0
y = 0
for t in txt:
y += 50
for t in txt:
for i in t:
if i == '1':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x,y-50
self.pictures.append(grass)
self.images.append(grass)
if i == '2':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x,y-50
grass.move_top,grass.move_bottom = grass.top+150,grass.bottom-150
grass.move = 'up'
self.move_pictures.append(grass)
self.images.append(grass)
if i == '3':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x,y-50
grass.move_top,grass.move_bottom = grass.top+100,grass.bottom-100
grass.move = 'up'
self.move_pictures.append(grass)
self.images.append(grass)
if i == '4':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x,y-50
grass.move_top,grass.move_bottom = grass.top+200,grass.bottom-200
grass.move = 'up'
self.move_pictures.append(grass)
self.images.append(grass)
if i == '5':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x,y-50
grass.move_top,grass.move_bottom = grass.top+50,grass.bottom-50
grass.move = 'up'
self.move_pictures.append(grass)
self.images.append(grass)
if i == '6':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x,y-50
grass.move_top,grass.move_bottom = grass.top+250,grass.bottom-250
grass.move = 'up'
self.move_pictures.append(grass)
self.images.append(grass)
if i == '7':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x, y-50
grass.move_right,grass.move_left = grass.right+50,grass.left-50
grass.move = 'left'
self.move_pictures.append(grass)
self.images.append(grass)
if i == '8':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x, y-50
grass.move_right,grass.move_left = grass.right+100,grass.left-100
grass.move = 'left'
self.move_pictures.append(grass)
self.images.append(grass)
if i == '9':
grass = Sprite('grass.png')
grass.center_x, grass.center_y = x, y-50
grass.move_right, grass.move_left = grass.right+150, grass.left-150
grass.move = 'left'
self.move_pictures.append(grass)
self.images.append(grass)
if i == 'a':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x, y-50
grass.move_right,grass.move_left = grass.right+200,grass.left-200
grass.move = 'left'
self.move_pictures.append(grass)
self.images.append(grass)
if i == 'b':
grass = Sprite('grass.png')
grass.center_x,grass.center_y = x, y-50
grass.move_right,grass.move_left = grass.right+250,grass.left-250
grass.move = 'left'
self.move_pictures.append(grass)
self.images.append(grass)
if i == 'c':
thorn = Sprite('thorn_bottom.png')
thorn.center_x,thorn.center_y = x,y-50
thorn.axis = 'bottom'
self.traps.append(thorn)
self.no_images.append(thorn)
if i == 'd':
thorn = Sprite('thorn_left.png')
thorn.center_x,thorn.center_y = x,y-50
thorn.axis = 'left'
self.traps.append(thorn)
self.no_images.append(thorn)
if i == 'e':
thorn = Sprite('thorn_top.png')
thorn.center_x,thorn.center_y = x,y-50
thorn.axis = 'top'
self.traps.append(thorn)
self.no_images.append(thorn)
if i == 'f':
thorn = Sprite('thorn_right.png')
thorn.center_x,thorn.center_y = x,y-50
thorn.axis = 'right'
self.traps.append(thorn)
self.no_images.append(thorn)
if i == 'g':
checkpoint = Sprite('checkpoint.png')
checkpoint.center_x,checkpoint.center_y = x,y-50
checkpoint.rell_x,checkpoint.rell_y = x,y-50
self.checkpoints.append(checkpoint)
self.no_images.append(checkpoint)
if i == 'h':
house = Sprite('house.png')
house.center_x,house.center_y = x,y-50
self.houses.append(house)
self.no_images.append(house)
x += 50
x = 0
y -= 50
return (self.pictures,self.move_pictures,self.images,self.traps,self.checkpoints,self.houses,self.no_images)
点赞0
评论
有趣的力士甲虫D8IF关卡地图txt文本
00000000000000000000喵喵喵喵喵喵喵111111111
00000000000000000000100000000000000000000010000000000000000000001000000000001d00000000100000001d0000000001
00000000000000000000100000000000000000000010000000a00000000000001000000000001d00000000100000001d0000000001
000000000000000000001000000000000000110100100000000a0000000001001001110011df1d000001001d0f10001d0f10000001
0000000000000000000010000000000000001001001000喵1111100100eeec001df1cc10001001d0111001d9f10000001
000000000000000000001001110000000000100100100000000000000000010010000f1d01df11110001001d0f10c01d0f10000001
000000000000000000000000010000000011100100100033400000020000010010000f1d01df1eee0f11001d0f1010000f10000001
000000000000000000000000010000000000000100100000000000000000510011d00f1d01d000000f11001d0f1000000f100000h1
000000000000000000000000001111111110000100喵111110001001000cf1df10000000f11001d0喵111111
000000000000000000001000010000000000000100100003030303030300010010001000011111110f110010000000000000000001
000000000000000000001000000000000000000100100000000000000000010010001cccccccccccccc1001000b000000000000001
0000000000000000000010000000000011000001001080喵11111001df喵1111110010g00000000000000001
0000000000000000000010000100110000000001001000000000000000000100100e0e00f100000000f100喵111111001
000000000000000000001111011100000000001100100000000000000000010010g000g00000000000f10010000000001001000001
00000000cc000000000010000100000000000011001000a000011111100901001c10cf1d0000f10000f1001000000000e00e000011
0000011111111100000010000000000000001111001111111111000000000100喵1111d0f1100100000000000000000f1
00000000000000000000000000000000000000010000000000000000000001000000000ee0ee0e0000e100000000f1d0g0000f10f1
00000000000000000000000000110000000000010000000000000000000001000000000000000000000100000000019f1df1d910f1
0g0000000000000000000g000000000000000001g000000000000031000811g0000000c00000cgc00c01g0000000010010010010f1
喵喵110000100000100001111110000b00000000000喵100喵11111101001001001001
点赞0
评论