С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: Tkinter
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 33
1

Движение шарика по холсту в том направлении куда кликает пользователь, добавить изменение цвета при отталкивании от стен

15.05.2022, 13:47. Показов 1043. Ответов 1

Author24 — интернет-сервис помощи студентам
Здравствуйте! Реализовал данную задачу: движение шарика в том направлении куда кликает пользователь, и хотелось бы чтобы он менял цвет при отталкивании от стенок. Не подскажите как это реализовать? Весьма буду признателен.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
from tkinter import Tk, Canvas
import math
 
 
class GameBall:
    def __init__(self, width=400, height=400):
        self.vx = 1
        self.vy = 1
        self.t = 0
        self.dt = 1
        self.i = 0
        self.height = height
        self.width = width
        self.c = Canvas(root, width=self.width, height=self.height, bg="white")
        self.c.pack()
        self.rad = 20
        self.ball = self.c.create_oval(self.width // 2 - self.rad, self.height // 2 - self.rad,
                                       self.width // 2 + self.rad, self.height // 2 + self.rad, fill='green')
 
        self.c.bind('<Button-1>', self.onclick)
        root.after(10, self.onframe)
 
    def onclick(self, event):
        self.p = self.c.coords(self.ball)
        self.dx = event.x - self.p[0]
        self.dy = event.y - self.p[1]
 
        self.r = math.sqrt(self.dx ** 2 + self.dy ** 2)
 
        self.vx = self.dx / self.r
        self.vy = self.dy / self.r
 
        self.t += self.dt
        self.p[0] += self.vx + 10
        self.p[1] += self.vy + 10
 
        if 200 > self.dx >= 100 or 200 > self.dy >= 100 or -200 < self.dx <= -100 or -200 < self.dy <= -100:
            self.dt = 2
        elif 300 > self.dx >= 200 or 300 > self.dy >= 200 or -300 < self.dx <= -200 or -300 < self.dy <= -200:
            self.dt = 4
        elif 500 > self.dx >= 300 or 500 > self.dy >= 300 or -500 < self.dx <= -300 or -500 < self.dy <= -300:
            self.dt = 7
        elif self.dx >= 500 or self.dy >= 500 or self.dx <= -500 or self.dy <= -500:
            self.dt = 10
        else:
            self.dt = 1
        print(self.dx, self.dy, self.dt)
 
    def onframe(self):
        self.c.move(self.ball, self.dt * self.vx, self.dt * self.vy)
        self.p = self.c.coords(self.ball)
 
        if self.p[1] < 0 or self.p[1] > self.height - 2 * self.rad:
            self.vy = -self.vy
 
        if self.p[0] < 0 or self.p[0] > self.width - 2 * self.rad:
            self.vx = -self.vx
 
        root.after(10, self.onframe)
 
 
if __name__ == '__main__':
    root = Tk()
    root.resizable(False, False)
    GameBall()
    root.mainloop()
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2022, 13:47
Ответы с готовыми решениями:

Изменить цвет шарика на случайный при отталкивании от стены
Нужно изменить цвет шарика на случайный цвет каждый раз, когда он попадает в стену. Я пытался...

Изменение цвета в обратном направлении при зажатом shift
Нужно чтобы в &quot;private void button3_Click(object sender, EventArgs e) // Меняет цвета&quot; при зажатом...

Как дать силу в том направлении, куда смотрит другой объект?
Есть два объекта, к одному из них нужно добавить силу в направлении куда смотрит другой объект(в...

Запрограммируйте постепенное движение фигуры в ту точку холста, где пользователь кликает левой кнопкой мыши
Описание задачи: **В данной программе создается анимация круга, который движется от левой границы...

1
1552 / 727 / 316
Регистрация: 02.05.2020
Сообщений: 1,617
16.05.2022, 13:41 2
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from tkinter import Tk, Canvas
import math
import random
class GameBall:
    def __init__(self, width=400, height=400):
        self.vx = 1
        self.vy = 1
        self.t = 0
        self.dt = 1
        self.i = 0
        self.height = height
        self.width = width
        self.c = Canvas(root, width=self.width, height=self.height, bg="white")
        self.c.pack()
        self.rad = 20
        self.ball = self.c.create_oval(self.width // 2 - self.rad, self.height // 2 - self.rad,
                                       self.width // 2 + self.rad, self.height // 2 + self.rad, fill='green')
        self.c.bind('<Button-1>', self.onclick)
        root.after(10, self.onframe)
 
    def onclick(self, event):
        self.p = self.c.coords(self.ball)
        self.dx = event.x - self.p[0]
        self.dy = event.y - self.p[1]
 
        self.r = math.sqrt(self.dx ** 2 + self.dy ** 2)
 
        self.vx = self.dx / self.r
        self.vy = self.dy / self.r
 
        self.t += self.dt
        self.p[0] += self.vx + 10
        self.p[1] += self.vy + 10
 
        if 200 > self.dx >= 100 or 200 > self.dy >= 100 or -200 < self.dx <= -100 or -200 < self.dy <= -100:
            self.dt = 2
        elif 300 > self.dx >= 200 or 300 > self.dy >= 200 or -300 < self.dx <= -200 or -300 < self.dy <= -200:
            self.dt = 4
        elif 500 > self.dx >= 300 or 500 > self.dy >= 300 or -500 < self.dx <= -300 or -500 < self.dy <= -300:
            self.dt = 7
        elif self.dx >= 500 or self.dy >= 500 or self.dx <= -500 or self.dy <= -500:
            self.dt = 10
        else:
            self.dt = 1
        print(self.dx, self.dy, self.dt)
 
    def changeColor(self):
        color = ("#"+
                ("%02x"%random.randint(0,255)) + 
                ("%02x"%random.randint(0,255)) +
                ("%02x"%random.randint(0,255)))
        self.c.itemconfigure(self.ball, fill=color)
 
    def onframe(self):
        self.c.move(self.ball, self.dt * self.vx, self.dt * self.vy)
        self.p = self.c.coords(self.ball) 
        if self.p[1] < 0 or self.p[1] > self.height - 2 * self.rad:
            self.vy = -self.vy
            self.changeColor()
        if self.p[0] < 0 or self.p[0] > self.width - 2 * self.rad:
            self.vx = -self.vx
            self.changeColor()
        root.after(10, self.onframe)
 
if __name__ == '__main__':
    root = Tk()
    root.resizable(False, False)
    GameBall()
    root.mainloop()
0
16.05.2022, 13:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2022, 13:41
Помогаю со студенческими работами здесь

Формы с шариками: изменение цвета шарика (Найти ошибку в коде)
Ребята, боги программирования, помогите найти ошибку. крч суть в проги: есть 2 окна и в каждом...

Рисование. Изменение размера, изменение цвета, масштабирование и движение объекта с помощью клавиатуры
Делаю задания по графике, основную часть разработал, а вот с последующим выполнением задания беда...

Появление картинки в том месте, куда нажал пользователь
Ну добавление картинки и задание ее координат не проблема, а как найти эти координаты точки, в...

Задаю координаты, но кликает не в том месте
Здарова! Ситуация- я задал координаты элемента на экране монитора, по которому нужно эмулировать...

Составить сомощью модуля Graph полет теннисного шарика и отскакивание от стен.
Составить сомощью модуля Graph полет теннисного шарика и отскакивание от стен. Добавлено через 3...

Интересует расчет угла отскока шарика от горизонтальных, вертикальных и произвольных стен
интересует расчет угла отскока шарика от горизонтальных, вертикальных и произвольных стен, угол...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru