Bild bewegen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

mpcool

Betreff: Bild bewegen

BeitragMo, Jul 23, 2007 4:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie kann ich zum beispiel einen Ball über den Bildschirm rollen lassen, verstehe das nicht Confused

NightPhoenix

BeitragMo, Jul 23, 2007 8:10
Antworten mit Zitat
Benutzer-Profile anzeigen
[Mit Blitz3D Befehlen erklärt]
Dazu musst du schleifen nutzen!

Die meisten Blitz Programme sind so aufgebaut dass du eine "Lade-Schleife" hast in denen Dinge geladen werden die du nur einmal aufrufen musst weil sie dann im speicher bleiben.
Bsp: LoadMesh("Name.3ds")
... und dessen dazugehörige Parameter, wie RotateEntity, ScaleEntity, etc.
Die LadeSchleife wird nur EINMAL ausgeführt, da für sie kein Wiederholen befehl vorgesehen ist.

Die While-Schleife, bzw. "Hauptschleife" ist eine Schleife die bis zum Programmende immer wieder von oben bis unten neu ausgelesen wird. Ein Schleifendurchlauf der While-Schleife ist also ein Bild (Frame). Wenn du die Bilder/Schleifendurchläufe in 1000 Millisekunden (1 Sekunde) zählst dann erhältst du die FPS (Bilder pro Sekunde)
Warum wird die While Schleife immer wieder wiederholt? Weil am Anfang ein Befehl steht (While not keyhit(1) ) der folgendes aussagt: "Solange der Knopf 1 (Taste ESC) nicht gedrückt wird tue folgendes...."
Da dieser Befehl wissen muss wann er wieder an den Anfang der While-Schleife springen soll beendest du eine solche Schleife mit "Wend".
Nach "Wend" folgt in der Regel das "End", da man das gleich als EXIT-Funktion nutzen kann, also wenn man die Taste 1 (ESC) drückt verlässt man gleich das Programm.

Wenn du einen Ball bewegen willst musst du ihn also vorerst in der LadeSchleife laden (genauso die Lichter, Texturen, Kollisionen, etc.)...
Danach trägst du in die While-Schleife ein: MoveEntity Ball,0.1,0,0

Die Erklärung ist ganz simpel... Würdest du MoveEntity vor While eintragen würde es nur einmal ausgeführt werden und so der Ball nur ein einziges Mal um 0.1 Einheiten nach Rechts auf der X-Achse bewegt werden.
Da die While-Schleife immer wieder ausgeführt wird wird der Ball jeden Schleifendurchlauf einmal um 0.1 bewegt. Also bewegt er sich nun optisch!
Das ist genau das selbe wie bei Filmstreifen, da sind auch nur einzelne Bilder drauf wo eine Folge von Bildern mehrmals pro Sekunde auf die Leinwand projeziert wird. Das selbe macht Man bei Spielen eben auch in Form einer sich immer wiederholenden Schleife.

Solch eine Schleife kann man übrigens in jeder Programmiersprache realisieren die einen Befehl für eine Schleife enthält die angibt: wo die Schleife starten soll, wann sie endet und was die Abbruchbedingungen ist.


Ich hoffe ich hab dir das ausreichend erklärt
Mit freundlichen Grüßen Nightphoenix Smile
 

mpcool

BeitragMo, Jul 23, 2007 8:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, danke, aber das prob ist ja das ich das ganze in 2D mache, und da nicht weiß wie ich sie bewegen soll Embarassed

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jul 23, 2007 9:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Du benötigst dafür Positionsvariablen für dein zu bewegendes Objekt.

Die einfachste art ein Objekt zu bewegen ist dann noch, direkt aus der Tastaturabfrage.

Code: [AUSKLAPPEN]
Graphics 400,400,0,2
SetBuffer BackBuffer()

xp=100
yp=100


While Not KeyHit(1)
 If KeyDown(203) xp=xp-1
 If KeyDown(205) xp=xp+1
 If KeyDown(200) yp=yp-1
 If KeyDown(208) yp=yp+1
 Rect xp,yp,5,5,1
 Flip
 Cls

Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

mpcool

BeitragMo, Jul 23, 2007 9:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die antwort, aber ich meine ja wie ich das machen soll das sich ein Ball über Spielfeld bewegt (Pong), bekomm ich irwie ned auf die Reihe
 

Dreamora

BeitragMo, Jul 23, 2007 9:46
Antworten mit Zitat
Benutzer-Profile anzeigen
indem du die Positionsvariablen veränderst entsprechend des Bewegungsverhalten des Balles.
Dazu gibt es hier und auf www.robsite.de verschiedene Tutorials.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

mpcool

BeitragMo, Jul 23, 2007 9:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich schon alle durhc, irwie nichs geholfen

Eingeproggt

BeitragMo, Jul 23, 2007 10:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich schreib mal auf die Schnelle einen Code da rein. Sollte er dir nicht helfen, schreibst du deinen und wir können genauer darauf eingehen.
(Hab ich jetzt hier in die Textbox geschrieben und nicht getestet!!! Außerdem braucht man dazu ein Bild "ball.png" im selben Ordner wo dieser Code liegt.)

Code: [AUSKLAPPEN]
;Graphik-Modus. Sollte bekannt sein
Graphics 800,600
SetBuffer Backbuffer()
;Ball-Image laden. Sollte auch bekannt sein
ball=LoadImage("ball.png")
;Positionsvariablen (können einen beliebigen Wert haben, ohne Deklaration am Anfang ist der Wert immer 0)
ball_x=20
ball_y=300
;Geschwindigkeit
ball_v=5

Repeat
  Cls
  ;Zeichnen
  DrawImage ball,ball_x,ball_y
  ;Weiterbewegen
  ball_x=ball_x+ball_v
  ;Kollissionsabfrage (primitiv, ohne Schläger)
  If ball_x<0 Or ball_x>800 Then
    ball_v=ball_v*(-1) ;Geschwindigkeit (Bewegungsrichtung) umdrehen
  EndIf
  Flip
  Delay 10 ;Damit das Spiel nicht so abzischt
Until KeyHit(1) ;Beenden bei Druck von Esc
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

mpcool

BeitragMo, Jul 23, 2007 10:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, dass hat mir jetzt geholfen und einen ansatz gegeben wie ichs mache Very Happy
Thanks at all das ihr mir geholfen habt

Ach ja, hier noch der Code, falls jemand mal gucken will:

Code: [AUSKLAPPEN]
;titel, auflösung etc.
AppTitle "Easy Pong"
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

;font laden & setzen
   font = LoadFont("Acquaintance", 12, 1, False, False)
   SetFont font
;bilder laden und variablen bzw. konstanten festlegen
   ball = LoadImage("ball.bmp")
   ball_x = 280
   ball_y = 290
   pong_spieler = LoadImage("pong.bmp")
   pong_gegner = LoadImage("pong_gegner.bmp")
   spieler_rand = LoadImage("rand.bmp")
   gegner_rand = LoadImage("rand.bmp")
   x_pong_spieler_start = 10
   y_pong_spieler_start = 225
   x_pong_gegner_start = 560
   y_pong_gegner_start = 225
   Global hoch = 1
   Global runter = 2
   richtung = 0
   Global spielerpunkte = 0
   Global gegnerpunkte = 0
;timer erstellen
   timer = CreateTimer(60)
;maus verstecken
   HidePointer

;schleife
Repeat
WaitTimer(timer)
Cls
;hoch
   If KeyDown(200) = 1 Then
         richtung = 1
   Else
         richtung = 0
   EndIf
;runter
   If KeyDown(208) Then
         richtung = 2
   EndIf
;zeit abfragen
   If MilliSecs() - bewegung > 1 Then ;je weniger desto schneller
      bewegung = MilliSecs()
;bewegung ausführen
      y_pong_spieler_start = y_pong_spieler_start - (richtung=hoch) + (richtung=runter)
   EndIf
;pong & etc. malen
   DrawImage pong_spieler, x_pong_spieler_start, y_pong_spieler_start
   DrawImage pong_gegner, x_pong_gegner_start, y_pong_gegner_start
   DrawImage ball, ball_x, ball_y
   DrawImage spieler_rand , 0, 0
   DrawImage gegner_rand, 580, 0
;kollisionen ermitteln
   If ImagesOverlap(pong_spieler, x_pong_spieler_start, y_pong_spieler_start, ball, ball_x, ball_y) Then ball_x = +30
   If ImagesOverlap(pong_gegner, x_pong_gegner_start, y_pong_gegner_start, ball, ball_x, ball_y) Then ball_x = x_pong_gegner_start -30
   If ImagesOverlap(ball, ball_x, ball_y, gegner_rand, 580, 0) Then spielerpunkte = +10
   If ImagesOverlap(ball, ball_x, ball_y, spieler_rand, 0, 0) Then gegnerpunkte = +10
;rand malen
   Rect 590, 10, 200, 580, 0
;text ausgeben
   Text 600, 20, "Spielerpunkte:"
   Text 750, 20, spielerpunkte
   Text 600, 60, "Gegnerische Punkte:"
   Text 770, 60, gegnerpunkte
;falls spielfeld verlässt
   If y_pong_spieler_start < -125 Then y_pong_spieler_start = 599
   If y_pong_spieler_start > 599 Then y_pong_spieler_start = -125
   If y_pong_gegner_start < -125 Then y_pong_gegner_start = 599
   If y_pong_gegner_start > 599 Then y_pong_gegner_start = -125
steuerrung()
Flip
;spiel wird nach drücken der ESCAPE taste beendet
Until KeyHit(1)

;die steuerrung wird angezeigt nach drücken der enter taste
Function steuerrung()
   If KeyDown(28) Then
      Text 150, 100, "Steuerung: Pfeiltaste hoch, Pfeiltaste runter."
   EndIf
End Function

;ende ohne meldung
End

X-Calibur

BeitragMo, Jul 23, 2007 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst es Ihm nicht unbedingt einfacher mit deinem Code @eingeproggt. Sorry wenn ich das so sage aber der ist nicht gut.
Erstmal bring ihm nicht bei in einer hauptschleife delay zu benutzen. ganz übel. wenn man die frames begrenzen will dann mit millisecs(). Allerdings sollte flip1 für den anfang genügen.
Dann gehört es zur guten Praxis erst die Position ect. neu zu berechnen und dann die grafik auszugeben.

Und
ball_v=ball_v*(-1)

Mal ehrlich ball_v = - ball_v sähe nicht so kompliziert aus und bewirkt das Gleiche^^

sorry für OT, aber wenn man helfen will dann sollte man das richtig tun. So stiftet man lediglich Verwirrung.

Mfg Cali[/code]

Eingeproggt

BeitragMo, Jul 23, 2007 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das mitn Delay ist mir bewusst, aber ich war zu faul, in so ein Beispiel, wo es ja nur um einfache Pong-Ballbewegung geht, einen Framelimiter reinzuhauen.
Deine restlichen Kritikpunkte sind aber wirklich zu pingelig.

Und vergiss nicht:
gigi hat Folgendes geschrieben:
Wer lästert, hat nichts zu erzählen.

Rolling Eyes

EDIT @ BladeRunner: Genau deshalb, weil sie wenig bis gar keine Ahung haben, will ich sie nicht mit neuen, aufwendigen Routinen belasten. Echte Beginner (nicht auf mpcool bezogen!) sind doch mit einem ordentlichen, vorbildhaften Programm total überfordert und müssen frisch wieder von vorne fragen.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
  • Zuletzt bearbeitet von Eingeproggt am Mo, Jul 23, 2007 15:19, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragMo, Jul 23, 2007 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hier ist die Beginners Corner. Die Leute die hier fragen haben noch wenig bis keine Ahnung. Wen Du denen Stuß erzählst indem Du delay mit in die Hauptschleife reinpackst werden sie glauben dass sei richtig so. Und damit hast Du nicht geholfen, sondern ihnen im Gegenteil dazu weitere Steine in den Weg gelegt.
Wenn Du also helfen willst, dann richtig, und nimm Dir die nötige Zeit dafür. Willst Du das nicht, schreib lieber gar nichts.
Ab davon hat X-Calibur nicht gelästert sondern Dir eine konstruktive Kritik gegeben.
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group