Auto Animation Problem

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

MrLimatex

Betreff: Auto Animation Problem

BeitragMo, Jan 24, 2011 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Morgen

Hab mich heute mal dem Buch von Rene Meyer zugewandt. Soweit hat das auch alles geklappt, bin jetzt beim Zeichnen von Ovalen und Vierecken angelangt. Nun hab ich die Aufgabe ein kleines Auto an meinem gezeichneten Haus vorbeifahren zu lassen. Eine Idee hatte ich zwar schon, aber das Problem ist dass sich das Auto nur bewegt (und das auch nicht immer wirklich) wenn ich den bildschirm einmal minimiert/maximiert hab. (Nach meiner eingabe durch den waitkey eben. Hier mal der Code:

BlitzBasic: [AUSKLAPPEN]
Graphics 640,480,16,3
SetBuffer BackBuffer()
Cls
ClsColor 0,0,255
Cls
For i=1 To 640 Step 20
;Wiese
Color 0,255,0
Rect 0,440,640,40,1
;Sonne
Color 255,255,0
Oval 500,100,50,50
;Haus
Color 0,0,127
Rect 100,290,200,150,1
; 2 Bäume
Color 50,0,0
Rect 450,320,15,120
Rect 520,330,15,110
Color 0,200,0
Oval 503,300,50,60
Oval 503,290,50,60
; Auto
Color 255,0,0
Rect i,390,100,50
WaitKey
Next
Flip
WaitKey


Hab auch schon die Sufu im Forum benutzt aber konnte nix finden womit ich was anfangen konnte^^


lg

ZaP

BeitragMo, Jan 24, 2011 11:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, also Du hast da eine Schleife, deren Inhalt ausgeführt, und dann erstmal auf eine Taste gewartet wird, das ganze wird aber erst nach der Schleife auf den Bildschirm gezeichnet.
Also versuch doch mal, das WaitKey aus der Schleife rauszunehmen, und stattdessen Flip rein, und am besten Cls am Anfang der Schleife auch, das sollte den gewünschten Effekt haben.
Starfare: Worklog, Website (download)
 

MrLimatex

BeitragMo, Jan 24, 2011 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Smile

Dankeschön für die fixe Antwort (leider hab ich meinen thread 2x erstellt? -.-^^) naja gut, ich habs nun mal mit dem Timer ausprobiert, es funzt auch alles soweit, nur aktualisiert sich das fenster nicht. Wie meinst du das mit dem flip nun? Muss nur immer am Fenster (Fenstermodus eben) an der Seite zuppeln und schon seh ich dass das auto ein stück gerutscht ist.

BlitzBasic: [AUSKLAPPEN]
frametimer = CreateTimer (5)
Graphics 640,480,16,3
SetBuffer BackBuffer()
Cls
ClsColor 0,0,255
Cls
For i=1 To 640 Step 10
;Wiese
Color 0,255,0
Rect 0,440,640,40,1
;Sonne
Color 255,255,0
Oval 500,100,50,50
;Haus
Color 0,0,127
Rect 100,290,200,150,1
; 2 Bäume
Color 50,0,0
Rect 450,320,15,120
Rect 520,330,15,110
Color 0,200,0
Oval 503,300,50,60
Oval 503,290,50,60
; Auto
Color 255,0,0
Rect i,390,100,50
WaitTimer(frametimer)
Cls
Next
Flip
WaitKey



lg

ZaP

BeitragMo, Jan 24, 2011 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Flip muss in die For-Schleife, denn sonst wird alles "hinter" den Bildschirm gezeichnet, und wenn die Animation fertig ist, auf die Vorderseite gebracht. Das soll aber bei jedem Einzelschritt der Animation passieren, also
BlitzBasic: [AUSKLAPPEN]

For ... To ...
WaitTimer(..)
Cls
(Zeichnen)
Flip 0
Next
Starfare: Worklog, Website (download)
 

MrLimatex

BeitragMo, Jan 24, 2011 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat funktioniert dankeschön =)

Irgendwo hab ich mal gelesen das man den delay befehl eigentlich nicht so gern benutzen sollte?

ZaP

BeitragMo, Jan 24, 2011 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, dazu liest Du vielleicht das hier, ist sowieso nützlich. Wink
Starfare: Worklog, Website (download)
 

MrLimatex

BeitragDi, Jan 25, 2011 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Smile

ich wollt jetzt mal keinen neuen Thread aufmachen, zwar nen anderes Thema aber jeden tag nen neuen Thread aufzumachen kommt sicher nicht gut Smile

Ich habe soweit die bewegungen jetzt drinn, also ich kann meinen Charakter steuern, schießen kann ich auch schon. (gelobt werden solln die fleißigen User mit ihren Codeschnipseln hier im Forum)


Jetzt hab ich mir einen Gegner auf die Map gesetzt, diesen würd ich gerne abschießen so dass ich eine meldung bekomme, er verschwindet o.ä. Hab mir dazu auch schon diverse Sachena angeguckt (ImageOverlap) aber das wollte nicht so wie ich es wollte. Oder ist das überhaupt der richtige Befehl? Was soll ich bis jetzt ansonsten noch so am Code verbessern?

BlitzBasic: [AUSKLAPPEN]
Graphics 1024,768,16.3
SetBuffer BackBuffer()
Timer=CreateTimer(60)

Global char = LoadImage("c:\space.bmp")
Global shot = LoadImage("c:\kugel.bmp")
Global enemy = LoadImage("c:\enemy.bmp")
Global hero_x= 450, hero_y = 500, shot_counter = 0

Type shot
Field shot_x
Field shot_y
End Type

Repeat
Cls

movechar()
moveshot()

WaitTimer(Timer)
Flip 0
Until KeyHit(1)

Function movechar()
If KeyDown(203) Then hero_x = hero_x-5
If KeyDown(205) Then hero_x = hero_x+5
If KeyDown(208) Then hero_y = hero_y+5
If KeyDown(200) Then hero_y = hero_y-5
DrawImage enemy, 375,100
DrawImage char, hero_x, hero_y
End Function


Function moveshot()

If KeyDown(57) Then
shot_counter = shot_counter +1
EndIf

If shot_counter = 5 Then

info.shot = New shot
info\shot_x = hero_x +65
info\shot_y = hero_y

shot_counter = 0
End If

For info.shot = Each shot
info\shot_y = info\shot_y -10
DrawImage shot,info\shot_x,info\shot_y
Next
End Function


Hier mal noch ein Screenshot wie das ganze aussieht:

user posted image


lg

gameworx

BeitragDi, Jan 25, 2011 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau mal ob du das verstehst. Ich habe deinen Code etwas überarbeitet und um Trefferabfrage ergänzt.

Code: [AUSKLAPPEN]
Graphics 1024,768,16,0

SetBuffer BackBuffer()
Timer=CreateTimer(60)

AutoMidHandle True

Global char = LoadImage("space.bmp")
Global shot = LoadImage("kugel.bmp")
Global enemy = LoadImage("enemy.bmp")
Global hero_x = GraphicsWidth() /2, hero_y = GraphicsHeight() - 100
Global enemy_x = GraphicsWidth() /2, enemy_y = 100

Global treffer = 0
Global last_shot


Type Tshot
  Field x
  Field y
End Type

Repeat
  Cls

  movechar()
  moveshot()
  hit()

  WaitTimer(Timer)
  Flip 0
Until KeyHit(1)

Function movechar()
  If KeyDown(203) Then hero_x = hero_x-5
  If KeyDown(205) Then hero_x = hero_x+5
  If KeyDown(208) Then hero_y = hero_y+5
  If KeyDown(200) Then hero_y = hero_y-5
 
  DrawImage enemy, enemy_x, enemy_Y
  DrawImage char, hero_x, hero_y
End Function


Function moveshot()
  ;mit Millisecs() fragst du die aktuelle Systemzeit in Millisekunden ab

  If KeyDown(57) And MilliSecs() > last_shot + 100 Then
 
    info.Tshot = New Tshot
    info\x = hero_x
    info\y = hero_y

    last_shot = MilliSecs() ; hier merken wir uns, wann genau der letzte Schuss abgefeuert wurde
  End If

  For info.Tshot = Each Tshot
    info\y = info\y - 10
    DrawImage shot, info\x, info\y

    ;Ein Schuss der aus dem Bild fliegt, wird nicht mehr benötigt und kann gelöscht werden:
    If info\y < -10 Then Delete info
  Next
End Function

Function hit()
  For info.Tshot = Each Tshot
    x1 = info\x - ImageWidth (shot)/2
    y1 = info\y - ImageHeight (shot)/2
    w1 = ImageWidth (shot)
    h1 = ImageHeight (shot)

    x2 = enemy_x - ImageWidth(enemy)
    y2 = enemy_y - ImageHeight(enemy)
    w2 = ImageWidth (enemy)
   h2 = ImageHeight (enemy)

    If RectsOverlap (x1,y1,w1,h1, x2,y2,w2,h2) Then
      treffer = treffer + 1
      Delete info
    End If
  Next

  Color 255,0,0 : Text 10,10,"Score: "+treffer
End Function
AMD Athlon II X3 440 (3 GHz), 4GB Ram, ATI Radeon HD 5450, Win 7
 

MrLimatex

BeitragDi, Jan 25, 2011 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Hile Smile

Also ich habe da jetzt mal so gut wie nix vertsanden wenn ich das mal so sagen darf^^ Die grundlegendnen neuen Sachen die du da jetzt hinzugefügt hast sind doch:

BlitzBasic: [AUSKLAPPEN]
Global hero_x = GraphicsWidth() /2, hero_y = GraphicsHeight() - 100
Global enemy_x = GraphicsWidth() /2, enemy_y = 100


und

BlitzBasic: [AUSKLAPPEN]
  If KeyDown(57) And MilliSecs() > last_shot + 100 Then


und dann noch

BlitzBasic: [AUSKLAPPEN]
Function hit()
For info.Tshot = Each Tshot
x1 = info\x - ImageWidth (shot)/2
y1 = info\y - ImageHeight (shot)/2
w1 = ImageWidth (shot)
h1 = ImageHeight (shot)

x2 = enemy_x - ImageWidth(enemy)
y2 = enemy_y - ImageHeight(enemy)
w2 = ImageWidth (enemy)
h2 = ImageHeight (enemy)

If RectsOverlap (x1,y1,w1,h1, x2,y2,w2,h2) Then
treffer = treffer + 1
Delete info
End If
Next

Color 255,0,0 : Text 10,10,"Score: "+treffer
End Function


oder? So ganz ist mir noch nicht klar was da was nun bewirkt.^^ Ähm, bei der Kollision ist die evtl. ein Fehler unterlaufen oder? Wenn ich nämlich zb. dort hin scheieße wie auf dem Bild. werden Treffer gezählt^^ Und wenn ich rechts von dem "enemy" scheiße dann passiert nichts. Würde es ja versuchen zu beheben, aber dafür müsst ich deine funktion unten verstehen :/^^

user posted image


lg

gameworx

BeitragDi, Jan 25, 2011 14:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Und wenn ich rechts von dem "enemy" scheiße dann passiert nichts.
Wenn du rechts neben mir scheißt, dann schon... Wink

Der Fehler in der Kollision liegt mit Sicherheit bei deinen Sprites. Die Grafiken sollten exakt so groß sein, wie das was sie darstellen. Sie sollten nicht viel schwarzen Rand drumherum haben, denn der wird auch zum Sprite gezählt, obwohl man ihn auf schwarzem Hintergrund nicht sieht.

FALSCH:
user posted image

RICHTIG:
user posted image

Die Rectsoverlap Abfrage prüft, ob sich auf dem Bildschirm zwei rechteckige Bereiche überlappen:
x1 und y1 bilden die obere linke Ecke des Schusses, w1 die Breite und h1 die Höhe.
x2 und y2 ist die obere linke Ecke des Gegner, w2 und h2 die Breite und Höhe.

Ich habe ganz oben den automidhandle Befehl eingebaut, der automatisch alle Grafiken zentriert, d. h. die X und y koordinaten befinden sich nicht in der oberen linken Ecke eines Sprites, sondern automatisch genau im Mittelpunkt. Ist vielleicht für dein Beispiel ein wenig unglücklich von mir gewesen, denn für die Kollisionsabfrage muss ich erstmal die oberen linken Ecken ermitteln. Das mache ich mit:

x1 = info\x - ImageWidth (shot)/2
info\x liegt genau in der Mitte des Schusses. Deshalb ziehe ich hier nochmal die Hälfte (ImageWidth (shot) /2) von der Gesamtbreite des Bildes ab.

Das ist nur eine mögliche Variante für Kollisionen. Es gibt noch x andere Möglichkeiten.
AMD Athlon II X3 440 (3 GHz), 4GB Ram, ATI Radeon HD 5450, Win 7
  • Zuletzt bearbeitet von gameworx am Di, Jan 25, 2011 14:23, insgesamt einmal bearbeitet
 

MrLimatex

BeitragDi, Jan 25, 2011 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe das Bild nun genauso gemacht wie auf den Links aber er schIEßt immer noch net richtig^^

Hab auch schon diverse andere Bilder ohne schwarzen Rand getestet, aber es möchte nicht, es schießt immer vorbei das Ding^^ Könnt es vlt. auch sein dass das Programm denkt dass das Bild weiter links ist obwohl es da garnicht ist? Hab auch jetzt nochmal selber im Quellcode geguckt aber nichts gefunden :S


Danke aber für deine Hilfe Smile

gameworx

BeitragDi, Jan 25, 2011 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Poste mal bitte die drei grafiken "space.bmp", "kugel.bmp" und "enemy.bmp".

Vielleicht ist deine Kugel zu breit? Ich hatte mir auf die schnelle die 3 Objekte aus deinem Screenshot ausgeschnitten und benutzt. Bei mir funktioniert es einwandfrei.

EDIT: STOP, ALLES ZURÜCK.
Da scheint wirklich ein kleiner Fehler drin zu sein. Sekunde.
AMD Athlon II X3 440 (3 GHz), 4GB Ram, ATI Radeon HD 5450, Win 7
 

MrLimatex

BeitragDi, Jan 25, 2011 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hier ist mein Schuss:

user posted image

Das der Gegner:

user posted image


Das mein Char:

user posted image


lg

gameworx

BeitragDi, Jan 25, 2011 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Fehler! Es muss heissen:

Code: [AUSKLAPPEN]

x2 = enemy_x - ImageWidth(enemy) /2
y2 = enemy_y - ImageHeight(enemy) /2


Ich hatte "/2" vergessen!


Um zu kontrollieren, welche Bereiche er abfragt, kannst du noch folgende Zeile vor "If RectsOverlap" einfügen:

Code: [AUSKLAPPEN]

Color 255,0,0 : Rect (x1,y1,w1,h1,0) : Rect (x2,y2,w2,h2,0)
AMD Athlon II X3 440 (3 GHz), 4GB Ram, ATI Radeon HD 5450, Win 7
 

MrLimatex

BeitragDi, Jan 25, 2011 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Dankeschön das hat jetzt so weit funktioniert Smile


Muss mir mal nur noch angucken wie genau da jetzt die Syntax funzt :S^^

gameworx

BeitragDi, Jan 25, 2011 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du eine Zeile nicht verstehst, erkläre ich sie dir gerne.
AMD Athlon II X3 440 (3 GHz), 4GB Ram, ATI Radeon HD 5450, Win 7

Dottakopf

BeitragDi, Jan 25, 2011 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

etwas offtopic,

was ich nicht verstehe ist, ihr seht das hier ein anfänger am Werk ist, und es wird Promt mit einem code geantwortet der Types verwendet.

und dann wundert es mich nicht das dann solche sätze rauskommen
Zitat:
schießen kann ich auch schon. (gelobt werden solln die fleißigen User mit ihren Codeschnipseln hier im Forum)


wenn ihr etwas derartig komplexes vorführt(für beginner), dann sprecht es doch wenigstens an, und zeigt den Usern den Lernstoff dazu.
Andernfalls ist man nur dazu verleitet sein Projekt aus codeschnipseln zusammen zu kleben. Und das klapt nur bis zu einem gewissen grad.


Sorry mein Beitrag war mehr kontraproduktiv... aber das musst mal raus.

Viel Erfolg noch! Das Buch ist eine super mächtige waffe Cool
Rechtschreibfehler gelten der allgemeinen Belustigung!

gameworx

BeitragDi, Jan 25, 2011 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also den Type hat er nicht von uns, sondern vermutlich aus den "Codeschnipseln". Ich habe seinen Code nur etwas geändert. Dass sich jemand an den Codeschnipseln hier im Forum bedient, finde ich nicht verwerflich. Dafür ist das Forum doch da, oder?

Ich gebe ja zu, ihm relativ viele neue Befehle um die Ohren gehauen zu haben (AutoMidHandle, Graphicswidth(), Imagewidth(), Graphicsheight(), Imageheight(), Millisecs(), RectsOverlap). Zudem haben die ersten 5 davon die Sache unnötig kompliziert gemacht (wie ich bereits oben geschrieben habe). Alles in allem sind diese Befehle in der Hilfe aber gut dokumentiert, leicht zu verstehen und vor allem erfordern sie keine grundlegende Änderung des Programmierstils wie z. B. bei der Erlernung von Types.
AMD Athlon II X3 440 (3 GHz), 4GB Ram, ATI Radeon HD 5450, Win 7
 

MrLimatex

BeitragMi, Jan 26, 2011 9:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Morgen Smile

BlitzBasic: [AUSKLAPPEN]

Type Tshot
Field x
Field y
End Type


Das hab ich im Forum gefunden. Im Buch wird es mit dim gemacht, was mir aber auch nicht ganz klar ist^^
Istd as denn ein Problem mit den Schnipseln? Ich hab nur erstmal auch nach ein paar Beispielen gesucht damit ich sehe wie das ganze Aussehen muss und ja auch mit Absicht die Forensuche benutzt, damit ich nicht noch mehr fragen stelle Smile

Naja gut, ich werd mich jetzt erstmal mit dem Buch weiter befassen, da steht die Kollision ein wenig anders drinn und es ist ECHT SUPER zum lernen o.o


lg

Xeres

Moderator

BeitragMi, Jan 26, 2011 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du Code benutzt, ohne zu verstehen wie und was er macht, ist das ein Problem. Du solltest nur bedingt nach "Aussehen" arbeiten. Beispielsweise:
Code: [AUSKLAPPEN]
info.Tshot
Was bedeutet das?
Schreib dir Mini-Beispiele um neue Befehle/Funktionen aus zu probieren - so lernt es sich immer am besten. Ohne Ahnung wie das Programm abläuft, bekommst du 100%ig Probleme.

btw: Warum zum Teufel "info"? Wer verbreitet eigentlich diese unsinnige Benennung für Type-Instanzen?
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)

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group