Type Problem

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Firstdeathmaker

Betreff: Type Problem

BeitragDi, Jan 06, 2004 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich hab für meinen kleinen Weltraumshooter die Schüsse durch Type´s dargestellt. Das Problem ist nur, wenn ich das Spiel starte und einen Schuss abgebe, sagt der Debugger immer "Objekt does not exist"
und zeigt diese Zeile an:
Code: [AUSKLAPPEN]
If schuss\tod=1 Delete schuss.geschoss


Ich meine, ist das nicht ein Widerspruch an sich? Er kann die Zeile nur verarbeiten wenn schuss\tod=1 ist, und dazu muss ja schuss\ existieren!
Wie kann das Objekt denn dann nicht existieren?

Ich hab gerade erst angefangen mit Types, deshalb kenn ich mich damit noch nicht so aus. Ich hab oben im Programm das Typefeld deklariert:
Code: [AUSKLAPPEN]
Type geschoss
Field xpos#
Field ypos#
Field xbr#
Field ybr#
Field art
Field schaden#
Field tod
End Type


Die Schüsse werden hiermit erstellt:
Code: [AUSKLAPPEN]
Function createschusse()
If KeyHit(57) ;ein Schuss wird abgegeben (Leertaste)
 
If player(4,0)=1 Or player(4,0)=3
 schuss.geschoss=New geschoss
 schuss\xpos=player(0,1)+100
 schuss\ypos=player(0,0)+41
 schuss\art=player(3,1)
 schuss\xbr=schussgeschw(player(3,1))
 schuss\ybr=0
 schuss\schaden=player(3,1)
 If player(4,0)=1 Goto sausg1
EndIf


If player(4,0)=2
 .sausg2
 schuss.geschoss=New geschoss
 schuss\xpos=player(0,1)+65
 schuss\ypos=player(0,0)+28
 schuss\art=player(3,1)
 schuss\xbr=schussgeschw(player(3,1))
 schuss\ybr=0
 schuss\schaden=player(3,1)

 schuss.geschoss=New geschoss
 schuss\xpos=player(0,1)+65
 schuss\ypos=player(0,0)+56
 schuss\art=player(3,1)
 schuss\xbr=schussgeschw(player(3,1))
 schuss\ybr=0
 schuss\schaden=player(3,1)
 schuss\tod=0
EndIf


.sausg1
EndIf
End Function


Ich kapier einfach nicht was ich falsch gemacht habe!
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Firstdeathmaker

BeitragDi, Jan 06, 2004 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub der Fehler liegt irgendwo hier drin:
Code: [AUSKLAPPEN]
Function kollisiongms()
;Gegner mit schüssen kollidieren
For schuss.geschoss=Each geschoss
For i=0 To gegneranzahl
If gegner(i,0,0)=1
 Select gegner(i,0,1)
 Case 1
 If ImagesCollide(gegner1i,gegner(i,1,0),gegner(i,1,1),0,schuss1i,schuss\xpos,schuss\ypos,0)
  gegner(i,3,0)=gegner(i,3,0)-schuss\schaden
  createexplosion(gegner(i,1,0),schuss\ypos-20,gegner(i,2,0),gegner(i,2,1),1)
  Delete schuss.geschoss
  If gegner(i,3,0)<=0
   gegner(i,0,0)=0
   punkte=punkte+geginfo2(0)
   createexplosion(gegner(i,1,0),gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),2)
  EndIf
 EndIf
 Case 2
 If ImagesCollide(gegner2i,gegner(i,1,0),gegner(i,1,1),0,schuss1i,schuss\xpos,schuss\ypos,0)
  gegner(i,3,0)=gegner(i,3,0)-schuss\schaden
  createexplosion(gegner(i,1,0)+10,schuss\ypos,gegner(i,2,0),gegner(i,2,1),1)
  Delete schuss.geschoss
  If gegner(i,3,0)<=0
   gegner(i,0,0)=0
   punkte=punkte+geginfo2(1)
   createexplosion(gegner(i,1,0),gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),3)
   createexplosion(gegner(i,1,0)+65,gegner(i,1,1)-32,gegner(i,2,0),gegner(i,2,1),2)
   createexplosion(gegner(i,1,0)+65,gegner(i,1,1)+35,gegner(i,2,0),gegner(i,2,1),2)
  EndIf
 EndIf
 Case 3
 If ImagesCollide(gegner3i,gegner(i,1,0),gegner(i,1,1),0,schuss1i,schuss\xpos,schuss\ypos,0)
  gegner(i,3,0)=gegner(i,3,0)-schuss\schaden
  createexplosion(gegner(i,1,0),schuss\ypos-20,gegner(i,2,0),gegner(i,2,1),1)
  Delete schuss.geschoss
  If gegner(i,3,0)<=0
   gegner(i,0,0)=0
   punkte=punkte+geginfo2(2)
   createexplosion(gegner(i,1,0),gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),2)
  EndIf
 EndIf
 Case 4
 If ImagesCollide(gegner4i,gegner(i,1,0),gegner(i,1,1),0,schuss1i,schuss\xpos,schuss\ypos,0)
  gegner(i,3,0)=gegner(i,3,0)-schuss\schaden
  createexplosion(gegner(i,1,0),schuss\ypos-20,gegner(i,2,0),gegner(i,2,1),1)
  Delete schuss.geschoss
  If gegner(i,3,0)<=0
   gegner(i,0,0)=0
   punkte=punkte+geginfo2(3)
   createexplosion(gegner(i,1,0),gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),2)
  EndIf
 EndIf
 Case 5
 If ImagesCollide(gegner5i,gegner(i,1,0),gegner(i,1,1),0,schuss1i,schuss\xpos,schuss\ypos,0)
  gegner(i,3,0)=gegner(i,3,0)-schuss\schaden
  createexplosion(gegner(i,1,0),schuss\ypos-20,gegner(i,2,0),gegner(i,2,1),1)
  Delete schuss.geschoss
  If gegner(i,3,0)<=0
   gegner(i,0,0)=0
   punkte=punkte+geginfo2(4)
   createexplosion(gegner(i,1,0),gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),2)
  EndIf
 EndIf
 Case 6
 If ImagesCollide(gegner6i,gegner(i,1,0),gegner(i,1,1),0,schuss1i,schuss\xpos,schuss\ypos,0)
  gegner(i,3,0)=gegner(i,3,0)-schuss\schaden
  createexplosion(schuss\xpos,schuss\ypos-20,gegner(i,2,0),gegner(i,2,1),1)
  Delete schuss.geschoss
  If gegner(i,3,0)<=0
   gegner(i,0,0)=0
   punkte=punkte+geginfo2(5)
   createexplosion(gegner(i,1,0),gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),3)
   createexplosion(gegner(i,1,0)+40,gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),3)
   createexplosion(gegner(i,1,0)+80,gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),3)
   createexplosion(gegner(i,1,0)+120,gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),3)
   createexplosion(gegner(i,1,0)+140,gegner(i,1,1),gegner(i,2,0),gegner(i,2,1),3)
  EndIf
 EndIf
 End Select
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

newkev

BeitragDi, Jan 06, 2004 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
versuch das mal
Code: [AUSKLAPPEN]

For schuss.geschoss = Each geschoss
If schuss\tod=1 Delete schuss.geschoss
Next
Signatur? Gibts nich^^

Firstdeathmaker

BeitragDi, Jan 06, 2004 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
steht so auch in meinem Programm. Ich hab immer darauf geachtet dass ich erst eine For-Schleife mit schuss.geschoss = Each geschoss einrichte!
Wobei ich dass auch nicht so ganz verstehe, normalerweise sagt man ja:
For i=0 to 5 aber bei diesem Befehl fehlt ja das "to":
for schuss.geschoss = Each geschoss
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

BladeRunner

Moderator

BeitragDi, Jan 06, 2004 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Firstdeathmaker hat Folgendes geschrieben:

Ich meine, ist das nicht ein Widerspruch an sich? Er kann die Zeile nur verarbeiten wenn schuss\tod=1 ist, und dazu muss ja schuss\ existieren!
Wie kann das Objekt denn dann nicht existieren?

Nein, denn die Fehlermeldung stammt ja grade daher dass das abgefragte objekt nicht existiert. Das ist analog zu dem "image does not exist" wenn das handle auf 0 steht- blos weil der handlename existiert, muß das Image ja nit dasein.

Kenn mich zwar mit types nit aus, vermute aber daß entweder schuß\tod oder schuss.geschoß nicht eindeutig definiert sind.
Füg doch vor dem ganzen mal ein print schuß\tod :print schuss.geschoß ein und setze die fragliche zeile auf ;REMark- dann siehst du WER den Fehler macht.
Zudem möchte ich auf das Typestutorial auf der blitzbase.de verweisen, vielleicht steht da ja was nützliches für dich drin Smile
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Firstdeathmaker

BeitragDi, Jan 06, 2004 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
doch, es ist ein Widerspruch:

die if Bedingung kann ja nur erfüllt werden wenn schuss\tod=1 ist. Davor bekomme ich keine Fehlermeldung, die Schleife läuft einfach nur durch. Wenn jetzt aber ein Schuß irgend ein Objekt rammt oder aus dem Bildschirm verschwindet wird der jeweilige Schuß auf schuss\tod=1 gesetzt. Wenn das Programm jetzt an die stelle if schuss\tod=1 kommt wird die Bedingung erfüllt und der dahinterstehende Befehl wird ausgeführt (oder in meinem Beispiel eben nicht ausgeführt). Da aber "schuss\tod" existiert, muss ja auch der Eintrag "schuss" existieren, den man dann mit dem nachfolgenden Befehl löschen möchte. Ich kapier das einfach nicht...
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Firstdeathmaker

BeitragDi, Jan 06, 2004 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal kurz ein anderes kleineres Game geproggt wo ich jetzt den gleichen Fehler drin hab: Wieder verschwinden Types:
Code: [AUSKLAPPEN]
;2.ter Anlauf
Graphics 800,600,32,2
;          Initialisierung/Laden
Global playeri,plx,ply,plschuss,srate,meteor1i,meteor2i,meteor3i,schuss1i,punkte,lune,level
Type meteor
Field tod
Field xpos
Field ypos
Field brx
Field bry
Field art
End Type
Type geschoss
Field tod
Field xpos
Field ypos
Field brx
Field bry
End Type
playeri=LoadImage(CurrentDir()+"images\Schiff1.bmp")
MaskImage playeri,255,0,255
meteor1i=LoadImage(CurrentDir()+"images\meteor1i.bmp")
meteor2i=LoadImage(CurrentDir()+"images\meteor2i.bmp")
meteor3i=LoadImage(CurrentDir()+"images\meteor3i.bmp")
schuss1i=LoadImage(CurrentDir()+"images\schuss1i.bmp")
lune=LoadImage(CurrentDir()+"images\lune.jpg")
MaskImage meteor1i,255,0,255
MaskImage meteor2i,255,0,255
MaskImage meteor3i,255,0,255
plx=390
ply=560
srate=30
level=1
SetBuffer BackBuffer()



;__________Hauptschleife--------------
Repeat
keyask()
Cls
draw()
createschuss()
If Rand(0,1) createmeteor(level)
meteormove()
moveschuss()
imagecollideproov()
Flip
Until KeyHit(1)

;-----------Functionen-------------


Function draw()
DrawImage lune,0,0
DrawImage playeri,plx,ply
For m.meteor=Each meteor
  Select m.meteor\art
  Case 1 DrawImage meteor1i,m\posx,m\posy
  Case 2 DrawImage meteor2i,m\posx,m\posy
  Case 3 DrawImage meteor3i,m\posx,m\posy
  End Select
Next
For schuss.geschoss=Each geschoss
 DrawImage schuss1i,schuss\xpos,schuss\ypos
Next
Text 10,10,punkte
Text 10,25,level
Text 20,25,"Level"
If punkte>50 level=2 srate=20
If punkte>100 level=3 srate=15
If punkte>150 level=4 srate=10
If punkte>200 level=5 srate=5
End Function

Function keyask()
If KeyDown(203) plx=plx-4
If KeyDown(205) plx=plx+4
If KeyDown(57) plschuss=plschuss+1
If KeyHit(57) plschuss=srate
End Function

Function createschuss()
 If plschuss=srate
  schuss.geschoss=New geschoss
  schuss\tod=0
  schuss\posx=plx+23
  schuss\posy=ply-6
  schuss\bry=2
  plschuss=0
 EndIf
End Function

Function moveschuss()
For schuss.geschoss=Each geschoss
 If schuss\tod=1 Delete schuss.geschoss
 schuss\posy=schuss\posy-schuss\bry
 If schuss\posy<-10 Delete schuss.geschoss
Next
End Function


Function createmeteor(anzahl)
For i2=1 To anzahl
  m.meteor=New meteor
  m\posx=Rand(10,790)
  m\posy=-10
  m\art=Rand(1,3)
  m\bry=Rnd(1,3)
Next
End Function

Function meteormove()
For m.meteor=Each meteor
 If m\tod=1 Delete m.meteor
 m\posy=m\posy+m\bry
 If m\posy=>600 m\tod=1
Next
End Function

Function imagecollideproov()
For m.meteor=Each meteor
 Select m\art
 Case 1 If ImagesCollide(meteor1i,m\posx,m\posy,0,playeri,plx,ply,0) m\tod=1
 Case 2 If ImagesCollide(meteor2i,m\posx,m\posy,0,playeri,plx,ply,0) m\tod=1
 Case 3 If ImagesCollide(meteor3i,m\posx,m\posy,0,playeri,plx,ply,0) m\tod=1
 End Select
  For schuss.geschoss=Each schuss
   Select m\art
   Case 1 If ImagesCollide(meteor1i,m\posx,m\posy,0,schuss1i,schuss\xpos,schuss\ypos,0) Delete m.meteor punkte=punkte+1 schuss\tod=1
   Case 2 If ImagesCollide(meteor2i,m\posx,m\posy,0,schuss1i,schuss\xpos,schuss\ypos,0) Delete m.meteor punkte=punkte+2 schuss\tod=1
   Case 3 If ImagesCollide(meteor3i,m\posx,m\posy,0,schuss1i,schuss\xpos,schuss\ypos,0) Delete m.meteor punkte=punkte+3 schuss\tod=1
   End Select
  Next
Next
End Function
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

furbolg

BeitragDi, Jan 06, 2004 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist folgendes, wenn du den Type löscht aber darunter noch ein paar Abfragen über diesen Type hast dann gibts ein Problem weil der Speicher dieses Types in einen Null Bereich zeigt.

Es muss nichmal eine Zuweisung sein, eine If abfrage / prüfung reicht dafür.

Ich hab das Problem damals so gelöst :
Jedes Object kriegt ein IsDeleted das wird beim Kreieren auf 0 gesetzt und immer da wo du normal dein Delete reinpacken willst schreibst du dann Type\IsDeleted = 1.

Dann prüfst du ganz unten vor den Next mit ner neuen If abfrage IF Type\IsDeleted = 1 then Delete Type Smile


Beispiel:

type Ship
field x,y,z
field IsDeleted
end type

Global Space.Ship

Space.Ship = new Ship
Space\x = 1
Space\y = 2
Space\z = 3

for Space.Ship = Each Ship
;zeichnen
;abfragen
;ist tot ?
if Space\leben <= 0 then Space\IsDeleted = 1
.....

;Type Trick
IF Space\IsDeleted = 1 then Delete Space
next

Firstdeathmaker

BeitragDi, Jan 06, 2004 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, danke, ich werd´s mal probieren...
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Firstdeathmaker

BeitragDi, Jan 06, 2004 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte, wenn man einen Typ löscht wird der aus der Liste genommen und kann so durch eine Schleife wie
for name.type=each type

nicht mehr aufgerufen werden. Oder wie ist das? Ich hab ja schließlich das Problem, dass ich nicht nur einen Typ verwende, sondern ganz viele in eine Liste hineinpacke. Ich hab das Programm mal so umgeschrieben wie du gesagt hast, klappt aber immer noch nicht. Das mit den Fields hat er zwar jetzt (ich hab noch nen Fehler gefunden, ich hatte nicht xpos sondern posx abgefragt), aber er zeigt einen anderen Fehler an:
"Arithmetic operator cannot be applied to custom type objects"
Was heisst das? Wie kriegt man so etwas weg?

[/code];2.ter Anlauf
Graphics 800,600,32,2
; Initialisierung/Laden
Global playeri,plx,ply,plschuss,srate,meteor1i,meteor2i,meteor3i,schuss1i,punkte,lune,level
Type meteor
Field tod
Field xpos
Field ypos
Field brx
Field bry
Field art
Field deleted
End Type
Type geschoss
Field tod
Field xpos
Field ypos
Field brx
Field bry
Field deleted
End Type
Global m.meteor
Global schuss.geschoss
playeri=LoadImage(CurrentDir()+"images\Schiff1.bmp")
MaskImage playeri,255,0,255
meteor1i=LoadImage(CurrentDir()+"images\meteor1i.bmp")
meteor2i=LoadImage(CurrentDir()+"images\meteor2i.bmp")
meteor3i=LoadImage(CurrentDir()+"images\meteor3i.bmp")
schuss1i=LoadImage(CurrentDir()+"images\schuss1i.bmp")
lune=LoadImage(CurrentDir()+"images\lune.jpg")
MaskImage meteor1i,255,0,255
MaskImage meteor2i,255,0,255
MaskImage meteor3i,255,0,255
plx=390
ply=560
srate=30
level=1
SetBuffer BackBuffer()



;__________Hauptschleife--------------
Repeat
keyask()
Cls
draw
createschuss()
If Rand(0,1) createmeteor(level)
meteormove()
moveschuss()
imagecollideproov()
deletetypes()
Flip
Until KeyHit(1)

;-----------Functionen-------------


Function draw()
DrawImage lune,0,0
DrawImage playeri,plx,ply
For m.meteor=Each meteor
Select m.meteor\art
Case 1 DrawImage meteor1i,m\xpos,m\ypos
Case 2 DrawImage meteor2i,m\xpos,m\ypos
Case 3 DrawImage meteor3i,m\xpos,m\ypos
End Select
Next
For schuss.geschoss=Each geschoss
DrawImage schuss1i,schuss\xpos,schuss\ypos
Next
Text 10,10,punkte
Text 10,25,level
Text 20,25,"Level"
If punkte>50 level=2 srate=20
If punkte>100 level=3 srate=15
If punkte>150 level=4 srate=10
If punkte>200 level=5 srate=5
End Function

Function keyask()
If KeyDown(203) plx=plx-4
If KeyDown(205) plx=plx+4
If KeyDown(57) plschuss=plschuss+1
If KeyHit(57) plschuss=srate
End Function

Function createschuss()
If plschuss=srate
schuss.geschoss=New geschoss
schuss\tod=0
schuss\xpos=plx+23
schuss\ypos=ply-6
schuss\bry=2
schuss\deleted=0
plschuss=0
EndIf
End Function

Function moveschuss()
For schuss.geschoss=Each geschoss
If schuss\tod=1 schuss\deleted=1
schuss\ypos=schuss\ypos-schuss\bry
If schuss\ypos<-10 schuss\deleted=1
Next
End Function


Function createmeteor(anzahl)
For i2=1 To anzahl
m.meteor=New meteor
m\xpos=Rand(10,790)
m\ypos=-10
m\art=Rand(1,3)
m\bry=Rnd(1,3)
m\Deleted=0
Next
End Function

Function meteormove()
For m.meteor=Each meteor
If m\tod=1 m\deleted=1
m\ypos=m\ypos+m\bry
If m\ypos=>600 m\tod=1
Next
End Function

Function imagecollideproov()
For m.meteor=Each meteor
Select m\art
Case 1 If ImagesCollide(meteor1i,m\xpos,m\ypos,0,playeri,plx,ply,0) m\deleted=1
Case 2 If ImagesCollide(meteor2i,m\xpos,m\ypos,0,playeri,plx,ply,0) m\deleted=1
Case 3 If ImagesCollide(meteor3i,m\xpos,m\ypos,0,playeri,plx,ply,0) m\deleted=1
End Select
For schuss.geschoss=Each geschoss
Select m\art
Case 1 If ImagesCollide(meteor1i,m\xpos,m\ypos,0,schuss1i,schuss\xpos,schuss\ypos,0) m\deleted=1 punkte=punkte+1 schuss\deleted=1
Case 2 If ImagesCollide(meteor2i,m\xpos,m\ypos,0,schuss1i,schuss\xpos,schuss\ypos,0) m\deleted=1 punkte=punkte+2 schuss\deleted=1
Case 3 If ImagesCollide(meteor3i,m\xpos,m\ypos,0,schuss1i,schuss\xpos,schuss\ypos,0) m\deleted=1 punkte=punkte+3 schuss\deleted=1
End Select
Next
Next
End Function

Function Deletetypes()
For m.meteor=Each meteor
If m/deleted=1 Delete m.meteor
Next
For schuss.geschoss=Each geschoss
If schuss\deleted=1 Delete schuss.geschoss
Next
End FunctionCode: [AUSKLAPPEN]
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

newkev

BeitragDi, Jan 06, 2004 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

;2.ter Anlauf
Graphics 800,600,32,2
;          Initialisierung/Laden
Global playeri,plx,ply,plschuss,srate,meteor1i,meteor2i,meteor3i,schuss1i,punkte,lune,level
Type meteor
Field tod
Field xpos
Field ypos
Field brx
Field bry
Field art
Field deleted
End Type

m.meteor = New meteor 
Type geschoss
Field tod
Field xpos
Field ypos
Field brx
Field bry
Field deleted
End Type

schuss.geschoss= New geschoss

versuchs mal so
Signatur? Gibts nich^^
  • Zuletzt bearbeitet von newkev am Di, Jan 06, 2004 19:09, insgesamt einmal bearbeitet
 

furbolg

BeitragDi, Jan 06, 2004 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm... Lad mal die Grafiken hoch, dann kann ich mal testen
 

furbolg

BeitragDi, Jan 06, 2004 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm kann sein das du vergessen hast gegen Null zu prüfen, das musst ich aber früher nie machen, naja du hast ja dafür 2 schleifen in 2x funktionen erstellt. Ich habs so gemacht wie in meinem Beispiel...

Firstdeathmaker

BeitragDi, Jan 06, 2004 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, dass ich das ja in einer Schleife laufen lasse. Da kann ich das nicht einfach an´s Ende setzen...

Und noch was: Sind Type´s nicht eh immer Global? Oder muss man sie extra auf Global setzen wenn man sie in Functionen braucht? (Wie du in deinem Beispie)
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
  • Zuletzt bearbeitet von Firstdeathmaker am Di, Jan 06, 2004 19:37, insgesamt einmal bearbeitet
 

OJay

BeitragDi, Jan 06, 2004 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Firstdeathmaker hat Folgendes geschrieben:

Code: [AUSKLAPPEN]
;2.ter Anlauf
Graphics 800,600,32,2
;          Initialisierung/Laden
Global playeri,plx,ply,plschuss,srate,meteor1i,meteor2i,meteor3i,schuss1i,punkte,lune,level
Type meteor
Field tod
Field xpos
Field ypos
Field brx
Field bry
Field art
Field deleted
End Type
Type geschoss
Field tod
Field xpos
Field ypos
Field brx
Field bry
Field deleted
End Type
Global m.meteor
Global schuss.geschoss
playeri=LoadImage(CurrentDir()+"images\Schiff1.bmp")
MaskImage playeri,255,0,255
meteor1i=LoadImage(CurrentDir()+"images\meteor1i.bmp")
meteor2i=LoadImage(CurrentDir()+"images\meteor2i.bmp")
meteor3i=LoadImage(CurrentDir()+"images\meteor3i.bmp")
schuss1i=LoadImage(CurrentDir()+"images\schuss1i.bmp")
lune=LoadImage(CurrentDir()+"images\lune.jpg")
MaskImage meteor1i,255,0,255
MaskImage meteor2i,255,0,255
MaskImage meteor3i,255,0,255
plx=390
ply=560
srate=30
level=1
SetBuffer BackBuffer()



;__________Hauptschleife--------------
Repeat
keyask()
Cls
draw
createschuss()
If Rand(0,1) createmeteor(level)
meteormove()
moveschuss()
imagecollideproov()
deletetypes()
Flip
Until KeyHit(1)

;-----------Functionen-------------


Function draw()
DrawImage lune,0,0
DrawImage playeri,plx,ply
For m.meteor=Each meteor
  Select m.meteor\art
  Case 1 DrawImage meteor1i,m\xpos,m\ypos
  Case 2 DrawImage meteor2i,m\xpos,m\ypos
  Case 3 DrawImage meteor3i,m\xpos,m\ypos
  End Select
Next
For schuss.geschoss=Each geschoss
 DrawImage schuss1i,schuss\xpos,schuss\ypos
Next
Text 10,10,punkte
Text 10,25,level
Text 20,25,"Level"
If punkte>50 level=2 srate=20
If punkte>100 level=3 srate=15
If punkte>150 level=4 srate=10
If punkte>200 level=5 srate=5
End Function

Function keyask()
If KeyDown(203) plx=plx-4
If KeyDown(205) plx=plx+4
If KeyDown(57) plschuss=plschuss+1
If KeyHit(57) plschuss=srate
End Function

Function createschuss()
 If plschuss=srate
  schuss.geschoss=New geschoss
  schuss\tod=0
  schuss\xpos=plx+23
  schuss\ypos=ply-6
  schuss\bry=2
  schuss\deleted=0
  plschuss=0
 EndIf
End Function

Function moveschuss()
For schuss.geschoss=Each geschoss
 If schuss\tod=1 schuss\deleted=1
 schuss\ypos=schuss\ypos-schuss\bry
 If schuss\ypos<-10 schuss\deleted=1
Next
End Function


Function createmeteor(anzahl)
For i2=1 To anzahl
  m.meteor=New meteor
  m\xpos=Rand(10,790)
  m\ypos=-10
  m\art=Rand(1,3)
  m\bry=Rnd(1,3)
  m\Deleted=0
Next
End Function

Function meteormove()
For m.meteor=Each meteor
 If m\tod=1 m\deleted=1
 m\ypos=m\ypos+m\bry
 If m\ypos=>600 m\tod=1
Next
End Function

Function imagecollideproov()
For m.meteor=Each meteor
 Select m\art
 Case 1 If ImagesCollide(meteor1i,m\xpos,m\ypos,0,playeri,plx,ply,0) m\deleted=1
 Case 2 If ImagesCollide(meteor2i,m\xpos,m\ypos,0,playeri,plx,ply,0) m\deleted=1
 Case 3 If ImagesCollide(meteor3i,m\xpos,m\ypos,0,playeri,plx,ply,0) m\deleted=1
 End Select
  For schuss.geschoss=Each geschoss
   Select m\art
   Case 1 If ImagesCollide(meteor1i,m\xpos,m\ypos,0,schuss1i,schuss\xpos,schuss\ypos,0) m\deleted=1 punkte=punkte+1 schuss\deleted=1
   Case 2 If ImagesCollide(meteor2i,m\xpos,m\ypos,0,schuss1i,schuss\xpos,schuss\ypos,0) m\deleted=1 punkte=punkte+2 schuss\deleted=1
   Case 3 If ImagesCollide(meteor3i,m\xpos,m\ypos,0,schuss1i,schuss\xpos,schuss\ypos,0) m\deleted=1 punkte=punkte+3 schuss\deleted=1
   End Select
  Next
Next
End Function

Function Deletetypes()
For m.meteor=Each meteor
If m\deleted=1 Delete m.meteor
Next
For schuss.geschoss=Each geschoss
If schuss\deleted=1 Delete schuss.geschoss
Next
End Function


dieser code sollte laufen! du hast nur in deiner deletetypes()-funktion einen "/" statt "\" geschrieben, welcher natürlich für eine division steht, und somit besagten fehler produziert...

Firstdeathmaker

BeitragDi, Jan 06, 2004 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, der 1. Code funktioniert. Jetzt muss ich nochmal den anderen überprüfen...
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Firstdeathmaker

BeitragDi, Jan 06, 2004 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, es funktioniert alles! Vielen Dank an alle die mir geholfen haben!
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Gandalf13

BeitragDi, Jan 06, 2004 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
viel zu kopliziert Very Happy
versuc mal mit arrys 8)
viel spaßMr. Green hs

Firstdeathmaker

BeitragDi, Jan 06, 2004 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
was sind arrys? (Bin immer auf der suche nach neuen Sachen...)
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

furbolg

BeitragDi, Jan 06, 2004 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Gandalf:

Son quatsch, bei Types muss man Aufpassen und sich an Richtlinien halten aber schwer sind sie nicht.

Ausserdem warum soll ich beim Start gleich 1 MB Ram reservieren, wenn ich später gar nich so viel hab ? (extrem beispiel)
Ausserdem kann es bei Dims vorkommen das du zu wenig reserviert hast.


@ death:

Ich wusste doch meine gute alte Methode hilft dir Smile

Übrigens kannst du dann Dead löschen, kannst ja IsDeleted statt Dead verwenden Very Happy

// Edit

Dim Test(100)

Ist ein Array, geht auch mit Types, Dim Bla.TTest(100)
dann musst du aber für jeden Eintrag bei Bla (0 - 99) ein Bla(x) = new TTest machen sonst hast du ein Speicherfehler Very Happy

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group