Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitbb457b4

Browse files
committed
add platformer game tutorial
1 parent9cfb9b7 commitbb457b4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+431
-0
lines changed

‎README.md

Lines changed: 1 addition & 0 deletions
Lines changed: 1 addition & 0 deletions
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
importpygame
2+
fromsettingsimportHEIGHT,WIDTH
3+
4+
pygame.font.init()
5+
6+
classGame:
7+
def__init__(self,screen):
8+
self.screen=screen
9+
self.font=pygame.font.SysFont("impact",70)
10+
self.message_color=pygame.Color("darkorange")
11+
12+
# if player ran out of life or fell below the platform
13+
def_game_lose(self,player):
14+
player.game_over=True
15+
message=self.font.render('You Lose...',True,self.message_color)
16+
self.screen.blit(message,(WIDTH//3+70,70))
17+
18+
# if player reach the goal
19+
def_game_win(self,player):
20+
player.game_over=True
21+
player.win=True
22+
message=self.font.render('You Win!!',True,self.message_color)
23+
self.screen.blit(message,(WIDTH//3,70))
24+
25+
# checks if the game is over or not, and if win or lose
26+
defgame_state(self,player,goal):
27+
ifplayer.life<=0orplayer.rect.y>=HEIGHT:
28+
self._game_lose(player)
29+
elifplayer.rect.colliderect(goal.rect):
30+
self._game_win(player)
31+
else:
32+
None
33+
34+
defshow_life(self,player):
35+
life_size=30
36+
img_path="assets/life/life.png"
37+
life_image=pygame.image.load(img_path)
38+
life_image=pygame.transform.scale(life_image, (life_size,life_size))
39+
# life_rect = life_image.get_rect(topleft = pos)
40+
indent=0
41+
forlifeinrange(player.life):
42+
indent+=life_size
43+
self.screen.blit(life_image, (indent,life_size))
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
importpygame
2+
3+
classGoal(pygame.sprite.Sprite):
4+
def__init__(self,pos,size):
5+
super().__init__()
6+
img_path='assets/goal/gate.png'
7+
self.image=pygame.image.load(img_path)
8+
self.image=pygame.transform.scale(self.image, (size,size))
9+
self.rect=self.image.get_rect(topleft=pos)
10+
11+
# update object position due to world scroll
12+
defupdate(self,x_shift):
13+
self.rect.x+=x_shift
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
importpygame,sys
2+
fromsettingsimport*
3+
fromworldimportWorld
4+
5+
pygame.init()
6+
7+
screen=pygame.display.set_mode((WIDTH,HEIGHT))
8+
pygame.display.set_caption("Platformer")
9+
10+
classPlatformer:
11+
def__init__(self,screen,width,height):
12+
self.screen=screen
13+
self.clock=pygame.time.Clock()
14+
self.player_event=False
15+
16+
self.bg_img=pygame.image.load('assets/terrain/bg.jpg')
17+
self.bg_img=pygame.transform.scale(self.bg_img, (width,height))
18+
19+
defmain(self):
20+
world=World(world_map,self.screen)
21+
whileTrue:
22+
self.screen.blit(self.bg_img, (0,0))
23+
24+
foreventinpygame.event.get():
25+
ifevent.type==pygame.QUIT:
26+
pygame.quit()
27+
sys.exit()
28+
29+
elifevent.type==pygame.KEYDOWN:
30+
ifevent.key==pygame.K_LEFT:
31+
self.player_event="left"
32+
ifevent.key==pygame.K_RIGHT:
33+
self.player_event="right"
34+
ifevent.key==pygame.K_SPACE:
35+
self.player_event="space"
36+
elifevent.type==pygame.KEYUP:
37+
self.player_event=False
38+
39+
world.update(self.player_event)
40+
pygame.display.update()
41+
self.clock.tick(60)
42+
43+
44+
if__name__=="__main__":
45+
play=Platformer(screen,WIDTH,HEIGHT)
46+
play.main()
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
importpygame
2+
fromsupportimportimport_sprite
3+
4+
classPlayer(pygame.sprite.Sprite):
5+
def__init__(self,pos):
6+
super().__init__()
7+
self._import_character_assets()
8+
self.frame_index=0
9+
self.animation_speed=0.15
10+
self.image=self.animations["idle"][self.frame_index]
11+
self.rect=self.image.get_rect(topleft=pos)
12+
self.mask=pygame.mask.from_surface(self.image)
13+
14+
# player movement
15+
self.direction=pygame.math.Vector2(0,0)
16+
self.speed=5
17+
self.jump_move=-16
18+
19+
# player status
20+
self.life=5
21+
self.game_over=False
22+
self.win=False
23+
self.status="idle"
24+
self.facing_right=True
25+
self.on_ground=False
26+
self.on_ceiling=False
27+
self.on_left=False
28+
self.on_right=False
29+
30+
# gets all the image needed for animating specific player action
31+
def_import_character_assets(self):
32+
character_path="assets/player/"
33+
self.animations= {
34+
"idle": [],
35+
"walk": [],
36+
"jump": [],
37+
"fall": [],
38+
"lose": [],
39+
"win": []
40+
}
41+
foranimationinself.animations.keys():
42+
full_path=character_path+animation
43+
self.animations[animation]=import_sprite(full_path)
44+
45+
# animates the player actions
46+
def_animate(self):
47+
animation=self.animations[self.status]
48+
49+
# loop over frame index
50+
self.frame_index+=self.animation_speed
51+
ifself.frame_index>=len(animation):
52+
self.frame_index=0
53+
image=animation[int(self.frame_index)]
54+
image=pygame.transform.scale(image, (35,50))
55+
ifself.facing_right:
56+
self.image=image
57+
else:
58+
flipped_image=pygame.transform.flip(image,True,False)
59+
self.image=flipped_image
60+
61+
# set the rect
62+
ifself.on_groundandself.on_right:
63+
self.rect=self.image.get_rect(bottomright=self.rect.bottomright)
64+
elifself.on_groundandself.on_left:
65+
self.rect=self.image.get_rect(bottomleft=self.rect.bottomleft)
66+
elifself.on_ground:
67+
self.rect=self.image.get_rect(midbottom=self.rect.midbottom)
68+
elifself.on_ceilingandself.on_right:
69+
self.rect=self.image.get_rect(topright=self.rect.topright)
70+
elifself.on_ceilingandself.on_left:
71+
self.rect=self.image.get_rect(bottomleft=self.rect.topleft)
72+
elifself.on_ceiling:
73+
self.rect=self.image.get_rect(midtop=self.rect.midtop)
74+
75+
# checks if the player is moving towards left or right or not moving
76+
def_get_input(self,player_event):
77+
ifplayer_event!=False:
78+
ifplayer_event=="right":
79+
self.direction.x=1
80+
self.facing_right=True
81+
elifplayer_event=="left":
82+
self.direction.x=-1
83+
self.facing_right=False
84+
else:
85+
self.direction.x=0
86+
87+
def_jump(self):
88+
self.direction.y=self.jump_move
89+
90+
# identifies player action
91+
def_get_status(self):
92+
ifself.direction.y<0:
93+
self.status="jump"
94+
elifself.direction.y>1:
95+
self.status="fall"
96+
elifself.direction.x!=0:
97+
self.status="walk"
98+
else:
99+
self.status="idle"
100+
101+
# update the player's state
102+
defupdate(self,player_event):
103+
self._get_status()
104+
ifself.life>0andnotself.game_over:
105+
ifplayer_event=="space"andself.on_ground:
106+
self._jump()
107+
else:
108+
self._get_input(player_event)
109+
elifself.game_overandself.win:
110+
self.direction.x=0
111+
self.status="win"
112+
else:
113+
self.direction.x=0
114+
self.status="lose"
115+
self._animate()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pygame
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
world_map= [
2+
' ',
3+
' ',
4+
' t t ',
5+
' X XXXXXXXXXs XX X ',
6+
' tXXXt XX XX XXXX tt XX ',
7+
' XX XX XXXXX ',
8+
' Xt t t t X G ',
9+
' XXXXXX XXXXs XXXXXXXXXXX XX tt t XXX',
10+
' P XX X XX X X XXXt X XX XX XXX XXXXXXXXs XXXXXX ',
11+
'XXXXXXX X X X X XXXXXXXXX XX XX XXX XX XX XXXXXXX X ',
12+
]
13+
14+
tile_size=50
15+
WIDTH,HEIGHT=1000,len(world_map)*tile_size
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
fromosimportwalk
2+
importpygame
3+
4+
defimport_sprite(path):
5+
surface_list= []
6+
for_,__,img_fileinwalk(path):
7+
forimageinimg_file:
8+
full_path=f"{path}/{image}"
9+
img_surface=pygame.image.load(full_path).convert_alpha()
10+
surface_list.append(img_surface)
11+
returnsurface_list
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
importpygame
2+
3+
classTile(pygame.sprite.Sprite):
4+
def__init__(self,pos,size):
5+
super().__init__()
6+
img_path='assets/terrain/stone.jpg'
7+
self.image=pygame.image.load(img_path)
8+
self.image=pygame.transform.scale(self.image, (size,size))
9+
self.rect=self.image.get_rect(topleft=pos)
10+
11+
# update object position due to world scroll
12+
defupdate(self,x_shift):
13+
self.rect.x+=x_shift
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
importpygame
2+
fromsupportimportimport_sprite
3+
4+
classTrap(pygame.sprite.Sprite):
5+
def__init__(self,pos,size):
6+
super().__init__()
7+
self.blade_img=import_sprite("assets/trap/blade")
8+
self.frame_index=0
9+
self.animation_delay=3
10+
self.image=self.blade_img[self.frame_index]
11+
self.image=pygame.transform.scale(self.image, (size,size))
12+
self.mask=pygame.mask.from_surface(self.image)
13+
self.rect=self.image.get_rect(topleft=pos)
14+
15+
# adds the spinning effect to the Blade trap
16+
def_animate(self):
17+
sprites=self.blade_img
18+
sprite_index= (self.frame_index//self.animation_delay)%len(sprites)
19+
self.image=sprites[sprite_index]
20+
self.frame_index+=1
21+
self.rect=self.image.get_rect(topleft=(self.rect.x,self.rect.y))
22+
self.mask=pygame.mask.from_surface(self.image)
23+
ifself.frame_index//self.animation_delay>len(sprites):
24+
self.frame_index=0
25+
26+
# update object position due to world scroll
27+
defupdate(self,x_shift):
28+
self._animate()
29+
self.rect.x+=x_shift

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp