Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
op_input
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
template admin
op_input
Commits
f58e6b5c
Commit
f58e6b5c
authored
Aug 22, 2022
by
yu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
8.22调整
parent
c20670cb
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
241 additions
and
238 deletions
+241
-238
Game.ts
assets/op_input/scene/Game.ts
+11
-5
op_input.fire
assets/op_input/scene/op_input.fire
+116
-48
op_input.ts
assets/op_input/scene/op_input.ts
+52
-26
defaultData.ts
assets/op_input/script/defaultData.ts
+50
-141
form.component.html
form/src/app/form/form.component.html
+11
-18
form.component.ts
form/src/app/form/form.component.ts
+1
-0
No files found.
assets/op_input/scene/Game.ts
View file @
f58e6b5c
...
@@ -19,14 +19,14 @@ export class Item {
...
@@ -19,14 +19,14 @@ export class Item {
public
audio
;
public
audio
;
public
image
;
public
image
;
public
optionList
;
public
optionList
;
public
questionAudio
;
//
public questionAudio;
public
wordAudio
;
public
wordAudio
;
public
contentArr
;
public
contentArr
;
count
:
number
;
count
:
number
;
constructor
(
data
,
page
)
{
constructor
(
data
,
page
)
{
// this.audio = data.audio;
// this.audio = data.audio;
this
.
image
=
data
.
questImg
;
this
.
image
=
data
.
questImg
;
this
.
questionAudio
=
data
.
questionAudio
;
//
this.questionAudio = data.questionAudio;
this
.
wordAudio
=
data
.
wordAudio
;
this
.
wordAudio
=
data
.
wordAudio
;
this
.
contentArr
=
data
.
contentArr
;
this
.
contentArr
=
data
.
contentArr
;
let
id
=
page
;
let
id
=
page
;
...
@@ -35,15 +35,17 @@ export class Item {
...
@@ -35,15 +35,17 @@ export class Item {
return
new
Option
(
o
,
id
++
);
return
new
Option
(
o
,
id
++
);
})
})
this
.
optionList
.
sort
(
function
()
{
return
(
0.5
-
Math
.
random
());
});
// for (let i = 0; i < this.optionList.length; i++) {
// for (let i = 0; i < this.optionList.length; i++) {
// this.optionList[i].count = i;
// this.optionList[i].count = i;
// }
// }
this
.
page
=
page
+
1
;
this
.
page
=
page
+
1
;
}
}
public
randomOptions
()
{
this
.
optionList
.
sort
(
function
()
{
return
(
0.5
-
Math
.
random
());
});
}
}
}
export
default
class
Game
{
export
default
class
Game
{
private
static
ins
:
Game
;
private
static
ins
:
Game
;
...
@@ -57,7 +59,9 @@ export default class Game {
...
@@ -57,7 +59,9 @@ export default class Game {
public
vectoringAudio
:
string
;
public
vectoringAudio
:
string
;
public
waitAudio
:
string
;
public
waitAudio
:
string
;
public
twoWaitAudio
:
string
;
public
twoWaitAudio
:
string
;
public
twoVectoringAudio
:
string
;
public
bgImage
:
string
;
public
bgImage
:
string
;
public
roundCount
:
number
;
constructor
()
{
constructor
()
{
//
//
this
.
start
=
false
;
this
.
start
=
false
;
...
@@ -74,11 +78,13 @@ export default class Game {
...
@@ -74,11 +78,13 @@ export default class Game {
this
.
vectoringAudio
=
data
.
vectoringAudio
;
this
.
vectoringAudio
=
data
.
vectoringAudio
;
this
.
waitAudio
=
data
.
waitAudio
;
this
.
waitAudio
=
data
.
waitAudio
;
this
.
twoWaitAudio
=
data
.
twoWaitAudio
;
this
.
twoWaitAudio
=
data
.
twoWaitAudio
;
this
.
twoVectoringAudio
=
data
.
twoVectoringAudio
;
this
.
bgImage
=
data
.
image
;
this
.
bgImage
=
data
.
image
;
}
}
public
start
:
boolean
;
public
start
:
boolean
;
public
page
:
number
;
public
page
:
number
;
reset
()
{
reset
()
{
this
.
roundCount
=
1
;
this
.
page
=
1
;
this
.
page
=
1
;
this
.
start
=
true
;
this
.
start
=
true
;
this
.
lists
=
[];
this
.
lists
=
[];
...
...
assets/op_input/scene/op_input.fire
View file @
f58e6b5c
...
@@ -105,25 +105,25 @@
...
@@ -105,25 +105,25 @@
"__id__": 95
"__id__": 95
},
},
{
{
"__id__": 10
3
"__id__": 10
4
},
},
{
{
"__id__": 10
5
"__id__": 10
6
},
},
{
{
"__id__": 11
2
"__id__": 11
3
}
}
],
],
"_active": true,
"_active": true,
"_components": [
"_components": [
{
"__id__": 121
},
{
{
"__id__": 122
"__id__": 122
},
},
{
{
"__id__": 123
"__id__": 123
},
{
"__id__": 124
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -4622,8 +4622,8 @@
...
@@ -4622,8 +4622,8 @@
},
},
"_contentSize": {
"_contentSize": {
"__type__": "cc.Size",
"__type__": "cc.Size",
"width": 10
0
,
"width": 10
6
,
"height": 1
1
6
"height": 1
44.
6
},
},
"_anchorPoint": {
"_anchorPoint": {
"__type__": "cc.Vec2",
"__type__": "cc.Vec2",
...
@@ -4635,7 +4635,7 @@
...
@@ -4635,7 +4635,7 @@
"ctor": "Float64Array",
"ctor": "Float64Array",
"array": [
"array": [
0,
0,
12
.851,
24
.851,
0,
0,
0,
0,
0,
0,
...
@@ -4677,7 +4677,7 @@
...
@@ -4677,7 +4677,7 @@
"_string": "",
"_string": "",
"_N$string": "",
"_N$string": "",
"_fontSize": 100,
"_fontSize": 100,
"_lineHeight":
4
0,
"_lineHeight":
11
0,
"_enableWrapText": true,
"_enableWrapText": true,
"_N$file": {
"_N$file": {
"__uuid__": "10fca463-2764-409f-a7b4-c8b320f5d610"
"__uuid__": "10fca463-2764-409f-a7b4-c8b320f5d610"
...
@@ -4690,7 +4690,7 @@
...
@@ -4690,7 +4690,7 @@
"_N$horizontalAlign": 1,
"_N$horizontalAlign": 1,
"_N$verticalAlign": 1,
"_N$verticalAlign": 1,
"_N$fontFamily": "Arial",
"_N$fontFamily": "Arial",
"_N$overflow":
2
,
"_N$overflow":
0
,
"_N$cacheMode": 0,
"_N$cacheMode": 0,
"_id": "89gMgvLStGhpGKzNNw+bX0"
"_id": "89gMgvLStGhpGKzNNw+bX0"
},
},
...
@@ -4730,7 +4730,7 @@
...
@@ -4730,7 +4730,7 @@
"_active": true,
"_active": true,
"_components": [
"_components": [
{
{
"__id__": 10
2
"__id__": 10
3
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -4891,6 +4891,9 @@
...
@@ -4891,6 +4891,9 @@
"_components": [
"_components": [
{
{
"__id__": 101
"__id__": 101
},
{
"__id__": 102
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -5067,6 +5070,74 @@
...
@@ -5067,6 +5070,74 @@
"_atlas": null,
"_atlas": null,
"_id": "86869Hl+pKX7uptFDfVYGW"
"_id": "86869Hl+pKX7uptFDfVYGW"
},
},
{
"__type__": "cc.Button",
"_name": "",
"_objFlags": 0,
"node": {
"__id__": 98
},
"_enabled": true,
"_normalMaterial": null,
"_grayMaterial": null,
"duration": 0.1,
"zoomScale": 1.2,
"clickEvents": [],
"_N$interactable": true,
"_N$enableAutoGrayEffect": false,
"_N$transition": 0,
"transition": 0,
"_N$normalColor": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_N$pressedColor": {
"__type__": "cc.Color",
"r": 211,
"g": 211,
"b": 211,
"a": 255
},
"pressedColor": {
"__type__": "cc.Color",
"r": 211,
"g": 211,
"b": 211,
"a": 255
},
"_N$hoverColor": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"hoverColor": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_N$disabledColor": {
"__type__": "cc.Color",
"r": 124,
"g": 124,
"b": 124,
"a": 255
},
"_N$normalSprite": null,
"_N$pressedSprite": null,
"pressedSprite": null,
"_N$hoverSprite": null,
"hoverSprite": null,
"_N$disabledSprite": null,
"_N$target": null,
"_id": "c8HI4uestLqKZcPMdahgkg"
},
{
{
"__type__": "cc.Sprite",
"__type__": "cc.Sprite",
"_name": "",
"_name": "",
...
@@ -5110,7 +5181,7 @@
...
@@ -5110,7 +5181,7 @@
"_active": true,
"_active": true,
"_components": [
"_components": [
{
{
"__id__": 10
4
"__id__": 10
5
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -5166,7 +5237,7 @@
...
@@ -5166,7 +5237,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 10
3
"__id__": 10
4
},
},
"_enabled": true,
"_enabled": true,
"alignMode": 1,
"alignMode": 1,
...
@@ -5197,16 +5268,16 @@
...
@@ -5197,16 +5268,16 @@
},
},
"_children": [
"_children": [
{
{
"__id__": 10
6
"__id__": 10
7
},
},
{
{
"__id__": 1
09
"__id__": 1
10
}
}
],
],
"_active": false,
"_active": false,
"_components": [
"_components": [
{
{
"__id__": 11
1
"__id__": 11
2
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -5262,16 +5333,16 @@
...
@@ -5262,16 +5333,16 @@
"_name": "New Sprite(Splash)",
"_name": "New Sprite(Splash)",
"_objFlags": 0,
"_objFlags": 0,
"_parent": {
"_parent": {
"__id__": 10
5
"__id__": 10
6
},
},
"_children": [],
"_children": [],
"_active": true,
"_active": true,
"_components": [
"_components": [
{
{
"__id__": 10
7
"__id__": 10
8
},
},
{
{
"__id__": 10
8
"__id__": 10
9
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -5327,7 +5398,7 @@
...
@@ -5327,7 +5398,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 10
6
"__id__": 10
7
},
},
"_enabled": true,
"_enabled": true,
"_materials": [
"_materials": [
...
@@ -5359,7 +5430,7 @@
...
@@ -5359,7 +5430,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 10
6
"__id__": 10
7
},
},
"_enabled": true,
"_enabled": true,
"alignMode": 1,
"alignMode": 1,
...
@@ -5386,13 +5457,13 @@
...
@@ -5386,13 +5457,13 @@
"_name": "bg_good-job2",
"_name": "bg_good-job2",
"_objFlags": 0,
"_objFlags": 0,
"_parent": {
"_parent": {
"__id__": 10
5
"__id__": 10
6
},
},
"_children": [],
"_children": [],
"_active": true,
"_active": true,
"_components": [
"_components": [
{
{
"__id__": 11
0
"__id__": 11
1
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -5448,7 +5519,7 @@
...
@@ -5448,7 +5519,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 1
09
"__id__": 1
10
},
},
"_enabled": true,
"_enabled": true,
"_materials": [
"_materials": [
...
@@ -5480,7 +5551,7 @@
...
@@ -5480,7 +5551,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 10
5
"__id__": 10
6
},
},
"_enabled": true,
"_enabled": true,
"alignMode": 1,
"alignMode": 1,
...
@@ -5511,19 +5582,19 @@
...
@@ -5511,19 +5582,19 @@
},
},
"_children": [
"_children": [
{
{
"__id__": 11
3
"__id__": 11
4
},
},
{
{
"__id__": 11
6
"__id__": 11
7
}
}
],
],
"_active": true,
"_active": true,
"_components": [
"_components": [
{
{
"__id__": 1
19
"__id__": 1
20
},
},
{
{
"__id__": 12
0
"__id__": 12
1
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -5579,16 +5650,16 @@
...
@@ -5579,16 +5650,16 @@
"_name": "bar",
"_name": "bar",
"_objFlags": 512,
"_objFlags": 512,
"_parent": {
"_parent": {
"__id__": 11
2
"__id__": 11
3
},
},
"_children": [],
"_children": [],
"_active": true,
"_active": true,
"_components": [
"_components": [
{
{
"__id__": 11
4
"__id__": 11
5
},
},
{
{
"__id__": 11
5
"__id__": 11
6
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -5644,7 +5715,7 @@
...
@@ -5644,7 +5715,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 11
3
"__id__": 11
4
},
},
"_enabled": true,
"_enabled": true,
"_materials": [
"_materials": [
...
@@ -5676,7 +5747,7 @@
...
@@ -5676,7 +5747,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 11
3
"__id__": 11
4
},
},
"_enabled": true,
"_enabled": true,
"alignMode": 1,
"alignMode": 1,
...
@@ -5703,16 +5774,16 @@
...
@@ -5703,16 +5774,16 @@
"_name": "pro_label",
"_name": "pro_label",
"_objFlags": 0,
"_objFlags": 0,
"_parent": {
"_parent": {
"__id__": 11
2
"__id__": 11
3
},
},
"_children": [],
"_children": [],
"_active": true,
"_active": true,
"_components": [
"_components": [
{
{
"__id__": 11
7
"__id__": 11
8
},
},
{
{
"__id__": 11
8
"__id__": 11
9
}
}
],
],
"_prefab": null,
"_prefab": null,
...
@@ -5768,7 +5839,7 @@
...
@@ -5768,7 +5839,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 11
6
"__id__": 11
7
},
},
"_enabled": true,
"_enabled": true,
"_materials": [
"_materials": [
...
@@ -5801,7 +5872,7 @@
...
@@ -5801,7 +5872,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 11
6
"__id__": 11
7
},
},
"_enabled": true,
"_enabled": true,
"alignMode": 1,
"alignMode": 1,
...
@@ -5828,7 +5899,7 @@
...
@@ -5828,7 +5899,7 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 11
2
"__id__": 11
3
},
},
"_enabled": true,
"_enabled": true,
"_materials": [
"_materials": [
...
@@ -5860,12 +5931,12 @@
...
@@ -5860,12 +5931,12 @@
"_name": "",
"_name": "",
"_objFlags": 0,
"_objFlags": 0,
"node": {
"node": {
"__id__": 11
2
"__id__": 11
3
},
},
"_enabled": true,
"_enabled": true,
"_N$totalLength": 540,
"_N$totalLength": 540,
"_N$barSprite": {
"_N$barSprite": {
"__id__": 11
4
"__id__": 11
5
},
},
"_N$mode": 0,
"_N$mode": 0,
"_N$progress": 0,
"_N$progress": 0,
...
@@ -5930,9 +6001,6 @@
...
@@ -5930,9 +6001,6 @@
"word_layout": {
"word_layout": {
"__id__": 67
"__id__": 67
},
},
"normal_layout": {
"__id__": 90
},
"nor_label": {
"nor_label": {
"__id__": 92
"__id__": 92
},
},
...
@@ -5946,10 +6014,10 @@
...
@@ -5946,10 +6014,10 @@
"__id__": 95
"__id__": 95
},
},
"progressBar": {
"progressBar": {
"__id__": 11
2
"__id__": 11
3
},
},
"goodJob": {
"goodJob": {
"__id__": 10
5
"__id__": 10
6
},
},
"_id": "c7RS18039BKJE5rgl8xIoE"
"_id": "c7RS18039BKJE5rgl8xIoE"
}
}
...
...
assets/op_input/scene/op_input.ts
View file @
f58e6b5c
...
@@ -35,8 +35,8 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -35,8 +35,8 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
@
property
(
cc
.
Node
)
@
property
(
cc
.
Node
)
word_layout
:
cc
.
Node
=
null
;
word_layout
:
cc
.
Node
=
null
;
@
property
(
cc
.
Node
)
//
@property(cc.Node)
normal_layout
:
cc
.
Node
=
null
;
//
normal_layout: cc.Node = null;
@
property
(
cc
.
Node
)
@
property
(
cc
.
Node
)
nor_label
:
cc
.
Node
=
null
;
nor_label
:
cc
.
Node
=
null
;
...
@@ -67,6 +67,7 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -67,6 +67,7 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
}
}
initEvent
()
{
initEvent
()
{
cc
.
find
(
"
btn_cat
"
,
this
.
node
).
on
(
cc
.
Node
.
EventType
.
TOUCH_END
,
this
.
onCat
,
this
);
cc
.
find
(
"
btn_cat
"
,
this
.
node
).
on
(
cc
.
Node
.
EventType
.
TOUCH_END
,
this
.
onCat
,
this
);
cc
.
find
(
"
tips/icon
"
,
this
.
node
).
on
(
cc
.
Node
.
EventType
.
TOUCH_END
,
this
.
onWordAudio
,
this
);
// pg.event.on("startGame", () => { this.startGame() })
// pg.event.on("startGame", () => { this.startGame() })
// pg.event.on("nextPage", () => { this.nextPage() })
// pg.event.on("nextPage", () => { this.nextPage() })
pg
.
event
.
on
(
"
gameOver
"
,
()
=>
{
this
.
gameOver
()
})
pg
.
event
.
on
(
"
gameOver
"
,
()
=>
{
this
.
gameOver
()
})
...
@@ -85,6 +86,11 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -85,6 +86,11 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
this
.
setMaoAni
(
"
normal
"
);
this
.
setMaoAni
(
"
normal
"
);
});
});
}
}
private
onWordAudio
()
{
let
data
=
Game
.
getIns
().
getCurrentPage
();
cc
.
audioEngine
.
stopAll
();
pg
.
audio
.
playAudioByUrl
(
data
.
wordAudio
);
}
//根据两点获取距离
//根据两点获取距离
private
getDistance
(
p1
,
p2
)
{
private
getDistance
(
p1
,
p2
)
{
let
temp
=
p1
.
sub
(
p2
);
let
temp
=
p1
.
sub
(
p2
);
...
@@ -111,28 +117,29 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -111,28 +117,29 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
//开始游戏
//开始游戏
startGame
()
{
startGame
()
{
this
.
setMaoAni
(
"
begin
"
);
this
.
setMaoAni
(
"
begin
"
);
pg
.
audio
.
playAudioByUrl
(
Game
.
getIns
().
vectoringAudio
).
then
(()
=>
{
let
audioUrl
=
""
;
if
(
Game
.
getIns
().
roundCount
==
2
)
audioUrl
=
Game
.
getIns
().
twoVectoringAudio
;
else
audioUrl
=
Game
.
getIns
().
vectoringAudio
;
pg
.
audio
.
playAudioByUrl
(
audioUrl
).
then
(()
=>
{
this
.
setMaoAni
(
"
normal
"
);
this
.
setMaoAni
(
"
normal
"
);
});;
});;
Game
.
getIns
().
reset
();
this
.
nextPage
();
this
.
nextPage
();
}
}
nextPage
()
{
nextPage
()
{
let
data
=
Game
.
getIns
().
getCurrentPage
();
let
data
=
Game
.
getIns
().
getCurrentPage
();
data
.
randomOptions
();
//自动创建卡片
//自动创建卡片
this
.
createCrads
(
data
);
this
.
createCrads
(
data
);
this
.
showTop
(
data
);
this
.
showTop
(
data
);
this
.
progressBar
.
getComponent
(
cc
.
ProgressBar
).
progress
=
0
;
//
this.progressBar.getComponent(cc.ProgressBar).progress = 0;
}
}
private
showTop
(
data
)
{
private
showTop
(
data
)
{
let
img
=
cc
.
find
(
"
tips/img
"
,
this
.
node
);
let
img
=
cc
.
find
(
"
tips/img
"
,
this
.
node
);
let
icon
=
cc
.
find
(
"
tips/icon
"
,
this
.
node
);
let
icon
=
cc
.
find
(
"
tips/icon
"
,
this
.
node
);
let
pro_label
=
cc
.
find
(
"
pro_label
"
,
this
.
progressBar
);
let
pro_label
=
cc
.
find
(
"
pro_label
"
,
this
.
progressBar
);
if
(
data
.
page
%
2
==
0
)
{
if
(
Game
.
getIns
().
roundCount
==
2
)
{
img
.
active
=
false
;
img
.
active
=
false
;
icon
.
active
=
true
;
icon
.
active
=
true
;
cc
.
audioEngine
.
stopAll
();
pg
.
audio
.
playAudioByUrl
(
data
.
questionAudio
);
pro_label
.
getComponent
(
cc
.
Label
).
string
=
`2/2`
;
pro_label
.
getComponent
(
cc
.
Label
).
string
=
`2/2`
;
}
else
{
}
else
{
img
.
active
=
true
;
img
.
active
=
true
;
...
@@ -149,8 +156,8 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -149,8 +156,8 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
this
.
wordItams
=
[];
this
.
wordItams
=
[];
this
.
op_layout
.
removeAllChildren
();
this
.
op_layout
.
removeAllChildren
();
this
.
word_layout
.
removeAllChildren
();
this
.
word_layout
.
removeAllChildren
();
this
.
normal_layout
.
removeAllChildren
();
//
this.normal_layout.removeAllChildren();
this
.
normal_layout
.
opacity
=
0
;
//
this.normal_layout.opacity = 0;
this
.
word_layout
.
active
=
true
;
this
.
word_layout
.
active
=
true
;
list
.
optionList
.
forEach
((
op
)
=>
{
list
.
optionList
.
forEach
((
op
)
=>
{
let
item
=
cc
.
instantiate
(
this
.
op_item
);
let
item
=
cc
.
instantiate
(
this
.
op_item
);
...
@@ -165,7 +172,7 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -165,7 +172,7 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
desc
.
on
(
cc
.
Node
.
EventType
.
TOUCH_MOVE
,
this
.
onItemTouchMove
,
this
);
desc
.
on
(
cc
.
Node
.
EventType
.
TOUCH_MOVE
,
this
.
onItemTouchMove
,
this
);
desc
.
on
(
cc
.
Node
.
EventType
.
TOUCH_END
,
this
.
onItemTouchEnd
,
this
);
desc
.
on
(
cc
.
Node
.
EventType
.
TOUCH_END
,
this
.
onItemTouchEnd
,
this
);
})
})
let
wordStr
=
""
;
list
.
contentArr
.
forEach
((
data
,
idx
)
=>
{
list
.
contentArr
.
forEach
((
data
,
idx
)
=>
{
if
(
data
.
text
&&
data
.
text
!=
""
)
{
if
(
data
.
text
&&
data
.
text
!=
""
)
{
let
item
=
cc
.
instantiate
(
this
.
word_item
);
let
item
=
cc
.
instantiate
(
this
.
word_item
);
...
@@ -181,11 +188,14 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -181,11 +188,14 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
item
.
errorCount
=
0
;
item
.
errorCount
=
0
;
this
.
wordItams
.
push
(
item
);
this
.
wordItams
.
push
(
item
);
let
lable
=
cc
.
instantiate
(
this
.
nor_label
);
// let lable = cc.instantiate(this.nor_label);
lable
.
getComponent
(
cc
.
Label
).
string
=
data
.
text
||
""
;
// lable.getComponent(cc.Label).string = data.text || "";
lable
.
parent
=
this
.
normal_layout
;
// lable.parent = this.normal_layout;
wordStr
+=
data
.
text
||
""
;
}
}
})
})
this
.
nor_label
.
opacity
=
0
;
this
.
nor_label
.
getComponent
(
cc
.
Label
).
string
=
wordStr
;
}
}
private
setTouchPos
(
e
)
{
private
setTouchPos
(
e
)
{
let
location
=
e
.
getLocation
();
let
location
=
e
.
getLocation
();
...
@@ -293,20 +303,26 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -293,20 +303,26 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
private
roundOver
()
{
private
roundOver
()
{
if
(
this
.
checkRoundOver
())
{
if
(
this
.
checkRoundOver
())
{
this
.
word_layout
.
active
=
false
;
this
.
word_layout
.
active
=
false
;
cc
.
tween
(
this
.
nor
mal_layout
).
to
(
0.1
,
{
opacity
:
255
}).
start
();
cc
.
tween
(
this
.
nor
_label
).
to
(
0.1
,
{
opacity
:
255
}).
start
();
let
data
=
Game
.
getIns
().
getCurrentPage
();
let
data
=
Game
.
getIns
().
getCurrentPage
();
pg
.
audio
.
playAudioByUrl
(
data
.
wordAudio
).
then
(()
=>
{
pg
.
audio
.
playAudioByUrl
(
data
.
wordAudio
).
then
(
async
()
=>
{
this
.
goodJob
.
active
=
data
.
page
%
2
==
0
;
let
pro
=
this
.
progressBar
.
getComponent
(
cc
.
ProgressBar
);
let
pro
=
this
.
progressBar
.
getComponent
(
cc
.
ProgressBar
);
cc
.
tween
(
pro
).
to
(
1
,
{
progress
:
1
}).
delay
(
1
).
call
(()
=>
{
let
add
=
Game
.
getIns
().
addPage
();
this
.
goodJob
.
active
=
false
;
if
(
add
)
{
let
add
=
Game
.
getIns
().
addPage
();
await
pg
.
time
.
delay
(
1
);
if
(
add
)
{
this
.
nextPage
()
this
.
nextPage
()
}
else
{
if
(
Game
.
getIns
().
roundCount
==
1
)
{
Game
.
getIns
().
roundCount
=
2
;
Game
.
getIns
().
page
=
1
;
cc
.
tween
(
pro
).
to
(
1
,
{
progress
:
1
}).
delay
(
1
).
call
(()
=>
{
this
.
startGame
();
}).
start
();
}
else
{
}
else
{
this
.
goodJob
.
active
=
true
;
this
.
gameOver
();
this
.
gameOver
();
}
}
}
).
start
();
}
})
})
}
}
}
}
...
@@ -320,9 +336,10 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -320,9 +336,10 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
}
}
gameOver
()
{
gameOver
()
{
this
.
playLocalAudio
(
"
over
"
);
this
.
playLocalAudio
(
"
over
"
).
then
(()
=>
{
let
data
:
any
=
{};
let
data
:
any
=
{};
onHomeworkFinish
(
data
);
onHomeworkFinish
(
data
);
});
}
}
setMaoAni
(
aniName
)
{
setMaoAni
(
aniName
)
{
...
@@ -339,3 +356,12 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
...
@@ -339,3 +356,12 @@ export default class PuzzleJigsaw extends MyCocosSceneComponent {
})
})
}
}
}
}
/**
* 新游的调整
1. 不是播一个单词 换一轮 是播完所有单词 开始换第二轮
2. 最后弹出完整单词的时候 字母间不要有间距
3. 第二轮不需要题目音频
4. 第二轮 问号是可以点击的 发单词音
5. 播放完成音效的同时 弹出goodjob goodjob不消失
6. 音频加一个第二轮引导音频 在开始第二轮的时候 小猫自动播放第二轮引导音频
*/
\ No newline at end of file
assets/op_input/script/defaultData.ts
View file @
f58e6b5c
export
const
defaultData
=
{
export
const
defaultData
=
{
"
title
"
:
"
急速滑雪
"
,
"
questionText
"
:
"
雪地里有许多不同的,运动员要选择哪一个呢?亲爱的小玩家,请你认真听游戏指令,帮助运动员选择正确的指示牌吧!游戏结束后,根据收集到的指示牌数量,你将获得相应的能量石奖励哟!开始挑战吧!
"
,
"
questionTextAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/c3b69ad3d51385eac7d4195773ef59f7_l.mp3
"
,
"
questionTextAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/c3b69ad3d51385eac7d4195773ef59f7_l.mp3
"
,
"
questions
"
:
[
"
questions
"
:
[
{
{
...
@@ -9,23 +7,7 @@ export const defaultData = {
...
@@ -9,23 +7,7 @@ export const defaultData = {
"
type
"
:
"
txt
"
,
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
a
"
,
"
text
"
:
"
s
"
,
"
time
"
:
""
,
"
right
"
:
false
},
{
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
r
"
,
"
time
"
:
""
,
"
right
"
:
false
},
{
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
y
"
,
"
time
"
:
""
,
"
time
"
:
""
,
"
right
"
:
false
"
right
"
:
false
},
},
...
@@ -33,7 +15,7 @@ export const defaultData = {
...
@@ -33,7 +15,7 @@ export const defaultData = {
"
type
"
:
"
txt
"
,
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
c
"
,
"
text
"
:
"
a
"
,
"
time
"
:
""
,
"
time
"
:
""
,
"
right
"
:
false
"
right
"
:
false
},
},
...
@@ -41,121 +23,45 @@ export const defaultData = {
...
@@ -41,121 +23,45 @@ export const defaultData = {
"
type
"
:
"
txt
"
,
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
e
"
,
"
text
"
:
"
p
"
,
"
time
"
:
""
,
"
time
"
:
""
,
"
right
"
:
false
"
right
"
:
false
}
}
],
],
"
type
"
:
""
,
"
type
"
:
""
,
"
questionAudio
"
:
""
,
"
questionAudio
"
:
""
,
"
audioName
"
:
"
错误选项 并晃晃.mp3
"
,
"
wordAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/416b6d52f024005d31898ef1da23daa7_l.mp3
"
,
"
questImg
"
:
"
http://staging-teach.cdn.ireadabc.com/971de205dcf255850582b2737ffdda45.png
"
,
"
wordAudioName
"
:
""
,
"
contentMain
"
:
"
a p p l e
"
,
"
audioName
"
:
"
btn.mp3
"
,
"
questImg
"
:
"
http://staging-teach.cdn.ireadabc.com/faafb55c664ad966b56187a882596830.png
"
,
"
contentMain
"
:
"
h a p p y
"
,
"
contentArr
"
:
[
"
contentArr
"
:
[
{
{
"
text
"
:
"
a
"
,
"
text
"
:
"
h
"
,
"
block
"
:
true
,
"
check
"
:
1
},
{
"
text
"
:
"
p
"
,
"
block
"
:
false
,
"
check
"
:
1
},
{
"
text
"
:
"
p
"
,
"
block
"
:
false
,
"
check
"
:
1
},
{
"
text
"
:
"
l
"
,
"
block
"
:
false
,
"
block
"
:
false
,
"
check
"
:
1
"
check
"
:
1
},
},
{
{
"
text
"
:
"
e
"
,
"
block
"
:
false
,
"
check
"
:
1
}
],
"
wordAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/a44ff08578e8398ad75cba5f3fe0d5c9_l.mp3
"
},
{
"
options
"
:
[
{
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
a
"
,
"
text
"
:
"
a
"
,
"
time
"
:
""
,
"
right
"
:
false
},
{
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
r
"
,
"
time
"
:
""
,
"
right
"
:
false
},
{
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
c
"
,
"
time
"
:
""
,
"
right
"
:
false
},
{
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
d
"
,
"
time
"
:
""
,
"
right
"
:
false
},
{
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
e
"
,
"
time
"
:
""
,
"
right
"
:
false
}
],
"
type
"
:
""
,
"
questionAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/944ae51b57fb9390dd03104d9651e5f4_l.mp3
"
,
"
audioName
"
:
"
选项下落.mp3
"
,
"
questImg
"
:
""
,
"
contentMain
"
:
"
r e d
"
,
"
contentArr
"
:
[
{
"
text
"
:
"
r
"
,
"
block
"
:
true
,
"
block
"
:
true
,
"
check
"
:
1
"
check
"
:
1
},
},
{
{
"
text
"
:
""
,
"
text
"
:
"
p
"
,
"
block
"
:
false
,
"
block
"
:
false
,
"
check
"
:
1
"
check
"
:
1
},
},
{
{
"
text
"
:
"
e
"
,
"
text
"
:
"
p
"
,
"
block
"
:
true
,
"
block
"
:
true
,
"
check
"
:
1
"
check
"
:
1
},
},
{
{
"
text
"
:
""
,
"
text
"
:
"
y
"
,
"
block
"
:
false
,
"
check
"
:
1
},
{
"
text
"
:
"
d
"
,
"
block
"
:
false
,
"
block
"
:
false
,
"
check
"
:
1
"
check
"
:
1
}
}
],
]
"
wordAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/448427fe69e4bd9861aafccd533cf1fe_l.mp3
"
},
},
{
{
"
options
"
:
[
"
options
"
:
[
...
@@ -171,7 +77,7 @@ export const defaultData = {
...
@@ -171,7 +77,7 @@ export const defaultData = {
"
type
"
:
"
txt
"
,
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
n
"
,
"
text
"
:
"
e
"
,
"
time
"
:
""
,
"
time
"
:
""
,
"
right
"
:
false
"
right
"
:
false
},
},
...
@@ -179,7 +85,7 @@ export const defaultData = {
...
@@ -179,7 +85,7 @@ export const defaultData = {
"
type
"
:
"
txt
"
,
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
y
"
,
"
text
"
:
"
n
"
,
"
time
"
:
""
,
"
time
"
:
""
,
"
right
"
:
false
"
right
"
:
false
},
},
...
@@ -187,15 +93,17 @@ export const defaultData = {
...
@@ -187,15 +93,17 @@ export const defaultData = {
"
type
"
:
"
txt
"
,
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
v
"
,
"
text
"
:
"
c
"
,
"
time
"
:
""
,
"
time
"
:
""
,
"
right
"
:
false
"
right
"
:
false
}
}
],
],
"
type
"
:
""
,
"
type
"
:
""
,
"
questionAudio
"
:
""
,
"
questionAudio
"
:
""
,
"
audioName
"
:
"
选项被选择(该音效指选项属性无对错概念时候用的).mp3
"
,
"
wordAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/0913981cdeb2c6bc785de1054e80a500_l.mp3
"
,
"
questImg
"
:
"
http://staging-teach.cdn.ireadabc.com/860b17be052144b78cd89b80e3f991eb.png
"
,
"
wordAudioName
"
:
""
,
"
audioName
"
:
"
error.mp3
"
,
"
questImg
"
:
"
http://staging-teach.cdn.ireadabc.com/b625f1762fa6326c3ad773f7a73e407e.png
"
,
"
contentMain
"
:
"
s e v e n
"
,
"
contentMain
"
:
"
s e v e n
"
,
"
contentArr
"
:
[
"
contentArr
"
:
[
{
{
...
@@ -205,12 +113,12 @@ export const defaultData = {
...
@@ -205,12 +113,12 @@ export const defaultData = {
},
},
{
{
"
text
"
:
"
e
"
,
"
text
"
:
"
e
"
,
"
block
"
:
fals
e
,
"
block
"
:
tru
e
,
"
check
"
:
1
"
check
"
:
1
},
},
{
{
"
text
"
:
"
v
"
,
"
text
"
:
"
v
"
,
"
block
"
:
tru
e
,
"
block
"
:
fals
e
,
"
check
"
:
1
"
check
"
:
1
},
},
{
{
...
@@ -220,11 +128,10 @@ export const defaultData = {
...
@@ -220,11 +128,10 @@ export const defaultData = {
},
},
{
{
"
text
"
:
"
n
"
,
"
text
"
:
"
n
"
,
"
block
"
:
tru
e
,
"
block
"
:
fals
e
,
"
check
"
:
1
"
check
"
:
1
}
}
],
]
"
wordAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/b004c86f1a26a367cfa329b11e365f0f_l.mp3
"
},
},
{
{
"
options
"
:
[
"
options
"
:
[
...
@@ -240,7 +147,7 @@ export const defaultData = {
...
@@ -240,7 +147,7 @@ export const defaultData = {
"
type
"
:
"
txt
"
,
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
y
"
,
"
text
"
:
"
c
"
,
"
time
"
:
""
,
"
time
"
:
""
,
"
right
"
:
false
"
right
"
:
false
},
},
...
@@ -248,48 +155,50 @@ export const defaultData = {
...
@@ -248,48 +155,50 @@ export const defaultData = {
"
type
"
:
"
txt
"
,
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
p
"
,
"
text
"
:
"
e
"
,
"
time
"
:
""
,
"
right
"
:
false
},
{
"
type
"
:
"
txt
"
,
"
image
"
:
""
,
"
audio
"
:
""
,
"
text
"
:
"
g
"
,
"
time
"
:
""
,
"
time
"
:
""
,
"
right
"
:
false
"
right
"
:
false
}
}
],
],
"
type
"
:
""
,
"
type
"
:
""
,
"
questionAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/944ae51b57fb9390dd03104d9651e5f4_l.mp3
"
,
"
questionAudio
"
:
""
,
"
audioName
"
:
"
翻页按钮.mp3
"
,
"
wordAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/5f5d6834729bb822158a4c9a70cc955d_l.mp3
"
,
"
questImg
"
:
""
,
"
wordAudioName
"
:
""
,
"
contentMain
"
:
"
h a p p y
"
,
"
audioName
"
:
"
huaxue.mp3
"
,
"
questImg
"
:
"
http://staging-teach.cdn.ireadabc.com/fe73c194d94479b12e14843c6e92fbc4.png
"
,
"
contentMain
"
:
"
r e d
"
,
"
contentArr
"
:
[
"
contentArr
"
:
[
{
{
"
text
"
:
"
h
"
,
"
text
"
:
"
r
"
,
"
block
"
:
false
,
"
check
"
:
1
},
{
"
text
"
:
"
a
"
,
"
block
"
:
true
,
"
check
"
:
1
},
{
"
text
"
:
"
p
"
,
"
block
"
:
false
,
"
block
"
:
false
,
"
check
"
:
1
"
check
"
:
1
},
},
{
{
"
text
"
:
"
p
"
,
"
text
"
:
"
e
"
,
"
block
"
:
true
,
"
block
"
:
true
,
"
check
"
:
1
"
check
"
:
1
},
},
{
{
"
text
"
:
"
y
"
,
"
text
"
:
"
d
"
,
"
block
"
:
false
,
"
block
"
:
false
,
"
check
"
:
1
"
check
"
:
1
}
}
],
]
"
wordAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/27d9cee1b2763faae9c7ac9f14d77e41_l.mp3
"
}
}
],
],
"
audioName
"
:
"
cape.mp3
"
,
"
audioName
"
:
"
cape.mp3
"
,
"
waitAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/944ae51b57fb9390dd03104d9651e5f4_l.mp3
"
,
"
vectoringAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/36067f9e2415d59fa37c3795a3929087_l.mp3
"
,
"
twoWaitAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/cdc41b6682e155c385093c52d2a4adff_l.mp3
"
,
"
vectoringAudioName
"
:
""
,
"
vectoringAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/449e65975d358514cc3494f9f67bc012_l.mp3
"
"
waitAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/83268f4def70e408cf9243bc214592b6_l.mp3
"
,
"
twoWaitAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/944ae51b57fb9390dd03104d9651e5f4_l.mp3
"
,
"
waitAudioName
"
:
""
,
"
twoVectoringAudio
"
:
"
http://staging-teach.cdn.ireadabc.com/449e65975d358514cc3494f9f67bc012_l.mp3
"
}
}
form/src/app/form/form.component.html
View file @
f58e6b5c
...
@@ -109,6 +109,16 @@
...
@@ -109,6 +109,16 @@
<span>{{ item.vectoringAudioName}}</span>
<span>{{ item.vectoringAudioName}}</span>
</div> -->
</div> -->
</div>
</div>
<span
style=
"font-size: 20px;"
>
第二轮引导音频:
</span>
<div
style=
"display:flex ;"
>
<div>
<app-audio-recorder
[
audioUrl
]="
item
.
twoVectoringAudio
"
(
audioUploaded
)="
onAudioUploadSuccess
($
event
,
'
twoVectoringAudio
')"
></app-audio-recorder>
</div>
<!-- <div style="margin: 5px">
<span>{{ item.vectoringAudioName}}</span>
</div> -->
</div>
</div>
</div>
<div
style=
"margin: 20px;width: 1000px;"
>
<div
style=
"margin: 20px;width: 1000px;"
>
<div
*
ngFor=
"let question of item.questions; let i = index"
>
<div
*
ngFor=
"let question of item.questions; let i = index"
>
...
@@ -117,24 +127,7 @@
...
@@ -117,24 +127,7 @@
<div
class=
"word-type-title"
>
<div
class=
"word-type-title"
>
题目{{i+1}}
题目{{i+1}}
</div>
</div>
<div
*
ngIf=
"i%2 == 1"
class=
"option-audio"
>
<div
>
<div
class=
"word-input-title"
>
题目音频:
</div>
<div
style=
"display: flex"
>
<div>
<app-audio-recorder
[
audioUrl
]="
question
.
questionAudio
"
(
audioUploaded
)="
onAudioUploadSuccess
($
event
,
'
questionAudio
',
question
)"
>
</app-audio-recorder>
</div>
<!-- <div style="margin: 5px">
<span>
{{ question.audioName}}
</span>
</div> -->
</div>
</div>
<div
*
ngIf=
"i %2== 0"
>
<div
class=
"word-input-title"
>
<div
class=
"word-input-title"
>
题目图片:
题目图片:
</div>
</div>
...
...
form/src/app/form/form.component.ts
View file @
f58e6b5c
...
@@ -21,6 +21,7 @@ export class FormComponent extends ComponentBase implements OnInit, OnChanges, O
...
@@ -21,6 +21,7 @@ export class FormComponent extends ComponentBase implements OnInit, OnChanges, O
questions
:
[],
questions
:
[],
audioName
:
""
,
audioName
:
""
,
vectoringAudio
:
""
,
vectoringAudio
:
""
,
twoVectoringAudio
:
""
,
vectoringAudioName
:
""
,
vectoringAudioName
:
""
,
waitAudio
:
""
,
waitAudio
:
""
,
twoWaitAudio
:
""
,
twoWaitAudio
:
""
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment