Добавил врагов и анимацию урона

This commit is contained in:
2026-05-28 11:32:50 +03:00
parent e543a298ab
commit 29219bc874
2 changed files with 58 additions and 12 deletions
+2 -2
View File
@@ -10,9 +10,9 @@
}, },
"level1.tmj": { "level1.tmj": {
"scale": 0.25, "scale": 0.25,
"selectedLayer": 1, "selectedLayer": 3,
"viewCenter": { "viewCenter": {
"x": 1500, "x": 1092,
"y": 5412 "y": 5412
} }
}, },
+55 -9
View File
@@ -10,20 +10,35 @@ class Player(arcade.SpriteList):
super().__init__() super().__init__()
self.sprite = sp[0] self.sprite = sp[0]
self.append(self.sprite) self.append(self.sprite)
self.damage_cooldown = 0
self.visible = True
def draw(self): def draw(self):
if self.damage_cooldown > 0:
self.damage_cooldown -= 1
self.visible = not self.visible
else:
self.visible = True
if self.visible:
super().draw() super().draw()
def update(self): def update(self,delta_time):
if self.damage_cooldown > 0:
self.damage_cooldown -= 1
super().update() super().update()
def damage(self,cooldown):
coin_texture = arcade.SpriteSheet('./tiles/gold.png').get_texture_grid((64,64),4,4) self.damage_cooldown = cooldown
coin_texture_reverse = coin_texture[1:-1]
coin_texture_reverse.reverse()
coin_texture.extend(coin_texture_reverse)
coin_texture_reverse = None
class Coin(arcade.Sprite): class Coin(arcade.Sprite):
#Подготовка текстур для анимации
coin_texture = arcade.SpriteSheet('./tiles/gold.png').get_texture_grid((64,64),4,4)
coin_texture_reverse = coin_texture[1:-1]
coin_texture_reverse.reverse()
coin_texture.extend(coin_texture_reverse)
del coin_texture_reverse
sprite_list = arcade.SpriteList() sprite_list = arcade.SpriteList()
texture_list = coin_texture texture_list = coin_texture
del coin_texture
def __init__(self,sprite): def __init__(self,sprite):
super().__init__(sprite.textures[0],scale=sprite.scale) super().__init__(sprite.textures[0],scale=sprite.scale)
self.center_x = sprite.center_x self.center_x = sprite.center_x
@@ -51,6 +66,20 @@ class Coin(arcade.Sprite):
def update_list(cls): def update_list(cls):
cls.sprite_list.update() cls.sprite_list.update()
class Enemy(arcade.Sprite):
sprite_list = arcade.SpriteList()
def __init__(self,sprite):
super().__init__(sprite.texture,scale=sprite.scale)
self.center_x = sprite.center_x
self.center_y = sprite.center_y
self.angle = sprite.angle
Enemy.sprite_list.append(self)
def collision(self):
pass
@classmethod
def draw(cls):
cls.sprite_list.draw()
class MainView(arcade.View): class MainView(arcade.View):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@@ -60,18 +89,25 @@ class MainView(arcade.View):
self.key_left = False self.key_left = False
self.key_right = False self.key_right = False
self.tile_map = arcade.load_tilemap('./level1.tmj',scaling=0.5) self.tile_map = arcade.load_tilemap('./level1.tmj',scaling=0.5)
#Стены
self.walls = self.tile_map.sprite_lists["map"] self.walls = self.tile_map.sprite_lists["map"]
#Фоновые тайлы
self.background = self.tile_map.sprite_lists["back"] self.background = self.tile_map.sprite_lists["back"]
#Объекты монеток
for coin in self.tile_map.sprite_lists["coins"]: for coin in self.tile_map.sprite_lists["coins"]:
Coin(coin) Coin(coin)
#Объекты врагов
for enemy in self.tile_map.sprite_lists["enemy"]:
Enemy(enemy)
#Объект игрока
self.player = Player(self.tile_map.sprite_lists["player"]) self.player = Player(self.tile_map.sprite_lists["player"])
#Подключаем физику только для стен и гравитации
self.engine = arcade.PhysicsEnginePlatformer( self.engine = arcade.PhysicsEnginePlatformer(
player_sprite=self.player.sprite, player_sprite=self.player.sprite,
gravity_constant=GRAVITY, gravity_constant=GRAVITY,
walls=self.walls walls=self.walls
) )
self.engine.allow_multi_jump = False #Создаем камеру
self.camera = arcade.Camera2D() self.camera = arcade.Camera2D()
def on_update(self, delta_time): def on_update(self, delta_time):
@@ -83,7 +119,9 @@ class MainView(arcade.View):
self.player.sprite.change_x = 10 self.player.sprite.change_x = 10
else: else:
self.player.sprite.change_x = 0 self.player.sprite.change_x = 0
#self.player.update(delta_time)
self.engine.update() self.engine.update()
#Перемещение камеры на игрока
screen_center_x, screen_center_y = self.player.sprite.position screen_center_x, screen_center_y = self.player.sprite.position
if screen_center_x < self.camera.viewport_width/2: if screen_center_x < self.camera.viewport_width/2:
screen_center_x = self.camera.viewport_width/2 screen_center_x = self.camera.viewport_width/2
@@ -92,15 +130,23 @@ class MainView(arcade.View):
if screen_center_x > (self.tile_map.width*self.tile_map.tile_width*self.tile_map.scaling) - self.camera.viewport_width/2: if screen_center_x > (self.tile_map.width*self.tile_map.tile_width*self.tile_map.scaling) - self.camera.viewport_width/2:
screen_center_x = (self.tile_map.width*self.tile_map.tile_width*self.tile_map.scaling) - self.camera.viewport_width/2 screen_center_x = (self.tile_map.width*self.tile_map.tile_width*self.tile_map.scaling) - self.camera.viewport_width/2
self.camera.position = screen_center_x,screen_center_y self.camera.position = screen_center_x,screen_center_y
#Анимация монеток
Coin.update_list() Coin.update_list()
#Подбор монеток при колизии
colls = arcade.check_for_collision_with_list(self.player.sprite,Coin.sprite_list) colls = arcade.check_for_collision_with_list(self.player.sprite,Coin.sprite_list)
for coin in colls: for coin in colls:
coin.collision() coin.collision()
#Столкновения с врагами
colls = arcade.check_for_collision_with_list(self.player.sprite,Enemy.sprite_list)
for enemy in colls:
enemy.collision()
self.player.damage(10)
def on_draw(self): def on_draw(self):
self.clear() self.clear()
self.camera.use() self.camera.use()
self.background.draw() self.background.draw()
Enemy.draw()
Coin.draw() Coin.draw()
self.player.draw() self.player.draw()
self.walls.draw() self.walls.draw()