Problem mit Spiel (Gegneranzeige)
Übersicht

![]() |
M0rgensternBetreff: Problem mit Spiel (Gegneranzeige) |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo.
Ich bin dabei ein Moorhuhnklon zu programmieren und habe folgendes Problem: Meine Gegner werden nicht mehr angezeigt. Ich habs vorher getestet und da hats funktioniert, jetzt habe ichs in das Hauptprogramm eingefügt und eine Kollisionsabfrage eingefügt und schon bekomm ich keien Gegner mehr angezeigt. Kann mir da vllt jemand weiterhelfen? Hier der Test: Code: [AUSKLAPPEN] Graphics 1280, 1024, 32, 1 SetBuffer BackBuffer() SeedRnd MilliSecs() Const X1BORDER = 10,X2BORDER = 1279 Const Y1BORDER = 10,Y2BORDER = 1023 Global Gegnererstellen=0 Global enemyCreator=0 Global gegi = LoadImage("C:\Dokumente und Einstellungen\DawnNDeath\Desktop\Spieleprogrammierung C++\Bilder\Karotte.bmp") MaskImage gegi, 0, 0, 0 MidHandle gegi ResizeImage gegi, 40, 40 Type gegner Field Xpos Field Ypos Field Death Field image Field geschw Field Richt End Type Repeat Cls CreateGegner() Flip Until KeyHit(1) End Function CreateGegner() Gegnererstellen = Gegnererstellen+1 If Gegnererstellen>= 100 ; kreire jeden 70 Durchlauf einen Gegner Local werty = Rand(20,1024) ; auf einer zufälligen Position If werty <= Y1BORDER werty = Y1BORDER + 3 ElseIf werty >= Y2BORDER werty = Y2BORDER - 3 EndIf EndIf If Gegnererstellen>= 100 Local wertx = Rand(20,1280) If wertx <= X1BORDER wertx = X1BORDER + 3 ElseIf wertx >= X2BORDER wertx = X2BORDER - 3 EndIf If Gegnererstellen>= 100 Local gesw = Rand(2,7) EndIf neu.gegner = New gegner neu\geschw = gesw neu\Xpos = wertx neu\Ypos = werty neu\Death = 0 neu\image = gegi Gegnererstellen= 0 If neu\Xpos > 640 Then neu\Richt = 0 ElseIf neu\Xpos <= 640 Then neu\Richt = 1 EndIf EndIf For neu.gegner = Each gegner If neu\Richt = 0 Then neu\Xpos = neu\Xpos - neu\geschw ElseIf neu\Richt = 1 Then neu\Xpos = neu\Xpos + neu\geschw EndIf DrawImage neu\image,neu\Xpos,neu\Ypos If neu\Xpos < X1BORDER Or neu\Xpos > X2BORDER Then neu\Death=1 If neu\Ypos < Y1BORDER Or neu\Ypos > Y2BORDER Then neu\Death=1 If neu\Death=1 Then Delete neu.gegner Next End Function Und hier die komplette Spielschleife: Code: [AUSKLAPPEN] AppTitle "Test" Graphics 1280, 1024, 32, 1 Const X1BORDER = 45,X2BORDER = 1260 Const Y1BORDER = 40,Y2BORDER = 980 SetBuffer BackBuffer() HG = LoadImage("C:\Dokumente und Einstellungen\DawnNDeath\Desktop\Spieleprogrammierung C++\Bilder\HGrund4.bmp") mouse = LoadImage("C:\Dokumente und Einstellungen\DawnNDeath\Desktop\Spieleprogrammierung C++\Bilder\Maus3.bmp") geg = LoadImage ("C:\Dokumente und Einstellungen\DawnNDeath\Desktop\Spieleprogrammierung C++\Bilder\Karotte.bmp") MaskImage geg, 0, 0, 0 MidHandle geg ResizeImage geg, 40, 40 MidHandle mouse ResizeImage mouse, 44, 44 MidHandle HG ResizeImage HG, 1278, 1022 MaskImage mouse, 255, 255, 255 Global score = 0 Type gegner Field Xpos Field Ypos Field Death Field image Field geschw Field Richt End Type Repeat Cls DrawImage HG, 643, 512 mox = MouseX() moy = MouseY() DrawImage mouse, mox, moy CreateGegner() hit() Flip Until KeyHit(1) FlushKeys Cls Cls Print "Endstand: " + score WaitKey Function CreateGegner() Gegnererstellen = Gegnererstellen+1 If Gegnererstellen>= 100 ; kreire jeden 70 Durchlauf einen Gegner Local werty = Rand(20,1024) ; auf einer zufälligen Position If werty <= Y1BORDER werty = Y1BORDER + 3 ElseIf werty >= Y2BORDER werty = Y2BORDER - 3 EndIf EndIf If Gegnererstellen>= 100 Local wertx = Rand(20,1280) If wertx <= X1BORDER wertx = X1BORDER + 3 ElseIf wertx >= X2BORDER wertx = X2BORDER - 3 EndIf If Gegnererstellen>= 100 Local gesw = Rand(2,7) EndIf neu.gegner = New gegner neu\geschw = gesw neu\Xpos = wertx neu\Ypos = werty neu\Death = 0 neu\image = gegi Gegnererstellen= 0 If neu\Xpos > 640 Then neu\Richt = 0 ElseIf neu\Xpos <= 640 Then neu\Richt = 1 EndIf EndIf For neu.gegner = Each gegner If neu\Richt = 0 Then neu\Xpos = neu\Xpos - neu\geschw ElseIf neu\Richt = 1 Then neu\Xpos = neu\Xpos + neu\geschw EndIf DrawImage neu\image,neu\Xpos,neu\Ypos If neu\Xpos < X1BORDER Or neu\Xpos > X2BORDER Then neu\Death=1 If neu\Ypos < Y1BORDER Or neu\Ypos > Y2BORDER Then neu\Death=1 If neu\Death=1 Then Delete neu.gegner Next End Function Function hit() For neu.gegner= Each gegner ;Jeden Gegner überprüfen If Not neu.gegner = Null If ImagesCollide(neu\image,neu\Xpos,neu\Ypos,0,mouse,mox,moy,0) And MouseHit(1) Then ;Wenn die Bilder kollidieren neu\Death=1 ;Dann ist der Gegner tot EndIf EndIf Next End Function End Wäre echt toll wenn da jemand wüsste woran das liegt.... (Gegner werden auch nach dem Hintergrund gezeichnet... daran liegts also net. Danke schonmal im Voraus. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. Benutze Relative Pfade zu Bildern
2. Benutze Flip 0 & einen Timer, siehe dazu Hurra, 100 % Auslastung 3. Deine IF Konstruktionen sind nicht besonders sinnvoll: Rand(20,1024) gibt eine Zahl von 20 bis 1024 zurück, die nachfolgende Abfrage ob der Wert in dem Bereich liegt kannst du dir Sparen, Rand(X1BORDER,X2BORDER) löst das alles in einer Zeile. Die Abfrage "Gegnererstellen>= 100" benutzt du mehrfach hintereinander, und ineinander, obwohl der Wert der Variable sich dort nicht verändert. Wenn ich ein Rect statt Drawimage in den Testcode einsetzte läuft's... |
||
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) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also,
1. Was meinst du mir relativen Pfaden? 2. Wenn ich rect einsetze dann ist links oben in der Ecke ein rechteck und das wars. Hier der "neue"Code: Code: [AUSKLAPPEN] AppTitle "Test" Graphics 1280, 1024, 32, 1 Const X1BORDER = 45,X2BORDER = 1260 Const Y1BORDER = 40,Y2BORDER = 980 SetBuffer BackBuffer() HG = LoadImage("Bilder\HGrund4.bmp") mouse = LoadImage("Bilder\Maus3.bmp") gegi = LoadImage ("Bilder\Karotte.bmp") MaskImage gegi, 0, 0, 0 MidHandle gegi ResizeImage gegi, 40, 40 MidHandle mouse ResizeImage mouse, 44, 44 MidHandle HG ResizeImage HG, 1278, 1022 MaskImage mouse, 255, 255, 255 Global score = 0 Type gegner Field Xpos Field Ypos Field Death Field image Field geschw Field Richt End Type Repeat Cls DrawImage HG, 643, 512 mox = MouseX() moy = MouseY() DrawImage mouse, mox, moy CreateGegner() hit() Flip Until KeyHit(1) FlushKeys Cls Cls Print "Endstand: " + score WaitKey Function CreateGegner() Gegnererstellen = Gegnererstellen+1 If Gegnererstellen>= 100 ; kreire jeden 70 Durchlauf einen Gegner Local werty = Rand(20,1024) ; auf einer zufälligen Position Local wertx = Rand(20,1280) Local gesw = Rand(2,7) EndIf neu.gegner = New gegner neu\geschw = gesw neu\Xpos = wertx neu\Ypos = werty neu\Death = 0 neu\image = gegi Gegnererstellen= 0 If neu\Xpos > 640 Then neu\Richt = 0 ElseIf neu\Xpos <= 640 Then neu\Richt = 1 EndIf For neu.gegner = Each gegner If neu\Richt = 0 Then neu\Xpos = neu\Xpos - neu\geschw ElseIf neu\Richt = 1 Then neu\Xpos = neu\Xpos + neu\geschw EndIf Rect neu\Xpos, neu\Ypos, 20,20,1 If neu\Xpos < X1BORDER Or neu\Xpos > X2BORDER Then neu\Death=1 If neu\Ypos < Y1BORDER Or neu\Ypos > Y2BORDER Then neu\Death=1 If neu\Death=1 Then Delete neu.gegner Next End Function Function hit() For neu.gegner= Each gegner ;Jeden Gegner überprüfen If Not neu.gegner = Null If ImagesCollide(neu\image,neu\Xpos,neu\Ypos,0,mouse,mox,moy,0) And MouseHit(1) Then ;Wenn die Bilder kollidieren neu\Death=1 ;Dann ist der Gegner tot EndIf EndIf Next End Function End gruß, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du verteilst Werte wenn "Gegnererstellen>= 100" aber erstellen tust du Jeden Schleifendurchlauf einen Typeeintrag (wegen fehlender Koordinaten natürlich bei 0,0). Dann setzt du "Gegnererstellen = 0" und verhinderst, das die Variable jemals größer wird. | ||
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) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich hab jetzt das EndIf weiter nach unten gesetzt.
Aber es funktioniert weder mit Rect noch mit drawImage Hier der Code Code: [AUSKLAPPEN] AppTitle "Test" Graphics 1280, 1024, 32, 1 Const X1BORDER = 45,X2BORDER = 1260 Const Y1BORDER = 40,Y2BORDER = 980 SetBuffer BackBuffer() HG = LoadImage(CurrentDir$()+"Bilder\HGrund4.bmp") mouse = LoadImage(CurrentDir$()+"Bilder\Maus3.bmp") gegi = LoadImage (CurrentDir$()+"Bilder\Karotte.bmp") MaskImage gegi, 0, 0, 0 MidHandle gegi ResizeImage gegi, 40, 40 MidHandle mouse ResizeImage mouse, 44, 44 MidHandle HG ResizeImage HG, 1278, 1022 MaskImage mouse, 255, 255, 255 Global score = 0 Type gegner Field Xpos Field Ypos Field Death Field image Field geschw Field Richt End Type Repeat Cls DrawImage HG, 643, 512 mox = MouseX() moy = MouseY() DrawImage mouse, mox, moy CreateGegner() hit() Text 40,40, Gegnererstellen, True, False Flip Until KeyHit(1) FlushKeys Cls Cls Print "Endstand: " + score WaitKey Function CreateGegner() Gegnererstellen = Gegnererstellen+1 If Gegnererstellen>= 70 Then ; kreire jeden 70 Durchlauf einen Gegner Local werty = Rand(20,1024) ; auf einer zufälligen Position Local wertx = Rand(20,1280) Local gesw = Rand(2,7) neu.gegner = New gegner neu\geschw = gesw neu\Xpos = wertx neu\Ypos = werty neu\Death = 0 neu\image = gegi Gegnererstellen= 0 If neu\Xpos > 640 Then neu\Richt = 0 ElseIf neu\Xpos <= 640 Then neu\Richt = 1 EndIf EndIf For neu.gegner = Each gegner If neu\Richt = 0 Then neu\Xpos = neu\Xpos - neu\geschw ElseIf neu\Richt = 1 Then neu\Xpos = neu\Xpos + neu\geschw EndIf DrawImage neu\image, neu\Xpos, neu\Ypos If neu\Xpos < X1BORDER Or neu\Xpos > X2BORDER Then neu\Death=1 If neu\Ypos < Y1BORDER Or neu\Ypos > Y2BORDER Then neu\Death=1 If neu\Death=1 Then Delete neu.gegner Next End Function Function hit() For neu.gegner= Each gegner ;Jeden Gegner überprüfen If Not neu.gegner = Null If ImagesCollide(neu\image,neu\Xpos,neu\Ypos,0,mouse,mox,moy,0) And MouseHit(1) Then ;Wenn die Bilder kollidieren neu\Death=1 ;Dann ist der Gegner tot EndIf EndIf Next End Function End Kann mir irgendjemand helfen??? Ich weiß echt nicht weiter. Liebe Grüße, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
"Gegnererstellen" ist nicht Global deklariert und ist bei jedem Aufruf von CreateGegner() = 0 | ||
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) |
![]() |
Meoqan |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi!
also ich würde das nen bischen anderst machen... hier das hab ich mal in 10 min zusammen gebastelt: und nicht einfach kopieren: angucken, lernen und anwenden... ![]() Code: [AUSKLAPPEN] AppTitle "Mein Moorhuhn klon! WTF?!" Graphics 1024,768,32,2 SetBuffer BackBuffer() Type gegner Field x#,y# Field winkel#,kk Field dest End Type Global gegner.gegner Local gegnertimer=0 tmr=CreateTimer(30) Repeat WaitTimer tmr Cls gegnertimer=gegnertimer+1 If gegnertimer > 20 Then gegnertimer=0 tmp=Rnd(0,1) If tmp=1 Then add_gegner(0,Rnd(50,600),True) Else add_gegner(1024,Rnd(50,600),False) EndIf EndIf update_gegner(MouseX(),MouseY(),MouseHit(1)) draw_gegner() Color 0,255,0 Oval MouseX()-10,MouseY()-10,20,20,0 Plot MouseX(),MouseY() Flip Until KeyHit(1) Function add_gegner(x,y,dest) gegner=New gegner gegner\x=x gegner\y=y gegner\dest=dest End Function Function update_gegner(mx,my,mh1) For gegner = Each gegner gegnerhit=False If gegner\dest Then If gegner\kk Then gegner\winkel#=gegner\winkel#+1 If gegner\winkel# => 90 Then gegner\kk=False EndIf Else gegner\winkel#=gegner\winkel#-1 If gegner\winkel# =< 0 Then gegner\kk=True EndIf EndIf gegner\x =gegner\x + Cos(gegner\winkel# - 45) * 5 gegner\y =gegner\y + Sin(gegner\winkel# - 45) * 5 Else If gegner\kk Then gegner\winkel#=gegner\winkel#+1 If gegner\winkel# => 90 Then gegner\kk=False EndIf Else gegner\winkel#=gegner\winkel#-1 If gegner\winkel# =< 0 Then gegner\kk=True EndIf EndIf gegner\x =gegner\x + Cos(gegner\winkel# - 225) * 5 gegner\y =gegner\y + Sin(gegner\winkel# - 225) * 5 EndIf If mh1 Then entfernung#=Sqr( (mx - gegner\x) ^ 2 + (my - gegner\y) ^ 2) If entfernung# < 20 Then gegnerhit=True EndIf If gegner\x < -50 Or gegner\x > 1050 Then gegnerhit=True If gegnerhit Then Delete gegner Next End Function Function draw_gegner() Color 255,0,0 For gegner = Each gegner Oval gegner\x-10,gegner\y-10,20,20,1 Next End Function |
||
meine codes sind die essenz des bössen. nicht du veränderst meine codes sondern meine codes verändern dich! |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es funtzt.
Vielen Dank. Ich hab nur folgendes Problem bei der Kollission: Sie funktioniert nicht. Ich überprüf das eigentlich für jeden Gegner, aber es passiert nichts... Hier der Code: Code: [AUSKLAPPEN] Function hit() For neu.gegner= Each gegner ;Jeden Gegner überprüfen If MouseHit(1) And ImagesOverlap (neu\image,neu\Xpos,neu\Ypos,mouse,MouseX,MouseY) Then ;Wenn die Bilder kollidieren Delete neu.gegner ;Dann ist der Gegner tot EndIf Next End Function Was hab ich falsch gemacht? |
||
![]() |
Valnar |
![]() Antworten mit Zitat ![]() |
---|---|---|
neu.egner= <- was beduetet das gleich? ![]() Ich weiss nicht wie du die function ausführtst, aber wenn du (was ich hoffe) diese nur bei mausklick ausführst, ist das MouseHit(1) unnötig und der Hauptfehler, da MouseHit nach jedem Aufruf genullt wird. Teste mal so: Code: [AUSKLAPPEN] Function hit() For neu.gegner Each gegner ;Jeden Gegner überprüfen If ImagesOverlap (neu\image,neu\Xpos,neu\Ypos,mouse,MouseX,MouseY) Then ;Wenn die Bilder kollidieren Delete neu.gegner ;Dann ist der Gegner tot EndIf Next End Function |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
also ich hab das jetzt so abgeändert wie du das gesagt hast. Ich hab sogar mal die Abfrage für die Maus weggelassen und es funtzt trotzdem nichts...
Eigentlich müsste ja jetzt der Gegner verschwinden wenn die Maus nur drauf ist. Aber das tuts nicht... Hier mla der komplette Code: Code: [AUSKLAPPEN] AppTitle "Test" Graphics 1280, 1024, 32, 1 Const X1BORDER = 45,X2BORDER = 1260 Const Y1BORDER = 40,Y2BORDER = 980 Global Gegnererstellen SetBuffer BackBuffer() Global HG = LoadImage(CurrentDir$()+"Bilder\HGrund4.bmp") Global mouse = LoadImage(CurrentDir$()+"Bilder\Maus3.bmp") Global gegi = LoadImage (CurrentDir$()+"Bilder\Karotte.bmp") MaskImage gegi, 0, 0, 0 MidHandle gegi ResizeImage gegi, 40, 40 MidHandle mouse ResizeImage mouse, 44, 44 MidHandle HG ResizeImage HG, 1278, 1022 MaskImage mouse, 255, 255, 255 Global score = 0 Type gegner Field Xpos Field Ypos Field Death Field image Field geschw Field Richt End Type Repeat Cls DrawImage HG, 643, 512 mox = MouseX() moy = MouseY() CreateGegner() DrawImage mouse, mox, moy hit() Text 40,40, Gegnererstellen, True, False Flip Until KeyHit(1) FlushKeys Cls Cls Print "Endstand: " + score WaitKey Function CreateGegner() Gegnererstellen = Gegnererstellen+1 If Gegnererstellen>= 70 Then ; kreire jeden 70 Durchlauf einen Gegner Local werty = Rand(20,1024) ; auf einer zufälligen Position Local wertx = Rand(20,1280) Local gesw = Rand(2,7) neu.gegner = New gegner neu\geschw = gesw neu\Xpos = wertx neu\Ypos = werty neu\Death = 0 neu\image = gegi Gegnererstellen= 0 If neu\Xpos > 640 Then neu\Richt = 0 ElseIf neu\Xpos <= 640 Then neu\Richt = 1 EndIf EndIf For neu.gegner = Each gegner If neu\Richt = 0 Then neu\Xpos = neu\Xpos - neu\geschw ElseIf neu\Richt = 1 Then neu\Xpos = neu\Xpos + neu\geschw EndIf DrawImage neu\image, neu\Xpos, neu\Ypos If neu\Xpos < X1BORDER Or neu\Xpos > X2BORDER Then neu\Death=1 If neu\Ypos < Y1BORDER Or neu\Ypos > Y2BORDER Then neu\Death=1 If neu\Death=1 Then Delete neu.gegner Next End Function Function hit() For neu.gegner = Each gegner ;Jeden Gegner überprüfen If ImagesCollide (neu\image,neu\Xpos,neu\Ypos,0,mouse,mox,moy,0) Then neu\Death=1 ;Wenn die Bilder kollidieren ;Dann ist der Gegner tot Next End Function End Der sollte den Gegner löschen aber das funtzt ja nicht.... |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, an Meoqan...
Ich hab dein Programm mal durchgetestet und ein wenig verändert... (mausradieus etc) Daraus konnte ich echt was lernen... Komm jetzt sogar einigermaßemmit den Sinus und Kosinus funktionen bei BB klar. Vielen Dank Mein Spiel hab ich von vorne angefangen, weil ich Spaghetti Code geschrieben habe, wie ihr alle sehen könnt.... Vielen Dank für die Hilfe. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group