猫史档案馆


【Python作品分享】陆地跑酷【奇遇之旅】

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


【作品展示】

center_image

 

【作品介绍】

本作品是一个跑酷地图!

具体玩法已经在游戏里给出

难度非常的大

建议耐心尝试

另外有些细节没有加

不过不要在意~

灵感就来源于那些跑酷游戏!

思路也想了半天

希望你们可以好好游玩一下!

 

【作品源代码】

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


回复

上一页1 页 / 共 1下一页
有趣的力士甲虫D8IF有趣的力士甲虫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有趣的力士甲虫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有趣的力士甲虫D8IF

center_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_image

图片素材   均手绘或者来自编程猫课程中给予的素材

点赞0


评论


有趣的力士甲虫D8IF有趣的力士甲虫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


评论


有趣的力士甲虫D8IF有趣的力士甲虫D8IF

文件中有一些路径      可以自行修改

 

点赞0


评论


AlcalaAlcala

nb

点赞1


评论


有趣的力士甲虫D8IF有趣的力士甲虫D8IF

音乐文件发不了 难受

 

点赞0


评论