diff --git a/statek.py b/statek.py index b9a0285..05c3714 100644 --- a/statek.py +++ b/statek.py @@ -2,6 +2,7 @@ import math from tkinter import * from tkinter import ttk from random import randrange +import random def obroc_prostokat_o_2_stopnie_zg(canvas, element_id): @@ -96,9 +97,9 @@ def strzal_z_karabinu(): start_x = cx + dlugosc_lufy * math.cos(kat_myszy) start_y = cy + dlugosc_lufy * math.sin(kat_myszy) - predkosc_karabinu = 12 - dx = predkosc_karabinu * math.cos(kat_myszy) - dy = predkosc_karabinu * math.sin(kat_myszy) + predkosc_karabinu = 11 + dx = predkosc_karabinu * math.cos(kat_myszy) + random.uniform(-0.8, 0.8) + dy = predkosc_karabinu * math.sin(kat_myszy) + random.uniform(-0.8, 0.8) r_karabinu = 1 id_karabinu = canvas.create_oval(start_x - r_karabinu, start_y - r_karabinu, start_x + r_karabinu, start_y + r_karabinu, fill="black", outline="") @@ -137,41 +138,122 @@ def cele_ruch(): x1, y1, x2, y2, x3, y3, x4, y4 = canvas.coords(dul) celx = int((x1 + x2 + x3 + x4) / 4) cely = int((y1 + y2 + y3 + y4) / 4) - + krok_x = 0 + krok_y = 0 for idx, c in enumerate(cele): - krok_x=0 - krok_y=0 dx = celx - c["dul"]["x1"] dy = cely - c["dul"]["y1"] odleglosc_kwadrat = dx ** 2 + dy ** 2 - if odleglosc_kwadrat > 40000: + if c.get("omijanie", 0) > 0: + c["omijanie"] -= 1 + krok_x = c["boczny_x"] + krok_y = c["boczny_y"] + + canvas.move(c["wieza"]["id"], krok_x, krok_y) + canvas.move(c["lufa"]["id"], krok_x, krok_y) + canvas.move(c["dul"]["id"], krok_x, krok_y) + + c["dul"]["x1"] += krok_x + c["dul"]["x2"] += krok_x + c["dul"]["y1"] += krok_y + c["dul"]["y2"] += krok_y + + elif odleglosc_kwadrat > 40000: odleglosc = math.sqrt(odleglosc_kwadrat) predkosc = 1.0 krok_x = (dx / odleglosc) * predkosc krok_y = (dy / odleglosc) * predkosc + canvas.move(c["dul"]["id"], krok_x, krok_y) c["dul"]["x1"] += krok_x c["dul"]["x2"] += krok_x c["dul"]["y1"] += krok_y c["dul"]["y2"] += krok_y + canvas.move(c["wieza"]["id"], krok_x, krok_y) + canvas.move(c["lufa"]["id"], krok_x, krok_y) + wspol = canvas.coords(c["dul"]["id"]) + if len(wspol) < 8: + return + + xs = [wspol[i] for i in range(0, len(wspol), 2)] + ys = [wspol[i] for i in range(1, len(wspol), 2)] + cx = sum(xs) / len(xs) + cy = sum(ys) / len(ys) + + promien_czolgu = 18 + + for k in kamycki: + kx_srodek = k["x"] + (k["pr"] / 2) + ky_srodek = k["y"] + (k["pr"] / 2) + odleglosc_kamyka = math.sqrt((cx - kx_srodek) ** 2 + (cy - ky_srodek) ** 2) + min_odleglosc = promien_czolgu + (k["pr"] / 2) + + if odleglosc_kamyka < min_odleglosc: + + nakladanie = min_odleglosc - odleglosc_kamyka + kat = math.atan2(cy - ky_srodek, cx - kx_srodek) + + odbicie_x = nakladanie * math.cos(kat) + odbicie_y = nakladanie * math.sin(kat) + + canvas.move(c["dul"]["id"], odbicie_x, odbicie_y) + canvas.move(c["wieza"]["id"], odbicie_x, odbicie_y) + canvas.move(c["lufa"]["id"], odbicie_x, odbicie_y) + + c["dul"]["x1"] += odbicie_x + c["dul"]["x2"] += odbicie_x + c["dul"]["y1"] += odbicie_y + c["dul"]["y2"] += odbicie_y + c["hp"] -= 1 + if randrange(0, 2) == 1: + c["boczny_x"] = math.sin(kat) + c["boczny_y"] = -math.cos(kat) + else: + c["boczny_x"] = -math.sin(kat) + c["boczny_y"] = math.cos(kat) + c["omijanie"] = 35 + break + c["ip"].place(x=c["dul"]["x1"] + 2.5, y=c["dul"]["y1"] - 10) c["ip"]['value'] = c["hp"] cx = (c["dul"]["x1"] + c["dul"]["x2"]) / 2 cy = (c["dul"]["y1"] + c["dul"]["y2"]) / 2 - dlugosc_lufy = c["lufa"]["wiel"] - dx = celx - cx - dy = cely - cy - kat_czolgu = math.atan2(dy, dx) + dx_celu = celx - cx + dy_celu = cely - cy + kat_czolgu = math.atan2(dy_celu, dx_celu) + lx = cx + dlugosc_lufy * math.cos(kat_czolgu) ly = cy + dlugosc_lufy * math.sin(kat_czolgu) canvas.coords(c["lufa"]["id"], cx, cy, lx, ly) + if odleglosc_kwadrat < 160000 and not c["karabiny"]["czyprze"] and c["karabiny"]["mag"] > 0: + c["karabiny"]["mag"] -= 1 + dlugosc_wylotu = 8 + start_x = cx + dlugosc_wylotu * math.cos(kat_czolgu) + start_y = cy + dlugosc_wylotu * math.sin(kat_czolgu) - canvas.move(c["wieza"]["id"],krok_x,krok_y) + predkosc_karabinu = 11 + bullet_dx = predkosc_karabinu * math.cos(kat_czolgu) + random.uniform(-0.8, 0.8) + bullet_dy = predkosc_karabinu * math.sin(kat_czolgu) + random.uniform(-0.8, 0.8) + + r_karabinu = 1 + id_karabinu = canvas.create_oval(start_x - r_karabinu, start_y - r_karabinu, start_x + r_karabinu, start_y + r_karabinu, fill="black", outline="") + + karabiny.append({"id": id_karabinu, "dx": bullet_dx, "dy": bullet_dy}) + + if c["karabiny"]["mag"] == 0: + c["karabiny"]["czyprze"] = True + if c["karabiny"]["czyprze"]: + c["karabiny"]["prze"] += 1 + + if c["karabiny"]["prze"] >= 80: + c["karabiny"]["czyprze"] = False + c["karabiny"]["prze"] = 0 + c["karabiny"]["mag"] = 80 def aktualizuj_karabiny(): - global cele_zniszczone + global cele_zniszczone, hp, hpbar szerokosc_okna = canvas.winfo_width() wysokosc_okna = canvas.winfo_height() @@ -180,7 +262,9 @@ def aktualizuj_karabiny(): cele_do_usuniecia = [] for i in range(len(karabiny) - 1, -1, -1): p = karabiny[i] - canvas.move(p["id"], p["dx"], p["dy"]) + dx = p["dx"] + dy = p["dy"] + canvas.move(p["id"], dx, dy) coords = canvas.coords(p["id"]) if coords: @@ -188,7 +272,6 @@ def aktualizuj_karabiny(): if px < 0 or px > szerokosc_okna or py < 0 or py > wysokosc_okna: pociski_do_usuniecia.append(i) continue - for idx, j in enumerate(kamycki): if j["x"] <= px <= j["x"] + j["pr"] and j["y"] <= py <= j["y"] + j["pr"]: pociski_do_usuniecia.append(i) @@ -203,6 +286,11 @@ def aktualizuj_karabiny(): if c["hp"] <= 0: cele_do_usuniecia.append(idx) break + wym = canvas.coords(dul) + if min(wym[0], wym[2], wym[4], wym[6]) < px < max(wym[0], wym[2], wym[4], wym[6]) and min(wym[1], wym[3], wym[5], wym[7]) < py < max(wym[1], wym[3], wym[5], wym[7]): + hp -= 0.01 + hpile["text"] = str(int(hp)) + hpbar['value'] = hp cele_do_usuniecia.sort(reverse=True) for idx in cele_do_usuniecia: @@ -226,9 +314,7 @@ def aktualizuj_karabiny(): root.after(1000, lambda wid2=wybuch_id2: canvas.delete(wid2)) root.after(1500, lambda wid3=wybuch_id3: canvas.delete(wid3)) root.after(3000, lambda wid4=wybuch_id4: canvas.delete(wid4)) - slad_id = canvas.create_rectangle(srodek_x - 15, srodek_y - 10, - srodek_x + 15, srodek_y + 10, - fill="black", outline="") + slad_id = canvas.create_rectangle(srodek_x - 15, srodek_y - 10, srodek_x + 15, srodek_y + 10, fill="black", outline="") canvas.tag_lower(slad_id) canvas.delete(c["dul"]["id"]) @@ -300,7 +386,7 @@ def misja(): hp_wrog_id['value'] = 10 long = randrange(5, 20) lufa_id = canvas.create_line(cx + 15, cy + 10, cx + long + 15, cy + 10, width=long / 5) - cele.append({"dul":{"id": wrog_id, "x1": cx, "y1": cy, "x2": cx + 30, "y2": cy + 20}, "hp": 60, "ip": hp_wrog_id, "lufa": {"id": lufa_id, "x": 0, "y": 0, "wiel": long}}) + cele.append({"dul": {"id": wrog_id, "x1": cx, "y1": cy, "x2": cx + 30, "y2": cy + 20}, "hp": 60, "ip": hp_wrog_id, "lufa": {"id": lufa_id, "x": 0, "y": 0, "wiel": long}, "wieza": {"id": wieza_id, "pro": promien_kola}, "karabiny": {"mag": 80, "prze": 100, "czyprze": False}, "omijanie": 0, "boczny_x": 0.0, "boczny_y": 0.0}) def aktualizuj_pociski(): @@ -404,7 +490,6 @@ def sprawdz_kolizje_czolgu(): promien_czolgu = 18 for k in kamycki: - kx_srodek = k["x"] + (k["pr"] / 2) ky_srodek = k["y"] + (k["pr"] / 2) odleglosc = math.sqrt((cx - kx_srodek) ** 2 + (cy - ky_srodek) ** 2) @@ -678,10 +763,9 @@ for i in range(cel_wymagany): long = randrange(5, 20) lufa_id = canvas.create_line(cx + 15, cy + 10, cx + long + 15, cy + 10, width=long / 5) promien_kola = long / 2 - wieza_id = canvas.create_oval(cx - promien_kola+15, cy - promien_kola+10, cx + promien_kola+15, cy + promien_kola+10, fill="red3", outline="black") - canvas.tag_lower(wieza_id,lufa_id) - cele.append({"dul": {"id": wrog_id, "x1": cx, "y1": cy, "x2": cx + 30, "y2": cy + 20}, "hp": 60, "ip": hp_wrog_id, "lufa": {"id": lufa_id, "x": 0, "y": 0, "wiel": long}, - "wieza": {"id": wieza_id, "pro": promien_kola}}) + wieza_id = canvas.create_oval(cx - promien_kola + 15, cy - promien_kola + 10, cx + promien_kola + 15, cy + promien_kola + 10, fill="red3", outline="black") + canvas.tag_lower(wieza_id, lufa_id) + cele.append({"dul": {"id": wrog_id, "x1": cx, "y1": cy, "x2": cx + 30, "y2": cy + 20}, "hp": 60, "ip": hp_wrog_id, "lufa": {"id": lufa_id, "x": 0, "y": 0, "wiel": long}, "wieza": {"id": wieza_id, "pro": promien_kola}, "karabiny": {"mag": 80, "prze": 100, "czyprze": False}, "omijanie": 0, "boczny_x": 0.0, "boczny_y": 0.0}) kamycki = [] for i in range(60): @@ -692,6 +776,24 @@ for i in range(60): t = canvas.create_oval(kax, kay, kax + wt, kay + wt, fill=ka, outline="") canvas.tag_lower(t) kamycki.append({"id": t, "x": kax, "y": kay, "pr": wt}) +x = randrange(0, 1900) +y = randrange(0, 1000) +bunkier = [] +for j in range(8): + for i in range(100): + bunkier.append([x + (j * 2), y + (i * 2) - 100]) +for i in range(140): + bunkier.append([x + randrange(-10, 1), y + randrange(-100, 100)]) +for i in range(140): + bunkier.append([x + randrange(16, 26), y + randrange(-100, 100)]) + +for x, y in bunkier: + ka = "grey" + str(randrange(30, 40)) + wt = 3 + t = canvas.create_oval(x, y, x + wt, y + wt, fill=ka, outline="") + canvas.tag_lower(t) + kamycki.append({"id": t, "x": x, "y": y, "pr": wt}) +x = 0 for i in range(1600): trxx = randrange(0, 1900)