Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Kleine Spielerei Kollision Ball Linie

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 561
Wohnort: Jüterbog

BeitragVerfasst am: 09.04.2014, 20:36    Titel: Kleine Spielerei Kollision Ball Linie Antworten mit Zitat

... ist aus einem kleinen Projekt an dem ich grad arbeite lächeln
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 561
Wohnort: Jüterbog

BeitragVerfasst am: 17.05.2014, 17:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 192
Wohnort: Frankreich

BeitragVerfasst am: 17.05.2014, 18:04    Titel: Antworten mit Zitat

Sehr schön. Daumen rauf!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 17.05.2014, 20:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Affemitwaffel



Anmeldungsdatum: 02.06.2011
Beiträge: 39

BeitragVerfasst am: 20.05.2014, 16:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 561
Wohnort: Jüterbog

BeitragVerfasst am: 26.05.2014, 17:20    Titel: Antworten mit Zitat

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... lächeln

Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 27.05.2014, 08:22    Titel: Antworten mit Zitat

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... zwinkern

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 561
Wohnort: Jüterbog

BeitragVerfasst am: 27.05.2014, 09:21    Titel: Antworten mit Zitat

Q... Q hilft in diesem Fall, sorry, hätt ich sagen sollen zwinkern

Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 27.05.2014, 14:53    Titel: Antworten mit Zitat

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. grinsen

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 grinsen ), 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 happy ).

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz