|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 09.04.2014, 21:36 Titel: Kleine Spielerei Kollision Ball Linie |
|
|
... ist aus einem kleinen Projekt an dem ich grad arbeite
Code: | screen 19,32
dim as integer screenwidth,screenheight
screeninfo screenwidth,screenheight
dim shared as integer Xo,Yo
Xo=screenwidth/2
Yo=screenheight/2
const as single pi =atn (1) * 4
const as single doublepi=pi*2
const as single halfpi=pi/2
'******************************************************************************
type vector
x as single
y as single
end type
'******************************************************************************
'Hilfsfunktionen
'eigener wiederverwendeter Code aus Einparksimulator
'bringt ein Bogenmaß in den Bereich von 0 bis 2PI
'! BYREF es wir die übergebene Variable verändert
sub RadCorrected (byref Rad as single)
if Rad>=doublepi then Rad=Rad-doublepi
if Rad<0 then Rad=doublepi+Rad
end sub
'liefert Entfernung 2er Ortsvektoren nach Pythagoras
Function GetDistance(origin as vector, dest as vector) As Single
dim as single dx,dy
dx=dest.x - origin.x
dy=dest.y - origin.y
function=sqr(dx*dx + dy*dy)
End Function
'liefert Qadrat der Entfernung 2er Ortsvektoren nach Pythagoras, erspart SQR
Function GetDistanceP2(origin as vector, dest as vector) As Single
dim as single dx,dy
dx=dest.x - origin.x
dy=dest.y - origin.y
function=dx*dx + dy*dy
End Function
'Richtung(als Bogenmaß) des Punktes dest vom Standpunkt origin aus betrachtet
function GetRad overload(origin as vector,dest as vector) as single
dim as single Rad
dim as vector d
d.x= dest.x - origin.x
d.y= dest.y - origin.y
Rad=atan2(d.y,d.x)
if sgn(Rad)=-1 then Rad= doublepi + Rad
function=Rad
end function
'wandelt einen Richtungsvektor zu Bogenmaß
function GetRad (v as vector) as single
dim as single Rad=atan2(v.y,v.x)
if sgn(Rad)=-1 then Rad= doublepi + Rad
function=Rad
end function
'wandelt Bogenmaß zu Richtungsvektor
'distance stellt ein Skalar dar, der optional benutzt werden kann
function GetVector(Rad as single,distance as single=1) as vector
dim as vector v
RadCorrected(Rad)
v.x=cos(Rad)*distance
v.y=sin(Rad)*distance
function=v
end function
function IsLeft(linestart as vector, lineend as vector, cpoint as vector) as integer
function=0
if ((linestart.x - cpoint.x) * (lineend.y - cpoint.y) - _
(linestart.y - cpoint.y) * (lineend.x - cpoint.x))>0 then function=1
end function
'******************************************************************************
'******************************************************************************
'******************************************************************************
dim as integer mx,my, collision
dim as single llen, radius, radiusP2, ds, de
dim as vector lstart, lend, ldir, bcenter, bleft, bright
lstart.x=80
lstart.y=-30
lend.x=-50
lend.y=200
llen=GetDistance(lstart, lend)'Länge Linie
ldir=GetVector(GetRad(lstart, lend))'Richtung Linie
bcenter.x =0
bcenter.y =0
radius=20
radiusP2=Radius*Radius
do
sleep 1
'Setze BallPosition
getmouse(mx,my)
bcenter.x =mx -Xo
bcenter.y =Yo - my
'Kollision
dim as integer collision=0
dim as single ds, de
bleft.x =bcenter.x - ldir.y * radius
bleft.y =bcenter.y + ldir.x * radius
bright.x =bcenter.x + ldir.y * radius
bright.y =bcenter.y - ldir.x * radius
ds=GetDistanceP2(bcenter,lstart)
de=GetDistanceP2(bcenter,lend)
'Kollision Linie <-> Ball
collision=0
if (IsLeft(bleft,bright,lstart)=0) and (IsLeft(bleft,bright,lend)=1) then
if (IsLeft(lstart, lend,bleft)=1) and (IsLeft(lstart, lend,bright)=0) then collision=1
elseif collision=0 then
if (ds<radiusP2) or (de<radiusP2) then collision=1
end if
screenlock
cls
locate(1,1)
print collision
'Koordinatenursprung
line(Xo-10,Yo)-(Xo+10,Yo),&H00FF00
line(Xo,Yo-10)-(Xo,Yo+10),&HFF0000
'Linie
line(Xo+lStart.x,Yo-lStart.y)-(Xo+lend.x,Yo-lend.y),&HFFFFFF
'Ball
circle(Xo+bcenter.x,Yo-bcenter.y),radius
screenunlock
loop until inkey<>"" |
Mutton |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 17.05.2014, 18:43 Titel: |
|
|
Spielerei die Zweite:
hier geht es nur mal um einen kleinen Machbarkeitstest...
Über kurz oder lang rutscht dieses Programm mit seinen fps unter die Bildwiederholrate (60 Hertz)... zumindest bei mir!
etwas Luft ist ja noch (vier magere Frames per Standbild)
mein alterschwacher Büro Hengst:
Mainboard : FUJITSU SIEMENS MS-7293VP
Chipsatz : VIA P4M890
Prozessor : Intel Pentium XE 915 @ 2800 MHz (es sind 2 Kerne, mitunter zweifle ich auch daran)
Physikalischer Speicher : 2048 MB (2 x 1024 DDR2-SDRAM )
Grafikkarte : NVIDIA GeForce 9400 GT
mich hätte nur mal interessiert, ob anderswo mehr Reserven zur Verfügung stehen, genauer wieviel...
http://www.muttonhead.homepage.t-online.de/data/Lab6.zip
nur zur info: später soll alles zeitbasierend gesteuert werden, hier will ich erstmal nur alles (eigentlich es ist noch nicht mal alles) in einen Frames hineinpacken, um zu sehen wohin das ganze geht
Mutton |
|
Nach oben |
|
|
Roland Chastain
Anmeldungsdatum: 05.12.2011 Beiträge: 192 Wohnort: Frankreich
|
Verfasst am: 17.05.2014, 19:04 Titel: |
|
|
Sehr schön. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 17.05.2014, 21:57 Titel: |
|
|
Hallo Muttonhead!
Mein Rechenknecht ist wohl einigermaßen mit deinem vergleichbar:
Mainboard : FUJITSU SIEMENS GA-8 ISXT -FS
Chipsatz : 865 PE
Prozessor : Intel Pentium 4 @ 2600 MHz (1 Kern, aber Hyperthreading)
Physikalischer Speicher : 2048 MB (2 x 1024 DDR2-SDRAM )
Grafikkarte : NVIDIA GeForce MX 440
Bei mir läuft das Programm ohne Probleme (konstant 64 - 65 Fps), CPU - Belastung laut "Process Hacker": <1%
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Affemitwaffel
Anmeldungsdatum: 02.06.2011 Beiträge: 39
|
Verfasst am: 20.05.2014, 17:56 Titel: |
|
|
Hi,
Mit meinem PC läuft das Programm konstant bei 750-770 fps
Prozessor: AMD FX 8350 (8x4ghz)
RAM: 8 GB DDR-3 (1866Mhz)
Grafikkarte: NVIDIA GeForce 9800gtx+ |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 26.05.2014, 18:20 Titel: |
|
|
Vielen Dank an alle fürs testen, eine weiter entwickelte Spielerei folgt darum
jetzt:
http://www.muttonhead.homepage.t-online.de/data/Lab6.01.zip
was es vielleicht mal werden soll:
Ein simples Labyrinth-Spiel,
*irgendwo ist nen Ziel,das man erreichen muß (ahhhja, schön das es ein Ziel gibt).
*man darf nicht die Wände berühren, wird mit nem Leben bestraft.
*Wände die nurt mit passenden Schlüssel aufgehen.
*Zeitlimit usw.
Ist nur ne Idee, wenn ich versuch ne Gerade abzufahren ohne zu kollidieren bin ich schon nach 10 Sekunden angenervt von der Idee...
Mutton |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 27.05.2014, 09:22 Titel: |
|
|
Hallo Muttonhead!
Tolle Idee, da läßt sich was draus machen!
Wenn man das Programm jetzt noch beenden kann, ohne es in Taskmanager abzuschießen...
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 27.05.2014, 10:21 Titel: |
|
|
Q... Q hilft in diesem Fall, sorry, hätt ich sagen sollen
Mutton |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 27.05.2014, 15:53 Titel: |
|
|
Zitat: | *man darf nicht die Wände berühren, wird mit nem Leben bestraft. |
Irgendwie klingt das nach einem radikal-buddhistischen "Erreiche-das-Nirwana"-Spiel.
Ich würde da auf jeden Fall SETMOUSE in Betracht bzw. nicht die Mausposition, sondern die Mausbewegung in Betracht ziehen. Wenn es für das Berühren der Wände als Strafe immer sofort ein Leben gibt (sorry ), ist das vermutlich schnell frustrierend; aber du könntest ja mit einem "Energiebalken" arbeiten, der beim Berühren reduziert wird und sich ggf. auch wieder langsam regeneriert. Je höher der Schwierigkeitsgrad, desto schneller der Abzug und desto langsamer die Regeneration (damit auch so ungeschickte Leute wie ich damit umgehen können ).
Die Idee, eine Kugel mit der Maus zu steuern, gibt es ja schon spätestens seit OXYD, und mir hat diese Idee schon immer gut gefallen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|