  | 
					
						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: 571 Wohnort: Jüterbog
  | 
		
			
				 Verfasst am: 09.04.2014, 20: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: 571 Wohnort: Jüterbog
  | 
		
			
				 Verfasst am: 17.05.2014, 17: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: 194 Wohnort: Frankreich
  | 
		
			
				 Verfasst am: 17.05.2014, 18:04    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Sehr schön.   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		grindstone
 
 
  Anmeldungsdatum: 03.10.2010 Beiträge: 1283 Wohnort: Ruhrpott
  | 
		
			
				 Verfasst am: 17.05.2014, 20: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, 16: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: 571 Wohnort: Jüterbog
  | 
		
			
				 Verfasst am: 26.05.2014, 17: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: 1283 Wohnort: Ruhrpott
  | 
		
			
				 Verfasst am: 27.05.2014, 08: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: 571 Wohnort: Jüterbog
  | 
		
			
				 Verfasst am: 27.05.2014, 09:21    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Q... Q hilft in diesem Fall, sorry, hätt ich sagen sollen   
 
 
Mutton | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		nemored
 
  
  Anmeldungsdatum: 22.02.2007 Beiträge: 4712 Wohnort: ~/
  | 
		
			
				 Verfasst am: 27.05.2014, 14: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.
  | 
   
 
     |