質問編集履歴

6

あふぁふぁ

2016/08/13 09:34

投稿

canvas
canvas

スコア62

test CHANGED
File without changes
test CHANGED
@@ -166,9 +166,9 @@
166
166
 
167
167
  ###追記 - 改良してみました(2016-08-13 18:33)
168
168
 
169
- [http://codepen.io/anon/pen/BzrzOb
169
+ [http://codepen.io/anon/pen/RRvogR
170
-
170
+
171
- ](http://codepen.io/anon/pen/BzrzOb)
171
+ ](http://codepen.io/anon/pen/RRvogR)
172
172
 
173
173
  ひとまずMVCに分割出来ていますでしょうか?
174
174
 

5

サークルの管理クラスを導入

2016/08/13 09:34

投稿

canvas
canvas

スコア62

test CHANGED
File without changes
test CHANGED
@@ -164,7 +164,7 @@
164
164
 
165
165
 
166
166
 
167
- ###追記 - 改良してみました(2016-08-13 16:42)
167
+ ###追記 - 改良してみました(2016-08-13 18:33)
168
168
 
169
169
  [http://codepen.io/anon/pen/BzrzOb
170
170
 
@@ -176,9 +176,13 @@
176
176
 
177
177
  ```JavaScript
178
178
 
179
+ //コントローラークラス
180
+
179
- function ViewController(canvasElement) {
181
+ function ViewController(canvasElement, circleList) {
182
+
183
+
184
+
180
-
185
+ var circleList = circleList;
181
-
182
186
 
183
187
  var canvas = canvasElement;
184
188
 
@@ -190,17 +194,27 @@
190
194
 
191
195
  }
192
196
 
197
+
198
+
193
- var circle = new Circle(20, 20, 20);
199
+ circleList.add(new Circle(20, 20, 20));
200
+
194
-
201
+ circleList.add(new Circle(60, 60, 20));
202
+
203
+
204
+
195
-
205
+ circleList.getList().forEach(function(circle) {
196
-
206
+
197
- canvasView.drawCircle(circle.getPosition(), circle.getRadius());
207
+ canvasView.drawCircle(circle.getPosition(), circle.getRadius());
208
+
209
+ })
210
+
211
+
198
212
 
199
213
 
200
214
 
201
215
  canvas.addEventListener("mousedown", function(event) {
202
216
 
203
- var isPointInCircle = circle.hitTest(event.offsetX, event.offsetY);
217
+ var isTouchedPointOnCircle = circle.hitTest(event.offsetX, event.offsetY);
204
218
 
205
219
 
206
220
 
@@ -246,6 +260,10 @@
246
260
 
247
261
 
248
262
 
263
+
264
+
265
+ //ビュークラス
266
+
249
267
  function CanvasView(context) {
250
268
 
251
269
  var context = context;
@@ -258,17 +276,53 @@
258
276
 
259
277
  context.arc(position.x, position.y, radius, 0, Math.PI*2, false);
260
278
 
261
- context.stroke();
279
+ context.fill();
262
-
280
+
263
- }
281
+ }
264
-
265
-
266
-
282
+
283
+
284
+
267
- }
285
+ }
286
+
287
+
288
+
289
+
290
+
268
-
291
+ // circleの管理クラス
292
+
269
-
293
+ function CircleList() {
294
+
295
+
296
+
270
-
297
+ var list = [];
298
+
299
+
300
+
271
-
301
+ this.add = function(circle) {
302
+
303
+ list.push(circle);
304
+
305
+ }
306
+
307
+
308
+
309
+ this.getList = function() {
310
+
311
+ return list;
312
+
313
+ }
314
+
315
+
316
+
317
+ }
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+ // circleのモデルクラス
272
326
 
273
327
  function Circle(x, y, radius) {
274
328
 
@@ -308,21 +362,15 @@
308
362
 
309
363
 
310
364
 
311
-
312
-
313
-
314
-
315
-
316
-
317
- }
365
+ }
318
-
319
-
320
-
321
-
322
-
323
-
324
-
366
+
367
+
368
+
369
+
370
+
371
+
372
+
325
- var controller = new ViewController(document.getElementById("canvas"));
373
+ var controller = new ViewController(document.getElementById("canvas"), new CircleList());
326
374
 
327
375
  ```
328
376
 
@@ -330,10 +378,6 @@
330
378
 
331
379
  ###今後実装予定の処理
332
380
 
333
- - 複数のサークルの描画
334
-
335
- - 複数のサークルを保持するクラスの導入
336
-
337
381
  - サークル同士のヒット判定
338
382
 
339
383
  - サークルとマウスダウン座標とのヒット判定

4

追記キング

2016/08/13 09:34

投稿

canvas
canvas

スコア62

test CHANGED
File without changes
test CHANGED
@@ -174,7 +174,161 @@
174
174
 
175
175
 
176
176
 
177
+ ```JavaScript
178
+
179
+ function ViewController(canvasElement) {
180
+
181
+
182
+
183
+ var canvas = canvasElement;
184
+
185
+ var canvasView = new CanvasView(canvas.getContext("2d"));
186
+
187
+ var stateMap = {
188
+
189
+ isDragging: false
190
+
191
+ }
192
+
193
+ var circle = new Circle(20, 20, 20);
194
+
195
+
196
+
197
+ canvasView.drawCircle(circle.getPosition(), circle.getRadius());
198
+
199
+
200
+
201
+ canvas.addEventListener("mousedown", function(event) {
202
+
203
+ var isPointInCircle = circle.hitTest(event.offsetX, event.offsetY);
204
+
205
+
206
+
207
+ if (isPointInCircle === true) {
208
+
209
+ stateMap.isDragging = true;
210
+
211
+ console.log("ドラッグを開始");
212
+
213
+ }
214
+
215
+ });
216
+
217
+
218
+
219
+ canvas.addEventListener("mousemove", function(event) {
220
+
221
+ if (stateMap.isDragging === true) {
222
+
223
+ console.log("ドラッグ中");
224
+
225
+ }
226
+
227
+ });
228
+
229
+
230
+
231
+ canvas.addEventListener("mouseup", function(event) {
232
+
233
+ stateMap.isDragging = false;
234
+
235
+ console.log("ドラッグ終了");
236
+
237
+
238
+
239
+ });
240
+
241
+
242
+
243
+ }
244
+
245
+
246
+
247
+
248
+
249
+ function CanvasView(context) {
250
+
251
+ var context = context;
252
+
253
+
254
+
255
+ this.drawCircle = function(position, radius) {
256
+
257
+ context.beginPath();
258
+
259
+ context.arc(position.x, position.y, radius, 0, Math.PI*2, false);
260
+
261
+ context.stroke();
262
+
263
+ }
264
+
265
+
266
+
267
+ }
268
+
269
+
270
+
271
+
272
+
273
+ function Circle(x, y, radius) {
274
+
275
+
276
+
277
+ var x = x + radius;
278
+
279
+ var y = y + radius;
280
+
281
+ var radius = radius;
282
+
283
+
284
+
285
+ this.getPosition = function() {
286
+
287
+ return {x: x, y: y};
288
+
289
+ }
290
+
291
+
292
+
293
+ this.getRadius = function() {
294
+
295
+ return radius;
296
+
297
+ }
298
+
299
+
300
+
301
+ this.hitTest = function(x, y) {
302
+
303
+ console.log("ヒット判定の実装をする");
304
+
305
+ return true;
306
+
307
+ }
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+ }
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+ var controller = new ViewController(document.getElementById("canvas"));
326
+
327
+ ```
328
+
329
+
330
+
177
- これから実装予定の処理としては以下があります。
331
+ ###今後実装予定の処理
178
332
 
179
333
  - 複数のサークルの描画
180
334
 
@@ -186,161 +340,9 @@
186
340
 
187
341
  - 複数のサークルのドラッグ&ドロップに対応
188
342
 
189
-
190
-
191
- ```JavaScript
192
-
193
- function ViewController(canvasElement) {
194
-
195
-
196
-
197
- var canvas = canvasElement;
198
-
199
- var canvasView = new CanvasView(canvas.getContext("2d"));
200
-
201
- var stateMap = {
202
-
203
- isDragging: false
204
-
205
- }
206
-
207
- var circle = new Circle(20, 20, 20);
208
-
209
-
210
-
211
- canvasView.drawCircle(circle.getPosition(), circle.getRadius());
212
-
213
-
214
-
215
- canvas.addEventListener("mousedown", function(event) {
216
-
217
- var isPointInCircle = circle.hitTest(event.offsetX, event.offsetY);
218
-
219
-
220
-
221
- if (isPointInCircle === true) {
343
+ - サークルの上でクリックをするとサークルが選択状態になる
222
-
223
- stateMap.isDragging = true;
344
+
224
-
225
- console.log("ドラッグを開始");
226
-
227
- }
228
-
229
- });
230
-
231
-
232
-
233
- canvas.addEventListener("mousemove", function(event) {
234
-
235
- if (stateMap.isDragging === true) {
236
-
237
- console.log("ドラッグ中");
238
-
239
- }
240
-
241
- });
242
-
243
-
244
-
245
- canvas.addEventListener("mouseup", function(event) {
246
-
247
- stateMap.isDragging = false;
248
-
249
- console.log("ドラッグ終了");
250
-
251
-
252
-
253
- });
254
-
255
-
256
-
257
- }
258
-
259
-
260
-
261
-
262
-
263
- function CanvasView(context) {
264
-
265
- var context = context;
266
-
267
-
268
-
269
- this.drawCircle = function(position, radius) {
345
+ - サークルが選択状態の時にサークルを囲う矩形をドラッグすると、サークルが拡大縮小される
270
-
271
- context.beginPath();
272
-
273
- context.arc(position.x, position.y, radius, 0, Math.PI*2, false);
274
-
275
- context.stroke();
276
-
277
- }
278
-
279
-
280
-
281
- }
282
-
283
-
284
-
285
-
286
-
287
- function Circle(x, y, radius) {
288
-
289
-
290
-
291
- var x = x + radius;
292
-
293
- var y = y + radius;
294
-
295
- var radius = radius;
296
-
297
-
298
-
299
- this.getPosition = function() {
300
-
301
- return {x: x, y: y};
302
-
303
- }
304
-
305
-
306
-
307
- this.getRadius = function() {
308
-
309
- return radius;
310
-
311
- }
312
-
313
-
314
-
315
- this.hitTest = function(x, y) {
316
-
317
- console.log("ヒット判定の実装をする");
318
-
319
- return true;
320
-
321
- }
322
-
323
-
324
-
325
-
326
-
327
-
328
-
329
-
330
-
331
- }
332
-
333
-
334
-
335
-
336
-
337
-
338
-
339
- var controller = new ViewController(document.getElementById("canvas"));
340
-
341
- ```
342
-
343
-
344
346
 
345
347
 
346
348
 

3

追記

2016/08/13 07:57

投稿

canvas
canvas

スコア62

test CHANGED
File without changes
test CHANGED
@@ -170,6 +170,24 @@
170
170
 
171
171
  ](http://codepen.io/anon/pen/BzrzOb)
172
172
 
173
+ ひとまずMVCに分割出来ていますでしょうか?
174
+
175
+
176
+
177
+ これから実装予定の処理としては以下があります。
178
+
179
+ - 複数のサークルの描画
180
+
181
+ - 複数のサークルを保持するクラスの導入
182
+
183
+ - サークル同士のヒット判定
184
+
185
+ - サークルとマウスダウン座標とのヒット判定
186
+
187
+ - 複数のサークルのドラッグ&ドロップに対応
188
+
189
+
190
+
173
191
  ```JavaScript
174
192
 
175
193
  function ViewController(canvasElement) {

2

改良コードを追記

2016/08/13 07:48

投稿

canvas
canvas

スコア62

test CHANGED
File without changes
test CHANGED
@@ -164,6 +164,168 @@
164
164
 
165
165
 
166
166
 
167
+ ###追記 - 改良してみました(2016-08-13 16:42)
168
+
169
+ [http://codepen.io/anon/pen/BzrzOb
170
+
171
+ ](http://codepen.io/anon/pen/BzrzOb)
172
+
173
+ ```JavaScript
174
+
175
+ function ViewController(canvasElement) {
176
+
177
+
178
+
179
+ var canvas = canvasElement;
180
+
181
+ var canvasView = new CanvasView(canvas.getContext("2d"));
182
+
183
+ var stateMap = {
184
+
185
+ isDragging: false
186
+
187
+ }
188
+
189
+ var circle = new Circle(20, 20, 20);
190
+
191
+
192
+
193
+ canvasView.drawCircle(circle.getPosition(), circle.getRadius());
194
+
195
+
196
+
197
+ canvas.addEventListener("mousedown", function(event) {
198
+
199
+ var isPointInCircle = circle.hitTest(event.offsetX, event.offsetY);
200
+
201
+
202
+
203
+ if (isPointInCircle === true) {
204
+
205
+ stateMap.isDragging = true;
206
+
207
+ console.log("ドラッグを開始");
208
+
209
+ }
210
+
211
+ });
212
+
213
+
214
+
215
+ canvas.addEventListener("mousemove", function(event) {
216
+
217
+ if (stateMap.isDragging === true) {
218
+
219
+ console.log("ドラッグ中");
220
+
221
+ }
222
+
223
+ });
224
+
225
+
226
+
227
+ canvas.addEventListener("mouseup", function(event) {
228
+
229
+ stateMap.isDragging = false;
230
+
231
+ console.log("ドラッグ終了");
232
+
233
+
234
+
235
+ });
236
+
237
+
238
+
239
+ }
240
+
241
+
242
+
243
+
244
+
245
+ function CanvasView(context) {
246
+
247
+ var context = context;
248
+
249
+
250
+
251
+ this.drawCircle = function(position, radius) {
252
+
253
+ context.beginPath();
254
+
255
+ context.arc(position.x, position.y, radius, 0, Math.PI*2, false);
256
+
257
+ context.stroke();
258
+
259
+ }
260
+
261
+
262
+
263
+ }
264
+
265
+
266
+
267
+
268
+
269
+ function Circle(x, y, radius) {
270
+
271
+
272
+
273
+ var x = x + radius;
274
+
275
+ var y = y + radius;
276
+
277
+ var radius = radius;
278
+
279
+
280
+
281
+ this.getPosition = function() {
282
+
283
+ return {x: x, y: y};
284
+
285
+ }
286
+
287
+
288
+
289
+ this.getRadius = function() {
290
+
291
+ return radius;
292
+
293
+ }
294
+
295
+
296
+
297
+ this.hitTest = function(x, y) {
298
+
299
+ console.log("ヒット判定の実装をする");
300
+
301
+ return true;
302
+
303
+ }
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ }
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+ var controller = new ViewController(document.getElementById("canvas"));
322
+
323
+ ```
324
+
325
+
326
+
327
+
328
+
167
329
  ###補足事項
168
330
 
169
331
  下記のサイトでも質問を投稿しております。

1

リファクタリングのタグを追加

2016/08/13 07:45

投稿

canvas
canvas

スコア62

test CHANGED
File without changes
test CHANGED
File without changes