Optimierung der Klasse?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Klip

Betreff: Optimierung der Klasse?

BeitragDo, Nov 03, 2005 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallöle,

ich habe mich gestern und heute ein wenig mit OOP auseinandergesetzt und ein kleines Programm gebastelt, in dem sinnlos einige Bälle rumfliegen und von der Wand abtitschen.

Ich wüsste gerne, wie man den Code noch verbessern/kürzen kann.

BlitzMax: [AUSKLAPPEN]

Const enemy_number:Int = 5 ' Change to have more enemies

Type enemy ' New class \"enemy\".
Field x:Float
Field y:Float
Field size:Int
Field xspeed:Float
Field yspeed:Float

Method Move() ' Methods...
x:+ xspeed
y:+ yspeed
If x > gfx_x Or x < 0 Then xspeed:* (-1)
If y > gfx_y Or y < 0 Then yspeed:* (-1)
End Method

Method Draw()
DrawOval(x,y,size,size)
End Method

Function MakeEnemy() ' Functions...
Global enemy_one:enemy
enemy_one = New enemy
enemy_one.x = Rand(10,gfx_x-10)
enemy_one.y = Rand(10,gfx_y-10)
enemy_one.size = 10
enemy_one.xspeed = Rand(1,3)
enemy_one.yspeed = Rand(1,3)
ListAddLast(enemy_list,enemy_one)
End Function

End Type

Global enemy_list:TList = CreateList() ' create a list.

For Local n:Int = 1 To enemy_number
enemy.MakeEnemy() ' make as many enemies as you need.
Next


Da habe ich jetzt die "Gegner" erstellt. So lasse ich sie dann in der Hauptschleife in der Gegend rumfliegen:

BlitzMax: [AUSKLAPPEN]

SetColor 0,0,250
For Local my_enemy:enemy = EachIn enemy_list
my_enemy.Draw()
my_enemy.Move()
Next


Wie kann ich den Code nun verbessern?

Jolinah

BeitragDo, Nov 03, 2005 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht eigentlich gut aus. Finde da muss nichts optimiert oder verkürzt werden Wink Du könntest höchstens die Liste noch in den Type einbauen, was aber nicht wirklich eine Rolle spielt.

regaa

BeitragDo, Nov 03, 2005 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Jolinah hat Folgendes geschrieben:
Finde da muss nichts optimiert oder verkürzt werden Wink Du könntest höchstens die Liste noch in den Type einbauen...


Jup.

BlitzBasic: [AUSKLAPPEN]

							
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net
 

klepto2

BeitragFr, Nov 04, 2005 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Man könnte noch die Create Funktion mit in den Type einbauen.

Code: [AUSKLAPPEN]

Type enemy
.....
    Global enemy_list
......
    Method New()
       if enemy_list=null then enemy_list=new TList
       enemy_list.addlast(self)

    End Method
   
    Function Create(_amount)
       For local a:Int = 0 to _amount -1
            local e:enemy = New enemy
       next
     End Function
.......
End Type
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

Klip

BeitragFr, Nov 04, 2005 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]

Function Create() ' create as many enemies as you need.
For Local n:Int = 1 To enemy_number
MakeEnemy()
Next
End Function


Die Funktion funktioniert, danke soweit schonmal. Stimmt, ist viel einfacher so.

Nur habe ich noch ein Problem, und zwar bei der Methode von regaa.

Wenn ich die Methode New() vor der Hauptschleife aufrufen will, meint er, der Identifier würde nicht stimmen.

Aufruf mit:
enemy.MakeList() ' Methode umbenannt btw.

Der Inhalt ist derselbe wie bei regaa, habe nur meine Variablennamen angepasst. Das globale enemy_list habe ich ebenfalls in den Type eingefügt.

EDIT: Was genau ist eigentlich der Unterschied zwischen Methode und Funktion? Die beiden machen ja rein technisch gesehen dasselbe, solange sie im Type stehen. Wann ist es sinnvoll, eine Funktion zu verwenden, wann eine Methode?
 

Dreamora

BeitragFr, Nov 04, 2005 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Methoden existieren nur beim Objekt also wenn du ein objekt erzeugst nur mittels .methodenname
Funktionen hingegen existieren nur für den gesammten Type nicht für ein einzelnes Objekt, ihr Aufruf erfolgt deswegen über Typename.funktionsname


Und was New () (als auch Delete ()) betrifft: Das sind ganz besondere Methoden, die von BM intern aufgerufen werden.

New wird aufgerufen wenn du a:type = new type machst und ist der "Defaultconstructor". Hier rein kommt also alles was bei einer Erzeugung irgend eines Objektes dieses Typs notwendig ist (wie Werte festlegen, Arrays erzeugen etc)

Delete wird automatisch von BM aufgerufen wenn ein Objekt bei Flushmem als "nicht mehr gebraucht" erkannt und entsorgt wird. Dort rein kommt alles, was aufgerufen werden müssen um eventuell verbleibende Rückstände des Objektes zu entsorgen (wie Referenzen von anderen Objekten auf dieses etc)


Für weitere Erklärungen besuchst du am besten die Tutorials & FAQ Sektion.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Nemesis

BeitragFr, Nov 04, 2005 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

Delete wird automatisch von BM aufgerufen wenn ein Objekt bei Flushmem als "nicht mehr gebraucht" erkannt und entsorgt wird. Dort rein kommt alles, was aufgerufen werden müssen um eventuell verbleibende Rückstände des Objektes zu entsorgen (wie Referenzen von anderen Objekten auf dieses etc)


solange referenzen auf dieses objekt vorhanden sind sollte flushmem das objekt doch garnicht entsorgen -> delete nicht aufgerufen werden.

bruZard

BeitragFr, Nov 04, 2005 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Da hast Du Begrifflichkeiten verwechselt: Ein Objekt wird niemals vom Garbage Collector entsorgt ... erst beim End ... eine Referenz wird aber schon durch ein Delete() ins Nirvana geschcikt wenn es nicht mehr verlinkt ist.

Das Type ansich ist das Objekt ... es kann nicht entsorgt werden da es keinen Speicher verbraucht ... erst eine Referenz macht ein Objekt existent.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

Nemesis

BeitragFr, Nov 04, 2005 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
naja also meiner meinung nach ist ein objekt eine instanz und ich glaube dreamora hat das auch so gemeint.

Eine referenz ist im grunde nur ein (typesicherer) pointer auf eine instanz/objekt und es kann auch mehrere referenzen auf eine instanz/objekt geben. Existiert auf eine instanz/objekt keine referenz mehr wird es vom garbagecollector gelöscht.

Jolinah

BeitragFr, Nov 04, 2005 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte ein Objekt ist eine Instanz einer Klasse und nicht die Klasse selber? Smile

Edit: zu spät
  • Zuletzt bearbeitet von Jolinah am Sa, Nov 05, 2005 1:11, insgesamt 2-mal bearbeitet
 

Dreamora

BeitragFr, Nov 04, 2005 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau so ist es. Ein Objekt ist eine Runtime Instanz einer Klasse.
Und eine Klasse ist eine Beschreibung/Bauplan für Objekte.

-> Klasse ist ein "Blueprint" also Bauplan für eine bestimmte Sache (zB ein Auto), während ein Objekt die entsprechende Sache selbst ist (also das Auto), um es mit einem hoffentlich verständlichen "Reallife" Beispiel zu erklären.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group