개인적인 공부/Unity
C# Input.GetAxis()
karatejin
2023. 1. 10. 21:48
들어가기전
Input System: converting the player's physcial action(eg. button press, keypress) into Info for the game.
old system 과 new system 이 있단다 그런가보다
Old System
Axes 는 Axis 의 복수형이란다. 도끼의 복수형인줄 알았다.
Horizontal 과 Vertical 은 두개가 있는데 다른 하나는 조이스틱용이다. 난 건들지 않는다.
안좋은점 한가지 : 명칭을 정확하게 알아야 한다. 범위 값이 - 1부터 +1 까지 즉 (-1, 0 , +1) 3가지인가 보다.
void Update() //프레임마다 호출된다.
{
float steerAmount = Input.GetAxis("Horizontal");
transform.Rotate(0,0,steerAmount);
transform.Translate(0,moveSpeed,0);
}
}
코드를 추가 한다. * 철자가 틀리면 작동이 안된다.
하지만 우리가 원하는 방향과 반대로 움직인다.
void Update() //프레임마다 호출된다.
{
float steerAmount = Input.GetAxis("Horizontal") * steerSpeed;
transform.Rotate(0,0,-steerAmount);
transform.Translate(0,moveSpeed,0);
}
}
void Update() //프레임마다 호출된다.
{
float steerAmount = Input.GetAxis("Horizontal") * steerSpeed;
float moveAmount = Input.GetAxis("Vertical") * moveSpeed;
transform.Rotate(0,0,-steerAmount);
transform.Translate(0,moveAmount,0);
}
Vertical 을 따로 - 안줘도 바른 방향으로 간다.
p.s. 1
New System을 안가르쳐 주네 이 洋兄이
p.s. 2
내가 배움이 일천하여 Java 로 만든 엔진이 있는줄 모르겠다. 그래서 자바는 노가다 중에 노가다다.
KeyHandler 를 가져와서 다 세팅 해줘야 한다.
package main;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyHandler implements KeyListener {
public boolean upPressed, downPressed, leftPressed, rightPressed;
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_W){
upPressed = true;
}
if (code == KeyEvent.VK_S){
downPressed = true;
}
if (code == KeyEvent.VK_A){
leftPressed = true;
}
if (code == KeyEvent.VK_D){
rightPressed = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_W){
upPressed = false;
}
if (code == KeyEvent.VK_S){
downPressed = false;
}
if (code == KeyEvent.VK_A){
leftPressed = false;
}
if (code == KeyEvent.VK_D){
rightPressed = false;
}
}
}
Key Setting 이 끝났으면 player에게도 적용을 해줘야한다.
package entity;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import main.GamePanel;
import main.KeyHandler;
public class Player extends Entity {
GamePanel gp;
KeyHandler keyH;
public final int screenX;
public final int screenY;
public Player(GamePanel gp, KeyHandler keyH) {
this.gp = gp;
this.keyH = keyH;
screenX = gp.screenWidth / 2 - (gp.tileSize / 2);
screenY = gp.screenHeight / 2 - (gp.tileSize / 2);
solidArea = new Rectangle();
solidArea.x = 8;
solidArea.y = 16;
solidAreaDefaultX = solidArea.x;
solidAreaDefaultY = solidArea.y;
solidArea.width = 32;
solidArea.height = 32;
setDefaultValues();
getPlayerImage();
}
public void setDefaultValues() {
worldX = gp.tileSize * 23;
worldY = gp.tileSize * 21;
speed = 4;
direction = "down";
}
public void getPlayerImage() {
try {
up1 = ImageIO.read(getClass().getResourceAsStream("/player/boy_up_1.png"));
up2 = ImageIO.read(getClass().getResourceAsStream("/player/boy_up_2.png"));
down1 = ImageIO.read(getClass().getResourceAsStream("/player/boy_down_1.png"));
down2 = ImageIO.read(getClass().getResourceAsStream("/player/boy_down_2.png"));
left1 = ImageIO.read(getClass().getResourceAsStream("/player/boy_left_1.png"));
left2 = ImageIO.read(getClass().getResourceAsStream("/player/boy_left_2.png"));
right1 = ImageIO.read(getClass().getResourceAsStream("/player/boy_right_1.png"));
right2 = ImageIO.read(getClass().getResourceAsStream("/player/boy_right_2.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void update() {
if (keyH.upPressed == true || keyH.downPressed == true || keyH.leftPressed == true
|| keyH.rightPressed == true) {
if (keyH.upPressed == true) { // 4픽셀 이동
direction = "up";
} else if (keyH.downPressed == true) {
direction = "down";
} else if (keyH.leftPressed == true) {
direction = "left";
} else if (keyH.rightPressed == true) {
direction = "right";
}
// CHECK TILE COLLISION
collisionOn = false;
gp.cChecker.checkTile(this);
//CHECK OBJECT COLLISION
int objIndex = gp.cChecker.checkObject(this, true);
// IF COLLISION IS FALSE, PLAYER CAN MOVE
if (collisionOn == false) {
switch (direction) {
case "up": worldY -= speed; break;
case "down": worldY += speed; break;
case "left": worldX -= speed; break;
case "right": worldX += speed; break;
}
}
spriteCounter++;
if (spriteCounter > 12) {
if (spriteNum == 1) {
spriteNum = 2;
} else if (spriteNum == 2) {
spriteNum = 1;
}
spriteCounter = 0;
}
}
}
public void draw(Graphics2D g2) {
// g2.setColor(Color.white);
// g2.fillRect(x, y, gp.tileSize, gp.tileSize);
BufferedImage image = null;
switch (direction) {
case "up":
if (spriteNum == 1) {
image = up1;
}
if (spriteNum == 2) {
image = up2;
}
break;
case "down":
if (spriteNum == 1) {
image = down1;
}
if (spriteNum == 2) {
image = down2;
}
break;
case "left":
if (spriteNum == 1) {
image = left1;
}
if (spriteNum == 2) {
image = left2;
}
break;
case "right":
if (spriteNum == 1) {
image = right1;
}
if (spriteNum == 2) {
image = right2;
}
break;
}
g2.drawImage(image, screenX, screenY, gp.tileSize, gp.tileSize, null);
}
}
결론 : Java 로는 하지말자 인간적으로. 엔진이 있음에 감사하자.