Halli Hallo,
Ich bin neu hier und auch mit Java noch Anfänger, allerdings mit der Hilfe von Büchern, youtube und google in den letzten Monaten gut alleine voran gekommen.
Nach diversen angefangenen Spielkonzepten habe ich nun mit der Grundlegenden Materie beschäftigt um den Kern der Sache stück für stück zu checken.
Ich arbeite mit einem Applet und habe ein 2D platformer im visier, alles läuft bisher gut voran, auch wenn der code langsam verschlungener wird. Ich habe bisher einen Gameloop, einen steuerbaren Spieler mit gekoppelter Grafik (Background) und meinen ersten Gegner.
Die Kollision ist noch ein Problem dazu später mehr, denn nachdem alles soweit lief wollte ich mich mit Timern beschäftigen und dieses Werkzeug im Gebrauch lernen.
Dazu habe ich mir überlegt (am besten Anhang runterladen und mitlesen, der code ist (glaube ich) sehr übersichtlich ,
ruer die faulen hier die Gegner classe:
[Java]
package maincode;
import java.awt.Rectangle;
import java.util.Timer;
import java.util.TimerTask;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////// GEGNER - KLASSE ////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class Gegner {
static int GegnerAnzahl = 0;
private int gegnerx;
private int gegnery;
private int hp;
public static int dmg = 10;
private int runningspeed = 1;
private int speedx = runningspeed;
public Rectangle rectG = new Rectangle(gegnerx - 16, gegnery - 16, 35, 35);
private boolean att = false;
public static Timer timer ;
private TimerTask attacking;
public Gegner(){
if (GegnerAnzahl<1){
//gegner soll ueber dem screen und vor dem spieler spawnen
gegnerx = Starting.getspielerX()+300;
gegnery = -20;
//gegner anzahl zaehlen
GegnerAnzahl++;
//timer initialisieren
attacking = new TimerTask() {
@Override
public void run() {
if(!att) {
} else {
System.out.println("Kollision");
Starting.setspielerhp(dmg);
Starting.clip.play();
}
}
};
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////// GEGNER - UPDATE POSITION ////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void update() {
//checkt ob spieler in der naehe und falls true -> att==true -> timer maccht dmg starte timer
if(gegnerx <= Starting.getspielerX() + 40 && gegnerx >= Starting.getspielerX() -40 && Starting.getspielerY() >= 384){
if(att==false){
att=true;
timer = new Timer();
timer.schedule(attacking, 10, 1000);
}
//erhalte dmg
att = true;
}else{
att = false;
}
//fallen lassen nach spawnen
if(gegnery + 2 >= 412){
gegnery = 412;
}else {
gegnery += 5;
}
//spieler folgen
if(gegnerx -32 > Starting.getspielerX()){
speedx = runningspeed;
gegnerx -= speedx;
}else if(gegnerx +32 < Starting.getspielerX()){
speedx = runningspeed;
gegnerx += speedx;
}else if (gegnerx +32 == Starting.getspielerX()){
speedx=0;
}else if (gegnerx -32 == Starting.getspielerX()){
speedx=0;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////// GETTER - SETTER - METHODEN ////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static int getGegnerAnzahl() {
return GegnerAnzahl;
}
public int getGegnerx() {
return gegnerx;
}
public int getGegnery() {
return gegnery;
}
public int getHp() {
return hp;
}
public int getDmg() {
return dmg;
}
public int getSpeedx() {
return speedx;
}
public Rectangle getRectG() {
return rectG;
}
public static void setGegnerAnzahl(int gegnerAnzahl) {
GegnerAnzahl = gegnerAnzahl;
}
public void setGegnerx(int gegnerx) {
this.gegnerx = gegnerx;
}
public void setGegnery(int gegnery) {
this.gegnery = gegnery;
}
public void setHp(int hp) {
this.hp = hp;
}
public void setSpeedx(int speedx) {
this.speedx = speedx;
}
}
[/Java]
Der Gegner der spawnt und auf den Spieler läuft soll sobald er neben bzw im spieler steht dem spieler 10 hp abziehen, im Takt von 1ner Sekunde.
->kollision:
zuerst habe ich um den Spieler und den Gegner 1 Rechteck gezeichnet. diese dann in einer Methode rect.intersects(rect) geprüft, allerdings hat er mir dann ausgegeben (Konsole) kollison!. allerdings hat er timer.schedule nicht gemacht. bzw auf nichts anderes reagiert Oo
also habe ich zunächst die Kollision mit Koordinaten Überprüfung abgefragt und dann
den timer gestartet. das laeuft! nun zum problem:
die Timertask attacking initialisiere ich im constructor des Gegners. ich habe zuerst den timer auch
im konstructor mit (=new Timer) erzeugt und mit timer.schedule gestartet.
dann in der Kollisionsabfrage den wert von der run() Bedingung geändert dass er dmg macht.
das problem hier ist das es ungenau ist, denn der timer läuft bereist am Anfang wenn der Gegner spawnt. renne ich nun in den Gegner dann kann es sein dass vor 0,1 sec (letzte startinterval) der letzte durchlauf war und ich 0,9sec +0,1sec (wiederholungsinterval)+(startinterval) , also 1 sec warten muss bevor die dmg anfängt.
daraufhin habe ich den timer in der kollsions abfrage Methode erzeugt und die Bedingung true
gesetzt. die kolliosonsabfrage ist in der update Methode und wird ständig aufgerufen.
lauf ich nun in den Gegner fängt der timer direkt an, lauf ich raus hört er auf.........
ABER lauf ich wieder rein fanget er auf und das applet hängt.
Ich habe euch anbei den gesamten Ordner beigefügt (entschuldigt die schlechte Grafiken)
damit ihr es ausprobieren könnt.
ich brauche eine Lösung den timer zu canceln oder löschen (habe gestern stunden nachgelesen und gegooglet aber werde schlau daraus wie dieser timer thread läuft bzw wann er gelöscht ist wann man keinen neuen starten kann bzw wann man das muss um ihn neuzustarten) wenn der spieler
aus dem Gegner läuft und einen neuen zu Starten wenn er reinläuft.
Liebe Grüsse
Ich bin neu hier und auch mit Java noch Anfänger, allerdings mit der Hilfe von Büchern, youtube und google in den letzten Monaten gut alleine voran gekommen.
Nach diversen angefangenen Spielkonzepten habe ich nun mit der Grundlegenden Materie beschäftigt um den Kern der Sache stück für stück zu checken.
Ich arbeite mit einem Applet und habe ein 2D platformer im visier, alles läuft bisher gut voran, auch wenn der code langsam verschlungener wird. Ich habe bisher einen Gameloop, einen steuerbaren Spieler mit gekoppelter Grafik (Background) und meinen ersten Gegner.
Die Kollision ist noch ein Problem dazu später mehr, denn nachdem alles soweit lief wollte ich mich mit Timern beschäftigen und dieses Werkzeug im Gebrauch lernen.
Dazu habe ich mir überlegt (am besten Anhang runterladen und mitlesen, der code ist (glaube ich) sehr übersichtlich ,
ruer die faulen hier die Gegner classe:
[Java]
package maincode;
import java.awt.Rectangle;
import java.util.Timer;
import java.util.TimerTask;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////// GEGNER - KLASSE ////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class Gegner {
static int GegnerAnzahl = 0;
private int gegnerx;
private int gegnery;
private int hp;
public static int dmg = 10;
private int runningspeed = 1;
private int speedx = runningspeed;
public Rectangle rectG = new Rectangle(gegnerx - 16, gegnery - 16, 35, 35);
private boolean att = false;
public static Timer timer ;
private TimerTask attacking;
public Gegner(){
if (GegnerAnzahl<1){
//gegner soll ueber dem screen und vor dem spieler spawnen
gegnerx = Starting.getspielerX()+300;
gegnery = -20;
//gegner anzahl zaehlen
GegnerAnzahl++;
//timer initialisieren
attacking = new TimerTask() {
@Override
public void run() {
if(!att) {
} else {
System.out.println("Kollision");
Starting.setspielerhp(dmg);
Starting.clip.play();
}
}
};
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////// GEGNER - UPDATE POSITION ////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void update() {
//checkt ob spieler in der naehe und falls true -> att==true -> timer maccht dmg starte timer
if(gegnerx <= Starting.getspielerX() + 40 && gegnerx >= Starting.getspielerX() -40 && Starting.getspielerY() >= 384){
if(att==false){
att=true;
timer = new Timer();
timer.schedule(attacking, 10, 1000);
}
//erhalte dmg
att = true;
}else{
att = false;
}
//fallen lassen nach spawnen
if(gegnery + 2 >= 412){
gegnery = 412;
}else {
gegnery += 5;
}
//spieler folgen
if(gegnerx -32 > Starting.getspielerX()){
speedx = runningspeed;
gegnerx -= speedx;
}else if(gegnerx +32 < Starting.getspielerX()){
speedx = runningspeed;
gegnerx += speedx;
}else if (gegnerx +32 == Starting.getspielerX()){
speedx=0;
}else if (gegnerx -32 == Starting.getspielerX()){
speedx=0;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////// GETTER - SETTER - METHODEN ////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static int getGegnerAnzahl() {
return GegnerAnzahl;
}
public int getGegnerx() {
return gegnerx;
}
public int getGegnery() {
return gegnery;
}
public int getHp() {
return hp;
}
public int getDmg() {
return dmg;
}
public int getSpeedx() {
return speedx;
}
public Rectangle getRectG() {
return rectG;
}
public static void setGegnerAnzahl(int gegnerAnzahl) {
GegnerAnzahl = gegnerAnzahl;
}
public void setGegnerx(int gegnerx) {
this.gegnerx = gegnerx;
}
public void setGegnery(int gegnery) {
this.gegnery = gegnery;
}
public void setHp(int hp) {
this.hp = hp;
}
public void setSpeedx(int speedx) {
this.speedx = speedx;
}
}
[/Java]
Der Gegner der spawnt und auf den Spieler läuft soll sobald er neben bzw im spieler steht dem spieler 10 hp abziehen, im Takt von 1ner Sekunde.
->kollision:
zuerst habe ich um den Spieler und den Gegner 1 Rechteck gezeichnet. diese dann in einer Methode rect.intersects(rect) geprüft, allerdings hat er mir dann ausgegeben (Konsole) kollison!. allerdings hat er timer.schedule nicht gemacht. bzw auf nichts anderes reagiert Oo
also habe ich zunächst die Kollision mit Koordinaten Überprüfung abgefragt und dann
den timer gestartet. das laeuft! nun zum problem:
die Timertask attacking initialisiere ich im constructor des Gegners. ich habe zuerst den timer auch
im konstructor mit (=new Timer) erzeugt und mit timer.schedule gestartet.
dann in der Kollisionsabfrage den wert von der run() Bedingung geändert dass er dmg macht.
das problem hier ist das es ungenau ist, denn der timer läuft bereist am Anfang wenn der Gegner spawnt. renne ich nun in den Gegner dann kann es sein dass vor 0,1 sec (letzte startinterval) der letzte durchlauf war und ich 0,9sec +0,1sec (wiederholungsinterval)+(startinterval) , also 1 sec warten muss bevor die dmg anfängt.
daraufhin habe ich den timer in der kollsions abfrage Methode erzeugt und die Bedingung true
gesetzt. die kolliosonsabfrage ist in der update Methode und wird ständig aufgerufen.
lauf ich nun in den Gegner fängt der timer direkt an, lauf ich raus hört er auf.........
ABER lauf ich wieder rein fanget er auf und das applet hängt.
Ich habe euch anbei den gesamten Ordner beigefügt (entschuldigt die schlechte Grafiken)
damit ihr es ausprobieren könnt.
ich brauche eine Lösung den timer zu canceln oder löschen (habe gestern stunden nachgelesen und gegooglet aber werde schlau daraus wie dieser timer thread läuft bzw wann er gelöscht ist wann man keinen neuen starten kann bzw wann man das muss um ihn neuzustarten) wenn der spieler
aus dem Gegner läuft und einen neuen zu Starten wenn er reinläuft.
Liebe Grüsse
Anhänge
Zuletzt bearbeitet: