79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
1

Обработка событий: прибить муху мышкой

20.10.2017, 23:21. Показов 581. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу небольшую игрушку. Суть ее заключается в том, что муха "летает" по экрану пользователя (движение задается кривыми Безье),
а пользователь должен ее "прибить" мышкой при этом не давая мухе "сесть", т.е. остановить свое движение.
Если муха села, игра завершается.

Собственно, ближе к делу. Трудность возникает в том, как обработать такое событие.
Текущее координаты мухи на экране вычисляются в цыкле:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
for(var i = 0; i <= shift && flag; i += step)
{
    secondFlag = true;
    var coord = formula.getPointOnCurve(i, points);
        
    context.clearRect(0, 0, 1000, 1000);        
    context.drawImage(picture, coord[0], coord[1]);
            
    canvas.addEventListener('mousemove', function(evt) 
    {
        var mousePos = getMousePos(evt);
                    
                        
        if (Math.abs(mousePos.x - coord[0]) <= 7 && Math.abs(mousePos.y - coord[1]) <= 7)
        {
            cancelAnimationFrame(myReq);
            context.clearRect(0, 0, 1000, 1000);
            context.drawImage(badPicture, coord[0], coord[1]);
            pushScore(score++);
            flag = false;
        }
                    
    });
}
Т.е. здесь вычисляются текущее координаты мухи и координаты мышки, если они совпадают, то муху "убиваем".
Однако такой подход очень плохой, т.к. при нескольких вызовов функции полета мухи, игра начинает лагать.

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

Вот полностью код:
Javascript
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
window.onload = function() {
    
    window.requestAnimationFrame = window.requestAnimationFrame
                               || window.mozRequestAnimationFrame
                               || window.webkitRequestAnimationFrame
                               || window.msRequestAnimationFrame
                               || function(f){return setTimeout(f, 1000/60)}
 
    window.cancelAnimationFrame = window.cancelAnimationFrame
                              || window.mozCancelAnimationFrame
                              || function(requestID){clearTimeout(requestID)} //fall back
    
    var canvas = document.getElementById('bezier');
    var context = canvas.getContext('2d');
    
    
    var formula = {};
 
 
        
    formula.getPointOnLine = function(shift,points){
        return [
            (points[1][0] - points[0][0]) * (shift / 100) + points[0][0],
            (points[1][1] - points[0][1]) * (shift / 100) + points[0][1]
        ];
    };
 
    formula.getPointOnCurve = function(shift,points){
        if(points.length == 2){
            return this.getPointOnLine(shift,points);
        }
        var pointsPP = [];
        for(var i = 1;i < points.length;i++){
            pointsPP.push(this.getPointOnLine(shift,[
                points[i - 1],
                points[i]
            ]));
        }
        return this.getPointOnCurve(shift,pointsPP);
    };
 
        
 
    function getCoordinates()
    {
        var max = 650;
        var min = -150;
            
        return Math.floor(Math.random() * (max - min + 1) + min);
    }
    
    
    var score = 0;
    var life = 3;
    var myReq;
    var flag = true;
    var secondFlag = false;
    
    var started = false;
    var running = false;
    
    
    
    function pushScore(scores)
    {
        var value = document.getElementById("sixthTd");
        value.innerHTML = "Score: " + scores;
    }
    
    function pushLife(lifes)
    {
        var value = document.getElementById("fourthTd");
        value.innerHTML = "Life: " + lifes;
    }
 
    
    
    
    var picture = new Image();
    picture.src = "../images/Mosca_ON.gif";
        
    var badPicture = new Image();
    badPicture.src = "../images/Mosca_OFF.gif";
    
    
    
    var points = [];
        
        function generateCoords()
        {
            var valueXPoint = Math.floor(Math.random() * (700 - 100 + 1) + 100);
            var valueYPoint = Math.floor(Math.random() * (700 - 100 + 1) + 100);
            points = [
                [valueXPoint, valueYPoint],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [getCoordinates(), getCoordinates()],
                [valueXPoint, valueYPoint]
        ];
        }
        
        var shift = 0;
        var step = 1;
        
    function getMousePos(evt)
    {
        //set and store..
        priorEvt = evt = evt || priorEvt;
        //get the bounding rectangle
        var rect = canvas.getBoundingClientRect();
        //lastly, return the x and y coordinates
        if (evt)
            return {
                x: evt.clientX - rect.left,
                y: evt.clientY - rect.top
            };
        return {
            x: 0,
            y: 0
        };
    }
    
    function stop()
    {
        running = false;
        started = false;
        cancelAnimationFrame(myReq);
    }
    
    function mainLoop(timestamp) {
        if (timestamp >= 2500.0)
        {
            
            stop();
            return;
        }
        
        myReq = requestAnimationFrame(mainLoop);
    }
    
    function start()
    {
        if(!started)
        {
            started = true;
            generateCoords();
            myReq = requestAnimationFrame(function (timestamp){
                draw(1);
                running = true;
                myReq = requestAnimationFrame(mainLoop);
            });
        }
    }
    
    function newGame()
    {
        stop();
        secondFlag = false;
        flag = true;
        start();
    }
    
    function draw(timestamp)
    {
        
        context.beginPath();
            
        
        
        if(shift > 100){
            shift = 100;
        }
            
                
 
        for(var i = 0; i <= shift && flag; i += step)
        {
            secondFlag = true;
            var coord = formula.getPointOnCurve(i, points);
        
            context.clearRect(0, 0, 1000, 1000);        
            context.drawImage(picture, coord[0], coord[1]);
            
            canvas.addEventListener('mousemove', function(evt) 
            {
                var mousePos = getMousePos(evt);
                    
                        
                if (Math.abs(mousePos.x - coord[0]) <= 7 && Math.abs(mousePos.y - coord[1]) <= 7)
                {
                    cancelAnimationFrame(myReq);
                    context.clearRect(0, 0, 1000, 1000);
                    context.drawImage(badPicture, coord[0], coord[1]);
                    pushScore(score++);
                    flag = false;
                }
                    
                });
        }
        
        
        if (flag == false)
            newGame();
        
            
        context.stroke();   
        context.closePath();
 
        if(shift <= 100){
            shift += step;
        }
        
        requestAnimationFrame(draw);
        console.log(timestamp);
    
    }
    
    start();
    pushScore(score);
    pushLife(life);
}
HTML5
1
<canvas id = "bezier" width = "700" height = "1000"></canvas>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2017, 23:21
Ответы с готовыми решениями:

Обработка событий щелчка мышкой и не только
итого потихоньку выполняя задание лабораторной работы столкнулся с двумя проблемами: 1) Описание:...

Обработка событий. Механизм делегирования событий
Разработать учебную программу. Основная ее задача – разработка упрощенной имитации поведения...

Ужение на муху.
В общем то, извиняюсь если ошибся разделом, но этот как мне кажется ближе всего по смыслу. Задали...

Работа с мышкой (обработка двойного клика)
доброго вечера! не может подсказать как в си работать с мышкой? а именно подключить. и суметь...

Обработка нажатия мышкой на checkbox независимо от значения .value
Мне надо как то понять, как обработать событие нажатия на checkbox мышкой У меня есть код который...

1
35 / 35 / 45
Регистрация: 26.10.2016
Сообщений: 85
23.10.2017, 19:09 2
Вы используете кривые Безье произвольного порядка или какого-то одного?
Если какого-то одного, то можете воспользоваться формулами для расчета кривой Безье.
Например:
Формула для кривой 2-й степени
Формула для кривой 3-ей степени
Где Pi - опорные точки кривой.
По аналогии можете собрать формулы для более высокого порядка.
0
23.10.2017, 19:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2017, 19:09
Помогаю со студенческими работами здесь

Ковбой Джон попадает в муху
Ковбой Джон попадает в муху на стене с вероятностью 0.8, если стреляет из пристрелянного...

Многократная обработка события при быстром движении мышкой
Подскажите. Вот имеется скрипт(ниже). Он рабочий но работает не так, как хотелось бы. Вообщем когда...

Обработка как одинарного, так и двойного клика мышкой
Здравствуйте! Подскажите, есть у кого-нибудь решение как организовать для одного поля обработку и...

Юзать слона или написать муху?
Дано: - Модуль, поддерживающий работу с HTML, содержащая методы &quot;распарсить&quot; и &quot;скомпилировать&quot;....

Обработка событий
Здравствуйте, уважаемые форумчане. Если приложение состоит из двух форм, можно ли сделать так,...

Обработка событий
Кто сможет помочь с заданием пожалуйста Необходимо: Разработать html-документ с формой,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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