ImagesCollide und delete...Hilfe...SOS

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

 

MarieBube

Betreff: ImagesCollide und delete...Hilfe...SOS

BeitragSa, Jan 02, 2010 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Also langsam werde ich wahnsinnig Crying or Very sad Für die Schule müssen wir ein Spiel programmieren und ich (BlitzBasic unfähig) verzweifle an meinem!
Ich hab halt so ein Spiel, bei dem sich unten ein Mammut hin und her bewegt und Cookies auffängt bzw. isst, die von oben runter fallen. Aber ich bekomme es nicht hin, dass diese Cookies verschwinden, wenn sie mit dem Mammut kollidieren >Sad
Könnt ihr mir sagen, was ich da schreiben muss? Tut mir Leid, dass ich den ganzen Code reinstelle, aber ich weiß nicht, was ihr da braucht...

Code: [AUSKLAPPEN]
m=MilliSecs()

;name
   AppTitle "Mammuth hat Hunger!"

;counter
   Const width=10,height=10,depth=1

Graphics  1000,600

   landschaft=LoadImage("Landschaft.bmp")
   ScaleImage landschaft,0.65,0.65;

i=MilliSecs()
zeit=i-m

;bilder hochladen
   Mammoth=LoadImage("Mammoth3.bmp")
      ScaleImage Mammoth,0.75,0.75;
      MaskImage mammoth,255,255,255

   cookie=LoadImage("cookie.bmp")
      MaskImage cookie, 255,255,255
      ScaleImage cookie, 0.05,0.05;

;type erstellen
   Type cookie
         Field x
         Field y
         Field punkte
        Field speed
   End Type

SetBuffer BackBuffer()

;counter
   counter = 1
      fontno=LoadFont("verdana",50)
   SetFont fontno
   While Not KeyDown(1)
   Color Rnd(256),Rnd(256),Rnd(256)

epeat

   counter = counter + 1

If counter>60 Then
   cake.cookie=New cookie
      cake\x=Rnd(1,950)
      cake\y=0
      cake\speed=Rnd(0.5,2)
      cake\punkte=z
counter=0
EndIf

;steuerung
   If KeyDown (205);
      a=a+10;
      EndIf
      If KeyDown(203);
      a=a-10;
      EndIf;     

Cls

DrawImage landschaft,x,y;
DrawImage Mammoth,a,410


If a>820
a=820 EndIf

If a<0
a=0 EndIf 
       

For cake.cookie=Each cookie 
If ImagesCollide(Mammoth,a,410,0,cookie,cake\x,cake\y,0) Then
Delete cake
EndIf

DrawImage cookie, cake\x,cake\y
 cake\y = cake\y + cake\speed

 ;If cake\y>410 Then Delete cake
Next


;anzeige

Text 230,1,"Zeit: "
Text 230,10,"Leben: "
Text 230, 20,"Punkte: "

;counter
Text 900,550,counter

Flip
Forever
Wend


Liebe Grüße, Marie Smile
Und bitte macht mich nicht wegen sämlichen Anfängerfehlern zur Schnecke Very Happy

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Jan 02, 2010 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Nachdem du ein cake gelöscht hast, versuchst du nun das ungültige Handle noch einmal zu zeichen. Und genau das geht nicht.

Code: [AUSKLAPPEN]
For cake.cookie=Each cookie
   If ImagesCollide(Mammoth,a,410,0,cookie,cake\x,cake\y,0) Then
      Delete cake
   EndIf
   
   DrawImage cookie, cake\x,cake\y
   cake\y = cake\y + cake\speed
   
 ;If cake\y>410 Then Delete cake
Next

Versuch es also anders rum.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ZaP

BeitragSa, Jan 02, 2010 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Zwei Sachen sind mir jetzt aufgefallen:

Du prüfst jeden Keks auf Kollision, wenn er kollidiert, löschst Du ihn, aber zeichnest danach ein Bild an den soeben gelöschten Koordinaten -> vertauschen, sonst MAV.

Dann hast Du noch Repeat und While verschachtelt, wieso auch immer.
Starfare: Worklog, Website (download)

Midimaster

BeitragSa, Jan 02, 2010 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei Dir heißt ein TYPE und ein geladenes Bild gleich: "Cookie". Das darf nicht sein.

könnte die Ursache sein.
 

MarieBube

BeitragSa, Jan 02, 2010 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic hat Folgendes geschrieben:
Nachdem du ein cake gelöscht hast, versuchst du nun das ungültige Handle noch einmal zu zeichen. Und genau das geht nicht.

Code: [AUSKLAPPEN]
For cake.cookie=Each cookie
   If ImagesCollide(Mammoth,a,410,0,cookie,cake\x,cake\y,0) Then
      Delete cake
   EndIf
   
   DrawImage cookie, cake\x,cake\y
   cake\y = cake\y + cake\speed
   
 ;If cake\y>410 Then Delete cake
Next

Versuch es also anders rum.


Wenn ich das mache, kommt da "Object does not exist"
 

MarieBube

BeitragSa, Jan 02, 2010 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
ZaP hat Folgendes geschrieben:
Zwei Sachen sind mir jetzt aufgefallen:

Du prüfst jeden Keks auf Kollision, wenn er kollidiert, löschst Du ihn, aber zeichnest danach ein Bild an den soeben gelöschten Koordinaten -> vertauschen, sonst MAV.

Dann hast Du noch Repeat und While verschachtelt, wieso auch immer.


Danke für die Antwort, aber in meinem Gesicht steht ein fettes Fragezeichen.
 

MarieBube

BeitragSa, Jan 02, 2010 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
Bei Dir heißt ein TYPE und ein geladenes Bild gleich: "Cookie". Das darf nicht sein.

könnte die Ursache sein.


Ich dachte, das Bild ist der Type?!

Nicdel

BeitragSa, Jan 02, 2010 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest Doppel- oder Trippelposts vermeiden, benutze den Edit-Button.

Edit:
Nein, Bild und Type sind getrennt Wink
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Holzchopf

Meisterpacker

BeitragSa, Jan 02, 2010 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähh, Marie, wir (inkl. dir Wink ) produzieren hier keine Doppel- oder gar Trippelposts.

Benutze in Zukunft den Edit-Button (user posted image) oben rechts an deinem Beitrag, wenn du etwas nachtragen willst. Auch wenn ein paar Minuten vergangen sind, die Änderung wird schon keinem entgehen.

Danke

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

MarieBube

BeitragSa, Jan 02, 2010 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, mit den Doppel- oder Trippelposts, das wird nicht nochmal vorkommen. Tut mir Leid.

Also wegen dem "cookie". Wie soll ich den denn nennen, das BB trotzdem weiß, dass ich dieses Bild auch als Type verwenden will?

Nicdel

BeitragSa, Jan 02, 2010 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Egal, wie du ihn nennst, du musst nur den Namen auch bei DrawImage verwenden Wink
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

MarieBube

BeitragSa, Jan 02, 2010 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, ich weiß nicht, welches Bild und welches Type ist, weil sie ja beide "Cookie" heißen...

N0X

BeitragSa, Jan 02, 2010 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
So, weil ich grade Langeweile hatte, hab ich dir deinen Code mal so umgeschrieben, dass er funktioniert, und nochmal n paar strukturelle Sachen verbessert.

Code: [AUSKLAPPEN]
AppTitle "Mammuth hat Hunger!"

SeedRnd MilliSecs()

Const width=10,height=10,depth=1
Global points=0,mx=100,my=525

Graphics 1000,600
SetBuffer BackBuffer()

landschaft=LoadImage("Landschaft.bmp")
ScaleImage landschaft,0.65,0.65

i=MilliSecs()
zeit=i-m

;bilder hochladen
Mammoth=LoadImage("Mammoth3.bmp")
ScaleImage Mammoth,0.75,0.75
MaskImage mammoth,255,255,255

cookie=LoadImage("cookie.bmp")
ScaleImage cookie, 0.05,0.05
MaskImage cookie,255,255,255

;type erstellen
Type cookie
   Field x
   Field y
   Field punkte
   Field speed
End Type

;counter
counter = 1
fontno=LoadFont("verdana",50)
SetFont fontno

While Not KeyDown(1)
   Color Rnd(256),Rnd(256),Rnd(256)

     counter = counter + 1

   If counter>60 Then
      c.cookie = New cookie
      c\x = Rnd(1,950)
      c\y = 0
      c\speed = Rnd(0.5,2)
      c\punkte = z
      counter = 0
   EndIf
   
   ;steuerung
   If KeyDown(205)
      mx=mx+10
   EndIf
   If KeyDown(203)
      mx=mx-10
   EndIf
   
   Cls
   
   DrawImage landschaft,x,y
   DrawImage Mammoth,mx,my
   
   If mx>820 Then
      mx=820
   EndIf
   
   If mx<0 Then
      mx=0
   EndIf
   
   For c.cookie=Each cookie
      DrawImage cookie,c\x,c\y
      c\y = c\y + c\speed
      If ImagesCollide(Mammoth,mx,my,0,cookie,c\x,c\y,0) Then
         Delete c.Cookie
         points = points+10
      EndIf
   Next
   
   ;anzeige
   Text 10,0,"Zeit: "
   Text 10,40,"Leben: "
   Text 10,80,"Punkte: "+points
   
   ;counter
   Text 900,550,counter
Flip
Wend
End


Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Midimaster

BeitragSa, Jan 02, 2010 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Also die Variable fürs Bild nennst Du CookieBild, den Typ nennst Du CookieTyp.

Zitat:
Wie soll ich den denn nennen, das BB trotzdem weiß, dass ich dieses Bild auch als Type verwenden will?


Du kannst NICHT einem Bild und einem TYPE den gleichen Namen geben, weil BB eben nicht beherscht, dass ein Bild gleichzeitig ein TYPE sein kann. Und es ist auch gar nicht nötig! Das bekommst Du anders hin.

gleich mehr....


so könnte die Kollision aussehen:

BlitzBasic: [AUSKLAPPEN]
For cake.cookie=Each cookie
If ImagesCollide(Mammoth,a,410,0,CookieBild,cake\x,cake\y,0) Then
Delete cake
Else
DrawImage cookie, cake\x,cake\y
cake\y = cake\y + cake\speed
If cake\y>410 Then Delete cake
EndIf
Next
  • Zuletzt bearbeitet von Midimaster am Sa, Jan 02, 2010 20:01, insgesamt einmal bearbeitet
 

MarieBube

BeitragSa, Jan 02, 2010 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
OH MEIN GOTT, NOX!! JE T'AIME Very HappyVery HappyVery HappyVery Happy
danke danke danke Smile
und auch an die andern: VIELEN DANK!!!

supi supi supi ^^

Midimaster

BeitragSa, Jan 02, 2010 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@nox


ist da nicht noch der cookie-fehler in der Collision?

Zitat:
If ImagesCollide(Mammoth,mx,my,0,cookie,c\x,c\y,0) Then

N0X

BeitragSa, Jan 02, 2010 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Achja, stimmt, hier nochmal verbessert. Smile

Code: [AUSKLAPPEN]
AppTitle "Mammuth hat Hunger!"

SeedRnd MilliSecs()

Const width=10,height=10,depth=1
Global points=0,mx=100,my=525

Graphics 1000,600
SetBuffer BackBuffer()

landschaft=LoadImage("background.jpg")

i=MilliSecs()
zeit=i-m

;bilder hochladen
Mammoth=LoadImage("krum.png")
MaskImage mammoth,255,0,220

cookie=LoadImage("cookie.png")
MaskImage cookie,255,255,255

;type erstellen
Type cookie
   Field x
   Field y
   Field gfx
   Field punkte
   Field speed
End Type

;counter
counter = 1
fontno=LoadFont("verdana",50)
SetFont fontno

While Not KeyDown(1)
   Color Rnd(256),Rnd(256),Rnd(256)

     counter = counter + 1

   If counter>60 Then
      c.cookie = New cookie
      c\x = Rnd(1,950)
      c\y = 0
      c\gfx = cookie
      c\speed = Rnd(0.5,2)
      c\punkte = z
      counter = 0
   EndIf
   
   ;steuerung
   If KeyDown(205)
      mx=mx+10
   EndIf
   If KeyDown(203)
      mx=mx-10
   EndIf
   
   Cls
   
   DrawImage landschaft,x,y
   DrawImage Mammoth,mx,my
   
   If mx>820 Then
      mx=820
   EndIf
   
   If mx<0 Then
      mx=0
   EndIf
   
   For c.cookie=Each cookie
      DrawImage c\gfx,c\x,c\y
      c\y = c\y + c\speed
      If ImagesCollide(Mammoth,mx,my,0,c\gfx,c\x,c\y,0) Then
         Delete c.Cookie
         points = points+10
      EndIf
   Next
   
   ;anzeige
   Text 10,0,"Zeit: "
   Text 10,40,"Leben: "
   Text 10,80,"Punkte: "+points
   
   ;counter
   Text 900,550,counter
Flip
Wend
End


Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Eingeproggt

BeitragSa, Jan 02, 2010 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
MarieBube hat anfangs gebeten nicht jeden Anfängerfehler zu kritisieren aber wenn hier schon jemand anfängt feritge Codes zu servieren so sollten wenigstens die perfekt sein oder?

daher:
-) Die Zeile
Const width=10,height=10,depth=1
kann man sich sparen, die Variablen werden nicht benutzt im hier gezeigten Code
-) Die Auflösung 1000*600 ist ziemlich exotisch (obwohl sie "rund" ist) - nimm besser 1024*768 oder 800*600
-) Das Bild Handle "Mammoth" wird einmal groß und einmal klein geschrieben - kein Fehler aber auch nicht schön
-) Ich unterstütze es an sich auch, dass man png-Bilder anstatt bmp verwendet aber vlt hat MarieBube nur die Demoversion die nur bmp unterstützt - außerdem ist ein kommentarloses ändern des Namens eine potenzielle Fehlerquelle.
-) Dem Type-Field "speed" einen Float-Wert mittels Rnd zuzuweisen ergibt nicht viel Sinn, besser ist Rand oder den Variablentyp in Float (#) ändern.
-) Wenn wir schon beim ausbessern sind erwähnen wir am besten auch diesen Thread bzgl. Flip:
https://www.blitzforum.de/foru...hp?t=25242
--> Flip 0 und Timer verwenden.

Schönen Abend!
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
  • Zuletzt bearbeitet von Eingeproggt am Sa, Jan 02, 2010 22:01, insgesamt einmal bearbeitet

N0X

BeitragSa, Jan 02, 2010 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast ja recht Rolling Eyes
Aber wozu sind eigentlich diese Zeilen gut?
Code: [AUSKLAPPEN]
i=MilliSecs()
zeit=i-m
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
 

MarieBube

BeitragSa, Jan 02, 2010 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ICH LIEBE EUCH, wenn ich das mal erwähnen darf ^^

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group