Сделано перекрытие стенами и коллизия со стенами

This commit is contained in:
2026-05-29 17:33:24 +03:00
parent 1ffb08b487
commit 4be646111b
3 changed files with 76 additions and 24 deletions
+64 -17
View File
@@ -7,6 +7,39 @@ SCREEN_FULL = True
TILE_WIDTH = 64
TILE_HEIGHT = 32
class Engine:
def __init__(self,player_sprite,wall_list):
self.player = player_sprite
self.dynamic = arcade.SpriteList()
self.dynamic.append(self.player)
self.walls = wall_list
def add_list(self,sprite_list):
for sprite in sprite_list:
self.dynamic.append(sprite)
def can_move(self,obj,vec):
new_pos = (obj.center_x + vec[0]*TILE_WIDTH//2,obj.center_y + vec[1]*TILE_HEIGHT//2)
for wall in self.walls:
if wall.position == new_pos:
return False
return True
def update(self,delta_time):
pass
def draw(self):
dr = arcade.SpriteList()
for wall in self.walls:
for obj in self.dynamic:
if wall.position in [
(obj.center_x-TILE_WIDTH//2,obj.center_y-TILE_HEIGHT//2),
(obj.center_x+TILE_WIDTH//2,obj.center_y-TILE_HEIGHT//2),
(obj.center_x,obj.center_y-TILE_HEIGHT)]:
if not obj in dr:
dr.append(obj)
dr.append(wall)
for obj in self.dynamic:
if not obj in dr:
dr.append(obj)
dr.draw()
def to_iso(tile_list):
for tile in tile_list:
col = tile.center_x//TILE_WIDTH
@@ -16,7 +49,7 @@ def to_iso(tile_list):
return tile_list
class Player(arcade.Sprite):
def __init__(self,sprite,lookLeft=True):
def __init__(self,sprite,lookLeft=True,control=False):
super().__init__()
self.texture = sprite.texture
self.lookLeft = lookLeft
@@ -24,7 +57,6 @@ class Player(arcade.Sprite):
self.center_y = sprite.center_y
self.move_timer = 0
def update(self,delta_time):
super().update()
self.move_timer += delta_time
if self.move_timer >= 1:
self.move_timer = 0
@@ -37,46 +69,53 @@ class Player(arcade.Sprite):
self.move(-1,-1,delta_time)
elif way == 3:
self.move(-1,1,delta_time)
super().update()
def move(self,dx,dy,dt):
def move(self,dx,dy,dt=1):
self.lookLeft = False if self.change_x > 0 else True
self.change_x = dx * TILE_WIDTH//2*dt
self.change_y = dy * TILE_HEIGHT//2*dt
if self.change_x > 0 and self.lookLeft:
self.center_x = self.center_x + dx*TILE_WIDTH//2
self.center_y = self.center_y + dy*TILE_HEIGHT//2
if dx > 0 and self.lookLeft:
self.texture = self.texture.flip_left_right()
self.lookLeft = False
elif self.change_x < 0 and not self.lookLeft:
elif dx < 0 and not self.lookLeft:
self.texture = self.texture.flip_left_right()
self.lookLeft = True
class MainView(arcade.View):
def __init__(self):
super().__init__()
self.background_color = (100,100,200)
self.move = (0,0)
self.tilemap = arcade.load_tilemap('./assets/level1.tmx',scaling=1)
self.flor = self.tilemap.sprite_lists["flor"]
self.flor = to_iso(self.flor)
self.walls = self.tilemap.sprite_lists["walls"]
self.walls = to_iso(self.walls)
self.objects = self.tilemap.sprite_lists["objects"]
self.objects = to_iso(self.objects)
self.players = arcade.SpriteList()
for obj in self.objects:
self.players.append(Player(obj))
objects = self.tilemap.sprite_lists["objects"]
objects = to_iso(objects)
self.enemys = arcade.SpriteList()
for obj in objects:
self.enemys.append(Player(obj))
self.camera = arcade.Camera2D()
objects = self.tilemap.sprite_lists["player"]
objects = to_iso(objects)
self.player = Player(objects[0],control=True)
self.engine = Engine(self.player,self.walls)
self.engine.add_list(self.enemys)
def on_draw(self):
self.clear()
self.camera.use()
self.flor.draw()
self.walls.draw()
self.players.draw()
self.engine.draw()
#self.enemys.draw()
def on_update(self,delta_time):
self.camera.position = 800,0
self.players.update(delta_time)
self.engine.update(delta_time)
#self.enemys.update(delta_time)
def on_mouse_press(self,x,y,but,mod):
world_point = self.camera.unproject((x,y))
tile_col = world_point.x//TILE_WIDTH
@@ -90,7 +129,15 @@ class MainView(arcade.View):
center_y=tile_row*TILE_HEIGHT+TILE_HEIGHT
)
)
def on_key_press(self,key,mod):
if key == arcade.key.W and self.engine.can_move(self.player,(1,1)):
self.player.move(1,1)
elif key == arcade.key.A and self.engine.can_move(self.player,(-1,1)):
self.player.move(-1,1)
elif key == arcade.key.S and self.engine.can_move(self.player,(-1,-1)):
self.player.move(-1,-1)
elif key == arcade.key.D and self.engine.can_move(self.player,(1,-1)):
self.player.move(1,-1)
if __name__ == '__main__':