Autor Thema: Telefon-Display  (Gelesen 6546 mal)

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1262
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Telefon-Display
« am: 02. September 2009, 11:53:42 »
Hallo Leutz!

In der Epi "Die Schöne und das Biest" gibt es ja dieses Telefon. Dies wurde sicherlich nicht mit Objects gebastelt (da man hierfür ja viel zu viele Objects benötigt). Deshalb wäre ich sehr neugierig, wie EdisonInteractive dieses Telefon programmiert hat. ;)

BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

FrasierCrane

  • kleiner Tentakel
  • ***
  • Beiträge: 154
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Telefon-Display
« Antwort #1 am: 02. September 2009, 11:59:04 »
Ich weiß zwar nicht mehr genau, wie das Telefon in "Die Schöne und das Biest" ausgeschaut hat, aber Timer hat auf seiner MMM-Seite ein sehr gutes Tutorial zum Thema "Wähltasten". Das solltest du dir mal anschauen. Zu finden ist das ganze hier: http://ntimer.de.tl/Telefon-s-W.ae.hltasten.htm
"Jazz is not dead - it just smells funny." (Frank Zappa)

Edison Interactive

  • kleiner Tentakel
  • ***
  • Beiträge: 103
    • Profil anzeigen
Re: Telefon-Display
« Antwort #2 am: 03. September 2009, 00:43:44 »
Unser Trick war, wir haben die Telefonnummer in einem Integer gespeichert. Bei jedem weiteren Tastendruck wurde, sofern die Zahl weniger als 9 Ziffern betrug, die alte Zahl mit 10 multipliziert und dann der Wert der Taste hinzu addiert. Also eigentlich ganz einach, man muss dann nur noch aufpassen, dass die Nummer, die nach jedem Tastendruck Mittels RawPrint wieder neu in den Hintergrund gezeichnet wird, an der richtigen Position ist.

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1262
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Telefon-Display
« Antwort #3 am: 03. September 2009, 13:35:02 »
Hmm, ja mit RawPrint und nem Integer habe ich bisher noch nie gearbeitet gehabt.

Hab mir mal das Telefon-Tutorial angeschaut. Das Overlay.CreateTextual bewirkt hier sicherlich, dass die gedrückten Zahlen in dem jeweiligen Bildschirmbereich angezeigt werden, richtig?


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

NsMn

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1646
  • Geschlecht: Männlich
  • überzeugter Paint-Nutzer
    • ICQ Messenger - 404385098
    • Profil anzeigen
    • E-Mail
Re: Telefon-Display
« Antwort #4 am: 03. September 2009, 15:09:24 »
Ja.  ;)

Aber, du hast noch nie einen Integer benutzt? Auch nicht bei deiner Episode?

und noch zuletzt: ich würde eindeutig die Variante mit dem String, wie Timer sie verwendet, benutzen. Die ist wesentlich kürzer und, meiner Meinung nach, sicherer.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Telefon-Display
« Antwort #5 am: 04. September 2009, 15:53:03 »
Nehmen wir mal das Bild aus Timers Tutorial:



Taste 1 ist bei 128;40 - 143;51 (16x12)
Taste 2 ist bei 152;40
Taste 4 ist bei 128;56

Wir können also von 128;40 ausgehend ein 24x16 großes Raster drüberlegen.
Das heißt ich ziehe bei einem Klick von den Mauskoordinaten 128;40 ab und teile sie durch 24;16.
So erhalte ich die Spalte(x) und Zeile(y) des angeklickten Feldes.
Als nächstes überprüfe ich, ob das Feld im Bereich der Taste angeklickt worden ist. Dazu teile ich durch 24;16, aber nicht mit / sondern mit %. Dadurch bekomme ich nicht das gerundete Ergebnis, sondern den Rest; dieser muss kleiner als 16;12 sein. Falls nicht: -> Aussteig
Dann berechne ich die gedrückte Taste mit Hilfe von Zeile und Spalte; das Ergebnis liegt im Bereich 0-11

Der Code sieht so aus:

void Call(int number) {
  if (number == 1234) {
    ...
  }
}

void Dial(String key) {
  String d = lblTelDisplay.Text;
  if (d.Length == 4) d = key;
  else d = d.Append(key);
  lblTelDisplay.Text = d;
  if (d.Length == 4) Call(d.AsInt);
}

function hTasten_AnyClick() {
  int x = mouse.x - 128;
  int y = mouse.y - 40;
  int fx = x/24;
  int fy = y/16;

  int t = y*3+x;
  String keys = "123456789*0#";
  String key = String.Format("%c", keys.Chars[t]);
  Dial(key);
}

Edit: Mir fiel gerade ein, dass man den Hotspot ja nur auf den Tasten einzeichnen kann...
« Letzte Änderung: 05. September 2009, 14:13:48 von KhrisMUC »

ManiacTwister

  • volljähriger Tentakel
  • *****
  • Beiträge: 727
  • Geschlecht: Männlich
  • Aktionslisten Admin
    • Profil anzeigen
    • Aktionsliste
Re: Telefon-Display
« Antwort #6 am: 17. Dezember 2009, 22:44:46 »
hi, ich hab ein schweres problem:
ich habe ein gui erstellt(gGui1) das mir ein eingabefeld für einen "tresor" darstellen soll.
das funktioniert soweit auch bis auf 1kleinigkeit und zwar:
Zahl = "";
Zahlstatus = Overlay.CreateTextual (40, 130, 200, 1, 7, "");
in einem room würde ich das jetzt in "enters room before fade in" machen. aber wohin kommt das im Global script rein?
lg, twister
« Letzte Änderung: 17. Dezember 2009, 22:54:16 von ManiacTwister »

Zitate:
Die Intelligenz in der Welt bleibt konstant. Nur dumm, dass die Bevölkerung wächst.
Mein charakter ist derb! fies und gemein!

Timer

  • volljähriger Tentakel
  • *****
  • Beiträge: 763
  • Geschlecht: Männlich
    • ICQ Messenger - 275798409
    • AOL Instant Messenger - commandertimer
    • Profil anzeigen
    • Meine Seite
    • E-Mail
Re: Telefon-Display
« Antwort #7 am: 18. Dezember 2009, 18:54:41 »
Du könntest es an die Stelle setzen, an der du programmiert hast, wie das GUI aufgerufen wird.

(wenn das GUI z.B. durch eine Hotspotbenutzung aufgerufen wird, schreibst du es in die Funktion, in der das GUI aufgerufen wird)

Bsp:
if (any_click_move (100, 100, DIR_UP)) {
  if (UsedAction (A_USE)) {
    gGUI1.Visible = true;
    Zahl = "";
    Zahlstatus = Overlay.CreateTextual (40, 130, 200, 1, 7, "");
  }
}

Beim schließen des GUIs sollte der Overlay dann wieder gelöscht werden (hab grad nicht ganz vor Augen, wie das geht, aber das kriegst du schon hin. ;))

Aber wenn du ein GUI verwendest, könntest du einfach ein GUI-Textfeld erstellen, es an die gewünschte Position bringen und dessen Text dann verändern. Wär einfacher - und vielleicht auch effektiver (du brauchst es nicht beim Schließen zu löschen und ich bin mir nicht ganz sicher, ob Overlays auch tatsächlich vor GUIs angezeigt werden).

ManiacTwister

  • volljähriger Tentakel
  • *****
  • Beiträge: 727
  • Geschlecht: Männlich
  • Aktionslisten Admin
    • Profil anzeigen
    • Aktionsliste
Re: Telefon-Display
« Antwort #8 am: 18. Dezember 2009, 19:06:04 »
*edit*ok habs geschafft, danke nochmal*edit*
thx schonmal für die overlay lösung.
lg,twister
« Letzte Änderung: 18. Dezember 2009, 20:24:44 von ManiacTwister »

Zitate:
Die Intelligenz in der Welt bleibt konstant. Nur dumm, dass die Bevölkerung wächst.
Mein charakter ist derb! fies und gemein!

Rayman

  • Dott-MMM-Entwickler
  • Midlife Crisis Tentakel
  • **
  • Beiträge: 1580
    • Profil anzeigen
Re: Telefon-Display
« Antwort #9 am: 28. Dezember 2009, 09:37:13 »
Hab da jetzt selber ein riesen Problem:

Ich habe einen Telefon-Script mit dem Tutorial von Timer erstellt und es gibt da 3 Problem:

-Die Stern und Route-Tasten kann ich im Script nicht eintragen Bsp.: waehle (*); weil sonst eine Fehlermeldung kommt.

-Selbst ohne die zwei oben genannten Tasten bin ich zwar fertig geworden, aber nach dem viermaligen anklicken der Tasten verschwinden die Zahlen nicht und es erscheint auch kein "Kein Anschluss unter dieser Nummer.".
Wenn ich eine neue Nummer eingebe, dann überspringen die Zahlen die Vierstellige Nummer, dass ich dann einen Zahlensalat rausbekomme.

-Im Hintergrund des Tastenbildschirms habe ich einen Hotspot gemacht, womit man wieder zurück zum Room gelangt, wo man das Telefon benutzte. Wenn ich es aber wieder benutzen will und irgendeine Taste betätige, dann stürtzt das Spiel ab.

Was kann ich dagegen machen? :-[
« Letzte Änderung: 28. Dezember 2009, 09:38:27 von Rayman »

NsMn

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1646
  • Geschlecht: Männlich
  • überzeugter Paint-Nutzer
    • ICQ Messenger - 404385098
    • Profil anzeigen
    • E-Mail
Re: Telefon-Display
« Antwort #10 am: 28. Dezember 2009, 10:51:01 »
Zum ersten: Das Prolem ist, dass das Sternchen keine Zahl ist, sondern ein Rechenoperator, also ergibt das ganze, dass ein leerer String angefügt wird. Du musst also wohl eine Extra-Waehle-Funktion machen, die statt einem int ein String verlangt.

Timer

  • volljähriger Tentakel
  • *****
  • Beiträge: 763
  • Geschlecht: Männlich
    • ICQ Messenger - 275798409
    • AOL Instant Messenger - commandertimer
    • Profil anzeigen
    • Meine Seite
    • E-Mail
Re: Telefon-Display
« Antwort #11 am: 28. Dezember 2009, 15:52:47 »
Zum zweiten (und zum ersten):

Ich habe gerade gemerkt, dass der Code im Tutorial nicht wirklich ideal ist.

Jedenfalls sollte alles funktionieren, wenn du die "waehle"-Funktion so umschreibst:
function waehle (String Nummer) {
  Zahl = Zahl.Append (Nummer.Copy ());
  Zahlstatus.SetText (200, 1, 7, "%s", Zahl);
 
  if (Zahl == "0000"){
    Display ("RICHTIG!");
    Wait (60);
    PlaySound (99);
  }
  if (Zahl.Length == 4) {
    Zahl = "";
    Wait (30);
    Zahlstatus.SetText (200, 1, 7, "%s", Zahl);
  }
}

Jetzt verschwindet die Zahl jedes Mal nachdem man eine vollständige Nummer eingegeben hat.
Man muss nun aber beachten, dass man bei den Zahl-Hotspots (bzw. Objects) nicht mehr waehle (1); oder ähnliches schreiben darf, sondern waehle ("1");...weil die eingegebene Zahl jetzt ja ein String und kein Integer mehr ist.

Der Vorteil: Man kann auch Sonderzeichen (*) oder Buchstaben (e) beim wählen verwenden (wenn die Tasten dazu gegeben sind). Also sind Passwörter bei einem virtuellem Computer mit Tastatur damit dann auch kein Problem mehr.

Rayman

  • Dott-MMM-Entwickler
  • Midlife Crisis Tentakel
  • **
  • Beiträge: 1580
    • Profil anzeigen
Re: Telefon-Display
« Antwort #12 am: 30. Dezember 2009, 12:58:41 »
Hab's probriert und es funktioniert jetzt besser als der Script im Tutorial, doch leider treten neue Probleme auf:

-Wenn ich die richtige Nummer eingebe, und habe vorher eine Falsche eingegeben, dann wird die Funktion bei Eingabe einer falschen Nummer auch aktiviert.

-Wenn ich 1-3 Nummern eingegeben habe und verlasse den Telefonscreen, und benutze erneut das Telefon und betätge eine x-beliebige Taste, stürzt das Spiel ab.

-Wenn ich die richtige Nummer eingegeben habe, dann verschwindet die richtige Nummer nicht mehr. :-[

Ich brauche wieder Hilfe. :'(

Timer

  • volljähriger Tentakel
  • *****
  • Beiträge: 763
  • Geschlecht: Männlich
    • ICQ Messenger - 275798409
    • AOL Instant Messenger - commandertimer
    • Profil anzeigen
    • Meine Seite
    • E-Mail
Re: Telefon-Display
« Antwort #13 am: 30. Dezember 2009, 15:11:28 »
Zu 1:
Ich habe momentan noch keine Idee, woran das liegen könnte. Hab ich das richtig verstanden:
Du gibst eine falsche Nummer ein (z.B. 5737), dann eine richtige (z.B. 0000) -> die Funktion wird ausgelöst.
Dann gibst du wieder eine falsche Nummer ein (z.B. 4275) und die Funktion für 0000 wird ausgelöst?

Zu 2:
Du könntest ja mal versuchen, in der "leave-room"-Funktion den Zahl-String zu leeren. ( Zahl = ""; )
Aber ich kann keine Garantie geben, dass es klappt.

Zu 3:
Sicher, dass du kein "else" vor dem hier stehen hast?
  if (Zahl.Length == 4) {
    Zahl = "";
    Wait (30);
    Zahlstatus.SetText (200, 1, 7, "%s", Zahl);
  }
}
Damit wird die Zahl auf "nichts" zurückgesetzt und die Zahlenanzeige wird gelöscht. Das muss auf jeden Fall getan werden, dann sollte das auch klappen...

Rayman

  • Dott-MMM-Entwickler
  • Midlife Crisis Tentakel
  • **
  • Beiträge: 1580
    • Profil anzeigen
Re: Telefon-Display
« Antwort #14 am: 31. Dezember 2009, 00:04:36 »
Zu 1:
Ich habe momentan noch keine Idee, woran das liegen könnte. Hab ich das richtig verstanden:
Du gibst eine falsche Nummer ein (z.B. 5737), dann eine richtige (z.B. 0000) -> die Funktion wird ausgelöst.
Dann gibst du wieder eine falsche Nummer ein (z.B. 4275) und die Funktion für 0000 wird ausgelöst?

Nein, wenn ich eine falsche Nummer eingebe, dann wird nur die Funktion für den falschen Nummern-Script verwendet. Wenn ich die richtige Nummer eingebe, dann wird sowohl der Script der richtigen Nummer ausgeführt, als auch der Script für die falsche Nummer.

Zu 2:
Du könntest ja mal versuchen, in der "leave-room"-Funktion den Zahl-String zu leeren. ( Zahl = ""; )
Aber ich kann keine Garantie geben, dass es klappt.

Danke, Timer, werde ich jetzt gleich ausprobieren.

Zu 3:
Sicher, dass du kein "else" vor dem hier stehen hast?
  if (Zahl.Length == 4) {
    Zahl = "";
    Wait (30);
    Zahlstatus.SetText (200, 1, 7, "%s", Zahl);
  }
}
Damit wird die Zahl auf "nichts" zurückgesetzt und die Zahlenanzeige wird gelöscht. Das muss auf jeden Fall getan werden, dann sollte das auch klappen...

Das hatte ich schon versucht, aber es funktioniert nur, wenn ich jetzt nur den einen Text wiedergeben will wie "Kein Anschluss unter dieser Nummer." Sobald ich noch den dementsprechenden Sound und die Wartezeit hinzufüge, dann wird der Script für die Falscheingabe trotzdem mitausgeführt.

EDIT: Hab den letzten Fehler selber gefunden. Ich danke dir vielmals für deine Hilfe, Timer. :D
« Letzte Änderung: 31. Dezember 2009, 17:18:48 von Rayman »