7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 356
1

Игра на JS

28.10.2022, 00:14. Показов 1476. Ответов 16

Author24 — интернет-сервис помощи студентам
Создать игру: есть чайники разных цветов , выбрать одного одинакого цвета. Т.е 1 уровень выбрать чайники чёрного цвета, второй уровень выбрать все чайники зелёного цвета. Можете посмотреть правильно ли получается, и как сделать клик в этой игре по нужному цвету чайника? Помогите пожалуйста
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
var cvs = document.getElementById("canvas");
var ctx = cvs.getContext("2d");
 
var mug_black = new Image(); //кружка чёрн цвета
var mug_green = new Image(); //кружка зел цвета
var mug_orange = new Image(); //кружка зел цвета
 
 
var bg = new Image(); //задний фон
 
mug_black.src = "img/mug_black_1.jpg";
mug_green.src = "img/mug_green.png";
mug_orange.src = "img/mug_orange.png";
 
bg.src = "img/bg.jpg";
//отрисовываем объекты в функции
function draw() {
    ctx.drawImage(bg, 0, 0);
    ctx.drawImage(mug_black, 0, 0);
    ctx.drawImage(mug_black, 205, 0);
    ctx.drawImage(mug_green, 410, 0);
    ctx.drawImage(mug_orange, 0, 184);
    ctx.drawImage(mug_green, 205, 184);
    ctx.drawImage(mug_orange, 410, 184);
    ctx.drawImage(mug_black, 0, 368);
    ctx.drawImage(mug_orange, 205, 368);
    ctx.drawImage(mug_green, 410, 368);
 
    requestAnimationFrame(draw);
}
 
draw();
Миниатюры
Игра на JS  
Вложения
Тип файла: rar web4_lb.rar (44.5 Кб, 8 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2022, 00:14
Ответы с готовыми решениями:

Создать иерархию классов игра – спортивная игра – волейбол
Создать иерархию классов игра – спортивная игра – волейбол.Определить конструкторы, деструктор,...

Создать иерархию классов игра – спортивная игра – волейбол
Создать иерархию классов игра – спортивная игра – волейбол. Определить конструкторы, деструктор,...

Бюджет 4500 гр. Конфигурация работа в Office, AutoCAD, игра Assassin, онлайн игра World of Tanks
Собираю компьютер для сестры. Основные требования: работа в Microsoft Office, AutoCAD, игра...

Игра в загадки. Загадать загадку. Если ответ верен – поздравить пользователя. Затем сообщить, что игра окончена.
Всем привет! Меня зовут VitoScaletta, совсем недавно начал обучаться JS, но очень тяжело в голову...

Игра в «Одиннадцать предметов», игра Баше.
прошу помощи в создании программы! Разработать программную модель следующей игры двух...

16
88 / 40 / 10
Регистрация: 28.10.2022
Сообщений: 55
28.10.2022, 21:32 2
Javascript
1
2
3
4
5
cvs.addEventListener('mousedown', function(event) {
    var targetX = event.x;
    var targetY = event.y;
    alert('mousedown');
  }, false);
так вешается событие на канвас event.x и event.у не уверен в этих значениях через отладчик посмотрите какие координаты будите снимать с события мыши
далее создаёте объект:
Javascript
1
2
3
4
var assets = [  {name: 'mug_black_1',  path: "img/mug_black_1.jpg", x:0, y:0},
        {name: 'mug_green_1',  path: "img/mug_green.png",   x:205, y:0},
        {name: 'mug_orange_1', path: "img/mug_orange.png",  x:0, y:184},
    ];
У вас объектов будет больше каждая кружка == отдельный объект со своими координатами и именем, поле path общее(это ссылка на картинку)
Далее создаёте цикл внутри функции кода события который будет брать targetX и targetY события(положения курсора мыши при клике) и сравнивать с положением кружки
т.к. кружка это объект который имеет свою ширину и высоту, то соответственно вам надо описать границы кружки для клика т.е.:
Код
{name: 'mug_green_1',  path: "img/mug_green.png",   x:205, y:184}
х1 = х начальное положение 205
у1 = у начальное положение 184
х2 = х+ширина = 205+ширина картинки
у2 = у+высота = 184+высота картинки
делаете условие на подобии при котором проверяете совпадают ли координаты мыши с точками внутри картинки примерно такое условие:
Javascript
1
2
3
if(targetX >= x1 && targetX <= x2 && targetY >= у1 && targetY <= у2 ) {
    alert("верная картинка!")
}
В целом код поиска координат можно вынести в отдельную функцию и всё перебираете массив с кружками сравнивая их координаты с координатами клика
В теории это будет работать и весьма не плохо
p.s. значения размера картинки вы можете помещать в объект руками или же брать из mug_black.width и mug_black.height чисто технически эти параметры должны там быть
2
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,310
Записей в блоге: 147
29.10.2022, 18:47 3
Я использую элемент <canvas> в контексте "webgl" вместо "2d":

Javascript
1
2
// Получаем контекст рисования WebGL
const gl = document.getElementById("renderCanvas").getContext("webgl");
Через этот контекст доступны функции рисования из OpenGL ES 2.0 для рисования в 2D и 3D. Например, так можно задать цвет холста и очистить холст заданным цветом:

Javascript
1
2
3
4
5
// Выставляем цвет холста серым с оттенком синего
gl.clearColor(0.9, 0.9, 0.95, 1);
 
// Очищаем холст заданным цветом
gl.clear(gl.COLOR_BUFFER_BIT);
Если заинтересует такой вариант, то советую книгу на русском из первого сообщения темы: Небольшие примеры на WebGL. Лучше читать сразу на английском, он в книге довольно простой: WebGL Programming Guide. Matsuda & Lea. По предыдущим ссылкам можно скачать архив с примерами к книге и запустить примеры в песочнице JSFiddle (через VPN). В книге используется самописная библиотека для работы с векторами и матрицами. Лучше взять намного более продвинутую glMatrix, которая всю необходимую линейную алгебру, включая очень полезные операции с кватернионами.

Один из самых распространённых способов на WebGL/OpenGL детектирования клика по объекту - это задание каждому объекту идентификатора по цвету. Если объектов не очень много, то проще для начала брать такие комбинации как: (1, 0, 0), (0, 1, 0), (1, 1, 0) т.д.

Так выглядит вершинный шейдер для этого метода:

glSlang
1
2
3
4
5
6
7
8
9
10
11
12
precision mediump float;
uniform vec3 uColor;
uniform bool uClick;
uniform vec3 uPickColor;
 
void main() {
    if (!uClick) {
        gl_FragColor = vec4(uColor, 1.0);
    } else {
        gl_FragColor = vec4(uPickColor, 1.0);
    }
}
Если объект рисуется в обычном штатном режиме, то uClick == false и объект рисуется с заданным цветом (или с заданной текстурой). А если произошёл клик, то перед рисованием нужно отправить в uClick значение false и отправить цвет для детектирования, например красный: (1, 0, 0). Также нарисовать все остальные объекты - каждый со своим "Color ID", то есть идентификатором цвета. С помощью функции gl.readPixels(pickX, pickY, 1, 1, ...); нужно считать значение пикселя по координатам клика. Координаты для gl.readPixels должны быть относительно левого нижнего угла холста:

Javascript
1
2
const pixels = new Uint8Array(4);
gl.readPixels(pickX, pickY, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
По полученным значениям RGB можно установить по какому объекту был клик. Далее выставляем uColor в false и вызываем функцию рисования всех объектов в штатом режиме, где они рисуются с их цветами (или текстурами), а пользователь не видит, что он до этого были нарисованы с помощью идентификаторов цвета.

Пример в песочницах:

Пример в блоге: Определение клика мыши по объекту на JavaScript, TypeScript, WebGL, C# и OpenGL 3.1

Название: select-object-by-click-webgl-js.gif
Просмотров: 1168

Размер: 179.5 Кб

index.html

PHP/HTML
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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
<!DOCTYPE html>
 
<body>
 
    <head>
        <title>Pick object by click. WebGL, JavaScript</title>
 
        <script src="https://cdn.jsdelivr.net/npm/gl-matrix@3.4.3/gl-matrix-min.js"></script>
 
        <style>
            #renderCanvas {
                position: absolute;
            }
 
            #outputEN {
                position: absolute;
                top: 210px;
                left: 20px;
            }
 
            #outputRU {
                position: absolute;
                top: 235px;
                left: 20px;
            }
 
            #outputCH {
                position: absolute;
                top: 260px;
                left: 20px;
            }
 
            #outputPinyin {
                position: absolute;
                top: 285px;
                left: 20px;
            }
        </style>
    </head>
 
    <body>
        <div>
            <canvas id="renderCanvas" width="300" height="300"></canvas>
            <span id="outputEN">Click on any object or outside</span>
            <span id="outputRU">Кликните на любой объект или мимо</span>
            <span id="outputCH">单击任何对象或外部</span>
            <span id="outputPinyin">Dān jí rènhé duìxiàng huò wàibù</span>
        </div>
 
        <script id="vertexShader" type="x-shader/x-vertex">
            attribute vec2 aPosition;
            uniform mat4 uMvpMatrix;
 
            void main() {
                gl_Position = uMvpMatrix * vec4(aPosition, 0.0, 1.0);
            }
        </script>
 
        <script id="fragmentShader" type="x-shader/x-fragment">
            precision mediump float;
            uniform vec3 uColor;
            uniform bool uClick;
            uniform vec3 uPickColor;
 
            void main() {
                if (!uClick) {
                    gl_FragColor = vec4(uColor, 1.0);
                } else {
                    gl_FragColor = vec4(uPickColor, 1.0);
                }
            }
        </script>
 
        <script>
            const gl = document.getElementById("renderCanvas").getContext("webgl");
 
            const outputEN = document.getElementById("outputEN");
            const outputRU = document.getElementById("outputRU");
 
            const vShader = gl.createShader(gl.VERTEX_SHADER);
            const vSrc = document.getElementById("vertexShader").firstChild.textContent;
            gl.shaderSource(vShader, vSrc);
            gl.compileShader(vShader);
            let ok = gl.getShaderParameter(vShader, gl.COMPILE_STATUS);
            if (!ok) {
                console.log("vert: " + gl.getShaderInfoLog(vShader));
            };
 
            const fShader = gl.createShader(gl.FRAGMENT_SHADER);
            const fSrc = document.getElementById("fragmentShader").firstChild.textContent;
            gl.shaderSource(fShader, fSrc);
            gl.compileShader(fShader);
            ok = gl.getShaderParameter(fShader, gl.COMPILE_STATUS);
            if (!ok) {
                console.log("frag: " + gl.getShaderInfoLog(fShader));
            };
 
            const program = gl.createProgram();
            gl.attachShader(program, vShader);
            gl.attachShader(program, fShader);
            gl.linkProgram(program);
            ok = gl.getProgramParameter(program, gl.LINK_STATUS);
            if (!ok) {
                console.log("link: " + gl.getProgramInfoLog(program));
            };
            gl.useProgram(program);
 
            const vertPositions = [
                -0.5, -0.5,
                -0.5, 0.5,
                0.5, -0.5,
                0.5, 0.5
            ];
            const vertPosBuffer = gl.createBuffer();
            gl.bindBuffer(gl.ARRAY_BUFFER, vertPosBuffer);
            gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertPositions), gl.STATIC_DRAW);
            const aPositionLocation = gl.getAttribLocation(program, "aPosition");
            gl.vertexAttribPointer(aPositionLocation, 2, gl.FLOAT, false, 0, 0);
            gl.enableVertexAttribArray(aPositionLocation);
 
            const modelMatrix = glMatrix.mat4.create();
            const mvpMatrix = glMatrix.mat4.create();
 
            const projMatrix = glMatrix.mat4.create();
            glMatrix.mat4.ortho(projMatrix, -0.5, 2.5, 2.5, -0.5, 10, -10);
 
            const viewMatrix = glMatrix.mat4.create();
            glMatrix.mat4.lookAt(viewMatrix, [0, 0, 10], [0, 0, 0], [0, 1, 0]);
 
            const projViewMatrix = glMatrix.mat4.create();
            glMatrix.mat4.mul(projViewMatrix, projMatrix, viewMatrix);
 
            const uMvpMatrixLocation = gl.getUniformLocation(program, "uMvpMatrix");
            const uColorLocation = gl.getUniformLocation(program, "uColor");
            const uClickLocation = gl.getUniformLocation(program, "uClick");
            const uPickColorLocation = gl.getUniformLocation(program, "uPickColor");
 
            gl.uniform1i(uClickLocation, 0);
 
            const firstObj = {
                pos: glMatrix.vec3.fromValues(0, 0, 0),
                scale: glMatrix.vec3.fromValues(0.7, 0.7, 1),
                color: glMatrix.vec3.fromValues(0.50, 0.84, 0.22)
            };
 
            const secondObj = {
                pos: glMatrix.vec3.fromValues(1, 0, 0),
                scale: glMatrix.vec3.fromValues(0.7, 0.7, 1),
                color: glMatrix.vec3.fromValues(0.07, 0.59, 0.09)
            };
 
            const thirdObj = {
                pos: glMatrix.vec3.fromValues(2, 0, 0),
                scale: glMatrix.vec3.fromValues(0.7, 0.7, 1),
                color: glMatrix.vec3.fromValues(0.12, 0.88, 0.48)
            };
 
            const fourthObj = {
                pos: glMatrix.vec3.fromValues(0, 1, 0),
                scale: glMatrix.vec3.fromValues(0.7, 0.7, 1),
                color: glMatrix.vec3.fromValues(0.65, 0.37, 0.07)
            };
 
            const pickColors = {
                first: glMatrix.vec3.fromValues(255, 0, 0),
                second: glMatrix.vec3.fromValues(0, 255, 0),
                third: glMatrix.vec3.fromValues(0, 0, 255),
                fourth: glMatrix.vec3.fromValues(255, 255, 0)
            };
 
            gl.canvas.onmousedown = (e) => {
                // Get coordinates of mouse pick
                const rect = gl.canvas.getBoundingClientRect();
                const mouseX = e.clientX - rect.left;
                const mouseY = e.clientY - rect.top;
                const pickX = mouseX;
                const pickY = rect.bottom - rect.top - mouseY - 1;
                // console.log("mouse pick coords:", pickX, pickY);
 
                // Set the click flag and color id
                gl.uniform1i(uClickLocation, 1);
                gl.clearColor(0, 0, 0, 1);
                gl.clear(gl.COLOR_BUFFER_BIT);
 
                // Draw objects for picking
                gl.uniform3fv(uPickColorLocation, pickColors.first);
                glMatrix.mat4.fromTranslation(modelMatrix, firstObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, firstObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                gl.uniform3fv(uPickColorLocation, pickColors.second);
                glMatrix.mat4.fromTranslation(modelMatrix, secondObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, secondObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                gl.uniform3fv(uPickColorLocation, pickColors.third);
                glMatrix.mat4.fromTranslation(modelMatrix, thirdObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, thirdObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                gl.uniform3fv(uPickColorLocation, pickColors.fourth);
                glMatrix.mat4.fromTranslation(modelMatrix, fourthObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, fourthObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                const pixels = new Uint8Array(4);
                gl.readPixels(pickX, pickY, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
                // console.log("pick color:", pixels[0], pixels[1], pixels[2], pixels[3]);
                const pickResult = glMatrix.vec3.fromValues(pixels[0], pixels[1], pixels[2]);
 
                let messageEN = "";
                let messageRU = "";
                let messageCH = "";
                let messagePinyin = "";
                if (glMatrix.vec3.exactEquals(pickResult, pickColors.first)) {
                    messageEN = "First object";
                    messageRU = "Первый объект";
                    messageCH = "第一个对象";
                    messagePinyin = "Dì yī gè duìxiàng";
                } else if (glMatrix.vec3.exactEquals(pickResult, pickColors.second)) {
                    messageEN = "Second object";
                    messageRU = "Второй объект";
                    messageCH = "第二个对象";
                    messagePinyin = "Dì èr gè duìxiàng";
                } else if (glMatrix.vec3.exactEquals(pickResult, pickColors.third)) {
                    messageEN = "Third object";
                    messageRU = "Третий объект";
                    messageCH = "第三个对象";
                    messagePinyin = "Dì sān gè duìxiàng";
                } else if (glMatrix.vec3.exactEquals(pickResult, pickColors.fourth)) {
                    messageEN = "Fourth object";
                    messageRU = "Четвёртый объект";
                    messageCH = "第四个对象";
                    messagePinyin = "Dì sì gè duìxiàng";
                } else {
                    messageEN = "You didn't click on the objects";
                    messageRU = "Вы не кликнули по объектам";
                    messageCH = "你没有点击对象";
                    messagePinyin = "Nǐ méiyǒu diǎnjī duìxiàng";
                }
                console.log(messageEN);
                outputEN.innerText = messageEN;
                outputRU.innerText = messageRU;
                outputCH.innerText = messageCH;
                outputPinyin.innerText = messagePinyin;
 
                gl.uniform1i(uClickLocation, 0);
                draw();
            };
 
            function draw() {
                gl.clearColor(0.9, 0.9, 0.95, 1);
                gl.clear(gl.COLOR_BUFFER_BIT);
 
                glMatrix.mat4.fromTranslation(modelMatrix, firstObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, firstObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.uniform3fv(uColorLocation, firstObj.color);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                glMatrix.mat4.fromTranslation(modelMatrix, secondObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, secondObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.uniform3fv(uColorLocation, secondObj.color);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                glMatrix.mat4.fromTranslation(modelMatrix, thirdObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, thirdObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.uniform3fv(uColorLocation, thirdObj.color);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                glMatrix.mat4.fromTranslation(modelMatrix, fourthObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, fourthObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.uniform3fv(uColorLocation, fourthObj.color);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
            }
 
            draw();
        </script>
    </body>
 
</body>
3
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,310
Записей в блоге: 147
29.10.2022, 22:05 4
Тот же самый пример, что и выше, только с текстурами:

Название: pick-textured-object-by-color-id-webgl-js.gif
Просмотров: 856

Размер: 160.8 Кб

PHP/HTML
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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
<!DOCTYPE html>
 
<body>
 
    <head>
        <title>Pick textured object by click. WebGL, JavaScript</title>
 
        <script src="https://cdn.jsdelivr.net/npm/gl-matrix@3.4.3/gl-matrix-min.js"></script>
 
        <style>
            #renderCanvas {
                position: absolute;
            }
 
            #outputEN {
                position: absolute;
                top: 210px;
                left: 20px;
            }
 
            #outputRU {
                position: absolute;
                top: 235px;
                left: 20px;
            }
 
            #outputCH {
                position: absolute;
                top: 260px;
                left: 20px;
            }
 
            #outputPinyin {
                position: absolute;
                top: 285px;
                left: 20px;
            }
        </style>
    </head>
 
    <body>
        <div>
            <canvas id="renderCanvas" width="300" height="300"></canvas>
            <span id="outputEN">Click on any object or outside</span>
            <span id="outputRU">Кликните на любой объект или мимо</span>
            <span id="outputCH">单击任何对象或外部</span>
            <span id="outputPinyin">Dān jí rènhé duìxiàng huò wàibù</span>
        </div>
 
        <script id="vertexShader" type="x-shader/x-vertex">
            attribute vec2 aPosition;
            attribute vec2 aTexCoord;
            uniform mat4 uMvpMatrix;
            varying vec2 vTexCoord;
            
            void main() {
                gl_Position = uMvpMatrix * vec4(aPosition, 0.0, 1.0);
                vTexCoord = aTexCoord;
            }
        </script>
 
        <script id="fragmentShader" type="x-shader/x-fragment">
            precision mediump float;
            uniform sampler2D uSampler;
            uniform bool uClick;
            uniform vec3 uPickColor;
            varying vec2 vTexCoord;
 
            void main() {
                if (!uClick) {
                    gl_FragColor = texture2D(uSampler, vTexCoord);
                } else {
                    gl_FragColor = vec4(uPickColor, 1.0);
                }
            }
        </script>
 
        <script>
            const gl = document.getElementById("renderCanvas").getContext("webgl");
 
            gl.enable(gl.BLEND);
            gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
 
            const outputEN = document.getElementById("outputEN");
            const outputRU = document.getElementById("outputRU");
 
            const vShader = gl.createShader(gl.VERTEX_SHADER);
            const vSrc = document.getElementById("vertexShader").firstChild.textContent;
            gl.shaderSource(vShader, vSrc);
            gl.compileShader(vShader);
            let ok = gl.getShaderParameter(vShader, gl.COMPILE_STATUS);
            if (!ok) {
                console.log("vert: " + gl.getShaderInfoLog(vShader));
            };
 
            const fShader = gl.createShader(gl.FRAGMENT_SHADER);
            const fSrc = document.getElementById("fragmentShader").firstChild.textContent;
            gl.shaderSource(fShader, fSrc);
            gl.compileShader(fShader);
            ok = gl.getShaderParameter(fShader, gl.COMPILE_STATUS);
            if (!ok) {
                console.log("frag: " + gl.getShaderInfoLog(fShader));
            };
 
            const program = gl.createProgram();
            gl.attachShader(program, vShader);
            gl.attachShader(program, fShader);
            gl.linkProgram(program);
            ok = gl.getProgramParameter(program, gl.LINK_STATUS);
            if (!ok) {
                console.log("link: " + gl.getProgramInfoLog(program));
            };
            gl.useProgram(program);
 
            const vertPositions = [
                -0.5, -0.5,
                -0.5, 0.5,
                0.5, -0.5,
                0.5, 0.5
            ];
            const vertPosBuffer = gl.createBuffer();
            gl.bindBuffer(gl.ARRAY_BUFFER, vertPosBuffer);
            gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertPositions), gl.STATIC_DRAW);
            const aPositionLocation = gl.getAttribLocation(program, "aPosition");
            gl.vertexAttribPointer(aPositionLocation, 2, gl.FLOAT, false, 0, 0);
            gl.enableVertexAttribArray(aPositionLocation);
 
            const texCoords = [
                0, 0,
                0, 1,
                1, 0,
                1, 1
            ];
            const texCoordBuffer = gl.createBuffer();
            gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
            gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texCoords), gl.STATIC_DRAW);
            const aTexCoordLocation = gl.getAttribLocation(program, "aTexCoord");
            gl.vertexAttribPointer(aTexCoordLocation, 2, gl.FLOAT, false, 0, 0);
            gl.enableVertexAttribArray(aTexCoordLocation);
 
            // const blackMugImg = document.getElementById("blackMugImg");
            const blackMugImg = new Image();
            let blackMugTexture = null;
            blackMugImg.onload = () => {
                blackMugTexture = gl.createTexture();
                gl.bindTexture(gl.TEXTURE_2D, blackMugTexture);
                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, blackMugImg);
                draw();
            };
            blackMugImg.src = "img/mug-black.png";
 
            // const greenMugImg = document.getElementById("greenMugImg");
            const greenMugImg = new Image();
            let greenMugTexture = null;
            greenMugImg.onload = () => {
                greenMugTexture = gl.createTexture();
                gl.bindTexture(gl.TEXTURE_2D, greenMugTexture);
                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, greenMugImg);
                draw();
            };
            greenMugImg.src = "img/mug-green.png";
 
            // const orangeMugImg = document.getElementById("orangeMugImg");
            const orangeMugImg = new Image();
            let orangeMugTexture = null;
            orangeMugImg.onload = () => {
                orangeMugTexture = gl.createTexture();
                gl.bindTexture(gl.TEXTURE_2D, orangeMugTexture);
                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, orangeMugImg);
                draw();
            };
            orangeMugImg.src = "img/mug-orange.png";
 
            const modelMatrix = glMatrix.mat4.create();
            const mvpMatrix = glMatrix.mat4.create();
 
            const projMatrix = glMatrix.mat4.create();
            glMatrix.mat4.ortho(projMatrix, -0.5, 2.5, 2.5, -0.5, 10, -10);
 
            const viewMatrix = glMatrix.mat4.create();
            glMatrix.mat4.lookAt(viewMatrix, [0, 0, 10], [0, 0, 0], [0, 1, 0]);
 
            const projViewMatrix = glMatrix.mat4.create();
            glMatrix.mat4.mul(projViewMatrix, projMatrix, viewMatrix);
 
            const uMvpMatrixLocation = gl.getUniformLocation(program, "uMvpMatrix");
            const uColorLocation = gl.getUniformLocation(program, "uColor");
            const uClickLocation = gl.getUniformLocation(program, "uClick");
            const uPickColorLocation = gl.getUniformLocation(program, "uPickColor");
 
            gl.uniform1i(uClickLocation, 0);
 
            const firstObj = {
                pos: glMatrix.vec3.fromValues(0, 0, 0),
                scale: glMatrix.vec3.fromValues(0.7, 0.7, 1),
                color: glMatrix.vec3.fromValues(0.50, 0.84, 0.22)
            };
 
            const secondObj = {
                pos: glMatrix.vec3.fromValues(1, 0, 0),
                scale: glMatrix.vec3.fromValues(0.7, 0.7, 1),
                color: glMatrix.vec3.fromValues(0.07, 0.59, 0.09)
            };
 
            const thirdObj = {
                pos: glMatrix.vec3.fromValues(2, 0, 0),
                scale: glMatrix.vec3.fromValues(0.7, 0.7, 1),
                color: glMatrix.vec3.fromValues(0.12, 0.88, 0.48)
            };
 
            const fourthObj = {
                pos: glMatrix.vec3.fromValues(0, 1, 0),
                scale: glMatrix.vec3.fromValues(0.7, 0.7, 1),
                color: glMatrix.vec3.fromValues(0.65, 0.37, 0.07)
            };
 
            const pickColors = {
                first: glMatrix.vec3.fromValues(255, 0, 0),
                second: glMatrix.vec3.fromValues(0, 255, 0),
                third: glMatrix.vec3.fromValues(0, 0, 255),
                fourth: glMatrix.vec3.fromValues(255, 255, 0)
            };
 
            gl.canvas.onmousedown = (e) => {
                // Get coordinates of mouse pick
                const rect = gl.canvas.getBoundingClientRect();
                const mouseX = e.clientX - rect.left;
                const mouseY = e.clientY - rect.top;
                const pickX = mouseX;
                const pickY = rect.bottom - rect.top - mouseY - 1;
                // console.log("mouse pick coords:", pickX, pickY);
 
                // Set the click flag and color id
                gl.uniform1i(uClickLocation, 1);
                gl.clearColor(0, 0, 0, 1);
                gl.clear(gl.COLOR_BUFFER_BIT);
 
                // Draw objects for picking
                gl.uniform3fv(uPickColorLocation, pickColors.first);
                glMatrix.mat4.fromTranslation(modelMatrix, firstObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, firstObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                gl.uniform3fv(uPickColorLocation, pickColors.second);
                glMatrix.mat4.fromTranslation(modelMatrix, secondObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, secondObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                gl.uniform3fv(uPickColorLocation, pickColors.third);
                glMatrix.mat4.fromTranslation(modelMatrix, thirdObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, thirdObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                gl.uniform3fv(uPickColorLocation, pickColors.fourth);
                glMatrix.mat4.fromTranslation(modelMatrix, fourthObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, fourthObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                const pixels = new Uint8Array(4);
                gl.readPixels(pickX, pickY, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
                // console.log("pick color:", pixels[0], pixels[1], pixels[2], pixels[3]);
                const pickResult = glMatrix.vec3.fromValues(pixels[0], pixels[1], pixels[2]);
 
                let messageEN = "";
                let messageRU = "";
                let messageCH = "";
                let messagePinyin = "";
                if (glMatrix.vec3.exactEquals(pickResult, pickColors.first)) {
                    messageEN = "First object";
                    messageRU = "Первый объект";
                    messageCH = "第一个对象";
                    messagePinyin = "Dì yī gè duìxiàng";
                } else if (glMatrix.vec3.exactEquals(pickResult, pickColors.second)) {
                    messageEN = "Second object";
                    messageRU = "Второй объект";
                    messageCH = "第二个对象";
                    messagePinyin = "Dì èr gè duìxiàng";
                } else if (glMatrix.vec3.exactEquals(pickResult, pickColors.third)) {
                    messageEN = "Third object";
                    messageRU = "Третий объект";
                    messageCH = "第三个对象";
                    messagePinyin = "Dì sān gè duìxiàng";
                } else if (glMatrix.vec3.exactEquals(pickResult, pickColors.fourth)) {
                    messageEN = "Fourth object";
                    messageRU = "Четвёртый объект";
                    messageCH = "第四个对象";
                    messagePinyin = "Dì sì gè duìxiàng";
                } else {
                    messageEN = "You didn't click on the objects";
                    messageRU = "Вы не кликнули по объектам";
                    messageCH = "你没有点击对象";
                    messagePinyin = "Nǐ méiyǒu diǎnjī duìxiàng";
                }
                console.log(messageEN);
                outputEN.innerText = messageEN;
                outputRU.innerText = messageRU;
                outputCH.innerText = messageCH;
                outputPinyin.innerText = messagePinyin;
 
                gl.uniform1i(uClickLocation, 0);
                draw();
            };
 
            function draw() {
                gl.clearColor(0.9, 0.9, 0.95, 1);
                gl.clear(gl.COLOR_BUFFER_BIT);
 
                if (blackMugTexture === null || greenMugTexture === null || orangeMugTexture === null) {
                    return;
                }
 
                gl.bindTexture(gl.TEXTURE_2D, blackMugTexture);
                glMatrix.mat4.fromTranslation(modelMatrix, firstObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, firstObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.uniform3fv(uColorLocation, firstObj.color);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                gl.bindTexture(gl.TEXTURE_2D, greenMugTexture);
                glMatrix.mat4.fromTranslation(modelMatrix, secondObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, secondObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.uniform3fv(uColorLocation, secondObj.color);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                gl.bindTexture(gl.TEXTURE_2D, orangeMugTexture);
                glMatrix.mat4.fromTranslation(modelMatrix, thirdObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, thirdObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.uniform3fv(uColorLocation, thirdObj.color);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
 
                gl.bindTexture(gl.TEXTURE_2D, greenMugTexture);
                glMatrix.mat4.fromTranslation(modelMatrix, fourthObj.pos);
                glMatrix.mat4.scale(modelMatrix, modelMatrix, fourthObj.scale);
                glMatrix.mat4.mul(mvpMatrix, projViewMatrix, modelMatrix);
                gl.uniformMatrix4fv(uMvpMatrixLocation, false, mvpMatrix);
                gl.uniform3fv(uColorLocation, fourthObj.color);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
            }
 
            draw();
        </script>
    </body>
 
</body>
Вложения
Тип файла: zip pick-textured-object-by-color-id-webgl-js.zip (108.0 Кб, 2 просмотров)
4
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 356
01.11.2022, 12:34  [ТС] 5
А тут в объекте массива Нужно вынести за объект?
Javascript
1
2
3
4
    x1=0,
    y1=0,
    x2=0+202,
    y2=0+181
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
var cvs = document.getElementById("canvas");
var ctx = cvs.getContext("2d");
 
var mug_black = new Image(); //кружка чёрн цвета
var mug_green = new Image(); //кружка зел цвета
var mug_orange = new Image(); //кружка зел цвета
 
//событие на канвас клик мыши
cvs.addEventListener('mousedown', function (event) {
    var targetX = event.x;//координата Х клика
    var targetY = event.y;//координата У клика
    alert('mousedown');
 
    for (var i = 0; i < 9; i++) {
        if( targetX >= x1 && targetX <= x2 && targetY>=y1 && targetY<=y2 ){
             alert("верная картинка!");
        }
    }
}, false);
 
var x1;
var x2;
var y1;
var y2;
 
var assets = [];
assets[0]={   
    name: 'mug_1',
    path: "img/mug_black_1.jpg",
    x: 0,
    y: 0,  
    x1=0,
    y1=0,
    x2=0+202,
    y2=0+181
}
 
assets[1]={   
    name: 'mug_2',
    path: "img/mug_black_1.jpg",
    x: 205,
    y: 0,
    x1=205,
    y1=0,
    x2=205+202,//ширина картинки
    y2=0+181//высота картинки
}
 
assets[2]={
    name: 'mug_3',
    path: "img/mug_green.png",
    x: 410,//координаты самой картинки в браузере
    y: 0,//координаты самой картинки в браузере
    x1=410,
    y1=0,
    x2=410+202,//ширина картинки
    y2=0+181//высота картинки
}
 
assets[3]={
        name: 'mug_4',
        path: "img/mug_orange.png",
        x: 0,
        y: 184,
        x1=0,
        y1=184,
        x2=0+202,//ширина картинки
        y2=184+181;//высота картинки
}
 
assets[4]={
        name: 'mug_5',
        path: "img/mug_green.png",
        x: 205,
        y: 184,
        x1=205,
    y1=184,
x2=205+202,//ширина картинки
y2=184+181//высота картинки
}
 
assets[5]={
    name: 'mug_6',
    path: "img/mug_orange.png",
    x: 410,
    y: 184,
    x1=410,
    y1=184,
    x2=410+202,//ширина картинки
    y2=184+181//высота картинки
}
 
 
assets[6]={
    name: 'mug_7',
    path: "img/mug_black_1.jpg",
    x: 0,
    y: 368,
    x1=0,
    y1=368,
    x2=0+202,//ширина картинки
    y2=368+181//высота картинки
}
 
assets[7]={
    name: 'mug_8',
    path: "img/mug_orange.png",
    x: 205,
    y: 368,
    x1=205,
    y1=368,
    x2=205+202,//ширина картинки
    y2=368+181//высота картинки
}
 
assets[8]={
    name: 'mug_9',
    path: "img/mug_green.png",
    x: 410,
    y: 368,
    x1=410,
    y1=368,
    x2=410+202,//ширина картинки
    y2=368+181//высота картинки
}
addEventListener();
0
88 / 40 / 10
Регистрация: 28.10.2022
Сообщений: 55
01.11.2022, 13:47 6
Я не совсем понял вопрос, но сточки зрения создания объектов картинок лучше так.
Вы должны понимать что canvas не понимает что такое объект, это просто холст на котором рисуются пиксели которые туда вы передаёте по средством картинок и метода drawImage.
Сделать картинку как объект да и в целом любой элемент можно только руками и соответственно все манипуляции будут делаться посредством циклов, функций и методов.
Я осмелился немного подправить на скору руку, чтобы вы меньше путались в коде т.к. 100 строчек на добавление 9 изображений это в будущем вас запутает такими объемами
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var mugWidth  = 202;//ширина картинки
var mugHeight = 181;//высота картинки
var assets = [];
var addAsset = function( _name, _path, _x, _y, _width, _height ) {
    if ( _width == null ) {
        _width = mugWidth;
    }
    if ( _height == null ) {
        _height = mugHeight;
    }
    var imageParameterss = {
        name:   _name,
        path:   _path,
        x:      _x,
        y:      _y,
        width:  _width,
        height: _height,
 
    };
    assets.push(imageParameterss);
};
ширину и высоту картинки я вынес в некие константы т.к. для вас они одинаковые но в функции есть условие что если вы не передаёте туда значения(вдруг картинка отличается размерами) если вы захотите добавить ещё картинок других размеров допустим чтобы не по цветам делать, а по другим параметрам(размер, форма и т.д.).
Javascript
1
2
3
4
5
6
7
8
9
addAsset( 'mug_1', "img/mug_black_1.jpg",   0,   0 );
addAsset( 'mug_2', "img/mug_black_1.jpg", 205,   0 );
addAsset( 'mug_3', "img/mug_green.png",   410,   0 );
addAsset( 'mug_4', "img/mug_orange.png",    0, 184 );
addAsset( 'mug_5', "img/mug_green.png",   205, 184 );
addAsset( 'mug_6', "img/mug_orange.png",  410, 184 );
addAsset( 'mug_7', "img/mug_black_1.jpg",   0, 368 );
addAsset( 'mug_8', "img/mug_orange.png",  205, 368 );
addAsset( 'mug_9', "img/mug_green.png",   410, 368 );
так как выше добавляются изображения
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cvs.addEventListener('mousedown', function (event) {
    var targetX = event.x;//координата Х клика
    var targetY = event.y;//координата У клика
    alert('mousedown');
 
    for ( var i = 0; i < assets.length; i++ ) {
        var x1 = assets[i].x;
        var y1 = assets[i].y;
        var x2 = x1 + assets[i].width;
        var y2 = y1 + assets[i].height;
        if( targetX >= x1 && targetX <= x2 && targetY>=y1 && targetY<=y2 ){
             alert("верная картинка!");
        }
    }
}, false);
И уже само событие
Ключевая фишка в том, что не нужно помещать всё подряд в объект, все вычисления делаются там где они нужны, т.е. вам вычисления положения картинки нужны при клике, поэтому лучше делать их там.
Для вычисления изображения по параметру лучше делать допустим внутри объекта параметр color: "black" и так для каждой кружки
и будет примерно такая проверка
Javascript
1
2
3
4
5
6
7
8
9
if( targetX >= x1 && targetX <= x2 && targetY>=y1 && targetY<=y2 ){
    if( assets[i].color == "black" ) {
        alert("верная картинка!");
    } else if ( assets[i].color == "orange" ) {
        alert("верная картинка!");
    } else if ( assets[i].color == "green" ) {
        alert("верная картинка!");
    }
}
Есть так же способ создавать объект через конструктор new
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var addAsset = function( _name, _path, _x, _y, _width, _height ) {
    if ( _width == null ) {
        _width = mugWidth;
    }
    if ( _height == null ) {
        _height = mugHeight;
    }
    this.name   = _name;
    this.path   = _path;
    this.x      = _x;
    this.y      = _y;
    this.width  = _width;
    this.height = _height;
};
assets[0] = new addAsset( 'mug_1', "img/mug_black_1.jpg", 0, 0 );//добавляем в массив assets
2
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 356
07.11.2022, 17:37  [ТС] 7
Вопрос ,а что дальше делать?
0
88 / 40 / 10
Регистрация: 28.10.2022
Сообщений: 55
07.11.2022, 19:40 8
Не знаю, я не помню что там уже и как работает, опиши проблему или что не получается, на крайний случай кинь архив кода, я с утра или вечерком гляну, что-нибудь придумаю
1
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 356
08.11.2022, 02:13  [ТС] 9
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
var cvs = document.getElementById("canvas");
var ctx = cvs.getContext("2d");
 
var mugWidth = 202; //ширина картинки
var mugHeight = 181; //высота картинки
var assets = []; //массив картинок
var addAsset = function (_name, _path, _x, _y, _width, _height) {
    if (_width == null) {
        _width = mugWidth;
    }
    if (_height == null) {
        _height = mugHeight;
    }
    var imageParameterss = {
        name: _name,
        path: _path,
        x: _x,
        y: _y,
        width: _width,
        height: _height,
 
    };
    assets.push(imageParameterss);
};
addAsset('mug_1', "img/mug_black_1.jpg", 0, 0);
addAsset('mug_2', "img/mug_black_1.jpg", 205, 0);
addAsset('mug_3', "img/mug_green.png", 410, 0);
addAsset('mug_4', "img/mug_orange.png", 0, 184);
addAsset('mug_5', "img/mug_green.png", 205, 184);
addAsset('mug_6', "img/mug_orange.png", 410, 184);
addAsset('mug_7', "img/mug_black_1.jpg", 0, 368);
addAsset('mug_8', "img/mug_orange.png", 205, 368);
addAsset('mug_9', "img/mug_green.png", 410, 368);
 
cvs.addEventListener('mousedown', function (event) {
    var targetX = event.x; //координата Х клика
    var targetY = event.y; //координата У клика
    alert('mousedown');
 
    for (var i = 0; i < assets.length; i++) {
        var x1 = assets[i].x;
        var y1 = assets[i].y;
        var x2 = x1 + assets[i].width;
        var y2 = y1 + assets[i].height;
        
        if (targetX >= x1 && targetX <= x2 && targetY >= y1 && targetY <= y2) {
            if (assets[i].color == "black") {
                alert("верная картинка!");
            } else if (assets[i].color == "orange") {
                alert("верная картинка!");
            } else if (assets[i].color == "green") {
                alert("верная картинка!");
            }
        }
    }
    
    
}, false);
 
function draw(){
    ctx.drawImage(assets[0],0,0);
    ctx.drawImage(assets[1],205,0);
    ctx.drawImage(assets[2],410,0);
    ctx.drawImage(assets[3],0,184);
    ctx.drawImage(assets[4],205,184);
    ctx.drawImage(assets[5],410,184);
    ctx.drawImage(assets[6],0,368);
    ctx.drawImage(assets[7],205,368);
    ctx.drawImage(assets[8],410,368);
}
pipeBottom.onload=draw;
Пытаюсь так вывести в браузере картинки, не выходит
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
function draw(){
    ctx.drawImage(assets[0],0,0);
    ctx.drawImage(assets[1],205,0);
    ctx.drawImage(assets[2],410,0);
    ctx.drawImage(assets[3],0,184);
    ctx.drawImage(assets[4],205,184);
    ctx.drawImage(assets[5],410,184);
    ctx.drawImage(assets[6],0,368);
    ctx.drawImage(assets[7],205,368);
    ctx.drawImage(assets[8],410,368);
}
pipeBottom.onload=draw;
0
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 356
08.11.2022, 02:21  [ТС] 10
Архив:
Вложения
Тип файла: rar web_5lb.rar (44.9 Кб, 8 просмотров)
0
88 / 40 / 10
Регистрация: 28.10.2022
Сообщений: 55
08.11.2022, 08:45 11
Вы не создали текстуру, поэтому не грузилось, плюс я немного под редачил.
Картинки сразу не прогружаются надо на F5 обновить браузер
Этот вопрос решается прелоадером, но его писать надо.
Вложения
Тип файла: zip web_5lb.zip (45.5 Кб, 8 просмотров)
1
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 356
08.11.2022, 11:50  [ТС] 12
У вас загружается ?
у меня вот так:
Миниатюры
Игра на JS  
0
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 356
08.11.2022, 12:07  [ТС] 13
добавил строку
Javascript
1
requestAnimationFrame(draw)
и получилось
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function draw(){
        var texture = null;
    for ( var i = 0; i < assets.length; i++ ) {
        texture = new Image();
        texture.src = assets[i].path;
        ctx.drawImage( texture, assets[i].x, assets[i].y );
    }
    requestAnimationFrame(draw);
/*
    ctx.drawImage(assets[0],0,0);
    ctx.drawImage(assets[1],205,0);
    ctx.drawImage(assets[2],410,0);
    ctx.drawImage(assets[3],0,184);
    ctx.drawImage(assets[4],205,184);
    ctx.drawImage(assets[5],410,184);
    ctx.drawImage(assets[6],0,368);
    ctx.drawImage(assets[7],205,368);
    ctx.drawImage(assets[8],410,368);
*/
}
draw();
1
88 / 40 / 10
Регистрация: 28.10.2022
Сообщений: 55
08.11.2022, 12:08 14
Сперва так(т.к. нет прелоадера изображений) затем нажимаю обновить(F5) и получается так:
Миниатюры
Игра на JS  
1
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 356
08.11.2022, 12:34  [ТС] 15
А через метод
Javascript
1
requestAnimationFrame(draw)
тоже можно?

Добавлено через 19 минут
т.е просто интернет медленный,поэтому не грузится картинки?
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,310
Записей в блоге: 147
08.11.2022, 13:12 16
Можно с использованием Promise/async/await загрузить:

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
const cvs = document.getElementById("canvas");
const ctx = cvs.getContext("2d");
 
let mugBlackImg, mugGreenImg, mugOrangeImg;
 
function loadImage(url) {
    return new Promise(resolve => {
        const image = new Image();
        image.onload = () => {
            resolve(image);
        };
        image.src = url;
    });
}
 
function draw() {
    ctx.drawImage(mugBlackImg, 0, 0);
    ctx.drawImage(mugGreenImg, 205, 0);
    ctx.drawImage(mugOrangeImg, 410, 0);
}
 
async function init() {
    mugBlackImg = await loadImage("img/mug_black_1.jpg");
    mugGreenImg = await loadImage("img/mug_green.png");
    mugOrangeImg = await loadImage("img/mug_orange.png");
    draw();
}
 
init();
Миниатюры
Игра на JS  
3
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 356
14.11.2022, 19:57  [ТС] 17
Cпасибо
0
14.11.2022, 19:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2022, 19:57
Помогаю со студенческими работами здесь

Игра летающая птица. Не работает игра
import pygame import random pygame.init() SCREEN = pygame.display.set_mode((500, 750)) #...

Как сделать так, чтобы при нажатии на кнопку "Новая игра" игра начиналась заново?
Как сделать так, чтобы при нажатии на кнопку &quot;Новая игра&quot; игра начиналась заново? unit1.cpp void...

Игра Кости, игра с компьютером
Всем привет! Делаю консольную игру Кости. Условия такие: 1) Перед игрой все игроки бросают...

Игра слов, игра Scrabble
Задание: Создать программу для решения задачи построения слова из некоторого множества букв (игра...

Существует ли игра такая игра?
Всем привет. Существует ли такая игра, где, допустим, мы находимся на космическом корабле, в...


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

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

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