This repository has been archived by the owner on Oct 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathChat.js
186 lines (164 loc) · 6.18 KB
/
Chat.js
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
const YOU = 0;
const ENEMY = 1;
function Chat(x, y, wid, heig){
this.regExp = "s";
//speichert den Gesamten chat
this.chat = [];
//speichert die momentan geschriebene Nachricht
this.msg;
//definiert die höhe des Textes
this.heightT;
//indikator für den Focus auf dem textField
this.focus;
//indikator für den Status des
//"Momentane Positions Strich" im textField
this.blink;
//wird benötigt um regelmäßig zu blinken
this.count;
//zum senden der Nachrichten
this.dataManager;
this.setup = function(dataManager){
this.msg = "";
textSize(20);
this.heightT = textAscent() + textDescent();
this.focus = false;
this.blink = false;
this.count = 0;
this.dataManager = dataManager;
}
//zum darstellen des Textes und des Chats
this.show = function(){
push();
//übersetzt den Ursprung auf die Mitte des Feldes
translate(x+wid/2, y+heig/2);
//setzt die Textanlehnung auf Links und Unten
textAlign(LEFT, BOTTOM);
//es soll normal geschrieben werden
textStyle(NORMAL);
//print chatField
fill(120);
rectMode(CENTER);
rect(0, 0, wid, heig);
//print msg box
fill(255);
rect(0, heig*0.4, wid-wid/15, heig/30*4);
//alle 30 frames soll der Strich blinken
if(this.count%30 == 0){
this.blink = this.blink ? false : true;
}
this.count++;
//zeichne den Strich wenn es focusiert ist und blinken soll
if(this.focus && this.blink){
line(-wid*0.45 + textWidth(this.msg), heig*0.4-(this.heightT/2), -wid*0.45 + textWidth(this.msg), heig*0.4+(this.heightT/2));
}
//print msg
fill(0);
text(this.msg, 0, heig*0.28 + this.heightT, wid-20, this.heightT);
//print chat
//für jeden inhalt im Chat eine neue Zeile
for(var i = 0; i < this.chat.length; i++){
//darf icht größer sein als das TextField
if(heig*0.35-(this.heightT)*(this.chat.length-i) > -heig/2.5){
//jenachdem wer geschrieben hat ändert sich die Seite
//des Textes
textAlign(((this.chat[i][1]) == YOU) ? RIGHT : LEFT);
text(this.chat[i][0], 0, heig*0.30-(this.heightT)*(this.chat.length-i), wid-20, this.heightT);
}
}
//übersetzte den ursprung zurück auf 0,0
translate(0, 0);
pop();
}
//---------------------------inputs--------------------------------//
//wird aufgerufen wenn ein input betätigt wurde und
//entscheidet welche Inputmethode aufgerufen wird
this.callInput = function(inputTyp, data){
if(inputTyp == "KeyPressed"){
return this.keyPressedChat(data[0], data[1]);
}
if(inputTyp == "MousePressed"){
this.mousePressedChat(data.x, data.y);
}
}
//wenn eine Taste gedrückt wurde
this.keyPressedChat = function(key, keyCode){
//führe das nur aus wenn der focus auf dem textfield liegt
if(this.focus){
//nur zugelassene Tasten sollen zur neuen Nachricht
//hinzugefügt werden und die Nachricht darf nicht zu lang sein
if(keyCode != ENTER &&
keyCode != BACKSPACE &&
((key+"").length) <= 1 &&
this.checkValidKey(key+"") &&
textWidth(this.msg) < wid-20-textWidth("W")){
//hänge den gedrückten buchstaben an die Nachicht an
this.msg += key;
}
//wenn enter gedrückt wurde sende die nachricht
if(keyCode == ENTER){
dataManager.send("CH", "Reply", this.msg);
this.printMsg();
}
//lösche den letzten buchstaben wenn Backspace gedrückt wurde
if(keyCode == BACKSPACE){
if(this.msg.equals != "")
this.msg = this.msg.substring(0, this.msg.length-1);
}
return true;
}
return false;
}
//wird aufgerufen wenn due maus aufgerufen wird
this.mousePressedChat = function(mX, mY){
if(mX > x+wid/15 && mX < x+wid-wid/15 && mY > y+heig/2+heig*1/3 && mY < y+heig/2+heig*7/15){
//wenn ins Textfield gedrückt wird, setzte den focus und
//den count und starte zu blinken
this.focus = true;
this.blink = true;
this.count = 31;
}else{
//
this.focus = false;
}
}
//um die scrollDown und die leaveSite Function zu unterbinden
window.onkeydown = function(e) {
if (e.keyCode == 32 && e.target == document.body) {
e.preventDefault();
}
if (e.keyCode == 8 && e.target == document.body) {
e.preventDefault();
}
};
//---------------------------inputs--------------------------------//
//prüft ob ein gültiger Buchstabe oder ein Zeichen gefrückt wurde
this.checkValidKey = function(key){
return new RegExp("^[a-zA-Zß0-9 .,;:öäü!?/()_-]+$").test(key);
}
//schreibt die geschriebene Massage in den chat
this.printMsg = function(){
//entfernt leerzeichen vor und nach dem String, aber ändert
//den string nicht -> leerziechen im String werden ignoriert
this.msg = this.msg.trim();
//wenn die msg größer als 0 ist
if(this.msg.length > 0){
//hänge die Nachricht and den Chat dran
this.chat.push([this.msg, YOU]);
//setzte die nachricht wieder auf 0, bzw einen leeren String
this.msg = "";
}
}
//schreibt die ÜBERGEBENE Nachricht in den chat, ohne dass man
//eine nachricht schreiben muss
this.postMsg = function(msg_){
this.chat.push([msg_, ENEMY]);
}
//gibt den Text an der Position index zurück
//(1 <= index < arr.length) wie im chat dargestellt
this.getMsg = function(index){
if(0 < index && index <= this.chat.length){
return this.chat[index-1];
}
return null;
}
}