Bild bewegen
Übersicht

mpcoolBetreff: Bild bewegen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie kann ich zum beispiel einen Ball über den Bildschirm rollen lassen, verstehe das nicht ![]() |
||
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
[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 ![]() |
||
mpcool |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, danke, aber das prob ist ja das ich das ganze in 2D mache, und da nicht weiß wie ich sie bewegen soll ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hab ich schon alle durhc, irwie nichs geholfen | ||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke, dass hat mir jetzt geholfen und einen ansatz gegeben wie ichs mache ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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.
![]() 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
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group