Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 85efacdddb | |||
| dc9a8d52ff | |||
| 1127cd9cb1 | |||
| cf28a4944f |
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"automappingRulesFile": "",
|
||||
"commands": [
|
||||
],
|
||||
"compatibilityVersion": 1100,
|
||||
"extensionsPath": "extensions",
|
||||
"folders": [
|
||||
"."
|
||||
],
|
||||
"properties": [
|
||||
],
|
||||
"propertyTypes": [
|
||||
]
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
{
|
||||
"Map/SizeTest": {
|
||||
"height": 4300,
|
||||
"width": 2
|
||||
},
|
||||
"activeFile": "assets/level1.tmx",
|
||||
"expandedProjectPaths": [
|
||||
],
|
||||
"fileStates": {
|
||||
"assets/level1.tmx": {
|
||||
"scale": 0.95296875,
|
||||
"selectedLayer": 0,
|
||||
"viewCenter": {
|
||||
"x": 480.07870142646334,
|
||||
"y": 320.05246761764226
|
||||
}
|
||||
},
|
||||
"assets/tiles/terrain_atlas.tsx": {
|
||||
"scaleInDock": 1,
|
||||
"scaleInEditor": 1
|
||||
}
|
||||
},
|
||||
"last.imagePath": "C:/Users/User/Downloads/git/arcade/assets/tiles",
|
||||
"map.lastUsedFormat": "tmx",
|
||||
"map.layerDataFormat": null,
|
||||
"map.renderOrder": null,
|
||||
"openFiles": [
|
||||
"assets/level1.tmx",
|
||||
"assets/tiles/terrain_atlas.tsx"
|
||||
],
|
||||
"project": "Game.tiled-project",
|
||||
"recentFiles": [
|
||||
"assets/tiles/terrain_atlas.tsx",
|
||||
"assets/level1.tmx"
|
||||
],
|
||||
"tileset.lastUsedFormat": "tsx"
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.10.2" orientation="orthogonal" renderorder="left-down" width="30" height="20" tilewidth="32" tileheight="32" infinite="0" nextlayerid="3" nextobjectid="1">
|
||||
<tileset firstgid="1" source="tiles/terrain_atlas.tsx"/>
|
||||
<layer id="2" name="flor" width="30" height="20">
|
||||
<data encoding="base64">
|
||||
ygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMsCAACKAgAAyQIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAAygIAAMoCAADKAgAA
|
||||
</data>
|
||||
</layer>
|
||||
</map>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 211 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 328 KiB |
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<tileset version="1.10" tiledversion="1.10.2" name="terrain_atlas" tilewidth="32" tileheight="32" tilecount="1024" columns="32">
|
||||
<image source="terrain_atlas.png" width="1024" height="1024"/>
|
||||
</tileset>
|
||||
@@ -1,83 +1,220 @@
|
||||
import arcade
|
||||
from random import randint
|
||||
import numpy as np
|
||||
|
||||
SCREEN_WIDTH = 800
|
||||
SCREEN_HEIGHT = 600
|
||||
SCREEN_SIZE = (800,600)
|
||||
TICK_TIME = 0.5
|
||||
|
||||
class Player(arcade.Sprite):
|
||||
def __init__(self):
|
||||
super().__init__(
|
||||
':resources:/images/animated_characters/female_adventurer/femaleAdventurer_idle.png',
|
||||
scale = 1
|
||||
)
|
||||
self.center_x = SCREEN_WIDTH//2
|
||||
self.center_y = SCREEN_HEIGHT//2
|
||||
#self.texture_left = arcade.SpriteSheet('./tiles/gold.png').get_texture_grid((64,64),4,4)
|
||||
|
||||
class Object(arcade.Sprite):
|
||||
def __init__(self,x,y):
|
||||
super().__init__()
|
||||
self.textures = arcade.SpriteSheet('./assets/tiles/BODY_animation.png').get_texture_grid((64,64),8,8)
|
||||
self.center_x = x
|
||||
self.center_y = y
|
||||
self.cur_texture = 0
|
||||
self.set_texture(self.cur_texture)
|
||||
self.timer = 0
|
||||
|
||||
def update(self,delta_time):
|
||||
self.timer += delta_time
|
||||
if self.timer >= 0.5:
|
||||
if self.cur_texture >= len(self.textures)-1:
|
||||
self.cur_texture = 0
|
||||
class Wolf(arcade.SpriteCircle):
|
||||
ls = arcade.SpriteList()
|
||||
def __init__(self,parent=None):
|
||||
super().__init__(radius=5, color=arcade.color.RED)
|
||||
if parent:
|
||||
self.center_x = parent.center_x
|
||||
self.center_y = parent.center_y
|
||||
else:
|
||||
self.cur_texture += 1
|
||||
self.timer = 0
|
||||
self.set_texture(self.cur_texture)
|
||||
self.center_x = randint(1,SCREEN_SIZE[0])
|
||||
self.center_y = randint(1,SCREEN_SIZE[1])
|
||||
self.age = 0
|
||||
self.age_to_bride = 3
|
||||
self.health = 30
|
||||
self.speed = 8
|
||||
self.move_target = 0
|
||||
self.target_timer = 0
|
||||
Wolf.ls.append(self)
|
||||
@classmethod
|
||||
def update(cls):
|
||||
if len(cls.ls) == 0:
|
||||
Wolf()
|
||||
for e in cls.ls:
|
||||
e.age += 1
|
||||
if e.age >= 30:
|
||||
cls.ls.remove(e)
|
||||
continue
|
||||
|
||||
if e.health >= 50 and e.age_to_bride < e.age:
|
||||
Wolf(e)
|
||||
e.health -= 30
|
||||
|
||||
hit_cow = arcade.check_for_collision_with_list(e,Cow.ls)
|
||||
for c in hit_cow:
|
||||
e.health += c.health
|
||||
Cow.ls.remove(c)
|
||||
else:
|
||||
if e.target_timer <= 0:
|
||||
e.move_target = Cow.get_near(e.center_x,e.center_y)
|
||||
e.target_timer = 3
|
||||
if e.move_target:
|
||||
vec = cls.get_vector(e.center_x,e.move_target.center_x,
|
||||
e.center_y,e.move_target.center_y)
|
||||
new_x = e.center_x + vec[0]*e.speed
|
||||
new_y = e.center_y + vec[1]*e.speed
|
||||
if 0 < new_x < SCREEN_SIZE[0] and 0 < new_y < SCREEN_SIZE[1]:
|
||||
e.center_x = new_x
|
||||
e.center_y = new_y
|
||||
e.health -= 1
|
||||
if e.health <= 0:
|
||||
cls.ls.remove(e)
|
||||
|
||||
@classmethod
|
||||
def draw(cls):
|
||||
cls.ls.draw()
|
||||
@staticmethod
|
||||
def get_vector(src_x,target_x,src_y,target_y):
|
||||
source = np.array([src_x, src_y])
|
||||
target = np.array([target_x, target_y])
|
||||
direction = target - source
|
||||
length = np.linalg.norm(direction)
|
||||
return direction / length
|
||||
|
||||
|
||||
class Cow(arcade.SpriteCircle):
|
||||
ls = arcade.SpriteList()
|
||||
def __init__(self,parent=None):
|
||||
super().__init__(radius=5, color=arcade.color.BROWN)
|
||||
if parent:
|
||||
self.center_x = parent.center_x
|
||||
self.center_y = parent.center_y
|
||||
else:
|
||||
self.center_x = randint(1,SCREEN_SIZE[0])
|
||||
self.center_y = randint(1,SCREEN_SIZE[1])
|
||||
self.age = 0
|
||||
self.age_to_bride = 3
|
||||
self.health = 30
|
||||
self.speed = 5
|
||||
self.move_target = 0
|
||||
self.target_timer = 0
|
||||
Cow.ls.append(self)
|
||||
@classmethod
|
||||
def get_near(cls,x,y):
|
||||
dist_list = list()
|
||||
for e in cls.ls:
|
||||
dist_list.append((e,((e.center_x - x)**2 + (e.center_y - y)**2)**0.5))
|
||||
dist_list.sort(key=lambda x: x[1])
|
||||
if len(dist_list) == 0:
|
||||
return None
|
||||
return dist_list[0][0]
|
||||
@classmethod
|
||||
def update(cls):
|
||||
if len(cls.ls) == 0:
|
||||
Cow()
|
||||
for c in cls.ls:
|
||||
c.age += 1
|
||||
if c.age >= 30:
|
||||
cls.ls.remove(c)
|
||||
continue
|
||||
|
||||
if c.health >= 50 and c.age_to_bride < c.age:
|
||||
Cow(c)
|
||||
c.health -= 30
|
||||
|
||||
hit_plant = arcade.check_for_collision_with_list(c,Plant.ls)
|
||||
for p in hit_plant:
|
||||
c.health += p.width
|
||||
Plant.ls.remove(p)
|
||||
else:
|
||||
if c.target_timer <= 0:
|
||||
c.move_target = Plant.get_near(c.center_x,c.center_y)
|
||||
c.target_timer = 5
|
||||
if c.move_target:
|
||||
vec = cls.get_vector(c.center_x,c.move_target.center_x,
|
||||
c.center_y,c.move_target.center_y)
|
||||
new_x = c.center_x + vec[0]*randint(0,c.speed)
|
||||
new_y = c.center_y + vec[1]*randint(0,c.speed)
|
||||
if 0 < new_x < SCREEN_SIZE[0] and 0 < new_y < SCREEN_SIZE[1]:
|
||||
c.center_x = new_x
|
||||
c.center_y = new_y
|
||||
c.health -= 1
|
||||
if c.health <= 0:
|
||||
cls.ls.remove(c)
|
||||
|
||||
@classmethod
|
||||
def draw(cls):
|
||||
cls.ls.draw()
|
||||
@staticmethod
|
||||
def get_vector(src_x,target_x,src_y,target_y):
|
||||
source = np.array([src_x, src_y])
|
||||
target = np.array([target_x, target_y])
|
||||
direction = target - source
|
||||
length = np.linalg.norm(direction)
|
||||
return direction / length
|
||||
|
||||
class Plant(arcade.SpriteCircle):
|
||||
ls = arcade.SpriteList()
|
||||
|
||||
def __init__(self,parent=None):
|
||||
super().__init__(radius=1, color=arcade.color.GREEN)
|
||||
if parent:
|
||||
self.center_x = parent.center_x + randint(-parent.fly_distance,parent.fly_distance)
|
||||
self.center_y = parent.center_y + randint(-parent.fly_distance,parent.fly_distance)
|
||||
else:
|
||||
self.center_x = randint(1,SCREEN_SIZE[0])
|
||||
self.center_y = randint(1,SCREEN_SIZE[1])
|
||||
self.age = 0
|
||||
self.fly_distance = 100
|
||||
self.age_to_plant = 10
|
||||
if not arcade.check_for_collision_with_list(self,Plant.ls) and 0 < self.center_x < SCREEN_SIZE[0] and 0 < self.center_y < SCREEN_SIZE[1]:
|
||||
Plant.ls.append(self)
|
||||
@classmethod
|
||||
def get_near(cls,x,y):
|
||||
dist_list = list()
|
||||
for p in cls.ls:
|
||||
dist_list.append((p,((p.center_x - x)**2 + (p.center_y - y)**2)**0.5 - p.width ))
|
||||
dist_list.sort(key=lambda x: x[1])
|
||||
if len(dist_list) == 0:
|
||||
return None
|
||||
if len(dist_list) < 3:
|
||||
return dist_list[0][0]
|
||||
return dist_list[randint(0,3)][0]
|
||||
@classmethod
|
||||
def update(cls):
|
||||
for p in cls.ls:
|
||||
p.age += 1
|
||||
hit_list = arcade.check_for_collision_with_list(p,cls.ls)
|
||||
if p.center_x - p.width//2 > 0 and p.center_x + p.width//2 < SCREEN_SIZE[0] and p.center_y - p.height//2 > 0 and p.center_y + p.width//2 < SCREEN_SIZE[1] and not hit_list:
|
||||
p.width += 2
|
||||
p.height += 2
|
||||
else:
|
||||
for h in hit_list:
|
||||
if p.width < h.width:
|
||||
cls.ls.remove(p)
|
||||
break
|
||||
if p.age >= p.age_to_plant:
|
||||
Plant(p)
|
||||
@classmethod
|
||||
def draw(cls):
|
||||
cls.ls.draw()
|
||||
for p in cls.ls:
|
||||
p.draw_hit_box()
|
||||
|
||||
class MainView(arcade.View):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.background_color = (100,100,200)
|
||||
self.player = Player()
|
||||
self.sprite_list = arcade.SpriteList()
|
||||
self.sprite_list.append(self.player)
|
||||
self.sprite_list.append(Object(100,50))
|
||||
Plant()
|
||||
self.time = 0
|
||||
self.cur_time = 0
|
||||
self.text = None
|
||||
|
||||
self.tilemap = arcade.load_tilemap('./assets/level1.tmx', scaling=1)
|
||||
self.flor_list = self.tilemap.sprite_lists["flor"]
|
||||
|
||||
def on_update(self,delta_time):
|
||||
self.sprite_list.update()
|
||||
def on_update(self, delta_time):
|
||||
self.cur_time += delta_time
|
||||
if self.cur_time >= TICK_TIME:
|
||||
print(f'Total plants: {len(Plant.ls)}, total cows: {len(Cow.ls)}')
|
||||
Plant.update()
|
||||
Cow.update()
|
||||
Wolf.update()
|
||||
self.time += 1
|
||||
self.cur_time = 0
|
||||
|
||||
def on_draw(self):
|
||||
self.clear()
|
||||
self.flor_list.draw()
|
||||
arcade.draw_circle_filled(400,300,100,(255,255,0))
|
||||
arcade.draw_circle_filled(350,330,20,(0,0,0))
|
||||
arcade.draw_arc_outline(400,280,150,100,(0,0,0),200,340,10)
|
||||
self.sprite_list.draw()
|
||||
arcade.draw_circle_filled(450,330,20,(0,0,0))
|
||||
|
||||
def on_key_press(self,key,mod):
|
||||
if key == arcade.key.A:
|
||||
self.player.change_x = -5
|
||||
elif key == arcade.key.D:
|
||||
self.player.change_x = 5
|
||||
elif key == arcade.key.W:
|
||||
self.player.change_y = 5
|
||||
elif key == arcade.key.S:
|
||||
self.player.change_y = -5
|
||||
|
||||
def on_key_release(self,key,mod):
|
||||
if key == arcade.key.A or key == arcade.key.D:
|
||||
self.player.change_x = 0
|
||||
if key == arcade.key.W or key == arcade.key.S:
|
||||
self.player.change_y = 0
|
||||
Plant.draw()
|
||||
Cow.draw()
|
||||
Wolf.draw()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
window = arcade.Window(SCREEN_WIDTH,SCREEN_HEIGHT,'Игра с видом сверху')
|
||||
window = arcade.Window(*SCREEN_SIZE,"Игра про жизнь")
|
||||
view = MainView()
|
||||
window.show_view(view)
|
||||
arcade.run()
|
||||
|
||||
Reference in New Issue
Block a user