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()