BMP Per Taste Verschieben???

08/06/2010 13:59 | Moep |#16
Quote:
Originally Posted by Shadow992 View Post
Er kriegt es nicht mal mit einer GUI hin und du kommst mit GDI+ ?
Schöner wäre es, da hast du recht, aber da wird er sich wohl vorerst die Zähne dran ausbeisen. ;)
Wieso? Ist doch alles logisch aufgebaut bei GDI+ ;)


Quote:
Originally Posted by WiiZocker View Post
...Wie schaffe ich es das der Ball von dem Spieler Apprallt?...
Nunja, du müsstes nur die Position des Balles mit der Position der Schlägers vergleichen, Beispiel Pseudocode:

if abs($posBall - $posSchläger) = 0 then abprallen()

Um nun einen realistisches Abprallen zu berechnen, musst du den Einfallswinkel des Balles erfassen. Es gilt dabei Einfallswinkel = Ausfallswinkel.
Tja dann kannst du noch das andrehen des Balles mit einbeziehen, also wenn du den Schläger im Moment des Aufpralles bewegst... aber ich glaub das würde hier jetzt zuweit führen ;)

Im Grunde alles nur eine Spielerei mit Mathematischen Grundkentnissen...
08/06/2010 16:00 Shadow992#17
Quote:
Originally Posted by WiiZocker View Post
Ok, es ist schomn gelöst, also das ursprüngliche, aber da ich nicht noch nen Thread posten will, frag ich hier nochmal^^



Hier mal Zittiert was auf der 1sten Seite geschrieben steht.
Das ist einen ganz simple Collisionsfunktion:
PHP Code:
Func Collision($x1,$y1,$width1,$high1,$x2,$y2,$width2,$high2)
    
$hpos1=$y1+$high1
    $wpos1
=$x1+$width1
    $hpos2
=$y2+$high2
    $wpos2
=$x2+$width2
    
if (($hpos1>=$y2 and $y1<$y2) or ($hpos2>=$y1 and $y1>$y2)) Then
        
if (($wpos1>=$x2 and $x1<$x2) or ($wpos2>=$x1 and $x1>$x2)) then
            
return true
        
else
            return 
false
        
endif
    else
        return 
false
    
endif
EndFunc 
Und so kannst du sie verwenden:
PHP Code:
;Neues Fenster öffnet sich:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

HotKeySet("{Left}","SpielerNachLinks")
HotKeySet("{Right}","SpielerNachRechts")

#region Constants
Diese Werte kann man aus dem Bild direkt auslesen
Sagen wir also dein Bild Ball.bmp ist 22 Pixel hoch und 30 breit
Dann musst du auch dementsprechend das machen:
$Width_Ball=30
$High_Ball=22
Const $Width_Spieler=164
Const $Width_Ball=32
Const $Width_Gegner=64

Const $High_Spieler=128
Const $High_Ball=32
Const $High_Gegner=128
#endregion Constants

$X_BallPos 206
$Y_BallPos 
308
$X_Spieler 
160
$Y_Spieler 
592
$X_Gegner 
160
$Y_Gegner 
16

#Region ### START Koda GUI section ### Form=C:\Users\Jan\Desktop\Pong\Daten\Spielfeld GUI.kxf
$PongGui GUICreate("Pong By WiiZocker"436638257164)
$Ball GUICtrlCreatePic("Daten\Ball.bmp"$X_BallPos$Y_BallPos2222BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
$Spieler GUICtrlCreatePic("Daten\Spieler.bmp"$X_Spieler$Y_Spieler12123BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
$Gegner GUICtrlCreatePic("Daten\Gegner.bmp"$X_Gegner$Y_Gegner12123BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
$Spielfeld GUICtrlCreatePic("Daten\Spielfeld.bmp"00435637BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg 
GUIGetMsg()
Switch 
$nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
    if(
Collision($X_BallPos,$Y_BallPos,$Width_Ball,$High_Ball,$X_Spieler,$Y_Spieler,$Width_Spieler,$High_Spieler)) Then
        MsgBox
(0,,"Ball berührt","Ball hat Spieler berührt.")
    EndIf
    if(
Collision($X_BallPos,$Y_BallPos,$Width_Ball,$High_Ball,$X_Gegner,$Y_Gegner,$Width_Gegner,$High_Gegner)) Then
        MsgBox
(0,,"Ball berührt","Ball hat Gegner berührt.")
    EndIf
WEnd

Func SpielerNachLinks
()
$X_Spieler $X_Spieler 7
Aktuell
()
EndFunc

Func SpielerNachRechts
()
$X_Spieler $X_Spieler 7
Aktuell
()
EndFunc

Func Aktuell
()
GUICtrlSetPos($Ball,$X_BallPos,$Y_BallPos)
GUICtrlSetPos($Spieler,$X_Spieler,$Y_Spieler)
GUICtrlSetPos($Gegner,$X_Gegner,$Y_Gegner)
EndFunc


Func Collision
($x1,$y1,$width1,$high1,$x2,$y2,$width2,$high2)
    
$hpos1=$y1+$high1
    $wpos1
=$x1+$width1
    $hpos2
=$y2+$high2
    $wpos2
=$x2+$width2
    
if (($hpos1>=$y2 and $y1<$y2) or ($hpos2>=$y1 and $y1>$y2)) Then
        
if (($wpos1>=$x2 and $x1<$x2) or ($wpos2>=$x1 and $x1>$x2)) then
            
return true
        
else
            return 
false
        
endif
    else
        return 
false
    
endif

EndFunc 
P.S.
Welches Objekt bei der Collisions-Abfrage zuerst kommt ist egal, du kannst also zuerst die Werte vom Ball eintragen und dann die Werte vom Spieler oder andersrum, das spielt keine Rolle.
08/06/2010 21:18 WiiZocker#18
Danke, aber er erkennt nicht wenn der Spieler berührt wird )=
Beim gegner kommt die MSG
08/06/2010 21:28 | Moep |#19
Willst du was lernen oder nen fertiges Script haben?...
08/06/2010 22:43 WiiZocker#20
Ich habe ja dran rumprobiert aber entweder fliegt der ball durchs feld oder bleibt im spieler stecken.

Wollte auch nur wissen ob Shadow vllt nen fehler gemacht hat im skript.Ich erkenne da zwar keinen aber...Wer weiß :D

Und bis das game fertig ist wird noch zeit vergehen. ;D
08/06/2010 22:51 Shadow992#21
Quote:
Originally Posted by WiiZocker View Post
Ich habe ja dran rumprobiert aber entweder fliegt der ball durchs feld oder bleibt im spieler stecken.

Wollte auch nur wissen ob Shadow vllt nen fehler gemacht hat im skript.Ich erkenne da zwar keinen aber...Wer weiß :D

Und bis das game fertig ist wird noch zeit vergehen. ;D
Wenn du die Bilder mal mit hochlädst schau ich es mir genauer an.
Ein Fehler bei meiner Funktion gibts sicherlich nicht, aber vielleicht hast du was falsch gemacht. ;)
Wie gesagt komplettes Skript+Bilder.

@| Moep |
Solange es so dumme gibt wie mich, wird er es nicht alleine machen wollen. ;)
08/07/2010 00:02 WiiZocker#22
Ok, habe meinen Kompletten Pong ordner geuppt.(832 KB groß, Gepackt ca. 311 KB groß)
Damit alles beisammen ist :D
08/07/2010 01:17 | Moep |#23
Quote:
Originally Posted by Shadow992 View Post
@| Moep |
Solange es so dumme gibt wie mich, wird er es nicht alleine machen wollen. ;)
Ich weiß warum du dass machst.. ertapp mich ja selbst manchmal dabei es zu tun... ;)
08/07/2010 01:22 WiiZocker#24
Ich habe gefragt, ihr habt geantwortet.Ist daran irgendwas falsch? ich lerne ja trotzdem dabei und das ist nicht das einziege woran ich arbeite ;D
08/07/2010 10:09 Shadow992#25
Quote:
Originally Posted by WiiZocker View Post
Ich habe gefragt, ihr habt geantwortet.Ist daran irgendwas falsch? ich lerne ja trotzdem dabei und das ist nicht das einziege woran ich arbeite ;D
So, so funktioniert es.
Wo genau der Fehler lag weiß ich nicht, da ich echt jedemenge rausgeschmissen/verändert habe. :D

PHP Code:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

HotKeySet("{F1}","Start")
HotKeySet("{F5}","Neustart")
HotKeySet("{esc}","ENDE")

HotKeySet("{Left}","SpielerNachLinks")
HotKeySet("{Right}","SpielerNachRechts")


#region Constants
Diese Werte kann man aus dem Bild direkt auslesen
Sagen wir also dein Bild Ball.bmp ist 22 Pixel hoch und 30 breit
Dann musst du auch dementsprechend das machen:
$Width_Ball=30
$High_Ball=22
Const $Width_Spieler=121
Const $Width_Ball=22
Const $Width_Gegner=121

Const $High_Spieler=23
Const $High_Ball=22
Const $High_Gegner=23
#endregion Constants

$down=1

$Verloren 
600

$Width 
436
$Height 
638

$X_Ball 
206
$Y_Ball 
308

$X_Spieler 
160
$Y_Spieler 
592

$X_Gegner 
160
$Y_Gegner 
16

$X_SF 
0
$Y_SF 
0



#Region ### START Koda GUI section ### Form=C:\Users\Jan\Desktop\Pong\Daten\Spielfeld GUI.kxf
$PongGui GUICreate("Pong By WiiZocker"$Width$Height257164)


$Ball GUICtrlCreatePic("Daten\Ball.bmp"$X_Ball$Y_Ball2222BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS,$GUI_ONTOP))
$Spieler GUICtrlCreatePic("Daten\Spieler.bmp"$X_Spieler$Y_Spieler12123BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS,$GUI_ONTOP))
$Gegner GUICtrlCreatePic("Daten\Gegner.bmp"$X_Gegner$Y_Gegner12123BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS,$GUI_ONTOP))
$Spielfeld GUICtrlCreatePic("Daten\Spielfeld.bmp"$X_SF$Y_SF435637BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS,$GUI_DISABLE))

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
    EndSwitch
    
Start()
    
sleep(20)
WEnd

Func SpielerNachLinks
()
    If 
$X_Spieler 15 Then
        $X_Spieler 
$X_Spieler 7
        GUICtrlSetPos
($Spieler,$X_Spieler,$Y_Spieler)
    EndIf
EndFunc


Func SpielerNachRechts
()
    If 
$X_Spieler 295 Then
        $X_Spieler 
$X_Spieler 7
        GUICtrlSetPos
($Spieler,$X_Spieler,$Y_Spieler)
    EndIf
EndFunc


Func BallBewegen
()
    if 
$down=1 Then
        $Y_Ball 
$Y_Ball 8
    
else
        
$Y_Ball $Y_Ball 8
    
EndIf
    If  
$Y_Ball >= $Verloren Then
        MsgBox
(0,"Verloren","Du hast Verloren")
        Exit
    EndIf
    
GUICtrlSetPos($Ball,$X_Ball,$Y_Ball)
EndFunc


Func Collision
($x1,$y1,$width1,$high1,$x2,$y2,$width2,$high2)
    
$hpos1=$y1+$high1
    $wpos1
=$x1+$width1
    $hpos2
=$y2+$high2
    $wpos2
=$x2+$width2
    
if (($hpos1>=$y2 and $y1<$y2) or ($hpos2>=$y1 and $y1>$y2)) Then
        
if (($wpos1>=$x2 and $x1<$x2) or ($wpos2>=$x1 and $x1>$x2)) then
            
return true
        
else
            return 
false
        
endif
    else
        return 
false
    
endif

EndFunc


Func Start
()
    if 
Collision($X_Spieler,$Y_Spieler,$Width_Spieler,$High_Spieler,$X_Ball,$Y_Ball,$Width_Ball,$High_Ball)==true Then
        $down
=0
    
EndIf
    if 
Collision($X_Ball,$Y_Ball,$Width_Ball,$High_Ball,$X_Gegner,$Y_Gegner,$Width_Gegner,$High_Gegner)==true Then
        $down
=1
    
EndIf
    
BallBewegen()
EndFunc


Func Neustart
()
$X_Ball 206
$Y_Ball 
308

$X_Spieler 
160
$Y_Spieler 
592

$X_Gegner 
160
$Y_Gegner 
16

$X_SF 
0
$Y_SF 
0
EndFunc


Func ENDE
()
    Exit
EndFunc

Func Aktuell
()
GUICtrlSetPos($Gegner,$X_Gegner,$Y_Gegner)
EndFunc 
08/07/2010 12:37 HardCore.1337#26
Kleiner Tipp noch von mir.
Bau in deinen Script noch ein paar Winkelberechnungen ein, so das der Ball auch mal seinen Kurs ändert. (Sin und Cos werden dir helfen)
08/07/2010 15:32 WiiZocker#27
Danke Shadow, ohne dich wäre ich wohl aufgeschmissen...



Quote:
Kleiner Tipp noch von mir.
Bau in deinen Script noch ein paar Winkelberechnungen ein, so das der Ball auch mal seinen Kurs ändert. (Sin und Cos werden dir helfen)
Das hatte ich auch vor ;D nur wie genau funktioniert Sin und Cos, hab dazu nichts nützliches gefunden.Weder in Google noch hier.

Von der Autoit hilfe fühl ich mich auch ned gerade geholfen.
08/07/2010 22:28 WiiZocker#28
Push.
Sorry aber musste ich pushen, finde echt kein tut dazu und hatten sinus und cosinus noch nicht in der schule. 9 schuljahr fängt gerade an.
08/07/2010 22:34 Shadow992#29
Quote:
Originally Posted by WiiZocker View Post
Push.
Sorry aber musste ich pushen, finde echt kein tut dazu und hatten sinus und cosinus noch nicht in der schule. 9 schuljahr fängt gerade an.
Eigentlich sind wir ja kein Hausaufgabenforum, aber das zählt ja nicht dazu, also:
Sehr schöne Seite:
[Only registered and activated users can see links. Click Here To Register...]
Seite bei der du deine Ergebnisse "überprüfen" lassen kannst:
[Only registered and activated users can see links. Click Here To Register...]
08/07/2010 22:45 WiiZocker#30
Ich werds mir sofort anschauen danke dir ;D