tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von CPoly
  • 1 Beitrag von CPoly
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
282
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ricounltd ricounltd ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    35
    Hallo,
    ich habe derzeit folgendes Problem. Mein Script sieht aktuell wie folgt aus:
    HTML-Code:
    function gameplay_start(event) {
      var current_position_x = document.getElementById('user').offsetTop;
      var current_position_y = document.getElementById('user').offsetLeft;
      
      /** Spielfigur nach rechts bewegen, solange die Taste gedrückt wird */
      if(event.keyCode == 39) {
    	document.getElementById('user').style.width = '20px';
    	
    	var new_position = current_position_y + 10;
    	document.getElementById('user').style.left = new_position + 'px';
    	document.getElementById('user').style.backgroundPosition = '-36px 0';
      }
    }
    
    function gameplay_stop(event) {
      /** Spielfigur anhalten, wenn Taste (nach rechts) losgelassen wird */
      if(event.keyCode == 39) {
    	document.getElementById('user').style.width = '17px';
    	document.getElementById('user').style.backgroundPosition = '-19px 0';
      }
    }
    Das funktioniert schon ganz gut, nur leider sieht es nicht so aus, als würde sich die Spielfigur auch wirklich bewegen. Ich müsste es also irgendwie realisieren, dass sich der Hintergrund (bzw. dessen Position, weil ich Sprites verwende) ändert. Also wieder zurück auf den Ursprungswert (-19px) stellt. Nur weiss ich beim Besten Willen nicht wie ich es anstellen soll.

    Folgender Ablauf soll also dargestellt werden:
    - wenn Taste (nach rechts, ID:39) gedrückt wird, dann wechsle die Hintergrundbild-Position auf -19px (denn an dieser Stelle schaut die Spielfigur nach rechts)
    - solange wie die Taste (39) gedrückt wird, soll sich die Hintergrundbild-Position zwischen -19px und -36px immmerwieder wechseln

    Ich hoffe ihr könnt mir helfen. Würde mich darüber sehr freuen! Vielen Dank schonmal im voraus.
    Geändert von ricounltd (30.10.11 um 18:41 Uhr)
     

  2. #2
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Mach folgendes:

    Wenn die 39 gedrückt wurde (keydown), starte einen Timer mittel setInterval. Bei jedem Auslösen wechselst du die Hintergrund position.

    Wenn eine Taste losgelassen wird (keyup), stoppst du den Timer mittels clearInterval.
    ricounltd bedankt sich. 

  3. #3
    ricounltd ricounltd ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    35
    ...ok, danke. Aber wie mache ich das denn? So etwa:
    HTML-Code:
    setInterval(document.getElementById('user').style.backgroundPosition = '-36px 0',500);
    Wie kommt der dann aber wieder auf den Wert "-19px" zurück? Bin ein echter Anfänger in diesem Bereich.
     

  4. #4
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Ungetesteter Code

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    var
        userElem = document.getElementById('user'),
        animate = false,
        pos = -19,
        timer = null;
     
    document.onkeydown = function(e) {
        e = e || window.event;
        
        if((e.which || e.keyCode) === 19) {
            timer = setInterval('animate()', 500);
        }
    }
     
    document.onkeyup = function() {
        clearInterval(timer);
    }
     
    function animate() {
        pos = (pos === -19) ? -36 : -19;
        
        userElem.backgroundPosition = pos + 'px 0px';
    }
     

  5. #5
    ricounltd ricounltd ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    35
    Oh man, da seh ich ja nicht durch - was soll der Code bedeuten? Funktioniert auch nicht so wie du ihn gepostet hast. Aber sag mal wo wir gerade dabei sind... ist es eigentlich möglich in einem externen Script zu prüfen, ob eine Taste gedrückt wird/wurde und welche es ist oder funktioniert das nur in dem ich im Body-Tag mit dem Event-Handler "onkeydown" eine Funktion aufrufe und diese dann nur prüfen kann, welche Taste gedrückt wurde?

    ~edit: ich hab das mal mit dem "document.getElementById" als "var" getestet und das funktioniert nicht, das Element kann ich so in Funktionen nicht nutzen, keine Ahnung was ich falsch mache -.-
    Geändert von ricounltd (30.10.11 um 20:26 Uhr)
     

  6. #6
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Meinen Code kannst du so in eine externe Datei kopieren.

    Es gibt drei Möglichkeiten einen Event-Handler zu definieren

    1. Im Dokument als Attribut. Wie du beschrieben hast, man gibt z.B. beim body-Element dem Attribut "onkeydown" den Namen einer JavaScript Funktion.

    2. Im Code, in dem man dem DOM Element die entsprechende Eigenschaft gibt. Das habe ich in meinem Code gemacht (document.onkeydown = ...). Das würde z.B. auch mit dem "user" Element funktionieren.

    3. Im Code, in dem man beliebig viele Event Handler mittels "addEventListener" an ein DOM Element hängt. Das Funktion z.B. nicht im IE, da muss man "attachEvent" benutzen.


    Ich habe meinen Code jetzt mal getestet und er war leicht fehlerhaft. Habe ihn geändert.

    Code 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
        userElem = document.getElementById('user'),
        animate = false,
        pos = -19,
        timer = null;
     
    document.onkeydown = onKeyDown;
    document.onkeyup = onKeyUp;
     
    function onKeyDown(e) {
        e = e || window.event;
        
        if((e.which || e.keyCode) === 39) {
            timer = setInterval('onTimer()', 500);
        }
        
        //Funktion entfernen, weil wir weitere Tastendrucke ignorieren
        document.onkeydown = null;
    }
     
    function onKeyUp(e) {
        clearInterval(timer);
        
        //Funktion wieder dran hängen
        document.onkeydown = onKeyDown;
    }
     
    function onTimer() {
        pos = (pos === -19) ? -36 : -19;
        
        userElem.style.backgroundPosition = pos + 'px 0px';
    }

    Und den Code habe ich in diese HTML Datei eingebunden.

    HTML-Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    	
    	<title>Animation</title>
    	
    	<style type="text/css">
    	#user {
    		width:100px;
    		height:100px;
    		background:url(img.jpg) left top no-repeat;
    	}
    	</style>
    </head>
    
    <body>
    	<div id="user"></div>
    	
    	<script type="text/javascript" src="anim.js"></script>
    </body>
    
    </html>
     

  7. #7
    ricounltd ricounltd ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    35
    Tut mir echt leid, aber das ganze funktioniert so nicht. Ich kann diesen Code in eine externe Javascript-Datei packen:
    HTML-Code:
    document.onkeydown = meine_funktion();
    
    function meine_function() {
      alert('hallo welt!');
    }
    und es funktioniert nicht einmal!

    Ich muss es immer im Body-Tag angeben:
    HTML-Code:
    <body onkeydown="meine_function();">
    Ich versteh das nicht?!

    Wenn ich den JS-Code von oben in die HTML-Datei schreibe (also nicht extern auslagere) funktioniert es jedoch. Meine externe JS-Datei binde ich wie folgt ein:
    HTML-Code:
    <script type="text/javascript" src="rsrc/js/script.js"></script>
    ~edit: Habe soeben bemerkt, dass wenn ich den Code mit "onkeydown" und der Funktion an den Anfang der Datei setze führt er es aus, aber sobald ich Variablen davor definiere, dann tut es er dies nicht mehr.
    Geändert von ricounltd (30.10.11 um 23:15 Uhr)
     

  8. #8
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Vergleiche mal die beiden Zeilen, eine von mir und eine von dir.

    Code javascript:
    1
    2
    3
    
    document.onkeydown = onKeyDown;
     
    document.onkeydown = meine_funktion();

    Fällt dir was auf?


    Zitat Zitat von VanLexus Beitrag anzeigen
    aber sobald ich Variablen davor definiere, dann tut es er dies nicht mehr.
    JavaScript wird gestoppt, sobald ein Fehler auftritt. Also hast du vermutlich bei der Variablen Deklaration einen Fehler. Zeig mal den Code.
     

  9. #9
    ricounltd ricounltd ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    35
    Hey,
    also ich hab den Fehler gefunden. Die Klammern () waren überflüssig und ich musste das Einbinden des externen JS-Codes vor dem schliessenden </body>-Tag verschieben.
     

  10. #10
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Also funktioniert jetzt alles wie du wolltest?


    Zitat Zitat von VanLexus Beitrag anzeigen
    und ich musste das Einbinden des externen JS-Codes vor dem schliessenden </body>-Tag verschieben.
    Der Browser geht von oben nach unten vor und parst das HTML. Sobald er auf ein Script Tag stößt, führt er es aus. Wenn du das Script vor dem "#user" Element einbindest, wurde dieses noch gar nicht geparst und es wird deshalb nicht gefunden.
    Anstatt das Skript ans Ende des Dokumentes zu setzen, könnten du z.B. auch den ganzen Code in eine body-onload Funktion stecken. Denn wenn diese ausgeführt wird, sind auf jeden Fall alle Element geparst worden.
    ricounltd bedankt sich. 

Ähnliche Themen

  1. Beim Klick Hintergrund wechseln
    Von h4dhunTer im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 27.12.07, 01:50
  2. Augenpaar-bewegung animieren
    Von bastiman im Forum Cinema 4D
    Antworten: 2
    Letzter Beitrag: 25.08.07, 11:22
  3. mausrad bewegung simulieren
    Von BIG_Muzzy im Forum Visual Basic 6.0
    Antworten: 12
    Letzter Beitrag: 02.08.05, 19:20
  4. Bewegung von Wasser-Map animieren
    Von tganter im Forum 3D Studio Max
    Antworten: 6
    Letzter Beitrag: 01.10.04, 07:59
  5. Desktop Hintergrund wechseln
    Von gRaf-eny im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 20.09.04, 17:06