Object does not exist !

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dicker Hobbit

Betreff: Object does not exist !

BeitragSa, Feb 18, 2012 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Blitzer,

Ich bin es mal wieder!
Zurzeit versuch ich mich mit den Types und wollte damit ein kleines Spiel schreiben.
Leider bekomme ich die oben genannte Fehlermeldung und ich kann mir nicht erklären wieo.
Die Meldung zeigt mit den Fehler in diesem Abschnitt:
BlitzBasic: [AUSKLAPPEN]

If ImagesCollide(g\pic, g\x, g\y ,0 ,z\pic, z\x, z\y,0) Then
g\leben=g\leben-w\dmg
End If

Dies steht in einer Function und die Types habe ich aber jeweils Code: [AUSKLAPPEN]
Global
gesetzt.

Falls ihr weiteren Code benötigt um mir zu helfen poste ich ihn selbstverständlich noch!

Danke im Vorraus!

Lg Dicker Hobbit

ZEVS

BeitragSa, Feb 18, 2012 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Falls ihr weiteren Code benötigt um mir zu helfen poste ich ihn selbstverständlich noch!

Ich bitte doch darum.
Im Allgemeinen sollte ein For Each-Loop helfen.

ZEVS

Xeres

Moderator

BeitragSa, Feb 18, 2012 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Welches Objekt soll den Null sein? Vermutlich ist es eine verschachtelte Schleife und du löschst ein Objekt, das im nächsten Durchgang nochmal angesprochen wird.
Fall nicht, bräuchte man mehr Code, um das Problem zu finden.
Es ist auch nicht unbedingt, nötig eine Type-Variable Global zu deklarieren.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Dicker Hobbit

BeitragSa, Feb 18, 2012 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke an den Hinweiß von ZEVS mit der For- Each- Schleife klappt es !
(Kritik/ Verbesserungsvorschläge weiterhin erwüncht Wink )

Bitte erfüllt! Wink

BlitzBasic: [AUSKLAPPEN]
Graphics 640, 480, 16, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

;Variablen, Types etc.


;hintergrundvariablen
Global hintergrund=LoadImage("background.png")
MaskImage hintergrund, 255, 255, 255
backx=-200

Global level= 2

;ende
;anfang spielfigur
Global player=LoadAnimImage("player.png",44,60,0,2)
MaskImage player, 255,0,255
Global plrtimer=MilliSecs() ;setzt timer auf Millisekunden
Global plx=280
Global ply=380
Global leben=2
Global herz=LoadImage("herz.bmp")
MaskImage herz, 255, 0, 255
;ende spieler
;anfang Gegner
Type gegner
Field pic
Field leben
Field x,y
End Type

Global g.gegner

For i=1 To level*2
g.gegner=New gegner
g\x=Rnd(200,2950)
g\pic=LoadImage("gegner"+Rand(3)+".png")
g\leben=Rand(3)
g\y= 380
MaskImage (g\pic,255,0,255)
Next
;ende gegner

;waffen
Type waffe
Field pic
Field dmg
Field x
Field y
Field kosten
End Type

Global w.waffe
w.waffe=New waffe
w\pic=LoadImage("waffe1.png")
w\dmg=1
w\x=317
w\y=400
w\kosten=0
MaskImage(w\pic,255,0,255)
;waffen ende

;fadenkreuz
Type ziel
Field pic
Field x
Field y
End Type

Global z.ziel=New ziel
z\pic=LoadImage("fadenkreuz.png")

MaskImage(z\pic, 255, 0, 255)
;fadenkreuz ende

;Hauptschleife

While Not (KeyDown(1)) Or leben<1
Cls
;beschränkung
If backx>-200 Then
backx=backx-5
For g.gegner=Each gegner
g\x=g\x-5
Next
EndIf

If backx<-2300 Then
backx=backx+5
For g.gegner=Each gegner
g\x=g\x+5
Next
EndIf

If KeyDown(203) Then
backx=backx+5
For g.gegner=Each gegner
g\x=g\x+5
Next
EndIf
If KeyDown(205) Then
backx=backx-5
For g.gegner=Each gegner
g\x=g\x-5
Next
EndIf



DrawImage hintergrund, backx,0
spieler()
gegner()
DrawImage w\pic, w\x, w\y
ziel()

Flip()
Wend

Cls
Print "ende"
WaitKey()









; Funktionen

Function hintergrund()

End Function

;spielerfunction
Function spieler()

;Spieleranimation
If KeyDown(205) Or KeyDown(203) Then
If MilliSecs()>plrtimer+300 Then
plrtimer=MilliSecs()
frame=frame+1
If frame=2 Then frame=0
EndIf
DrawImage player, plx, ply, frame
Else
DrawImage player, plx, ply,frame
EndIf
;status leben

For i=0 To leben-1
DrawImage herz, i*50, 10
Next
End Function

;vollstandige Gegnerfunktion
Function gegner()
;gegner malen
For g.gegner=Each gegner
DrawImage g\pic, g\x, g\y
Next
;gegnertöten
For g.gegner=Each gegner
If g\leben = 0 Then
Delete g.gegner
EndIf
Next
;gegnerspielerkollision

For g.gegner=Each gegner
If ImagesCollide(player,plx,ply,0 Or 1,g\pic,g\x,g\y,0) Then
leben = leben -1
g\leben=0
EndIf
Next

End Function

;fadenkreuz
Function ziel()
z\x=MouseX()
z\y=MouseY()

DrawImage z\pic, z\x, z\y
If ImagesCollide(g\pic, g\x, g\y ,0 ,z\pic, z\x, z\y,0) Then
g\leben=g\leben-w\dmg
End If
End Function

End


Hinweise und Kritik an meiner Einrückung bzw. Code ist erwünscht !

ZEVS

BeitragSa, Feb 18, 2012 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest nicht vergessen, dass LoadImage seine Zeit braucht und relativ viel Speicher belegt, bis das Bild mit FreeImage gespeichert wird. Deshalb ist es meist sinnvoll, sämtliche benötigten Bilder einmal zu Laden und immer zu kopieren:
Statt BlitzBasic: [AUSKLAPPEN]
 g\pic=LoadImage("gegner"+Rand(3)+".png")

BlitzBasic: [AUSKLAPPEN]
Dim pictures(2)
pictures(0) = LoadImage("gegner1.png")
pictures(1) = LoadImage("gegner2.png")
pictures(2) = LoadImage("gegner3.png")
; ...
g\pic=pictures(Rand(0, 2))


edit@edit: Ein ForEach-Loop reicht.

ZEVS
  • Zuletzt bearbeitet von ZEVS am Sa, Feb 18, 2012 14:56, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSa, Feb 18, 2012 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
g\pic=LoadImage("gegner"+Rand(3)+".png")
Das füllt deinen Speicher unnötig. Bilder ein mal Laden (z.B. in ein Array) und dann nur noch zuweisen.

Anstatt alle Gegner zu bewegen, solltest du vielleicht Scroll-Variablen nehmen.

Code: [AUSKLAPPEN]
If ImagesCollide(player,plx,ply,0 Or 1,g\pic,g\x,g\y,0)
OR ist ein logischer Opperator. 0 Or 1 gibt immer 1.
Alle For..each Schleifen in gegner() solltest du zu einer zusammenfügen, nur Delete sollte halt das letzte sein, was mit einem Objekt passiert - ansonsten gibt es ein Error, weil das Objekt nach Delete natürlich Null ist.

In ziel() gibt es keine Sicherung, das g auf ein gültiges Objekt zeigt - vermutlich fehlt da ein For...each um alle Objekte zu prüfen.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Dicker Hobbit

BeitragSa, Feb 18, 2012 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke ich werde mir eure Tipps zu Herzen nehmen und meinen Code verbessern!

Mir ist gerade noch eine Frage eingefallen:

Wie schaffe ich es, dass ein Objekt (z.B. Kugel) in die Richtung des Mauszeigers fliegt ?
Ich dachte an MouseX - Wert und das der Wert dann immer weiter runter gezählt wird.
Das funktioniert bei mir aber nicht so wirklich.
(Dachte auch an Trigonomie, aber wusste auch nicht wie ich dass am besten anstelle)

Nochmal danke und ein großes Lob an die schnelle Hilfe im Forum und die Freundlichkeit gegenüber Anfängern!

Lg Dicker Hobbit

ZEVS

BeitragSa, Feb 18, 2012 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt zwei Möglichkeiten:
1. Du berechnest den Winkel Kugel/Maus über Atan2 und dann die Veränderung über Sin/Cos (evtl. mit irgendeinem Faktor multipliziert).
2. Du berechnest den Unterschied der X/Y-Koordinaten (Matheprofessoren nennen das Vektor), teilst beide Werte durch den Abstand
Code: [AUSKLAPPEN]
Abstand = Sqr(XUnterschied*XUnterschied + YUnterschied*YUnterschied)
und nimmst diese wieder mal irgendeinen Faktor. Letzteres ist schneller, ich finde es einfacher.

ZEVS

Pokoyo

BeitragSa, Feb 18, 2012 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
das Zauberwort heisst ATAN2(). Einfach mal nach suchen. Da wirst du ne Menge Beispiele finden.
Mir ist aufgefallen dass du z.B. in deiner Gegner Updatefunktion immer wieder dieselbe Typeliste mit For
Each durchgehst. Einmal Loopen reicht. Bei sehr vielen Gegnern kann das sonst zu Performanceeinbussen führen.

gruss poko
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax|

Xeres

Moderator

BeitragSa, Feb 18, 2012 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Da muss ich nochmal für BPS #3 & #4 Werben. Wink
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Dicker Hobbit

BeitragSa, Feb 18, 2012 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin von deinen BPS echt begeistert Xeres!
Ein Wunder, dass ich die Serie bis jetzt vollständig übersehen habe. Embarassed
Jetzt werde ich wohl erstmal alle durcharbeiten!

Danke!

Dicker Hobbit

BeitragSa, Feb 18, 2012 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
So hier bin ich wieder mit einem neuen Problem:
Wie kann ich prüfen ob alle Objekte eines Types NULL sind
Ich habe es schon mit der lieben For-Eachloop versucht, aber da bricht er schon ab wenn ich nur einen Gegner besiege.

Ich hoffe es ist ok, dass ich so oft eure Hilfe in Anspruch nehme.

Lg Dicker Hobbit

Eingeproggt

BeitragSa, Feb 18, 2012 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Alle Objekte=Null würde ja bedeuten dass es keine mehr gibt?
Dann frag doch folgedes ab:

BlitzBasic: [AUSKLAPPEN]
If First gegner=Null Then


mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Dicker Hobbit

BeitragSa, Feb 18, 2012 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Fragt FIRST nicht nur ab ob das erste Object NULL ist ?

Ich möchte, dass wenn jeder Gegner tot(NULL) ist etwas passiert.


Lg Dicker Hobbit

Xeres

Moderator

BeitragSa, Feb 18, 2012 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wie kann ich prüfen ob alle Objekte eines Types NULL sind
Eine Type-Variable kann ein gültiges Objekt enthalten, oder sie enthält das Null-Objekt. Wenn du gar keine Objekte in der Kollektion/Typeliste hast, gibt First ein Null zurück.
Alternativ könntest du die Anzahl mitzählen, wäre auch zum debuggen hin und wieder praktisch.

Zitat:
Ich hoffe es ist ok, dass ich so oft eure Hilfe in Anspruch nehme.
Klar, aber bitte benutze eher den Editbutton anstatt Doppelposts zu machen, danke.

Edit:
BlitzBasic: [AUSKLAPPEN]
Type TTest
Field x%
End Type

Local t.TTest

NotObject(t) ;* Kein objekt zugewiesen = Null

t = New TTest
t\x=4

NotObject(t) ;* Ein objekt wurde erstellt
NotObject(First TTest) ;* Das exakt selbe Objekt ist das erste in der Liste
t=Null
NotObject(t);* Variable t zeigt auf das null-objekt
NotObject(First TTest) ;* Es wurde aber nicht gelösch!
Delete First TTest ;*Aber jetzt!
NotObject(First TTest)
WaitKey()

Function NotObject(obj.TTest)
If obj=Null Then
Print("Kein Objekt!")
Else
Print("X: "+obj\x)
EndIf
End Function
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Eingeproggt

BeitragSa, Feb 18, 2012 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, First fragt das ERSTE Element ab.
Aber das schöne an Types ist: Wenn es kein erstes Element gibt, gibt es garantiert auch kein zweites... es gibt dann einfach gar keines mehr Wink

EDIT: Antwort schreiben und dann Abendessen holen führt dazu dass Xeres schneller war...
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group