Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

1

22.11.2011, 19:35

[HTML5 / JS] Klassen effektiv simulieren?

Hey ich versuche gerade ein ordentliches Spiel mit HTML5 und JS umzusetzen.
Dabei habe ich festegestellt, dass mir das OOP in JS doch sehr fehlt.
Habe von vielen Varianten gehört und gelesen, wie man OO teilweise "simulieren" kann,
aber das klappt dann nicht so ganz. Welche Variante benutzt ihr?

Hier ist der Code, den ich bisher für mein "Spiel " verwende... (Steuerung: Pfeiltasten, bisher nur Bewegung)
Klappt ja auch alles soweit, aber wenn ich dann an den Punkt komme, bei dem ich
Patronen verschießen möchte, komm ich nicht mehr weiter. Momentan ist der Player
ja so aufgebaut:

Quellcode

1
2
3
4
5
6
var player = new Image();
player.src = "Player.png";
var PlayerPositionX = 0.0;
var PlayerPositionY = 0.0;
var PlayerVelocityX = 0.0;
var PlayerVelocityY = 0.0;

Das heißt, diese Variablen sind ja nicht auf ein Objekt bezogen, sondern können
von überall genutzt werden. Würde ich dasselbe also mit Patronen machen,
dann könnte ich ja nur eine einzige im Spiel haben... :/

Für Patronen habe ich normalerweise eine Liste (oder hier ja eher ein Array), der ich,
immer wenn es "nötig" ist eine neue Instanz hinzufüge. Diese Liste Update und Zeichne
ich dann. Aber ohne Klassen geht das nicht :(

Wie also sonst machen? Oder gibt es eine effektive Methode, Klassen, so wie ich sie brauche,
zu "simulieren"?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

JRJ

Treue Seele

Beiträge: 113

Wohnort: Tirol

Beruf: Schüler

  • Private Nachricht senden

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

22.11.2011, 23:46

ich habe zu dem Thema das Buch "Javascript - Objektorientierung und Entwurfsmuster" (Amazon, Terrashop, ...)

wenn ich mich richtig erinnere wird die objektorientierte Programmierung darin wie folgt beschrieben:
im Gegensatz zu anderen Programmiersprachen gibt es keine Klassen als Vorlagen für Objekte, sondern Objekte (es baut also auf Prototypen auf)
du müsstest dir für deine Basisprototypen (bzw. Basis"klassen") ein Objekt erzeugen, dem du Variablen und Funktionen hinzufügst
von diesem Prototypen kannst du dann weitere Kopien erzeugen, denen du weitere Variablen und Funktionen zuweisen kannst
Edit:
die so erzeugten Objekte sind dann die Prototypen, von denen weitere Objekte erzeugt werden können, die keine weitere Funktionalität mitbringen müssen (sie haben ab dann quasi den gleichen Zweck, wie Klassen)

da ich morgen mal wieder arbeiten muss, hoffe ich, dass diese kurze Beschreibung erst einmal reicht
wenn Bedarf besteht, kann ich diese genauer ausführen oder Beispielcode anhängen
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

5

23.11.2011, 00:01



Methode 1.2. im Normalfall und 2. um Namespaces zu emulieren. Wenn Interesse besteht, schreibe ich gern ein kleines JavaScript Tutorial. Bisher ging ich nicht davon aus das es Leute interessiert, deswegen habe ich das ganze Wissen bei mir behalten.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

23.11.2011, 09:07

ich habe jetz nochmal ein wenig nachgelesen:
im Buch wird Variante 1.2 zum erzeugen von Objekten verwendet

Man kann OOP in JS recht gut machen:
http://www.peterkropff.de/site/javascript/oop.htm
die Vererbung in dem Buch wird auch so wie auf dieser Seite beschrieben

Edit:
@Môr:
das wäre eine gute Idee für eine Seite auf dem Wiki ;)
wenn man bedenkt, dass mit Windows 8 und Metro wohl nicht nur Spiele im Web HTML5 und JavaScript verwenden werden/können, dann sollte die Relevanz für die Spieleprogrammierung außer Frage stehen
(und da werden schon einige bisher schon entwickelte Technologien nicht berücksichtigt, wie die Widgets unter Opera oder Programme wie Unity, die JavaScript als Scriptsprache verwenden)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sacaldur« (23.11.2011, 11:06)


JRJ

Treue Seele

Beiträge: 113

Wohnort: Tirol

Beruf: Schüler

  • Private Nachricht senden

7

23.11.2011, 12:50

Ich kann Sacaldur nur zustimmen.
Vor kurzem hat Adobe die Flashunterstützung für Smartphones eingestellt und jQuery Mobile wurde released. Diese Ereignisse werden auch dazu verhelfen Flash durch Javascript zu erstetzen, was natürlich die ganzen kleinen Flashspiele auch betreffen wird.

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

8

23.11.2011, 15:16

Ja, ein Tutorial wäre echt super :)
Ich arbeite mich auch gerade in HTML5 und JS ein, um leichter Apps für Mobile Endgeräte entwickeln zu können.
Mit JQueryMobile + PhoneGap ist das echt super einfach, das habe ich schon gemacht ;)

Jetzt möchte ich erstmal ein "Desktop" Game programmieren, danach das Spiel auf Android
portieren, mithilfe von PhoneGap ;) Das ist ein minimaler Aufwand, also die portierung :)

@All: Danke für eure Hilfe :))

//Edit: Habe allerdings doch ein Problem.
Hmmm, am besten, ich poste einfach den gesamten Code des Spiels:

Quellcode

1
2
3
4
5
6
7
8
9
10
const FPS = 60;
// ===========================================================// Player Class// ===========================================================function Player(imgPath, x, y) { this.Sprite = new Image();  this.Sprite.src = imgPath;  this.PositionX = x; this.PositionY = y; this.VelocityX = 0.0;   this.VelocityY = 0.0;       this.Update = function() {      this.PositionX += this.VelocityX * FPS;     this.PositionY += this.VelocityY * FPS;     this.VelocityX *= 0.95;     this.VelocityY *= 0.95; };  this.Draw = function(drawArea) {        drawArea.drawImage(this.Sprite, this.PositionX, this.PositionY);    };}

// ===========================================================// Game begins here!// ===========================================================// Init Game Componentsvar background = new Image();background.src = "Background.png";var player = new Player("Player.png", 0.0, 0.0);
// Declare Drawing Area & Inputvar canvas = null;var context2d = null;var keys = new Array();
window.onload = init;window.addEventListener('keydown', onKeyDown, true);window.addEventListener('keyup', onKeyUp, true);
// Handle KeyEventsfunction onKeyDown(evt) { keys[evt.keyCode] = true; }function onKeyUp(evt)   { keys[evt.keyCode] = false; }
// ===========================================================// Main Methods// ===========================================================// Update Game Components & Handle Inputfunction update() {  if ((37 in keys && keys[37])) { player.VelocityX -= 0.02; } // Move Left    if ((39 in keys && keys[39])) { player.VelocityX += 0.02; } // Move Right   if ((38 in keys && keys[38])) { player.VelocityY -= 0.02; } // Move Up  if ((40 in keys && keys[40])) { player.VelocityY += 0.02; } // Move Down        player.Update();}
// Draw Imagesfunction draw() { context2d.clearRect(0, 0, canvas.width, canvas.height); context2d.drawImage(background, 0, 0);  player.Draw(context2d);}
// Init Game Componentsfunction init() {    canvas = document.getElementById('canvas'); context2d = canvas.getContext('2d');    setInterval(draw, 1000 / FPS);      update();   draw();}

Soweit läuft auch alles, der Player wird gezeichnet, aber bewegen tut er sich nicht mehr???
Scheint wohl irgendwie daran zu liegen, dass die "update();" Funktion nicht aufgerufen wird,
was seltsam wäre, weil "draw();" ja auch aufgerufen wird. ODER es liegt daran, dass ich nicht
auf die Variablen PositionX/Y und VelocityX/Y zugreifen kann...
Finde den genauen Fehler jetzt aber nicht... Hat jemand eine Idee, was das Problem sein könnte?

//Edit2: Sorry, irgendwie geht die Formatierung des Codes immer verloren, sobald ich ihn poste :?:

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BLU3 L30PARD« (23.11.2011, 15:25)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

9

23.11.2011, 15:45

du hättest dir auch die Mühe machen können, ihn richtig zu formatieren (das ist lediglich der geiche Code, nur besser formatiert):

Quellcode

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
const FPS = 60;


// ===========================================================// Player Class// ===========================================================
function Player(imgPath, x, y) {
    this.Sprite = new Image();
    this.Sprite.src = imgPath;
    this.PositionX = x;
    this.PositionY = y;
    this.VelocityX = 0.0;
    this.VelocityY = 0.0;
    this.Update = function() {
        this.PositionX += this.VelocityX * FPS;
        this.PositionY += this.VelocityY * FPS;
        this.VelocityX *= 0.95;
        this.VelocityY *= 0.95;
    };
    this.Draw = function(drawArea) {
        drawArea.drawImage(this.Sprite, this.PositionX, this.PositionY);
    };
}


// ===========================================================// Game begins here!// ===========================================================
// Init Game Components
var background = new Image();
background.src = "Background.png";
var player = new Player("Player.png", 0.0, 0.0);

// Declare Drawing Area & Input
var canvas = null;
var context2d = null;
var keys = new Array();
window.onload = init;
window.addEventListener('keydown', onKeyDown, true);
window.addEventListener('keyup', onKeyUp, true);

// Handle KeyEvents
function onKeyDown(evt) { keys[evt.keyCode] = true; }
function onKeyUp(evt)   { keys[evt.keyCode] = false; }


// ===========================================================// Main Methods// ===========================================================
// Update Game Components & Handle Input
function update() {
    if ((37 in keys && keys[37])) { player.VelocityX -= 0.02; } // Move Left
    if ((39 in keys && keys[39])) { player.VelocityX += 0.02; } // Move Right
    if ((38 in keys && keys[38])) { player.VelocityY -= 0.02; } // Move Up
    if ((40 in keys && keys[40])) { player.VelocityY += 0.02; } // Move Down
    player.Update();
}

// Draw Images
function draw() {
    context2d.clearRect(0, 0, canvas.width, canvas.height);
    context2d.drawImage(background, 0, 0);
    player.Draw(context2d);
}

// Init Game Components
function init() {
    canvas = document.getElementById('canvas');
    context2d = canvas.getContext('2d');
    setInterval(draw, 1000 / FPS);
    update();
    draw();
}

welchen Browser verwendest du?
welches Betriebssystem?
(damit könnte der Fehler zusammen hängen)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BLU3 L30PARD

Treue Seele

  • »BLU3 L30PARD« ist der Autor dieses Themas

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

10

23.11.2011, 15:47

Ich verwende Google Chrome auf Windows 7 x64 ;)
Habe den Code aus Aptana Studio 3 rauskopiert und eingefügt.
Im Post-Editor war die Formatierung noch da...

Werbeanzeige