Browse Source

Aggiornamento dimensioni generatore labirinto e velocità cavaliere

pyglet
Matteo Benedetto 2 years ago
parent
commit
a7bbd1c6db
  1. BIN
      Effects/__pycache__/animated_gif.cpython-311.pyc
  2. BIN
      Effects/__pycache__/order_click.cpython-311.pyc
  3. 10
      Effects/animated_gif.py
  4. 2
      Effects/order_click.py
  5. BIN
      Units/__pycache__/knight.cpython-311.pyc
  6. 13
      Units/knight.py
  7. 80
      main.py
  8. 2
      maze.json
  9. 2
      maze.py

BIN
Effects/__pycache__/animated_gif.cpython-311.pyc

Binary file not shown.

BIN
Effects/__pycache__/order_click.cpython-311.pyc

Binary file not shown.

10
Effects/animated_gif.py

@ -1,4 +1,4 @@
import tkinter as tk import pyglet
import itertools import itertools
class AnimatedGif: class AnimatedGif:
@ -11,12 +11,12 @@ class AnimatedGif:
i = 0 i = 0
while True: while True:
try: try:
image = tk.PhotoImage(file=path, format='gif -index %i' %(i)) image = pyglet.image.load_animation(path)
resized_image = image.subsample(1) # Resize image to half frame = image.get_texture(i)
self.frames.append(resized_image) self.frames.append(frame)
i += 1 i += 1
except tk.TclError: except IndexError:
break break
def next_frame(self): def next_frame(self):

2
Effects/order_click.py

@ -8,7 +8,7 @@ class OrderClick:
def next_frame(self, canvas: Canvas) -> bool: def next_frame(self, canvas: Canvas) -> bool:
self.radius -= 5 self.radius -= 5
shift = 30 shift = 30
canvas.create_oval(self.position[0]-self.radius, self.position[1]-self.radius/2+shift, self.position[0]+self.radius, self.position[1]+self.radius/2+shift, fill="", tags="effect", outline=self.color, width=2) #canvas.create_oval(self.position[0]-self.radius, self.position[1]-self.radius/2+shift, self.position[0]+self.radius, self.position[1]+self.radius/2+shift, fill="", tags="effect", outline=self.color, width=2)
if not self.radius: if not self.radius:
return False return False

BIN
Units/__pycache__/knight.cpython-311.pyc

Binary file not shown.

13
Units/knight.py

@ -1,3 +1,4 @@
import pyglet
import os import os
import glob import glob
@ -8,14 +9,14 @@ class Knight:
def __init__(self, engine, position=(0,0)): def __init__(self, engine, position=(0,0)):
self.engine = engine self.engine = engine
self.position = position self.position = position
self.target = position self.target = (8,5)
self.destination = position self.destination = position
gifs = glob.glob("KnightBasic/**/*.gif", recursive=True) gifs = glob.glob("KnightBasic/**/*.gif", recursive=True)
self.animation = {os.path.basename(gif): AnimatedGif(gif) for gif in gifs} self.animation = {os.path.basename(gif): pyglet.sprite.Sprite(pyglet.resource.animation(gif)) for gif in gifs}
self.state = "Walk" self.state = "Walk"
self.speed = .05 # This is now the delay between updates in seconds self.speed = .025 # This is now the delay between updates in seconds
self.partial_move = 0 self.partial_move = 0
self.direction = 2 self.direction = 7
self.visited = [self.position] self.visited = [self.position]
self.starting_position = (position) self.starting_position = (position)
@ -45,8 +46,6 @@ class Knight:
self.position = self.destination self.position = self.destination
self.destination = self.engine.get_closest_neighbor(neighbors_list,self.target) self.destination = self.engine.get_closest_neighbor(neighbors_list,self.target)
self.partial_move = 0 self.partial_move = 0
print(self.partial_move)
gif = self.animation.get(f'Knight_{self.state}_dir{self.direction}.gif') gif = self.animation.get(f'Knight_{self.state}_dir{self.direction}.gif')
return gif, screen_x, screen_y return gif, screen_x, screen_y
@ -61,6 +60,6 @@ class Knight:
def run_to(self, target): def run_to(self, target):
if self.target == target and self.state == "Run": if self.target == target and self.state == "Run":
return return
self.speed = .15 self.speed = .10
self.target = target self.target = target
self.state = "Run" self.state = "Run"

80
main.py

@ -1,13 +1,11 @@
import time import time
import tkinter as tk
import glob import glob
import os import os
import json import json
import pyglet
from Units.knight import Knight from Units.knight import Knight
from Effects.order_click import OrderClick from Effects.order_click import OrderClick
from tkinter import Menu
@ -15,42 +13,54 @@ class IsometricGame:
def __init__(self, width, height, data): def __init__(self, width, height, data):
self.width = width self.width = width
self.height = height self.height = height
self.view_offset_x = 800
self.view_offset_y = 0
self.cell_width = 132 self.cell_width = 132
self.cell_height = 66 self.cell_height = 66
self.cell_selected = (0, 0) self.cell_selected = (0, 0)
self.view_offset_x = 800
self.view_offset_y = 500
self.last_trigger_time = 0 self.last_trigger_time = 0
self.min_interval = 0.5 # Minimum interval in seconds self.min_interval = 0.5 # Minimum interval in seconds
self.effects = [] self.effects = []
# Create a window with a specific size and title
self.window = pyglet.window.Window(width=1920, height=1080, caption='Campo di Battaglia RTS Isometrico')
@self.window.event
def on_draw():
pyglet.gl.glClear(pyglet.gl.GL_COLOR_BUFFER_BIT)
self.draw_battlefield()
self.draw_units()
# self.draw_effects()
@self.window.event
def on_mouse_scroll(x, y, scroll_x, scroll_y):
# Adjust the view offset based on the scroll direction
self.view_offset_y += scroll_y * 70 # Adjust the multiplier as needed
self.editor_mode = False self.editor_mode = False
self.input_lock = False self.input_lock = False
self.window = tk.Tk()
files = sorted(glob.glob("Tiles/**/*.png", recursive=True)) files = sorted(glob.glob("Tiles/**/*.png", recursive=True))
self.tiles = {os.path.splitext(os.path.basename(file))[0]: tk.PhotoImage(file=file) for file in files} self.tiles = {os.path.splitext(os.path.basename(file))[0]: pyglet.sprite.Sprite(pyglet.image.load(file)) for file in files}
# self.battlefield = [[Cell(walkable = True, tile=self.tiles["landscapeTiles_067"] ) for x in range(self.width)] for y in range(self.height)] # self.battlefield = [[Cell(walkable = True, tile=self.tiles["landscapeTiles_067"] ) for x in range(self.width)] for y in range(self.height)]
# use data to create the battlefield # use data to create the battlefield
self.battlefield = [[Cell(walkable = not data[y][x], tile=self.tiles["landscapeTiles_067"] self.battlefield = [[Cell(walkable = not data[y][x], tile=self.tiles["landscapeTiles_067"]
if not data[y][x] else self.tiles["landscapeTiles_066"] if not data[y][x] else self.tiles["landscapeTiles_066"]
) for x in range(self.width)] for y in range(self.height)] ) for x in range(self.width)] for y in range(self.height)]
self.window.title("Campo di Battaglia RTS Isometrico")
# self.canvas.pack()
self.canvas = tk.Canvas(self.window, width=1920, height=1080, bg='black') # self.menu = Menu(self.canvas, tearoff=0)
self.canvas.pack() # self.window.bind('<KeyRelease>', self.on_key_press)
self.menu = Menu(self.canvas, tearoff=0) # self.canvas.bind('<Button-1>', self.on_canvas_click)
self.window.bind('<KeyRelease>', self.on_key_press) # self.canvas.bind('<Button-3>', self.on_canvas_right_click)
self.canvas.bind('<Button-1>', self.on_canvas_click) # self.canvas.bind('<Double-Button-3>', self.on_canvas_double_right_click)
self.canvas.bind('<Button-3>', self.on_canvas_right_click) # self.canvas.bind('<Motion>', self.calculate_coordinates)
self.canvas.bind('<Double-Button-3>', self.on_canvas_double_right_click)
self.canvas.bind('<Motion>', self.calculate_coordinates)
self.knight = Knight(self, (1,1)) self.knight = Knight(self, (1,1))
self.draw_battlefield() # self.draw_battlefield()
def calculate_coordinates(self, event): def calculate_coordinates(self, event):
if self.input_lock: if self.input_lock:
@ -132,6 +142,7 @@ class IsometricGame:
screen_x = (x - y) * self.cell_width / 2 + self.view_offset_x screen_x = (x - y) * self.cell_width / 2 + self.view_offset_x
screen_y = (x + y) * self.cell_height / 2 + self.view_offset_y screen_y = (x + y) * self.cell_height / 2 + self.view_offset_y
return screen_x, screen_y return screen_x, screen_y
min_distance_index = distances.index(min(distances))
def inv_iso_transform(self, screen_x, screen_y): def inv_iso_transform(self, screen_x, screen_y):
x = ((screen_x - self.view_offset_x) / (self.cell_width / 2) + (screen_y - self.view_offset_y) / (self.cell_height / 2)) / 2 x = ((screen_x - self.view_offset_x) / (self.cell_width / 2) + (screen_y - self.view_offset_y) / (self.cell_height / 2)) / 2
@ -144,23 +155,21 @@ class IsometricGame:
return abs(((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5) return abs(((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5)
def draw_battlefield(self): def draw_battlefield(self):
self.canvas.delete("cell") # Pulisce le celle precedenti prima di ridisegnare for y, row in reversed(list(enumerate(self.battlefield))):
self.canvas.delete("cell-label") for x, cell in reversed(list(enumerate(row))):
for y, row in enumerate(self.battlefield):
for x, cell in enumerate(row):
screen_x, screen_y = self.iso_transform(x, y) screen_x, screen_y = self.iso_transform(x, y)
offset = (99 - cell.tile.height()) / 2 cell.tile.x = screen_x
self.canvas.create_image(screen_x, screen_y+45+offset, image=cell.tile, tags="cell") cell.tile.y = screen_y + self.cell_height + self.cell_height/2
if self.editor_mode: cell.tile.draw()
self.canvas.create_text(screen_x, screen_y+45, text=str(cell.elevation), tags="cell_label") #self.canvas.create_image(screen_x, screen_y+45+offset, image=cell.tile, tags="cell")
self.canvas.create_text(screen_x+10, screen_y+45, text=str(int(cell.walkable)), tags="cell_label", fill="white" if cell.walkable else "red")
self.canvas.create_text(screen_x+10, screen_y+35, text=str(int(cell.tile.height())), tags="cell_label", fill="white" if cell.walkable else "red")
def draw_units(self): def draw_units(self):
self.canvas.delete("unit") # Pulisce le unità precedenti prima di ridisegnare
gif, screen_x, screen_y = self.knight.ai() # Calcola la posizione e l'animazione del cavaliere gif, screen_x, screen_y = self.knight.ai() # Calcola la posizione e l'animazione del cavaliere
self.canvas.create_image(screen_x, screen_y+35, image=gif.next_frame(), tags="unit") # Disegna il cavaliere gif.x = screen_x - self.cell_width/2
gif.y = screen_y + height*3
gif.draw()
#self.canvas.create_image(screen_x, screen_y+35, image=gif.next_frame(), tags="unit") # Disegna il cavaliere
def draw_effects(self): def draw_effects(self):
# Pulisce gli effetti precedenti prima di ridisegnare # Pulisce gli effetti precedenti prima di ridisegnare
@ -269,11 +278,6 @@ class IsometricGame:
self.update() self.update()
self.window.mainloop() self.window.mainloop()
def update(self):
#self.draw_battlefield()
self.draw_units()
self.draw_effects()
self.window.after(50, self.update) # Call again after 100 ms
class Cell: class Cell:
def __init__(self, walkable=False, tile=None, elevation=0, offset=0): def __init__(self, walkable=False, tile=None, elevation=0, offset=0):
@ -292,4 +296,4 @@ if __name__ == "__main__":
width = len(data[0]) width = len(data[0])
height = len(data) height = len(data)
game = IsometricGame(width=width, height=height, data=data) game = IsometricGame(width=width, height=height, data=data)
game.run() pyglet.app.run()

2
maze.json

@ -1 +1 @@
[[true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, true], [true, true, true, true, true, false, true, true, true, false, true, false, true, true, true, true, true, false, true, true, true], [true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, false, false, true], [true, false, false, false, true, true, true, true, false, true, true, false, true, false, true, false, true, true, true, false, true], [true, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, true], [true, false, true, true, true, true, true, false, true, false, true, true, true, false, true, true, true, false, true, false, true], [true, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, true], [true, false, true, false, true, true, true, false, true, true, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, true], [true, true, false, false, true, false, true, true, true, false, true, false, false, false, true, false, true, false, true, true, true], [true, false, false, false, true, false, false, false, true, false, false, false, true, false, false, false, true, false, false, false, true], [true, false, false, true, true, true, true, false, true, true, true, false, true, false, true, true, true, false, true, false, true], [true, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, true, false, true, false, true], [true, true, false, false, true, true, true, true, true, false, true, false, true, true, true, false, true, false, true, false, true], [true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, true, false, true, false, true], [true, false, false, true, true, false, true, false, true, false, true, false, false, false, true, true, false, true, true, false, true], [true, false, true, false, false, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, true], [true, false, true, false, true, false, true, false, true, true, true, true, true, true, true, false, true, false, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true], [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]] [[true, true, true, true, true], [true, false, true, false, true], [true, false, false, false, true], [true, false, false, false, true], [true, true, true, true, true]]

2
maze.py

@ -99,5 +99,5 @@ class MazeGenerator:
self.window.mainloop() self.window.mainloop()
# Crea e avvia il generatore di labirinti # Crea e avvia il generatore di labirinti
generator = MazeGenerator(20, 20) generator = MazeGenerator(5, 5)
generator.run() generator.run()

Loading…
Cancel
Save