[GELÖST] Hilfe Prozedural > OOP
Übersicht

plan_bBetreff: [GELÖST] Hilfe Prozedural > OOP |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
*Edit:* Sorry dies sollte ins Blitzmax Forum nicht Blitzbasic.
Hallo zusammen, Ich habe erst kürzlich angefangen mit Blitzmax und minib3d und habe eine frage wie ich am besten meine bisheriges Prozedurales vorgehen besser als OOP Code umsetzen kann. Ich vermute das ich einen Denkfehler mache. Mein Code braucht nur das native minib3d und keine externen medien: BlitzMax: [AUSKLAPPEN]
Das klappt ja wunderbar. Nachdem ich die beigelieferten examples von Blitzmax gesehen hab dachte ich mir das ich jetzt das gleiche nochmal versuche aber in einer OOP-Struktur. Das habe ich wie folgt umgesetzt: BlitzMax: [AUSKLAPPEN]
Wenn ich jetzt bei der Methode Update() das player.MoveEntity(x,y,z) auskommentiere startet das Programm (mein Spieler bewegt sich nicht aber die Szene wird gerendert) lass ich es aber so sein wie jetzt kommt er mit einer Exception und crasht. Kann mir jemand sagen was ich hier falsch mache ? Danke für's lesen - plan_b |
||
- Zuletzt bearbeitet von plan_b am Di, Nov 05, 2013 20:57, insgesamt einmal bearbeitet
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Weil du in deiner Methode Init nicht die Variablen des Objektes setzt, sondern neue anlegst, die allerdings nichts mit der Instanz der Klasse zu tun haben und in der Methode Update nicht mehr benutzt werden können (vor allem die Klassen-Variable Player betrifft dies).
Mein Vorschlag: benutz statt einer Init-Methode einen Konstruktor: BlitzMax: [AUSKLAPPEN] Type TPlayer Nun erstellst du außerhalb der Klasse ein neues Objekt, indem du folgendes schreibst BlitzMax: [AUSKLAPPEN] Global Player:TPlayer = TPlayer.Create(100, 100, 100) ' Beispielwerte Danach kannst du über die Variable Player auf dessen Methode Update ohne Fehler zugreifen. Falls du keinen Konstruktor verwenden, sondern es weiterhin über eine extra Methode machen willst, kannst du auch den obigen Code entsprechend anpassen (Function Create:TPlayer() wird zu Method Init(), In der Methode musst du dann noch die Zeile "Local ReturnMe:TPlayer = New TPlayer" löschen, alle Vorkommnisse von ReturnMe durch Self ersetzen und die Return-Zeile muss ebenfalls gelöscht werden). |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
~VERSCHOBEN~ Aus offensichtlichen Gründen ![]() |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
meiner Meinung nach würde auch schon reichen, einfach die beiden GLOBAL aus der Init() zu entfernen:
BlitzMax: [AUSKLAPPEN] ' player GLOBAL Variablen werden in BMax außerhalb der Methoden/Funktionen deklariert. GLOBAL ganz außen schafft eine GLOBALE, die überall zur Verfügung steht. GLOBAL statt FIELD innerhalb eines Types erreicht, dass diese Variable dann innerhalb des TYPE in Funktionen und Methoden allen Objekten von diesem Typ zur Verfügung steht. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine globale Variable in einem Type kann auch von außerhalb angesprochen werden:
BlitzMax: [AUSKLAPPEN] Type TTest |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine "globale" Variable in einer Funktion aber nicht.
BlitzMax: [AUSKLAPPEN] Method Init(x:Float, y:Float, z:Float) ZEVS |
||
plan_b |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank für das rasche feedback, das ging schnell!
Ich habe es jetzt realisiert wie CO2 - danke dir das klappt wunderbar! Gibt es nennenswerte Gründe das auch mit einer Methode zu machen ? Oder soll man generell zum erstellen einer Instanz eine Funktion verwenden ? Interessant das Globale Variabeln nicht "überall" angesprochen werden kann je nach dem wo man sie erstellt. Nochmals Danke für's Feedback! - plan_b |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: Gibt es nennenswerte Gründe das auch mit einer Methode zu machen
Eigentlich nicht. ![]() Zitat: Oder soll man generell zum erstellen einer Instanz eine Funktion verwenden Ein "Konstruktor" ist die beste Variante ein Objekt von einer Klasse zu erstellen, da ich im Code nur 1 Zeile (Global NeuesObjekt:MeineKlasse = MeineKlasse.Create()) schreiben muss und nicht zwei (BlitzMax: [AUSKLAPPEN] Global NeuesObjekt:MeineKlasse = New MeineKlasse), was natürlich Fehler durch "menschliches Versagen" (bspw. Vergessen der "New"-Zeile) stark minimiert. Es wäre außerdem sinnvoll, nach der Initialisierung der Instanz das Objekt auf "= Null" zu prüfen, in etwa so (um mein obiges Beispiel fortzusetzen) BlitzMax: [AUSKLAPPEN] Global NeuesObjekt:MeineKlasse = MeineKlasse.Create()um einen Null-Exception-Fehler zu "verhindern". Wenn du es ganz "einfach" haben willst, schreibst du zudem außerhalb der Klasse nochmals eine Funktion, die erst ein Objekt initialisiert und dieses dann zurückgibt. Dann entfällt auch das "MeineKlasse.Create()" und du brauchst nur die geschriebene Funktion aufzurufen. Beispiel BlitzMax: [AUSKLAPPEN] Type MeineKlasse |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine Methode kann man nur auf eine bereits existierende Instanz anwenden - man könnte zwar (new TType).Init() schreiben, aber das sieht eher unschön aus... Üblicherweise definiert man eine Create-Funktion, da man bei BMax den Konstruktor nicht mit Parametern überladen kann - aber ausführen kann man etwas.
Beispiel: BlitzMax: [AUSKLAPPEN]
Edit: CO2 hat Folgendes geschrieben: Wenn du es ganz "einfach" haben willst, schreibst du zudem außerhalb der Klasse nochmals eine Funktion, die erst ein Objekt initialisiert und dieses dann zurückgibt. Bitte macht das auf gar keinen Fall. BlitzMax macht das, damit man ohne OOP Arbeiten kann - was Niemand will, wenn er tatsächlich OOP nutzt. Das verschmutzt höchstens den Globalen Namensraum mit Ellenlangen Funktionsnamen.
|
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group