Problem mit dem kompletten Code (wie sich rausstellte)

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3, 4, 5

Neue Antwort erstellen

Chrissa

BeitragDi, Jan 19, 2010 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
so is umbenannt und Createtimer is weg. allerdings sind wir jetzt wieder bei meiner Anfangsphase. Die Animationen werden nicht mehr gemalt... Den Code poste ich gleich, wenn ich die Mal Vorgänge in die Draw gemacht habe.

Midimaster

BeitragDi, Jan 19, 2010 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
chrissa, das sieht gar nicht schlecht aus.

Schreib mal genau, was Du bereits richtig siehst und was nicht!

Schreib auch immer, ob die Dinge nicht gezeichnet werden, oder ob sie sich nicht bewegen. Das ist wichtig für die Fehlersuche.

Es sind nur noch ganz kleine Probleme drin. Meinem Gefühl nach müßtest du schon nah dran sein...

Ah, jetzt hab ich's:

Du schreibst irgendwo mal: Enemy1\bild. Das soll wohl ein Images sein. Aber der TYP Alien hat überhaupt kein FIELD Bild. (Mal abgesehen davon, das der Alien-Typ eigentlich besser TAlien heißen sollte. T für "Typ" Wink) Böses Foul: Das Image vom Alien heißt bei dir auch Alien. Nenn es gleich um in AlienBild. Durch eine überlegte Namensvergabe kannst du dir Tonnen von Fehlern ersparen

Da es nur 1 Image für Aliens gibt, kannst Du eigentlich direkt das Bild malen lassen.

code mit 2 bereinigten Fehlern:
BlitzBasic: [AUSKLAPPEN]
;ganz oben:
Type TAlien
Field x
Field y
Field health
Field bild
End Type
...
Global AlienBild=LoadImage("alien.png")
....
;in der Draw()
For Enemy1.TAlien = Each TAlien
Enemy1\y=Enemy1\y+5
DrawImage AlienBild,Enemy1\x,Enemy1\y-5
Next



Das gleiche gilt natürlich auch für Enemy2\picture. Bitte auch ändern. Bei Schuss\s_type hat dein System aber Berechtigung: Schließlich gibt es hier drei verschiedene Schüsse.


Das END ist übrigens Quatsch. Lass doch das Spiel weiterlaufen und den Text einfach anzeigen. Wenn Du nicht willst, dass der User noch was mit den Tasten machen kann, bau um die Tastenroutine eine IF-Abfrage

BlitzBasic: [AUSKLAPPEN]
While Not KeyDown(1)
AlienSpawn()
UfoSpawn()
If TPlayer\health > Then
move()
waffe()
EndIf
draw()
Flip 1
Wend

Sieht doch viel cooler aus, wenn das Leben der anderen weitergeht, aber der Spieler nix mehr tun kann.

Chrissa

BeitragDi, Jan 19, 2010 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
also neues Problem seit ich die bildervariablen umbenannt habe:
immer wenn ein Gegner auf dem Spielfeld ist und der Player schießt, kommt die Fehlermeldung Image does not exist. Wenn kein Gegner da ist kann man aber irgendwie doch schießen !!?! Dabei habe ich nur den Varibalen Namen geändert... Und dadurch wird das Image im Type field Enemy1.alien gespeichert.

EDIT: Habs gelöst. Beim ImagesCollide Befehl verwende ich nicht das Typefield sondern das bild an sich. Das habe ich vergessen umzubenennen Wink

Funktionieren tut:
1 Bewegungen
2 gegner spawnen
3 ufos sterben

nicht funktionieren tut:
1 todesanimation
2 Sterben des Spielers
3 schießen wenn gegner vorhanden sind
4 aliens sterben beim laser oder bei den kugeln (durch rockets können sie sterben durch die anderen 2 Arten nicht. Da kommt dann die Meldung Object does not exist...)

Den neuen Code poste ich gleich, wobei nicht viel geändert wurde... EDIT: gepostet

Midimaster

BeitragDi, Jan 19, 2010 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Animationen

Die Animationen könnn nicht funktionieren, weil Du immer gleich, wenn deren Gesundheit auf 0 geht, sie sofort DELETE machst. Lass das Type-Element zunächst am Leben und mach eine IF in die Draw() rein

BlitzBasic: [AUSKLAPPEN]
....
Enemy2\y=Enemy2\y+3
If If Enemy2\health > 0 Then
DrawImage UfoBild ,Enemy2\x,Enemy2\y
Else
DrawImage UfoSterbeBild,Enemy2\x,Enemy2\y
EndIf
....


bei den anderen das gleiche...



Kugel-Rocket-Laser

könnte es sein, dass die Schuss-Speed von der Kugel so schnell ist, das sie im einem Moment noch VOR dem Gegner ist (und deshalb noch nicht kollidiert) und im nächsten Moment schon HINTER dem Gegner ist (und deshalb nicht mehr kollidiert)? Setz mal die Kugelspeed zum Testen auf 6. Wenn das der Fall ist..., ist so etwas nur lösbar in einem System, in dem das Zeichnen völlig losgelöst wurde vom Bewegen. Mensch, hast du ein Glück, dass du den Code umgebaut hast... Wink

Aber das passt alles nicht zu der Fehlermeldung Object does not exist. In welcher Zeile genau kommt die denn?

ich habs! dein alter Fehler: Elementbenutzung nach Delete
Zitat:
....
Delete
Enemy1.alien
Exit
EndIf
EndIf
If Enemy1\y=1024-50 Then
....




noch ne frage:


wie meinst du das mit dem
Zitat:
3 schießen wenn gegner vorhanden sind
  • Zuletzt bearbeitet von Midimaster am Di, Jan 19, 2010 20:19, insgesamt einmal bearbeitet

Chrissa

BeitragDi, Jan 19, 2010 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
das hab ich gelöst^^ wenn man schißet springt es ja in eine for each next schleife. In dieser schleife ist eine If mit ImagesCollide. Da hab ich einfach nur vergessen das alien bzw. ufo bild auch umzubenennen... Da kam dann immer die Meldung Image ddoes not exist....


die speed der schüsse ändern hat nichts gebracht... Kommt immer noch auf das selbe raus...

muss ich da dann einfach nur noch das animationsimage zeichnen lassen? Spielt es die Frames dann automatisch ab, oder muss ich da noch iwas anderes dazu machen? denn einfach nur so mit drawImage funktioniert es irgendwie nicht...
  • Zuletzt bearbeitet von Chrissa am Di, Jan 19, 2010 20:24, insgesamt einmal bearbeitet

Midimaster

BeitragDi, Jan 19, 2010 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
lies noch mal oben, hab grad was zu den Schüssen ergänzt.

ANIMATIONEN

die Animations-Bilder laufen nicht automatisch ab. Du musst sie mit Millisecs() steuern lernen. Aber zunächst muss natürlich die IF-Unterscheidung in die Draw() rein (tot oder nicht tot).

Den Frame steuerst Du dann dort in dieser IF in der Draw(). Beim ersten Besuch wird Frame auf 0 gesetzt und ein AlienFrameZeit = Millisecs()+Anzeigezeit gesetzt. Ist die rum wird der Frame erhöht und die AlienFrameZeit wieder erhöht. Ist der letzte Frame abgelaufen, wird das Alien auf die Y-Pos 2000 geschickt, wo es ja später sowieso gelöscht wird. Dazu gabs auch schon einigen Code von anderen in diesem Thread an dich. schau mal zurück. Thema: Millisecs()

Chrissa

BeitragDi, Jan 19, 2010 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm da is doch dann aber ein Exit dazwischen... eigentlich sollte es dann aus der for schleife rausgehn...
und nach dem Deleten auf Grund der Koordinaten steht auch ein Exit:
Zitat:
If Enemy1\health <= 0 Then
Enemy1\health=0
Delete Enemy1.Talien
Exit
EndIf

If Enemy1\y=>1024+50 Then
Delete Enemy1.Talien
Exit
EndIf




EDIT:

Habe es jetzt wieder so gemacht wie die anderen gesagt haben. Aber es funktioniert nicht...
BlitzBasic: [AUSKLAPPEN]
		For Enemy1.Talien = Each Talien
If Enemy1\health >0 Then
Enemy1\y=Enemy1\y+5
DrawImage Enemy1\bild,Enemy1\x,Enemy1\y-5
Else
Local Timer=CreateTimer(58)
Local Frame1Count
Local Frame1Wait
Local MS
MS=MilliSecs()

If MS>Frame1Wait Then
Frame1Count=(Frame1Count+1) Mod 4
Frame1Wait=MS+500
DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count
EndIf
Delete Enemy1.Talien
Exit
EndIf

!?!?

Midimaster

BeitragDi, Jan 19, 2010 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast Recht ! Und hast doch nicht Recht!

Zitat:
For Schuss.TSchuss=Each TSchuss
For Enemy1.alien=Each alien
If ImagesCollide(Schuss\s_type,Schuss\x,Schuss\y,0,alien,Enemy1\x,Enemy1\y,0) Then
Enemy1\health=Enemy1\health-Schuss\strength
Delete Schuss.TSchuss
....
Endif
Next
Next



Kaum zu bemerken: Du DELETEst den SCHUSS und das EXIT wirkt aber nur wenn das Alien zufällig wirklich am Ende ist. So kann es dir passieren das der aktuelle SCHUSS (schon "deletet") mit einem zweiten Alien verglichen wird.


Tipp:

Trenn die Deletes endlich aus den Abfragen raus. Setzt irgendein Schuss\MussWeg Flag und zerstör ihn in einer neuen eigenen FOR/EACH/NEXT-Schleife. Gleiches machst du mit allen anderen Figuren.

Chrissa

BeitragMi, Jan 20, 2010 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm jetzt kommt kein error mehr, aber der schuss geht manchmal durch den gegner und zieht ihm dadurch solange etwas bis er tot ist oder der schuss durch ist... D.h. beim schussdeleten gibts jetzt ne verzögerung...


Nur die Animationen laufen nicht. im letzten post hab ich die Funktion rein gestellt. Es ist so, wie die anderen es gemeint haben und es geht trotzdem nicht...

Midimaster

BeitragMi, Jan 20, 2010 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
so wird das auch nix mit den animationen.

eigentlich ist es eine reine Millisecs()-Geschichte.:
FrameZeit% und FrameCount müssen natürlich GLOBAL sein, weil Du ja zwischen den Bilder immer wieder die DRAW() verläßt. Die Werte wären dann als LOCAL verloren.

BlitzBasic: [AUSKLAPPEN]
For Enemy1.TAlien = Each TAlien
If Enemy1\health >0 Then
Enemy1\y=Enemy1\y+5
DrawImage Enemy1\bild,Enemy1\x,Enemy1\y-5
Else
If FrameZeit<MilliSecs() Then
If FrameZeit=0 Then
FrameCount=0
Else
FrameCount= FrameCount +1
EndIf
FrameZeit=MilliSecs()+500
EndIf
If FrameCount<4 Then
DrawImage e1_death,Enemy1\x,Enemy1\y,Frame1Count
Else
Delete Enemy1
FrameZeit=0
EndIf
Next


Geht momentan nur für 1 Tod gleichzeitig, aber soll dir den Weg zeigen. Mehrere Tode gleichezeitig bekommst du mit FrameZeit und FrameCount als FIELD des TAlien
....

Chrissa

BeitragDo, Jan 21, 2010 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
hab jetzt mal meine Idee, die ich gestern Abend im Bett bekam, umgesetzt. Ich hab wie du gesagt hast eine flag für schussdeleten gemacht. Diese frage ich aber nicht in der draw() ab, wie du meintest (was auch für die Verzögerung sorgte), sondern In der For/Each/Next schleife, in der die Enemys sterben. Jetzt gibt es weder einen Error, noch eine Verzögerung beim Deleten.

Ein Problem besteht aber noch:
Der Player stirbt nicht...

Midimaster

BeitragDo, Jan 21, 2010 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
du meinst, du siehst das GAME OVER nie?

Dann würde ich mir mal die Player-Kraft vor dem GAME OVER anzeigen lassen:


BlitzBasic: [AUSKLAPPEN]
DebugLog "Rest-Kraft: " + TPlayer\health
If TPlayer\health <=0 Then
DrawImage Gameover,1280/2,1024/2
End
EndIf

Jamagin

BeitragDo, Jan 21, 2010 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@Chrissa

kannst du dein kompletten Code als ZipFile irgendwie uploaden? (wegen der Bilddateien)
Vielleicht kann ich auch mal durchsehen, ob ich den Fehler finde...!

Keine Sorge, ich stehle keinen Code!

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Chrissa

BeitragDo, Jan 21, 2010 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
muss ich den extern hochladen oder wo kann ich das hier machen?
Dann könnt ihr beide den Code mal anschaun...

Nicdel

BeitragDo, Jan 21, 2010 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Archiv kannst du Dateien hochladen 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

Chrissa

BeitragDo, Jan 21, 2010 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
k danke

EDIT: Is Upgeloadet...

EDIT2: Habe deine Animationslösung noch nicht eingefügt midimaster, werde ich aber noch machen.

Im Moment funktioniert wie gesagt das Sterben des Spielers und die Animationen noch nicht richtig...

PS: Töne füg ich erst ganz zum Schluss ein Smile

Jamagin

BeitragFr, Jan 22, 2010 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier hab ich Chrissas Programm korrigiert!

https://www.blitzforum.de/upload/file.php?id=7846

Hoffe es passt so, chrissa?


lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Chrissa

BeitragSa, Jan 23, 2010 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ja is ganz gut. danke für die Hilfe. Wenn ich im Code noch was entdecken wollte, was ich nicht ganz kapiere werd ich mich noch mal melden Smile


Werd jetzt ein Hauptmenü dafür schreiben und die Highscore in einer Textdatei speichern lassen, sodass man die immer hat Wink Wenn ich da nicht weiterkomme meld ich mich auch wieder. Aber in nem neuen Thread Very Happy der hier is ja jetzt lang genug^^


MfG

Gehe zu Seite Zurück  1, 2, 3, 4, 5

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group