Opponents enter the field

In diesem update habe ich den ersten Gegner hinzugefügt. Bis jetzt bewegt er sich selbst noch nicht jedoch hat er schon seine Attacke welche natürlich ohne ein System für schaden relativ nutzlos ist. Diese Attacke ist ein ball, bis jetzt ohne Textur, welcher den Spieler verfolgt und nach einer zeit “Explodiert” oder auch bei kontakt mit dem Spieler.

An dem Hit Box Modell muss ich noch arbeiten aber das hat geringe Priorität. Zuerst soll es möglich sein das es mehrere Gegner mit mehreren Attacken geben soll und auch das die Attacken nicht nur beim kontakt mit dem Spieler sondern auch mit den wänden explodieren.

Der Code ist durch doch einige Änderung ziemlich durcheinander geworden weswegen es auch mindestens ein update geben wird in dem ich nicht nur Funktionen hinzufüge sondern auch den Code etwas aufräume.

import tkinter as tk
import time

class MoveCharacter(tk.Canvas):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

        self.ticks = 0
        self.ms = 0

        self.dx = 0
        self.dy = 0

        self.abc = False

        self.text_field()

        self.height = 150
        self.width = 150

        self.start_X = 50
        self.start_Y = 50

        self.x = self.start_X
        self.y = self.start_Y

        # Create the box (character)(posx upper left, posy upper left, posx lower right, posy lower right)
        self.box = self.create_rectangle(self.start_X, self.start_Y, self.height, self.width, fill="black")

        # Set update interval in milliseconds
        self.dt = 100
        # Enemys
        self.enemy()
        self.tick()

    def projectile(self,x,y):
        step = 4
        goal = self.p_center
        goalx_1 = goal[0] + 25
        goalx_2 = goal[0] + 75
        goalx = goal[0] + 50
        goaly_1 = goal[1] + 25
        goaly_2 = goal[1] + 75
        goaly = goaly_1 + 50

        if goalx_1 <= x and goalx_2 >= x:
            if goaly_1 < y and goaly_2 < y:
                self.gradient = -1 * step
                self.gradientx = 0

            elif goaly_1 > y and goaly_2 > y:
                self.gradient = 1 * step
                self.gradientx = 0

        elif goaly_1 <= y and goaly_2 >= y:
            if goalx_1 < x and goalx_2 < x:
                self.gradient = 0
                self.gradientx = -1 * step

            elif goalx_1 > x and goalx_2 > x:
                self.gradient = 0
                self.gradientx = 1 * step

        else:
            if goalx_1 > x and goalx_2 > x:
                self.gradientx = 1 * step
                if goaly_1 < y and goaly_2 < y:
                    Y = goaly - y
                    X = goalx - x
                    self.gradient = (Y / X) * 1
                elif goaly_1 > y and goaly_1 > y:
                    Y = goaly - y
                    X = goalx - x
                    self.gradient = (Y / X) * 1
            elif goalx_1 < x and goalx_2 < x:
                self.gradientx = -1 * step
                if goaly_1 < y and goaly_2 < y:
                    Y = goaly - y
                    X = goalx - x
                    self.gradient = (Y / X) * -1
                elif goaly_1 > y and goaly_2 > y:
                    Y = goaly - y
                    X = goalx - x
                    self.gradient = (Y / X) * -1


        self.gradientx = int(round(self.gradientx))
        self.gradient = int(round(self.gradient)) * step


        if self.gradient > 4:
            self.gradient = 4
        elif self.gradient < -4 and not self.gradient == 0:
            self.gradient = -4

        if self.gradientx > 4:
            self.gradientx = 4
        elif self.gradientx < -4 and not self.gradientx == 0:
            self.gradientx = -4

    def hiter(self):
        goal_L_x = self.p_center[0]
        goal_R_x = self.p_center[0] + 100
        goal_U_y = self.p_center[1]
        goal_B_y = self.p_center[1] + 100

        if self.ticks == self.time_end + 5:
            self.ex = 763
            self.ey = 763
            self.shoot(self.top_leftx,self.top_lefty)

        if self.ticks == self.time_end:
            #self.Object.pop(0)
            self.delete(self.projec)



        if self.ex <= goal_R_x and self.ex >= goal_L_x and self.ey <= goal_B_y and self.ey >= goal_U_y:
            self.delete(self.projec)


    def shoot(self,x,y):
        self.Object = []
        self.projec = self.create_oval(x, y, x + 25, y + 25, fill="red")
        self.Object.append(self.projec)
        self.time_end = self.ticks + 10
        self.abc = True



    def enemy(self):
        self.top_leftx = 750
        self.top_lefty = 750
        self.ex = 763
        self.ey = 763

        #enemy (posx lower right, posy lower right, posx upper left, posy upper left)
        self.enemy = self.create_rectangle(850, 850, self.top_leftx, self.top_lefty, fill="red")
        self.shoot(self.top_leftx,self.top_lefty)

    def counter(self,ticks):
        self.ms = ticks + 1
        if self.ms > 10:
            self.ms = 0
            self.ticks =  self.ticks + 1
        ticks = self.ms

    def hidden_coordination(self, stepx, stepy):
        self.ex = self.ex + stepx
        self.ey = self.ey + stepy
        print(str(self.ex) +":"+ str(self.ey))

    def Dteck_group(self):
        if not Dteck:
            self.move(self.box, self.dx, self.dy)

        if Dteck:
            self.player_coordinats(self.dx, self.dy)

        if not Dteck:
            # Reset the movement after each tick
            self.dx = 0
            self.dy = 0
        self.itemconfig(self.output, text=self.text)

        # Movement handler that gets called every dt milliseconds
    def tick(self):
        self.player_coordinats(self.dx, self.dy)
        wall_check(self.p_center)
        self.Dteck_group()

        if self.abc:
            self.projectile(self.ex, self.ey)
            self.hidden_coordination(self.gradientx, self.gradient)
            self.hiter()
            self.move(self.projec, self.gradientx, self.gradient)

        self.counter(self.ms)


        # Repeatedly call tick method to continue the movement loop
        self.after(self.dt, self.tick)

    # Method to change direction of movement
    def change_heading(self, dx, dy):
        self.dx = dx
        self.dy = dy

    def player_coordinats(self, stepx, stepy):
        self.x = self.x + stepx
        self.y = self.y + stepy

        self.p_center = [self.x , self.y ]
        self.text = "X:" + str(self.x - 50) + " Y: " + str(self.y - 50)

    def text_field(self):
        self.create_rectangle(1000, 950, 0, 1000, fill="brown")
        self.output = self.create_text(
            500, 975,  # x and y coordinates of the text
            text="0, 0",  # Text to display
            font=("Arial", 24, "bold"),  # Font style and size
            fill="black"  # Text color
        )



def main():
    global root,character_canvas
    # Create the main window
    root = tk.Tk()
    root.title("2D Game")
    root.geometry("1080x720")
    root.configure(bg="black")

    # Create the MoveCharacter canvas (size 900x900)
    character_canvas = MoveCharacter(root, width=1000, height=1000, bg="lightblue")
    character_canvas.pack()

    keybindings()

    # Start the main loop
    root.mainloop()

def keybindings():
    global ds
    # Define movement step size
    ds = 100  # Smaller step for smoother movement

    # Bind key presses for movement
    root.bind("<KeyPress-a>", lambda _: character_canvas.change_heading(-ds, 0))  # Move left
    root.bind("<KeyPress-d>", lambda _: character_canvas.change_heading(ds, 0))  # Move right
    root.bind("<KeyPress-w>", lambda _: character_canvas.change_heading(0, -ds))  # Move up
    root.bind("<KeyPress-s>", lambda _: character_canvas.change_heading(0, ds))  # Move down

def wall_check(coords):
    global Dteck
    Dteck = False
    if coords[0] < 50 :
        character_canvas.change_heading(0, 0)
        Dteck = True
        character_canvas.player_coordinats(100,0)


    if coords[0] > 900 :
        character_canvas.change_heading(0, 0)
        Dteck = True
        character_canvas.player_coordinats(-100,0)

    if coords[1] > 900 :
        character_canvas.change_heading(0, 0)
        Dteck = True
        character_canvas.player_coordinats(0,-100)

    if coords[1] < 50 :
        character_canvas.change_heading(0, 0)
        Dteck = True
        character_canvas.player_coordinats(0,100)



    #print(coords)

# Run the program
main()

Leave a Reply

Your email address will not be published. Required fields are marked *